page-agent-sdk 2.41.0 → 2.41.1

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.
@@ -334,7 +334,7 @@ app.mount('#app');
334
334
  <\/script></body></html>`}EU(()=>a.value,async()=>{await sU(),a.value===`preview`&&i.value&&(i.value.srcdoc=c.value)},{immediate:!0});function u(){K5(n.code).then(e=>{e&&(o.value=!0,setTimeout(()=>o.value=!1,1500))})}function d(){let e=e=>e.replace(/&/g,`&amp;`).replace(/"/g,`&quot;`).replace(/</g,`&lt;`),t=`<!DOCTYPE html><html><head><meta charset="utf-8"><title>代码预览 · `+e(n.lang)+`</title><style>html,body{margin:0;height:100%;background:#fff}iframe{border:none;width:100%;height:100%}</style></head><body><iframe sandbox="allow-scripts allow-modals allow-popups allow-forms" srcdoc="`+e(c.value)+`"></iframe></body></html>`,r=new Blob([t],{type:`text/html`}),i=URL.createObjectURL(r);window.open(i,`_blank`,`noopener,noreferrer`),setTimeout(()=>URL.revokeObjectURL(i),1e4)}return(t,n)=>(Y(),X(`div`,{class:`code-preview-overlay`,onClick:n[3]||=tJ(e=>r(`close`),[`self`])},[Z(`div`,bce,[Z(`div`,xce,[Z(`span`,Sce,`代码预览 · `+q(e.lang),1),Z(`div`,Cce,[Z(`button`,{class:pV({active:a.value===`preview`}),disabled:!s.value,onClick:n[0]||=e=>a.value=`preview`},`预览`,10,wce),Z(`button`,{class:pV({active:a.value===`source`}),onClick:n[1]||=e=>a.value=`source`},`源码`,2)]),Z(`div`,Tce,[Z(`button`,{class:`icon-btn`,title:o.value?`已复制`:`复制代码`,onClick:u},q(o.value?`✓`:`📋`),9,Ece),Z(`button`,{class:`icon-btn`,title:`新窗口打开`,onClick:d},`↗`),Z(`button`,{class:`icon-btn`,title:`关闭`,onClick:n[2]||=e=>r(`close`)},`✕`)])]),Z(`div`,Dce,[a.value===`preview`&&s.value?(Y(),X(`iframe`,{key:0,ref_key:`iframeRef`,ref:i,class:`preview-iframe`,sandbox:`allow-scripts allow-modals allow-popups allow-forms`,srcdoc:c.value},null,8,Oce)):(Y(),X(`pre`,kce,[Z(`code`,null,q(e.code),1)]))])])]))}}),[[`__scopeId`,`data-v-985c5382`]]),Ace=[`innerHTML`],H9=aW({__name:`MessageContent`,props:{content:{}},setup(e){let t=e,{html:n,codeBlocks:r}=yce(()=>t.content),i=FH(null),a=FH(null),o=[`html`,`htm`,`vue`,`javascript`,`js`,`css`];function s(e){return o.includes(e.toLowerCase())}function c(e,t){let n={html:`html`,htm:`html`,css:`css`,javascript:`js`,js:`js`,typescript:`ts`,ts:`ts`,vue:`vue`,python:`py`,json:`json`,xml:`xml`,markdown:`md`,md:`md`,shell:`sh`,bash:`sh`}[e.toLowerCase()]||`txt`,r=new Blob([t],{type:`text/plain;charset=utf-8`}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=`code-${Date.now()}.${n}`,a.click(),setTimeout(()=>URL.revokeObjectURL(i),1e3)}async function l(){await sU();let e=i.value;e&&e.querySelectorAll(`pre.code-block`).forEach((e,t)=>{if(e.querySelector(`.code-toolbar`))return;let n=e.dataset.lang||`plaintext`,r=decodeURIComponent(e.dataset.code||``),i=document.createElement(`div`);i.className=`code-toolbar`;let o=document.createElement(`span`);o.className=`code-lang`,o.textContent=n,i.appendChild(o);let l=document.createElement(`button`);l.className=`code-action-btn`,l.innerHTML=`复制`,l.onclick=async()=>{let e=await K5(r);l.innerHTML=e?`已复制 ✓`:`复制失败`,setTimeout(()=>l.innerHTML=`复制`,1500)},i.appendChild(l);let u=document.createElement(`button`);if(u.className=`code-action-btn`,u.innerHTML=`⬇ 下载`,u.title=`下载为文件`,u.onclick=()=>c(n,r),i.appendChild(u),s(n)){let e=document.createElement(`button`);e.className=`code-action-btn preview-btn`,e.innerHTML=`▶ 运行预览`,e.onclick=()=>{a.value={lang:n,code:r}},i.appendChild(e)}e.appendChild(i)})}return bW(l),EU(n,l),(e,t)=>(Y(),X(KG,null,[Z(`div`,{class:`message-md`,ref_key:`containerRef`,ref:i,innerHTML:J(n)},null,8,Ace),(Y(),nK(VU,{to:`body`},[a.value?(Y(),nK(V9,{key:0,code:a.value.code,lang:a.value.lang,onClose:t[0]||=e=>a.value=null},null,8,[`code`,`lang`])):Q(``,!0)]))],64))}}),jce={key:1,class:`typing-text`},Mce={key:0,class:`stream-cursor`},U9=X5(aW({__name:`MessageBubble`,props:{content:{},role:{},isPendingAssistant:{type:Boolean},showTyping:{type:Boolean},showCursor:{type:Boolean}},setup(e){return(t,n)=>(Y(),X(KG,null,[Z(`div`,{class:pV([`message-bubble`,[e.role,{typing:e.isPendingAssistant}]])},[e.isPendingAssistant?(Y(),X(KG,{key:0},[e.showTyping?(Y(),X(KG,{key:0},[n[0]||=Z(`span`,{class:`dot`},null,-1),n[1]||=Z(`span`,{class:`dot`},null,-1),n[2]||=Z(`span`,{class:`dot`},null,-1)],64)):(Y(),X(`span`,jce,`思考中…`))],64)):(Y(),X(KG,{key:1},[e.role===`assistant`?(Y(),nK(H9,{key:0,content:e.content},null,8,[`content`])):(Y(),X(KG,{key:1},[dK(q(e.content),1)],64))],64))],2),e.showCursor?(Y(),X(`span`,Mce)):Q(``,!0)],64))}}),[[`__scopeId`,`data-v-186e68d9`]]),Nce={class:`message-time`},Pce=X5(aW({__name:`MessageTime`,props:{time:{}},setup(e){return(t,n)=>(Y(),X(`div`,Nce,q(e.time),1))}}),[[`__scopeId`,`data-v-4a976e4a`]]),Fce={class:`msg-actions`},Ice=[`title`],Lce=X5(aW({__name:`MessageActions`,props:{copied:{type:Boolean}},emits:[`copy`,`regenerate`],setup(e){return(t,n)=>(Y(),X(`div`,Fce,[Z(`button`,{class:`msg-action-btn`,title:e.copied?`已复制`:`复制`,onClick:n[0]||=e=>t.$emit(`copy`)},q(e.copied?`✓ 已复制`:`📋 复制`),9,Ice),Z(`button`,{class:`msg-action-btn`,title:`重新生成`,onClick:n[1]||=e=>t.$emit(`regenerate`)},`🔄 重新生成`)]))}}),[[`__scopeId`,`data-v-33638c4b`]]),Rce=[`data-msg-idx`],zce={key:0,class:`message-avatar`},Bce={class:`message-content`},Vce={key:2,class:`msg-focuses`},Hce=[`title`,`onClick`],Uce=[`onClick`],W9=X5(aW({__name:`MessageRow`,props:{message:{},index:{},showAvatar:{type:Boolean},showTyping:{type:Boolean},isPendingAssistant:{type:Boolean},reasoningExpanded:{type:Boolean},copied:{type:Boolean},isLast:{type:Boolean},loading:{type:Boolean},time:{}},emits:[`toggle-reasoning`,`copy`,`regenerate`],setup(e){let t=e,n=Y5(),r=RK(()=>t.message.role===`assistant`),i=RK(()=>r.value&&`reasoning`in t.message?t.message.reasoning??``:``),a=RK(()=>r.value&&`steps`in t.message?t.message.steps??[]:[]),o=RK(()=>r.value&&!!t.message.content&&!t.loading&&t.isLast),s=RK(()=>r.value&&t.loading&&t.isLast&&!!t.message.content);return(t,c)=>(Y(),X(`div`,{class:pV([`message-row`,e.message.role]),"data-msg-idx":e.index},[e.showAvatar?(Y(),X(`div`,zce,q(e.message.role===`user`?`👤`:`🤖`),1)):Q(``,!0),Z(`div`,Bce,[r.value?(Y(),nK(eoe,{key:0,text:i.value,expanded:e.reasoningExpanded,onToggle:c[0]||=e=>t.$emit(`toggle-reasoning`)},null,8,[`text`,`expanded`])):Q(``,!0),r.value?(Y(),nK(loe,{key:1,steps:a.value},null,8,[`steps`])):Q(``,!0),e.message.role===`user`&&e.message.focuses?.length?(Y(),X(`div`,Vce,[(Y(!0),X(KG,null,AW(e.message.focuses,e=>(Y(),X(`span`,{key:e.path,class:`msg-focus-chip`,title:`回看 ${e.path}`,onClick:t=>J(n).focusChipClick(e)},[dK(`🎯 `+q(e.path),1),Z(`button`,{type:`button`,class:`msg-focus-chip-x`,onClick:tJ(t=>J(n).removeFocus(e.path),[`stop`])},`✕`,8,Uce)],8,Hce))),128))])):Q(``,!0),sK(U9,{content:e.message.content,role:e.message.role,"is-pending-assistant":e.isPendingAssistant,"show-typing":e.showTyping,"show-cursor":s.value},null,8,[`content`,`role`,`is-pending-assistant`,`show-typing`,`show-cursor`]),sK(Pce,{time:e.time},null,8,[`time`]),o.value?(Y(),nK(Lce,{key:3,copied:e.copied,onCopy:c[1]||=e=>t.$emit(`copy`),onRegenerate:c[2]||=e=>t.$emit(`regenerate`)},null,8,[`copied`])):Q(``,!0)])],10,Rce))}}),[[`__scopeId`,`data-v-d4e22dfc`]]),Wce={key:0,class:`empty-state`},Gce={key:1,class:`message-row assistant`},Kce={key:0,class:`message-avatar`},qce={class:`message-content`},Jce={key:2,class:`error-bar`},Yce={class:`error-text`},G9=X5(aW({__name:`MessageList`,props:{showAvatar:{type:Boolean},showTyping:{type:Boolean}},setup(e){let{chat:t,formatTime:n,copiedMsg:r,copyMessage:i,isPendingAssistant:a,isReasoningExpanded:o,toggleReasoning:s,canUndo:c,undo:l}=Y5(),{state:u,scrollContainer:d,onScroll:f,onWheel:p,retry:m,regenerate:h}=t,g=RK(()=>u.messages.length>0),_=RK(()=>u.messages.some(e=>e.role===`user`)),v=RK(()=>u.messages[u.messages.length-1]?.role===`assistant`);return(t,y)=>(Y(),X(`div`,{class:`chat-body`,ref_key:`scrollContainer`,ref:d,onScroll:y[2]||=(...e)=>J(f)&&J(f)(...e),onWheel:y[3]||=(...e)=>J(p)&&J(p)(...e)},[g.value?Q(``,!0):(Y(),X(`div`,Wce,[...y[4]||=[Z(`div`,{class:`empty-icon`},`💬`,-1),Z(`p`,null,`有什么可以帮你的?`,-1)]])),(Y(!0),X(KG,null,AW(J(u).messages,(t,c)=>(Y(),nK(W9,{key:c,message:t,index:c,"show-avatar":e.showAvatar,"show-typing":e.showTyping,"is-pending-assistant":J(a)(c),"reasoning-expanded":J(o)(c),copied:J(r),"is-last":c===J(u).messages.length-1,loading:J(u).loading,time:J(n)(t.timestamp),onToggleReasoning:e=>J(s)(c),onCopy:e=>J(i)(t.content),onRegenerate:J(h)},null,8,[`message`,`index`,`show-avatar`,`show-typing`,`is-pending-assistant`,`reasoning-expanded`,`copied`,`is-last`,`loading`,`time`,`onToggleReasoning`,`onCopy`,`onRegenerate`]))),128)),J(u).loading&&!v.value?(Y(),X(`div`,Gce,[e.showAvatar?(Y(),X(`div`,Kce,`🤖`)):Q(``,!0),Z(`div`,qce,[sK(U9,{content:``,role:`assistant`,"is-pending-assistant":!0,"show-typing":e.showTyping,"show-cursor":!1},null,8,[`show-typing`])])])):Q(``,!0),J(u).error?(Y(),X(`div`,Jce,[Z(`span`,Yce,q(J(u).error),1),_.value?(Y(),X(`button`,{key:0,class:`retry-btn`,onClick:y[0]||=(...e)=>J(m)&&J(m)(...e)},`重试`)):Q(``,!0),J(c)?(Y(),X(`button`,{key:1,class:`undo-btn`,title:`回退到上次正常状态(还原对话历史 + 页面属性 + 工作区)`,onClick:y[1]||=(...e)=>J(l)&&J(l)(...e)},`↩ 回退`)):Q(``,!0)])):Q(``,!0)],544))}}),[[`__scopeId`,`data-v-fe599f6d`]]),Xce={key:0,class:`queued-bar`},Zce={class:`queued-head`},Qce={class:`queued-count`},$ce={class:`queued-idx`},ele={class:`queued-text`},tle=[`onClick`],nle=[`onClick`],K9=X5(aW({__name:`QueuedBar`,setup(e){let{chat:t,editQueued:n}=Y5(),{queuedTasks:r,removeQueuedTask:i}=t;return(e,t)=>J(r).length?(Y(),X(`div`,Xce,[Z(`div`,Zce,[t[0]||=Z(`span`,{class:`queued-icon`},`📋`,-1),t[1]||=Z(`span`,{class:`queued-title`},`排队中 · 生成完后自动执行`,-1),Z(`span`,Qce,q(J(r).length),1)]),(Y(!0),X(KG,null,AW(J(r),(e,t)=>(Y(),X(`div`,{key:t,class:`queued-item`},[Z(`span`,$ce,q(t+1),1),Z(`span`,ele,q(e),1),Z(`button`,{class:`queued-act`,title:`修改(填回输入框编辑)`,onClick:e=>J(n)(t)},`✏️`,8,tle),Z(`button`,{class:`queued-act queued-del`,title:`撤销该任务`,onClick:e=>J(i)(t)},`✕`,8,nle)]))),128))])):Q(``,!0)}}),[[`__scopeId`,`data-v-f32730a9`]]),rle={key:0,class:`approval-bar`},ile={key:0,class:`approval-question`},ale={key:1,class:`approval-context`},ole={key:2,class:`approval-recommend`},sle={key:3,class:`approval-options`},cle=[`onClick`],lle={class:`approval-actions`},ule={class:`approval-head`},dle={class:`approval-title`},fle={key:0,class:`approval-args`},ple={class:`approval-actions`},q9=X5(aW({__name:`ApprovalBar`,setup(e){let{pendingApproval:t,resolveApproval:n}=Y5().chat,r=FH(!1);EU(t,()=>{r.value=!1});let i=RK(()=>t.value?.toolName===`request_human_confirmation`),a=RK(()=>{let e=t.value?.args?.options;return Array.isArray(e)?e.map(String):[]}),o=RK(()=>{let e=t.value?.args;if(e==null)return``;try{let t=typeof e==`string`?e:JSON.stringify(e,null,2);return t.length>400?t.slice(0,400)+`
335
335
  …(已截断)`:t}catch{return String(e)}});return(e,s)=>J(t)?(Y(),X(`div`,rle,[i.value?(Y(),X(KG,{key:0},[s[5]||=Z(`div`,{class:`approval-head`},[Z(`span`,{class:`approval-icon`},`❓`),Z(`span`,{class:`approval-title`},`AI 需要你确认`)],-1),J(t).args?.question?(Y(),X(`div`,ile,q(J(t).args.question),1)):Q(``,!0),J(t).args?.context?(Y(),X(`div`,ale,q(J(t).args.context),1)):Q(``,!0),J(t).args?.recommendation?(Y(),X(`div`,ole,`💡 推荐:`+q(J(t).args.recommendation),1)):Q(``,!0),a.value.length?(Y(),X(`div`,sle,[(Y(!0),X(KG,null,AW(a.value,e=>(Y(),X(`button`,{key:e,class:`approval-opt`,onClick:t=>J(n)(e)},q(e),9,cle))),128))])):Q(``,!0),Z(`div`,lle,[Z(`button`,{class:`approval-deny`,onClick:s[0]||=e=>J(n)(!1)},`拒绝`),a.value.length?Q(``,!0):(Y(),X(`button`,{key:0,class:`approval-allow`,onClick:s[1]||=e=>J(n)(!0)},`允许`))])],64)):(Y(),X(KG,{key:1},[Z(`div`,ule,[s[7]||=Z(`span`,{class:`approval-icon`},`✋`,-1),Z(`span`,dle,[s[6]||=dK(`需确认工具调用:`,-1),Z(`code`,null,q(J(t).toolName),1)]),o.value?(Y(),X(`button`,{key:0,class:`approval-toggle`,onClick:s[2]||=e=>r.value=!r.value},q(r.value?`收起参数`:`查看参数`)+q(r.value?` ▴`:` ▾`),1)):Q(``,!0)]),o.value&&r.value?(Y(),X(`pre`,fle,q(o.value),1)):Q(``,!0),Z(`div`,ple,[Z(`button`,{class:`approval-deny`,onClick:s[3]||=e=>J(n)(!1)},`拒绝`),Z(`button`,{class:`approval-allow`,onClick:s[4]||=e=>J(n)(!0)},`允许`)])],64))])):Q(``,!0)}}),[[`__scopeId`,`data-v-296a936f`]]),mle={key:0,class:`conflict-bar`},hle={class:`conflict-head`},gle={class:`conflict-title`},_le={class:`conflict-detail`},vle={key:0,class:`conflict-diff`},yle={class:`conflict-diff-col`},ble={class:`conflict-diff-pre`},xle={class:`conflict-diff-col`},Sle={class:`conflict-diff-pre`},Cle={class:`conflict-actions`},J9=X5(aW({__name:`ConflictBar`,props:{pendingConflict:{},onResolve:{type:Function}},setup(e){let t=e,n=FH(!1);EU(()=>t.pendingConflict,()=>{n.value=!1});let r=RK(()=>{let e=t.pendingConflict?.agentValue;if(e===void 0)return``;try{let t=JSON.stringify(e,null,2);return t.length>400?t.slice(0,400)+`
336
336
  …(已截断)`:t}catch{return String(e)}}),i=RK(()=>{let e=t.pendingConflict?.currentValue;if(e==null)return``;try{let t=JSON.stringify(e,null,2);return t.length>400?t.slice(0,400)+`
337
- …(已截断)`:t}catch{return String(e)}});return(t,a)=>e.pendingConflict?(Y(),X(`div`,mle,[Z(`div`,hle,[a[6]||=Z(`span`,{class:`conflict-icon`},`⚠️`,-1),Z(`span`,gle,[a[4]||=dK(`写入冲突:`,-1),Z(`code`,null,q(e.pendingConflict.path),1),a[5]||=dK(` 已被外部修改`,-1)])]),Z(`div`,_le,` AI 基于「读取时的旧值」准备`+q(e.pendingConflict.op===`delete`?`删除`:`写入`)+`,但该属性在你读取之后被外部代码/其他 agent/手动改过。 `,1),Z(`button`,{class:`conflict-toggle`,onClick:a[0]||=e=>n.value=!n.value},q(n.value?`收起对比`:`查看值对比`)+q(n.value?` ▴`:` ▾`),1),n.value?(Y(),X(`div`,vle,[Z(`div`,yle,[a[7]||=Z(`div`,{class:`conflict-diff-label`},`AI 想写的值`,-1),Z(`pre`,ble,q(r.value||`(delete 操作无值)`),1)]),Z(`div`,xle,[a[8]||=Z(`div`,{class:`conflict-diff-label`},`外部改后的当前值`,-1),Z(`pre`,Sle,q(i.value),1)])])):Q(``,!0),Z(`div`,Cle,[Z(`button`,{class:`conflict-keep`,onClick:a[1]||=t=>e.onResolve?.(`keep_external`),title:`不写入,保留外部修改后的值,AI 重新读取再改`},`保留外部`),Z(`button`,{class:`conflict-overwrite`,onClick:a[2]||=t=>e.onResolve?.(`overwrite`),title:`用 AI 的值覆盖外部修改`},`强制覆盖`),Z(`button`,{class:`conflict-restore`,onClick:a[3]||=t=>e.onResolve?.(`restore`),title:`回退到最近一次历史快照(agent 之前操作的检查点),撤销外部修改 + AI 不写入`},`回退`)])])):Q(``,!0)}}),[[`__scopeId`,`data-v-195e5b23`]]),wle={class:`chat-footer`},Tle={class:`chat-input-wrap`},Ele={key:0,class:`focus-chips`},Dle=[`title`,`onClick`],Ole={class:`focus-chip-path`},kle=[`onClick`],Ale=[`placeholder`,`rows`],jle={class:`input-actions`},Mle=[`disabled`,`title`],Nle={key:0,width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`currentColor`},Ple={key:1,width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},Y9=X5(aW({__name:`ChatInput`,props:{placeholder:{},inputRows:{}},setup(e){let t=Y5(),{inputText:n,send:r,keydown:i,canUndo:a,undo:o,focuses:s,removeFocus:c,focusChipClick:l}=t,{state:u,stop:d}=t.chat;return(t,f)=>(Y(),X(`div`,wle,[J(a)?(Y(),X(`button`,{key:0,class:`undo-foot-btn`,title:`回退到上次正常状态(还原对话历史 + 页面属性 + 工作区)`,onClick:f[0]||=(...e)=>J(o)&&J(o)(...e)},`↩ 回退`)):Q(``,!0),Z(`div`,Tle,[J(s).length?(Y(),X(`div`,Ele,[(Y(!0),X(KG,null,AW(J(s),e=>(Y(),X(`span`,{key:e.path,class:`focus-chip`,title:`精修中:${e.path}(点击回看 · ✕ 移除)`,onClick:t=>J(l)(e)},[f[4]||=Z(`span`,{class:`focus-chip-icon`},`🎯`,-1),Z(`code`,Ole,q(e.path),1),Z(`button`,{type:`button`,class:`focus-chip-x`,"data-test":`focus-clear`,title:`移除此焦点`,onClick:tJ(t=>J(c)(e.path),[`stop`])},`✕`,8,kle)],8,Dle))),128))])):Q(``,!0),bU(Z(`textarea`,{"onUpdate:modelValue":f[1]||=e=>PH(n)?n.value=e:null,class:pV([`chat-input`,{"has-focus-chip":J(s).length>0}]),placeholder:e.placeholder,rows:e.inputRows,onKeydown:f[2]||=(...e)=>J(i)&&J(i)(...e)},null,42,Ale),[[Qq,J(n)]]),Z(`div`,jle,[f[7]||=Z(`span`,{class:`send-hint`},`Enter 发送 · Shift+Enter 换行`,-1),Z(`button`,{class:pV([`send-btn`,{"stop-btn":J(u).loading}]),disabled:!J(u).loading&&!J(n).trim(),title:J(u).loading?`停止生成`:`发送`,onClick:f[3]||=e=>J(u).loading?J(d)():J(r)()},[J(u).loading?(Y(),X(`svg`,Nle,[...f[5]||=[Z(`rect`,{x:`6`,y:`6`,width:`12`,height:`12`,rx:`2`},null,-1)]])):(Y(),X(`svg`,Ple,[...f[6]||=[Z(`line`,{x1:`22`,y1:`2`,x2:`11`,y2:`13`},null,-1),Z(`polygon`,{points:`22 2 15 22 11 13 2 9 22 2`},null,-1)]]))],10,Mle)])])]))}}),[[`__scopeId`,`data-v-3a3e4dfa`]]),Fle={key:0,class:`debug-drawer`},Ile={class:`drawer-panel`},Lle={class:`drawer-header`},Rle={class:`tab-group`},zle={class:`header-actions`},Ble={key:0,class:`drawer-filters`},Vle=[`onClick`],Hle={class:`chip-count`},Ule={class:`chip-count`},Wle={class:`drawer-body`},Gle={key:0,class:`trace-panel`},Kle={key:0,class:`trace-empty`},qle={class:`trace-metrics`},Jle={class:`metric-card`},Yle={class:`metric-card`},Xle={class:`metric-card`},Zle={class:`metric-card`},Qle={key:0,class:`metric-card`},$le={key:1,class:`metric-card`},eue={class:`trace-spans`},tue={class:`span-ico`},nue={class:`span-name`},rue={key:0,class:`span-dur`},iue={key:1,class:`span-status`},aue={key:1,class:`context-panel`},oue={key:0,class:`trace-empty`},sue={class:`ctx-overview`},cue={class:`ctx-occupancy`},lue=[`title`],uue={class:`ctx-pct`},due={class:`ctx-kv-row`},fue={class:`ctx-kv`},pue={key:0,class:`ctx-kv`},mue={key:1,class:`ctx-kv`},hue=[`title`],gue={class:`ctx-cat-bar`},_ue={class:`ctx-cat-tokens`},vue={key:0,class:`ctx-compression`},yue={class:`ctx-kv-row`},bue={class:`ctx-kv`},xue={class:`ctx-kv`},Sue={class:`ctx-kv`},Cue={key:0,class:`ctx-kv`},wue={key:2,class:`subagent-panel`},Tue={key:0,class:`trace-empty`},X9={key:0,class:`sub-section`},Eue={class:`sub-section-title`},Due={class:`sub-head`},Oue={class:`sub-label`},kue={class:`sub-steps-badge`},Aue={class:`sub-task`},jue={key:1,class:`sub-section`},Mue={class:`sub-section-title`},Nue={class:`sub-head`},Pue={class:`sub-label`},Fue={key:0,class:`sub-dur`},Iue=[`onClick`],Lue={class:`sub-task`},Rue={key:0,class:`sub-result`},zue={key:1,class:`sub-steps-list`},Bue={class:`sub-step-kind`},Vue={class:`sub-step-name`},Hue={class:`sub-step-ts`},Uue={key:0,class:`empty`},Wue={class:`log-head`},Gue={key:0,class:`log-source`},Kue={class:`log-time`},que={class:`log-body`},Jue={class:`kv-grid`},Yue={class:`kv`},Xue={class:`v`},Zue={class:`kv`},Que={class:`v`},$ue={class:`kv`},ede={class:`v`},tde={class:`kv`},nde={class:`v`},rde={class:`section-label`},ide={class:`chip-row`},ade={class:`msg-list`},ode={class:`msg-text`},sde={class:`badge-row`},cde={class:`badge`},lde={key:0,class:`badge muted`},ude={class:`badge muted`},dde={key:1,class:`badge muted`},fde=[`onClick`],pde={key:0,class:`msg-list`},mde={class:`msg-detail`},hde={key:0,class:`msg-text`},gde={class:`tc-inline-name`},_de={class:`tc-inline-args`},vde={key:1,class:`tc-id`},yde={key:1,class:`log-raw`},bde={class:`badge-row`},xde={class:`badge`},Sde={key:0,class:`badge warn`},Cde={key:0,class:`resp-content`},wde={key:1,class:`tc-list`},Tde={class:`tc-name`},Ede={class:`tc-args`},Dde={key:2,class:`usage-row`},Ode={class:`usage`},kde={class:`usage`},Ade={class:`usage`},jde={key:3,class:`tc-card inline`},Mde={class:`tc-name`},Nde={class:`tc-args`},Pde={key:4,class:`tc-card inline`},Fde={class:`tc-name`},Ide={class:`tc-args`},Lde={key:5,class:`err-box`},Rde={class:`log-footer`},zde=[`onClick`],Bde=[`onClick`],Vde={key:0,class:`log-raw`},Hde={key:0,class:`empty`},Ude={key:1,class:`flow-section`},Wde={class:`flow-ico`},Gde={class:`flow-label`},Kde={class:`flow-detail`},qde={class:`flow-time`},Jde={class:`flow-round-head`},Yde={class:`flow-round-body`},Xde={class:`flow-ico`},Zde={class:`flow-label`},Qde={class:`flow-detail`},$de={class:`flow-time`},efe={key:5,class:`info-body`},tfe={key:0,class:`empty`},nfe={class:`info-section`},rfe={class:`kv-grid`},ife={class:`kv`},afe={class:`v`},ofe={class:`kv`},sfe={class:`v`},cfe={class:`kv`},lfe={class:`v`},ufe={class:`kv`},dfe={class:`v`},ffe={class:`kv`,style:{"margin-top":`6px`}},pfe={class:`v`,style:{"font-size":`11px`}},mfe={class:`info-section`},hfe={class:`info-title`},gfe={class:`info-name`},_fe={class:`info-desc`},vfe={key:0,class:`info-section`},yfe={class:`info-title`},bfe=[`onClick`],xfe={class:`info-desc`},Sfe={key:0,class:`skill-content`},Cfe={key:0,class:`skill-loading`},wfe={key:1,class:`skill-error`},Tfe={key:2,class:`skill-pre`},Efe={key:1,class:`info-section`},Dfe={class:`info-item`},Ofe={class:`info-name`},kfe={class:`info-desc`},Afe={class:`info-section`},jfe={class:`kv-grid`},Mfe={class:`kv`},Nfe={class:`v`},Pfe={class:`kv`},Ffe={class:`v`},Ife={class:`kv`},Lfe={class:`v`},Rfe={class:`kv`},zfe={class:`v`,style:{"font-size":`11px`}},Bfe={key:2,class:`info-section`},Vfe={class:`info-title`},Hfe={class:`info-name`},Ufe={class:`src-tag mcp`},Wfe={class:`info-desc`},Gfe={key:3,class:`info-section`},Kfe={class:`kv-grid`},qfe={class:`kv`},Jfe={class:`v`},Yfe={class:`kv`},Xfe={class:`v`},Zfe={class:`kv`},Qfe={class:`v`},$fe={key:0,class:`kv`},epe={class:`v`,style:{"font-size":`11px`}},tpe={key:4,class:`info-section`},npe={class:`info-title`},rpe={key:5,class:`info-section`},ipe={class:`info-pre`},ape={key:6,class:`info-section`},ope={class:`info-kv`},spe={class:`kv`},cpe={class:`v`},lpe={class:`kv`},upe={class:`v`},dpe={class:`kv`},fpe={class:`v`},ppe={class:`kv`},mpe={class:`v`},hpe={class:`kv`},gpe={class:`v`,style:{"font-size":`11px`}},_pe={key:0,class:`kv`},vpe={class:`v`,style:{"font-size":`11px`}},Z9=X5(aW({__name:`DebugDrawer`,props:{logs:{default:()=>[]},visible:{type:Boolean},getInfo:{},infoTick:{},getSkillContent:{}},emits:[`update:visible`,`clear`],setup(e,{emit:t}){let n=e,r=t,i=FH(`all`),a=FH(new Set),o=FH(new Set),s={context:{label:`上下文`,color:`var(--cs-primary)`,icon:`🧩`},llm_request:{label:`LLM请求`,color:`#059669`,icon:`➡️`},llm_response:{label:`LLM响应`,color:`#d97706`,icon:`⬅️`},tool_call:{label:`工具调用`,color:`#7c3aed`,icon:`🔧`},tool_result:{label:`工具结果`,color:`#2563eb`,icon:`✅`},error:{label:`错误`,color:`#dc2626`,icon:`❌`},middleware:{label:`中间件`,color:`#0891b2`,icon:`⚙️`}},c=RK(()=>Array.isArray(n.logs)?n.logs:[]),l=RK(()=>i.value===`all`?c.value:c.value.filter(e=>e.type===i.value)),u=RK(()=>{let e={all:c.value.length};for(let t of c.value)e[t.type]=(e[t.type]||0)+1;return e});function d(e){return new Date(e).toLocaleTimeString(`zh-CN`,{hour12:!1})+`.`+String(e%1e3).padStart(3,`0`)}function f(e){let t=new Set(a.value);t.has(e)?t.delete(e):t.add(e),a.value=t}function p(e){let t=new Set(o.value);t.has(e)?t.delete(e):t.add(e),o.value=t}function m(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}let h={system:{label:`SYSTEM`,color:`#6b7280`},human:{label:`USER`,color:`var(--cs-primary)`},user:{label:`USER`,color:`var(--cs-primary)`},ai:{label:`AI`,color:`#059669`},assistant:{label:`AI`,color:`#059669`},tool:{label:`TOOL`,color:`#2563eb`}};function g(e){return h[e]||{label:(e||`?`).toUpperCase(),color:`#9ca3af`}}function _(){r(`update:visible`,!1)}function v(){a.value=new Set,r(`clear`)}let y=FH(`logs`),b=FH(null),x=FH({});async function S(e){if(x.value[e]){delete x.value[e],x.value={...x.value};return}if(!n.getSkillContent){x.value={...x.value,[e]:{loading:!1,content:null,error:`当前 SDK 未注入 getSkillContent,无法查看 skill 全文`}};return}x.value={...x.value,[e]:{loading:!0,content:null}};try{let t=await n.getSkillContent(e);x.value={...x.value,[e]:{loading:!1,content:t,error:t==null?`skill 无内容或读取失败`:void 0}}}catch(t){x.value={...x.value,[e]:{loading:!1,content:null,error:String(t?.message||t)}}}}function C(){if(n.getInfo)try{b.value=n.getInfo()}catch{b.value=null}}function w(e){y.value=e,(e===`subagent`||e===`info`||e===`context`)&&C()}EU(()=>n.infoTick?.value,()=>{n.visible&&(y.value===`subagent`||y.value===`info`||y.value===`context`)&&C()});let ee={pending:{label:`待办`,color:`#9ca3af`},in_progress:{label:`进行中`,color:`#d97706`},completed:{label:`完成`,color:`#059669`}};function te(e){return ee[e]?.label??e}function T(e){return e?e===`builtin`?`builtin`:e.startsWith(`mcp:`)?`mcp`:`user`:``}let ne=RK(()=>{let e=new Map,t=[];for(let n of c.value){let r=n.data?.round;typeof r==`number`&&r>0?(e.has(r)||e.set(r,[]),e.get(r).push(n)):t.push(n)}return{pre:t,rounds:[...e.entries()].sort((e,t)=>e[0]-t[0]).map(([e,t])=>({round:e,items:t}))}});function E(e,t){return e.length>t?e.slice(0,t)+`…`:e}let D=RK(()=>b.value?.trace?.spans??[]),re=RK(()=>b.value?.trace?.metrics),O=RK(()=>b.value?.context),ie=RK(()=>{let e=O.value;return e?e.occupancy>=1?`red`:e.thresholdRatio>0&&e.occupancy>=e.thresholdRatio?`yellow`:`green`:``}),ae=RK(()=>b.value?.subagent?.active??[]),oe=RK(()=>b.value?.subagent?.history??[]),k={running:{label:`运行中`,color:`#059669`},done:{label:`完成`,color:`#6b7280`},error:{label:`错误`,color:`#dc2626`}},A=FH(new Set);function se(e){let t=new Set(A.value);t.has(e)?t.delete(e):t.add(e),A.value=t}function ce(e){return e===`round`?`🔄`:e===`model`?`🧠`:e===`tool`?`🔧`:e===`compression`?`📦`:`•`}function le(e){return`${e.windowRatio==null?`keepRounds=${e.keepRounds??`?`}`:`windowRatio=${e.windowRatio}`} · ${e.summarize.mode}摘要 · 召回${e.recallTopK??`?`}${e.reason?` · `+e.reason:``}`}function ue(e){let t=e.data||{};switch(e.type){case`context`:return`${t.tools?.length??0} 工具 · ${t.totalMessages??0} 消息`;case`llm_request`:return`${(t.messages||[]).length} 消息${t.tools?.length?` · `+t.tools.length+` 工具`:``}`;case`llm_response`:return t.toolCalls?.length?`${t.toolCalls.length} 个工具调用`:t.content?E(String(t.content),50):``;case`tool_call`:return String(t.name??``);case`tool_result`:return`${t.name??``} · ${t.status===`error`?`❌`:`✅`}`;case`error`:return E(String(t.error??t.tool??``),60);case`middleware`:return String(t.stage??``);default:return``}}return(t,n)=>(Y(),nK(VU,{to:`body`},[sK(eq,{name:`drawer`},{default:yU(()=>[e.visible?(Y(),X(`div`,Fle,[Z(`div`,Ile,[Z(`div`,Lle,[Z(`div`,Rle,[Z(`button`,{class:pV([`tab-btn`,{active:y.value===`logs`}]),onClick:n[0]||=e=>w(`logs`)},`🐛 日志`,2),Z(`button`,{class:pV([`tab-btn`,{active:y.value===`flow`}]),onClick:n[1]||=e=>w(`flow`)},`🔀 流程`,2),e.getInfo?(Y(),X(`button`,{key:0,class:pV([`tab-btn`,{active:y.value===`trace`}]),onClick:n[2]||=e=>w(`trace`)},`🌳 Trace`,2)):Q(``,!0),e.getInfo?(Y(),X(`button`,{key:1,class:pV([`tab-btn`,{active:y.value===`context`}]),onClick:n[3]||=e=>w(`context`)},`📊 上下文`,2)):Q(``,!0),e.getInfo?(Y(),X(`button`,{key:2,class:pV([`tab-btn`,{active:y.value===`subagent`}]),onClick:n[4]||=e=>w(`subagent`)},`🤖 子 agent`,2)):Q(``,!0),e.getInfo?(Y(),X(`button`,{key:3,class:pV([`tab-btn`,{active:y.value===`info`}]),onClick:n[5]||=e=>w(`info`)},`🧬 Agent 信息`,2)):Q(``,!0)]),Z(`div`,zle,[y.value===`logs`?(Y(),X(`button`,{key:0,class:`hd-btn`,title:`清空日志`,onClick:v},`🗑️`)):Q(``,!0),Z(`button`,{class:`hd-btn`,title:`关闭`,onClick:_},`✕`)])]),y.value===`logs`?(Y(),X(`div`,Ble,[(Y(),X(KG,null,AW(s,(e,t)=>Z(`button`,{key:t,class:pV([`filter-chip`,{active:i.value===t}]),style:fV({"--chip-color":e.color}),onClick:e=>i.value=t},[dK(q(e.icon)+` `+q(e.label)+` `,1),Z(`span`,Hle,q(u.value[t]||0),1)],14,Vle)),64)),Z(`button`,{class:pV([`filter-chip all`,{active:i.value===`all`}]),onClick:n[6]||=e=>i.value=`all`},[n[7]||=dK(` 全部 `,-1),Z(`span`,Ule,q(u.value.all||0),1)],2)])):Q(``,!0),Z(`div`,Wle,[y.value===`trace`?(Y(),X(`div`,Gle,[re.value?(Y(),X(KG,{key:1},[Z(`div`,qle,[Z(`div`,Jle,[n[9]||=Z(`span`,null,`轮次`,-1),Z(`b`,null,q(re.value.rounds),1)]),Z(`div`,Yle,[n[10]||=Z(`span`,null,`总耗时`,-1),Z(`b`,null,q(re.value.totalDurationMs)+`ms`,1)]),Z(`div`,Xle,[n[11]||=Z(`span`,null,`平均/轮`,-1),Z(`b`,null,q(re.value.avgRoundMs)+`ms`,1)]),Z(`div`,Zle,[n[12]||=Z(`span`,null,`工具`,-1),Z(`b`,null,q(re.value.toolCalls)+`(✅`+q(Math.round(re.value.toolSuccessRate*100))+`%)`,1)]),re.value.compressions?(Y(),X(`div`,Qle,[n[13]||=Z(`span`,null,`压缩`,-1),Z(`b`,null,q(re.value.compressions),1)])):Q(``,!0),re.value.totalTokens?(Y(),X(`div`,$le,[n[14]||=Z(`span`,null,`Token`,-1),Z(`b`,null,q(re.value.totalTokens.total),1)])):Q(``,!0)]),Z(`div`,eue,[(Y(!0),X(KG,null,AW(D.value,e=>(Y(),X(`div`,{key:e.id,class:pV([`trace-span`,[e.type,e.status]])},[Z(`span`,tue,q(ce(e.type)),1),Z(`span`,nue,q(e.name),1),e.durationMs?(Y(),X(`span`,rue,q(e.durationMs)+`ms`,1)):Q(``,!0),e.status===`error`?(Y(),X(`span`,iue,`❌`)):Q(``,!0)],2))),128))])],64)):(Y(),X(`div`,Kle,[...n[8]||=[dK(`未开启 tracing(`,-1),Z(`code`,null,`capabilities.tracing:true`,-1),dK(`)或暂无 trace。跑一轮 agent 后刷新。`,-1)]]))])):Q(``,!0),y.value===`context`?(Y(),X(`div`,aue,[O.value?(Y(),X(KG,{key:1},[Z(`div`,sue,[Z(`div`,cue,[Z(`div`,{class:`ctx-bar-track`,title:`占用 ${Math.round(O.value.occupancy*100)}%`},[Z(`div`,{class:pV([`ctx-bar-fill`,ie.value]),style:fV({width:Math.min(O.value.occupancy*100,100)+`%`})},null,6),O.value.thresholdRatio>0?(Y(),X(`div`,{key:0,class:`ctx-threshold-mark`,style:fV({left:Math.min(O.value.thresholdRatio*100,100)+`%`}),title:`压缩阈值`},null,4)):Q(``,!0)],8,lue),Z(`span`,uue,q(Math.round(O.value.occupancy*100))+`%`,1)]),Z(`div`,due,[Z(`span`,fue,`估算 `+q(O.value.totalTokens)+` token`,1),O.value.contextWindow?(Y(),X(`span`,pue,`窗口 `+q(O.value.contextWindow),1)):Q(``,!0),O.value.thresholdRatio>0?(Y(),X(`span`,mue,`阈值 `+q(Math.round(O.value.thresholdRatio*100))+`%`,1)):Q(``,!0)])]),n[16]||=Z(`div`,{class:`ctx-section-title`},`分类构成(近似)`,-1),(Y(!0),X(KG,null,AW(O.value.categories,e=>(Y(),X(`div`,{key:e.key,class:`ctx-cat`},[Z(`span`,{class:`ctx-cat-label`,title:e.label},q(e.label),9,hue),Z(`div`,gue,[Z(`div`,{class:`ctx-cat-fill`,style:fV({width:Math.max(Math.round(e.pct*100),2)+`%`})},null,4)]),Z(`span`,_ue,[dK(q(e.tokens)+` `,1),Z(`i`,null,`(`+q(Math.round(e.pct*100))+`%)`,1)])]))),128)),O.value.compression?(Y(),X(`div`,vue,[n[15]||=Z(`div`,{class:`ctx-section-title`},`最近压缩`,-1),Z(`div`,yue,[Z(`span`,bue,`摘要 `+q(O.value.compression.roundsSummarized)+`/`+q(O.value.compression.roundsTotal)+` 轮`,1),Z(`span`,xue,`召回 `+q(O.value.compression.roundsRecalled),1),Z(`span`,Sue,q(O.value.compression.strategy),1),O.value.compression.decision?(Y(),X(`span`,Cue,`🤖 agent 决策:`+q(le(O.value.compression.decision)),1)):Q(``,!0)])])):Q(``,!0)],64)):(Y(),X(`div`,oue,`未开启 contextInspector(默认开)或暂无快照。跑一轮 agent 后切回刷新。`))])):Q(``,!0),y.value===`subagent`?(Y(),X(`div`,wue,[!ae.value.length&&!oe.value.length?(Y(),X(`div`,Tue,[...n[17]||=[dK(` 尚未委派子 agent。主 agent 调用 `,-1),Z(`code`,null,`use_<id>`,-1),dK(` 或 `,-1),Z(`code`,null,`spawn_agent`,-1),dK(` 后,这里展示运行状态与委派历史。 `,-1)]])):(Y(),X(KG,{key:1},[ae.value.length?(Y(),X(`div`,X9,[Z(`div`,Eue,`▶ 运行中 (`+q(ae.value.length)+`)`,1),(Y(!0),X(KG,null,AW(ae.value,(e,t)=>(Y(),X(`div`,{key:`a`+t,class:pV([`sub-card`,e.status])},[Z(`div`,Due,[Z(`span`,{class:`sub-status`,style:fV({background:k[e.status]&&k[e.status].color||`#9ca3af`})},q(k[e.status]&&k[e.status].label||e.status),5),Z(`span`,Oue,q(e.label),1),Z(`span`,kue,q(e.steps.length)+` 步`,1)]),Z(`div`,Aue,q(E(e.task,80)),1)],2))),128))])):Q(``,!0),oe.value.length?(Y(),X(`div`,jue,[Z(`div`,Mue,`🕐 历史 (`+q(oe.value.length)+`)`,1),(Y(!0),X(KG,null,AW(oe.value,(e,t)=>(Y(),X(`div`,{key:`h`+t,class:pV([`sub-card`,e.status])},[Z(`div`,Nue,[Z(`span`,{class:`sub-status`,style:fV({background:k[e.status]&&k[e.status].color||`#9ca3af`})},q(k[e.status]&&k[e.status].label||e.status),5),Z(`span`,Pue,q(e.label),1),e.durationMs==null?Q(``,!0):(Y(),X(`span`,Fue,q(e.durationMs)+`ms`,1)),e.steps.length?(Y(),X(`button`,{key:1,class:`sub-toggle`,onClick:e=>se(t)},q(A.value.has(t)?`收起`:`步骤`),9,Iue)):Q(``,!0)]),Z(`div`,Lue,q(E(e.task,80)),1),e.resultPreview?(Y(),X(`div`,Rue,q(e.resultPreview),1)):Q(``,!0),A.value.has(t)&&e.steps.length?(Y(),X(`div`,zue,[(Y(!0),X(KG,null,AW(e.steps,(e,t)=>(Y(),X(`div`,{key:t,class:`sub-step`},[Z(`span`,Bue,q(e.kind===`tool_call`?`🔧`:`✅`),1),Z(`span`,Vue,q(e.name),1),Z(`span`,Hue,q(d(e.ts)),1)]))),128))])):Q(``,!0)],2))),128))])):Q(``,!0)],64))])):Q(``,!0),y.value===`logs`?(Y(),X(KG,{key:3},[l.value.length===0?(Y(),X(`div`,Uue,` 暂无日志,发送消息后这里会显示 Agent 的完整上下文、工具调用等信息 `)):Q(``,!0),(Y(!0),X(KG,null,AW(l.value,(e,t)=>(Y(),X(`div`,{key:t,class:`log-item`},[Z(`div`,Wue,[Z(`span`,{class:`log-type`,style:fV({background:s[e.type].color})},q(s[e.type].icon)+` `+q(s[e.type].label),5),e.source?(Y(),X(`span`,Gue,`↳ `+q(e.source),1)):Q(``,!0),Z(`span`,Kue,q(d(e.timestamp)),1)]),Z(`div`,que,[e.type===`context`?(Y(),X(KG,{key:0},[Z(`div`,Jue,[Z(`div`,Yue,[n[18]||=Z(`span`,{class:`k`},`模型`,-1),Z(`span`,Xue,q(e.data.model),1)]),Z(`div`,Zue,[n[19]||=Z(`span`,{class:`k`},`温度`,-1),Z(`span`,Que,q(e.data.temperature),1)]),Z(`div`,$ue,[n[20]||=Z(`span`,{class:`k`},`MaxTokens`,-1),Z(`span`,ede,q(e.data.maxTokens),1)]),Z(`div`,tde,[n[21]||=Z(`span`,{class:`k`},`消息数`,-1),Z(`span`,nde,q(e.data.totalMessages),1)])]),Z(`div`,rde,`工具 (`+q(e.data.tools?.length||0)+`)`,1),Z(`div`,ide,[(Y(!0),X(KG,null,AW(e.data.tools,e=>(Y(),X(`span`,{key:e,class:`tool-chip`},q(e),1))),128))]),n[22]||=Z(`div`,{class:`section-label`},`上下文消息`,-1),Z(`div`,ade,[(Y(!0),X(KG,null,AW(e.data.messages,(e,t)=>(Y(),X(`div`,{key:t,class:`msg-row`},[Z(`span`,{class:`msg-role`,style:fV({background:g(e.type).color})},q(g(e.type).label),5),Z(`span`,ode,q(e.content),1)]))),128))])],64)):e.type===`llm_request`?(Y(),X(KG,{key:1},[Z(`div`,sde,[Z(`span`,cde,`第 `+q(e.data.round)+` 轮`,1),e.data.model?(Y(),X(`span`,lde,q(e.data.model),1)):Q(``,!0),Z(`span`,ude,q((e.data.messages||[]).length)+` 条消息`,1),e.data.tools?.length?(Y(),X(`span`,dde,q(e.data.tools.length)+` 工具`,1)):Q(``,!0),Z(`button`,{class:`view-toggle`,onClick:e=>p(t)},q(o.value.has(t)?`🗂 卡片视图`:`📋 请求体`),9,fde)]),o.value.has(t)?(Y(),X(`pre`,yde,[Z(`code`,null,q(m(e.data.messages)),1)])):(Y(),X(`div`,pde,[(Y(!0),X(KG,null,AW(e.data.messages,(e,t)=>(Y(),X(`div`,{key:t,class:`msg-row`},[Z(`span`,{class:`msg-role`,style:fV({background:g(e.role).color})},q(g(e.role).label),5),Z(`div`,mde,[e.content?(Y(),X(`span`,hde,q(e.content),1)):Q(``,!0),(Y(!0),X(KG,null,AW(e.tool_calls||[],(e,t)=>(Y(),X(`div`,{key:t,class:`tc-inline`},[Z(`span`,gde,`🔧 `+q(e.function?.name||e.name),1),Z(`code`,_de,q(e.function?.arguments??e.args),1)]))),128)),e.tool_call_id?(Y(),X(`span`,vde,`↳ tool_call_id: `+q(e.tool_call_id),1)):Q(``,!0)])]))),128))]))],64)):e.type===`llm_response`?(Y(),X(KG,{key:2},[Z(`div`,bde,[Z(`span`,xde,`第 `+q(e.data.round)+` 轮`,1),e.data.toolCalls?.length?(Y(),X(`span`,Sde,`🔧 `+q(e.data.toolCalls.length)+` 个工具调用`,1)):Q(``,!0)]),e.data.content?(Y(),X(`div`,Cde,q(e.data.content),1)):Q(``,!0),e.data.toolCalls?.length?(Y(),X(`div`,wde,[(Y(!0),X(KG,null,AW(e.data.toolCalls,(e,t)=>(Y(),X(`div`,{key:t,class:`tc-card`},[Z(`div`,Tde,`🔧 `+q(e.name),1),Z(`pre`,Ede,q(m(e.args)),1)]))),128))])):Q(``,!0),e.data.usage?(Y(),X(`div`,Dde,[Z(`span`,Ode,`prompt: `+q(e.data.usage.prompt_tokens??`-`),1),Z(`span`,kde,`completion: `+q(e.data.usage.completion_tokens??`-`),1),Z(`span`,Ade,`total: `+q(e.data.usage.total_tokens??`-`),1)])):Q(``,!0)],64)):e.type===`tool_call`?(Y(),X(`div`,jde,[Z(`div`,Mde,`🔧 `+q(e.data.name),1),Z(`pre`,Nde,q(m(e.data.args)),1)])):e.type===`tool_result`?(Y(),X(`div`,Pde,[Z(`div`,Fde,`✅ `+q(e.data.name)+` 结果`,1),Z(`pre`,Ide,q(e.data.result),1)])):e.type===`error`?(Y(),X(`div`,Lde,q(e.data.tool?`[${e.data.tool}] `:``)+q(e.data.error),1)):Q(``,!0)]),Z(`div`,Rde,[Z(`button`,{class:`raw-toggle`,onClick:e=>f(t)},q(a.value.has(t)?`收起原始 JSON`:`查看原始 JSON`),9,zde),Z(`button`,{class:`raw-toggle`,onClick:t=>J(K5)(m(e.data))},`复制`,8,Bde)]),a.value.has(t)?(Y(),X(`pre`,Vde,[Z(`code`,null,q(m(e.data)),1)])):Q(``,!0)]))),128))],64)):y.value===`flow`?(Y(),X(KG,{key:4},[c.value.length?Q(``,!0):(Y(),X(`div`,Hde,`暂无日志,发送消息后这里按轮次展示执行流程`)),ne.value.pre.length?(Y(),X(`div`,Ude,[n[23]||=Z(`div`,{class:`flow-section-title`},`⚙️ 准备 / 其他`,-1),(Y(!0),X(KG,null,AW(ne.value.pre,(e,t)=>(Y(),X(`div`,{key:`p`+t,class:pV([`flow-node`,e.type])},[Z(`span`,Wde,q(s[e.type]?.icon),1),Z(`span`,Gde,q(s[e.type]?.label),1),Z(`span`,Kde,q(ue(e)),1),Z(`span`,qde,q(d(e.timestamp)),1)],2))),128))])):Q(``,!0),(Y(!0),X(KG,null,AW(ne.value.rounds,e=>(Y(),X(`div`,{key:e.round,class:`flow-round`},[Z(`div`,Jde,`🔁 第 `+q(e.round)+` 轮`,1),Z(`div`,Yde,[(Y(!0),X(KG,null,AW(e.items,(e,t)=>(Y(),X(`div`,{key:t,class:pV([`flow-node`,e.type])},[Z(`span`,Xde,q(s[e.type]?.icon),1),Z(`span`,Zde,q(s[e.type]?.label),1),Z(`span`,Qde,q(ue(e)),1),Z(`span`,$de,q(d(e.timestamp)),1)],2))),128))])]))),128))],64)):(Y(),X(`div`,efe,[b.value?(Y(),X(KG,{key:1},[Z(`div`,nfe,[n[29]||=Z(`div`,{class:`info-title`},`基本信息`,-1),Z(`div`,rfe,[Z(`div`,ife,[n[24]||=Z(`span`,{class:`k`},`ID`,-1),Z(`span`,afe,q(b.value.id),1)]),Z(`div`,ofe,[n[25]||=Z(`span`,{class:`k`},`模型`,-1),Z(`span`,sfe,q(b.value.model||`-`),1)]),Z(`div`,cfe,[n[26]||=Z(`span`,{class:`k`},`工具数`,-1),Z(`span`,lfe,q(b.value.tools.length),1)]),Z(`div`,ufe,[n[27]||=Z(`span`,{class:`k`},`中间件`,-1),Z(`span`,dfe,q(b.value.middleware.length),1)])]),Z(`div`,ffe,[n[28]||=Z(`span`,{class:`k`},`中间件栈`,-1),Z(`span`,pfe,q(b.value.middleware.join(` → `)||`-`),1)])]),Z(`div`,mfe,[Z(`div`,hfe,`🔧 工具 (`+q(b.value.tools.length)+`)`,1),(Y(!0),X(KG,null,AW(b.value.tools,e=>(Y(),X(`div`,{key:e.name,class:`info-item`},[Z(`div`,gfe,[dK(q(e.name),1),e.source?(Y(),X(`span`,{key:0,class:pV([`src-tag`,T(e.source)])},q(e.source),3)):Q(``,!0)]),Z(`div`,_fe,q(e.description),1)]))),128))]),b.value.skills.length?(Y(),X(`div`,vfe,[Z(`div`,yfe,[dK(`📘 技能 (`+q(b.value.skills.length)+`)`,1),n[30]||=Z(`span`,{class:`info-hint`},`点击展开查看全文`,-1)]),(Y(!0),X(KG,null,AW(b.value.skills,e=>(Y(),X(`div`,{key:e.name,class:`info-item`},[Z(`div`,{class:`info-name skill-toggle`,onClick:t=>S(e.name)},[Z(`span`,{class:pV([`skill-arrow`,{open:!!x.value[e.name]}])},`▶`,2),dK(` `+q(e.name),1)],8,bfe),Z(`div`,xfe,q(e.description),1),x.value[e.name]?(Y(),X(`div`,Sfe,[x.value[e.name].loading?(Y(),X(`div`,Cfe,`加载中…`)):x.value[e.name].error?(Y(),X(`div`,wfe,q(x.value[e.name].error),1)):x.value[e.name].content?(Y(),X(`pre`,Tfe,q(x.value[e.name].content),1)):Q(``,!0)])):Q(``,!0)]))),128))])):Q(``,!0),b.value.data?(Y(),X(`div`,Efe,[n[31]||=Z(`div`,{class:`info-title`},`📊 可操作数据`,-1),Z(`div`,Dfe,[Z(`div`,Ofe,q(b.value.data.description||`主数据对象`),1),Z(`div`,kfe,`schema: `+q(b.value.data.schema?`已声明`:`未声明`),1)])])):Q(``,!0),Z(`div`,Afe,[n[36]||=Z(`div`,{class:`info-title`},`🧬 子 Agent`,-1),Z(`div`,jfe,[Z(`div`,Mfe,[n[32]||=Z(`span`,{class:`k`},`启用`,-1),Z(`span`,Nfe,q(b.value.subagent.enabled?`是`:`否`),1)]),Z(`div`,Pfe,[n[33]||=Z(`span`,{class:`k`},`最大递归`,-1),Z(`span`,Ffe,q(b.value.subagent.maxDepth),1)]),Z(`div`,Ife,[n[34]||=Z(`span`,{class:`k`},`并行上限`,-1),Z(`span`,Lfe,q(b.value.subagent.maxParallel),1)]),Z(`div`,Rfe,[n[35]||=Z(`span`,{class:`k`},`额外工具`,-1),Z(`span`,zfe,q(b.value.subagent.allowedTools.length?b.value.subagent.allowedTools.join(`, `):`默认只读`),1)])])]),b.value.mcp?.servers?.length?(Y(),X(`div`,Bfe,[Z(`div`,Vfe,`🔌 MCP (`+q(b.value.mcp.servers.length)+`)`,1),(Y(!0),X(KG,null,AW(b.value.mcp.servers,e=>(Y(),X(`div`,{key:e.name,class:`info-item`},[Z(`div`,Hfe,[dK(q(e.name)+` `,1),Z(`span`,Ufe,q(e.toolCount)+` 工具`,1)]),Z(`div`,Wfe,q(e.url),1)]))),128))])):Q(``,!0),b.value.verify?(Y(),X(`div`,Gfe,[n[41]||=Z(`div`,{class:`info-title`},`✅ Verify 自检`,-1),Z(`div`,Kfe,[Z(`div`,qfe,[n[37]||=Z(`span`,{class:`k`},`启用`,-1),Z(`span`,Jfe,q(b.value.verify.enabled?`是`:`否`),1)]),Z(`div`,Yfe,[n[38]||=Z(`span`,{class:`k`},`自纠上限`,-1),Z(`span`,Xfe,q(b.value.verify.maxAttempts),1)]),Z(`div`,Zfe,[n[39]||=Z(`span`,{class:`k`},`对抗验证`,-1),Z(`span`,Qfe,q(b.value.verify.adversarial?`开启`:`关闭`),1)]),b.value.verify.adversarial?(Y(),X(`div`,$fe,[n[40]||=Z(`span`,{class:`k`},`对抗模型`,-1),Z(`span`,epe,q(b.value.model||`-`)+`(同主)`,1)])):Q(``,!0)])])):Q(``,!0),b.value.todos.length?(Y(),X(`div`,tpe,[Z(`div`,npe,`📋 任务清单 (`+q(b.value.todos.length)+`)`,1),(Y(!0),X(KG,null,AW(b.value.todos,(e,t)=>(Y(),X(`div`,{key:t,class:`info-todo`},[Z(`span`,{class:`todo-tag`,style:fV({background:ee[e.status]&&ee[e.status].color||`#9ca3af`})},q(te(e.status)),5),Z(`span`,null,q(e.content),1)]))),128))])):Q(``,!0),b.value.memory?(Y(),X(`div`,rpe,[n[42]||=Z(`div`,{class:`info-title`},`📝 持久指令 (memory)`,-1),Z(`pre`,ipe,q(b.value.memory),1)])):Q(``,!0),b.value.lastCompression?(Y(),X(`div`,ape,[n[49]||=Z(`div`,{class:`info-title`},`🗜️ 上轮压缩`,-1),Z(`div`,ope,[Z(`div`,spe,[n[43]||=Z(`span`,{class:`k`},`触发`,-1),Z(`span`,cpe,q(b.value.lastCompression.triggered?`✓`:`✗(未达阈值)`),1)]),Z(`div`,lpe,[n[44]||=Z(`span`,{class:`k`},`摘要轮次`,-1),Z(`span`,upe,q(b.value.lastCompression.roundsSummarized)+` / `+q(b.value.lastCompression.roundsTotal),1)]),Z(`div`,dpe,[n[45]||=Z(`span`,{class:`k`},`召回`,-1),Z(`span`,fpe,q(b.value.lastCompression.roundsRecalled)+` 条`,1)]),Z(`div`,ppe,[n[46]||=Z(`span`,{class:`k`},`消息数`,-1),Z(`span`,mpe,q(b.value.lastCompression.originalMessages)+` → `+q(b.value.lastCompression.compressedMessages),1)]),Z(`div`,hpe,[n[47]||=Z(`span`,{class:`k`},`策略`,-1),Z(`span`,gpe,q(b.value.lastCompression.strategy),1)]),b.value.lastCompression.decision?(Y(),X(`div`,_pe,[n[48]||=Z(`span`,{class:`k`},`压缩决策`,-1),Z(`span`,vpe,`🤖 `+q(le(b.value.lastCompression.decision)),1)])):Q(``,!0)])])):Q(``,!0)],64)):(Y(),X(`div`,tfe,`暂无信息`))]))])]),Z(`div`,{class:`drawer-mask`,onClick:_})])):Q(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-26317da9`]]),ype={class:`skill-panel`},bpe={class:`skill-header`},xpe={class:`skill-section`},Spe={class:`section-title`},Cpe={class:`field`},wpe=[`disabled`],Tpe={class:`field`},Epe={class:`field field-textarea`},Dpe={key:0,class:`skill-error`},Ope={class:`skill-section`},kpe={class:`section-title`},Ape={key:0,class:`empty-hint`},jpe={key:1,class:`skill-list`},Mpe={class:`skill-actions`},Npe=[`onClick`],Ppe=[`onClick`],Q9=X5(aW({__name:`SkillPanel`,props:{visible:{type:Boolean},onAddSkill:{type:Function},onRemoveSkill:{type:Function},getUserSkillNames:{type:Function},onGetSkill:{type:Function}},emits:[`close`],setup(e,{emit:t}){let n=e,r=t,i=FH(``),a=FH(``),o=FH(``),s=FH(``),c=FH([]),l=FH(0),u=FH(null);EU(()=>n.visible,e=>{e&&d()},{immediate:!0}),EU(l,()=>d());function d(){n.getUserSkillNames&&(c.value=n.getUserSkillNames())}function f(){if(s.value=``,!i.value.trim()){s.value=`skill 名不能为空`;return}if(!a.value.trim()){s.value=`描述不能为空`;return}if(!o.value.trim()){s.value=`内容不能为空`;return}let e=i.value.trim();u.value===null&&c.value.includes(e)&&(s.value=`已存在同名用户 skill "${e}",将覆盖`),n.onAddSkill?.({name:e,description:a.value.trim(),getContent:()=>o.value}),h(),l.value++}function p(e){n.onRemoveSkill&&n.onRemoveSkill(e)&&(u.value===e&&h(),l.value++)}function m(e){if(!n.onGetSkill)return;let t=n.onGetSkill(e);t&&(u.value=e,i.value=t.name,a.value=t.description,o.value=t.content,s.value=``)}function h(){u.value=null,i.value=``,a.value=``,o.value=``,s.value=``}return(t,n)=>(Y(),nK(VU,{to:`body`},[sK(eq,{name:`cs-skill-fade`},{default:yU(()=>[e.visible?(Y(),X(`div`,{key:0,class:`skill-mask`,onClick:n[4]||=tJ(e=>r(`close`),[`self`])},[Z(`div`,ype,[Z(`div`,bpe,[n[5]||=Z(`span`,{class:`skill-title`},`🧩 Skill 管理`,-1),Z(`button`,{class:`skill-close`,title:`关闭`,onClick:n[0]||=e=>r(`close`)},`✕`)]),Z(`div`,xpe,[Z(`div`,Spe,[dK(q(u.value?`编辑 Skill: ${u.value}`:`创建新 Skill`)+` `,1),u.value?(Y(),X(`button`,{key:0,class:`btn btn-ghost btn-cancel`,title:`取消编辑,回到新建`,onClick:h},`取消编辑`)):Q(``,!0)]),Z(`label`,Cpe,[n[6]||=Z(`span`,{class:`field-label`},`名称`,-1),bU(Z(`input`,{"onUpdate:modelValue":n[1]||=e=>i.value=e,disabled:!!u.value,placeholder:`如:my-writer`,class:`field-input`},null,8,wpe),[[Qq,i.value]])]),Z(`label`,Tpe,[n[7]||=Z(`span`,{class:`field-label`},`描述`,-1),bU(Z(`input`,{"onUpdate:modelValue":n[2]||=e=>a.value=e,placeholder:`一句话说明用途与触发时机`,class:`field-input`},null,512),[[Qq,a.value]])]),Z(`label`,Epe,[n[8]||=Z(`span`,{class:`field-label`},`内容`,-1),bU(Z(`textarea`,{"onUpdate:modelValue":n[3]||=e=>o.value=e,placeholder:`skill 全文指令(支持 Markdown)`,rows:`6`,class:`field-input`},null,512),[[Qq,o.value]])]),s.value?(Y(),X(`div`,Dpe,q(s.value),1)):Q(``,!0),Z(`button`,{class:`btn btn-primary`,onClick:f},q(u.value?`保存修改`:`添加 Skill`),1)]),Z(`div`,Ope,[Z(`div`,kpe,`已创建 Skill(`+q(c.value.length)+`)`,1),c.value.length?(Y(),X(`ul`,jpe,[(Y(!0),X(KG,null,AW(c.value,e=>(Y(),X(`li`,{key:e,class:`skill-item`},[Z(`span`,{class:pV([`skill-name`,{active:u.value===e}])},q(e),3),Z(`span`,Mpe,[Z(`button`,{class:`btn btn-ghost btn-edit`,title:`加载到表单编辑`,onClick:t=>m(e)},`编辑`,8,Npe),Z(`button`,{class:`btn btn-ghost btn-del`,title:`删除该用户 skill`,onClick:t=>p(e)},`删除`,8,Ppe)])]))),128))])):(Y(),X(`div`,Ape,`暂无用户创建的 skill`))]),n[9]||=Z(`div`,{class:`skill-hint`},[dK(` 💡 创建/编辑的 skill 会自动加入 agent(下轮 system prompt 索引可见),agent 经 `),Z(`code`,null,`load_skill(name)`),dK(` 按需加载全文; 持久化由独立 SkillStore 管理(默认 indexedDB,与 storage 选项分离),跨刷新自动恢复;可经 `),Z(`code`,null,`skillStorage.id`),dK(` 跨页面复用。 `)],-1)])])):Q(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-c6a22ea5`]]),$9=X5(aW({__name:`ChatDialog`,props:{fetchResponse:{},fetchStream:{},title:{default:`AI 助手`},placeholder:{default:`输入消息,Enter 发送...`},debugLogs:{},initialMessages:{},onPersist:{},onQueuedCleared:{},onClear:{},getInfo:{},onUndo:{},canUndo:{},showAvatar:{type:Boolean,default:!0},showTyping:{type:Boolean,default:!0},pendingConflict:{},onResolveConflict:{},infoTick:{},getSkillContent:{},onAddSkill:{},onRemoveSkill:{},getUserSkillNames:{},onGetSkill:{},drawer:{type:Boolean},drawerWidth:{},drawerHidden:{type:Boolean},inputRows:{default:2},sessions:{},currentSessionId:{},onNewSession:{},onOpenSession:{},onRemoveSession:{},getFocus:{},onSetFocus:{},onClearFocus:{},getFocuses:{},onAddFocus:{},onRemoveFocus:{},onFocusChipClick:{},sections:{}},emits:[`close`],setup(e,{emit:t}){let n=e,r=t,i=J5({fetchResponse:n.fetchResponse,fetchStream:n.fetchStream,messages:n.initialMessages,onPersist:n.onPersist,onClear:n.onClear,onQueuedCleared:n.onQueuedCleared,getInfo:n.getInfo,canUndo:n.canUndo,onUndo:n.onUndo,getFocuses:n.getFocuses,onAddFocus:n.onAddFocus,onRemoveFocus:n.onRemoveFocus,onClearFocus:n.onClearFocus,onFocusChipClick:n.onFocusChipClick,infoTick:n.infoTick});SU(q5,i);let{isExpanded:a,debugVisible:o,skillVisible:s,closeSkill:c}=i;function l(e){return e===`focus`?n.sections?.focus===!0:n.sections?.[e]!==!1}let u=RK(()=>!!n.onAddSkill),d=RK(()=>{if(!n.drawer||n.drawerWidth==null)return null;let e=n.drawerWidth;return typeof e==`number`?`${e}px`:e});return(t,n)=>(Y(),X(KG,null,[e.drawer?(Y(),X(`div`,{key:0,class:`chat-mask`,onClick:n[0]||=e=>r(`close`)})):Q(``,!0),Z(`div`,{class:pV([`chat-dialog`,{collapsed:!J(a)&&!e.drawer,drawer:e.drawer}]),style:fV(d.value?{width:d.value,maxWidth:d.value}:null)},[l(`header`)?jW(t.$slots,`header`,{key:0,chat:J(i)},()=>[sK(Z5,{title:e.title,drawer:e.drawer,"debug-logs":e.debugLogs,"skill-available":u.value,sessions:e.sessions,"current-session-id":e.currentSessionId,"on-new-session":e.onNewSession,"on-open-session":e.onOpenSession,"on-remove-session":e.onRemoveSession,onClose:n[1]||=e=>r(`close`)},null,8,[`title`,`drawer`,`debug-logs`,`skill-available`,`sessions`,`current-session-id`,`on-new-session`,`on-open-session`,`on-remove-session`])],!0):Q(``,!0),l(`focus`)?jW(t.$slots,`focus`,{key:1,chat:J(i)},()=>[sK(Q5,{"get-focus":e.getFocus,"on-set-focus":e.onSetFocus,"on-clear-focus":e.onClearFocus,"info-tick":e.infoTick},null,8,[`get-focus`,`on-set-focus`,`on-clear-focus`,`info-tick`])],!0):Q(``,!0),l(`body`)?(Y(),nK(eq,{key:2,name:`cs-slide`},{default:yU(()=>[jW(t.$slots,`body`,{chat:J(i)},()=>[bU(sK(G9,{"show-avatar":e.showAvatar,"show-typing":e.showTyping},null,8,[`show-avatar`,`show-typing`]),[[vq,J(a)]])],!0)]),_:3})):Q(``,!0),l(`queued`)?jW(t.$slots,`queued`,{key:3,chat:J(i)},()=>[sK(K9)],!0):Q(``,!0),l(`approval`)?jW(t.$slots,`approval`,{key:4,chat:J(i)},()=>[sK(q9)],!0):Q(``,!0),l(`conflict`)?jW(t.$slots,`conflict`,{key:5,chat:J(i)},()=>[sK(J9,{"pending-conflict":e.pendingConflict,"on-resolve":e.onResolveConflict},null,8,[`pending-conflict`,`on-resolve`])],!0):Q(``,!0),l(`footer`)?(Y(),nK(eq,{key:6,name:`cs-slide`},{default:yU(()=>[jW(t.$slots,`footer`,{chat:J(i)},()=>[sK(Y9,{placeholder:e.placeholder,"input-rows":e.inputRows},null,8,[`placeholder`,`input-rows`])],!0)]),_:3})):Q(``,!0),l(`debug`)?jW(t.$slots,`debug`,{key:7,chat:J(i)},()=>[sK(Z9,{visible:J(o),"onUpdate:visible":n[2]||=e=>PH(o)?o.value=e:null,logs:e.debugLogs,"get-info":e.getInfo,"info-tick":e.infoTick,"get-skill-content":e.getSkillContent},null,8,[`visible`,`logs`,`get-info`,`info-tick`,`get-skill-content`])],!0):Q(``,!0),l(`skill`)?jW(t.$slots,`skill`,{key:8,chat:J(i)},()=>[sK(Q9,{visible:J(s),"on-add-skill":e.onAddSkill,"on-remove-skill":e.onRemoveSkill,"get-user-skill-names":e.getUserSkillNames,"on-get-skill":e.onGetSkill,onClose:J(c)},null,8,[`visible`,`on-add-skill`,`on-remove-skill`,`get-user-skill-names`,`on-get-skill`,`onClose`])],!0):Q(``,!0)],6)],64))}}),[[`__scopeId`,`data-v-f1275b15`]]);function Fpe(e){let{core:t,dialogCfg:n}=e,r=null,i=e.el,a=t.agent.debugLogs;return r=sJ(aW({setup(){return()=>zK($9,{fetchStream:e.streaming?t.stream:void 0,fetchResponse:e.streaming?void 0:(e,n)=>{if(n){let e=()=>t.resolveConflict(`keep_external`);n.aborted?e():n.addEventListener(`abort`,e,{once:!0})}return t.agent.invoke(e,n)},title:n.title,placeholder:n.placeholder,debugLogs:a.value,initialMessages:t.messages,getInfo:()=>t.getInfo(),onUndo:t.checkpoint?()=>t.checkpoint.restore():void 0,canUndo:t.checkpoint?()=>t.checkpoint.canRestore():void 0,onPersist:async()=>{t.afterRound(),t.store&&await t.store.flush()},onClear:()=>t.resetSession(),onQueuedCleared:e=>{let n=t.agent?.debugLogs;n&&(n.value.push({timestamp:Date.now(),type:`middleware`,data:{stage:`queued_cleared`,dropped:e.length,preview:e.map(e=>e.slice(0,60))}}),zH(n))},pendingConflict:t.pendingConflict.value,onResolveConflict:e=>t.resolveConflict(e),infoTick:t.infoTick,getSkillContent:t.skillsController?e=>t.skillsController.getContent(e):void 0,onAddSkill:t.skillsController?e=>t.addSkill(e):void 0,onRemoveSkill:t.skillsController?e=>t.removeSkill(e):void 0,getUserSkillNames:t.skillsController?()=>t.listUserSkills():void 0,onGetSkill:t.skillsController?e=>t.getUserSkill(e):void 0,drawer:n.drawer===!0,drawerWidth:n.drawerWidth,drawerHidden:n.drawerHidden===!0,inputRows:n.inputRows,sections:n.sections,getFocus:()=>t.getFocus(),getFocuses:()=>t.getFocuses(),onSetFocus:e=>t.setFocus(e),onAddFocus:e=>t.addFocus(e),onRemoveFocus:e=>t.removeFocus(e),onClearFocus:()=>t.clearFocus(),onFocusChipClick:e=>t.emit({type:`focus_chip_click`,path:e.path,label:e.label}),onClose:n.onClose??(n.drawer===!0?()=>e.hide():()=>e.unmount()),...t.store?{sessions:t.sessions.value,currentSessionId:t.sessionId,onNewSession:()=>{e.runSerial(()=>t.switchSession())},onOpenSession:n=>{e.runSerial(()=>t.switchSession(n))},onRemoveSession:async e=>{e!==t.sessionId&&(await t.store.deleteSession(t.agentId,e),await t.refreshSessions())}}:{}})}})),r.mount(e.el),{unmount(){let t=i.querySelector?.(`.chat-dialog`);if(r&&t){t.classList.add(`cs-leaving`);let n=i.querySelector?.(`.chat-mask`);n&&n.classList.add(`cs-leaving`);let a=!1,o=()=>{a||(a=!0,r?.unmount(),r=null,e.onDialogUnmounted())};t.addEventListener(`transitionend`,o,{once:!0}),setTimeout(o,320);return}r?.unmount(),r=null,e.onDialogUnmounted()},hide(){let e=i.querySelector?.(`.chat-dialog`),t=i.querySelector?.(`.chat-mask`);e&&e.classList.add(`cs-hidden`),t&&t.classList.add(`cs-hidden`)},show(){let e=i.querySelector?.(`.chat-dialog`),t=i.querySelector?.(`.chat-mask`);e&&e.classList.remove(`cs-hidden`),t&&t.classList.remove(`cs-hidden`)}}}Hm();var Ipe=`你是知识检索专家。可用工具:search_docs(语义检索)/ load_doc(按 source 加载)/ vfs_grep+vfs_read(搜预注入文档)/ fetch_document(公网 URL)。
337
+ …(已截断)`:t}catch{return String(e)}});return(t,a)=>e.pendingConflict?(Y(),X(`div`,mle,[Z(`div`,hle,[a[6]||=Z(`span`,{class:`conflict-icon`},`⚠️`,-1),Z(`span`,gle,[a[4]||=dK(`写入冲突:`,-1),Z(`code`,null,q(e.pendingConflict.path),1),a[5]||=dK(` 已被外部修改`,-1)])]),Z(`div`,_le,` AI 基于「读取时的旧值」准备`+q(e.pendingConflict.op===`delete`?`删除`:`写入`)+`,但该属性在你读取之后被外部代码/其他 agent/手动改过。 `,1),Z(`button`,{class:`conflict-toggle`,onClick:a[0]||=e=>n.value=!n.value},q(n.value?`收起对比`:`查看值对比`)+q(n.value?` ▴`:` ▾`),1),n.value?(Y(),X(`div`,vle,[Z(`div`,yle,[a[7]||=Z(`div`,{class:`conflict-diff-label`},`AI 想写的值`,-1),Z(`pre`,ble,q(r.value||`(delete 操作无值)`),1)]),Z(`div`,xle,[a[8]||=Z(`div`,{class:`conflict-diff-label`},`外部改后的当前值`,-1),Z(`pre`,Sle,q(i.value),1)])])):Q(``,!0),Z(`div`,Cle,[Z(`button`,{class:`conflict-keep`,onClick:a[1]||=t=>e.onResolve?.(`keep_external`),title:`不写入,保留外部修改后的值,AI 重新读取再改`},`保留外部`),Z(`button`,{class:`conflict-overwrite`,onClick:a[2]||=t=>e.onResolve?.(`overwrite`),title:`用 AI 的值覆盖外部修改`},`强制覆盖`),Z(`button`,{class:`conflict-restore`,onClick:a[3]||=t=>e.onResolve?.(`restore`),title:`回退到最近一次历史快照(agent 之前操作的检查点),撤销外部修改 + AI 不写入`},`回退`)])])):Q(``,!0)}}),[[`__scopeId`,`data-v-195e5b23`]]),wle={class:`chat-footer`},Tle={class:`chat-input-wrap`},Ele={key:0,class:`focus-chips`},Dle=[`title`,`onClick`],Ole={class:`focus-chip-path`},kle=[`onClick`],Ale=[`placeholder`,`rows`],jle={class:`input-actions`},Mle=[`disabled`,`title`],Nle={key:0,width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`currentColor`},Ple={key:1,width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},Y9=X5(aW({__name:`ChatInput`,props:{placeholder:{},inputRows:{}},setup(e){let t=Y5(),{inputText:n,send:r,keydown:i,canUndo:a,undo:o,focuses:s,removeFocus:c,focusChipClick:l}=t,{state:u,stop:d}=t.chat;return(t,f)=>(Y(),X(`div`,wle,[J(a)?(Y(),X(`button`,{key:0,class:`undo-foot-btn`,title:`回退到上次正常状态(还原对话历史 + 页面属性 + 工作区)`,onClick:f[0]||=(...e)=>J(o)&&J(o)(...e)},`↩ 回退`)):Q(``,!0),Z(`div`,Tle,[J(s).length?(Y(),X(`div`,Ele,[(Y(!0),X(KG,null,AW(J(s),e=>(Y(),X(`span`,{key:e.path,class:`focus-chip`,title:`精修中:${e.path}(点击回看 · ✕ 移除)`,onClick:t=>J(l)(e)},[f[4]||=Z(`span`,{class:`focus-chip-icon`},`🎯`,-1),Z(`code`,Ole,q(e.path),1),Z(`button`,{type:`button`,class:`focus-chip-x`,"data-test":`focus-clear`,title:`移除此焦点`,onClick:tJ(t=>J(c)(e.path),[`stop`])},`✕`,8,kle)],8,Dle))),128))])):Q(``,!0),bU(Z(`textarea`,{"onUpdate:modelValue":f[1]||=e=>PH(n)?n.value=e:null,class:pV([`chat-input`,{"has-focus-chip":J(s).length>0}]),placeholder:e.placeholder,rows:e.inputRows,onKeydown:f[2]||=(...e)=>J(i)&&J(i)(...e)},null,42,Ale),[[Qq,J(n)]]),Z(`div`,jle,[f[7]||=Z(`span`,{class:`send-hint`},`Enter 发送 · Shift+Enter 换行`,-1),Z(`button`,{class:pV([`send-btn`,{"stop-btn":J(u).loading}]),disabled:!J(u).loading&&!J(n).trim(),title:J(u).loading?`停止生成`:`发送`,onClick:f[3]||=e=>J(u).loading?J(d)():J(r)()},[J(u).loading?(Y(),X(`svg`,Nle,[...f[5]||=[Z(`rect`,{x:`6`,y:`6`,width:`12`,height:`12`,rx:`2`},null,-1)]])):(Y(),X(`svg`,Ple,[...f[6]||=[Z(`line`,{x1:`22`,y1:`2`,x2:`11`,y2:`13`},null,-1),Z(`polygon`,{points:`22 2 15 22 11 13 2 9 22 2`},null,-1)]]))],10,Mle)])])]))}}),[[`__scopeId`,`data-v-3a3e4dfa`]]),Fle={key:0,class:`debug-drawer`},Ile={class:`drawer-panel`},Lle={class:`drawer-header`},Rle={class:`tab-group`},zle={class:`header-actions`},Ble={key:0,class:`drawer-filters`},Vle=[`onClick`],Hle={class:`chip-count`},Ule={class:`chip-count`},Wle={class:`drawer-body`},Gle={key:0,class:`trace-panel`},Kle={key:0,class:`trace-empty`},qle={class:`trace-metrics`},Jle={class:`metric-card`},Yle={class:`metric-card`},Xle={class:`metric-card`},Zle={class:`metric-card`},Qle={key:0,class:`metric-card`},$le={key:1,class:`metric-card`},eue={class:`trace-spans`},tue={class:`span-ico`},nue={class:`span-name`},rue={key:0,class:`span-dur`},iue={key:1,class:`span-status`},aue={key:1,class:`context-panel`},oue={key:0,class:`trace-empty`},sue={class:`ctx-overview`},cue={class:`ctx-occupancy`},lue=[`title`],uue={class:`ctx-pct`},due={class:`ctx-kv-row`},fue={class:`ctx-kv`},pue={key:0,class:`ctx-kv`},mue={key:1,class:`ctx-kv`},hue=[`title`],gue={class:`ctx-cat-bar`},_ue={class:`ctx-cat-tokens`},vue={key:0,class:`ctx-compression`},yue={class:`ctx-kv-row`},bue={class:`ctx-kv`},xue={class:`ctx-kv`},Sue={class:`ctx-kv`},Cue={key:0,class:`ctx-kv`},wue={key:2,class:`subagent-panel`},Tue={key:0,class:`trace-empty`},X9={key:0,class:`sub-section`},Eue={class:`sub-section-title`},Due={class:`sub-head`},Oue={class:`sub-label`},kue={class:`sub-steps-badge`},Aue={class:`sub-task`},jue={key:1,class:`sub-section`},Mue={class:`sub-section-title`},Nue={class:`sub-head`},Pue={class:`sub-label`},Fue={key:0,class:`sub-dur`},Iue=[`onClick`],Lue={class:`sub-task`},Rue={key:0,class:`sub-result`},zue={key:1,class:`sub-steps-list`},Bue={class:`sub-step-kind`},Vue={class:`sub-step-name`},Hue={class:`sub-step-ts`},Uue={key:0,class:`empty`},Wue={class:`log-head`},Gue={key:0,class:`log-source`},Kue={class:`log-time`},que={class:`log-body`},Jue={class:`kv-grid`},Yue={class:`kv`},Xue={class:`v`},Zue={class:`kv`},Que={class:`v`},$ue={class:`kv`},ede={class:`v`},tde={class:`kv`},nde={class:`v`},rde={class:`section-label`},ide={class:`chip-row`},ade={class:`msg-list`},ode={class:`msg-text`},sde={class:`badge-row`},cde={class:`badge`},lde={key:0,class:`badge muted`},ude={class:`badge muted`},dde={key:1,class:`badge muted`},fde=[`onClick`],pde={key:0,class:`msg-list`},mde={class:`msg-detail`},hde={key:0,class:`msg-text`},gde={class:`tc-inline-name`},_de={class:`tc-inline-args`},vde={key:1,class:`tc-id`},yde={key:1,class:`log-raw`},bde={class:`badge-row`},xde={class:`badge`},Sde={key:0,class:`badge warn`},Cde={key:0,class:`resp-content`},wde={key:1,class:`tc-list`},Tde={class:`tc-name`},Ede={class:`tc-args`},Dde={key:2,class:`usage-row`},Ode={class:`usage`},kde={class:`usage`},Ade={class:`usage`},jde={key:3,class:`tc-card inline`},Mde={class:`tc-name`},Nde={class:`tc-args`},Pde={key:4,class:`tc-card inline`},Fde={class:`tc-name`},Ide={class:`tc-args`},Lde={key:5,class:`err-box`},Rde={class:`log-footer`},zde=[`onClick`],Bde=[`onClick`],Vde={key:0,class:`log-raw`},Hde={key:0,class:`empty`},Ude={key:1,class:`flow-section`},Wde={class:`flow-ico`},Gde={class:`flow-label`},Kde={class:`flow-detail`},qde={class:`flow-time`},Jde={class:`flow-round-head`},Yde={class:`flow-round-body`},Xde={class:`flow-ico`},Zde={class:`flow-label`},Qde={class:`flow-detail`},$de={class:`flow-time`},efe={key:5,class:`info-body`},tfe={key:0,class:`empty`},nfe={class:`info-section`},rfe={class:`kv-grid`},ife={class:`kv`},afe={class:`v`},ofe={class:`kv`},sfe={class:`v`},cfe={class:`kv`},lfe={class:`v`},ufe={class:`kv`},dfe={class:`v`},ffe={class:`kv`,style:{"margin-top":`6px`}},pfe={class:`v`,style:{"font-size":`11px`}},mfe={class:`info-section`},hfe={class:`info-title`},gfe={class:`info-name`},_fe={class:`info-desc`},vfe={key:0,class:`info-section`},yfe={class:`info-title`},bfe=[`onClick`],xfe={class:`info-desc`},Sfe={key:0,class:`skill-content`},Cfe={key:0,class:`skill-loading`},wfe={key:1,class:`skill-error`},Tfe={key:2,class:`skill-pre`},Efe={key:1,class:`info-section`},Dfe={class:`info-item`},Ofe={class:`info-name`},kfe={class:`info-desc`},Afe={class:`info-section`},jfe={class:`kv-grid`},Mfe={class:`kv`},Nfe={class:`v`},Pfe={class:`kv`},Ffe={class:`v`},Ife={class:`kv`},Lfe={class:`v`},Rfe={class:`kv`},zfe={class:`v`,style:{"font-size":`11px`}},Bfe={key:2,class:`info-section`},Vfe={class:`info-title`},Hfe={class:`info-name`},Ufe={class:`src-tag mcp`},Wfe={class:`info-desc`},Gfe={key:3,class:`info-section`},Kfe={class:`kv-grid`},qfe={class:`kv`},Jfe={class:`v`},Yfe={class:`kv`},Xfe={class:`v`},Zfe={class:`kv`},Qfe={class:`v`},$fe={key:0,class:`kv`},epe={class:`v`,style:{"font-size":`11px`}},tpe={key:4,class:`info-section`},npe={class:`info-title`},rpe={key:5,class:`info-section`},ipe={class:`info-pre`},ape={key:6,class:`info-section`},ope={class:`info-kv`},spe={class:`kv`},cpe={class:`v`},lpe={class:`kv`},upe={class:`v`},dpe={class:`kv`},fpe={class:`v`},ppe={class:`kv`},mpe={class:`v`},hpe={class:`kv`},gpe={class:`v`,style:{"font-size":`11px`}},_pe={key:0,class:`kv`},vpe={class:`v`,style:{"font-size":`11px`}},Z9=X5(aW({__name:`DebugDrawer`,props:{logs:{default:()=>[]},visible:{type:Boolean},getInfo:{},infoTick:{},getSkillContent:{}},emits:[`update:visible`,`clear`],setup(e,{emit:t}){let n=e,r=t,i=FH(`all`),a=FH(new Set),o=FH(new Set),s={context:{label:`上下文`,color:`var(--cs-primary)`,icon:`🧩`},llm_request:{label:`LLM请求`,color:`#059669`,icon:`➡️`},llm_response:{label:`LLM响应`,color:`#d97706`,icon:`⬅️`},tool_call:{label:`工具调用`,color:`#7c3aed`,icon:`🔧`},tool_result:{label:`工具结果`,color:`#2563eb`,icon:`✅`},error:{label:`错误`,color:`#dc2626`,icon:`❌`},middleware:{label:`中间件`,color:`#0891b2`,icon:`⚙️`}},c=RK(()=>Array.isArray(n.logs)?n.logs:[]),l=RK(()=>i.value===`all`?c.value:c.value.filter(e=>e.type===i.value)),u=RK(()=>{let e={all:c.value.length};for(let t of c.value)e[t.type]=(e[t.type]||0)+1;return e});function d(e){return new Date(e).toLocaleTimeString(`zh-CN`,{hour12:!1})+`.`+String(e%1e3).padStart(3,`0`)}function f(e){let t=new Set(a.value);t.has(e)?t.delete(e):t.add(e),a.value=t}function p(e){let t=new Set(o.value);t.has(e)?t.delete(e):t.add(e),o.value=t}function m(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}let h={system:{label:`SYSTEM`,color:`#6b7280`},human:{label:`USER`,color:`var(--cs-primary)`},user:{label:`USER`,color:`var(--cs-primary)`},ai:{label:`AI`,color:`#059669`},assistant:{label:`AI`,color:`#059669`},tool:{label:`TOOL`,color:`#2563eb`}};function g(e){return h[e]||{label:(e||`?`).toUpperCase(),color:`#9ca3af`}}function _(){r(`update:visible`,!1)}function v(){a.value=new Set,r(`clear`)}let y=FH(`logs`),b=FH(null),x=FH({});async function S(e){if(x.value[e]){delete x.value[e],x.value={...x.value};return}if(!n.getSkillContent){x.value={...x.value,[e]:{loading:!1,content:null,error:`当前 SDK 未注入 getSkillContent,无法查看 skill 全文`}};return}x.value={...x.value,[e]:{loading:!0,content:null}};try{let t=await n.getSkillContent(e);x.value={...x.value,[e]:{loading:!1,content:t,error:t==null?`skill 无内容或读取失败`:void 0}}}catch(t){x.value={...x.value,[e]:{loading:!1,content:null,error:String(t?.message||t)}}}}function C(){if(n.getInfo)try{b.value=n.getInfo()}catch{b.value=null}}function w(e){y.value=e,(e===`subagent`||e===`info`||e===`context`)&&C()}EU(()=>n.infoTick?.value,()=>{n.visible&&(y.value===`subagent`||y.value===`info`||y.value===`context`)&&C()});let ee={pending:{label:`待办`,color:`#9ca3af`},in_progress:{label:`进行中`,color:`#d97706`},completed:{label:`完成`,color:`#059669`}};function te(e){return ee[e]?.label??e}function T(e){return e?e===`builtin`?`builtin`:e.startsWith(`mcp:`)?`mcp`:`user`:``}let ne=RK(()=>{let e=new Map,t=[];for(let n of c.value){let r=n.data?.round;typeof r==`number`&&r>0?(e.has(r)||e.set(r,[]),e.get(r).push(n)):t.push(n)}return{pre:t,rounds:[...e.entries()].sort((e,t)=>e[0]-t[0]).map(([e,t])=>({round:e,items:t}))}});function E(e,t){return e.length>t?e.slice(0,t)+`…`:e}let D=RK(()=>b.value?.trace?.spans??[]),re=RK(()=>b.value?.trace?.metrics),O=RK(()=>b.value?.context),ie=RK(()=>{let e=O.value;return e?e.occupancy>=1?`red`:e.thresholdRatio>0&&e.occupancy>=e.thresholdRatio?`yellow`:`green`:``}),ae=RK(()=>b.value?.subagent?.active??[]),oe=RK(()=>b.value?.subagent?.history??[]),k={running:{label:`运行中`,color:`#059669`},done:{label:`完成`,color:`#6b7280`},error:{label:`错误`,color:`#dc2626`}},A=FH(new Set);function se(e){let t=new Set(A.value);t.has(e)?t.delete(e):t.add(e),A.value=t}function ce(e){return e===`round`?`🔄`:e===`model`?`🧠`:e===`tool`?`🔧`:e===`compression`?`📦`:`•`}function le(e){return`${e.windowRatio==null?`keepRounds=${e.keepRounds??`?`}`:`windowRatio=${e.windowRatio}`} · ${e.summarize.mode}摘要 · 召回${e.recallTopK??`?`}${e.reason?` · `+e.reason:``}`}function ue(e){let t=e.data||{};switch(e.type){case`context`:return`${t.tools?.length??0} 工具 · ${t.totalMessages??0} 消息`;case`llm_request`:return`${(t.messages||[]).length} 消息${t.tools?.length?` · `+t.tools.length+` 工具`:``}`;case`llm_response`:return t.toolCalls?.length?`${t.toolCalls.length} 个工具调用`:t.content?E(String(t.content),50):``;case`tool_call`:return String(t.name??``);case`tool_result`:return`${t.name??``} · ${t.status===`error`?`❌`:`✅`}`;case`error`:return E(String(t.error??t.tool??``),60);case`middleware`:return String(t.stage??``);default:return``}}return(t,n)=>(Y(),nK(VU,{to:`body`},[sK(eq,{name:`drawer`},{default:yU(()=>[e.visible?(Y(),X(`div`,Fle,[Z(`div`,Ile,[Z(`div`,Lle,[Z(`div`,Rle,[Z(`button`,{class:pV([`tab-btn`,{active:y.value===`logs`}]),onClick:n[0]||=e=>w(`logs`)},`🐛 日志`,2),Z(`button`,{class:pV([`tab-btn`,{active:y.value===`flow`}]),onClick:n[1]||=e=>w(`flow`)},`🔀 流程`,2),e.getInfo?(Y(),X(`button`,{key:0,class:pV([`tab-btn`,{active:y.value===`trace`}]),onClick:n[2]||=e=>w(`trace`)},`🌳 Trace`,2)):Q(``,!0),e.getInfo?(Y(),X(`button`,{key:1,class:pV([`tab-btn`,{active:y.value===`context`}]),onClick:n[3]||=e=>w(`context`)},`📊 上下文`,2)):Q(``,!0),e.getInfo?(Y(),X(`button`,{key:2,class:pV([`tab-btn`,{active:y.value===`subagent`}]),onClick:n[4]||=e=>w(`subagent`)},`🤖 子 agent`,2)):Q(``,!0),e.getInfo?(Y(),X(`button`,{key:3,class:pV([`tab-btn`,{active:y.value===`info`}]),onClick:n[5]||=e=>w(`info`)},`🧬 Agent 信息`,2)):Q(``,!0)]),Z(`div`,zle,[y.value===`logs`?(Y(),X(`button`,{key:0,class:`hd-btn`,title:`清空日志`,onClick:v},`🗑️`)):Q(``,!0),Z(`button`,{class:`hd-btn`,title:`关闭`,onClick:_},`✕`)])]),y.value===`logs`?(Y(),X(`div`,Ble,[(Y(),X(KG,null,AW(s,(e,t)=>Z(`button`,{key:t,class:pV([`filter-chip`,{active:i.value===t}]),style:fV({"--chip-color":e.color}),onClick:e=>i.value=t},[dK(q(e.icon)+` `+q(e.label)+` `,1),Z(`span`,Hle,q(u.value[t]||0),1)],14,Vle)),64)),Z(`button`,{class:pV([`filter-chip all`,{active:i.value===`all`}]),onClick:n[6]||=e=>i.value=`all`},[n[7]||=dK(` 全部 `,-1),Z(`span`,Ule,q(u.value.all||0),1)],2)])):Q(``,!0),Z(`div`,Wle,[y.value===`trace`?(Y(),X(`div`,Gle,[re.value?(Y(),X(KG,{key:1},[Z(`div`,qle,[Z(`div`,Jle,[n[9]||=Z(`span`,null,`轮次`,-1),Z(`b`,null,q(re.value.rounds),1)]),Z(`div`,Yle,[n[10]||=Z(`span`,null,`总耗时`,-1),Z(`b`,null,q(re.value.totalDurationMs)+`ms`,1)]),Z(`div`,Xle,[n[11]||=Z(`span`,null,`平均/轮`,-1),Z(`b`,null,q(re.value.avgRoundMs)+`ms`,1)]),Z(`div`,Zle,[n[12]||=Z(`span`,null,`工具`,-1),Z(`b`,null,q(re.value.toolCalls)+`(✅`+q(Math.round(re.value.toolSuccessRate*100))+`%)`,1)]),re.value.compressions?(Y(),X(`div`,Qle,[n[13]||=Z(`span`,null,`压缩`,-1),Z(`b`,null,q(re.value.compressions),1)])):Q(``,!0),re.value.totalTokens?(Y(),X(`div`,$le,[n[14]||=Z(`span`,null,`Token`,-1),Z(`b`,null,q(re.value.totalTokens.total),1)])):Q(``,!0)]),Z(`div`,eue,[(Y(!0),X(KG,null,AW(D.value,e=>(Y(),X(`div`,{key:e.id,class:pV([`trace-span`,[e.type,e.status]])},[Z(`span`,tue,q(ce(e.type)),1),Z(`span`,nue,q(e.name),1),e.durationMs?(Y(),X(`span`,rue,q(e.durationMs)+`ms`,1)):Q(``,!0),e.status===`error`?(Y(),X(`span`,iue,`❌`)):Q(``,!0)],2))),128))])],64)):(Y(),X(`div`,Kle,[...n[8]||=[dK(`未开启 tracing(`,-1),Z(`code`,null,`capabilities.tracing:true`,-1),dK(`)或暂无 trace。跑一轮 agent 后刷新。`,-1)]]))])):Q(``,!0),y.value===`context`?(Y(),X(`div`,aue,[O.value?(Y(),X(KG,{key:1},[Z(`div`,sue,[Z(`div`,cue,[Z(`div`,{class:`ctx-bar-track`,title:`占用 ${Math.round(O.value.occupancy*100)}%`},[Z(`div`,{class:pV([`ctx-bar-fill`,ie.value]),style:fV({width:Math.min(O.value.occupancy*100,100)+`%`})},null,6),O.value.thresholdRatio>0?(Y(),X(`div`,{key:0,class:`ctx-threshold-mark`,style:fV({left:Math.min(O.value.thresholdRatio*100,100)+`%`}),title:`压缩阈值`},null,4)):Q(``,!0)],8,lue),Z(`span`,uue,q(Math.round(O.value.occupancy*100))+`%`,1)]),Z(`div`,due,[Z(`span`,fue,`估算 `+q(O.value.totalTokens)+` token`,1),O.value.contextWindow?(Y(),X(`span`,pue,`窗口 `+q(O.value.contextWindow),1)):Q(``,!0),O.value.thresholdRatio>0?(Y(),X(`span`,mue,`阈值 `+q(Math.round(O.value.thresholdRatio*100))+`%`,1)):Q(``,!0)])]),n[16]||=Z(`div`,{class:`ctx-section-title`},`分类构成(近似)`,-1),(Y(!0),X(KG,null,AW(O.value.categories,e=>(Y(),X(`div`,{key:e.key,class:`ctx-cat`},[Z(`span`,{class:`ctx-cat-label`,title:e.label},q(e.label),9,hue),Z(`div`,gue,[Z(`div`,{class:`ctx-cat-fill`,style:fV({width:Math.max(Math.round(e.pct*100),2)+`%`})},null,4)]),Z(`span`,_ue,[dK(q(e.tokens)+` `,1),Z(`i`,null,`(`+q(Math.round(e.pct*100))+`%)`,1)])]))),128)),O.value.compression?(Y(),X(`div`,vue,[n[15]||=Z(`div`,{class:`ctx-section-title`},`最近压缩`,-1),Z(`div`,yue,[Z(`span`,bue,`摘要 `+q(O.value.compression.roundsSummarized)+`/`+q(O.value.compression.roundsTotal)+` 轮`,1),Z(`span`,xue,`召回 `+q(O.value.compression.roundsRecalled),1),Z(`span`,Sue,q(O.value.compression.strategy),1),O.value.compression.decision?(Y(),X(`span`,Cue,`🤖 agent 决策:`+q(le(O.value.compression.decision)),1)):Q(``,!0)])])):Q(``,!0)],64)):(Y(),X(`div`,oue,`未开启 contextInspector(默认开)或暂无快照。跑一轮 agent 后切回刷新。`))])):Q(``,!0),y.value===`subagent`?(Y(),X(`div`,wue,[!ae.value.length&&!oe.value.length?(Y(),X(`div`,Tue,[...n[17]||=[dK(` 尚未委派子 agent。主 agent 调用 `,-1),Z(`code`,null,`use_<id>`,-1),dK(` 或 `,-1),Z(`code`,null,`spawn_agent`,-1),dK(` 后,这里展示运行状态与委派历史。 `,-1)]])):(Y(),X(KG,{key:1},[ae.value.length?(Y(),X(`div`,X9,[Z(`div`,Eue,`▶ 运行中 (`+q(ae.value.length)+`)`,1),(Y(!0),X(KG,null,AW(ae.value,(e,t)=>(Y(),X(`div`,{key:`a`+t,class:pV([`sub-card`,e.status])},[Z(`div`,Due,[Z(`span`,{class:`sub-status`,style:fV({background:k[e.status]&&k[e.status].color||`#9ca3af`})},q(k[e.status]&&k[e.status].label||e.status),5),Z(`span`,Oue,q(e.label),1),Z(`span`,kue,q(e.steps.length)+` 步`,1)]),Z(`div`,Aue,q(E(e.task,80)),1)],2))),128))])):Q(``,!0),oe.value.length?(Y(),X(`div`,jue,[Z(`div`,Mue,`🕐 历史 (`+q(oe.value.length)+`)`,1),(Y(!0),X(KG,null,AW(oe.value,(e,t)=>(Y(),X(`div`,{key:`h`+t,class:pV([`sub-card`,e.status])},[Z(`div`,Nue,[Z(`span`,{class:`sub-status`,style:fV({background:k[e.status]&&k[e.status].color||`#9ca3af`})},q(k[e.status]&&k[e.status].label||e.status),5),Z(`span`,Pue,q(e.label),1),e.durationMs==null?Q(``,!0):(Y(),X(`span`,Fue,q(e.durationMs)+`ms`,1)),e.steps.length?(Y(),X(`button`,{key:1,class:`sub-toggle`,onClick:e=>se(t)},q(A.value.has(t)?`收起`:`步骤`),9,Iue)):Q(``,!0)]),Z(`div`,Lue,q(E(e.task,80)),1),e.resultPreview?(Y(),X(`div`,Rue,q(e.resultPreview),1)):Q(``,!0),A.value.has(t)&&e.steps.length?(Y(),X(`div`,zue,[(Y(!0),X(KG,null,AW(e.steps,(e,t)=>(Y(),X(`div`,{key:t,class:`sub-step`},[Z(`span`,Bue,q(e.kind===`tool_call`?`🔧`:`✅`),1),Z(`span`,Vue,q(e.name),1),Z(`span`,Hue,q(d(e.ts)),1)]))),128))])):Q(``,!0)],2))),128))])):Q(``,!0)],64))])):Q(``,!0),y.value===`logs`?(Y(),X(KG,{key:3},[l.value.length===0?(Y(),X(`div`,Uue,` 暂无日志,发送消息后这里会显示 Agent 的完整上下文、工具调用等信息 `)):Q(``,!0),(Y(!0),X(KG,null,AW(l.value,(e,t)=>(Y(),X(`div`,{key:t,class:`log-item`},[Z(`div`,Wue,[Z(`span`,{class:`log-type`,style:fV({background:s[e.type].color})},q(s[e.type].icon)+` `+q(s[e.type].label),5),e.source?(Y(),X(`span`,Gue,`↳ `+q(e.source),1)):Q(``,!0),Z(`span`,Kue,q(d(e.timestamp)),1)]),Z(`div`,que,[e.type===`context`?(Y(),X(KG,{key:0},[Z(`div`,Jue,[Z(`div`,Yue,[n[18]||=Z(`span`,{class:`k`},`模型`,-1),Z(`span`,Xue,q(e.data.model),1)]),Z(`div`,Zue,[n[19]||=Z(`span`,{class:`k`},`温度`,-1),Z(`span`,Que,q(e.data.temperature),1)]),Z(`div`,$ue,[n[20]||=Z(`span`,{class:`k`},`MaxTokens`,-1),Z(`span`,ede,q(e.data.maxTokens),1)]),Z(`div`,tde,[n[21]||=Z(`span`,{class:`k`},`消息数`,-1),Z(`span`,nde,q(e.data.totalMessages),1)])]),Z(`div`,rde,`工具 (`+q(e.data.tools?.length||0)+`)`,1),Z(`div`,ide,[(Y(!0),X(KG,null,AW(e.data.tools,e=>(Y(),X(`span`,{key:e,class:`tool-chip`},q(e),1))),128))]),n[22]||=Z(`div`,{class:`section-label`},`上下文消息`,-1),Z(`div`,ade,[(Y(!0),X(KG,null,AW(e.data.messages,(e,t)=>(Y(),X(`div`,{key:t,class:`msg-row`},[Z(`span`,{class:`msg-role`,style:fV({background:g(e.type).color})},q(g(e.type).label),5),Z(`span`,ode,q(e.content),1)]))),128))])],64)):e.type===`llm_request`?(Y(),X(KG,{key:1},[Z(`div`,sde,[Z(`span`,cde,`第 `+q(e.data.round)+` 轮`,1),e.data.model?(Y(),X(`span`,lde,q(e.data.model),1)):Q(``,!0),Z(`span`,ude,q((e.data.messages||[]).length)+` 条消息`,1),e.data.tools?.length?(Y(),X(`span`,dde,q(e.data.tools.length)+` 工具`,1)):Q(``,!0),Z(`button`,{class:`view-toggle`,onClick:e=>p(t)},q(o.value.has(t)?`🗂 卡片视图`:`📋 请求体`),9,fde)]),o.value.has(t)?(Y(),X(`pre`,yde,[Z(`code`,null,q(m(e.data.messages)),1)])):(Y(),X(`div`,pde,[(Y(!0),X(KG,null,AW(e.data.messages,(e,t)=>(Y(),X(`div`,{key:t,class:`msg-row`},[Z(`span`,{class:`msg-role`,style:fV({background:g(e.role).color})},q(g(e.role).label),5),Z(`div`,mde,[e.content?(Y(),X(`span`,hde,q(e.content),1)):Q(``,!0),(Y(!0),X(KG,null,AW(e.tool_calls||[],(e,t)=>(Y(),X(`div`,{key:t,class:`tc-inline`},[Z(`span`,gde,`🔧 `+q(e.function?.name||e.name),1),Z(`code`,_de,q(e.function?.arguments??e.args),1)]))),128)),e.tool_call_id?(Y(),X(`span`,vde,`↳ tool_call_id: `+q(e.tool_call_id),1)):Q(``,!0)])]))),128))]))],64)):e.type===`llm_response`?(Y(),X(KG,{key:2},[Z(`div`,bde,[Z(`span`,xde,`第 `+q(e.data.round)+` 轮`,1),e.data.toolCalls?.length?(Y(),X(`span`,Sde,`🔧 `+q(e.data.toolCalls.length)+` 个工具调用`,1)):Q(``,!0)]),e.data.content?(Y(),X(`div`,Cde,q(e.data.content),1)):Q(``,!0),e.data.toolCalls?.length?(Y(),X(`div`,wde,[(Y(!0),X(KG,null,AW(e.data.toolCalls,(e,t)=>(Y(),X(`div`,{key:t,class:`tc-card`},[Z(`div`,Tde,`🔧 `+q(e.name),1),Z(`pre`,Ede,q(m(e.args)),1)]))),128))])):Q(``,!0),e.data.usage?(Y(),X(`div`,Dde,[Z(`span`,Ode,`prompt: `+q(e.data.usage.prompt_tokens??`-`),1),Z(`span`,kde,`completion: `+q(e.data.usage.completion_tokens??`-`),1),Z(`span`,Ade,`total: `+q(e.data.usage.total_tokens??`-`),1)])):Q(``,!0)],64)):e.type===`tool_call`?(Y(),X(`div`,jde,[Z(`div`,Mde,`🔧 `+q(e.data.name),1),Z(`pre`,Nde,q(m(e.data.args)),1)])):e.type===`tool_result`?(Y(),X(`div`,Pde,[Z(`div`,Fde,`✅ `+q(e.data.name)+` 结果`,1),Z(`pre`,Ide,q(e.data.result),1)])):e.type===`error`?(Y(),X(`div`,Lde,q(e.data.tool?`[${e.data.tool}] `:``)+q(e.data.error),1)):Q(``,!0)]),Z(`div`,Rde,[Z(`button`,{class:`raw-toggle`,onClick:e=>f(t)},q(a.value.has(t)?`收起原始 JSON`:`查看原始 JSON`),9,zde),Z(`button`,{class:`raw-toggle`,onClick:t=>J(K5)(m(e.data))},`复制`,8,Bde)]),a.value.has(t)?(Y(),X(`pre`,Vde,[Z(`code`,null,q(m(e.data)),1)])):Q(``,!0)]))),128))],64)):y.value===`flow`?(Y(),X(KG,{key:4},[c.value.length?Q(``,!0):(Y(),X(`div`,Hde,`暂无日志,发送消息后这里按轮次展示执行流程`)),ne.value.pre.length?(Y(),X(`div`,Ude,[n[23]||=Z(`div`,{class:`flow-section-title`},`⚙️ 准备 / 其他`,-1),(Y(!0),X(KG,null,AW(ne.value.pre,(e,t)=>(Y(),X(`div`,{key:`p`+t,class:pV([`flow-node`,e.type])},[Z(`span`,Wde,q(s[e.type]?.icon),1),Z(`span`,Gde,q(s[e.type]?.label),1),Z(`span`,Kde,q(ue(e)),1),Z(`span`,qde,q(d(e.timestamp)),1)],2))),128))])):Q(``,!0),(Y(!0),X(KG,null,AW(ne.value.rounds,e=>(Y(),X(`div`,{key:e.round,class:`flow-round`},[Z(`div`,Jde,`🔁 第 `+q(e.round)+` 轮`,1),Z(`div`,Yde,[(Y(!0),X(KG,null,AW(e.items,(e,t)=>(Y(),X(`div`,{key:t,class:pV([`flow-node`,e.type])},[Z(`span`,Xde,q(s[e.type]?.icon),1),Z(`span`,Zde,q(s[e.type]?.label),1),Z(`span`,Qde,q(ue(e)),1),Z(`span`,$de,q(d(e.timestamp)),1)],2))),128))])]))),128))],64)):(Y(),X(`div`,efe,[b.value?(Y(),X(KG,{key:1},[Z(`div`,nfe,[n[29]||=Z(`div`,{class:`info-title`},`基本信息`,-1),Z(`div`,rfe,[Z(`div`,ife,[n[24]||=Z(`span`,{class:`k`},`ID`,-1),Z(`span`,afe,q(b.value.id),1)]),Z(`div`,ofe,[n[25]||=Z(`span`,{class:`k`},`模型`,-1),Z(`span`,sfe,q(b.value.model||`-`),1)]),Z(`div`,cfe,[n[26]||=Z(`span`,{class:`k`},`工具数`,-1),Z(`span`,lfe,q(b.value.tools.length),1)]),Z(`div`,ufe,[n[27]||=Z(`span`,{class:`k`},`中间件`,-1),Z(`span`,dfe,q(b.value.middleware.length),1)])]),Z(`div`,ffe,[n[28]||=Z(`span`,{class:`k`},`中间件栈`,-1),Z(`span`,pfe,q(b.value.middleware.join(` → `)||`-`),1)])]),Z(`div`,mfe,[Z(`div`,hfe,`🔧 工具 (`+q(b.value.tools.length)+`)`,1),(Y(!0),X(KG,null,AW(b.value.tools,e=>(Y(),X(`div`,{key:e.name,class:`info-item`},[Z(`div`,gfe,[dK(q(e.name),1),e.source?(Y(),X(`span`,{key:0,class:pV([`src-tag`,T(e.source)])},q(e.source),3)):Q(``,!0)]),Z(`div`,_fe,q(e.description),1)]))),128))]),b.value.skills.length?(Y(),X(`div`,vfe,[Z(`div`,yfe,[dK(`📘 技能 (`+q(b.value.skills.length)+`)`,1),n[30]||=Z(`span`,{class:`info-hint`},`点击展开查看全文`,-1)]),(Y(!0),X(KG,null,AW(b.value.skills,e=>(Y(),X(`div`,{key:e.name,class:`info-item`},[Z(`div`,{class:`info-name skill-toggle`,onClick:t=>S(e.name)},[Z(`span`,{class:pV([`skill-arrow`,{open:!!x.value[e.name]}])},`▶`,2),dK(` `+q(e.name),1)],8,bfe),Z(`div`,xfe,q(e.description),1),x.value[e.name]?(Y(),X(`div`,Sfe,[x.value[e.name].loading?(Y(),X(`div`,Cfe,`加载中…`)):x.value[e.name].error?(Y(),X(`div`,wfe,q(x.value[e.name].error),1)):x.value[e.name].content?(Y(),X(`pre`,Tfe,q(x.value[e.name].content),1)):Q(``,!0)])):Q(``,!0)]))),128))])):Q(``,!0),b.value.data?(Y(),X(`div`,Efe,[n[31]||=Z(`div`,{class:`info-title`},`📊 可操作数据`,-1),Z(`div`,Dfe,[Z(`div`,Ofe,q(b.value.data.description||`主数据对象`),1),Z(`div`,kfe,`schema: `+q(b.value.data.schema?`已声明`:`未声明`),1)])])):Q(``,!0),Z(`div`,Afe,[n[36]||=Z(`div`,{class:`info-title`},`🧬 子 Agent`,-1),Z(`div`,jfe,[Z(`div`,Mfe,[n[32]||=Z(`span`,{class:`k`},`启用`,-1),Z(`span`,Nfe,q(b.value.subagent.enabled?`是`:`否`),1)]),Z(`div`,Pfe,[n[33]||=Z(`span`,{class:`k`},`最大递归`,-1),Z(`span`,Ffe,q(b.value.subagent.maxDepth),1)]),Z(`div`,Ife,[n[34]||=Z(`span`,{class:`k`},`并行上限`,-1),Z(`span`,Lfe,q(b.value.subagent.maxParallel),1)]),Z(`div`,Rfe,[n[35]||=Z(`span`,{class:`k`},`额外工具`,-1),Z(`span`,zfe,q(b.value.subagent.allowedTools.length?b.value.subagent.allowedTools.join(`, `):`默认只读`),1)])])]),b.value.mcp?.servers?.length?(Y(),X(`div`,Bfe,[Z(`div`,Vfe,`🔌 MCP (`+q(b.value.mcp.servers.length)+`)`,1),(Y(!0),X(KG,null,AW(b.value.mcp.servers,e=>(Y(),X(`div`,{key:e.name,class:`info-item`},[Z(`div`,Hfe,[dK(q(e.name)+` `,1),Z(`span`,Ufe,q(e.toolCount)+` 工具`,1)]),Z(`div`,Wfe,q(e.url),1)]))),128))])):Q(``,!0),b.value.verify?(Y(),X(`div`,Gfe,[n[41]||=Z(`div`,{class:`info-title`},`✅ Verify 自检`,-1),Z(`div`,Kfe,[Z(`div`,qfe,[n[37]||=Z(`span`,{class:`k`},`启用`,-1),Z(`span`,Jfe,q(b.value.verify.enabled?`是`:`否`),1)]),Z(`div`,Yfe,[n[38]||=Z(`span`,{class:`k`},`自纠上限`,-1),Z(`span`,Xfe,q(b.value.verify.maxAttempts),1)]),Z(`div`,Zfe,[n[39]||=Z(`span`,{class:`k`},`对抗验证`,-1),Z(`span`,Qfe,q(b.value.verify.adversarial?`开启`:`关闭`),1)]),b.value.verify.adversarial?(Y(),X(`div`,$fe,[n[40]||=Z(`span`,{class:`k`},`对抗模型`,-1),Z(`span`,epe,q(b.value.model||`-`)+`(同主)`,1)])):Q(``,!0)])])):Q(``,!0),b.value.todos.length?(Y(),X(`div`,tpe,[Z(`div`,npe,`📋 任务清单 (`+q(b.value.todos.length)+`)`,1),(Y(!0),X(KG,null,AW(b.value.todos,(e,t)=>(Y(),X(`div`,{key:t,class:`info-todo`},[Z(`span`,{class:`todo-tag`,style:fV({background:ee[e.status]&&ee[e.status].color||`#9ca3af`})},q(te(e.status)),5),Z(`span`,null,q(e.content),1)]))),128))])):Q(``,!0),b.value.memory?(Y(),X(`div`,rpe,[n[42]||=Z(`div`,{class:`info-title`},`📝 持久指令 (memory)`,-1),Z(`pre`,ipe,q(b.value.memory),1)])):Q(``,!0),b.value.lastCompression?(Y(),X(`div`,ape,[n[49]||=Z(`div`,{class:`info-title`},`🗜️ 上轮压缩`,-1),Z(`div`,ope,[Z(`div`,spe,[n[43]||=Z(`span`,{class:`k`},`触发`,-1),Z(`span`,cpe,q(b.value.lastCompression.triggered?`✓`:`✗(未达阈值)`),1)]),Z(`div`,lpe,[n[44]||=Z(`span`,{class:`k`},`摘要轮次`,-1),Z(`span`,upe,q(b.value.lastCompression.roundsSummarized)+` / `+q(b.value.lastCompression.roundsTotal),1)]),Z(`div`,dpe,[n[45]||=Z(`span`,{class:`k`},`召回`,-1),Z(`span`,fpe,q(b.value.lastCompression.roundsRecalled)+` 条`,1)]),Z(`div`,ppe,[n[46]||=Z(`span`,{class:`k`},`消息数`,-1),Z(`span`,mpe,q(b.value.lastCompression.originalMessages)+` → `+q(b.value.lastCompression.compressedMessages),1)]),Z(`div`,hpe,[n[47]||=Z(`span`,{class:`k`},`策略`,-1),Z(`span`,gpe,q(b.value.lastCompression.strategy),1)]),b.value.lastCompression.decision?(Y(),X(`div`,_pe,[n[48]||=Z(`span`,{class:`k`},`压缩决策`,-1),Z(`span`,vpe,`🤖 `+q(le(b.value.lastCompression.decision)),1)])):Q(``,!0)])])):Q(``,!0)],64)):(Y(),X(`div`,tfe,`暂无信息`))]))])]),Z(`div`,{class:`drawer-mask`,onClick:_})])):Q(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-26317da9`]]),ype={class:`skill-panel`},bpe={class:`skill-header`},xpe={class:`skill-section`},Spe={class:`section-title`},Cpe={class:`field`},wpe=[`disabled`],Tpe={class:`field`},Epe={class:`field field-textarea`},Dpe={key:0,class:`skill-error`},Ope={class:`skill-section`},kpe={class:`section-title`},Ape={key:0,class:`empty-hint`},jpe={key:1,class:`skill-list`},Mpe={class:`skill-actions`},Npe=[`onClick`],Ppe=[`onClick`],Q9=X5(aW({__name:`SkillPanel`,props:{visible:{type:Boolean},onAddSkill:{type:Function},onRemoveSkill:{type:Function},getUserSkillNames:{type:Function},onGetSkill:{type:Function}},emits:[`close`],setup(e,{emit:t}){let n=e,r=t,i=FH(``),a=FH(``),o=FH(``),s=FH(``),c=FH([]),l=FH(0),u=FH(null);EU(()=>n.visible,e=>{e&&d()},{immediate:!0}),EU(l,()=>d());function d(){n.getUserSkillNames&&(c.value=n.getUserSkillNames())}function f(){if(s.value=``,!i.value.trim()){s.value=`skill 名不能为空`;return}if(!a.value.trim()){s.value=`描述不能为空`;return}if(!o.value.trim()){s.value=`内容不能为空`;return}let e=i.value.trim();u.value===null&&c.value.includes(e)&&(s.value=`已存在同名用户 skill "${e}",将覆盖`),n.onAddSkill?.({name:e,description:a.value.trim(),getContent:()=>o.value}),h(),l.value++}function p(e){n.onRemoveSkill&&n.onRemoveSkill(e)&&(u.value===e&&h(),l.value++)}function m(e){if(!n.onGetSkill)return;let t=n.onGetSkill(e);t&&(u.value=e,i.value=t.name,a.value=t.description,o.value=t.content,s.value=``)}function h(){u.value=null,i.value=``,a.value=``,o.value=``,s.value=``}return(t,n)=>(Y(),nK(VU,{to:`body`},[sK(eq,{name:`cs-skill-fade`},{default:yU(()=>[e.visible?(Y(),X(`div`,{key:0,class:`skill-mask`,onClick:n[4]||=tJ(e=>r(`close`),[`self`])},[Z(`div`,ype,[Z(`div`,bpe,[n[5]||=Z(`span`,{class:`skill-title`},`🧩 Skill 管理`,-1),Z(`button`,{class:`skill-close`,title:`关闭`,onClick:n[0]||=e=>r(`close`)},`✕`)]),Z(`div`,xpe,[Z(`div`,Spe,[dK(q(u.value?`编辑 Skill: ${u.value}`:`创建新 Skill`)+` `,1),u.value?(Y(),X(`button`,{key:0,class:`btn btn-ghost btn-cancel`,title:`取消编辑,回到新建`,onClick:h},`取消编辑`)):Q(``,!0)]),Z(`label`,Cpe,[n[6]||=Z(`span`,{class:`field-label`},`名称`,-1),bU(Z(`input`,{"onUpdate:modelValue":n[1]||=e=>i.value=e,disabled:!!u.value,placeholder:`如:my-writer`,class:`field-input`},null,8,wpe),[[Qq,i.value]])]),Z(`label`,Tpe,[n[7]||=Z(`span`,{class:`field-label`},`描述`,-1),bU(Z(`input`,{"onUpdate:modelValue":n[2]||=e=>a.value=e,placeholder:`一句话说明用途与触发时机`,class:`field-input`},null,512),[[Qq,a.value]])]),Z(`label`,Epe,[n[8]||=Z(`span`,{class:`field-label`},`内容`,-1),bU(Z(`textarea`,{"onUpdate:modelValue":n[3]||=e=>o.value=e,placeholder:`skill 全文指令(支持 Markdown)`,rows:`6`,class:`field-input`},null,512),[[Qq,o.value]])]),s.value?(Y(),X(`div`,Dpe,q(s.value),1)):Q(``,!0),Z(`button`,{class:`btn btn-primary`,onClick:f},q(u.value?`保存修改`:`添加 Skill`),1)]),Z(`div`,Ope,[Z(`div`,kpe,`已创建 Skill(`+q(c.value.length)+`)`,1),c.value.length?(Y(),X(`ul`,jpe,[(Y(!0),X(KG,null,AW(c.value,e=>(Y(),X(`li`,{key:e,class:`skill-item`},[Z(`span`,{class:pV([`skill-name`,{active:u.value===e}])},q(e),3),Z(`span`,Mpe,[Z(`button`,{class:`btn btn-ghost btn-edit`,title:`加载到表单编辑`,onClick:t=>m(e)},`编辑`,8,Npe),Z(`button`,{class:`btn btn-ghost btn-del`,title:`删除该用户 skill`,onClick:t=>p(e)},`删除`,8,Ppe)])]))),128))])):(Y(),X(`div`,Ape,`暂无用户创建的 skill`))]),n[9]||=Z(`div`,{class:`skill-hint`},[dK(` 💡 创建/编辑的 skill 会自动加入 agent(下轮 system prompt 索引可见),agent 经 `),Z(`code`,null,`load_skill(name)`),dK(` 按需加载全文; 持久化由独立 SkillStore 管理(默认 indexedDB,与 storage 选项分离),跨刷新自动恢复;可经 `),Z(`code`,null,`skillStorage.id`),dK(` 跨页面复用。 `)],-1)])])):Q(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-c6a22ea5`]]),$9=X5(aW({__name:`ChatDialog`,props:{fetchResponse:{},fetchStream:{},title:{default:`AI 助手`},placeholder:{default:`输入消息,Enter 发送...`},debugLogs:{},initialMessages:{},onPersist:{},onQueuedCleared:{},onClear:{},getInfo:{},onUndo:{},canUndo:{},showAvatar:{type:Boolean,default:!0},showTyping:{type:Boolean,default:!0},pendingConflict:{},onResolveConflict:{},infoTick:{},getSkillContent:{},onAddSkill:{},onRemoveSkill:{},getUserSkillNames:{},onGetSkill:{},drawer:{type:Boolean},drawerWidth:{},drawerHidden:{type:Boolean},inputRows:{default:2},sessions:{},currentSessionId:{},onNewSession:{},onOpenSession:{},onRemoveSession:{},getFocus:{},onSetFocus:{},onClearFocus:{},getFocuses:{},onAddFocus:{},onRemoveFocus:{},onFocusChipClick:{},sections:{}},emits:[`close`],setup(e,{emit:t}){let n=e,r=t,i=J5({fetchResponse:n.fetchResponse,fetchStream:n.fetchStream,messages:n.initialMessages,onPersist:n.onPersist,onClear:n.onClear,onQueuedCleared:n.onQueuedCleared,getInfo:n.getInfo,canUndo:n.canUndo,onUndo:n.onUndo,getFocuses:n.getFocuses,onAddFocus:n.onAddFocus,onRemoveFocus:n.onRemoveFocus,onClearFocus:n.onClearFocus,onFocusChipClick:n.onFocusChipClick,infoTick:n.infoTick});SU(q5,i);let{isExpanded:a,debugVisible:o,skillVisible:s,closeSkill:c}=i;function l(e){return e===`focus`?n.sections?.focus===!0:n.sections?.[e]!==!1}let u=RK(()=>!!n.onAddSkill),d=RK(()=>{if(!n.drawer||n.drawerWidth==null)return null;let e=n.drawerWidth;return typeof e==`number`?`${e}px`:e});return(t,n)=>(Y(),X(KG,null,[e.drawer?(Y(),X(`div`,{key:0,class:`chat-mask`,onClick:n[0]||=e=>r(`close`)})):Q(``,!0),Z(`div`,{class:pV([`chat-dialog`,{collapsed:!J(a)&&!e.drawer,drawer:e.drawer}]),style:fV(d.value?{width:d.value,maxWidth:d.value}:null)},[l(`header`)?jW(t.$slots,`header`,{key:0,chat:J(i)},()=>[sK(Z5,{title:e.title,drawer:e.drawer,"debug-logs":e.debugLogs,"skill-available":u.value,sessions:e.sessions,"current-session-id":e.currentSessionId,"on-new-session":e.onNewSession,"on-open-session":e.onOpenSession,"on-remove-session":e.onRemoveSession,onClose:n[1]||=e=>r(`close`)},null,8,[`title`,`drawer`,`debug-logs`,`skill-available`,`sessions`,`current-session-id`,`on-new-session`,`on-open-session`,`on-remove-session`])],!0):Q(``,!0),l(`focus`)?jW(t.$slots,`focus`,{key:1,chat:J(i)},()=>[sK(Q5,{"get-focus":e.getFocus,"on-set-focus":e.onSetFocus,"on-clear-focus":e.onClearFocus,"info-tick":e.infoTick},null,8,[`get-focus`,`on-set-focus`,`on-clear-focus`,`info-tick`])],!0):Q(``,!0),l(`body`)?(Y(),nK(eq,{key:2,name:`cs-slide`},{default:yU(()=>[jW(t.$slots,`body`,{chat:J(i)},()=>[bU(sK(G9,{"show-avatar":e.showAvatar,"show-typing":e.showTyping},null,8,[`show-avatar`,`show-typing`]),[[vq,J(a)]])],!0)]),_:3})):Q(``,!0),l(`queued`)?jW(t.$slots,`queued`,{key:3,chat:J(i)},()=>[sK(K9)],!0):Q(``,!0),l(`approval`)?jW(t.$slots,`approval`,{key:4,chat:J(i)},()=>[sK(q9)],!0):Q(``,!0),l(`conflict`)?jW(t.$slots,`conflict`,{key:5,chat:J(i)},()=>[sK(J9,{"pending-conflict":e.pendingConflict,"on-resolve":e.onResolveConflict},null,8,[`pending-conflict`,`on-resolve`])],!0):Q(``,!0),l(`footer`)?(Y(),nK(eq,{key:6,name:`cs-slide`},{default:yU(()=>[jW(t.$slots,`footer`,{chat:J(i)},()=>[sK(Y9,{placeholder:e.placeholder,"input-rows":e.inputRows},null,8,[`placeholder`,`input-rows`])],!0)]),_:3})):Q(``,!0),l(`debug`)?jW(t.$slots,`debug`,{key:7,chat:J(i)},()=>[sK(Z9,{visible:J(o),"onUpdate:visible":n[2]||=e=>PH(o)?o.value=e:null,logs:e.debugLogs,"get-info":e.getInfo,"info-tick":e.infoTick,"get-skill-content":e.getSkillContent},null,8,[`visible`,`logs`,`get-info`,`info-tick`,`get-skill-content`])],!0):Q(``,!0),l(`skill`)?jW(t.$slots,`skill`,{key:8,chat:J(i)},()=>[sK(Q9,{visible:J(s),"on-add-skill":e.onAddSkill,"on-remove-skill":e.onRemoveSkill,"get-user-skill-names":e.getUserSkillNames,"on-get-skill":e.onGetSkill,onClose:J(c)},null,8,[`visible`,`on-add-skill`,`on-remove-skill`,`get-user-skill-names`,`on-get-skill`,`onClose`])],!0):Q(``,!0)],6)],64))}}),[[`__scopeId`,`data-v-f1275b15`]]);function Fpe(e){let{core:t,dialogCfg:n}=e,r=null,i=e.el,a=t.agent.debugLogs;return r=sJ(aW({setup(){return()=>zK($9,{fetchStream:e.streaming?t.stream:void 0,fetchResponse:e.streaming?void 0:(e,n)=>{if(n){let e=()=>t.resolveConflict(`keep_external`);n.aborted?e():n.addEventListener(`abort`,e,{once:!0})}return t.agent.invoke(e,n)},title:n.title,placeholder:n.placeholder,debugLogs:a.value.slice(),initialMessages:t.messages,getInfo:()=>t.getInfo(),onUndo:t.checkpoint?()=>t.checkpoint.restore():void 0,canUndo:t.checkpoint?()=>t.checkpoint.canRestore():void 0,onPersist:async()=>{t.afterRound(),t.store&&await t.store.flush()},onClear:()=>t.resetSession(),onQueuedCleared:e=>{let n=t.agent?.debugLogs;n&&(n.value.push({timestamp:Date.now(),type:`middleware`,data:{stage:`queued_cleared`,dropped:e.length,preview:e.map(e=>e.slice(0,60))}}),zH(n))},pendingConflict:t.pendingConflict.value,onResolveConflict:e=>t.resolveConflict(e),infoTick:t.infoTick,getSkillContent:t.skillsController?e=>t.skillsController.getContent(e):void 0,onAddSkill:t.skillsController?e=>t.addSkill(e):void 0,onRemoveSkill:t.skillsController?e=>t.removeSkill(e):void 0,getUserSkillNames:t.skillsController?()=>t.listUserSkills():void 0,onGetSkill:t.skillsController?e=>t.getUserSkill(e):void 0,drawer:n.drawer===!0,drawerWidth:n.drawerWidth,drawerHidden:n.drawerHidden===!0,inputRows:n.inputRows,sections:n.sections,getFocus:()=>t.getFocus(),getFocuses:()=>t.getFocuses(),onSetFocus:e=>t.setFocus(e),onAddFocus:e=>t.addFocus(e),onRemoveFocus:e=>t.removeFocus(e),onClearFocus:()=>t.clearFocus(),onFocusChipClick:e=>t.emit({type:`focus_chip_click`,path:e.path,label:e.label}),onClose:n.onClose??(n.drawer===!0?()=>e.hide():()=>e.unmount()),...t.store?{sessions:t.sessions.value,currentSessionId:t.sessionId,onNewSession:()=>{e.runSerial(()=>t.switchSession())},onOpenSession:n=>{e.runSerial(()=>t.switchSession(n))},onRemoveSession:async e=>{e!==t.sessionId&&(await t.store.deleteSession(t.agentId,e),await t.refreshSessions())}}:{}})}})),r.mount(e.el),{unmount(){let t=i.querySelector?.(`.chat-dialog`);if(r&&t){t.classList.add(`cs-leaving`);let n=i.querySelector?.(`.chat-mask`);n&&n.classList.add(`cs-leaving`);let a=!1,o=()=>{a||(a=!0,r?.unmount(),r=null,e.onDialogUnmounted())};t.addEventListener(`transitionend`,o,{once:!0}),setTimeout(o,320);return}r?.unmount(),r=null,e.onDialogUnmounted()},hide(){let e=i.querySelector?.(`.chat-dialog`),t=i.querySelector?.(`.chat-mask`);e&&e.classList.add(`cs-hidden`),t&&t.classList.add(`cs-hidden`)},show(){let e=i.querySelector?.(`.chat-dialog`),t=i.querySelector?.(`.chat-mask`);e&&e.classList.remove(`cs-hidden`),t&&t.classList.remove(`cs-hidden`)}}}Hm();var Ipe=`你是知识检索专家。可用工具:search_docs(语义检索)/ load_doc(按 source 加载)/ vfs_grep+vfs_read(搜预注入文档)/ fetch_document(公网 URL)。
338
338
 
339
339
  工作方式:
340
340
  1. 分析任务,拆出需查证的要点(如:需要哪些组件、各自的 props 约束、UI 规范要求);
@@ -23641,7 +23641,7 @@ function hE(e) {
23641
23641
  },
23642
23642
  title: n.title,
23643
23643
  placeholder: n.placeholder,
23644
- debugLogs: a.value,
23644
+ debugLogs: a.value.slice(),
23645
23645
  initialMessages: t.messages,
23646
23646
  getInfo: () => t.getInfo(),
23647
23647
  onUndo: t.checkpoint ? () => t.checkpoint.restore() : void 0,
@@ -178,7 +178,7 @@ app.mount('#app');
178
178
  <\/script></body></html>`}Xr(()=>a.value,async()=>{await tr(),a.value===`preview`&&i.value&&(i.value.srcdoc=c.value)},{immediate:!0});function u(){ig(n.code).then(e=>{e&&(o.value=!0,setTimeout(()=>o.value=!1,1500))})}function d(){let e=e=>e.replace(/&/g,`&amp;`).replace(/"/g,`&quot;`).replace(/</g,`&lt;`),t=`<!DOCTYPE html><html><head><meta charset="utf-8"><title>代码预览 · `+e(n.lang)+`</title><style>html,body{margin:0;height:100%;background:#fff}iframe{border:none;width:100%;height:100%}</style></head><body><iframe sandbox="allow-scripts allow-modals allow-popups allow-forms" srcdoc="`+e(c.value)+`"></iframe></body></html>`,r=new Blob([t],{type:`text/html`}),i=URL.createObjectURL(r);window.open(i,`_blank`,`noopener,noreferrer`),setTimeout(()=>URL.revokeObjectURL(i),1e4)}return(t,n)=>(Y(),X(`div`,{class:`code-preview-overlay`,onClick:n[3]||=pl(e=>r(`close`),[`self`])},[Z(`div`,Rb,[Z(`div`,zb,[Z(`span`,Bb,`代码预览 · `+U(e.lang),1),Z(`div`,Vb,[Z(`button`,{class:H({active:a.value===`preview`}),disabled:!s.value,onClick:n[0]||=e=>a.value=`preview`},`预览`,10,Hb),Z(`button`,{class:H({active:a.value===`source`}),onClick:n[1]||=e=>a.value=`source`},`源码`,2)]),Z(`div`,Ub,[Z(`button`,{class:`icon-btn`,title:o.value?`已复制`:`复制代码`,onClick:u},U(o.value?`✓`:`📋`),9,Wb),Z(`button`,{class:`icon-btn`,title:`新窗口打开`,onClick:d},`↗`),Z(`button`,{class:`icon-btn`,title:`关闭`,onClick:n[2]||=e=>r(`close`)},`✕`)])]),Z(`div`,Gb,[a.value===`preview`&&s.value?(Y(),X(`iframe`,{key:0,ref_key:`iframeRef`,ref:i,class:`preview-iframe`,sandbox:`allow-scripts allow-modals allow-popups allow-forms`,srcdoc:c.value},null,8,Kb)):(Y(),X(`pre`,qb,[Z(`code`,null,U(e.code),1)]))])])]))}}),[[`__scopeId`,`data-v-985c5382`]]),Yb=[`innerHTML`],Xb=ki({__name:`MessageContent`,props:{content:{}},setup(e){let t=e,{html:n,codeBlocks:r}=Lb(()=>t.content),i=_n(null),a=_n(null),o=[`html`,`htm`,`vue`,`javascript`,`js`,`css`];function s(e){return o.includes(e.toLowerCase())}function c(e,t){let n={html:`html`,htm:`html`,css:`css`,javascript:`js`,js:`js`,typescript:`ts`,ts:`ts`,vue:`vue`,python:`py`,json:`json`,xml:`xml`,markdown:`md`,md:`md`,shell:`sh`,bash:`sh`}[e.toLowerCase()]||`txt`,r=new Blob([t],{type:`text/plain;charset=utf-8`}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=`code-${Date.now()}.${n}`,a.click(),setTimeout(()=>URL.revokeObjectURL(i),1e3)}async function l(){await tr();let e=i.value;e&&e.querySelectorAll(`pre.code-block`).forEach((e,t)=>{if(e.querySelector(`.code-toolbar`))return;let n=e.dataset.lang||`plaintext`,r=decodeURIComponent(e.dataset.code||``),i=document.createElement(`div`);i.className=`code-toolbar`;let o=document.createElement(`span`);o.className=`code-lang`,o.textContent=n,i.appendChild(o);let l=document.createElement(`button`);l.className=`code-action-btn`,l.innerHTML=`复制`,l.onclick=async()=>{let e=await ig(r);l.innerHTML=e?`已复制 ✓`:`复制失败`,setTimeout(()=>l.innerHTML=`复制`,1500)},i.appendChild(l);let u=document.createElement(`button`);if(u.className=`code-action-btn`,u.innerHTML=`⬇ 下载`,u.title=`下载为文件`,u.onclick=()=>c(n,r),i.appendChild(u),s(n)){let e=document.createElement(`button`);e.className=`code-action-btn preview-btn`,e.innerHTML=`▶ 运行预览`,e.onclick=()=>{a.value={lang:n,code:r}},i.appendChild(e)}e.appendChild(i)})}return Gi(l),Xr(n,l),(e,t)=>(Y(),X(J,null,[Z(`div`,{class:`message-md`,ref_key:`containerRef`,ref:i,innerHTML:K(n)},null,8,Yb),(Y(),$o(di,{to:`body`},[a.value?(Y(),$o(Jb,{key:0,code:a.value.code,lang:a.value.lang,onClose:t[0]||=e=>a.value=null},null,8,[`code`,`lang`])):Q(``,!0)]))],64))}}),Zb={key:1,class:`typing-text`},Qb={key:0,class:`stream-cursor`},$b=bg(ki({__name:`MessageBubble`,props:{content:{},role:{},isPendingAssistant:{type:Boolean},showTyping:{type:Boolean},showCursor:{type:Boolean}},setup(e){return(t,n)=>(Y(),X(J,null,[Z(`div`,{class:H([`message-bubble`,[e.role,{typing:e.isPendingAssistant}]])},[e.isPendingAssistant?(Y(),X(J,{key:0},[e.showTyping?(Y(),X(J,{key:0},[n[0]||=Z(`span`,{class:`dot`},null,-1),n[1]||=Z(`span`,{class:`dot`},null,-1),n[2]||=Z(`span`,{class:`dot`},null,-1)],64)):(Y(),X(`span`,Zb,`思考中…`))],64)):(Y(),X(J,{key:1},[e.role===`assistant`?(Y(),$o(Xb,{key:0,content:e.content},null,8,[`content`])):(Y(),X(J,{key:1},[ds(U(e.content),1)],64))],64))],2),e.showCursor?(Y(),X(`span`,Qb)):Q(``,!0)],64))}}),[[`__scopeId`,`data-v-186e68d9`]]),ex={class:`message-time`},tx=bg(ki({__name:`MessageTime`,props:{time:{}},setup(e){return(t,n)=>(Y(),X(`div`,ex,U(e.time),1))}}),[[`__scopeId`,`data-v-4a976e4a`]]),nx={class:`msg-actions`},rx=[`title`],ix=bg(ki({__name:`MessageActions`,props:{copied:{type:Boolean}},emits:[`copy`,`regenerate`],setup(e){return(t,n)=>(Y(),X(`div`,nx,[Z(`button`,{class:`msg-action-btn`,title:e.copied?`已复制`:`复制`,onClick:n[0]||=e=>t.$emit(`copy`)},U(e.copied?`✓ 已复制`:`📋 复制`),9,rx),Z(`button`,{class:`msg-action-btn`,title:`重新生成`,onClick:n[1]||=e=>t.$emit(`regenerate`)},`🔄 重新生成`)]))}}),[[`__scopeId`,`data-v-33638c4b`]]),ax=[`data-msg-idx`],ox={key:0,class:`message-avatar`},sx={class:`message-content`},cx={key:2,class:`msg-focuses`},lx=[`title`,`onClick`],ux=[`onClick`],dx=bg(ki({__name:`MessageRow`,props:{message:{},index:{},showAvatar:{type:Boolean},showTyping:{type:Boolean},isPendingAssistant:{type:Boolean},reasoningExpanded:{type:Boolean},copied:{type:Boolean},isLast:{type:Boolean},loading:{type:Boolean},time:{}},emits:[`toggle-reasoning`,`copy`,`regenerate`],setup(e){let t=e,n=sg(),r=Ks(()=>t.message.role===`assistant`),i=Ks(()=>r.value&&`reasoning`in t.message?t.message.reasoning??``:``),a=Ks(()=>r.value&&`steps`in t.message?t.message.steps??[]:[]),o=Ks(()=>r.value&&!!t.message.content&&!t.loading&&t.isLast),s=Ks(()=>r.value&&t.loading&&t.isLast&&!!t.message.content);return(t,c)=>(Y(),X(`div`,{class:H([`message-row`,e.message.role]),"data-msg-idx":e.index},[e.showAvatar?(Y(),X(`div`,ox,U(e.message.role===`user`?`👤`:`🤖`),1)):Q(``,!0),Z(`div`,sx,[r.value?(Y(),$o(Ag,{key:0,text:i.value,expanded:e.reasoningExpanded,onToggle:c[0]||=e=>t.$emit(`toggle-reasoning`)},null,8,[`text`,`expanded`])):Q(``,!0),r.value?(Y(),$o(zg,{key:1,steps:a.value},null,8,[`steps`])):Q(``,!0),e.message.role===`user`&&e.message.focuses?.length?(Y(),X(`div`,cx,[(Y(!0),X(J,null,ta(e.message.focuses,e=>(Y(),X(`span`,{key:e.path,class:`msg-focus-chip`,title:`回看 ${e.path}`,onClick:t=>K(n).focusChipClick(e)},[ds(`🎯 `+U(e.path),1),Z(`button`,{type:`button`,class:`msg-focus-chip-x`,onClick:pl(t=>K(n).removeFocus(e.path),[`stop`])},`✕`,8,ux)],8,lx))),128))])):Q(``,!0),os($b,{content:e.message.content,role:e.message.role,"is-pending-assistant":e.isPendingAssistant,"show-typing":e.showTyping,"show-cursor":s.value},null,8,[`content`,`role`,`is-pending-assistant`,`show-typing`,`show-cursor`]),os(tx,{time:e.time},null,8,[`time`]),o.value?(Y(),$o(ix,{key:3,copied:e.copied,onCopy:c[1]||=e=>t.$emit(`copy`),onRegenerate:c[2]||=e=>t.$emit(`regenerate`)},null,8,[`copied`])):Q(``,!0)])],10,ax))}}),[[`__scopeId`,`data-v-d4e22dfc`]]),fx={key:0,class:`empty-state`},px={key:1,class:`message-row assistant`},mx={key:0,class:`message-avatar`},hx={class:`message-content`},gx={key:2,class:`error-bar`},_x={class:`error-text`},vx=bg(ki({__name:`MessageList`,props:{showAvatar:{type:Boolean},showTyping:{type:Boolean}},setup(e){let{chat:t,formatTime:n,copiedMsg:r,copyMessage:i,isPendingAssistant:a,isReasoningExpanded:o,toggleReasoning:s,canUndo:c,undo:l}=sg(),{state:u,scrollContainer:d,onScroll:f,onWheel:p,retry:m,regenerate:h}=t,g=Ks(()=>u.messages.length>0),_=Ks(()=>u.messages.some(e=>e.role===`user`)),v=Ks(()=>u.messages[u.messages.length-1]?.role===`assistant`);return(t,y)=>(Y(),X(`div`,{class:`chat-body`,ref_key:`scrollContainer`,ref:d,onScroll:y[2]||=(...e)=>K(f)&&K(f)(...e),onWheel:y[3]||=(...e)=>K(p)&&K(p)(...e)},[g.value?Q(``,!0):(Y(),X(`div`,fx,[...y[4]||=[Z(`div`,{class:`empty-icon`},`💬`,-1),Z(`p`,null,`有什么可以帮你的?`,-1)]])),(Y(!0),X(J,null,ta(K(u).messages,(t,c)=>(Y(),$o(dx,{key:c,message:t,index:c,"show-avatar":e.showAvatar,"show-typing":e.showTyping,"is-pending-assistant":K(a)(c),"reasoning-expanded":K(o)(c),copied:K(r),"is-last":c===K(u).messages.length-1,loading:K(u).loading,time:K(n)(t.timestamp),onToggleReasoning:e=>K(s)(c),onCopy:e=>K(i)(t.content),onRegenerate:K(h)},null,8,[`message`,`index`,`show-avatar`,`show-typing`,`is-pending-assistant`,`reasoning-expanded`,`copied`,`is-last`,`loading`,`time`,`onToggleReasoning`,`onCopy`,`onRegenerate`]))),128)),K(u).loading&&!v.value?(Y(),X(`div`,px,[e.showAvatar?(Y(),X(`div`,mx,`🤖`)):Q(``,!0),Z(`div`,hx,[os($b,{content:``,role:`assistant`,"is-pending-assistant":!0,"show-typing":e.showTyping,"show-cursor":!1},null,8,[`show-typing`])])])):Q(``,!0),K(u).error?(Y(),X(`div`,gx,[Z(`span`,_x,U(K(u).error),1),_.value?(Y(),X(`button`,{key:0,class:`retry-btn`,onClick:y[0]||=(...e)=>K(m)&&K(m)(...e)},`重试`)):Q(``,!0),K(c)?(Y(),X(`button`,{key:1,class:`undo-btn`,title:`回退到上次正常状态(还原对话历史 + 页面属性 + 工作区)`,onClick:y[1]||=(...e)=>K(l)&&K(l)(...e)},`↩ 回退`)):Q(``,!0)])):Q(``,!0)],544))}}),[[`__scopeId`,`data-v-fe599f6d`]]),yx={key:0,class:`queued-bar`},bx={class:`queued-head`},xx={class:`queued-count`},Sx={class:`queued-idx`},Cx={class:`queued-text`},wx=[`onClick`],Tx=[`onClick`],Ex=bg(ki({__name:`QueuedBar`,setup(e){let{chat:t,editQueued:n}=sg(),{queuedTasks:r,removeQueuedTask:i}=t;return(e,t)=>K(r).length?(Y(),X(`div`,yx,[Z(`div`,bx,[t[0]||=Z(`span`,{class:`queued-icon`},`📋`,-1),t[1]||=Z(`span`,{class:`queued-title`},`排队中 · 生成完后自动执行`,-1),Z(`span`,xx,U(K(r).length),1)]),(Y(!0),X(J,null,ta(K(r),(e,t)=>(Y(),X(`div`,{key:t,class:`queued-item`},[Z(`span`,Sx,U(t+1),1),Z(`span`,Cx,U(e),1),Z(`button`,{class:`queued-act`,title:`修改(填回输入框编辑)`,onClick:e=>K(n)(t)},`✏️`,8,wx),Z(`button`,{class:`queued-act queued-del`,title:`撤销该任务`,onClick:e=>K(i)(t)},`✕`,8,Tx)]))),128))])):Q(``,!0)}}),[[`__scopeId`,`data-v-f32730a9`]]),Dx={key:0,class:`approval-bar`},Ox={key:0,class:`approval-question`},kx={key:1,class:`approval-context`},Ax={key:2,class:`approval-recommend`},jx={key:3,class:`approval-options`},Mx=[`onClick`],Nx={class:`approval-actions`},Px={class:`approval-head`},Fx={class:`approval-title`},Ix={key:0,class:`approval-args`},Lx={class:`approval-actions`},Rx=bg(ki({__name:`ApprovalBar`,setup(e){let{pendingApproval:t,resolveApproval:n}=sg().chat,r=_n(!1);Xr(t,()=>{r.value=!1});let i=Ks(()=>t.value?.toolName===`request_human_confirmation`),a=Ks(()=>{let e=t.value?.args?.options;return Array.isArray(e)?e.map(String):[]}),o=Ks(()=>{let e=t.value?.args;if(e==null)return``;try{let t=typeof e==`string`?e:JSON.stringify(e,null,2);return t.length>400?t.slice(0,400)+`
179
179
  …(已截断)`:t}catch{return String(e)}});return(e,s)=>K(t)?(Y(),X(`div`,Dx,[i.value?(Y(),X(J,{key:0},[s[5]||=Z(`div`,{class:`approval-head`},[Z(`span`,{class:`approval-icon`},`❓`),Z(`span`,{class:`approval-title`},`AI 需要你确认`)],-1),K(t).args?.question?(Y(),X(`div`,Ox,U(K(t).args.question),1)):Q(``,!0),K(t).args?.context?(Y(),X(`div`,kx,U(K(t).args.context),1)):Q(``,!0),K(t).args?.recommendation?(Y(),X(`div`,Ax,`💡 推荐:`+U(K(t).args.recommendation),1)):Q(``,!0),a.value.length?(Y(),X(`div`,jx,[(Y(!0),X(J,null,ta(a.value,e=>(Y(),X(`button`,{key:e,class:`approval-opt`,onClick:t=>K(n)(e)},U(e),9,Mx))),128))])):Q(``,!0),Z(`div`,Nx,[Z(`button`,{class:`approval-deny`,onClick:s[0]||=e=>K(n)(!1)},`拒绝`),a.value.length?Q(``,!0):(Y(),X(`button`,{key:0,class:`approval-allow`,onClick:s[1]||=e=>K(n)(!0)},`允许`))])],64)):(Y(),X(J,{key:1},[Z(`div`,Px,[s[7]||=Z(`span`,{class:`approval-icon`},`✋`,-1),Z(`span`,Fx,[s[6]||=ds(`需确认工具调用:`,-1),Z(`code`,null,U(K(t).toolName),1)]),o.value?(Y(),X(`button`,{key:0,class:`approval-toggle`,onClick:s[2]||=e=>r.value=!r.value},U(r.value?`收起参数`:`查看参数`)+U(r.value?` ▴`:` ▾`),1)):Q(``,!0)]),o.value&&r.value?(Y(),X(`pre`,Ix,U(o.value),1)):Q(``,!0),Z(`div`,Lx,[Z(`button`,{class:`approval-deny`,onClick:s[3]||=e=>K(n)(!1)},`拒绝`),Z(`button`,{class:`approval-allow`,onClick:s[4]||=e=>K(n)(!0)},`允许`)])],64))])):Q(``,!0)}}),[[`__scopeId`,`data-v-296a936f`]]),zx={key:0,class:`conflict-bar`},Bx={class:`conflict-head`},Vx={class:`conflict-title`},Hx={class:`conflict-detail`},Ux={key:0,class:`conflict-diff`},Wx={class:`conflict-diff-col`},Gx={class:`conflict-diff-pre`},Kx={class:`conflict-diff-col`},qx={class:`conflict-diff-pre`},Jx={class:`conflict-actions`},Yx=bg(ki({__name:`ConflictBar`,props:{pendingConflict:{},onResolve:{type:Function}},setup(e){let t=e,n=_n(!1);Xr(()=>t.pendingConflict,()=>{n.value=!1});let r=Ks(()=>{let e=t.pendingConflict?.agentValue;if(e===void 0)return``;try{let t=JSON.stringify(e,null,2);return t.length>400?t.slice(0,400)+`
180
180
  …(已截断)`:t}catch{return String(e)}}),i=Ks(()=>{let e=t.pendingConflict?.currentValue;if(e==null)return``;try{let t=JSON.stringify(e,null,2);return t.length>400?t.slice(0,400)+`
181
- …(已截断)`:t}catch{return String(e)}});return(t,a)=>e.pendingConflict?(Y(),X(`div`,zx,[Z(`div`,Bx,[a[6]||=Z(`span`,{class:`conflict-icon`},`⚠️`,-1),Z(`span`,Vx,[a[4]||=ds(`写入冲突:`,-1),Z(`code`,null,U(e.pendingConflict.path),1),a[5]||=ds(` 已被外部修改`,-1)])]),Z(`div`,Hx,` AI 基于「读取时的旧值」准备`+U(e.pendingConflict.op===`delete`?`删除`:`写入`)+`,但该属性在你读取之后被外部代码/其他 agent/手动改过。 `,1),Z(`button`,{class:`conflict-toggle`,onClick:a[0]||=e=>n.value=!n.value},U(n.value?`收起对比`:`查看值对比`)+U(n.value?` ▴`:` ▾`),1),n.value?(Y(),X(`div`,Ux,[Z(`div`,Wx,[a[7]||=Z(`div`,{class:`conflict-diff-label`},`AI 想写的值`,-1),Z(`pre`,Gx,U(r.value||`(delete 操作无值)`),1)]),Z(`div`,Kx,[a[8]||=Z(`div`,{class:`conflict-diff-label`},`外部改后的当前值`,-1),Z(`pre`,qx,U(i.value),1)])])):Q(``,!0),Z(`div`,Jx,[Z(`button`,{class:`conflict-keep`,onClick:a[1]||=t=>e.onResolve?.(`keep_external`),title:`不写入,保留外部修改后的值,AI 重新读取再改`},`保留外部`),Z(`button`,{class:`conflict-overwrite`,onClick:a[2]||=t=>e.onResolve?.(`overwrite`),title:`用 AI 的值覆盖外部修改`},`强制覆盖`),Z(`button`,{class:`conflict-restore`,onClick:a[3]||=t=>e.onResolve?.(`restore`),title:`回退到最近一次历史快照(agent 之前操作的检查点),撤销外部修改 + AI 不写入`},`回退`)])])):Q(``,!0)}}),[[`__scopeId`,`data-v-195e5b23`]]),Xx={class:`chat-footer`},Zx={class:`chat-input-wrap`},Qx={key:0,class:`focus-chips`},$x=[`title`,`onClick`],eS={class:`focus-chip-path`},tS=[`onClick`],nS=[`placeholder`,`rows`],rS={class:`input-actions`},iS=[`disabled`,`title`],aS={key:0,width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`currentColor`},oS={key:1,width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},sS=bg(ki({__name:`ChatInput`,props:{placeholder:{},inputRows:{}},setup(e){let t=sg(),{inputText:n,send:r,keydown:i,canUndo:a,undo:o,focuses:s,removeFocus:c,focusChipClick:l}=t,{state:u,stop:d}=t.chat;return(t,f)=>(Y(),X(`div`,Xx,[K(a)?(Y(),X(`button`,{key:0,class:`undo-foot-btn`,title:`回退到上次正常状态(还原对话历史 + 页面属性 + 工作区)`,onClick:f[0]||=(...e)=>K(o)&&K(o)(...e)},`↩ 回退`)):Q(``,!0),Z(`div`,Zx,[K(s).length?(Y(),X(`div`,Qx,[(Y(!0),X(J,null,ta(K(s),e=>(Y(),X(`span`,{key:e.path,class:`focus-chip`,title:`精修中:${e.path}(点击回看 · ✕ 移除)`,onClick:t=>K(l)(e)},[f[4]||=Z(`span`,{class:`focus-chip-icon`},`🎯`,-1),Z(`code`,eS,U(e.path),1),Z(`button`,{type:`button`,class:`focus-chip-x`,"data-test":`focus-clear`,title:`移除此焦点`,onClick:pl(t=>K(c)(e.path),[`stop`])},`✕`,8,tS)],8,$x))),128))])):Q(``,!0),Wr(Z(`textarea`,{"onUpdate:modelValue":f[1]||=e=>gn(n)?n.value=e:null,class:H([`chat-input`,{"has-focus-chip":K(s).length>0}]),placeholder:e.placeholder,rows:e.inputRows,onKeydown:f[2]||=(...e)=>K(i)&&K(i)(...e)},null,42,nS),[[ul,K(n)]]),Z(`div`,rS,[f[7]||=Z(`span`,{class:`send-hint`},`Enter 发送 · Shift+Enter 换行`,-1),Z(`button`,{class:H([`send-btn`,{"stop-btn":K(u).loading}]),disabled:!K(u).loading&&!K(n).trim(),title:K(u).loading?`停止生成`:`发送`,onClick:f[3]||=e=>K(u).loading?K(d)():K(r)()},[K(u).loading?(Y(),X(`svg`,aS,[...f[5]||=[Z(`rect`,{x:`6`,y:`6`,width:`12`,height:`12`,rx:`2`},null,-1)]])):(Y(),X(`svg`,oS,[...f[6]||=[Z(`line`,{x1:`22`,y1:`2`,x2:`11`,y2:`13`},null,-1),Z(`polygon`,{points:`22 2 15 22 11 13 2 9 22 2`},null,-1)]]))],10,iS)])])]))}}),[[`__scopeId`,`data-v-3a3e4dfa`]]),cS={key:0,class:`debug-drawer`},lS={class:`drawer-panel`},uS={class:`drawer-header`},dS={class:`tab-group`},fS={class:`header-actions`},pS={key:0,class:`drawer-filters`},mS=[`onClick`],hS={class:`chip-count`},gS={class:`chip-count`},_S={class:`drawer-body`},vS={key:0,class:`trace-panel`},yS={key:0,class:`trace-empty`},bS={class:`trace-metrics`},xS={class:`metric-card`},SS={class:`metric-card`},CS={class:`metric-card`},wS={class:`metric-card`},TS={key:0,class:`metric-card`},ES={key:1,class:`metric-card`},DS={class:`trace-spans`},OS={class:`span-ico`},kS={class:`span-name`},AS={key:0,class:`span-dur`},jS={key:1,class:`span-status`},MS={key:1,class:`context-panel`},NS={key:0,class:`trace-empty`},PS={class:`ctx-overview`},FS={class:`ctx-occupancy`},IS=[`title`],LS={class:`ctx-pct`},RS={class:`ctx-kv-row`},zS={class:`ctx-kv`},BS={key:0,class:`ctx-kv`},VS={key:1,class:`ctx-kv`},HS=[`title`],US={class:`ctx-cat-bar`},WS={class:`ctx-cat-tokens`},GS={key:0,class:`ctx-compression`},KS={class:`ctx-kv-row`},qS={class:`ctx-kv`},JS={class:`ctx-kv`},YS={class:`ctx-kv`},XS={key:0,class:`ctx-kv`},ZS={key:2,class:`subagent-panel`},QS={key:0,class:`trace-empty`},$S={key:0,class:`sub-section`},eC={class:`sub-section-title`},tC={class:`sub-head`},nC={class:`sub-label`},rC={class:`sub-steps-badge`},iC={class:`sub-task`},aC={key:1,class:`sub-section`},oC={class:`sub-section-title`},sC={class:`sub-head`},cC={class:`sub-label`},lC={key:0,class:`sub-dur`},uC=[`onClick`],dC={class:`sub-task`},fC={key:0,class:`sub-result`},pC={key:1,class:`sub-steps-list`},mC={class:`sub-step-kind`},hC={class:`sub-step-name`},gC={class:`sub-step-ts`},_C={key:0,class:`empty`},vC={class:`log-head`},yC={key:0,class:`log-source`},bC={class:`log-time`},xC={class:`log-body`},SC={class:`kv-grid`},CC={class:`kv`},wC={class:`v`},TC={class:`kv`},EC={class:`v`},DC={class:`kv`},OC={class:`v`},kC={class:`kv`},AC={class:`v`},jC={class:`section-label`},MC={class:`chip-row`},NC={class:`msg-list`},PC={class:`msg-text`},FC={class:`badge-row`},IC={class:`badge`},LC={key:0,class:`badge muted`},RC={class:`badge muted`},zC={key:1,class:`badge muted`},BC=[`onClick`],VC={key:0,class:`msg-list`},HC={class:`msg-detail`},UC={key:0,class:`msg-text`},WC={class:`tc-inline-name`},GC={class:`tc-inline-args`},KC={key:1,class:`tc-id`},qC={key:1,class:`log-raw`},JC={class:`badge-row`},YC={class:`badge`},XC={key:0,class:`badge warn`},ZC={key:0,class:`resp-content`},QC={key:1,class:`tc-list`},$C={class:`tc-name`},ew={class:`tc-args`},tw={key:2,class:`usage-row`},nw={class:`usage`},rw={class:`usage`},iw={class:`usage`},aw={key:3,class:`tc-card inline`},ow={class:`tc-name`},sw={class:`tc-args`},cw={key:4,class:`tc-card inline`},lw={class:`tc-name`},uw={class:`tc-args`},dw={key:5,class:`err-box`},fw={class:`log-footer`},pw=[`onClick`],mw=[`onClick`],hw={key:0,class:`log-raw`},gw={key:0,class:`empty`},_w={key:1,class:`flow-section`},vw={class:`flow-ico`},yw={class:`flow-label`},bw={class:`flow-detail`},xw={class:`flow-time`},Sw={class:`flow-round-head`},Cw={class:`flow-round-body`},ww={class:`flow-ico`},Tw={class:`flow-label`},Ew={class:`flow-detail`},Dw={class:`flow-time`},Ow={key:5,class:`info-body`},kw={key:0,class:`empty`},Aw={class:`info-section`},jw={class:`kv-grid`},Mw={class:`kv`},Nw={class:`v`},Pw={class:`kv`},Fw={class:`v`},Iw={class:`kv`},Lw={class:`v`},Rw={class:`kv`},zw={class:`v`},Bw={class:`kv`,style:{"margin-top":`6px`}},Vw={class:`v`,style:{"font-size":`11px`}},Hw={class:`info-section`},Uw={class:`info-title`},Ww={class:`info-name`},Gw={class:`info-desc`},Kw={key:0,class:`info-section`},qw={class:`info-title`},Jw=[`onClick`],Yw={class:`info-desc`},Xw={key:0,class:`skill-content`},Zw={key:0,class:`skill-loading`},Qw={key:1,class:`skill-error`},$w={key:2,class:`skill-pre`},eT={key:1,class:`info-section`},tT={class:`info-item`},nT={class:`info-name`},rT={class:`info-desc`},iT={class:`info-section`},aT={class:`kv-grid`},oT={class:`kv`},sT={class:`v`},cT={class:`kv`},lT={class:`v`},uT={class:`kv`},dT={class:`v`},fT={class:`kv`},pT={class:`v`,style:{"font-size":`11px`}},mT={key:2,class:`info-section`},hT={class:`info-title`},gT={class:`info-name`},_T={class:`src-tag mcp`},vT={class:`info-desc`},yT={key:3,class:`info-section`},bT={class:`kv-grid`},xT={class:`kv`},ST={class:`v`},CT={class:`kv`},wT={class:`v`},TT={class:`kv`},ET={class:`v`},DT={key:0,class:`kv`},OT={class:`v`,style:{"font-size":`11px`}},kT={key:4,class:`info-section`},AT={class:`info-title`},jT={key:5,class:`info-section`},MT={class:`info-pre`},NT={key:6,class:`info-section`},PT={class:`info-kv`},FT={class:`kv`},IT={class:`v`},LT={class:`kv`},RT={class:`v`},zT={class:`kv`},BT={class:`v`},VT={class:`kv`},HT={class:`v`},UT={class:`kv`},WT={class:`v`,style:{"font-size":`11px`}},GT={key:0,class:`kv`},KT={class:`v`,style:{"font-size":`11px`}},qT=bg(ki({__name:`DebugDrawer`,props:{logs:{default:()=>[]},visible:{type:Boolean},getInfo:{},infoTick:{},getSkillContent:{}},emits:[`update:visible`,`clear`],setup(e,{emit:t}){let n=e,r=t,i=_n(`all`),a=_n(new Set),o=_n(new Set),s={context:{label:`上下文`,color:`var(--cs-primary)`,icon:`🧩`},llm_request:{label:`LLM请求`,color:`#059669`,icon:`➡️`},llm_response:{label:`LLM响应`,color:`#d97706`,icon:`⬅️`},tool_call:{label:`工具调用`,color:`#7c3aed`,icon:`🔧`},tool_result:{label:`工具结果`,color:`#2563eb`,icon:`✅`},error:{label:`错误`,color:`#dc2626`,icon:`❌`},middleware:{label:`中间件`,color:`#0891b2`,icon:`⚙️`}},c=Ks(()=>Array.isArray(n.logs)?n.logs:[]),l=Ks(()=>i.value===`all`?c.value:c.value.filter(e=>e.type===i.value)),u=Ks(()=>{let e={all:c.value.length};for(let t of c.value)e[t.type]=(e[t.type]||0)+1;return e});function d(e){return new Date(e).toLocaleTimeString(`zh-CN`,{hour12:!1})+`.`+String(e%1e3).padStart(3,`0`)}function f(e){let t=new Set(a.value);t.has(e)?t.delete(e):t.add(e),a.value=t}function p(e){let t=new Set(o.value);t.has(e)?t.delete(e):t.add(e),o.value=t}function m(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}let h={system:{label:`SYSTEM`,color:`#6b7280`},human:{label:`USER`,color:`var(--cs-primary)`},user:{label:`USER`,color:`var(--cs-primary)`},ai:{label:`AI`,color:`#059669`},assistant:{label:`AI`,color:`#059669`},tool:{label:`TOOL`,color:`#2563eb`}};function g(e){return h[e]||{label:(e||`?`).toUpperCase(),color:`#9ca3af`}}function _(){r(`update:visible`,!1)}function v(){a.value=new Set,r(`clear`)}let y=_n(`logs`),b=_n(null),x=_n({});async function S(e){if(x.value[e]){delete x.value[e],x.value={...x.value};return}if(!n.getSkillContent){x.value={...x.value,[e]:{loading:!1,content:null,error:`当前 SDK 未注入 getSkillContent,无法查看 skill 全文`}};return}x.value={...x.value,[e]:{loading:!0,content:null}};try{let t=await n.getSkillContent(e);x.value={...x.value,[e]:{loading:!1,content:t,error:t==null?`skill 无内容或读取失败`:void 0}}}catch(t){x.value={...x.value,[e]:{loading:!1,content:null,error:String(t?.message||t)}}}}function C(){if(n.getInfo)try{b.value=n.getInfo()}catch{b.value=null}}function w(e){y.value=e,(e===`subagent`||e===`info`||e===`context`)&&C()}Xr(()=>n.infoTick?.value,()=>{n.visible&&(y.value===`subagent`||y.value===`info`||y.value===`context`)&&C()});let T={pending:{label:`待办`,color:`#9ca3af`},in_progress:{label:`进行中`,color:`#d97706`},completed:{label:`完成`,color:`#059669`}};function E(e){return T[e]?.label??e}function D(e){return e?e===`builtin`?`builtin`:e.startsWith(`mcp:`)?`mcp`:`user`:``}let O=Ks(()=>{let e=new Map,t=[];for(let n of c.value){let r=n.data?.round;typeof r==`number`&&r>0?(e.has(r)||e.set(r,[]),e.get(r).push(n)):t.push(n)}return{pre:t,rounds:[...e.entries()].sort((e,t)=>e[0]-t[0]).map(([e,t])=>({round:e,items:t}))}});function k(e,t){return e.length>t?e.slice(0,t)+`…`:e}let A=Ks(()=>b.value?.trace?.spans??[]),j=Ks(()=>b.value?.trace?.metrics),M=Ks(()=>b.value?.context),N=Ks(()=>{let e=M.value;return e?e.occupancy>=1?`red`:e.thresholdRatio>0&&e.occupancy>=e.thresholdRatio?`yellow`:`green`:``}),P=Ks(()=>b.value?.subagent?.active??[]),ee=Ks(()=>b.value?.subagent?.history??[]),F={running:{label:`运行中`,color:`#059669`},done:{label:`完成`,color:`#6b7280`},error:{label:`错误`,color:`#dc2626`}},I=_n(new Set);function L(e){let t=new Set(I.value);t.has(e)?t.delete(e):t.add(e),I.value=t}function R(e){return e===`round`?`🔄`:e===`model`?`🧠`:e===`tool`?`🔧`:e===`compression`?`📦`:`•`}function te(e){return`${e.windowRatio==null?`keepRounds=${e.keepRounds??`?`}`:`windowRatio=${e.windowRatio}`} · ${e.summarize.mode}摘要 · 召回${e.recallTopK??`?`}${e.reason?` · `+e.reason:``}`}function z(e){let t=e.data||{};switch(e.type){case`context`:return`${t.tools?.length??0} 工具 · ${t.totalMessages??0} 消息`;case`llm_request`:return`${(t.messages||[]).length} 消息${t.tools?.length?` · `+t.tools.length+` 工具`:``}`;case`llm_response`:return t.toolCalls?.length?`${t.toolCalls.length} 个工具调用`:t.content?k(String(t.content),50):``;case`tool_call`:return String(t.name??``);case`tool_result`:return`${t.name??``} · ${t.status===`error`?`❌`:`✅`}`;case`error`:return k(String(t.error??t.tool??``),60);case`middleware`:return String(t.stage??``);default:return``}}return(t,n)=>(Y(),$o(di,{to:`body`},[os(uc,{name:`drawer`},{default:Hr(()=>[e.visible?(Y(),X(`div`,cS,[Z(`div`,lS,[Z(`div`,uS,[Z(`div`,dS,[Z(`button`,{class:H([`tab-btn`,{active:y.value===`logs`}]),onClick:n[0]||=e=>w(`logs`)},`🐛 日志`,2),Z(`button`,{class:H([`tab-btn`,{active:y.value===`flow`}]),onClick:n[1]||=e=>w(`flow`)},`🔀 流程`,2),e.getInfo?(Y(),X(`button`,{key:0,class:H([`tab-btn`,{active:y.value===`trace`}]),onClick:n[2]||=e=>w(`trace`)},`🌳 Trace`,2)):Q(``,!0),e.getInfo?(Y(),X(`button`,{key:1,class:H([`tab-btn`,{active:y.value===`context`}]),onClick:n[3]||=e=>w(`context`)},`📊 上下文`,2)):Q(``,!0),e.getInfo?(Y(),X(`button`,{key:2,class:H([`tab-btn`,{active:y.value===`subagent`}]),onClick:n[4]||=e=>w(`subagent`)},`🤖 子 agent`,2)):Q(``,!0),e.getInfo?(Y(),X(`button`,{key:3,class:H([`tab-btn`,{active:y.value===`info`}]),onClick:n[5]||=e=>w(`info`)},`🧬 Agent 信息`,2)):Q(``,!0)]),Z(`div`,fS,[y.value===`logs`?(Y(),X(`button`,{key:0,class:`hd-btn`,title:`清空日志`,onClick:v},`🗑️`)):Q(``,!0),Z(`button`,{class:`hd-btn`,title:`关闭`,onClick:_},`✕`)])]),y.value===`logs`?(Y(),X(`div`,pS,[(Y(),X(J,null,ta(s,(e,t)=>Z(`button`,{key:t,class:H([`filter-chip`,{active:i.value===t}]),style:Se({"--chip-color":e.color}),onClick:e=>i.value=t},[ds(U(e.icon)+` `+U(e.label)+` `,1),Z(`span`,hS,U(u.value[t]||0),1)],14,mS)),64)),Z(`button`,{class:H([`filter-chip all`,{active:i.value===`all`}]),onClick:n[6]||=e=>i.value=`all`},[n[7]||=ds(` 全部 `,-1),Z(`span`,gS,U(u.value.all||0),1)],2)])):Q(``,!0),Z(`div`,_S,[y.value===`trace`?(Y(),X(`div`,vS,[j.value?(Y(),X(J,{key:1},[Z(`div`,bS,[Z(`div`,xS,[n[9]||=Z(`span`,null,`轮次`,-1),Z(`b`,null,U(j.value.rounds),1)]),Z(`div`,SS,[n[10]||=Z(`span`,null,`总耗时`,-1),Z(`b`,null,U(j.value.totalDurationMs)+`ms`,1)]),Z(`div`,CS,[n[11]||=Z(`span`,null,`平均/轮`,-1),Z(`b`,null,U(j.value.avgRoundMs)+`ms`,1)]),Z(`div`,wS,[n[12]||=Z(`span`,null,`工具`,-1),Z(`b`,null,U(j.value.toolCalls)+`(✅`+U(Math.round(j.value.toolSuccessRate*100))+`%)`,1)]),j.value.compressions?(Y(),X(`div`,TS,[n[13]||=Z(`span`,null,`压缩`,-1),Z(`b`,null,U(j.value.compressions),1)])):Q(``,!0),j.value.totalTokens?(Y(),X(`div`,ES,[n[14]||=Z(`span`,null,`Token`,-1),Z(`b`,null,U(j.value.totalTokens.total),1)])):Q(``,!0)]),Z(`div`,DS,[(Y(!0),X(J,null,ta(A.value,e=>(Y(),X(`div`,{key:e.id,class:H([`trace-span`,[e.type,e.status]])},[Z(`span`,OS,U(R(e.type)),1),Z(`span`,kS,U(e.name),1),e.durationMs?(Y(),X(`span`,AS,U(e.durationMs)+`ms`,1)):Q(``,!0),e.status===`error`?(Y(),X(`span`,jS,`❌`)):Q(``,!0)],2))),128))])],64)):(Y(),X(`div`,yS,[...n[8]||=[ds(`未开启 tracing(`,-1),Z(`code`,null,`capabilities.tracing:true`,-1),ds(`)或暂无 trace。跑一轮 agent 后刷新。`,-1)]]))])):Q(``,!0),y.value===`context`?(Y(),X(`div`,MS,[M.value?(Y(),X(J,{key:1},[Z(`div`,PS,[Z(`div`,FS,[Z(`div`,{class:`ctx-bar-track`,title:`占用 ${Math.round(M.value.occupancy*100)}%`},[Z(`div`,{class:H([`ctx-bar-fill`,N.value]),style:Se({width:Math.min(M.value.occupancy*100,100)+`%`})},null,6),M.value.thresholdRatio>0?(Y(),X(`div`,{key:0,class:`ctx-threshold-mark`,style:Se({left:Math.min(M.value.thresholdRatio*100,100)+`%`}),title:`压缩阈值`},null,4)):Q(``,!0)],8,IS),Z(`span`,LS,U(Math.round(M.value.occupancy*100))+`%`,1)]),Z(`div`,RS,[Z(`span`,zS,`估算 `+U(M.value.totalTokens)+` token`,1),M.value.contextWindow?(Y(),X(`span`,BS,`窗口 `+U(M.value.contextWindow),1)):Q(``,!0),M.value.thresholdRatio>0?(Y(),X(`span`,VS,`阈值 `+U(Math.round(M.value.thresholdRatio*100))+`%`,1)):Q(``,!0)])]),n[16]||=Z(`div`,{class:`ctx-section-title`},`分类构成(近似)`,-1),(Y(!0),X(J,null,ta(M.value.categories,e=>(Y(),X(`div`,{key:e.key,class:`ctx-cat`},[Z(`span`,{class:`ctx-cat-label`,title:e.label},U(e.label),9,HS),Z(`div`,US,[Z(`div`,{class:`ctx-cat-fill`,style:Se({width:Math.max(Math.round(e.pct*100),2)+`%`})},null,4)]),Z(`span`,WS,[ds(U(e.tokens)+` `,1),Z(`i`,null,`(`+U(Math.round(e.pct*100))+`%)`,1)])]))),128)),M.value.compression?(Y(),X(`div`,GS,[n[15]||=Z(`div`,{class:`ctx-section-title`},`最近压缩`,-1),Z(`div`,KS,[Z(`span`,qS,`摘要 `+U(M.value.compression.roundsSummarized)+`/`+U(M.value.compression.roundsTotal)+` 轮`,1),Z(`span`,JS,`召回 `+U(M.value.compression.roundsRecalled),1),Z(`span`,YS,U(M.value.compression.strategy),1),M.value.compression.decision?(Y(),X(`span`,XS,`🤖 agent 决策:`+U(te(M.value.compression.decision)),1)):Q(``,!0)])])):Q(``,!0)],64)):(Y(),X(`div`,NS,`未开启 contextInspector(默认开)或暂无快照。跑一轮 agent 后切回刷新。`))])):Q(``,!0),y.value===`subagent`?(Y(),X(`div`,ZS,[!P.value.length&&!ee.value.length?(Y(),X(`div`,QS,[...n[17]||=[ds(` 尚未委派子 agent。主 agent 调用 `,-1),Z(`code`,null,`use_<id>`,-1),ds(` 或 `,-1),Z(`code`,null,`spawn_agent`,-1),ds(` 后,这里展示运行状态与委派历史。 `,-1)]])):(Y(),X(J,{key:1},[P.value.length?(Y(),X(`div`,$S,[Z(`div`,eC,`▶ 运行中 (`+U(P.value.length)+`)`,1),(Y(!0),X(J,null,ta(P.value,(e,t)=>(Y(),X(`div`,{key:`a`+t,class:H([`sub-card`,e.status])},[Z(`div`,tC,[Z(`span`,{class:`sub-status`,style:Se({background:F[e.status]&&F[e.status].color||`#9ca3af`})},U(F[e.status]&&F[e.status].label||e.status),5),Z(`span`,nC,U(e.label),1),Z(`span`,rC,U(e.steps.length)+` 步`,1)]),Z(`div`,iC,U(k(e.task,80)),1)],2))),128))])):Q(``,!0),ee.value.length?(Y(),X(`div`,aC,[Z(`div`,oC,`🕐 历史 (`+U(ee.value.length)+`)`,1),(Y(!0),X(J,null,ta(ee.value,(e,t)=>(Y(),X(`div`,{key:`h`+t,class:H([`sub-card`,e.status])},[Z(`div`,sC,[Z(`span`,{class:`sub-status`,style:Se({background:F[e.status]&&F[e.status].color||`#9ca3af`})},U(F[e.status]&&F[e.status].label||e.status),5),Z(`span`,cC,U(e.label),1),e.durationMs==null?Q(``,!0):(Y(),X(`span`,lC,U(e.durationMs)+`ms`,1)),e.steps.length?(Y(),X(`button`,{key:1,class:`sub-toggle`,onClick:e=>L(t)},U(I.value.has(t)?`收起`:`步骤`),9,uC)):Q(``,!0)]),Z(`div`,dC,U(k(e.task,80)),1),e.resultPreview?(Y(),X(`div`,fC,U(e.resultPreview),1)):Q(``,!0),I.value.has(t)&&e.steps.length?(Y(),X(`div`,pC,[(Y(!0),X(J,null,ta(e.steps,(e,t)=>(Y(),X(`div`,{key:t,class:`sub-step`},[Z(`span`,mC,U(e.kind===`tool_call`?`🔧`:`✅`),1),Z(`span`,hC,U(e.name),1),Z(`span`,gC,U(d(e.ts)),1)]))),128))])):Q(``,!0)],2))),128))])):Q(``,!0)],64))])):Q(``,!0),y.value===`logs`?(Y(),X(J,{key:3},[l.value.length===0?(Y(),X(`div`,_C,` 暂无日志,发送消息后这里会显示 Agent 的完整上下文、工具调用等信息 `)):Q(``,!0),(Y(!0),X(J,null,ta(l.value,(e,t)=>(Y(),X(`div`,{key:t,class:`log-item`},[Z(`div`,vC,[Z(`span`,{class:`log-type`,style:Se({background:s[e.type].color})},U(s[e.type].icon)+` `+U(s[e.type].label),5),e.source?(Y(),X(`span`,yC,`↳ `+U(e.source),1)):Q(``,!0),Z(`span`,bC,U(d(e.timestamp)),1)]),Z(`div`,xC,[e.type===`context`?(Y(),X(J,{key:0},[Z(`div`,SC,[Z(`div`,CC,[n[18]||=Z(`span`,{class:`k`},`模型`,-1),Z(`span`,wC,U(e.data.model),1)]),Z(`div`,TC,[n[19]||=Z(`span`,{class:`k`},`温度`,-1),Z(`span`,EC,U(e.data.temperature),1)]),Z(`div`,DC,[n[20]||=Z(`span`,{class:`k`},`MaxTokens`,-1),Z(`span`,OC,U(e.data.maxTokens),1)]),Z(`div`,kC,[n[21]||=Z(`span`,{class:`k`},`消息数`,-1),Z(`span`,AC,U(e.data.totalMessages),1)])]),Z(`div`,jC,`工具 (`+U(e.data.tools?.length||0)+`)`,1),Z(`div`,MC,[(Y(!0),X(J,null,ta(e.data.tools,e=>(Y(),X(`span`,{key:e,class:`tool-chip`},U(e),1))),128))]),n[22]||=Z(`div`,{class:`section-label`},`上下文消息`,-1),Z(`div`,NC,[(Y(!0),X(J,null,ta(e.data.messages,(e,t)=>(Y(),X(`div`,{key:t,class:`msg-row`},[Z(`span`,{class:`msg-role`,style:Se({background:g(e.type).color})},U(g(e.type).label),5),Z(`span`,PC,U(e.content),1)]))),128))])],64)):e.type===`llm_request`?(Y(),X(J,{key:1},[Z(`div`,FC,[Z(`span`,IC,`第 `+U(e.data.round)+` 轮`,1),e.data.model?(Y(),X(`span`,LC,U(e.data.model),1)):Q(``,!0),Z(`span`,RC,U((e.data.messages||[]).length)+` 条消息`,1),e.data.tools?.length?(Y(),X(`span`,zC,U(e.data.tools.length)+` 工具`,1)):Q(``,!0),Z(`button`,{class:`view-toggle`,onClick:e=>p(t)},U(o.value.has(t)?`🗂 卡片视图`:`📋 请求体`),9,BC)]),o.value.has(t)?(Y(),X(`pre`,qC,[Z(`code`,null,U(m(e.data.messages)),1)])):(Y(),X(`div`,VC,[(Y(!0),X(J,null,ta(e.data.messages,(e,t)=>(Y(),X(`div`,{key:t,class:`msg-row`},[Z(`span`,{class:`msg-role`,style:Se({background:g(e.role).color})},U(g(e.role).label),5),Z(`div`,HC,[e.content?(Y(),X(`span`,UC,U(e.content),1)):Q(``,!0),(Y(!0),X(J,null,ta(e.tool_calls||[],(e,t)=>(Y(),X(`div`,{key:t,class:`tc-inline`},[Z(`span`,WC,`🔧 `+U(e.function?.name||e.name),1),Z(`code`,GC,U(e.function?.arguments??e.args),1)]))),128)),e.tool_call_id?(Y(),X(`span`,KC,`↳ tool_call_id: `+U(e.tool_call_id),1)):Q(``,!0)])]))),128))]))],64)):e.type===`llm_response`?(Y(),X(J,{key:2},[Z(`div`,JC,[Z(`span`,YC,`第 `+U(e.data.round)+` 轮`,1),e.data.toolCalls?.length?(Y(),X(`span`,XC,`🔧 `+U(e.data.toolCalls.length)+` 个工具调用`,1)):Q(``,!0)]),e.data.content?(Y(),X(`div`,ZC,U(e.data.content),1)):Q(``,!0),e.data.toolCalls?.length?(Y(),X(`div`,QC,[(Y(!0),X(J,null,ta(e.data.toolCalls,(e,t)=>(Y(),X(`div`,{key:t,class:`tc-card`},[Z(`div`,$C,`🔧 `+U(e.name),1),Z(`pre`,ew,U(m(e.args)),1)]))),128))])):Q(``,!0),e.data.usage?(Y(),X(`div`,tw,[Z(`span`,nw,`prompt: `+U(e.data.usage.prompt_tokens??`-`),1),Z(`span`,rw,`completion: `+U(e.data.usage.completion_tokens??`-`),1),Z(`span`,iw,`total: `+U(e.data.usage.total_tokens??`-`),1)])):Q(``,!0)],64)):e.type===`tool_call`?(Y(),X(`div`,aw,[Z(`div`,ow,`🔧 `+U(e.data.name),1),Z(`pre`,sw,U(m(e.data.args)),1)])):e.type===`tool_result`?(Y(),X(`div`,cw,[Z(`div`,lw,`✅ `+U(e.data.name)+` 结果`,1),Z(`pre`,uw,U(e.data.result),1)])):e.type===`error`?(Y(),X(`div`,dw,U(e.data.tool?`[${e.data.tool}] `:``)+U(e.data.error),1)):Q(``,!0)]),Z(`div`,fw,[Z(`button`,{class:`raw-toggle`,onClick:e=>f(t)},U(a.value.has(t)?`收起原始 JSON`:`查看原始 JSON`),9,pw),Z(`button`,{class:`raw-toggle`,onClick:t=>K(ig)(m(e.data))},`复制`,8,mw)]),a.value.has(t)?(Y(),X(`pre`,hw,[Z(`code`,null,U(m(e.data)),1)])):Q(``,!0)]))),128))],64)):y.value===`flow`?(Y(),X(J,{key:4},[c.value.length?Q(``,!0):(Y(),X(`div`,gw,`暂无日志,发送消息后这里按轮次展示执行流程`)),O.value.pre.length?(Y(),X(`div`,_w,[n[23]||=Z(`div`,{class:`flow-section-title`},`⚙️ 准备 / 其他`,-1),(Y(!0),X(J,null,ta(O.value.pre,(e,t)=>(Y(),X(`div`,{key:`p`+t,class:H([`flow-node`,e.type])},[Z(`span`,vw,U(s[e.type]?.icon),1),Z(`span`,yw,U(s[e.type]?.label),1),Z(`span`,bw,U(z(e)),1),Z(`span`,xw,U(d(e.timestamp)),1)],2))),128))])):Q(``,!0),(Y(!0),X(J,null,ta(O.value.rounds,e=>(Y(),X(`div`,{key:e.round,class:`flow-round`},[Z(`div`,Sw,`🔁 第 `+U(e.round)+` 轮`,1),Z(`div`,Cw,[(Y(!0),X(J,null,ta(e.items,(e,t)=>(Y(),X(`div`,{key:t,class:H([`flow-node`,e.type])},[Z(`span`,ww,U(s[e.type]?.icon),1),Z(`span`,Tw,U(s[e.type]?.label),1),Z(`span`,Ew,U(z(e)),1),Z(`span`,Dw,U(d(e.timestamp)),1)],2))),128))])]))),128))],64)):(Y(),X(`div`,Ow,[b.value?(Y(),X(J,{key:1},[Z(`div`,Aw,[n[29]||=Z(`div`,{class:`info-title`},`基本信息`,-1),Z(`div`,jw,[Z(`div`,Mw,[n[24]||=Z(`span`,{class:`k`},`ID`,-1),Z(`span`,Nw,U(b.value.id),1)]),Z(`div`,Pw,[n[25]||=Z(`span`,{class:`k`},`模型`,-1),Z(`span`,Fw,U(b.value.model||`-`),1)]),Z(`div`,Iw,[n[26]||=Z(`span`,{class:`k`},`工具数`,-1),Z(`span`,Lw,U(b.value.tools.length),1)]),Z(`div`,Rw,[n[27]||=Z(`span`,{class:`k`},`中间件`,-1),Z(`span`,zw,U(b.value.middleware.length),1)])]),Z(`div`,Bw,[n[28]||=Z(`span`,{class:`k`},`中间件栈`,-1),Z(`span`,Vw,U(b.value.middleware.join(` → `)||`-`),1)])]),Z(`div`,Hw,[Z(`div`,Uw,`🔧 工具 (`+U(b.value.tools.length)+`)`,1),(Y(!0),X(J,null,ta(b.value.tools,e=>(Y(),X(`div`,{key:e.name,class:`info-item`},[Z(`div`,Ww,[ds(U(e.name),1),e.source?(Y(),X(`span`,{key:0,class:H([`src-tag`,D(e.source)])},U(e.source),3)):Q(``,!0)]),Z(`div`,Gw,U(e.description),1)]))),128))]),b.value.skills.length?(Y(),X(`div`,Kw,[Z(`div`,qw,[ds(`📘 技能 (`+U(b.value.skills.length)+`)`,1),n[30]||=Z(`span`,{class:`info-hint`},`点击展开查看全文`,-1)]),(Y(!0),X(J,null,ta(b.value.skills,e=>(Y(),X(`div`,{key:e.name,class:`info-item`},[Z(`div`,{class:`info-name skill-toggle`,onClick:t=>S(e.name)},[Z(`span`,{class:H([`skill-arrow`,{open:!!x.value[e.name]}])},`▶`,2),ds(` `+U(e.name),1)],8,Jw),Z(`div`,Yw,U(e.description),1),x.value[e.name]?(Y(),X(`div`,Xw,[x.value[e.name].loading?(Y(),X(`div`,Zw,`加载中…`)):x.value[e.name].error?(Y(),X(`div`,Qw,U(x.value[e.name].error),1)):x.value[e.name].content?(Y(),X(`pre`,$w,U(x.value[e.name].content),1)):Q(``,!0)])):Q(``,!0)]))),128))])):Q(``,!0),b.value.data?(Y(),X(`div`,eT,[n[31]||=Z(`div`,{class:`info-title`},`📊 可操作数据`,-1),Z(`div`,tT,[Z(`div`,nT,U(b.value.data.description||`主数据对象`),1),Z(`div`,rT,`schema: `+U(b.value.data.schema?`已声明`:`未声明`),1)])])):Q(``,!0),Z(`div`,iT,[n[36]||=Z(`div`,{class:`info-title`},`🧬 子 Agent`,-1),Z(`div`,aT,[Z(`div`,oT,[n[32]||=Z(`span`,{class:`k`},`启用`,-1),Z(`span`,sT,U(b.value.subagent.enabled?`是`:`否`),1)]),Z(`div`,cT,[n[33]||=Z(`span`,{class:`k`},`最大递归`,-1),Z(`span`,lT,U(b.value.subagent.maxDepth),1)]),Z(`div`,uT,[n[34]||=Z(`span`,{class:`k`},`并行上限`,-1),Z(`span`,dT,U(b.value.subagent.maxParallel),1)]),Z(`div`,fT,[n[35]||=Z(`span`,{class:`k`},`额外工具`,-1),Z(`span`,pT,U(b.value.subagent.allowedTools.length?b.value.subagent.allowedTools.join(`, `):`默认只读`),1)])])]),b.value.mcp?.servers?.length?(Y(),X(`div`,mT,[Z(`div`,hT,`🔌 MCP (`+U(b.value.mcp.servers.length)+`)`,1),(Y(!0),X(J,null,ta(b.value.mcp.servers,e=>(Y(),X(`div`,{key:e.name,class:`info-item`},[Z(`div`,gT,[ds(U(e.name)+` `,1),Z(`span`,_T,U(e.toolCount)+` 工具`,1)]),Z(`div`,vT,U(e.url),1)]))),128))])):Q(``,!0),b.value.verify?(Y(),X(`div`,yT,[n[41]||=Z(`div`,{class:`info-title`},`✅ Verify 自检`,-1),Z(`div`,bT,[Z(`div`,xT,[n[37]||=Z(`span`,{class:`k`},`启用`,-1),Z(`span`,ST,U(b.value.verify.enabled?`是`:`否`),1)]),Z(`div`,CT,[n[38]||=Z(`span`,{class:`k`},`自纠上限`,-1),Z(`span`,wT,U(b.value.verify.maxAttempts),1)]),Z(`div`,TT,[n[39]||=Z(`span`,{class:`k`},`对抗验证`,-1),Z(`span`,ET,U(b.value.verify.adversarial?`开启`:`关闭`),1)]),b.value.verify.adversarial?(Y(),X(`div`,DT,[n[40]||=Z(`span`,{class:`k`},`对抗模型`,-1),Z(`span`,OT,U(b.value.model||`-`)+`(同主)`,1)])):Q(``,!0)])])):Q(``,!0),b.value.todos.length?(Y(),X(`div`,kT,[Z(`div`,AT,`📋 任务清单 (`+U(b.value.todos.length)+`)`,1),(Y(!0),X(J,null,ta(b.value.todos,(e,t)=>(Y(),X(`div`,{key:t,class:`info-todo`},[Z(`span`,{class:`todo-tag`,style:Se({background:T[e.status]&&T[e.status].color||`#9ca3af`})},U(E(e.status)),5),Z(`span`,null,U(e.content),1)]))),128))])):Q(``,!0),b.value.memory?(Y(),X(`div`,jT,[n[42]||=Z(`div`,{class:`info-title`},`📝 持久指令 (memory)`,-1),Z(`pre`,MT,U(b.value.memory),1)])):Q(``,!0),b.value.lastCompression?(Y(),X(`div`,NT,[n[49]||=Z(`div`,{class:`info-title`},`🗜️ 上轮压缩`,-1),Z(`div`,PT,[Z(`div`,FT,[n[43]||=Z(`span`,{class:`k`},`触发`,-1),Z(`span`,IT,U(b.value.lastCompression.triggered?`✓`:`✗(未达阈值)`),1)]),Z(`div`,LT,[n[44]||=Z(`span`,{class:`k`},`摘要轮次`,-1),Z(`span`,RT,U(b.value.lastCompression.roundsSummarized)+` / `+U(b.value.lastCompression.roundsTotal),1)]),Z(`div`,zT,[n[45]||=Z(`span`,{class:`k`},`召回`,-1),Z(`span`,BT,U(b.value.lastCompression.roundsRecalled)+` 条`,1)]),Z(`div`,VT,[n[46]||=Z(`span`,{class:`k`},`消息数`,-1),Z(`span`,HT,U(b.value.lastCompression.originalMessages)+` → `+U(b.value.lastCompression.compressedMessages),1)]),Z(`div`,UT,[n[47]||=Z(`span`,{class:`k`},`策略`,-1),Z(`span`,WT,U(b.value.lastCompression.strategy),1)]),b.value.lastCompression.decision?(Y(),X(`div`,GT,[n[48]||=Z(`span`,{class:`k`},`压缩决策`,-1),Z(`span`,KT,`🤖 `+U(te(b.value.lastCompression.decision)),1)])):Q(``,!0)])])):Q(``,!0)],64)):(Y(),X(`div`,kw,`暂无信息`))]))])]),Z(`div`,{class:`drawer-mask`,onClick:_})])):Q(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-26317da9`]]),JT={class:`skill-panel`},YT={class:`skill-header`},XT={class:`skill-section`},ZT={class:`section-title`},QT={class:`field`},$T=[`disabled`],eE={class:`field`},tE={class:`field field-textarea`},nE={key:0,class:`skill-error`},rE={class:`skill-section`},iE={class:`section-title`},aE={key:0,class:`empty-hint`},oE={key:1,class:`skill-list`},sE={class:`skill-actions`},cE=[`onClick`],lE=[`onClick`],uE=bg(ki({__name:`SkillPanel`,props:{visible:{type:Boolean},onAddSkill:{type:Function},onRemoveSkill:{type:Function},getUserSkillNames:{type:Function},onGetSkill:{type:Function}},emits:[`close`],setup(e,{emit:t}){let n=e,r=t,i=_n(``),a=_n(``),o=_n(``),s=_n(``),c=_n([]),l=_n(0),u=_n(null);Xr(()=>n.visible,e=>{e&&d()},{immediate:!0}),Xr(l,()=>d());function d(){n.getUserSkillNames&&(c.value=n.getUserSkillNames())}function f(){if(s.value=``,!i.value.trim()){s.value=`skill 名不能为空`;return}if(!a.value.trim()){s.value=`描述不能为空`;return}if(!o.value.trim()){s.value=`内容不能为空`;return}let e=i.value.trim();u.value===null&&c.value.includes(e)&&(s.value=`已存在同名用户 skill "${e}",将覆盖`),n.onAddSkill?.({name:e,description:a.value.trim(),getContent:()=>o.value}),h(),l.value++}function p(e){n.onRemoveSkill&&n.onRemoveSkill(e)&&(u.value===e&&h(),l.value++)}function m(e){if(!n.onGetSkill)return;let t=n.onGetSkill(e);t&&(u.value=e,i.value=t.name,a.value=t.description,o.value=t.content,s.value=``)}function h(){u.value=null,i.value=``,a.value=``,o.value=``,s.value=``}return(t,n)=>(Y(),$o(di,{to:`body`},[os(uc,{name:`cs-skill-fade`},{default:Hr(()=>[e.visible?(Y(),X(`div`,{key:0,class:`skill-mask`,onClick:n[4]||=pl(e=>r(`close`),[`self`])},[Z(`div`,JT,[Z(`div`,YT,[n[5]||=Z(`span`,{class:`skill-title`},`🧩 Skill 管理`,-1),Z(`button`,{class:`skill-close`,title:`关闭`,onClick:n[0]||=e=>r(`close`)},`✕`)]),Z(`div`,XT,[Z(`div`,ZT,[ds(U(u.value?`编辑 Skill: ${u.value}`:`创建新 Skill`)+` `,1),u.value?(Y(),X(`button`,{key:0,class:`btn btn-ghost btn-cancel`,title:`取消编辑,回到新建`,onClick:h},`取消编辑`)):Q(``,!0)]),Z(`label`,QT,[n[6]||=Z(`span`,{class:`field-label`},`名称`,-1),Wr(Z(`input`,{"onUpdate:modelValue":n[1]||=e=>i.value=e,disabled:!!u.value,placeholder:`如:my-writer`,class:`field-input`},null,8,$T),[[ul,i.value]])]),Z(`label`,eE,[n[7]||=Z(`span`,{class:`field-label`},`描述`,-1),Wr(Z(`input`,{"onUpdate:modelValue":n[2]||=e=>a.value=e,placeholder:`一句话说明用途与触发时机`,class:`field-input`},null,512),[[ul,a.value]])]),Z(`label`,tE,[n[8]||=Z(`span`,{class:`field-label`},`内容`,-1),Wr(Z(`textarea`,{"onUpdate:modelValue":n[3]||=e=>o.value=e,placeholder:`skill 全文指令(支持 Markdown)`,rows:`6`,class:`field-input`},null,512),[[ul,o.value]])]),s.value?(Y(),X(`div`,nE,U(s.value),1)):Q(``,!0),Z(`button`,{class:`btn btn-primary`,onClick:f},U(u.value?`保存修改`:`添加 Skill`),1)]),Z(`div`,rE,[Z(`div`,iE,`已创建 Skill(`+U(c.value.length)+`)`,1),c.value.length?(Y(),X(`ul`,oE,[(Y(!0),X(J,null,ta(c.value,e=>(Y(),X(`li`,{key:e,class:`skill-item`},[Z(`span`,{class:H([`skill-name`,{active:u.value===e}])},U(e),3),Z(`span`,sE,[Z(`button`,{class:`btn btn-ghost btn-edit`,title:`加载到表单编辑`,onClick:t=>m(e)},`编辑`,8,cE),Z(`button`,{class:`btn btn-ghost btn-del`,title:`删除该用户 skill`,onClick:t=>p(e)},`删除`,8,lE)])]))),128))])):(Y(),X(`div`,aE,`暂无用户创建的 skill`))]),n[9]||=Z(`div`,{class:`skill-hint`},[ds(` 💡 创建/编辑的 skill 会自动加入 agent(下轮 system prompt 索引可见),agent 经 `),Z(`code`,null,`load_skill(name)`),ds(` 按需加载全文; 持久化由独立 SkillStore 管理(默认 indexedDB,与 storage 选项分离),跨刷新自动恢复;可经 `),Z(`code`,null,`skillStorage.id`),ds(` 跨页面复用。 `)],-1)])])):Q(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-c6a22ea5`]]),dE=bg(ki({__name:`ChatDialog`,props:{fetchResponse:{},fetchStream:{},title:{default:`AI 助手`},placeholder:{default:`输入消息,Enter 发送...`},debugLogs:{},initialMessages:{},onPersist:{},onQueuedCleared:{},onClear:{},getInfo:{},onUndo:{},canUndo:{},showAvatar:{type:Boolean,default:!0},showTyping:{type:Boolean,default:!0},pendingConflict:{},onResolveConflict:{},infoTick:{},getSkillContent:{},onAddSkill:{},onRemoveSkill:{},getUserSkillNames:{},onGetSkill:{},drawer:{type:Boolean},drawerWidth:{},drawerHidden:{type:Boolean},inputRows:{default:2},sessions:{},currentSessionId:{},onNewSession:{},onOpenSession:{},onRemoveSession:{},getFocus:{},onSetFocus:{},onClearFocus:{},getFocuses:{},onAddFocus:{},onRemoveFocus:{},onFocusChipClick:{},sections:{}},emits:[`close`],setup(e,{emit:t}){let n=e,r=t,i=og({fetchResponse:n.fetchResponse,fetchStream:n.fetchStream,messages:n.initialMessages,onPersist:n.onPersist,onClear:n.onClear,onQueuedCleared:n.onQueuedCleared,getInfo:n.getInfo,canUndo:n.canUndo,onUndo:n.onUndo,getFocuses:n.getFocuses,onAddFocus:n.onAddFocus,onRemoveFocus:n.onRemoveFocus,onClearFocus:n.onClearFocus,onFocusChipClick:n.onFocusChipClick,infoTick:n.infoTick});Kr(ag,i);let{isExpanded:a,debugVisible:o,skillVisible:s,closeSkill:c}=i;function l(e){return e===`focus`?n.sections?.focus===!0:n.sections?.[e]!==!1}let u=Ks(()=>!!n.onAddSkill),d=Ks(()=>{if(!n.drawer||n.drawerWidth==null)return null;let e=n.drawerWidth;return typeof e==`number`?`${e}px`:e});return(t,n)=>(Y(),X(J,null,[e.drawer?(Y(),X(`div`,{key:0,class:`chat-mask`,onClick:n[0]||=e=>r(`close`)})):Q(``,!0),Z(`div`,{class:H([`chat-dialog`,{collapsed:!K(a)&&!e.drawer,drawer:e.drawer}]),style:Se(d.value?{width:d.value,maxWidth:d.value}:null)},[l(`header`)?na(t.$slots,`header`,{key:0,chat:K(i)},()=>[os(xg,{title:e.title,drawer:e.drawer,"debug-logs":e.debugLogs,"skill-available":u.value,sessions:e.sessions,"current-session-id":e.currentSessionId,"on-new-session":e.onNewSession,"on-open-session":e.onOpenSession,"on-remove-session":e.onRemoveSession,onClose:n[1]||=e=>r(`close`)},null,8,[`title`,`drawer`,`debug-logs`,`skill-available`,`sessions`,`current-session-id`,`on-new-session`,`on-open-session`,`on-remove-session`])],!0):Q(``,!0),l(`focus`)?na(t.$slots,`focus`,{key:1,chat:K(i)},()=>[os(Dg,{"get-focus":e.getFocus,"on-set-focus":e.onSetFocus,"on-clear-focus":e.onClearFocus,"info-tick":e.infoTick},null,8,[`get-focus`,`on-set-focus`,`on-clear-focus`,`info-tick`])],!0):Q(``,!0),l(`body`)?(Y(),$o(uc,{key:2,name:`cs-slide`},{default:Hr(()=>[na(t.$slots,`body`,{chat:K(i)},()=>[Wr(os(vx,{"show-avatar":e.showAvatar,"show-typing":e.showTyping},null,8,[`show-avatar`,`show-typing`]),[[Oc,K(a)]])],!0)]),_:3})):Q(``,!0),l(`queued`)?na(t.$slots,`queued`,{key:3,chat:K(i)},()=>[os(Ex)],!0):Q(``,!0),l(`approval`)?na(t.$slots,`approval`,{key:4,chat:K(i)},()=>[os(Rx)],!0):Q(``,!0),l(`conflict`)?na(t.$slots,`conflict`,{key:5,chat:K(i)},()=>[os(Yx,{"pending-conflict":e.pendingConflict,"on-resolve":e.onResolveConflict},null,8,[`pending-conflict`,`on-resolve`])],!0):Q(``,!0),l(`footer`)?(Y(),$o(uc,{key:6,name:`cs-slide`},{default:Hr(()=>[na(t.$slots,`footer`,{chat:K(i)},()=>[os(sS,{placeholder:e.placeholder,"input-rows":e.inputRows},null,8,[`placeholder`,`input-rows`])],!0)]),_:3})):Q(``,!0),l(`debug`)?na(t.$slots,`debug`,{key:7,chat:K(i)},()=>[os(qT,{visible:K(o),"onUpdate:visible":n[2]||=e=>gn(o)?o.value=e:null,logs:e.debugLogs,"get-info":e.getInfo,"info-tick":e.infoTick,"get-skill-content":e.getSkillContent},null,8,[`visible`,`logs`,`get-info`,`info-tick`,`get-skill-content`])],!0):Q(``,!0),l(`skill`)?na(t.$slots,`skill`,{key:8,chat:K(i)},()=>[os(uE,{visible:K(s),"on-add-skill":e.onAddSkill,"on-remove-skill":e.onRemoveSkill,"get-user-skill-names":e.getUserSkillNames,"on-get-skill":e.onGetSkill,onClose:K(c)},null,8,[`visible`,`on-add-skill`,`on-remove-skill`,`get-user-skill-names`,`on-get-skill`,`onClose`])],!0):Q(``,!0)],6)],64))}}),[[`__scopeId`,`data-v-f1275b15`]]);function fE(e){let{core:t,dialogCfg:n}=e,r=null,i=e.el,a=t.agent.debugLogs;return r=yl(ki({setup(){return()=>qs(dE,{fetchStream:e.streaming?t.stream:void 0,fetchResponse:e.streaming?void 0:(e,n)=>{if(n){let e=()=>t.resolveConflict(`keep_external`);n.aborted?e():n.addEventListener(`abort`,e,{once:!0})}return t.agent.invoke(e,n)},title:n.title,placeholder:n.placeholder,debugLogs:a.value,initialMessages:t.messages,getInfo:()=>t.getInfo(),onUndo:t.checkpoint?()=>t.checkpoint.restore():void 0,canUndo:t.checkpoint?()=>t.checkpoint.canRestore():void 0,onPersist:async()=>{t.afterRound(),t.store&&await t.store.flush()},onClear:()=>t.resetSession(),onQueuedCleared:e=>{let n=t.agent?.debugLogs;n&&(n.value.push({timestamp:Date.now(),type:`middleware`,data:{stage:`queued_cleared`,dropped:e.length,preview:e.map(e=>e.slice(0,60))}}),xn(n))},pendingConflict:t.pendingConflict.value,onResolveConflict:e=>t.resolveConflict(e),infoTick:t.infoTick,getSkillContent:t.skillsController?e=>t.skillsController.getContent(e):void 0,onAddSkill:t.skillsController?e=>t.addSkill(e):void 0,onRemoveSkill:t.skillsController?e=>t.removeSkill(e):void 0,getUserSkillNames:t.skillsController?()=>t.listUserSkills():void 0,onGetSkill:t.skillsController?e=>t.getUserSkill(e):void 0,drawer:n.drawer===!0,drawerWidth:n.drawerWidth,drawerHidden:n.drawerHidden===!0,inputRows:n.inputRows,sections:n.sections,getFocus:()=>t.getFocus(),getFocuses:()=>t.getFocuses(),onSetFocus:e=>t.setFocus(e),onAddFocus:e=>t.addFocus(e),onRemoveFocus:e=>t.removeFocus(e),onClearFocus:()=>t.clearFocus(),onFocusChipClick:e=>t.emit({type:`focus_chip_click`,path:e.path,label:e.label}),onClose:n.onClose??(n.drawer===!0?()=>e.hide():()=>e.unmount()),...t.store?{sessions:t.sessions.value,currentSessionId:t.sessionId,onNewSession:()=>{e.runSerial(()=>t.switchSession())},onOpenSession:n=>{e.runSerial(()=>t.switchSession(n))},onRemoveSession:async e=>{e!==t.sessionId&&(await t.store.deleteSession(t.agentId,e),await t.refreshSessions())}}:{}})}})),r.mount(e.el),{unmount(){let t=i.querySelector?.(`.chat-dialog`);if(r&&t){t.classList.add(`cs-leaving`);let n=i.querySelector?.(`.chat-mask`);n&&n.classList.add(`cs-leaving`);let a=!1,o=()=>{a||(a=!0,r?.unmount(),r=null,e.onDialogUnmounted())};t.addEventListener(`transitionend`,o,{once:!0}),setTimeout(o,320);return}r?.unmount(),r=null,e.onDialogUnmounted()},hide(){let e=i.querySelector?.(`.chat-dialog`),t=i.querySelector?.(`.chat-mask`);e&&e.classList.add(`cs-hidden`),t&&t.classList.add(`cs-hidden`)},show(){let e=i.querySelector?.(`.chat-dialog`),t=i.querySelector?.(`.chat-mask`);e&&e.classList.remove(`cs-hidden`),t&&t.classList.remove(`cs-hidden`)}}}var pE=`你是知识检索专家。可用工具:search_docs(语义检索)/ load_doc(按 source 加载)/ vfs_grep+vfs_read(搜预注入文档)/ fetch_document(公网 URL)。
181
+ …(已截断)`:t}catch{return String(e)}});return(t,a)=>e.pendingConflict?(Y(),X(`div`,zx,[Z(`div`,Bx,[a[6]||=Z(`span`,{class:`conflict-icon`},`⚠️`,-1),Z(`span`,Vx,[a[4]||=ds(`写入冲突:`,-1),Z(`code`,null,U(e.pendingConflict.path),1),a[5]||=ds(` 已被外部修改`,-1)])]),Z(`div`,Hx,` AI 基于「读取时的旧值」准备`+U(e.pendingConflict.op===`delete`?`删除`:`写入`)+`,但该属性在你读取之后被外部代码/其他 agent/手动改过。 `,1),Z(`button`,{class:`conflict-toggle`,onClick:a[0]||=e=>n.value=!n.value},U(n.value?`收起对比`:`查看值对比`)+U(n.value?` ▴`:` ▾`),1),n.value?(Y(),X(`div`,Ux,[Z(`div`,Wx,[a[7]||=Z(`div`,{class:`conflict-diff-label`},`AI 想写的值`,-1),Z(`pre`,Gx,U(r.value||`(delete 操作无值)`),1)]),Z(`div`,Kx,[a[8]||=Z(`div`,{class:`conflict-diff-label`},`外部改后的当前值`,-1),Z(`pre`,qx,U(i.value),1)])])):Q(``,!0),Z(`div`,Jx,[Z(`button`,{class:`conflict-keep`,onClick:a[1]||=t=>e.onResolve?.(`keep_external`),title:`不写入,保留外部修改后的值,AI 重新读取再改`},`保留外部`),Z(`button`,{class:`conflict-overwrite`,onClick:a[2]||=t=>e.onResolve?.(`overwrite`),title:`用 AI 的值覆盖外部修改`},`强制覆盖`),Z(`button`,{class:`conflict-restore`,onClick:a[3]||=t=>e.onResolve?.(`restore`),title:`回退到最近一次历史快照(agent 之前操作的检查点),撤销外部修改 + AI 不写入`},`回退`)])])):Q(``,!0)}}),[[`__scopeId`,`data-v-195e5b23`]]),Xx={class:`chat-footer`},Zx={class:`chat-input-wrap`},Qx={key:0,class:`focus-chips`},$x=[`title`,`onClick`],eS={class:`focus-chip-path`},tS=[`onClick`],nS=[`placeholder`,`rows`],rS={class:`input-actions`},iS=[`disabled`,`title`],aS={key:0,width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`currentColor`},oS={key:1,width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},sS=bg(ki({__name:`ChatInput`,props:{placeholder:{},inputRows:{}},setup(e){let t=sg(),{inputText:n,send:r,keydown:i,canUndo:a,undo:o,focuses:s,removeFocus:c,focusChipClick:l}=t,{state:u,stop:d}=t.chat;return(t,f)=>(Y(),X(`div`,Xx,[K(a)?(Y(),X(`button`,{key:0,class:`undo-foot-btn`,title:`回退到上次正常状态(还原对话历史 + 页面属性 + 工作区)`,onClick:f[0]||=(...e)=>K(o)&&K(o)(...e)},`↩ 回退`)):Q(``,!0),Z(`div`,Zx,[K(s).length?(Y(),X(`div`,Qx,[(Y(!0),X(J,null,ta(K(s),e=>(Y(),X(`span`,{key:e.path,class:`focus-chip`,title:`精修中:${e.path}(点击回看 · ✕ 移除)`,onClick:t=>K(l)(e)},[f[4]||=Z(`span`,{class:`focus-chip-icon`},`🎯`,-1),Z(`code`,eS,U(e.path),1),Z(`button`,{type:`button`,class:`focus-chip-x`,"data-test":`focus-clear`,title:`移除此焦点`,onClick:pl(t=>K(c)(e.path),[`stop`])},`✕`,8,tS)],8,$x))),128))])):Q(``,!0),Wr(Z(`textarea`,{"onUpdate:modelValue":f[1]||=e=>gn(n)?n.value=e:null,class:H([`chat-input`,{"has-focus-chip":K(s).length>0}]),placeholder:e.placeholder,rows:e.inputRows,onKeydown:f[2]||=(...e)=>K(i)&&K(i)(...e)},null,42,nS),[[ul,K(n)]]),Z(`div`,rS,[f[7]||=Z(`span`,{class:`send-hint`},`Enter 发送 · Shift+Enter 换行`,-1),Z(`button`,{class:H([`send-btn`,{"stop-btn":K(u).loading}]),disabled:!K(u).loading&&!K(n).trim(),title:K(u).loading?`停止生成`:`发送`,onClick:f[3]||=e=>K(u).loading?K(d)():K(r)()},[K(u).loading?(Y(),X(`svg`,aS,[...f[5]||=[Z(`rect`,{x:`6`,y:`6`,width:`12`,height:`12`,rx:`2`},null,-1)]])):(Y(),X(`svg`,oS,[...f[6]||=[Z(`line`,{x1:`22`,y1:`2`,x2:`11`,y2:`13`},null,-1),Z(`polygon`,{points:`22 2 15 22 11 13 2 9 22 2`},null,-1)]]))],10,iS)])])]))}}),[[`__scopeId`,`data-v-3a3e4dfa`]]),cS={key:0,class:`debug-drawer`},lS={class:`drawer-panel`},uS={class:`drawer-header`},dS={class:`tab-group`},fS={class:`header-actions`},pS={key:0,class:`drawer-filters`},mS=[`onClick`],hS={class:`chip-count`},gS={class:`chip-count`},_S={class:`drawer-body`},vS={key:0,class:`trace-panel`},yS={key:0,class:`trace-empty`},bS={class:`trace-metrics`},xS={class:`metric-card`},SS={class:`metric-card`},CS={class:`metric-card`},wS={class:`metric-card`},TS={key:0,class:`metric-card`},ES={key:1,class:`metric-card`},DS={class:`trace-spans`},OS={class:`span-ico`},kS={class:`span-name`},AS={key:0,class:`span-dur`},jS={key:1,class:`span-status`},MS={key:1,class:`context-panel`},NS={key:0,class:`trace-empty`},PS={class:`ctx-overview`},FS={class:`ctx-occupancy`},IS=[`title`],LS={class:`ctx-pct`},RS={class:`ctx-kv-row`},zS={class:`ctx-kv`},BS={key:0,class:`ctx-kv`},VS={key:1,class:`ctx-kv`},HS=[`title`],US={class:`ctx-cat-bar`},WS={class:`ctx-cat-tokens`},GS={key:0,class:`ctx-compression`},KS={class:`ctx-kv-row`},qS={class:`ctx-kv`},JS={class:`ctx-kv`},YS={class:`ctx-kv`},XS={key:0,class:`ctx-kv`},ZS={key:2,class:`subagent-panel`},QS={key:0,class:`trace-empty`},$S={key:0,class:`sub-section`},eC={class:`sub-section-title`},tC={class:`sub-head`},nC={class:`sub-label`},rC={class:`sub-steps-badge`},iC={class:`sub-task`},aC={key:1,class:`sub-section`},oC={class:`sub-section-title`},sC={class:`sub-head`},cC={class:`sub-label`},lC={key:0,class:`sub-dur`},uC=[`onClick`],dC={class:`sub-task`},fC={key:0,class:`sub-result`},pC={key:1,class:`sub-steps-list`},mC={class:`sub-step-kind`},hC={class:`sub-step-name`},gC={class:`sub-step-ts`},_C={key:0,class:`empty`},vC={class:`log-head`},yC={key:0,class:`log-source`},bC={class:`log-time`},xC={class:`log-body`},SC={class:`kv-grid`},CC={class:`kv`},wC={class:`v`},TC={class:`kv`},EC={class:`v`},DC={class:`kv`},OC={class:`v`},kC={class:`kv`},AC={class:`v`},jC={class:`section-label`},MC={class:`chip-row`},NC={class:`msg-list`},PC={class:`msg-text`},FC={class:`badge-row`},IC={class:`badge`},LC={key:0,class:`badge muted`},RC={class:`badge muted`},zC={key:1,class:`badge muted`},BC=[`onClick`],VC={key:0,class:`msg-list`},HC={class:`msg-detail`},UC={key:0,class:`msg-text`},WC={class:`tc-inline-name`},GC={class:`tc-inline-args`},KC={key:1,class:`tc-id`},qC={key:1,class:`log-raw`},JC={class:`badge-row`},YC={class:`badge`},XC={key:0,class:`badge warn`},ZC={key:0,class:`resp-content`},QC={key:1,class:`tc-list`},$C={class:`tc-name`},ew={class:`tc-args`},tw={key:2,class:`usage-row`},nw={class:`usage`},rw={class:`usage`},iw={class:`usage`},aw={key:3,class:`tc-card inline`},ow={class:`tc-name`},sw={class:`tc-args`},cw={key:4,class:`tc-card inline`},lw={class:`tc-name`},uw={class:`tc-args`},dw={key:5,class:`err-box`},fw={class:`log-footer`},pw=[`onClick`],mw=[`onClick`],hw={key:0,class:`log-raw`},gw={key:0,class:`empty`},_w={key:1,class:`flow-section`},vw={class:`flow-ico`},yw={class:`flow-label`},bw={class:`flow-detail`},xw={class:`flow-time`},Sw={class:`flow-round-head`},Cw={class:`flow-round-body`},ww={class:`flow-ico`},Tw={class:`flow-label`},Ew={class:`flow-detail`},Dw={class:`flow-time`},Ow={key:5,class:`info-body`},kw={key:0,class:`empty`},Aw={class:`info-section`},jw={class:`kv-grid`},Mw={class:`kv`},Nw={class:`v`},Pw={class:`kv`},Fw={class:`v`},Iw={class:`kv`},Lw={class:`v`},Rw={class:`kv`},zw={class:`v`},Bw={class:`kv`,style:{"margin-top":`6px`}},Vw={class:`v`,style:{"font-size":`11px`}},Hw={class:`info-section`},Uw={class:`info-title`},Ww={class:`info-name`},Gw={class:`info-desc`},Kw={key:0,class:`info-section`},qw={class:`info-title`},Jw=[`onClick`],Yw={class:`info-desc`},Xw={key:0,class:`skill-content`},Zw={key:0,class:`skill-loading`},Qw={key:1,class:`skill-error`},$w={key:2,class:`skill-pre`},eT={key:1,class:`info-section`},tT={class:`info-item`},nT={class:`info-name`},rT={class:`info-desc`},iT={class:`info-section`},aT={class:`kv-grid`},oT={class:`kv`},sT={class:`v`},cT={class:`kv`},lT={class:`v`},uT={class:`kv`},dT={class:`v`},fT={class:`kv`},pT={class:`v`,style:{"font-size":`11px`}},mT={key:2,class:`info-section`},hT={class:`info-title`},gT={class:`info-name`},_T={class:`src-tag mcp`},vT={class:`info-desc`},yT={key:3,class:`info-section`},bT={class:`kv-grid`},xT={class:`kv`},ST={class:`v`},CT={class:`kv`},wT={class:`v`},TT={class:`kv`},ET={class:`v`},DT={key:0,class:`kv`},OT={class:`v`,style:{"font-size":`11px`}},kT={key:4,class:`info-section`},AT={class:`info-title`},jT={key:5,class:`info-section`},MT={class:`info-pre`},NT={key:6,class:`info-section`},PT={class:`info-kv`},FT={class:`kv`},IT={class:`v`},LT={class:`kv`},RT={class:`v`},zT={class:`kv`},BT={class:`v`},VT={class:`kv`},HT={class:`v`},UT={class:`kv`},WT={class:`v`,style:{"font-size":`11px`}},GT={key:0,class:`kv`},KT={class:`v`,style:{"font-size":`11px`}},qT=bg(ki({__name:`DebugDrawer`,props:{logs:{default:()=>[]},visible:{type:Boolean},getInfo:{},infoTick:{},getSkillContent:{}},emits:[`update:visible`,`clear`],setup(e,{emit:t}){let n=e,r=t,i=_n(`all`),a=_n(new Set),o=_n(new Set),s={context:{label:`上下文`,color:`var(--cs-primary)`,icon:`🧩`},llm_request:{label:`LLM请求`,color:`#059669`,icon:`➡️`},llm_response:{label:`LLM响应`,color:`#d97706`,icon:`⬅️`},tool_call:{label:`工具调用`,color:`#7c3aed`,icon:`🔧`},tool_result:{label:`工具结果`,color:`#2563eb`,icon:`✅`},error:{label:`错误`,color:`#dc2626`,icon:`❌`},middleware:{label:`中间件`,color:`#0891b2`,icon:`⚙️`}},c=Ks(()=>Array.isArray(n.logs)?n.logs:[]),l=Ks(()=>i.value===`all`?c.value:c.value.filter(e=>e.type===i.value)),u=Ks(()=>{let e={all:c.value.length};for(let t of c.value)e[t.type]=(e[t.type]||0)+1;return e});function d(e){return new Date(e).toLocaleTimeString(`zh-CN`,{hour12:!1})+`.`+String(e%1e3).padStart(3,`0`)}function f(e){let t=new Set(a.value);t.has(e)?t.delete(e):t.add(e),a.value=t}function p(e){let t=new Set(o.value);t.has(e)?t.delete(e):t.add(e),o.value=t}function m(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}let h={system:{label:`SYSTEM`,color:`#6b7280`},human:{label:`USER`,color:`var(--cs-primary)`},user:{label:`USER`,color:`var(--cs-primary)`},ai:{label:`AI`,color:`#059669`},assistant:{label:`AI`,color:`#059669`},tool:{label:`TOOL`,color:`#2563eb`}};function g(e){return h[e]||{label:(e||`?`).toUpperCase(),color:`#9ca3af`}}function _(){r(`update:visible`,!1)}function v(){a.value=new Set,r(`clear`)}let y=_n(`logs`),b=_n(null),x=_n({});async function S(e){if(x.value[e]){delete x.value[e],x.value={...x.value};return}if(!n.getSkillContent){x.value={...x.value,[e]:{loading:!1,content:null,error:`当前 SDK 未注入 getSkillContent,无法查看 skill 全文`}};return}x.value={...x.value,[e]:{loading:!0,content:null}};try{let t=await n.getSkillContent(e);x.value={...x.value,[e]:{loading:!1,content:t,error:t==null?`skill 无内容或读取失败`:void 0}}}catch(t){x.value={...x.value,[e]:{loading:!1,content:null,error:String(t?.message||t)}}}}function C(){if(n.getInfo)try{b.value=n.getInfo()}catch{b.value=null}}function w(e){y.value=e,(e===`subagent`||e===`info`||e===`context`)&&C()}Xr(()=>n.infoTick?.value,()=>{n.visible&&(y.value===`subagent`||y.value===`info`||y.value===`context`)&&C()});let T={pending:{label:`待办`,color:`#9ca3af`},in_progress:{label:`进行中`,color:`#d97706`},completed:{label:`完成`,color:`#059669`}};function E(e){return T[e]?.label??e}function D(e){return e?e===`builtin`?`builtin`:e.startsWith(`mcp:`)?`mcp`:`user`:``}let O=Ks(()=>{let e=new Map,t=[];for(let n of c.value){let r=n.data?.round;typeof r==`number`&&r>0?(e.has(r)||e.set(r,[]),e.get(r).push(n)):t.push(n)}return{pre:t,rounds:[...e.entries()].sort((e,t)=>e[0]-t[0]).map(([e,t])=>({round:e,items:t}))}});function k(e,t){return e.length>t?e.slice(0,t)+`…`:e}let A=Ks(()=>b.value?.trace?.spans??[]),j=Ks(()=>b.value?.trace?.metrics),M=Ks(()=>b.value?.context),N=Ks(()=>{let e=M.value;return e?e.occupancy>=1?`red`:e.thresholdRatio>0&&e.occupancy>=e.thresholdRatio?`yellow`:`green`:``}),P=Ks(()=>b.value?.subagent?.active??[]),ee=Ks(()=>b.value?.subagent?.history??[]),F={running:{label:`运行中`,color:`#059669`},done:{label:`完成`,color:`#6b7280`},error:{label:`错误`,color:`#dc2626`}},I=_n(new Set);function L(e){let t=new Set(I.value);t.has(e)?t.delete(e):t.add(e),I.value=t}function R(e){return e===`round`?`🔄`:e===`model`?`🧠`:e===`tool`?`🔧`:e===`compression`?`📦`:`•`}function te(e){return`${e.windowRatio==null?`keepRounds=${e.keepRounds??`?`}`:`windowRatio=${e.windowRatio}`} · ${e.summarize.mode}摘要 · 召回${e.recallTopK??`?`}${e.reason?` · `+e.reason:``}`}function z(e){let t=e.data||{};switch(e.type){case`context`:return`${t.tools?.length??0} 工具 · ${t.totalMessages??0} 消息`;case`llm_request`:return`${(t.messages||[]).length} 消息${t.tools?.length?` · `+t.tools.length+` 工具`:``}`;case`llm_response`:return t.toolCalls?.length?`${t.toolCalls.length} 个工具调用`:t.content?k(String(t.content),50):``;case`tool_call`:return String(t.name??``);case`tool_result`:return`${t.name??``} · ${t.status===`error`?`❌`:`✅`}`;case`error`:return k(String(t.error??t.tool??``),60);case`middleware`:return String(t.stage??``);default:return``}}return(t,n)=>(Y(),$o(di,{to:`body`},[os(uc,{name:`drawer`},{default:Hr(()=>[e.visible?(Y(),X(`div`,cS,[Z(`div`,lS,[Z(`div`,uS,[Z(`div`,dS,[Z(`button`,{class:H([`tab-btn`,{active:y.value===`logs`}]),onClick:n[0]||=e=>w(`logs`)},`🐛 日志`,2),Z(`button`,{class:H([`tab-btn`,{active:y.value===`flow`}]),onClick:n[1]||=e=>w(`flow`)},`🔀 流程`,2),e.getInfo?(Y(),X(`button`,{key:0,class:H([`tab-btn`,{active:y.value===`trace`}]),onClick:n[2]||=e=>w(`trace`)},`🌳 Trace`,2)):Q(``,!0),e.getInfo?(Y(),X(`button`,{key:1,class:H([`tab-btn`,{active:y.value===`context`}]),onClick:n[3]||=e=>w(`context`)},`📊 上下文`,2)):Q(``,!0),e.getInfo?(Y(),X(`button`,{key:2,class:H([`tab-btn`,{active:y.value===`subagent`}]),onClick:n[4]||=e=>w(`subagent`)},`🤖 子 agent`,2)):Q(``,!0),e.getInfo?(Y(),X(`button`,{key:3,class:H([`tab-btn`,{active:y.value===`info`}]),onClick:n[5]||=e=>w(`info`)},`🧬 Agent 信息`,2)):Q(``,!0)]),Z(`div`,fS,[y.value===`logs`?(Y(),X(`button`,{key:0,class:`hd-btn`,title:`清空日志`,onClick:v},`🗑️`)):Q(``,!0),Z(`button`,{class:`hd-btn`,title:`关闭`,onClick:_},`✕`)])]),y.value===`logs`?(Y(),X(`div`,pS,[(Y(),X(J,null,ta(s,(e,t)=>Z(`button`,{key:t,class:H([`filter-chip`,{active:i.value===t}]),style:Se({"--chip-color":e.color}),onClick:e=>i.value=t},[ds(U(e.icon)+` `+U(e.label)+` `,1),Z(`span`,hS,U(u.value[t]||0),1)],14,mS)),64)),Z(`button`,{class:H([`filter-chip all`,{active:i.value===`all`}]),onClick:n[6]||=e=>i.value=`all`},[n[7]||=ds(` 全部 `,-1),Z(`span`,gS,U(u.value.all||0),1)],2)])):Q(``,!0),Z(`div`,_S,[y.value===`trace`?(Y(),X(`div`,vS,[j.value?(Y(),X(J,{key:1},[Z(`div`,bS,[Z(`div`,xS,[n[9]||=Z(`span`,null,`轮次`,-1),Z(`b`,null,U(j.value.rounds),1)]),Z(`div`,SS,[n[10]||=Z(`span`,null,`总耗时`,-1),Z(`b`,null,U(j.value.totalDurationMs)+`ms`,1)]),Z(`div`,CS,[n[11]||=Z(`span`,null,`平均/轮`,-1),Z(`b`,null,U(j.value.avgRoundMs)+`ms`,1)]),Z(`div`,wS,[n[12]||=Z(`span`,null,`工具`,-1),Z(`b`,null,U(j.value.toolCalls)+`(✅`+U(Math.round(j.value.toolSuccessRate*100))+`%)`,1)]),j.value.compressions?(Y(),X(`div`,TS,[n[13]||=Z(`span`,null,`压缩`,-1),Z(`b`,null,U(j.value.compressions),1)])):Q(``,!0),j.value.totalTokens?(Y(),X(`div`,ES,[n[14]||=Z(`span`,null,`Token`,-1),Z(`b`,null,U(j.value.totalTokens.total),1)])):Q(``,!0)]),Z(`div`,DS,[(Y(!0),X(J,null,ta(A.value,e=>(Y(),X(`div`,{key:e.id,class:H([`trace-span`,[e.type,e.status]])},[Z(`span`,OS,U(R(e.type)),1),Z(`span`,kS,U(e.name),1),e.durationMs?(Y(),X(`span`,AS,U(e.durationMs)+`ms`,1)):Q(``,!0),e.status===`error`?(Y(),X(`span`,jS,`❌`)):Q(``,!0)],2))),128))])],64)):(Y(),X(`div`,yS,[...n[8]||=[ds(`未开启 tracing(`,-1),Z(`code`,null,`capabilities.tracing:true`,-1),ds(`)或暂无 trace。跑一轮 agent 后刷新。`,-1)]]))])):Q(``,!0),y.value===`context`?(Y(),X(`div`,MS,[M.value?(Y(),X(J,{key:1},[Z(`div`,PS,[Z(`div`,FS,[Z(`div`,{class:`ctx-bar-track`,title:`占用 ${Math.round(M.value.occupancy*100)}%`},[Z(`div`,{class:H([`ctx-bar-fill`,N.value]),style:Se({width:Math.min(M.value.occupancy*100,100)+`%`})},null,6),M.value.thresholdRatio>0?(Y(),X(`div`,{key:0,class:`ctx-threshold-mark`,style:Se({left:Math.min(M.value.thresholdRatio*100,100)+`%`}),title:`压缩阈值`},null,4)):Q(``,!0)],8,IS),Z(`span`,LS,U(Math.round(M.value.occupancy*100))+`%`,1)]),Z(`div`,RS,[Z(`span`,zS,`估算 `+U(M.value.totalTokens)+` token`,1),M.value.contextWindow?(Y(),X(`span`,BS,`窗口 `+U(M.value.contextWindow),1)):Q(``,!0),M.value.thresholdRatio>0?(Y(),X(`span`,VS,`阈值 `+U(Math.round(M.value.thresholdRatio*100))+`%`,1)):Q(``,!0)])]),n[16]||=Z(`div`,{class:`ctx-section-title`},`分类构成(近似)`,-1),(Y(!0),X(J,null,ta(M.value.categories,e=>(Y(),X(`div`,{key:e.key,class:`ctx-cat`},[Z(`span`,{class:`ctx-cat-label`,title:e.label},U(e.label),9,HS),Z(`div`,US,[Z(`div`,{class:`ctx-cat-fill`,style:Se({width:Math.max(Math.round(e.pct*100),2)+`%`})},null,4)]),Z(`span`,WS,[ds(U(e.tokens)+` `,1),Z(`i`,null,`(`+U(Math.round(e.pct*100))+`%)`,1)])]))),128)),M.value.compression?(Y(),X(`div`,GS,[n[15]||=Z(`div`,{class:`ctx-section-title`},`最近压缩`,-1),Z(`div`,KS,[Z(`span`,qS,`摘要 `+U(M.value.compression.roundsSummarized)+`/`+U(M.value.compression.roundsTotal)+` 轮`,1),Z(`span`,JS,`召回 `+U(M.value.compression.roundsRecalled),1),Z(`span`,YS,U(M.value.compression.strategy),1),M.value.compression.decision?(Y(),X(`span`,XS,`🤖 agent 决策:`+U(te(M.value.compression.decision)),1)):Q(``,!0)])])):Q(``,!0)],64)):(Y(),X(`div`,NS,`未开启 contextInspector(默认开)或暂无快照。跑一轮 agent 后切回刷新。`))])):Q(``,!0),y.value===`subagent`?(Y(),X(`div`,ZS,[!P.value.length&&!ee.value.length?(Y(),X(`div`,QS,[...n[17]||=[ds(` 尚未委派子 agent。主 agent 调用 `,-1),Z(`code`,null,`use_<id>`,-1),ds(` 或 `,-1),Z(`code`,null,`spawn_agent`,-1),ds(` 后,这里展示运行状态与委派历史。 `,-1)]])):(Y(),X(J,{key:1},[P.value.length?(Y(),X(`div`,$S,[Z(`div`,eC,`▶ 运行中 (`+U(P.value.length)+`)`,1),(Y(!0),X(J,null,ta(P.value,(e,t)=>(Y(),X(`div`,{key:`a`+t,class:H([`sub-card`,e.status])},[Z(`div`,tC,[Z(`span`,{class:`sub-status`,style:Se({background:F[e.status]&&F[e.status].color||`#9ca3af`})},U(F[e.status]&&F[e.status].label||e.status),5),Z(`span`,nC,U(e.label),1),Z(`span`,rC,U(e.steps.length)+` 步`,1)]),Z(`div`,iC,U(k(e.task,80)),1)],2))),128))])):Q(``,!0),ee.value.length?(Y(),X(`div`,aC,[Z(`div`,oC,`🕐 历史 (`+U(ee.value.length)+`)`,1),(Y(!0),X(J,null,ta(ee.value,(e,t)=>(Y(),X(`div`,{key:`h`+t,class:H([`sub-card`,e.status])},[Z(`div`,sC,[Z(`span`,{class:`sub-status`,style:Se({background:F[e.status]&&F[e.status].color||`#9ca3af`})},U(F[e.status]&&F[e.status].label||e.status),5),Z(`span`,cC,U(e.label),1),e.durationMs==null?Q(``,!0):(Y(),X(`span`,lC,U(e.durationMs)+`ms`,1)),e.steps.length?(Y(),X(`button`,{key:1,class:`sub-toggle`,onClick:e=>L(t)},U(I.value.has(t)?`收起`:`步骤`),9,uC)):Q(``,!0)]),Z(`div`,dC,U(k(e.task,80)),1),e.resultPreview?(Y(),X(`div`,fC,U(e.resultPreview),1)):Q(``,!0),I.value.has(t)&&e.steps.length?(Y(),X(`div`,pC,[(Y(!0),X(J,null,ta(e.steps,(e,t)=>(Y(),X(`div`,{key:t,class:`sub-step`},[Z(`span`,mC,U(e.kind===`tool_call`?`🔧`:`✅`),1),Z(`span`,hC,U(e.name),1),Z(`span`,gC,U(d(e.ts)),1)]))),128))])):Q(``,!0)],2))),128))])):Q(``,!0)],64))])):Q(``,!0),y.value===`logs`?(Y(),X(J,{key:3},[l.value.length===0?(Y(),X(`div`,_C,` 暂无日志,发送消息后这里会显示 Agent 的完整上下文、工具调用等信息 `)):Q(``,!0),(Y(!0),X(J,null,ta(l.value,(e,t)=>(Y(),X(`div`,{key:t,class:`log-item`},[Z(`div`,vC,[Z(`span`,{class:`log-type`,style:Se({background:s[e.type].color})},U(s[e.type].icon)+` `+U(s[e.type].label),5),e.source?(Y(),X(`span`,yC,`↳ `+U(e.source),1)):Q(``,!0),Z(`span`,bC,U(d(e.timestamp)),1)]),Z(`div`,xC,[e.type===`context`?(Y(),X(J,{key:0},[Z(`div`,SC,[Z(`div`,CC,[n[18]||=Z(`span`,{class:`k`},`模型`,-1),Z(`span`,wC,U(e.data.model),1)]),Z(`div`,TC,[n[19]||=Z(`span`,{class:`k`},`温度`,-1),Z(`span`,EC,U(e.data.temperature),1)]),Z(`div`,DC,[n[20]||=Z(`span`,{class:`k`},`MaxTokens`,-1),Z(`span`,OC,U(e.data.maxTokens),1)]),Z(`div`,kC,[n[21]||=Z(`span`,{class:`k`},`消息数`,-1),Z(`span`,AC,U(e.data.totalMessages),1)])]),Z(`div`,jC,`工具 (`+U(e.data.tools?.length||0)+`)`,1),Z(`div`,MC,[(Y(!0),X(J,null,ta(e.data.tools,e=>(Y(),X(`span`,{key:e,class:`tool-chip`},U(e),1))),128))]),n[22]||=Z(`div`,{class:`section-label`},`上下文消息`,-1),Z(`div`,NC,[(Y(!0),X(J,null,ta(e.data.messages,(e,t)=>(Y(),X(`div`,{key:t,class:`msg-row`},[Z(`span`,{class:`msg-role`,style:Se({background:g(e.type).color})},U(g(e.type).label),5),Z(`span`,PC,U(e.content),1)]))),128))])],64)):e.type===`llm_request`?(Y(),X(J,{key:1},[Z(`div`,FC,[Z(`span`,IC,`第 `+U(e.data.round)+` 轮`,1),e.data.model?(Y(),X(`span`,LC,U(e.data.model),1)):Q(``,!0),Z(`span`,RC,U((e.data.messages||[]).length)+` 条消息`,1),e.data.tools?.length?(Y(),X(`span`,zC,U(e.data.tools.length)+` 工具`,1)):Q(``,!0),Z(`button`,{class:`view-toggle`,onClick:e=>p(t)},U(o.value.has(t)?`🗂 卡片视图`:`📋 请求体`),9,BC)]),o.value.has(t)?(Y(),X(`pre`,qC,[Z(`code`,null,U(m(e.data.messages)),1)])):(Y(),X(`div`,VC,[(Y(!0),X(J,null,ta(e.data.messages,(e,t)=>(Y(),X(`div`,{key:t,class:`msg-row`},[Z(`span`,{class:`msg-role`,style:Se({background:g(e.role).color})},U(g(e.role).label),5),Z(`div`,HC,[e.content?(Y(),X(`span`,UC,U(e.content),1)):Q(``,!0),(Y(!0),X(J,null,ta(e.tool_calls||[],(e,t)=>(Y(),X(`div`,{key:t,class:`tc-inline`},[Z(`span`,WC,`🔧 `+U(e.function?.name||e.name),1),Z(`code`,GC,U(e.function?.arguments??e.args),1)]))),128)),e.tool_call_id?(Y(),X(`span`,KC,`↳ tool_call_id: `+U(e.tool_call_id),1)):Q(``,!0)])]))),128))]))],64)):e.type===`llm_response`?(Y(),X(J,{key:2},[Z(`div`,JC,[Z(`span`,YC,`第 `+U(e.data.round)+` 轮`,1),e.data.toolCalls?.length?(Y(),X(`span`,XC,`🔧 `+U(e.data.toolCalls.length)+` 个工具调用`,1)):Q(``,!0)]),e.data.content?(Y(),X(`div`,ZC,U(e.data.content),1)):Q(``,!0),e.data.toolCalls?.length?(Y(),X(`div`,QC,[(Y(!0),X(J,null,ta(e.data.toolCalls,(e,t)=>(Y(),X(`div`,{key:t,class:`tc-card`},[Z(`div`,$C,`🔧 `+U(e.name),1),Z(`pre`,ew,U(m(e.args)),1)]))),128))])):Q(``,!0),e.data.usage?(Y(),X(`div`,tw,[Z(`span`,nw,`prompt: `+U(e.data.usage.prompt_tokens??`-`),1),Z(`span`,rw,`completion: `+U(e.data.usage.completion_tokens??`-`),1),Z(`span`,iw,`total: `+U(e.data.usage.total_tokens??`-`),1)])):Q(``,!0)],64)):e.type===`tool_call`?(Y(),X(`div`,aw,[Z(`div`,ow,`🔧 `+U(e.data.name),1),Z(`pre`,sw,U(m(e.data.args)),1)])):e.type===`tool_result`?(Y(),X(`div`,cw,[Z(`div`,lw,`✅ `+U(e.data.name)+` 结果`,1),Z(`pre`,uw,U(e.data.result),1)])):e.type===`error`?(Y(),X(`div`,dw,U(e.data.tool?`[${e.data.tool}] `:``)+U(e.data.error),1)):Q(``,!0)]),Z(`div`,fw,[Z(`button`,{class:`raw-toggle`,onClick:e=>f(t)},U(a.value.has(t)?`收起原始 JSON`:`查看原始 JSON`),9,pw),Z(`button`,{class:`raw-toggle`,onClick:t=>K(ig)(m(e.data))},`复制`,8,mw)]),a.value.has(t)?(Y(),X(`pre`,hw,[Z(`code`,null,U(m(e.data)),1)])):Q(``,!0)]))),128))],64)):y.value===`flow`?(Y(),X(J,{key:4},[c.value.length?Q(``,!0):(Y(),X(`div`,gw,`暂无日志,发送消息后这里按轮次展示执行流程`)),O.value.pre.length?(Y(),X(`div`,_w,[n[23]||=Z(`div`,{class:`flow-section-title`},`⚙️ 准备 / 其他`,-1),(Y(!0),X(J,null,ta(O.value.pre,(e,t)=>(Y(),X(`div`,{key:`p`+t,class:H([`flow-node`,e.type])},[Z(`span`,vw,U(s[e.type]?.icon),1),Z(`span`,yw,U(s[e.type]?.label),1),Z(`span`,bw,U(z(e)),1),Z(`span`,xw,U(d(e.timestamp)),1)],2))),128))])):Q(``,!0),(Y(!0),X(J,null,ta(O.value.rounds,e=>(Y(),X(`div`,{key:e.round,class:`flow-round`},[Z(`div`,Sw,`🔁 第 `+U(e.round)+` 轮`,1),Z(`div`,Cw,[(Y(!0),X(J,null,ta(e.items,(e,t)=>(Y(),X(`div`,{key:t,class:H([`flow-node`,e.type])},[Z(`span`,ww,U(s[e.type]?.icon),1),Z(`span`,Tw,U(s[e.type]?.label),1),Z(`span`,Ew,U(z(e)),1),Z(`span`,Dw,U(d(e.timestamp)),1)],2))),128))])]))),128))],64)):(Y(),X(`div`,Ow,[b.value?(Y(),X(J,{key:1},[Z(`div`,Aw,[n[29]||=Z(`div`,{class:`info-title`},`基本信息`,-1),Z(`div`,jw,[Z(`div`,Mw,[n[24]||=Z(`span`,{class:`k`},`ID`,-1),Z(`span`,Nw,U(b.value.id),1)]),Z(`div`,Pw,[n[25]||=Z(`span`,{class:`k`},`模型`,-1),Z(`span`,Fw,U(b.value.model||`-`),1)]),Z(`div`,Iw,[n[26]||=Z(`span`,{class:`k`},`工具数`,-1),Z(`span`,Lw,U(b.value.tools.length),1)]),Z(`div`,Rw,[n[27]||=Z(`span`,{class:`k`},`中间件`,-1),Z(`span`,zw,U(b.value.middleware.length),1)])]),Z(`div`,Bw,[n[28]||=Z(`span`,{class:`k`},`中间件栈`,-1),Z(`span`,Vw,U(b.value.middleware.join(` → `)||`-`),1)])]),Z(`div`,Hw,[Z(`div`,Uw,`🔧 工具 (`+U(b.value.tools.length)+`)`,1),(Y(!0),X(J,null,ta(b.value.tools,e=>(Y(),X(`div`,{key:e.name,class:`info-item`},[Z(`div`,Ww,[ds(U(e.name),1),e.source?(Y(),X(`span`,{key:0,class:H([`src-tag`,D(e.source)])},U(e.source),3)):Q(``,!0)]),Z(`div`,Gw,U(e.description),1)]))),128))]),b.value.skills.length?(Y(),X(`div`,Kw,[Z(`div`,qw,[ds(`📘 技能 (`+U(b.value.skills.length)+`)`,1),n[30]||=Z(`span`,{class:`info-hint`},`点击展开查看全文`,-1)]),(Y(!0),X(J,null,ta(b.value.skills,e=>(Y(),X(`div`,{key:e.name,class:`info-item`},[Z(`div`,{class:`info-name skill-toggle`,onClick:t=>S(e.name)},[Z(`span`,{class:H([`skill-arrow`,{open:!!x.value[e.name]}])},`▶`,2),ds(` `+U(e.name),1)],8,Jw),Z(`div`,Yw,U(e.description),1),x.value[e.name]?(Y(),X(`div`,Xw,[x.value[e.name].loading?(Y(),X(`div`,Zw,`加载中…`)):x.value[e.name].error?(Y(),X(`div`,Qw,U(x.value[e.name].error),1)):x.value[e.name].content?(Y(),X(`pre`,$w,U(x.value[e.name].content),1)):Q(``,!0)])):Q(``,!0)]))),128))])):Q(``,!0),b.value.data?(Y(),X(`div`,eT,[n[31]||=Z(`div`,{class:`info-title`},`📊 可操作数据`,-1),Z(`div`,tT,[Z(`div`,nT,U(b.value.data.description||`主数据对象`),1),Z(`div`,rT,`schema: `+U(b.value.data.schema?`已声明`:`未声明`),1)])])):Q(``,!0),Z(`div`,iT,[n[36]||=Z(`div`,{class:`info-title`},`🧬 子 Agent`,-1),Z(`div`,aT,[Z(`div`,oT,[n[32]||=Z(`span`,{class:`k`},`启用`,-1),Z(`span`,sT,U(b.value.subagent.enabled?`是`:`否`),1)]),Z(`div`,cT,[n[33]||=Z(`span`,{class:`k`},`最大递归`,-1),Z(`span`,lT,U(b.value.subagent.maxDepth),1)]),Z(`div`,uT,[n[34]||=Z(`span`,{class:`k`},`并行上限`,-1),Z(`span`,dT,U(b.value.subagent.maxParallel),1)]),Z(`div`,fT,[n[35]||=Z(`span`,{class:`k`},`额外工具`,-1),Z(`span`,pT,U(b.value.subagent.allowedTools.length?b.value.subagent.allowedTools.join(`, `):`默认只读`),1)])])]),b.value.mcp?.servers?.length?(Y(),X(`div`,mT,[Z(`div`,hT,`🔌 MCP (`+U(b.value.mcp.servers.length)+`)`,1),(Y(!0),X(J,null,ta(b.value.mcp.servers,e=>(Y(),X(`div`,{key:e.name,class:`info-item`},[Z(`div`,gT,[ds(U(e.name)+` `,1),Z(`span`,_T,U(e.toolCount)+` 工具`,1)]),Z(`div`,vT,U(e.url),1)]))),128))])):Q(``,!0),b.value.verify?(Y(),X(`div`,yT,[n[41]||=Z(`div`,{class:`info-title`},`✅ Verify 自检`,-1),Z(`div`,bT,[Z(`div`,xT,[n[37]||=Z(`span`,{class:`k`},`启用`,-1),Z(`span`,ST,U(b.value.verify.enabled?`是`:`否`),1)]),Z(`div`,CT,[n[38]||=Z(`span`,{class:`k`},`自纠上限`,-1),Z(`span`,wT,U(b.value.verify.maxAttempts),1)]),Z(`div`,TT,[n[39]||=Z(`span`,{class:`k`},`对抗验证`,-1),Z(`span`,ET,U(b.value.verify.adversarial?`开启`:`关闭`),1)]),b.value.verify.adversarial?(Y(),X(`div`,DT,[n[40]||=Z(`span`,{class:`k`},`对抗模型`,-1),Z(`span`,OT,U(b.value.model||`-`)+`(同主)`,1)])):Q(``,!0)])])):Q(``,!0),b.value.todos.length?(Y(),X(`div`,kT,[Z(`div`,AT,`📋 任务清单 (`+U(b.value.todos.length)+`)`,1),(Y(!0),X(J,null,ta(b.value.todos,(e,t)=>(Y(),X(`div`,{key:t,class:`info-todo`},[Z(`span`,{class:`todo-tag`,style:Se({background:T[e.status]&&T[e.status].color||`#9ca3af`})},U(E(e.status)),5),Z(`span`,null,U(e.content),1)]))),128))])):Q(``,!0),b.value.memory?(Y(),X(`div`,jT,[n[42]||=Z(`div`,{class:`info-title`},`📝 持久指令 (memory)`,-1),Z(`pre`,MT,U(b.value.memory),1)])):Q(``,!0),b.value.lastCompression?(Y(),X(`div`,NT,[n[49]||=Z(`div`,{class:`info-title`},`🗜️ 上轮压缩`,-1),Z(`div`,PT,[Z(`div`,FT,[n[43]||=Z(`span`,{class:`k`},`触发`,-1),Z(`span`,IT,U(b.value.lastCompression.triggered?`✓`:`✗(未达阈值)`),1)]),Z(`div`,LT,[n[44]||=Z(`span`,{class:`k`},`摘要轮次`,-1),Z(`span`,RT,U(b.value.lastCompression.roundsSummarized)+` / `+U(b.value.lastCompression.roundsTotal),1)]),Z(`div`,zT,[n[45]||=Z(`span`,{class:`k`},`召回`,-1),Z(`span`,BT,U(b.value.lastCompression.roundsRecalled)+` 条`,1)]),Z(`div`,VT,[n[46]||=Z(`span`,{class:`k`},`消息数`,-1),Z(`span`,HT,U(b.value.lastCompression.originalMessages)+` → `+U(b.value.lastCompression.compressedMessages),1)]),Z(`div`,UT,[n[47]||=Z(`span`,{class:`k`},`策略`,-1),Z(`span`,WT,U(b.value.lastCompression.strategy),1)]),b.value.lastCompression.decision?(Y(),X(`div`,GT,[n[48]||=Z(`span`,{class:`k`},`压缩决策`,-1),Z(`span`,KT,`🤖 `+U(te(b.value.lastCompression.decision)),1)])):Q(``,!0)])])):Q(``,!0)],64)):(Y(),X(`div`,kw,`暂无信息`))]))])]),Z(`div`,{class:`drawer-mask`,onClick:_})])):Q(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-26317da9`]]),JT={class:`skill-panel`},YT={class:`skill-header`},XT={class:`skill-section`},ZT={class:`section-title`},QT={class:`field`},$T=[`disabled`],eE={class:`field`},tE={class:`field field-textarea`},nE={key:0,class:`skill-error`},rE={class:`skill-section`},iE={class:`section-title`},aE={key:0,class:`empty-hint`},oE={key:1,class:`skill-list`},sE={class:`skill-actions`},cE=[`onClick`],lE=[`onClick`],uE=bg(ki({__name:`SkillPanel`,props:{visible:{type:Boolean},onAddSkill:{type:Function},onRemoveSkill:{type:Function},getUserSkillNames:{type:Function},onGetSkill:{type:Function}},emits:[`close`],setup(e,{emit:t}){let n=e,r=t,i=_n(``),a=_n(``),o=_n(``),s=_n(``),c=_n([]),l=_n(0),u=_n(null);Xr(()=>n.visible,e=>{e&&d()},{immediate:!0}),Xr(l,()=>d());function d(){n.getUserSkillNames&&(c.value=n.getUserSkillNames())}function f(){if(s.value=``,!i.value.trim()){s.value=`skill 名不能为空`;return}if(!a.value.trim()){s.value=`描述不能为空`;return}if(!o.value.trim()){s.value=`内容不能为空`;return}let e=i.value.trim();u.value===null&&c.value.includes(e)&&(s.value=`已存在同名用户 skill "${e}",将覆盖`),n.onAddSkill?.({name:e,description:a.value.trim(),getContent:()=>o.value}),h(),l.value++}function p(e){n.onRemoveSkill&&n.onRemoveSkill(e)&&(u.value===e&&h(),l.value++)}function m(e){if(!n.onGetSkill)return;let t=n.onGetSkill(e);t&&(u.value=e,i.value=t.name,a.value=t.description,o.value=t.content,s.value=``)}function h(){u.value=null,i.value=``,a.value=``,o.value=``,s.value=``}return(t,n)=>(Y(),$o(di,{to:`body`},[os(uc,{name:`cs-skill-fade`},{default:Hr(()=>[e.visible?(Y(),X(`div`,{key:0,class:`skill-mask`,onClick:n[4]||=pl(e=>r(`close`),[`self`])},[Z(`div`,JT,[Z(`div`,YT,[n[5]||=Z(`span`,{class:`skill-title`},`🧩 Skill 管理`,-1),Z(`button`,{class:`skill-close`,title:`关闭`,onClick:n[0]||=e=>r(`close`)},`✕`)]),Z(`div`,XT,[Z(`div`,ZT,[ds(U(u.value?`编辑 Skill: ${u.value}`:`创建新 Skill`)+` `,1),u.value?(Y(),X(`button`,{key:0,class:`btn btn-ghost btn-cancel`,title:`取消编辑,回到新建`,onClick:h},`取消编辑`)):Q(``,!0)]),Z(`label`,QT,[n[6]||=Z(`span`,{class:`field-label`},`名称`,-1),Wr(Z(`input`,{"onUpdate:modelValue":n[1]||=e=>i.value=e,disabled:!!u.value,placeholder:`如:my-writer`,class:`field-input`},null,8,$T),[[ul,i.value]])]),Z(`label`,eE,[n[7]||=Z(`span`,{class:`field-label`},`描述`,-1),Wr(Z(`input`,{"onUpdate:modelValue":n[2]||=e=>a.value=e,placeholder:`一句话说明用途与触发时机`,class:`field-input`},null,512),[[ul,a.value]])]),Z(`label`,tE,[n[8]||=Z(`span`,{class:`field-label`},`内容`,-1),Wr(Z(`textarea`,{"onUpdate:modelValue":n[3]||=e=>o.value=e,placeholder:`skill 全文指令(支持 Markdown)`,rows:`6`,class:`field-input`},null,512),[[ul,o.value]])]),s.value?(Y(),X(`div`,nE,U(s.value),1)):Q(``,!0),Z(`button`,{class:`btn btn-primary`,onClick:f},U(u.value?`保存修改`:`添加 Skill`),1)]),Z(`div`,rE,[Z(`div`,iE,`已创建 Skill(`+U(c.value.length)+`)`,1),c.value.length?(Y(),X(`ul`,oE,[(Y(!0),X(J,null,ta(c.value,e=>(Y(),X(`li`,{key:e,class:`skill-item`},[Z(`span`,{class:H([`skill-name`,{active:u.value===e}])},U(e),3),Z(`span`,sE,[Z(`button`,{class:`btn btn-ghost btn-edit`,title:`加载到表单编辑`,onClick:t=>m(e)},`编辑`,8,cE),Z(`button`,{class:`btn btn-ghost btn-del`,title:`删除该用户 skill`,onClick:t=>p(e)},`删除`,8,lE)])]))),128))])):(Y(),X(`div`,aE,`暂无用户创建的 skill`))]),n[9]||=Z(`div`,{class:`skill-hint`},[ds(` 💡 创建/编辑的 skill 会自动加入 agent(下轮 system prompt 索引可见),agent 经 `),Z(`code`,null,`load_skill(name)`),ds(` 按需加载全文; 持久化由独立 SkillStore 管理(默认 indexedDB,与 storage 选项分离),跨刷新自动恢复;可经 `),Z(`code`,null,`skillStorage.id`),ds(` 跨页面复用。 `)],-1)])])):Q(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-c6a22ea5`]]),dE=bg(ki({__name:`ChatDialog`,props:{fetchResponse:{},fetchStream:{},title:{default:`AI 助手`},placeholder:{default:`输入消息,Enter 发送...`},debugLogs:{},initialMessages:{},onPersist:{},onQueuedCleared:{},onClear:{},getInfo:{},onUndo:{},canUndo:{},showAvatar:{type:Boolean,default:!0},showTyping:{type:Boolean,default:!0},pendingConflict:{},onResolveConflict:{},infoTick:{},getSkillContent:{},onAddSkill:{},onRemoveSkill:{},getUserSkillNames:{},onGetSkill:{},drawer:{type:Boolean},drawerWidth:{},drawerHidden:{type:Boolean},inputRows:{default:2},sessions:{},currentSessionId:{},onNewSession:{},onOpenSession:{},onRemoveSession:{},getFocus:{},onSetFocus:{},onClearFocus:{},getFocuses:{},onAddFocus:{},onRemoveFocus:{},onFocusChipClick:{},sections:{}},emits:[`close`],setup(e,{emit:t}){let n=e,r=t,i=og({fetchResponse:n.fetchResponse,fetchStream:n.fetchStream,messages:n.initialMessages,onPersist:n.onPersist,onClear:n.onClear,onQueuedCleared:n.onQueuedCleared,getInfo:n.getInfo,canUndo:n.canUndo,onUndo:n.onUndo,getFocuses:n.getFocuses,onAddFocus:n.onAddFocus,onRemoveFocus:n.onRemoveFocus,onClearFocus:n.onClearFocus,onFocusChipClick:n.onFocusChipClick,infoTick:n.infoTick});Kr(ag,i);let{isExpanded:a,debugVisible:o,skillVisible:s,closeSkill:c}=i;function l(e){return e===`focus`?n.sections?.focus===!0:n.sections?.[e]!==!1}let u=Ks(()=>!!n.onAddSkill),d=Ks(()=>{if(!n.drawer||n.drawerWidth==null)return null;let e=n.drawerWidth;return typeof e==`number`?`${e}px`:e});return(t,n)=>(Y(),X(J,null,[e.drawer?(Y(),X(`div`,{key:0,class:`chat-mask`,onClick:n[0]||=e=>r(`close`)})):Q(``,!0),Z(`div`,{class:H([`chat-dialog`,{collapsed:!K(a)&&!e.drawer,drawer:e.drawer}]),style:Se(d.value?{width:d.value,maxWidth:d.value}:null)},[l(`header`)?na(t.$slots,`header`,{key:0,chat:K(i)},()=>[os(xg,{title:e.title,drawer:e.drawer,"debug-logs":e.debugLogs,"skill-available":u.value,sessions:e.sessions,"current-session-id":e.currentSessionId,"on-new-session":e.onNewSession,"on-open-session":e.onOpenSession,"on-remove-session":e.onRemoveSession,onClose:n[1]||=e=>r(`close`)},null,8,[`title`,`drawer`,`debug-logs`,`skill-available`,`sessions`,`current-session-id`,`on-new-session`,`on-open-session`,`on-remove-session`])],!0):Q(``,!0),l(`focus`)?na(t.$slots,`focus`,{key:1,chat:K(i)},()=>[os(Dg,{"get-focus":e.getFocus,"on-set-focus":e.onSetFocus,"on-clear-focus":e.onClearFocus,"info-tick":e.infoTick},null,8,[`get-focus`,`on-set-focus`,`on-clear-focus`,`info-tick`])],!0):Q(``,!0),l(`body`)?(Y(),$o(uc,{key:2,name:`cs-slide`},{default:Hr(()=>[na(t.$slots,`body`,{chat:K(i)},()=>[Wr(os(vx,{"show-avatar":e.showAvatar,"show-typing":e.showTyping},null,8,[`show-avatar`,`show-typing`]),[[Oc,K(a)]])],!0)]),_:3})):Q(``,!0),l(`queued`)?na(t.$slots,`queued`,{key:3,chat:K(i)},()=>[os(Ex)],!0):Q(``,!0),l(`approval`)?na(t.$slots,`approval`,{key:4,chat:K(i)},()=>[os(Rx)],!0):Q(``,!0),l(`conflict`)?na(t.$slots,`conflict`,{key:5,chat:K(i)},()=>[os(Yx,{"pending-conflict":e.pendingConflict,"on-resolve":e.onResolveConflict},null,8,[`pending-conflict`,`on-resolve`])],!0):Q(``,!0),l(`footer`)?(Y(),$o(uc,{key:6,name:`cs-slide`},{default:Hr(()=>[na(t.$slots,`footer`,{chat:K(i)},()=>[os(sS,{placeholder:e.placeholder,"input-rows":e.inputRows},null,8,[`placeholder`,`input-rows`])],!0)]),_:3})):Q(``,!0),l(`debug`)?na(t.$slots,`debug`,{key:7,chat:K(i)},()=>[os(qT,{visible:K(o),"onUpdate:visible":n[2]||=e=>gn(o)?o.value=e:null,logs:e.debugLogs,"get-info":e.getInfo,"info-tick":e.infoTick,"get-skill-content":e.getSkillContent},null,8,[`visible`,`logs`,`get-info`,`info-tick`,`get-skill-content`])],!0):Q(``,!0),l(`skill`)?na(t.$slots,`skill`,{key:8,chat:K(i)},()=>[os(uE,{visible:K(s),"on-add-skill":e.onAddSkill,"on-remove-skill":e.onRemoveSkill,"get-user-skill-names":e.getUserSkillNames,"on-get-skill":e.onGetSkill,onClose:K(c)},null,8,[`visible`,`on-add-skill`,`on-remove-skill`,`get-user-skill-names`,`on-get-skill`,`onClose`])],!0):Q(``,!0)],6)],64))}}),[[`__scopeId`,`data-v-f1275b15`]]);function fE(e){let{core:t,dialogCfg:n}=e,r=null,i=e.el,a=t.agent.debugLogs;return r=yl(ki({setup(){return()=>qs(dE,{fetchStream:e.streaming?t.stream:void 0,fetchResponse:e.streaming?void 0:(e,n)=>{if(n){let e=()=>t.resolveConflict(`keep_external`);n.aborted?e():n.addEventListener(`abort`,e,{once:!0})}return t.agent.invoke(e,n)},title:n.title,placeholder:n.placeholder,debugLogs:a.value.slice(),initialMessages:t.messages,getInfo:()=>t.getInfo(),onUndo:t.checkpoint?()=>t.checkpoint.restore():void 0,canUndo:t.checkpoint?()=>t.checkpoint.canRestore():void 0,onPersist:async()=>{t.afterRound(),t.store&&await t.store.flush()},onClear:()=>t.resetSession(),onQueuedCleared:e=>{let n=t.agent?.debugLogs;n&&(n.value.push({timestamp:Date.now(),type:`middleware`,data:{stage:`queued_cleared`,dropped:e.length,preview:e.map(e=>e.slice(0,60))}}),xn(n))},pendingConflict:t.pendingConflict.value,onResolveConflict:e=>t.resolveConflict(e),infoTick:t.infoTick,getSkillContent:t.skillsController?e=>t.skillsController.getContent(e):void 0,onAddSkill:t.skillsController?e=>t.addSkill(e):void 0,onRemoveSkill:t.skillsController?e=>t.removeSkill(e):void 0,getUserSkillNames:t.skillsController?()=>t.listUserSkills():void 0,onGetSkill:t.skillsController?e=>t.getUserSkill(e):void 0,drawer:n.drawer===!0,drawerWidth:n.drawerWidth,drawerHidden:n.drawerHidden===!0,inputRows:n.inputRows,sections:n.sections,getFocus:()=>t.getFocus(),getFocuses:()=>t.getFocuses(),onSetFocus:e=>t.setFocus(e),onAddFocus:e=>t.addFocus(e),onRemoveFocus:e=>t.removeFocus(e),onClearFocus:()=>t.clearFocus(),onFocusChipClick:e=>t.emit({type:`focus_chip_click`,path:e.path,label:e.label}),onClose:n.onClose??(n.drawer===!0?()=>e.hide():()=>e.unmount()),...t.store?{sessions:t.sessions.value,currentSessionId:t.sessionId,onNewSession:()=>{e.runSerial(()=>t.switchSession())},onOpenSession:n=>{e.runSerial(()=>t.switchSession(n))},onRemoveSession:async e=>{e!==t.sessionId&&(await t.store.deleteSession(t.agentId,e),await t.refreshSessions())}}:{}})}})),r.mount(e.el),{unmount(){let t=i.querySelector?.(`.chat-dialog`);if(r&&t){t.classList.add(`cs-leaving`);let n=i.querySelector?.(`.chat-mask`);n&&n.classList.add(`cs-leaving`);let a=!1,o=()=>{a||(a=!0,r?.unmount(),r=null,e.onDialogUnmounted())};t.addEventListener(`transitionend`,o,{once:!0}),setTimeout(o,320);return}r?.unmount(),r=null,e.onDialogUnmounted()},hide(){let e=i.querySelector?.(`.chat-dialog`),t=i.querySelector?.(`.chat-mask`);e&&e.classList.add(`cs-hidden`),t&&t.classList.add(`cs-hidden`)},show(){let e=i.querySelector?.(`.chat-dialog`),t=i.querySelector?.(`.chat-mask`);e&&e.classList.remove(`cs-hidden`),t&&t.classList.remove(`cs-hidden`)}}}var pE=`你是知识检索专家。可用工具:search_docs(语义检索)/ load_doc(按 source 加载)/ vfs_grep+vfs_read(搜预注入文档)/ fetch_document(公网 URL)。
182
182
 
183
183
  工作方式:
184
184
  1. 分析任务,拆出需查证的要点(如:需要哪些组件、各自的 props 约束、UI 规范要求);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "page-agent-sdk",
3
- "version": "2.41.0",
3
+ "version": "2.41.1",
4
4
  "type": "module",
5
5
  "description": "AI agent SDK for web pages — embed a chat assistant that edits page data via schema-validated tools. A lighter, framework-agnostic alternative to CopilotKit/LangChain for in-page JSON-editing agents. Vue-bundled; works with DeepSeek, OpenAI, MCP.",
6
6
  "main": "./dist/page-agent-sdk.umd.cjs",