page-agent-sdk 2.41.0 → 2.42.0

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.
@@ -88,7 +88,7 @@ self.onmessage = async (e) => {
88
88
  `+e.map(e=>`#${e.id} [${e.label??`auto`}] 消息数=${e.messageCount} 时间=${new Date(e.timestamp).toLocaleTimeString()}`).join(`
89
89
  `):`无可用 checkpoint。`},{name:`list_checkpoints`,description:`列出可用会话 checkpoint(回退点)。`,schema:t.z.object({}).optional()})]:[];ue.forEach(e=>ie.set(e.name,`builtin`));let V=N.focus,de=(0,r.tool)(async({path:e,label:t})=>{let n=re()?.schema;return n?xu(n,e)?(w.setFocus({path:e,...t?{label:t}:{}}),`已聚焦到 ${e}${t?`(${t})`:``}。后续仅可写该子树(越界被拒),每轮只看到该组件结构。完成精修后调 clear_focus 退出。`):`PATH_DENIED · 聚焦失败:path "${e}" 不在 schema 内。请先用 read 查看可操作路径再聚焦。`:`聚焦失败:当前无主数据 schema,无法聚焦。`},{name:`set_focus`,description:`聚焦到指定组件子树(如 components.3)精修,替换全部已有焦点(非累积;要保留已有焦点追加用 add_focus)。聚焦后:仅可写该子树(越界 PATH_DENIED)+ 每轮只看到该组件结构。多组件页面精修其中一个时用,避免改到别处。先 read 定位 path 再聚焦;完成调 clear_focus。`,schema:t.z.object({path:t.z.string().describe(`要聚焦的组件 jsonPath,如 components.3`),label:t.z.string().optional().describe(`人类可读标签,如「导航栏」`)})}),fe=(0,r.tool)(async()=>(w.clearFocus(),`已清除聚焦,恢复全量可操作范围(可读写所有组件)。`),{name:`clear_focus`,description:`清除当前聚焦,退出精修模式,恢复对全部组件的读写权限。`,schema:t.z.object({}).optional()}),pe=(0,r.tool)(async({path:e,label:t})=>{let n=re()?.schema;if(!n)return`聚焦失败:当前无主数据 schema,无法聚焦。`;if(!xu(n,e))return`PATH_DENIED · 聚焦失败:path "${e}" 不在 schema 内。请先用 read 查看可操作路径再聚焦。`;w.addFocus({path:e,...t?{label:t}:{}});let r=w.getFocuses();return`已聚焦 ${e}${t?`(${t})`:``}(当前共 ${r.length} 个焦点:${r.map(e=>e.path).join(`, `)})。后续仅可写这些子树之一(越界被拒)。`},{name:`add_focus`,description:`追加聚焦一个组件子树(multi-focus,可同时聚焦多个相关组件)。校验 path 在 schema 内。聚焦后仅可写已聚焦的子树之一(越界 PATH_DENIED)。与 set_focus(替换全部)不同:本工具累积追加,不清除已有焦点。`,schema:t.z.object({path:t.z.string().describe(`要追加聚焦的组件 jsonPath,如 components.3`),label:t.z.string().optional().describe(`人类可读标签`)})}),me=(0,r.tool)(async({path:e})=>{let t=w.getFocuses().length;w.removeFocus(e);let n=w.getFocuses();return n.length===t?`path "${e}" 不在当前焦点列表中(当前:${n.map(e=>e.path).join(`, `)||`无`})。`:n.length?`已移除焦点 ${e}(剩余 ${n.length} 个:${n.map(e=>e.path).join(`, `)})。`:`已移除焦点 ${e},聚焦已清空,恢复全量操作范围。`},{name:`remove_focus`,description:`移除单个聚焦焦点(by path),保留其他焦点。移除最后一个等价退出精修。全部退出用 clear_focus。`,schema:t.z.object({path:t.z.string().describe(`要移除的焦点 jsonPath`)})}),he=V&&e.toolMode===`advanced`?[de,fe,pe,me]:[];he.forEach(e=>ie.set(e.name,`builtin`));let ge=[],_e=new Map,ve=ye();function ye(){let{tools:e,collisions:t}=Lh([{label:`builtin`,tools:ae},{label:`user`,tools:oe},{label:`action`,tools:B},{label:`humanConfirm`,tools:le?[le]:[]},{label:`checkpoint`,tools:ue},{label:`focus`,tools:he},{label:`mcp`,tools:se},{label:`skill`,tools:ge}]);return t.length&&console.warn(`[page-agent-sdk] 工具重名,后注册覆盖先注册:`,t.map(e=>`${e.name}(${e.loser}→${e.winner})`).join(`, `)),e}let be=N.planning,xe=N.missionAnchor,Se=N.workingMemory,Ce=N.skills,we=N.vfs;if(we)for(let e of Dm)ie.set(e,`builtin`);if(be)for(let e of S.tools??[])ie.set(e.name,`builtin`);let Te=N.summarization,Ee=N.agentCompression&&!!d;e.debug&&N.agentCompression&&!d&&console.warn(`[page-agent-sdk][agentCompression] agentCompression 开启但 summaryLlm 不可用(或缺 apiKey / 模型不支持工具),压缩决策不启用,回退静态压缩`);let H=N.memory,De=N.subagent,Oe=De?cf():void 0,ke=e.verify?.maxAttempts??2,Ae=N.verify&&e.verify?.enabled!==!1&&ke>0,je=N.contextInspector;e.verify?.check&&!N.verify&&console.warn(`[page-agent-sdk][verify] 检测到 verify.check 但 capabilities.verify 未开启,verify 未装载`);let Me=e.subagent,Ne=Me?.allowedTools??[],Pe=e.permissions?.length?Od(e.permissions):void 0,Fe=e.approval&&(e.approval.tools!==void 0||e.approval.confirm)?kd(e.approval):void 0,Ie=[...Pe?[Pe]:[],...Fe?[Fe]:[]],Le=!De||Me?.enabled===!1?void 0:wf({llm:Me?.llm??e.llm,allTools:()=>W.agent?.allTools??ve,allowedTools:Ne.length?Ne:void 0,systemPrompt:Me?.systemPrompt,temperature:Me?.temperature,maxTokens:Me?.maxTokens,skills:Me?.skills,maxDepth:Me?.maxDepth,maxParallel:Me?.maxParallel,debug:e.debug,getFocuses:()=>w.getFocuses(),getSchema:()=>re()?.schema??null,tracker:Oe,guardMiddleware:Ie.length?Ie:void 0,getVfsFiles:we?()=>x.files:void 0,enterDataScope:z?.enterScope?e=>z.enterScope(e):void 0,exitDataScope:z?.exitScope?e=>z.exitScope(e):void 0,onUsage:e=>{i.prompt_tokens=(i.prompt_tokens??0)+(e.prompt_tokens??0),i.completion_tokens=(i.completion_tokens??0)+(e.completion_tokens??0),i.total_tokens=(i.total_tokens??0)+(e.total_tokens??0)},timeoutMs:Me?.timeoutMs}),Re=De&&e.subagents!==void 0?Df(e.subagents,{llm:e.llm,allTools:()=>W.agent?.allTools??ve,debug:e.debug,getFocuses:()=>w.getFocuses(),getSchema:()=>re()?.schema??null,tracker:Oe,guardMiddleware:Ie.length?Ie:void 0,getVfsFiles:we?()=>x.files:void 0,enterDataScope:z?.enterScope?e=>z.enterScope(e):void 0,exitDataScope:z?.exitScope?e=>z.exitScope(e):void 0,onUsage:e=>{i.prompt_tokens=(i.prompt_tokens??0)+(e.prompt_tokens??0),i.completion_tokens=(i.completion_tokens??0)+(e.completion_tokens??0),i.total_tokens=(i.total_tokens??0)+(e.total_tokens??0)},timeoutMs:e.subagent?.timeoutMs}):void 0,U=Re?Re.controller:null,ze=[`get_data`,`describe_data`,`read`,`fetch_document`],Be=ve.filter(e=>ze.includes(e.name)),Ve=Ae?Of({check:e.verify.check??Pf({schemas:()=>re()?{"":re().schema}:{},root:()=>re()?.bind}),adversarial:e.verify?.adversarial?{llm:e.llm,tools:Be}:void 0}):void 0,He=je?Jf({contextWindow:f.contextWindow,thresholdRatio:Xp(e,f.contextWindow).summaryThresholdRatio}):void 0,Ue=zh({...N,humanConfirm:ce,subagents:e.subagents?.map(e=>({id:e.id,description:e.description,temperature:e.temperature}))},P&&!!O,e.toolMode,!!O?.resources?.length),We=O?{name:`dataHint`,augmentPrompt:()=>ep(re(),e.schemaHint)||void 0}:null,Ge=e.augmentSystem?{name:`augmentSystem`,augmentPrompt:t=>{try{return e.augmentSystem({state:t,data:re()})}catch(t){e.debug&&console.log(`[page-agent-sdk][augmentSystem] 回调抛错,降级跳过:`,t.message);return}}}:null,Ke=qp(e.onEvent),qe=Ke.emit,Je,Ye=[],Xe=e=>({name:e.name,description:e.description,content:typeof e.getContent==`function`?e.getContent():``}),Ze=e=>({name:e.name,description:e.description,getContent:()=>e.content}),Qe=e.skillStorage===!1?null:Gh({...typeof e.skillStorage==`object`?e.skillStorage:{},id:e.skillStorage&&typeof e.skillStorage==`object`&&e.skillStorage.id?e.skillStorage.id:`agent::${n}`}),$e=()=>{let t=Je?Je.controller:null;if(t){let n=(e.skills||[]).filter(e=>!Ye.some(t=>t.name===e.name));t.set([...n,...Ye])}W.infoTick.value++},et=async()=>{if(Qe)try{let t=await Qe.list();if(t.length){Ye=t.map(Ze);let n=Je?Je.controller:null;if(n){let t=(e.skills||[]).filter(e=>!Ye.some(t=>t.name===e.name));n.set([...t,...Ye])}W.infoTick.value++}}catch{}},tt=Te?sf({...p,llmInvoke:l,getRegisteredData:()=>re()?[{description:re().description??`主数据对象`}]:[],preserveLastToolResults:h,...Ee?{decideInvoke:d,getSnapshot:()=>He?.getSnapshot()}:{}}):void 0,nt=Qp([...We?[We]:[],Ue,...xe?[C]:[],...be?[S]:[],...Ce?[Je=xd(e.skills||[],{readVfs:we?e=>x.files[e]?.content:void 0,hostScriptEnabled:N.skillHostScript,onToolsReady:(e,t)=>{for(let n of t){let t=ge.findIndex(e=>e.name===n.name);t>=0&&ge.splice(t,1),ge.push(n),_e.set(n.name,e),ie.set(n.name,`skill:${e}`)}ve=ye(),W.agent&&W.agent.setTools(ve),W.infoTick.value++}})]:[],...we?[km(x)]:[],...tt?[tt]:[],...Se?[T]:[],...V?[w]:[],...ne?[ne]:[],...H?[E]:[],...Pe?[Pe]:[],...A&&M&&j?[Vd(j)]:[],...ce?[Nd()]:[],...Fe?[Fe]:[],...Ve?[Ve]:[],...Le?[Le]:[],...Re?[Re]:[],...Ge?[Ge]:[],...He?[He]:[],...e.middleware||[],...I?[kh(i,{tokenBudget:e.tokenBudget,timeBudgetMs:e.timeBudgetMs},qe)]:[],$h(qe,b,re,i)]),rt=e.maxMemoryRounds??Xh,it=e.approval?.timeoutMs,at=it===void 0||it===0?3e4:!Number.isFinite(it)||it<0?0:it;function ot(e){if(at)return t=>{if(t.type!==`approval_request`)return;let n=Date.now(),r=t.toolName;setTimeout(()=>{e?.aborted||(t.resolve(!1),qe({type:`error`,message:`确认请求(${r})${Math.round((Date.now()-n)/1e3)}s 无响应已自动拒绝 —— send/batch 路径无 UI 响应方;可传 approval.timeoutMs 调整(Infinity = 无限等)`,severity:`observable`,code:`APPROVAL_AUTO_REJECTED`,context:{toolName:r,waitedMs:Date.now()-n}}))},at)}}let st=_n([]);async function ct(){s&&(st.value=(await s.listSessions(n)).sort((e,t)=>t.lastAccessed-e.lastAccessed))}let lt=Yh(),ut=new Set;function dt(e){let t=new AbortController;return e&&(e.aborted?t.abort():e.addEventListener(`abort`,()=>t.abort(),{once:!0})),ut.add(t),{controller:t,untrack:()=>ut.delete(t)}}function ft(){for(let e of ut)e.abort();ut.clear()}let W={agentId:n,store:s,messages:b,vfsStore:x,listeners:Ke.listeners,todosMw:S,memoryMw:E,missionMw:C,workingMemoryMw:T,focusMw:w,agent:null,initDone:Promise.resolve(),sessionId:``,refCount:0,mcpClosers:[],mcpServers:[],checkpoint:j,dataOpsController:z,skillsController:Je?Je.controller:null,infoTick:o,pendingConflict:a.pendingConflict,sessions:st,refreshSessions:ct,liveData:re,usage:i,emit:qe,runSerial:lt,trackActive:dt,abortAllActive:ft,unloadSkillTools(e){if(e){let t=ge.length;if(ge=ge.filter(t=>_e.get(t.name)===e?(ie.delete(t.name),_e.delete(t.name),!1):!0),ge.length===t)return}else{if(!ge.length)return;for(let e of ge)ie.delete(e.name),_e.delete(e.name);ge=[]}ve=ye(),W.agent&&W.agent.setTools(ve)},applySnapshot(t){if(t.messages?.length&&b.push(...t.messages),t.vfs&&x.hydrate&&x.hydrate(t.vfs),t.todos?.length&&S.reset(t.todos),t.memory&&!e.memory&&E.reset(t.memory),t.checkpoints?.length&&j&&j.importStack(t.checkpoints),t.usage&&Object.assign(i,t.usage),t.mission&&xe&&C.setMission(t.mission),t.workingMemory&&Se&&T.restore(t.workingMemory),V){let n=t.focus,r=n?Array.isArray(n)?n:[n]:[];if(r.length){let t=re()?.schema,n=t?r.filter(e=>xu(t,e.path)):[];if(n.length&&(w.setFocus(null),n.forEach(e=>w.addFocus(e))),e.debug&&n.length<r.length){let e=r.filter(e=>!n.includes(e)).map(e=>e.path);console.warn(`[page-agent-sdk][focus] 恢复的焦点部分 path 已失效(schema 变化/无 schema),剔除:`,e)}}}gt()},addSkill(e){let t=Ye.findIndex(t=>t.name===e.name);t>=0?Ye[t]=e:Ye.push(e),$e(),Qe&&Qe.put(Xe(e))},removeSkill(e){let t=Ye.findIndex(t=>t.name===e);return t<0?!1:(Ye.splice(t,1),$e(),Qe&&Qe.remove(e),!0)},listUserSkills(){return Ye.map(e=>e.name)},getUserSkill(e){let t=Ye.find(t=>t.name===e);if(t)return{name:t.name,description:t.description,content:typeof t.getContent==`function`?t.getContent():``}},afterRound(){_t(),bt()},async send(e,t){await W.initDone,t??={},t?.mission&&xe&&C.setMission(t.mission);let n=e;if(t.interceptors?.input)try{let r=t.interceptors.input(e);typeof r==`string`&&(n=r)}catch{}let r=I?t.maxAutoRetries??1:0,i=0,a=!1,o=ot(t.signal);for(;;){a||=(b.push({role:`user`,content:n,timestamp:Date.now()}),!0);try{let e=await W.agent.invoke(b,t.signal,o);if(t.interceptors?.output)try{let n=t.interceptors.output(e);typeof n==`string`&&(e=n)}catch{}return b.push({role:`assistant`,content:e,timestamp:Date.now()}),W.afterRound(),s&&await s.flush(),e}catch(e){if(Wl(e,t.signal))throw e;let n=kl(e,`fatal`);if(i<r&&j?.canRestore()){i+=1,j.restore(),a=!0,qe({type:`error`,message:`致命错误自动恢复(${i}/${r}):${n.message},已回退 checkpoint 重试`,severity:`observable`,code:`AUTO_RECOVER_RETRY`,context:{attempt:i,cause:n.code??n.message.slice(0,120)}});continue}throw qe({type:`error`,message:n.message,severity:n.severity,...n.code?{code:n.code}:{},...n.context===void 0?{}:{context:n.context}}),e}}},async batch(e,t,n){if(await W.initDone,!e.length)return[];let r=[],i=ot(n);for(let a=0;a<e.length;a++){if(n?.aborted){for(let t=a;t<e.length;t++)r.push({index:t,task:e[t],error:`aborted(外部中止)`,ok:!1});break}let o=e[a];j&&j.save(`batch:${a}`);let c=b.length;try{b.push({role:`user`,content:o,timestamp:Date.now()});let c=await W.agent.invoke(b,n,i);b.push({role:`assistant`,content:c,timestamp:Date.now()}),W.afterRound(),s&&await s.flush(),r.push({index:a,task:o,reply:c,ok:!0}),t?.({done:a+1,total:e.length,task:o,ok:!0})}catch(i){if(b.length>c&&b.splice(c),Wl(i,n)){r.push({index:a,task:o,error:`aborted(外部中止)`,ok:!1});for(let t=a+1;t<e.length;t++)r.push({index:t,task:e[t],error:`aborted(外部中止)`,ok:!1});break}let s=kl(i,`fatal`);qe({type:`error`,message:`批量任务 ${a+1}/${e.length} 失败:${s.message}`,severity:`observable`,code:`BATCH_TASK_FAILED`,context:{index:a,task:o.slice(0,100)}}),r.push({index:a,task:o,error:s.message,ok:!1}),t?.({done:a+1,total:e.length,task:o,ok:!1})}}return r},async switchSession(t){if(await W.initDone,!s)throw Error(`page-agent-sdk: storage 未开启,无法切换会话(请传 storage 选项)`);if(a.resolve(`keep_external`),W.sessionId&&s){if(xe){let e=C.getMission();e&&s.save(n,W.sessionId,{mission:e})}if(Se){let e=T.getWorkingMemory();e&&s.save(n,W.sessionId,{workingMemory:e})}if(V){let e=w.getFocuses();s.save(n,W.sessionId,{focus:e.length?e:null})}}x.flush?.(),await s.flush();let r=t??``,i;return r?(i=await s.load(n,r),i||await s.createSession(n,e.session?.title,r)):r=await s.createSession(n,e.session?.title),W.sessionId=r,b.splice(0,b.length),x.clear?.(),S.reset([]),e.memory||E.reset(``),C.reset(),T.reset(),w.reset(),j&&j.importStack([]),W.agent.debugLogs.value=[],i||=await s.load(n,r),i&&(W.applySnapshot(i),qe({type:`session_restored`,sessionId:r,rounds:i.messages?.length??0})),e.memory&&s.save(n,W.sessionId,{memory:E.get()||(typeof e.memory==`string`?e.memory:``)}),ct(),vt=void 0,yt=!1,r},resetSession:()=>{ft(),a.resolve(`keep_external`),W.sessionId=vp(),b.splice(0,b.length),x.clear?.(),S.reset([]),e.memory||E.reset(``),C.reset(),T.reset(),w.reset(),j&&j.importStack([]),W.agent&&(W.agent.debugLogs.value=[]),s&&s.createSession(W.agentId,e.session?.title,W.sessionId),qe({type:`session_restored`,sessionId:W.sessionId,rounds:0}),ct(),vt=void 0,yt=!1},stream:(e,t,n)=>{if(!W.agent)throw Error(`page-agent-sdk: agent 尚未初始化完成,请先 await mount()`);x?.setProtectedRefs?.(qh(e));let r=e=>{t?.(e),qe(e)};if(n){let e=()=>a.resolve(`keep_external`);n.aborted?e():n.addEventListener(`abort`,e,{once:!0})}let{controller:i,untrack:o}=dt(n);return W.agent.stream(e,r,i.signal).finally(o)},release(){if(W.refCount--,W.refCount<=0){ft(),s&&(x.flush?.(),s.flush(),s.dispose()),Qe&&Qe.dispose();let e=W.mcpClosers.splice(0);e.length&&Promise.allSettled(e.map(e=>e())),Zh.delete(n)}},resolveConflict:a.resolve,setTools(e){oe.length=0,e.forEach(e=>{oe.push(e),ie.set(e.name,`user`)}),ve=ye(),W.agent&&W.agent.setTools(ve),W.infoTick.value++},addTool(e){ve.some(t=>t.name===e.name)&&console.warn(`[page-agent-sdk] 工具 "${e.name}" 已存在,新工具覆盖(后注册覆盖先注册)`);for(let t=oe.length-1;t>=0;t--)oe[t].name===e.name&&oe.splice(t,1);oe.push(e),ie.set(e.name,`user`),ve=ye(),W.agent&&W.agent.setTools(ve),W.infoTick.value++},removeTool(e){let t=oe.findIndex(t=>t.name===e);return t<0?!1:(oe.splice(t,1),ie.delete(e),ve=ye(),W.agent&&W.agent.setTools(ve),W.infoTick.value++,!0)},setLlm(t){let n;if(sp(t))n=t;else{let e=t;if((e.provider??`openai`)===`anthropic`)throw Error(`[page-agent-sdk][setLlm] 切换到 Anthropic 需传 BaseChatModel 实例(动态 import 无法同步);请先 const { ChatAnthropic } = await import("@langchain/anthropic") 构造实例后传入`);n=_(e)}typeof n.bindTools!=`function`&&e.debug&&console.warn(`[page-agent-sdk][setLlm] 新模型不支持 bindTools(tool calling 会失效)`),y=t;let r=sp(t)?void 0:t;if(f=Rl({model:r?.model??t.model??t.modelName,contextWindow:e.contextWindow??r?.contextWindow,maxOutputTokens:e.maxOutputTokens??r?.maxOutputTokens}),f.contextWindow<2e5)throw Error(`[page-agent-sdk][setLlm] 新模型上下文窗口 ${f.contextWindow} 小于最小支持 ${Ll}(需 ≥200K 窗口模型)`);W.agent&&(W.agent.setLlm(n),W.agent.setModelCaps?.(f)),tt?.setContextWindow?.(f.contextWindow),He?.setContextWindow?.(f.contextWindow),W.infoTick.value++,e.debug&&console.log(`[page-agent-sdk][setLlm] 重解析 modelCaps + 回灌:`,f)},setMemory(e){E.reset(e),typeof e==`function`&&E.refresh(),W.infoTick.value++},refreshMemory(){return E.refresh()},setSubagents(t){if(!U){e.debug&&console.warn(`[page-agent-sdk][setSubagents] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略`);return}U.set(t),W.infoTick.value++},addSubagent(t){if(!U){e.debug&&console.warn(`[page-agent-sdk][addSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略`);return}U.add(t),W.infoTick.value++},removeSubagent(t){if(!U)return e.debug&&console.warn(`[page-agent-sdk][removeSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略`),!1;let n=U.remove(t);return n&&W.infoTick.value++,n},getActiveSubagents(){return Oe?.getActive()??[]},get subagentHistory(){return Oe?.getHistory()??[]},getInfo(){return{id:n,sessionId:W.sessionId,model:sp(y)?y.model??y.modelName:y.model,systemPrompt:W.agent?.getEffectiveSystemPrompt?.()??L+ep(re(),e.schemaHint),tools:(W.agent?.allTools??ve).map(e=>({name:e.name,description:e.description,schema:e.schema,source:ie.get(e.name)||`user`})),skills:(Je?Je.controller.get():e.skills??[]).map(e=>({name:e.name,description:e.description})),data:re()?{description:re().description,schema:re().schema}:void 0,contextPreset:e.contextPreset??`auto`,memory:E.get(),middleware:nt.map(e=>e.name),todos:(W.agent?.getState?.()?.todos??[]).map(e=>({id:e.id,content:e.content,status:e.status,...e.parentId===void 0?{}:{parentId:e.parentId},...e.deps===void 0?{}:{deps:e.deps},...e.criteria===void 0?{}:{criteria:e.criteria},...e.evidence===void 0?{}:{evidence:e.evidence}})),planPhase:S.getPlanPhase(),mission:xe?C.getMission():void 0,workingMemory:Se?T.getWorkingMemory():void 0,focus:V?w.getFocus():void 0,focuses:V?w.getFocuses():[],trace:F&&W.agent?.spans?{spans:W.agent.spans.value,metrics:Hl(W.agent.spans.value)}:void 0,actions:Mh(e.actions??{}),subagent:{enabled:!!Le,maxDepth:e.subagent?.maxDepth??1,maxParallel:e.subagent?.maxParallel??4,allowedTools:e.subagent?.allowedTools??[],subagents:U?.get()??[],active:Oe?.getActive()??[],history:Oe?.getHistory()??[]},verify:{enabled:!!Ve,maxAttempts:Ae?ke:0,adversarial:Ae&&!!e.verify?.adversarial},context:(()=>{let e=He?.getSnapshot();if(e){let t=W.agent?.getState?.()?.lastCompression;t&&(e.compression=t)}return e})(),mcp:{servers:W.mcpServers},lastCompression:W.agent?.getState?.()?.lastCompression,checkpoints:j?{enabled:!0,auto:M,list:j.list()}:void 0}},getMission(){return xe?C.getMission():void 0},setMission(t){if(!xe){e.debug&&console.warn(`[page-agent-sdk][mission] capabilities.missionAnchor 关闭,setMission 忽略`);return}C.setMission(t),W.infoTick.value++},getFocus(){return V?w.getFocus():void 0},getFocuses(){return V?w.getFocuses():[]},setFocus(t){let n=eg(t,`setFocus`,V,()=>re()?.schema,e.debug);return n.ok?(w.setFocus(t),W.infoTick.value++,{ok:!0}):n},addFocus(t){let n=eg(t,`addFocus`,V,()=>re()?.schema,e.debug);return n.ok?w.getFocuses().length>=8?(e.debug&&console.warn(`[page-agent-sdk][focus] addFocus 拒绝:焦点数已达上限 8(augmentPrompt 注入每焦点子树 schema,过多致 system prompt 超预算)`),{ok:!1,error:`焦点数上限 8(避免 system prompt 撑爆)`}):(w.addFocus(t),W.infoTick.value++,{ok:!0}):n},removeFocus(e){V&&(w.removeFocus(e),W.infoTick.value++)},clearFocus(){V&&(w.clearFocus(),W.infoTick.value++)}};async function pt(){if(!s)return;await s.ready;let t=e.session||{};if(t.id){W.sessionId=t.id;let e=await s.load(n,W.sessionId);e?(W.applySnapshot(e),qe({type:`session_restored`,sessionId:W.sessionId,rounds:e.messages?.length??0})):await s.createSession(n,t.title,W.sessionId)}else if(t.autoResume!==!1){let r=await s.listSessions(n);if(e.debug&&console.log(`[page-agent-sdk][restore] listSessions`,n,r.length,r.map(e=>e.sessionId)),r.length){W.sessionId=r[0].sessionId;let t=await s.load(n,W.sessionId);t?(W.applySnapshot(t),qe({type:`session_restored`,sessionId:W.sessionId,rounds:t.messages?.length??0}),e.debug&&console.log(`[page-agent-sdk][restore] 恢复会话`,W.sessionId,`${t.messages?.length??0} msgs`)):e.debug&&console.log(`[page-agent-sdk][restore] 会话 meta 存在但快照为空`,W.sessionId)}else W.sessionId=await s.createSession(n,t.title),e.debug&&console.log(`[page-agent-sdk][restore] 新建会话(无历史)`,W.sessionId)}else W.sessionId=await s.createSession(n,t.title);e.memory&&s.save(n,W.sessionId,{memory:E.get()||(typeof e.memory==`string`?e.memory:``)}),ct()}async function mt(){await et()}function ht(e){let t={};for(let n of qh(e)){let e=x.files[n];e&&(t[n]=e.content)}return t}function gt(){let e=Jh(x.files,qh(b));for(let t of e)delete x.files[t]}function _t(){let e=Xd(b,rt);if(!e.trimmed)return;let{older:t,summary:n}=e;if(qe({type:`context_trimmed`,dropped:t.map(e=>({round:e.round,user:e.userMsg.content,assistant:e.assistantMsgs.map(e=>e.content),steps:e.assistantMsgs.flatMap(e=>e.steps??[])})),vfsResults:ht(t.flatMap(e=>[e.userMsg,...e.assistantMsgs])),summary:n.content,reason:`max_memory_rounds`}),b.splice(e.deleteFrom,e.deleteCount,n),gt(),m&&l){let n=e.summary,{prevSeg:r}=e;(async()=>{try{let e=await l(tf(t,g)),i=b.indexOf(n);if(i<0)return;b[i].content=Yd(t,r,e),bt()}catch{}})()}}let vt,yt=!1;function bt(){if(!W.sessionId||!s)return;let t=JSON.parse(JSON.stringify(b));s.save(n,W.sessionId,{messages:t});let r=W.agent?.getState?.()?.todos??[];if(s.save(n,W.sessionId,{todos:r}),xe){let e=C.getMission();e&&s.save(n,W.sessionId,{mission:e})}if(Se){let e=T.getWorkingMemory();e&&s.save(n,W.sessionId,{workingMemory:e})}if(V){let e=w.getFocuses();s.save(n,W.sessionId,{focus:e.length?e:null})}I&&j&&(s.save(n,W.sessionId,{checkpoints:j.exportStack()}),s.save(n,W.sessionId,{usage:i}));let a=op(b);a&&a!==vt&&(vt=a,s.updateTitle(n,W.sessionId,a)),e.autoTitle!==!1&&u&&!yt&&b.some(e=>e.role===`user`)&&b.some(e=>e.role===`assistant`)&&(yt=!0,(async()=>{let e=await u(b);e&&(await s.updateTitle(n,W.sessionId,e),await ct())})()),e.debug&&console.log(`[page-agent-sdk][persist] save`,W.sessionId,`${b.length} msgs`)}return W.initDone=(async()=>{if(await pt(),await mt(),e.mcp?.length){let t=await Promise.allSettled(e.mcp.map(e=>Qf(e)));W.mcpClosers=t.flatMap(e=>e.status===`fulfilled`?[e.value.close]:[]),W.mcpServers=[],t.forEach((t,n)=>{let r=e.mcp[n],i=r.name??r.url;t.status===`fulfilled`?(W.mcpServers.push({name:i,url:r.url,toolCount:t.value.tools.length}),t.value.tools.forEach(e=>ie.set(e.name,`mcp:${i}`)),se.push(...t.value.tools)):console.warn(`[page-agent-sdk][mcp] server ${i} 连接失败:`,t.reason)}),ve=ye(),e.debug&&console.log(`[page-agent-sdk][mcp] 注入 ${se.length} 个工具,${W.mcpServers.length} 个 server`)}let t=sp(e.llm)?e.llm:await v(e.llm);W.agent=_u({llm:t,systemPrompt:L,tools:ve,middleware:nt,maxToolRounds:e.maxToolRounds,maxRetries:e.maxRetries,stallMs:e.streamStallMs??9e4,maxParallelTools:e.maxParallelTools,contextWindow:f.contextWindow,maxOutputTokens:f.maxOutputTokens,maxVerifyAttempts:Ae?ke:0,onLlmChange:e=>{y=e},onTrace:F?(e,t)=>{try{qe({type:`trace`,spans:e,metrics:t})}catch{}}:void 0,debug:e.debug}),D.current=W.agent,Re&&Re.setReconfigureHook&&Re.setReconfigureHook(()=>{W.agent&&W.agent.setTools(ye())})})(),W}function ng(e,t){let n=e.id??vp();e.id||console.warn(`[page-agent-sdk] 未传 options.id,已生成随机 id "${n}"。刷新后持久化数据无法恢复,请传稳定 id。`);let r=e.streaming??!0,i=e.ui??`default`,a,o=e.shareContext?Zh.get(n):void 0;o?a=o:(a=tg(e,n),e.shareContext&&Zh.set(n,a)),a.refCount++;let s=null,c=Wp(e),l=null,u=null;async function d(n){if(await a.initDone,s){s.show();return}n!==void 0&&(e.container=n);let o=()=>{a.store&&(l=()=>{a.vfsStore.flush?.(),a.store.flush()},u=()=>{document.visibilityState===`hidden`&&a.store.flush()},typeof window<`u`&&window.addEventListener(`pagehide`,l),typeof document<`u`&&document.addEventListener(`visibilitychange`,u))};if(i===!1||!t){i!==!1&&console.warn(`[page-agent-sdk/headless] 未含 UI 组件,ui 渲染降级 headless;如需 UI 请 import page-agent-sdk 主包`),o();return}let d=typeof e.container==`string`?document.querySelector(e.container):e.container;if(!d)throw Error(`createChatSdk: 挂载点未找到(${e.container})`);s=t({el:d,core:a,dialogCfg:c,streaming:r,runSerial:a.runSerial,hide:p,unmount:f,onDialogUnmounted:()=>{s=null,a.release()}}),c.drawer===!0&&c.drawerHidden===!0&&s.hide(),o()}function f(){a.abortAllActive(),a.resolveConflict(`keep_external`),l&&typeof window<`u`&&window.removeEventListener(`pagehide`,l),u&&typeof document<`u`&&document.removeEventListener(`visibilitychange`,u),l=null,u=null,s?s.unmount():a.release()}function p(){s?.hide()}function m(){s?.show()}return{mount:d,unmount:f,hide:p,show:m,send:(e,t)=>a.runSerial(async()=>{let{controller:n,untrack:r}=a.trackActive(t?.signal);try{return await a.send(e,{...t,signal:n.signal})}finally{r()}}),batch:(e,t,n)=>a.runSerial(async()=>{let{controller:r,untrack:i}=a.trackActive(n);try{return await a.batch(e,t,r.signal)}finally{i()}}),switchSession:(...e)=>a.runSerial(async()=>(a.abortAllActive(),a.switchSession(...e))),resetSession:()=>a.resetSession(),sessions:a.sessions,async listSessions(){return a.store?a.store.listSessions(n):[]},async deleteSession(e){if(a.store){if(e===a.sessionId){console.warn(`[page-agent-sdk] deleteSession 忽略:不能删除当前会话,请先 switchSession 切到其他会话`);return}await a.store.deleteSession(n,e),await a.refreshSessions()}},get sessionId(){return a.sessionId},stream:(e,t,n)=>a.stream(e,t,n),afterRound:a.afterRound,get debugLogs(){return a.agent.debugLogs},infoTick:a.infoTick,inspect:a.getInfo,inspectContext:()=>a.getInfo().context,getMission:a.getMission,setMission:a.setMission,getFocus:a.getFocus,getFocuses:a.getFocuses,setFocus:a.setFocus,addFocus:a.addFocus,removeFocus:a.removeFocus,clearFocus:a.clearFocus,messages:a.messages,restoreLastCheckpoint:()=>a.checkpoint?.restore()??!1,listCheckpoints:()=>a.checkpoint?.list()??[],hook:e=>(a.listeners.add(e),()=>a.listeners.delete(e)),setData:e=>{if(!a.dataOpsController){console.warn(`[page-agent-sdk] setData 忽略:dataOps 已关闭(capabilities.dataOps:false)`);return}a.dataOpsController.set(e),a.infoTick.value++},getData:()=>a.liveData(),setSkills:e=>{let t=a.skillsController;if(!t){console.warn(`[page-agent-sdk] setSkills 忽略:skills 已关闭(capabilities.skills:false)`);return}t.set(e),a.unloadSkillTools?.(),a.infoTick.value++},addSkill:e=>{if(!a.skillsController){console.warn(`[page-agent-sdk] addSkill 忽略:skills 已关闭(capabilities.skills:false)`);return}a.addSkill(e),a.unloadSkillTools?.(e.name)},removeSkill:e=>{if(!a.skillsController)return console.warn(`[page-agent-sdk] removeSkill 忽略:skills 已关闭(capabilities.skills:false)`),!1;let t=a.removeSkill(e);return t&&a.unloadSkillTools?.(e),t},listUserSkills:()=>a.listUserSkills(),getUserSkill:e=>a.getUserSkill(e),invalidateSkillCache:e=>{let t=a.skillsController;if(!t){console.warn(`[page-agent-sdk] invalidateSkillCache 忽略:skills 已关闭(capabilities.skills:false)`);return}t.invalidateCache(e),a.unloadSkillTools?.(e)},exportData:()=>{let e=a.liveData()?.bind;return e==null?null:JSON.parse(JSON.stringify(e))},importData:(e,t)=>{let n=a.liveData();if(!n||!a.dataOpsController)return{ok:!1,error:`dataOps 未开启或无主数据`};let r=n.bind;if(typeof r!=`object`||!r)return{ok:!1,error:`主数据 bind 非对象,无法就地还原(集成方应用对象包裹)`};if(t?.validate!==!1){let t=n.schema.safeParse(e);if(!t.success)return{ok:!1,error:`schema 校验失败:`+(t.error?.message??`未知错误`)}}return Ld(r,e),a.dataOpsController?.markDataDirty?.(),t?.emit!==!1&&a.emit({type:`data_change`,operation:`set`,value:r}),{ok:!0}},vfsWrite:(e,t)=>{let n=typeof t==`string`?t:JSON.stringify(t);a.vfsStore.files[wm(e)]={content:n,updatedAt:Date.now()}},createResource:(e,t)=>{let n=a.dataOpsController;if(!n?.createResource)throw Error(`[page-agent-sdk] createResource 不可用:需配 data.resources + vfsStore(capabilities.vfs 默认开)`);return n.createResource(e,t)},getResource:e=>a.dataOpsController?.getResource?.(e),updateResource:(e,t)=>{let n=a.dataOpsController;if(!n?.updateResource)throw Error(`[page-agent-sdk] updateResource 不可用:需配 data.resources + vfsStore`);n.updateResource(e,t)},deleteResource:e=>a.dataOpsController?.deleteResource?.(e)??!1,listResources:()=>a.dataOpsController?.listResources?.()??[],releaseResources:e=>{let t=a.dataOpsController;if(!(!t?.listResources||!t.deleteResource))if(e&&e.length)for(let n of e)t.deleteResource(n);else for(let e of t.listResources())t.deleteResource(e.path)},usage:a.usage,pendingConflict:a.pendingConflict,resolveConflict:e=>a.resolveConflict(e),setTools:e=>a.setTools(e),addTool:e=>a.addTool(e),removeTool:e=>a.removeTool(e),setLlm:e=>a.setLlm(e),setMemory:e=>a.setMemory(e),refreshMemory:()=>a.refreshMemory(),setSubagents:e=>a.setSubagents(e),addSubagent:e=>a.addSubagent(e),removeSubagent:e=>a.removeSubagent(e),getActiveSubagents:()=>a.getActiveSubagents(),get subagentHistory(){return a.subagentHistory}}}function rg(e={}){let{fetchResponse:t,fetchStream:n,onPersist:r,onClear:i,onQueuedCleared:a}=e,o=rn({messages:e.messages??[],loading:!1,error:null}),s=_n(null),c=_n(!0),l=null,u=_n([]),d=_n(null);function f(){}function p(e){let t=s.value;e.deltaY<0?c.value=!1:t&&(c.value=t.scrollHeight-t.scrollTop-t.clientHeight<64)}function m(){s.value&&requestAnimationFrame(()=>{let e=s.value;!e||!c.value||(e.scrollTop=e.scrollHeight)})}function h(e,t,n){o.messages.push({role:e,content:t,timestamp:Date.now(),...n&&n.length?{focuses:n}:{}}),c.value=!0,m()}async function g(e){if(c.value=!0,n){let t=rn({role:`assistant`,content:``,timestamp:Date.now(),reasoning:``,steps:[]}),r=!1;o.messages.push(t);try{await n(o.messages.slice(0,-1),e=>{switch(e.type){case`round_start`:e.round>1&&(t.content||t.reasoning)&&(r=!0);break;case`reasoning`:r&&=(t.reasoning+=`
90
90
  `,!1),t.reasoning+=e.delta;break;case`text`:r&&=(t.content+=`
91
- `,!1),t.content+=e.delta;break;case`tool_call`:t.steps.push({name:e.name,args:e.args,status:`running`});break;case`tool_result`:for(let n=t.steps.length-1;n>=0;n--)if(t.steps[n].name===e.name&&t.steps[n].status===`running`){t.steps[n].result=e.result,t.steps[n].status=e.status,t.steps[n].durationMs=e.durationMs;break}break;case`subagent`:{let n=t.steps[t.steps.length-1];if(!n)break;n.children||=[];let r=e.label?`[${e.label}] ${e.name}`:e.name;if(e.kind===`tool_call`)n.children.push({name:r,args:e.args,status:`running`});else for(let t=n.children.length-1;t>=0;t--)if(n.children[t].status===`running`&&n.children[t].name===r){n.children[t].result=e.result,n.children[t].status=e.status||`done`;break}break}case`approval_request`:d.value={toolName:e.toolName,args:e.args,resolve:e.resolve};break}m()},e)}catch(n){if(Wl(n,e)||(o.error=n.message||`请求失败,请重试`),!t.content&&!t.reasoning){let e=o.messages.indexOf(t);e>=0&&o.messages.splice(e,1)}}finally{await _()}return}try{h(`assistant`,await(t||x)(o.messages,e))}catch(t){Wl(t,e)||(o.error=t.message||`请求失败,请重试`)}finally{await _()}}async function _(){try{await r?.(o.messages)}catch{}o.loading=!1,l=null;let e=u.value.shift();e!==void 0&&(h(`user`,e),o.loading=!0,o.error=null,l=new AbortController,await g(l.signal))}function v(e){u.value.splice(e,1)}async function y(e,t){if(e.trim()){if(o.loading){u.value.push(e.trim());return}h(`user`,e.trim(),t),o.loading=!0,o.error=null,l=new AbortController,await g(l.signal)}}async function b(){if(o.loading)return;let e=o.messages;for(let t=e.length-1;t>=0;t--)if(e[t].role===`assistant`){e.splice(t);break}e.some(e=>e.role===`user`)&&(o.loading=!0,o.error=null,l=new AbortController,await g(l.signal))}async function x(e){return await new Promise(e=>setTimeout(e,800+Math.random()*1200)),`收到你的消息:"${e.filter(e=>e.role===`user`).pop()?.content}"。这是一个模拟回复,请接入实际的 AI API。`}function S(){i?.(),o.messages.splice(0,o.messages.length),o.error=null}function C(){u.value.length&&a?.([...u.value]),u.value=[],l?.abort()}function w(){u.value=[],l?.abort(),l=null,o.loading=!1,o.error=null,d.value=null}function T(e){let t=d.value;t&&(d.value=null,t.resolve(e))}async function E(){if(!o.error)return;let e=o.messages,t=-1;for(let n=e.length-1;n>=0;n--)if(e[n].role===`user`){t=n;break}if(t<0)return;let n=e[t].content;e.splice(t),o.error=null,await y(n)}return{state:o,scrollContainer:s,pendingApproval:d,queuedTasks:u,sendMessage:y,removeQueuedTask:v,clearMessages:S,stop:C,reset:w,retry:E,regenerate:b,resolveApproval:T,onScroll:f,onWheel:p}}async function ig(e){try{let t=globalThis.navigator?.clipboard;if(t&&typeof t.writeText==`function`)return await t.writeText(e),!0}catch{}try{let t=globalThis.document;if(!t||!t.body)return!1;let n=t.createElement(`textarea`);n.value=e,n.setAttribute(`readonly`,``),n.style.position=`fixed`,n.style.top=`0`,n.style.left=`0`,n.style.opacity=`0`,t.body.appendChild(n),n.select();let r=t.execCommand(`copy`);return t.body.removeChild(n),r}catch{return!1}}var ag=Symbol(`chatContext`);function og(e={}){let t=rg({fetchResponse:e.fetchResponse,fetchStream:e.fetchStream,messages:e.messages,onPersist:e.onPersist,onClear:e.onClear,onQueuedCleared:e.onQueuedCleared}),{state:n,sendMessage:r,removeQueuedTask:i,queuedTasks:a}=t,o=_n(``),s=_n(!0),c=()=>{s.value=!s.value},l=_n(!1),u=()=>{l.value=!0},d=()=>{l.value=!1},f=_n(!1),p=()=>{f.value=!0},m=()=>{f.value=!1},h=_n({}),g=e=>h.value[e]!==!1,_=e=>{h.value[e]=!g(e)},v=_n(!1),y=e=>{ig(e).then(e=>{e&&(v.value=!0,setTimeout(()=>{v.value=!1},1500))})},b=Ks(()=>{let t=e.getInfo?.();return{mcp:t?.mcp?.servers?.length??0,tools:t?.tools?.length??0}}),x=Ks(()=>(n.messages.length,typeof e.canUndo==`function`&&!!e.canUndo())),S=()=>{e.onUndo?.()&&(n.error=null)},C=e=>new Date(e).toLocaleTimeString(`zh-CN`,{hour:`2-digit`,minute:`2-digit`}),w=()=>{o.value.trim()&&(r(o.value,O.value),o.value=``)},T=e=>{e.isComposing||e.keyCode===229||e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),w())},E=e=>{o.value=a.value[e]||``,i(e)},D=e=>{let t=n.messages,r=t[e];if(!r||r.role!==`assistant`)return!1;let i=`reasoning`in r?r.reasoning:void 0;return n.loading&&e===t.length-1&&!r.content&&!i},O=Ks(()=>(e.infoTick?.value,e.getFocuses?.()??[]));return{chat:t,inputText:o,isExpanded:s,toggleCollapse:c,debugVisible:l,openDebug:u,closeDebug:d,skillVisible:f,openSkill:p,closeSkill:m,reasoningExpanded:h,isReasoningExpanded:g,toggleReasoning:_,copiedMsg:v,copyMessage:y,summary:b,canUndo:x,undo:S,formatTime:C,send:w,keydown:T,editQueued:E,isPendingAssistant:D,focuses:O,addFocus:t=>e.onAddFocus?e.onAddFocus(t):{ok:!1,error:`focus 未启用`},removeFocus:t=>{e.onRemoveFocus?.(t)},clearFocus:()=>{e.onClearFocus?.()},focusChipClick:t=>{e.onFocusChipClick?.(t)}}}function sg(){let e=qr(ag);if(!e)throw Error(`useChatContext 必须在 provide(chatContextKey) 的组件子树内调用`);return e}var cg={class:`chat-header`},lg={class:`header-left`},ug={class:`header-title`},dg={key:0,class:`status-dot pulse`},fg=[`data-sid`,`onClick`],pg={class:`hist-title`},mg={class:`hist-meta`},hg=[`onClick`],gg={key:0,class:`debug-badge`},_g={key:0,class:`more-item-badge`},vg=[`disabled`],yg=ki({__name:`ChatHeader`,props:{title:{},drawer:{type:Boolean},debugLogs:{},skillAvailable:{type:Boolean},sessions:{},currentSessionId:{},onNewSession:{type:Function},onOpenSession:{type:Function},onRemoveSession:{type:Function}},emits:[`close`],setup(e){let t=e,n=sg(),{chat:r}=n,{state:i,reset:a,clearMessages:o}=r,s=_n(!1),c=_n(!1),l=Ks(()=>i.messages.length>0),u=Ks(()=>(t.debugLogs?.length??0)>0);function d(e){let t=Date.now()-e;return t<6e4?`刚刚`:t<36e5?Math.floor(t/6e4)+`分钟前`:new Date(e).toLocaleString()}function f(){a(),t.onNewSession?.()}function p(e){a(),t.onOpenSession?.(e)}return(t,r)=>(Y(),X(`div`,cg,[Z(`div`,lg,[r[10]||=Z(`span`,{class:`header-icon`},`🤖`,-1),Z(`span`,ug,U(e.title),1),K(i).loading?(Y(),X(`span`,dg)):Q(``,!0)]),Z(`div`,{class:`header-actions`,onClick:r[8]||=pl(()=>{},[`stop`])},[e.sessions?(Y(),X(`button`,{key:0,class:`action-btn`,"data-test":`new-chat`,title:`新建会话`,onClick:f},[...r[11]||=[Z(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},[Z(`path`,{d:`M12 5v14M5 12h14`})],-1)]])):Q(``,!0),e.sessions?(Y(),X(`button`,{key:1,class:H([`action-btn`,{active:c.value}]),"data-test":`toggle-history`,title:`历史记录`,onClick:r[0]||=e=>{s.value=!1,c.value=!c.value}},[...r[12]||=[Z(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},[Z(`path`,{d:`M3 12a9 9 0 1 0 3-6.7L3 8`}),Z(`path`,{d:`M3 3v5h5`}),Z(`path`,{d:`M12 7v5l3 2`})],-1)]],2)):Q(``,!0),e.sessions&&c.value?(Y(),X(`div`,{key:2,class:`cs-history-menu`,onClick:r[1]||=pl(()=>{},[`stop`])},[(Y(!0),X(J,null,ta(e.sessions,t=>(Y(),X(`div`,{key:t.sessionId,class:H([`hist-item`,{active:e.currentSessionId===t.sessionId}]),"data-sid":t.sessionId,onClick:e=>p(t.sessionId)},[Z(`div`,pg,U(t.title||`会话 `+t.sessionId.slice(-6)),1),Z(`div`,mg,[Z(`span`,null,U(d(t.lastAccessed)),1),e.currentSessionId===t.sessionId?Q(``,!0):(Y(),X(`button`,{key:0,class:`hist-del`,"data-test":`del-btn`,onClick:pl(n=>e.onRemoveSession?.(t.sessionId),[`stop`])},`✕`,8,hg))])],10,fg))),128))])):Q(``,!0),Z(`button`,{class:H([`action-btn more-btn`,{active:s.value}]),title:`更多`,onClick:r[2]||=e=>{c.value=!1,s.value=!s.value}},[r[13]||=Z(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`currentColor`},[Z(`circle`,{cx:`12`,cy:`5`,r:`1.6`}),Z(`circle`,{cx:`12`,cy:`12`,r:`1.6`}),Z(`circle`,{cx:`12`,cy:`19`,r:`1.6`})],-1),u.value?(Y(),X(`span`,gg,U(e.debugLogs?.length),1)):Q(``,!0)],2),s.value?(Y(),X(`div`,{key:3,class:`more-menu`,onClick:r[6]||=pl(()=>{},[`stop`])},[Z(`button`,{class:`more-item`,title:`日志 / 执行流程 / Agent 信息`,onClick:r[3]||=e=>{K(n).openDebug(),s.value=!1}},[r[14]||=Z(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},[Z(`path`,{d:`M9 2v8l-3 3v2h12v-2l-3-3V2`}),Z(`path`,{d:`M9 2h6`}),Z(`path`,{d:`M9 18h6`})],-1),r[15]||=Z(`span`,null,`调试 / 日志`,-1),u.value?(Y(),X(`span`,_g,U(e.debugLogs?.length),1)):Q(``,!0)]),e.skillAvailable?(Y(),X(`button`,{key:0,class:`more-item`,title:`创建 / 管理自定义 Skill`,onClick:r[4]||=e=>{K(n).openSkill(),s.value=!1}},[...r[16]||=[Z(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},[Z(`path`,{d:`M12 2l2.4 7.4H22l-6 4.4 2.3 7.2L12 16.8 5.7 21l2.3-7.2-6-4.4h7.6z`})],-1),Z(`span`,null,`Skill 管理`,-1)]])):Q(``,!0),Z(`button`,{class:`more-item`,title:`清空对话`,disabled:!l.value,onClick:r[5]||=e=>{K(o)(),s.value=!1}},[...r[17]||=[Z(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},[Z(`polyline`,{points:`3 6 5 6 21 6`}),Z(`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`})],-1),Z(`span`,null,`清空对话`,-1)]],8,vg)])):Q(``,!0),e.drawer?(Y(),X(`button`,{key:4,class:`action-btn`,title:`关闭`,onClick:r[7]||=e=>t.$emit(`close`)},[...r[18]||=[Z(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},[Z(`path`,{d:`M18 6L6 18M6 6l12 12`})],-1)]])):Q(``,!0)]),s.value||c.value?(Y(),X(`div`,{key:0,class:`more-overlay`,onClick:r[9]||=e=>{s.value=!1,c.value=!1}})):Q(``,!0)]))}}),bg=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},xg=bg(yg,[[`__scopeId`,`data-v-faeba147`]]),Sg={key:0,class:`focus-bar`},Cg={class:`focus-bar-text`},wg={key:0,class:`focus-bar-label`},Tg={class:`focus-bar-path`},Eg={key:0,class:`focus-edit-row`},Dg=bg(ki({__name:`FocusBar`,props:{getFocus:{type:Function},onSetFocus:{type:Function},onClearFocus:{type:Function},infoTick:{}},setup(e){let t=e,n=Ks(()=>(t.infoTick?.value,t.getFocus?.())),r=_n(!1),i=_n(``),a=_n(``);function o(){let e=i.value.trim();if(!e||!t.onSetFocus)return;let n=a.value.trim();t.onSetFocus({path:e,...n?{label:n}:{}})?.ok&&(r.value=!1,i.value=``,a.value=``)}function s(){t.onClearFocus?.(),r.value=!1}return(e,t)=>n.value?(Y(),X(`div`,Sg,[t[3]||=Z(`span`,{class:`focus-bar-icon`},`🎯`,-1),Z(`span`,Cg,[n.value.label?(Y(),X(`span`,wg,U(n.value.label),1)):Q(``,!0),Z(`code`,Tg,U(n.value.path),1)]),Z(`button`,{class:`focus-bar-btn`,title:`切换聚焦路径`,onClick:t[0]||=e=>r.value=!r.value},`▾`),Z(`button`,{class:`focus-bar-btn`,title:`退出精修`,"data-test":`focus-clear`,onClick:s},`✕`),r.value?(Y(),X(`div`,Eg,[Wr(Z(`input`,{"onUpdate:modelValue":t[1]||=e=>i.value=e,class:`focus-edit-input`,placeholder:`jsonPath,如 components.3`,"data-test":`focus-path-input`,onKeyup:hl(o,[`enter`])},null,544),[[ul,i.value]]),Wr(Z(`input`,{"onUpdate:modelValue":t[2]||=e=>a.value=e,class:`focus-edit-input focus-edit-label`,placeholder:`标签(可选)`,onKeyup:hl(o,[`enter`])},null,544),[[ul,a.value]]),Z(`button`,{class:`focus-edit-go`,"data-test":`focus-submit`,onClick:o},`聚焦`)])):Q(``,!0)])):Q(``,!0)}}),[[`__scopeId`,`data-v-0d078a41`]]),Og={class:`reasoning-toggle`},kg={key:0,class:`reasoning-body`},Ag=bg(ki({__name:`MessageReasoning`,props:{text:{},expanded:{type:Boolean}},emits:[`toggle`],setup(e){return(t,n)=>e.text?(Y(),X(`div`,{key:0,class:H([`reasoning-block`,{expanded:e.expanded}])},[Z(`div`,{class:`reasoning-header`,onClick:n[0]||=e=>t.$emit(`toggle`)},[n[1]||=Z(`span`,{class:`status-dot ok`},null,-1),n[2]||=Z(`span`,{class:`reasoning-title`},`思考过程`,-1),Z(`span`,Og,U(e.expanded?`收起`:`展开`),1)]),e.expanded?(Y(),X(`div`,kg,U(e.text),1)):Q(``,!0)],2)):Q(``,!0)}}),[[`__scopeId`,`data-v-01f28016`]]),jg={key:0,class:`steps-block`},Mg={class:`step-head`},Ng={class:`step-name`},Pg={key:0,class:`step-count`},Fg={key:1,class:`step-duration`},Ig={key:0,class:`step-children`},Lg={class:`step-name`},Rg={key:0,class:`step-status running`},zg=bg(ki({__name:`MessageSteps`,props:{steps:{}},setup(e){let t=e;function n(e){return e===`running`?`执行中`:e===`error`?`失败`:`成功`}function r(e){let t=[];for(let n of e){let e=t.length?t[t.length-1]:null;e&&e.name===n.name?(e.count++,n.status===`running`&&(e.hasRunning=!0),n.status===`error`&&(e.hasError=!0),n.durationMs&&(e.totalMs+=n.durationMs),n.children?.length&&e.children.push(...n.children)):t.push({name:n.name,count:1,hasRunning:n.status===`running`,hasError:n.status===`error`,children:n.children?.length?[...n.children]:[],totalMs:n.durationMs??0})}return t.map(e=>({name:e.name,count:e.count,status:e.hasError?`error`:e.hasRunning?`running`:`done`,children:e.children,durationMs:e.totalMs||void 0}))}let i=Ks(()=>r(t.steps));return(t,r)=>e.steps.length?(Y(),X(`div`,jg,[(Y(!0),X(J,null,ta(i.value,(e,t)=>(Y(),X(`div`,{key:t,class:H([`step-item`,e.status])},[Z(`div`,Mg,[Z(`span`,{class:H([`status-dot`,e.status])},null,2),Z(`span`,Ng,U(e.name),1),e.count>1?(Y(),X(`span`,Pg,`×`+U(e.count),1)):Q(``,!0),Z(`span`,{class:H([`step-status`,e.status])},U(n(e.status)),3),e.durationMs!=null&&e.status!==`running`?(Y(),X(`span`,Fg,U(e.durationMs)+`ms`,1)):Q(``,!0)]),e.children&&e.children.length?(Y(),X(`div`,Ig,[r[0]||=Z(`div`,{class:`step-children-label`},`🧬 子 agent 进度`,-1),(Y(!0),X(J,null,ta(e.children,(e,t)=>(Y(),X(`div`,{key:t,class:H([`step-child`,e.status])},[Z(`span`,{class:H([`status-dot sm`,e.status])},null,2),Z(`span`,Lg,U(e.name),1),e.status===`running`?(Y(),X(`span`,Rg,`…`)):Q(``,!0)],2))),128))])):Q(``,!0)],2))),128))])):Q(``,!0)}}),[[`__scopeId`,`data-v-c9f48455`]]);function Bg(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var Vg=Bg();function Hg(e){Vg=e}var Ug={exec:()=>null};function Wg(e){let t=[];return n=>{let r=Math.max(0,Math.min(3,n-1)),i=t[r];return i||(i=e(r),t[r]=i),i}}function Gg(e,t=``){let n=typeof e==`string`?e:e.source,r={replace:(e,t)=>{let i=typeof t==`string`?t:t.source;return i=i.replace(qg.caret,`$1`),n=n.replace(e,i),r},getRegex:()=>new RegExp(n,t)};return r}var Kg=((e=``)=>{try{return!!RegExp(`(?<=1)(?<!1)`+e)}catch{return!1}})(),qg={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:Wg(e=>RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:Wg(e=>RegExp(`^ {0,${e}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)),fencesBeginRegex:Wg(e=>RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)),headingBeginRegex:Wg(e=>RegExp(`^ {0,${e}}#`)),htmlBeginRegex:Wg(e=>RegExp(`^ {0,${e}}<(?:[a-z].*>|!--)`,`i`)),blockquoteBeginRegex:Wg(e=>RegExp(`^ {0,${e}}>`))},Jg=/^(?:[ \t]*(?:\n|$))+/,Yg=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Xg=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,Zg=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,Qg=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,$g=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,e_=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,t_=Gg(e_).replace(/bull/g,$g).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,``).getRegex(),n_=Gg(e_).replace(/bull/g,$g).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),r_=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,i_=/^[^\n]+/,a_=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,o_=Gg(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace(`label`,a_).replace(`title`,/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),s_=Gg(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,$g).getRegex(),c_=`address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul`,l_=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,u_=Gg(`^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>[^\\n]*\\n+|$)|<![A-Z][\\s\\S]*?(?:>[^\\n]*\\n+|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>[^\\n]*\\n+|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))`,`i`).replace(`comment`,l_).replace(`tag`,c_).replace(`attribute`,/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),d_=e=>Gg(r_).replace(`hr`,Zg).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,e).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,c_).getRegex(),f_=d_(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/),p_=d_(/ {0,3}(?:[*+-]|\d{1,9}[.)])[ \t]+[^ \t\n]/),m_={blockquote:Gg(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace(`paragraph`,p_).getRegex(),code:Yg,def:o_,fences:Xg,heading:Qg,hr:Zg,html:u_,lheading:t_,list:s_,newline:Jg,paragraph:f_,table:Ug,text:i_},h_=Gg(`^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)`).replace(`hr`,Zg).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`blockquote`,` {0,3}>`).replace(`code`,`(?: {4}| {0,3} )[^\\n]`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]`).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,c_).getRegex(),g_={...m_,lheading:n_,table:h_,paragraph:Gg(r_).replace(`hr`,Zg).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`table`,h_).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]`).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,c_).getRegex()},__={...m_,html:Gg(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace(`comment`,l_).replace(/tag/g,`(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b`).getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Ug,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:Gg(r_).replace(`hr`,Zg).replace(`heading`,` *#{1,6} *[^
91
+ `,!1),t.content+=e.delta;break;case`tool_call`:t.steps.push({name:e.name,args:e.args,status:`running`});break;case`tool_result`:for(let n=t.steps.length-1;n>=0;n--)if(t.steps[n].name===e.name&&t.steps[n].status===`running`){t.steps[n].result=e.result,t.steps[n].status=e.status,t.steps[n].durationMs=e.durationMs;break}break;case`subagent`:{let n=t.steps[t.steps.length-1];if(!n)break;n.children||=[];let r=e.label?`[${e.label}] ${e.name}`:e.name;if(e.kind===`tool_call`)n.children.push({name:r,args:e.args,status:`running`});else for(let t=n.children.length-1;t>=0;t--)if(n.children[t].status===`running`&&n.children[t].name===r){n.children[t].result=e.result,n.children[t].status=e.status||`done`;break}break}case`approval_request`:d.value={toolName:e.toolName,args:e.args,resolve:e.resolve};break}m()},e)}catch(n){if(Wl(n,e)||(o.error=n.message||`请求失败,请重试`),!t.content&&!t.reasoning){let e=o.messages.indexOf(t);e>=0&&o.messages.splice(e,1)}}finally{await _()}return}try{h(`assistant`,await(t||x)(o.messages,e))}catch(t){Wl(t,e)||(o.error=t.message||`请求失败,请重试`)}finally{await _()}}async function _(){try{await r?.(o.messages)}catch{}o.loading=!1,l=null;let e=u.value.shift();e!==void 0&&(h(`user`,e),o.loading=!0,o.error=null,l=new AbortController,await g(l.signal))}function v(e){u.value.splice(e,1)}async function y(e,t){if(e.trim()){if(o.loading){u.value.push(e.trim());return}h(`user`,e.trim(),t),o.loading=!0,o.error=null,l=new AbortController,await g(l.signal)}}async function b(){if(o.loading)return;let e=o.messages;for(let t=e.length-1;t>=0;t--)if(e[t].role===`assistant`){e.splice(t);break}e.some(e=>e.role===`user`)&&(o.loading=!0,o.error=null,l=new AbortController,await g(l.signal))}async function x(e){return await new Promise(e=>setTimeout(e,800+Math.random()*1200)),`收到你的消息:"${e.filter(e=>e.role===`user`).pop()?.content}"。这是一个模拟回复,请接入实际的 AI API。`}function S(){i?.(),o.messages.splice(0,o.messages.length),o.error=null}function C(){u.value.length&&a?.([...u.value]),u.value=[],l?.abort()}function w(){u.value=[],l?.abort(),l=null,o.loading=!1,o.error=null,d.value=null}function T(e){let t=d.value;t&&(d.value=null,t.resolve(e))}async function E(){if(!o.error)return;let e=o.messages,t=-1;for(let n=e.length-1;n>=0;n--)if(e[n].role===`user`){t=n;break}if(t<0)return;let n=e[t].content;e.splice(t),o.error=null,await y(n)}return{state:o,scrollContainer:s,pendingApproval:d,queuedTasks:u,sendMessage:y,removeQueuedTask:v,clearMessages:S,stop:C,reset:w,retry:E,regenerate:b,resolveApproval:T,onScroll:f,onWheel:p}}async function ig(e){try{let t=globalThis.navigator?.clipboard;if(t&&typeof t.writeText==`function`)return await t.writeText(e),!0}catch{}try{let t=globalThis.document;if(!t||!t.body)return!1;let n=t.createElement(`textarea`);n.value=e,n.setAttribute(`readonly`,``),n.style.position=`fixed`,n.style.top=`0`,n.style.left=`0`,n.style.opacity=`0`,t.body.appendChild(n),n.select();let r=t.execCommand(`copy`);return t.body.removeChild(n),r}catch{return!1}}var ag=Symbol(`chatContext`);function og(e={}){let t=rg({fetchResponse:e.fetchResponse,fetchStream:e.fetchStream,messages:e.messages,onPersist:e.onPersist,onClear:e.onClear,onQueuedCleared:e.onQueuedCleared}),{state:n,sendMessage:r,removeQueuedTask:i,queuedTasks:a}=t,o=_n(``),s=_n(!0),c=()=>{s.value=!s.value},l=_n(!1),u=()=>{l.value=!0},d=()=>{l.value=!1},f=_n(!1),p=()=>{f.value=!0},m=()=>{f.value=!1},h=_n({}),g=e=>h.value[e]!==!1,_=e=>{h.value[e]=!g(e)},v=_n(!1),y=e=>{ig(e).then(e=>{e&&(v.value=!0,setTimeout(()=>{v.value=!1},1500))})},b=Ks(()=>{let t=e.getInfo?.();return{mcp:t?.mcp?.servers?.length??0,tools:t?.tools?.length??0}}),x=Ks(()=>(n.messages.length,typeof e.canUndo==`function`&&!!e.canUndo())),S=()=>{e.onUndo?.()&&(n.error=null)},C=e=>new Date(e).toLocaleTimeString(`zh-CN`,{hour:`2-digit`,minute:`2-digit`}),w=()=>{o.value.trim()&&(r(o.value,O.value),o.value=``)},T=e=>{e.isComposing||e.keyCode===229||e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),w())},E=e=>{o.value=a.value[e]||``,i(e)},D=e=>{let t=n.messages,r=t[e];if(!r||r.role!==`assistant`)return!1;let i=`reasoning`in r?r.reasoning:void 0;return n.loading&&e===t.length-1&&!r.content&&!i},O=Ks(()=>(e.infoTick?.value,e.getFocuses?.()??[]));return{chat:t,inputText:o,isExpanded:s,toggleCollapse:c,debugVisible:l,openDebug:u,closeDebug:d,skillVisible:f,openSkill:p,closeSkill:m,reasoningExpanded:h,isReasoningExpanded:g,toggleReasoning:_,copiedMsg:v,copyMessage:y,summary:b,canUndo:x,undo:S,formatTime:C,send:w,keydown:T,editQueued:E,isPendingAssistant:D,focuses:O,addFocus:t=>e.onAddFocus?e.onAddFocus(t):{ok:!1,error:`focus 未启用`},removeFocus:t=>{e.onRemoveFocus?.(t)},clearFocus:()=>{e.onClearFocus?.()},focusChipClick:t=>{e.onFocusChipClick?.(t)}}}function sg(){let e=qr(ag);if(!e)throw Error(`useChatContext 必须在 provide(chatContextKey) 的组件子树内调用`);return e}var cg={class:`chat-header`},lg={class:`header-left`},ug={class:`header-title`},dg={key:0,class:`status-dot pulse`},fg=[`data-sid`,`onClick`],pg={class:`hist-title`},mg={class:`hist-meta`},hg=[`onClick`],gg={key:0,class:`debug-badge`},_g={key:0,class:`more-item-badge`},vg=[`disabled`],yg=ki({__name:`ChatHeader`,props:{title:{},drawer:{type:Boolean},debugLogs:{},skillAvailable:{type:Boolean},sessions:{},currentSessionId:{},onNewSession:{type:Function},onOpenSession:{type:Function},onRemoveSession:{type:Function}},emits:[`close`],setup(e){let t=e,n=sg(),{chat:r}=n,{state:i,reset:a,clearMessages:o}=r,s=_n(!1),c=_n(!1),l=Ks(()=>i.messages.length>0),u=Ks(()=>(t.debugLogs?.length??0)>0);function d(e){let t=Date.now()-e;return t<6e4?`刚刚`:t<36e5?Math.floor(t/6e4)+`分钟前`:new Date(e).toLocaleString()}function f(){a(),t.onNewSession?.()}function p(e){a(),t.onOpenSession?.(e)}return(t,r)=>(Y(),X(`div`,cg,[Z(`div`,lg,[r[10]||=Z(`span`,{class:`header-icon`},`🤖`,-1),Z(`span`,ug,U(e.title),1),K(i).loading?(Y(),X(`span`,dg)):Q(``,!0)]),Z(`div`,{class:`header-actions`,onClick:r[8]||=pl(()=>{},[`stop`])},[e.sessions?(Y(),X(`button`,{key:0,class:`action-btn`,"data-test":`new-chat`,title:`新建会话`,onClick:f},[...r[11]||=[Z(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},[Z(`path`,{d:`M12 5v14M5 12h14`})],-1)]])):Q(``,!0),e.sessions?(Y(),X(`button`,{key:1,class:H([`action-btn`,{active:c.value}]),"data-test":`toggle-history`,title:`历史记录`,onClick:r[0]||=e=>{s.value=!1,c.value=!c.value}},[...r[12]||=[Z(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},[Z(`path`,{d:`M3 12a9 9 0 1 0 3-6.7L3 8`}),Z(`path`,{d:`M3 3v5h5`}),Z(`path`,{d:`M12 7v5l3 2`})],-1)]],2)):Q(``,!0),e.sessions&&c.value?(Y(),X(`div`,{key:2,class:`cs-history-menu`,onClick:r[1]||=pl(()=>{},[`stop`])},[(Y(!0),X(J,null,ta(e.sessions,t=>(Y(),X(`div`,{key:t.sessionId,class:H([`hist-item`,{active:e.currentSessionId===t.sessionId}]),"data-sid":t.sessionId,onClick:e=>p(t.sessionId)},[Z(`div`,pg,U(t.title||`会话 `+t.sessionId.slice(-6)),1),Z(`div`,mg,[Z(`span`,null,U(d(t.lastAccessed)),1),e.currentSessionId===t.sessionId?Q(``,!0):(Y(),X(`button`,{key:0,class:`hist-del`,"data-test":`del-btn`,onClick:pl(n=>e.onRemoveSession?.(t.sessionId),[`stop`])},`✕`,8,hg))])],10,fg))),128))])):Q(``,!0),Z(`button`,{class:H([`action-btn more-btn`,{active:s.value}]),title:`更多`,onClick:r[2]||=e=>{c.value=!1,s.value=!s.value}},[r[13]||=Z(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`currentColor`},[Z(`circle`,{cx:`12`,cy:`5`,r:`1.6`}),Z(`circle`,{cx:`12`,cy:`12`,r:`1.6`}),Z(`circle`,{cx:`12`,cy:`19`,r:`1.6`})],-1),u.value?(Y(),X(`span`,gg,U(e.debugLogs?.length),1)):Q(``,!0)],2),s.value?(Y(),X(`div`,{key:3,class:`more-menu`,onClick:r[6]||=pl(()=>{},[`stop`])},[Z(`button`,{class:`more-item`,title:`日志 / 执行流程 / Agent 信息`,onClick:r[3]||=e=>{K(n).openDebug(),s.value=!1}},[r[14]||=Z(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},[Z(`path`,{d:`M9 2v8l-3 3v2h12v-2l-3-3V2`}),Z(`path`,{d:`M9 2h6`}),Z(`path`,{d:`M9 18h6`})],-1),r[15]||=Z(`span`,null,`调试 / 日志`,-1),u.value?(Y(),X(`span`,_g,U(e.debugLogs?.length),1)):Q(``,!0)]),e.skillAvailable?(Y(),X(`button`,{key:0,class:`more-item`,title:`创建 / 管理自定义 Skill`,onClick:r[4]||=e=>{K(n).openSkill(),s.value=!1}},[...r[16]||=[Z(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},[Z(`path`,{d:`M12 2l2.4 7.4H22l-6 4.4 2.3 7.2L12 16.8 5.7 21l2.3-7.2-6-4.4h7.6z`})],-1),Z(`span`,null,`Skill 管理`,-1)]])):Q(``,!0),Z(`button`,{class:`more-item`,title:`清空对话`,disabled:!l.value,onClick:r[5]||=e=>{K(o)(),s.value=!1}},[...r[17]||=[Z(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},[Z(`polyline`,{points:`3 6 5 6 21 6`}),Z(`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`})],-1),Z(`span`,null,`清空对话`,-1)]],8,vg)])):Q(``,!0),e.drawer?(Y(),X(`button`,{key:4,class:`action-btn`,title:`关闭`,onClick:r[7]||=e=>t.$emit(`close`)},[...r[18]||=[Z(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},[Z(`path`,{d:`M18 6L6 18M6 6l12 12`})],-1)]])):Q(``,!0)]),s.value||c.value?(Y(),X(`div`,{key:0,class:`more-overlay`,onClick:r[9]||=e=>{s.value=!1,c.value=!1}})):Q(``,!0)]))}}),bg=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},xg=bg(yg,[[`__scopeId`,`data-v-9e29849d`]]),Sg={key:0,class:`focus-bar`},Cg={class:`focus-bar-text`},wg={key:0,class:`focus-bar-label`},Tg={class:`focus-bar-path`},Eg={key:0,class:`focus-edit-row`},Dg=bg(ki({__name:`FocusBar`,props:{getFocus:{type:Function},onSetFocus:{type:Function},onClearFocus:{type:Function},infoTick:{}},setup(e){let t=e,n=Ks(()=>(t.infoTick?.value,t.getFocus?.())),r=_n(!1),i=_n(``),a=_n(``);function o(){let e=i.value.trim();if(!e||!t.onSetFocus)return;let n=a.value.trim();t.onSetFocus({path:e,...n?{label:n}:{}})?.ok&&(r.value=!1,i.value=``,a.value=``)}function s(){t.onClearFocus?.(),r.value=!1}return(e,t)=>n.value?(Y(),X(`div`,Sg,[t[3]||=Z(`span`,{class:`focus-bar-icon`},`🎯`,-1),Z(`span`,Cg,[n.value.label?(Y(),X(`span`,wg,U(n.value.label),1)):Q(``,!0),Z(`code`,Tg,U(n.value.path),1)]),Z(`button`,{class:`focus-bar-btn`,title:`切换聚焦路径`,onClick:t[0]||=e=>r.value=!r.value},`▾`),Z(`button`,{class:`focus-bar-btn`,title:`退出精修`,"data-test":`focus-clear`,onClick:s},`✕`),r.value?(Y(),X(`div`,Eg,[Wr(Z(`input`,{"onUpdate:modelValue":t[1]||=e=>i.value=e,class:`focus-edit-input`,placeholder:`jsonPath,如 components.3`,"data-test":`focus-path-input`,onKeyup:hl(o,[`enter`])},null,544),[[ul,i.value]]),Wr(Z(`input`,{"onUpdate:modelValue":t[2]||=e=>a.value=e,class:`focus-edit-input focus-edit-label`,placeholder:`标签(可选)`,onKeyup:hl(o,[`enter`])},null,544),[[ul,a.value]]),Z(`button`,{class:`focus-edit-go`,"data-test":`focus-submit`,onClick:o},`聚焦`)])):Q(``,!0)])):Q(``,!0)}}),[[`__scopeId`,`data-v-0d078a41`]]),Og={class:`reasoning-toggle`},kg={key:0,class:`reasoning-body`},Ag=bg(ki({__name:`MessageReasoning`,props:{text:{},expanded:{type:Boolean}},emits:[`toggle`],setup(e){return(t,n)=>e.text?(Y(),X(`div`,{key:0,class:H([`reasoning-block`,{expanded:e.expanded}])},[Z(`div`,{class:`reasoning-header`,onClick:n[0]||=e=>t.$emit(`toggle`)},[n[1]||=Z(`span`,{class:`status-dot ok`},null,-1),n[2]||=Z(`span`,{class:`reasoning-title`},`思考过程`,-1),Z(`span`,Og,U(e.expanded?`收起`:`展开`),1)]),e.expanded?(Y(),X(`div`,kg,U(e.text),1)):Q(``,!0)],2)):Q(``,!0)}}),[[`__scopeId`,`data-v-01f28016`]]),jg={key:0,class:`steps-block`},Mg={class:`step-head`},Ng={class:`step-name`},Pg={key:0,class:`step-count`},Fg={key:1,class:`step-duration`},Ig={key:0,class:`step-children`},Lg={class:`step-name`},Rg={key:0,class:`step-status running`},zg=bg(ki({__name:`MessageSteps`,props:{steps:{}},setup(e){let t=e;function n(e){return e===`running`?`执行中`:e===`error`?`失败`:`成功`}function r(e){let t=[];for(let n of e){let e=t.length?t[t.length-1]:null;e&&e.name===n.name?(e.count++,n.status===`running`&&(e.hasRunning=!0),n.status===`error`&&(e.hasError=!0),n.durationMs&&(e.totalMs+=n.durationMs),n.children?.length&&e.children.push(...n.children)):t.push({name:n.name,count:1,hasRunning:n.status===`running`,hasError:n.status===`error`,children:n.children?.length?[...n.children]:[],totalMs:n.durationMs??0})}return t.map(e=>({name:e.name,count:e.count,status:e.hasError?`error`:e.hasRunning?`running`:`done`,children:e.children,durationMs:e.totalMs||void 0}))}let i=Ks(()=>r(t.steps));return(t,r)=>e.steps.length?(Y(),X(`div`,jg,[(Y(!0),X(J,null,ta(i.value,(e,t)=>(Y(),X(`div`,{key:t,class:H([`step-item`,e.status])},[Z(`div`,Mg,[Z(`span`,{class:H([`status-dot`,e.status])},null,2),Z(`span`,Ng,U(e.name),1),e.count>1?(Y(),X(`span`,Pg,`×`+U(e.count),1)):Q(``,!0),Z(`span`,{class:H([`step-status`,e.status])},U(n(e.status)),3),e.durationMs!=null&&e.status!==`running`?(Y(),X(`span`,Fg,U(e.durationMs)+`ms`,1)):Q(``,!0)]),e.children&&e.children.length?(Y(),X(`div`,Ig,[r[0]||=Z(`div`,{class:`step-children-label`},`🧬 子 agent 进度`,-1),(Y(!0),X(J,null,ta(e.children,(e,t)=>(Y(),X(`div`,{key:t,class:H([`step-child`,e.status])},[Z(`span`,{class:H([`status-dot sm`,e.status])},null,2),Z(`span`,Lg,U(e.name),1),e.status===`running`?(Y(),X(`span`,Rg,`…`)):Q(``,!0)],2))),128))])):Q(``,!0)],2))),128))])):Q(``,!0)}}),[[`__scopeId`,`data-v-c9f48455`]]);function Bg(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var Vg=Bg();function Hg(e){Vg=e}var Ug={exec:()=>null};function Wg(e){let t=[];return n=>{let r=Math.max(0,Math.min(3,n-1)),i=t[r];return i||(i=e(r),t[r]=i),i}}function Gg(e,t=``){let n=typeof e==`string`?e:e.source,r={replace:(e,t)=>{let i=typeof t==`string`?t:t.source;return i=i.replace(qg.caret,`$1`),n=n.replace(e,i),r},getRegex:()=>new RegExp(n,t)};return r}var Kg=((e=``)=>{try{return!!RegExp(`(?<=1)(?<!1)`+e)}catch{return!1}})(),qg={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:Wg(e=>RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:Wg(e=>RegExp(`^ {0,${e}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)),fencesBeginRegex:Wg(e=>RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)),headingBeginRegex:Wg(e=>RegExp(`^ {0,${e}}#`)),htmlBeginRegex:Wg(e=>RegExp(`^ {0,${e}}<(?:[a-z].*>|!--)`,`i`)),blockquoteBeginRegex:Wg(e=>RegExp(`^ {0,${e}}>`))},Jg=/^(?:[ \t]*(?:\n|$))+/,Yg=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Xg=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,Zg=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,Qg=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,$g=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,e_=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,t_=Gg(e_).replace(/bull/g,$g).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,``).getRegex(),n_=Gg(e_).replace(/bull/g,$g).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),r_=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,i_=/^[^\n]+/,a_=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,o_=Gg(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace(`label`,a_).replace(`title`,/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),s_=Gg(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,$g).getRegex(),c_=`address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul`,l_=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,u_=Gg(`^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>[^\\n]*\\n+|$)|<![A-Z][\\s\\S]*?(?:>[^\\n]*\\n+|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>[^\\n]*\\n+|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))`,`i`).replace(`comment`,l_).replace(`tag`,c_).replace(`attribute`,/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),d_=e=>Gg(r_).replace(`hr`,Zg).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,e).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,c_).getRegex(),f_=d_(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/),p_=d_(/ {0,3}(?:[*+-]|\d{1,9}[.)])[ \t]+[^ \t\n]/),m_={blockquote:Gg(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace(`paragraph`,p_).getRegex(),code:Yg,def:o_,fences:Xg,heading:Qg,hr:Zg,html:u_,lheading:t_,list:s_,newline:Jg,paragraph:f_,table:Ug,text:i_},h_=Gg(`^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)`).replace(`hr`,Zg).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`blockquote`,` {0,3}>`).replace(`code`,`(?: {4}| {0,3} )[^\\n]`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]`).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,c_).getRegex(),g_={...m_,lheading:n_,table:h_,paragraph:Gg(r_).replace(`hr`,Zg).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`table`,h_).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]`).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,c_).getRegex()},__={...m_,html:Gg(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace(`comment`,l_).replace(/tag/g,`(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b`).getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Ug,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:Gg(r_).replace(`hr`,Zg).replace(`heading`,` *#{1,6} *[^
92
92
  ]`).replace(`lheading`,t_).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`|fences`,``).replace(`|list`,``).replace(`|html`,``).replace(`|tag`,``).getRegex()},v_=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,y_=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,b_=/^( {2,}|\\)\n(?!\s*$)/,x_=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,S_=/[\p{P}\p{S}]/u,C_=/[\s\p{P}\p{S}]/u,w_=/[^\s\p{P}\p{S}]/u,T_=Gg(/^((?![*_])punctSpace)/,`u`).replace(/punctSpace/g,C_).getRegex(),E_=/(?!~)[\p{P}\p{S}]/u,D_=/(?!~)[\s\p{P}\p{S}]/u,O_=/(?:[^\s\p{P}\p{S}]|~)/u,k_=Gg(/link|precode-code|html/,`g`).replace(`link`,/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace(`precode-`,Kg?"(?<!`)()":"(^^|[^`])").replace(`code`,/(?<b>`+)[^`]+\k<b>(?!`)/).replace(`html`,/<(?! )[^<>]*?>/).getRegex(),A_=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,j_=Gg(A_,`u`).replace(/punct/g,S_).getRegex(),M_=Gg(A_,`u`).replace(/punct/g,E_).getRegex(),N_=`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)`,P_=Gg(N_,`gu`).replace(/notPunctSpace/g,w_).replace(/punctSpace/g,C_).replace(/punct/g,S_).getRegex(),F_=Gg(N_,`gu`).replace(/notPunctSpace/g,O_).replace(/punctSpace/g,D_).replace(/punct/g,E_).getRegex(),I_=Gg(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)`,`gu`).replace(/notPunctSpace/g,w_).replace(/punctSpace/g,C_).replace(/punct/g,S_).getRegex(),L_=Gg(/^~~?(?:((?!~)punct)|[^\s~])/,`u`).replace(/punct/g,S_).getRegex(),R_=Gg(`^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,w_).replace(/punctSpace/g,C_).replace(/punct/g,S_).getRegex(),z_=Gg(/\\(punct)/,`gu`).replace(/punct/g,S_).getRegex(),B_=Gg(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace(`scheme`,/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(`email`,/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),V_=Gg(l_).replace(`(?:-->|$)`,`-->`).getRegex(),H_=Gg(`^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>`).replace(`comment`,V_).replace(`attribute`,/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),U_=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/,W_=Gg(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace(`label`,U_).replace(`href`,/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace(`title`,/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),G_=Gg(/^!?\[(label)\]\[(ref)\]/).replace(`label`,U_).replace(`ref`,a_).getRegex(),K_=Gg(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,a_).getRegex(),q_=Gg(`reflink|nolink(?!\\()`,`g`).replace(`reflink`,G_).replace(`nolink`,K_).getRegex(),J_=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Y_={_backpedal:Ug,anyPunctuation:z_,autolink:B_,blockSkip:k_,br:b_,code:y_,del:Ug,delLDelim:Ug,delRDelim:Ug,emStrongLDelim:j_,emStrongRDelimAst:P_,emStrongRDelimUnd:I_,escape:v_,link:W_,nolink:K_,punctuation:T_,reflink:G_,reflinkSearch:q_,tag:H_,text:x_,url:Ug},X_={...Y_,link:Gg(/^!?\[(label)\]\((.*?)\)/).replace(`label`,U_).getRegex(),reflink:Gg(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace(`label`,U_).getRegex()},Z_={...Y_,emStrongRDelimAst:F_,emStrongLDelim:M_,delLDelim:L_,delRDelim:R_,url:Gg(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace(`protocol`,J_).replace(`email`,/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:Gg(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace(`protocol`,J_).getRegex()},Q_={...Z_,br:Gg(b_).replace(`{2,}`,`*`).getRegex(),text:Gg(Z_.text).replace(`\\b_`,`\\b_| {2,}\\n`).replace(/\{2,\}/g,`*`).getRegex()},$_={normal:m_,gfm:g_,pedantic:__},ev={normal:Y_,gfm:Z_,breaks:Q_,pedantic:X_},tv={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`},nv=e=>tv[e];function rv(e,t){if(t){if(qg.escapeTest.test(e))return e.replace(qg.escapeReplace,nv)}else if(qg.escapeTestNoEncode.test(e))return e.replace(qg.escapeReplaceNoEncode,nv);return e}function iv(e){try{e=encodeURI(e).replace(qg.percentDecode,`%`)}catch{return null}return e}function av(e,t){let n=e.replace(qg.findPipe,(e,t,n)=>{let r=!1,i=t;for(;--i>=0&&n[i]===`\\`;)r=!r;return r?`|`:` |`}).split(qg.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),t)if(n.length>t)n.splice(t);else for(;n.length<t;)n.push(``);for(;r<n.length;r++)n[r]=n[r].trim().replace(qg.slashPipe,`|`);return n}function ov(e,t,n){let r=e.length;if(r===0)return``;let i=0;for(;i<r;){let a=e.charAt(r-i-1);if(a===t&&!n)i++;else if(a!==t&&n)i++;else break}return e.slice(0,r-i)}function sv(e){let t=e.split(`
93
93
  `),n=t.length-1;for(;n>=0&&qg.blankLine.test(t[n]);)n--;return t.length-n<=2?e:t.slice(0,n+1).join(`
94
94
  `)}function cv(e,t){if(e.indexOf(t[1])===-1)return-1;let n=0;for(let r=0;r<e.length;r++)if(e[r]===`\\`)r++;else if(e[r]===t[0])n++;else if(e[r]===t[1]&&(n--,n<0))return r;return n>0?-2:-1}function lv(e,t=0){let n=t,r=``;for(let t of e)if(t===` `){let e=4-n%4;r+=` `.repeat(e),n+=e}else r+=t,n++;return r}function uv(e,t,n,r,i){let a=t.href,o=t.title||null,s=e[1].replace(i.other.outputLinkReplace,`$1`);r.state.inLink=!0;let c={type:e[0].charAt(0)===`!`?`image`:`link`,raw:n,href:a,title:o,text:s,tokens:r.inlineTokens(s)};return r.state.inLink=!1,c}function dv(e,t,n){let r=e.match(n.other.indentCodeCompensation);if(r===null)return t;let i=r[1];return t.split(`
@@ -175,10 +175,10 @@ let options={};
175
175
  try{ const fn=new Function(scriptContent+';\\nreturn {data:typeof data!=="undefined"?data:()=>({}),methods:typeof methods!=="undefined"?methods:{},computed:typeof computed!=="undefined"?computed:{},mounted:typeof mounted!=="undefined"?mounted:undefined}'); options=fn(); }catch(e){ console.error(e); }
176
176
  const app=createApp({template:template||'<div></div>',...options});
177
177
  app.mount('#app');
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
- …(已截断)`: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)+`
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:0,class:`stream-cursor`},Qb=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},[Z(`span`,{class:H([`typing-dot`,{pulse:e.showTyping}])},null,2),n[0]||=Z(`span`,{class:`typing-text`},`思考中...`,-1)],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`,Zb)):Q(``,!0)],64))}}),[[`__scopeId`,`data-v-c38029d9`]]),$b={class:`message-time`},ex=bg(ki({__name:`MessageTime`,props:{time:{}},setup(e){return(t,n)=>(Y(),X(`div`,$b,U(e.time),1))}}),[[`__scopeId`,`data-v-4a976e4a`]]),tx={class:`msg-actions`},nx=[`title`],rx=bg(ki({__name:`MessageActions`,props:{copied:{type:Boolean}},emits:[`copy`,`regenerate`],setup(e){return(t,n)=>(Y(),X(`div`,tx,[Z(`button`,{class:`msg-action-btn`,title:e.copied?`已复制`:`复制`,onClick:n[0]||=e=>t.$emit(`copy`)},U(e.copied?`✓ 已复制`:`📋 复制`),9,nx),Z(`button`,{class:`msg-action-btn`,title:`重新生成`,onClick:n[1]||=e=>t.$emit(`regenerate`)},`🔄 重新生成`)]))}}),[[`__scopeId`,`data-v-33638c4b`]]),ix=[`data-msg-idx`],ax={key:0,class:`message-avatar`},ox={class:`message-content`},sx={key:2,class:`msg-focuses`},cx=[`title`,`onClick`],lx=[`onClick`],ux=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`,ax,U(e.message.role===`user`?`👤`:`🤖`),1)):Q(``,!0),Z(`div`,ox,[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`,sx,[(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,lx)],8,cx))),128))])):Q(``,!0),os(Qb,{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(ex,{time:e.time},null,8,[`time`]),o.value?(Y(),$o(rx,{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,ix))}}),[[`__scopeId`,`data-v-77afcc15`]]),dx={key:0,class:`empty-state`},fx={key:1,class:`message-row assistant`},px={key:0,class:`message-avatar`},mx={class:`message-content`},hx={key:2,class:`error-bar`},gx={class:`error-text`},_x=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`,dx,[...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(ux,{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`,fx,[e.showAvatar?(Y(),X(`div`,px,`🤖`)):Q(``,!0),Z(`div`,mx,[os(Qb,{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`,hx,[Z(`span`,gx,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`]]),vx={key:0,class:`queued-bar`},yx={class:`queued-head`},bx={class:`queued-count`},xx={class:`queued-idx`},Sx={class:`queued-text`},Cx=[`onClick`],wx=[`onClick`],Tx=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`,vx,[Z(`div`,yx,[t[0]||=Z(`span`,{class:`queued-icon`},`📋`,-1),t[1]||=Z(`span`,{class:`queued-title`},`排队中 · 生成完后自动执行`,-1),Z(`span`,bx,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`,xx,U(t+1),1),Z(`span`,Sx,U(e),1),Z(`button`,{class:`queued-act`,title:`修改(填回输入框编辑)`,onClick:e=>K(n)(t)},`✏️`,8,Cx),Z(`button`,{class:`queued-act queued-del`,title:`撤销该任务`,onClick:e=>K(i)(t)},`✕`,8,wx)]))),128))])):Q(``,!0)}}),[[`__scopeId`,`data-v-f32730a9`]]),Ex={key:0,class:`approval-bar`},Dx={key:0,class:`approval-question`},Ox={key:1,class:`approval-context`},kx={key:2,class:`approval-recommend`},Ax={key:3,class:`approval-options`},jx=[`onClick`],Mx={class:`approval-actions`},Nx={class:`approval-head`},Px={class:`approval-title`},Fx={key:0,class:`approval-args`},Ix={class:`approval-actions`},Lx=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
+ …(已截断)`:t}catch{return String(e)}});return(e,s)=>K(t)?(Y(),X(`div`,Ex,[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`,Dx,U(K(t).args.question),1)):Q(``,!0),K(t).args?.context?(Y(),X(`div`,Ox,U(K(t).args.context),1)):Q(``,!0),K(t).args?.recommendation?(Y(),X(`div`,kx,`💡 推荐:`+U(K(t).args.recommendation),1)):Q(``,!0),a.value.length?(Y(),X(`div`,Ax,[(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,jx))),128))])):Q(``,!0),Z(`div`,Mx,[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`,Nx,[s[7]||=Z(`span`,{class:`approval-icon`},`✋`,-1),Z(`span`,Px,[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`,Fx,U(o.value),1)):Q(``,!0),Z(`div`,Ix,[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`]]),Rx={key:0,class:`conflict-bar`},zx={class:`conflict-head`},Bx={class:`conflict-title`},Vx={class:`conflict-detail`},Hx={key:0,class:`conflict-diff`},Ux={class:`conflict-diff-col`},Wx={class:`conflict-diff-pre`},Gx={class:`conflict-diff-col`},Kx={class:`conflict-diff-pre`},qx={class:`conflict-actions`},Jx=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`,Rx,[Z(`div`,zx,[a[6]||=Z(`span`,{class:`conflict-icon`},`⚠️`,-1),Z(`span`,Bx,[a[4]||=ds(`写入冲突:`,-1),Z(`code`,null,U(e.pendingConflict.path),1),a[5]||=ds(` 已被外部修改`,-1)])]),Z(`div`,Vx,` 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`,Hx,[Z(`div`,Ux,[a[7]||=Z(`div`,{class:`conflict-diff-label`},`AI 想写的值`,-1),Z(`pre`,Wx,U(r.value||`(delete 操作无值)`),1)]),Z(`div`,Gx,[a[8]||=Z(`div`,{class:`conflict-diff-label`},`外部改后的当前值`,-1),Z(`pre`,Kx,U(i.value),1)])])):Q(``,!0),Z(`div`,qx,[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`]]),Yx={class:`chat-footer`},Xx={class:`chat-input-wrap`},Zx={key:0,class:`focus-chips`},Qx=[`title`,`onClick`],$x={class:`focus-chip-path`},eS=[`onClick`],tS=[`placeholder`,`rows`],nS={class:`input-actions`},rS=[`disabled`,`title`],iS={key:0,width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`currentColor`},aS={key:1,width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},oS=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`,Yx,[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`,Xx,[K(s).length?(Y(),X(`div`,Zx,[(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`,$x,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,eS)],8,Qx))),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,tS),[[ul,K(n)]]),Z(`div`,nS,[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`,iS,[...f[5]||=[Z(`rect`,{x:`6`,y:`6`,width:`12`,height:`12`,rx:`2`},null,-1)]])):(Y(),X(`svg`,aS,[...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,rS)])])]))}}),[[`__scopeId`,`data-v-a9087737`]]),sS={key:0,class:`debug-drawer`},cS={class:`drawer-header`},lS={class:`tab-group`},uS={class:`header-actions`},dS={key:0,class:`drawer-filters`},fS=[`onClick`],pS={class:`chip-count`},mS={class:`chip-count`},hS={class:`drawer-body`},gS={key:0,class:`trace-panel`},_S={key:0,class:`trace-empty`},vS={class:`trace-metrics`},yS={class:`metric-card`},bS={class:`metric-card`},xS={class:`metric-card`},SS={class:`metric-card`},CS={key:0,class:`metric-card`},wS={key:1,class:`metric-card`},TS={class:`trace-spans`},ES={class:`span-ico`},DS={class:`span-name`},OS={key:0,class:`span-dur`},kS={key:1,class:`span-status`},AS={key:1,class:`context-panel`},jS={key:0,class:`trace-empty`},MS={class:`ctx-overview`},NS={class:`ctx-occupancy`},PS=[`title`],FS={class:`ctx-pct`},IS={class:`ctx-kv-row`},LS={class:`ctx-kv`},RS={key:0,class:`ctx-kv`},zS={key:1,class:`ctx-kv`},BS=[`title`],VS={class:`ctx-cat-bar`},HS={class:`ctx-cat-tokens`},US={key:0,class:`ctx-compression`},WS={class:`ctx-kv-row`},GS={class:`ctx-kv`},KS={class:`ctx-kv`},qS={class:`ctx-kv`},JS={key:0,class:`ctx-kv`},YS={key:2,class:`subagent-panel`},XS={key:0,class:`trace-empty`},ZS={key:0,class:`sub-section`},QS={class:`sub-section-title`},$S={class:`sub-head`},eC={class:`sub-label`},tC={class:`sub-steps-badge`},nC={class:`sub-task`},rC={key:1,class:`sub-section`},iC={class:`sub-section-title`},aC={class:`sub-head`},oC={class:`sub-label`},sC={key:0,class:`sub-dur`},cC=[`onClick`],lC={class:`sub-task`},uC={key:0,class:`sub-result`},dC={key:1,class:`sub-steps-list`},fC={class:`sub-step-kind`},pC={class:`sub-step-name`},mC={class:`sub-step-ts`},hC={key:0,class:`empty`},gC={class:`log-head`},_C={key:0,class:`log-source`},vC={class:`log-time`},yC={class:`log-body`},bC={class:`kv-grid`},xC={class:`kv`},SC={class:`v`},CC={class:`kv`},wC={class:`v`},TC={class:`kv`},EC={class:`v`},DC={class:`kv`},OC={class:`v`},kC={class:`section-label`},AC={class:`chip-row`},jC={class:`msg-list`},MC={class:`msg-text`},NC={class:`badge-row`},PC={class:`badge`},FC={key:0,class:`badge muted`},IC={class:`badge muted`},LC={key:1,class:`badge muted`},RC=[`onClick`],zC={key:0,class:`msg-list`},BC={class:`msg-detail`},VC={key:0,class:`msg-text`},HC={class:`tc-inline-name`},UC={class:`tc-inline-args`},WC={key:1,class:`tc-id`},GC={key:1,class:`log-raw`},KC={class:`badge-row`},qC={class:`badge`},JC={key:0,class:`badge warn`},YC={key:0,class:`resp-content`},XC={key:1,class:`tc-list`},ZC={class:`tc-name`},QC={class:`tc-args`},$C={key:2,class:`usage-row`},ew={class:`usage`},tw={class:`usage`},nw={class:`usage`},rw={key:3,class:`tc-card inline`},iw={class:`tc-name`},aw={class:`tc-args`},ow={key:4,class:`tc-card inline`},sw={class:`tc-name`},cw={class:`tc-args`},lw={key:5,class:`err-box`},uw={class:`log-footer`},dw=[`onClick`],fw=[`onClick`],pw={key:0,class:`log-raw`},mw={key:0,class:`empty`},hw={key:1,class:`flow-section`},gw={class:`flow-ico`},_w={class:`flow-label`},vw={class:`flow-detail`},yw={class:`flow-time`},bw={class:`flow-round-head`},xw={class:`flow-round-body`},Sw={class:`flow-ico`},Cw={class:`flow-label`},ww={class:`flow-detail`},Tw={class:`flow-time`},Ew={key:5,class:`info-body`},Dw={key:0,class:`empty`},Ow={class:`info-section`},kw={class:`kv-grid`},Aw={class:`kv`},jw={class:`v`},Mw={class:`kv`},Nw={class:`v`},Pw={class:`kv`},Fw={class:`v`},Iw={class:`kv`},Lw={class:`v`},Rw={class:`kv`,style:{"margin-top":`6px`}},zw={class:`v`,style:{"font-size":`11px`}},Bw={class:`info-section`},Vw={class:`info-title`},Hw={class:`info-name`},Uw={class:`info-desc`},Ww={key:0,class:`info-section`},Gw={class:`info-title`},Kw=[`onClick`],qw={class:`info-desc`},Jw={key:0,class:`skill-content`},Yw={key:0,class:`skill-loading`},Xw={key:1,class:`skill-error`},Zw={key:2,class:`skill-pre`},Qw={key:1,class:`info-section`},$w={class:`info-item`},eT={class:`info-name`},tT={class:`info-desc`},nT={class:`info-section`},rT={class:`kv-grid`},iT={class:`kv`},aT={class:`v`},oT={class:`kv`},sT={class:`v`},cT={class:`kv`},lT={class:`v`},uT={class:`kv`},dT={class:`v`,style:{"font-size":`11px`}},fT={key:2,class:`info-section`},pT={class:`info-title`},mT={class:`info-name`},hT={class:`src-tag mcp`},gT={class:`info-desc`},_T={key:3,class:`info-section`},vT={class:`kv-grid`},yT={class:`kv`},bT={class:`v`},xT={class:`kv`},ST={class:`v`},CT={class:`kv`},wT={class:`v`},TT={key:0,class:`kv`},ET={class:`v`,style:{"font-size":`11px`}},DT={key:4,class:`info-section`},OT={class:`info-title`},kT={key:5,class:`info-section`},AT={class:`info-pre`},jT={key:6,class:`info-section`},MT={class:`info-kv`},NT={class:`kv`},PT={class:`v`},FT={class:`kv`},IT={class:`v`},LT={class:`kv`},RT={class:`v`},zT={class:`kv`},BT={class:`v`},VT={class:`kv`},HT={class:`v`,style:{"font-size":`11px`}},UT={key:0,class:`kv`},WT={class:`v`,style:{"font-size":`11px`}},GT=bg(ki({__name:`DebugDrawer`,props:{logs:{default:()=>[]},visible:{type:Boolean},getInfo:{},infoTick:{},getSkillContent:{},csTheme:{}},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`,sS,[Z(`div`,{class:H([`drawer-panel`,{"cs-theme-dark":e.csTheme===`dark`}])},[Z(`div`,cS,[Z(`div`,lS,[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`,uS,[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`,dS,[(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`,pS,U(u.value[t]||0),1)],14,fS)),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`,mS,U(u.value.all||0),1)],2)])):Q(``,!0),Z(`div`,hS,[y.value===`trace`?(Y(),X(`div`,gS,[j.value?(Y(),X(J,{key:1},[Z(`div`,vS,[Z(`div`,yS,[n[9]||=Z(`span`,null,`轮次`,-1),Z(`b`,null,U(j.value.rounds),1)]),Z(`div`,bS,[n[10]||=Z(`span`,null,`总耗时`,-1),Z(`b`,null,U(j.value.totalDurationMs)+`ms`,1)]),Z(`div`,xS,[n[11]||=Z(`span`,null,`平均/轮`,-1),Z(`b`,null,U(j.value.avgRoundMs)+`ms`,1)]),Z(`div`,SS,[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`,CS,[n[13]||=Z(`span`,null,`压缩`,-1),Z(`b`,null,U(j.value.compressions),1)])):Q(``,!0),j.value.totalTokens?(Y(),X(`div`,wS,[n[14]||=Z(`span`,null,`Token`,-1),Z(`b`,null,U(j.value.totalTokens.total),1)])):Q(``,!0)]),Z(`div`,TS,[(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`,ES,U(R(e.type)),1),Z(`span`,DS,U(e.name),1),e.durationMs?(Y(),X(`span`,OS,U(e.durationMs)+`ms`,1)):Q(``,!0),e.status===`error`?(Y(),X(`span`,kS,`❌`)):Q(``,!0)],2))),128))])],64)):(Y(),X(`div`,_S,[...n[8]||=[ds(`未开启 tracing(`,-1),Z(`code`,null,`capabilities.tracing:true`,-1),ds(`)或暂无 trace。跑一轮 agent 后刷新。`,-1)]]))])):Q(``,!0),y.value===`context`?(Y(),X(`div`,AS,[M.value?(Y(),X(J,{key:1},[Z(`div`,MS,[Z(`div`,NS,[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,PS),Z(`span`,FS,U(Math.round(M.value.occupancy*100))+`%`,1)]),Z(`div`,IS,[Z(`span`,LS,`估算 `+U(M.value.totalTokens)+` token`,1),M.value.contextWindow?(Y(),X(`span`,RS,`窗口 `+U(M.value.contextWindow),1)):Q(``,!0),M.value.thresholdRatio>0?(Y(),X(`span`,zS,`阈值 `+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,BS),Z(`div`,VS,[Z(`div`,{class:`ctx-cat-fill`,style:Se({width:Math.max(Math.round(e.pct*100),2)+`%`})},null,4)]),Z(`span`,HS,[ds(U(e.tokens)+` `,1),Z(`i`,null,`(`+U(Math.round(e.pct*100))+`%)`,1)])]))),128)),M.value.compression?(Y(),X(`div`,US,[n[15]||=Z(`div`,{class:`ctx-section-title`},`最近压缩`,-1),Z(`div`,WS,[Z(`span`,GS,`摘要 `+U(M.value.compression.roundsSummarized)+`/`+U(M.value.compression.roundsTotal)+` 轮`,1),Z(`span`,KS,`召回 `+U(M.value.compression.roundsRecalled),1),Z(`span`,qS,U(M.value.compression.strategy),1),M.value.compression.decision?(Y(),X(`span`,JS,`🤖 agent 决策:`+U(te(M.value.compression.decision)),1)):Q(``,!0)])])):Q(``,!0)],64)):(Y(),X(`div`,jS,`未开启 contextInspector(默认开)或暂无快照。跑一轮 agent 后切回刷新。`))])):Q(``,!0),y.value===`subagent`?(Y(),X(`div`,YS,[!P.value.length&&!ee.value.length?(Y(),X(`div`,XS,[...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`,ZS,[Z(`div`,QS,`▶ 运行中 (`+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`,$S,[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`,eC,U(e.label),1),Z(`span`,tC,U(e.steps.length)+` 步`,1)]),Z(`div`,nC,U(k(e.task,80)),1)],2))),128))])):Q(``,!0),ee.value.length?(Y(),X(`div`,rC,[Z(`div`,iC,`🕐 历史 (`+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`,aC,[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`,oC,U(e.label),1),e.durationMs==null?Q(``,!0):(Y(),X(`span`,sC,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,cC)):Q(``,!0)]),Z(`div`,lC,U(k(e.task,80)),1),e.resultPreview?(Y(),X(`div`,uC,U(e.resultPreview),1)):Q(``,!0),I.value.has(t)&&e.steps.length?(Y(),X(`div`,dC,[(Y(!0),X(J,null,ta(e.steps,(e,t)=>(Y(),X(`div`,{key:t,class:`sub-step`},[Z(`span`,fC,U(e.kind===`tool_call`?`🔧`:`✅`),1),Z(`span`,pC,U(e.name),1),Z(`span`,mC,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`,hC,` 暂无日志,发送消息后这里会显示 Agent 的完整上下文、工具调用等信息 `)):Q(``,!0),(Y(!0),X(J,null,ta(l.value,(e,t)=>(Y(),X(`div`,{key:t,class:`log-item`},[Z(`div`,gC,[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`,_C,`↳ `+U(e.source),1)):Q(``,!0),Z(`span`,vC,U(d(e.timestamp)),1)]),Z(`div`,yC,[e.type===`context`?(Y(),X(J,{key:0},[Z(`div`,bC,[Z(`div`,xC,[n[18]||=Z(`span`,{class:`k`},`模型`,-1),Z(`span`,SC,U(e.data.model),1)]),Z(`div`,CC,[n[19]||=Z(`span`,{class:`k`},`温度`,-1),Z(`span`,wC,U(e.data.temperature),1)]),Z(`div`,TC,[n[20]||=Z(`span`,{class:`k`},`MaxTokens`,-1),Z(`span`,EC,U(e.data.maxTokens),1)]),Z(`div`,DC,[n[21]||=Z(`span`,{class:`k`},`消息数`,-1),Z(`span`,OC,U(e.data.totalMessages),1)])]),Z(`div`,kC,`工具 (`+U(e.data.tools?.length||0)+`)`,1),Z(`div`,AC,[(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`,jC,[(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`,MC,U(e.content),1)]))),128))])],64)):e.type===`llm_request`?(Y(),X(J,{key:1},[Z(`div`,NC,[Z(`span`,PC,`第 `+U(e.data.round)+` 轮`,1),e.data.model?(Y(),X(`span`,FC,U(e.data.model),1)):Q(``,!0),Z(`span`,IC,U((e.data.messages||[]).length)+` 条消息`,1),e.data.tools?.length?(Y(),X(`span`,LC,U(e.data.tools.length)+` 工具`,1)):Q(``,!0),Z(`button`,{class:`view-toggle`,onClick:e=>p(t)},U(o.value.has(t)?`🗂 卡片视图`:`📋 请求体`),9,RC)]),o.value.has(t)?(Y(),X(`pre`,GC,[Z(`code`,null,U(m(e.data.messages)),1)])):(Y(),X(`div`,zC,[(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`,BC,[e.content?(Y(),X(`span`,VC,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`,HC,`🔧 `+U(e.function?.name||e.name),1),Z(`code`,UC,U(e.function?.arguments??e.args),1)]))),128)),e.tool_call_id?(Y(),X(`span`,WC,`↳ tool_call_id: `+U(e.tool_call_id),1)):Q(``,!0)])]))),128))]))],64)):e.type===`llm_response`?(Y(),X(J,{key:2},[Z(`div`,KC,[Z(`span`,qC,`第 `+U(e.data.round)+` 轮`,1),e.data.toolCalls?.length?(Y(),X(`span`,JC,`🔧 `+U(e.data.toolCalls.length)+` 个工具调用`,1)):Q(``,!0)]),e.data.content?(Y(),X(`div`,YC,U(e.data.content),1)):Q(``,!0),e.data.toolCalls?.length?(Y(),X(`div`,XC,[(Y(!0),X(J,null,ta(e.data.toolCalls,(e,t)=>(Y(),X(`div`,{key:t,class:`tc-card`},[Z(`div`,ZC,`🔧 `+U(e.name),1),Z(`pre`,QC,U(m(e.args)),1)]))),128))])):Q(``,!0),e.data.usage?(Y(),X(`div`,$C,[Z(`span`,ew,`prompt: `+U(e.data.usage.prompt_tokens??`-`),1),Z(`span`,tw,`completion: `+U(e.data.usage.completion_tokens??`-`),1),Z(`span`,nw,`total: `+U(e.data.usage.total_tokens??`-`),1)])):Q(``,!0)],64)):e.type===`tool_call`?(Y(),X(`div`,rw,[Z(`div`,iw,`🔧 `+U(e.data.name),1),Z(`pre`,aw,U(m(e.data.args)),1)])):e.type===`tool_result`?(Y(),X(`div`,ow,[Z(`div`,sw,`✅ `+U(e.data.name)+` 结果`,1),Z(`pre`,cw,U(e.data.result),1)])):e.type===`error`?(Y(),X(`div`,lw,U(e.data.tool?`[${e.data.tool}] `:``)+U(e.data.error),1)):Q(``,!0)]),Z(`div`,uw,[Z(`button`,{class:`raw-toggle`,onClick:e=>f(t)},U(a.value.has(t)?`收起原始 JSON`:`查看原始 JSON`),9,dw),Z(`button`,{class:`raw-toggle`,onClick:t=>K(ig)(m(e.data))},`复制`,8,fw)]),a.value.has(t)?(Y(),X(`pre`,pw,[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`,mw,`暂无日志,发送消息后这里按轮次展示执行流程`)),O.value.pre.length?(Y(),X(`div`,hw,[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`,gw,U(s[e.type]?.icon),1),Z(`span`,_w,U(s[e.type]?.label),1),Z(`span`,vw,U(z(e)),1),Z(`span`,yw,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`,bw,`🔁 第 `+U(e.round)+` 轮`,1),Z(`div`,xw,[(Y(!0),X(J,null,ta(e.items,(e,t)=>(Y(),X(`div`,{key:t,class:H([`flow-node`,e.type])},[Z(`span`,Sw,U(s[e.type]?.icon),1),Z(`span`,Cw,U(s[e.type]?.label),1),Z(`span`,ww,U(z(e)),1),Z(`span`,Tw,U(d(e.timestamp)),1)],2))),128))])]))),128))],64)):(Y(),X(`div`,Ew,[b.value?(Y(),X(J,{key:1},[Z(`div`,Ow,[n[29]||=Z(`div`,{class:`info-title`},`基本信息`,-1),Z(`div`,kw,[Z(`div`,Aw,[n[24]||=Z(`span`,{class:`k`},`ID`,-1),Z(`span`,jw,U(b.value.id),1)]),Z(`div`,Mw,[n[25]||=Z(`span`,{class:`k`},`模型`,-1),Z(`span`,Nw,U(b.value.model||`-`),1)]),Z(`div`,Pw,[n[26]||=Z(`span`,{class:`k`},`工具数`,-1),Z(`span`,Fw,U(b.value.tools.length),1)]),Z(`div`,Iw,[n[27]||=Z(`span`,{class:`k`},`中间件`,-1),Z(`span`,Lw,U(b.value.middleware.length),1)])]),Z(`div`,Rw,[n[28]||=Z(`span`,{class:`k`},`中间件栈`,-1),Z(`span`,zw,U(b.value.middleware.join(` → `)||`-`),1)])]),Z(`div`,Bw,[Z(`div`,Vw,`🔧 工具 (`+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`,Hw,[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`,Uw,U(e.description),1)]))),128))]),b.value.skills.length?(Y(),X(`div`,Ww,[Z(`div`,Gw,[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,Kw),Z(`div`,qw,U(e.description),1),x.value[e.name]?(Y(),X(`div`,Jw,[x.value[e.name].loading?(Y(),X(`div`,Yw,`加载中…`)):x.value[e.name].error?(Y(),X(`div`,Xw,U(x.value[e.name].error),1)):x.value[e.name].content?(Y(),X(`pre`,Zw,U(x.value[e.name].content),1)):Q(``,!0)])):Q(``,!0)]))),128))])):Q(``,!0),b.value.data?(Y(),X(`div`,Qw,[n[31]||=Z(`div`,{class:`info-title`},`📊 可操作数据`,-1),Z(`div`,$w,[Z(`div`,eT,U(b.value.data.description||`主数据对象`),1),Z(`div`,tT,`schema: `+U(b.value.data.schema?`已声明`:`未声明`),1)])])):Q(``,!0),Z(`div`,nT,[n[36]||=Z(`div`,{class:`info-title`},`🧬 子 Agent`,-1),Z(`div`,rT,[Z(`div`,iT,[n[32]||=Z(`span`,{class:`k`},`启用`,-1),Z(`span`,aT,U(b.value.subagent.enabled?`是`:`否`),1)]),Z(`div`,oT,[n[33]||=Z(`span`,{class:`k`},`最大递归`,-1),Z(`span`,sT,U(b.value.subagent.maxDepth),1)]),Z(`div`,cT,[n[34]||=Z(`span`,{class:`k`},`并行上限`,-1),Z(`span`,lT,U(b.value.subagent.maxParallel),1)]),Z(`div`,uT,[n[35]||=Z(`span`,{class:`k`},`额外工具`,-1),Z(`span`,dT,U(b.value.subagent.allowedTools.length?b.value.subagent.allowedTools.join(`, `):`默认只读`),1)])])]),b.value.mcp?.servers?.length?(Y(),X(`div`,fT,[Z(`div`,pT,`🔌 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`,mT,[ds(U(e.name)+` `,1),Z(`span`,hT,U(e.toolCount)+` 工具`,1)]),Z(`div`,gT,U(e.url),1)]))),128))])):Q(``,!0),b.value.verify?(Y(),X(`div`,_T,[n[41]||=Z(`div`,{class:`info-title`},`✅ Verify 自检`,-1),Z(`div`,vT,[Z(`div`,yT,[n[37]||=Z(`span`,{class:`k`},`启用`,-1),Z(`span`,bT,U(b.value.verify.enabled?`是`:`否`),1)]),Z(`div`,xT,[n[38]||=Z(`span`,{class:`k`},`自纠上限`,-1),Z(`span`,ST,U(b.value.verify.maxAttempts),1)]),Z(`div`,CT,[n[39]||=Z(`span`,{class:`k`},`对抗验证`,-1),Z(`span`,wT,U(b.value.verify.adversarial?`开启`:`关闭`),1)]),b.value.verify.adversarial?(Y(),X(`div`,TT,[n[40]||=Z(`span`,{class:`k`},`对抗模型`,-1),Z(`span`,ET,U(b.value.model||`-`)+`(同主)`,1)])):Q(``,!0)])])):Q(``,!0),b.value.todos.length?(Y(),X(`div`,DT,[Z(`div`,OT,`📋 任务清单 (`+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`,kT,[n[42]||=Z(`div`,{class:`info-title`},`📝 持久指令 (memory)`,-1),Z(`pre`,AT,U(b.value.memory),1)])):Q(``,!0),b.value.lastCompression?(Y(),X(`div`,jT,[n[49]||=Z(`div`,{class:`info-title`},`🗜️ 上轮压缩`,-1),Z(`div`,MT,[Z(`div`,NT,[n[43]||=Z(`span`,{class:`k`},`触发`,-1),Z(`span`,PT,U(b.value.lastCompression.triggered?`✓`:`✗(未达阈值)`),1)]),Z(`div`,FT,[n[44]||=Z(`span`,{class:`k`},`摘要轮次`,-1),Z(`span`,IT,U(b.value.lastCompression.roundsSummarized)+` / `+U(b.value.lastCompression.roundsTotal),1)]),Z(`div`,LT,[n[45]||=Z(`span`,{class:`k`},`召回`,-1),Z(`span`,RT,U(b.value.lastCompression.roundsRecalled)+` 条`,1)]),Z(`div`,zT,[n[46]||=Z(`span`,{class:`k`},`消息数`,-1),Z(`span`,BT,U(b.value.lastCompression.originalMessages)+` → `+U(b.value.lastCompression.compressedMessages),1)]),Z(`div`,VT,[n[47]||=Z(`span`,{class:`k`},`策略`,-1),Z(`span`,HT,U(b.value.lastCompression.strategy),1)]),b.value.lastCompression.decision?(Y(),X(`div`,UT,[n[48]||=Z(`span`,{class:`k`},`压缩决策`,-1),Z(`span`,WT,`🤖 `+U(te(b.value.lastCompression.decision)),1)])):Q(``,!0)])])):Q(``,!0)],64)):(Y(),X(`div`,Dw,`暂无信息`))]))])],2),Z(`div`,{class:`drawer-mask`,onClick:_})])):Q(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-bb8e2650`]]),KT={class:`skill-panel`},qT={class:`skill-header`},JT={class:`skill-section`},YT={class:`section-title`},XT={class:`field`},ZT=[`disabled`],QT={class:`field`},$T={class:`field field-textarea`},eE={key:0,class:`skill-error`},tE={class:`skill-section`},nE={class:`section-title`},rE={key:0,class:`empty-hint`},iE={key:1,class:`skill-list`},aE={class:`skill-actions`},oE=[`onClick`],sE=[`onClick`],cE=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`,KT,[Z(`div`,qT,[n[5]||=Z(`span`,{class:`skill-title`},`🧩 Skill 管理`,-1),Z(`button`,{class:`skill-close`,title:`关闭`,onClick:n[0]||=e=>r(`close`)},`✕`)]),Z(`div`,JT,[Z(`div`,YT,[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`,XT,[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,ZT),[[ul,i.value]])]),Z(`label`,QT,[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`,$T,[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`,eE,U(s.value),1)):Q(``,!0),Z(`button`,{class:`btn btn-primary`,onClick:f},U(u.value?`保存修改`:`添加 Skill`),1)]),Z(`div`,tE,[Z(`div`,nE,`已创建 Skill(`+U(c.value.length)+`)`,1),c.value.length?(Y(),X(`ul`,iE,[(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`,aE,[Z(`button`,{class:`btn btn-ghost btn-edit`,title:`加载到表单编辑`,onClick:t=>m(e)},`编辑`,8,oE),Z(`button`,{class:`btn btn-ghost btn-del`,title:`删除该用户 skill`,onClick:t=>p(e)},`删除`,8,sE)])]))),128))])):(Y(),X(`div`,rE,`暂无用户创建的 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`]]),lE=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:{},csTheme:{}},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,"cs-theme-dark":e.csTheme===`dark`}]),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(_x,{"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(Tx)],!0):Q(``,!0),l(`approval`)?na(t.$slots,`approval`,{key:4,chat:K(i)},()=>[os(Lx)],!0):Q(``,!0),l(`conflict`)?na(t.$slots,`conflict`,{key:5,chat:K(i)},()=>[os(Jx,{"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(oS,{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(GT,{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,"cs-theme":e.csTheme},null,8,[`visible`,`logs`,`get-info`,`info-tick`,`get-skill-content`,`cs-theme`])],!0):Q(``,!0),l(`skill`)?na(t.$slots,`skill`,{key:8,chat:K(i)},()=>[os(cE,{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-e0eb0bbe`]]);function uE(e){let{core:t,dialogCfg:n}=e,r=null,i=e.el,a=t.agent.debugLogs;return r=yl(ki({setup(){return()=>qs(lE,{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,csTheme:n.theme===`dark`?`dark`:`light`,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 dE=`你是知识检索专家。可用工具:search_docs(语义检索)/ load_doc(按 source 加载)/ vfs_grep+vfs_read(搜预注入文档)/ fetch_document(公网 URL)。
182
182
 
183
183
  工作方式:
184
184
  1. 分析任务,拆出需查证的要点(如:需要哪些组件、各自的 props 约束、UI 规范要求);
@@ -187,7 +187,7 @@ app.mount('#app');
187
187
  4. 综合成结构化、可执行结论(不堆原文,提炼成可直接用于决策/配置的信息);
188
188
  5. 标注关键信息来源(文档名/段落),便于溯源;检索不到明确说「未检索到」,不编造。
189
189
 
190
- 你是只读检索角色,不要尝试修改任何数据。`,mE=`# 知识检索策略(RAG)
190
+ 你是只读检索角色,不要尝试修改任何数据。`,fE=`# 知识检索策略(RAG)
191
191
 
192
192
  ## 多源决策树
193
193
  - vfs_grep / vfs_read:搜集成方预注入 vfs 的文档(组件文档 / UI 规范)—— 快、静态,先查
@@ -205,11 +205,11 @@ app.mount('#app');
205
205
  - 静态文档(组件库文档 / UI 规范):vfs_grep
206
206
  - 语义相似(「瀑布流组件」「倒计时」「拼团」):search_docs
207
207
  - 已知文档 id / URL:load_doc
208
- - 公开 URL(设计规范网站 / 第三方文档):fetch_document`,hE={name:`rag-search`,description:`多源知识检索策略:vfs 预注入文档 → 语义检索 → 指定文档加载 → 公网;综合结构化结论 + 溯源`,getContent:()=>mE};function gE(e,n,i){return(0,r.tool)(async({query:e,topK:t})=>{try{let r=await n(e,{topK:t??i});return r?.length?r.map((e,t)=>`【${t+1}】${e.source?`来源:${e.source}\n`:``}${e.content}`).join(`
208
+ - 公开 URL(设计规范网站 / 第三方文档):fetch_document`,pE={name:`rag-search`,description:`多源知识检索策略:vfs 预注入文档 → 语义检索 → 指定文档加载 → 公网;综合结构化结论 + 溯源`,getContent:()=>fE};function mE(e,n,i){return(0,r.tool)(async({query:e,topK:t})=>{try{let r=await n(e,{topK:t??i});return r?.length?r.map((e,t)=>`【${t+1}】${e.source?`来源:${e.source}\n`:``}${e.content}`).join(`
209
209
 
210
- `):`未检索到与「${e}」相关的内容。可换关键词或扩大 topK 重试。`}catch(e){return`检索出错:${e.message}。可换关键词重试。`}},{name:e,description:`语义检索知识库(组件文档/UI 规范/业务规则等),返回相关片段。需要查阅文档才能回答或配置时用;可多次调用不同关键词。`,schema:t.z.object({query:t.z.string().describe(`检索关键词或自然语言问题`),topK:t.z.number().int().positive().optional().describe(`期望召回数量(默认使用系统配置)`)})})}function _E(e,n){return(0,r.tool)(async({source:e})=>{try{let t=await n(e),r=Array.isArray(t)?t:[t];return r.length?r.map((e,t)=>`【${t+1}】${e.source?`来源:${e.source}\n`:``}${e.content}`).join(`
210
+ `):`未检索到与「${e}」相关的内容。可换关键词或扩大 topK 重试。`}catch(e){return`检索出错:${e.message}。可换关键词重试。`}},{name:e,description:`语义检索知识库(组件文档/UI 规范/业务规则等),返回相关片段。需要查阅文档才能回答或配置时用;可多次调用不同关键词。`,schema:t.z.object({query:t.z.string().describe(`检索关键词或自然语言问题`),topK:t.z.number().int().positive().optional().describe(`期望召回数量(默认使用系统配置)`)})})}function hE(e,n){return(0,r.tool)(async({source:e})=>{try{let t=await n(e),r=Array.isArray(t)?t:[t];return r.length?r.map((e,t)=>`【${t+1}】${e.source?`来源:${e.source}\n`:``}${e.content}`).join(`
211
211
 
212
- `):`未加载到「${e}」。检查 source 是否正确。`}catch(e){return`加载出错:${e.message}。`}},{name:e,description:`按 source 加载指定文档(文档 id/URL/key);已知要查的具体文档用此工具精确加载。`,schema:t.z.object({source:t.z.string().describe(`文档标识(id/URL/key)`)})})}function vE(e){let{retriever:t,loader:n,useVfs:r=!0,id:i=`rag`,description:a,topK:o=5,searchToolName:s=`search_docs`,loadToolName:c=`load_doc`,maxToolRounds:l=8,summarization:u,skills:d,extraTools:f}=e;if(!t&&!n&&r===!1)throw Error(`[page-agent-sdk][createRagSubagent] 至少配一种知识源:retriever / loader / useVfs(true)`);let p=[];t&&p.push(gE(s,t,o)),n&&p.push(_E(c,n)),f&&p.push(...f);let m=r?[`vfs_grep`,`vfs_read`,`vfs_json_read`]:void 0;return{id:i,description:a??`检索知识库(组件文档/UI 规范/业务规则),返回有依据的结构化结论。需要查阅文档才能回答或决定如何配置时委派`,systemPrompt:pE,tools:p.length?p:void 0,allowedTools:m,skills:d??[hE],maxToolRounds:l,...u===void 0?{}:{summarization:u}}}function yE(e){return`你是纯代码组件生成专家。可用工具:vfs_write / vfs_edit / vfs_rm(写/改/删代码到 vfs ${e}) / vfs_grep + vfs_read(读 vfs) / write + set(写 data 引用,writablePaths 限定) / read / write_todos + update_todo(规划)。
212
+ `):`未加载到「${e}」。检查 source 是否正确。`}catch(e){return`加载出错:${e.message}。`}},{name:e,description:`按 source 加载指定文档(文档 id/URL/key);已知要查的具体文档用此工具精确加载。`,schema:t.z.object({source:t.z.string().describe(`文档标识(id/URL/key)`)})})}function gE(e){let{retriever:t,loader:n,useVfs:r=!0,id:i=`rag`,description:a,topK:o=5,searchToolName:s=`search_docs`,loadToolName:c=`load_doc`,maxToolRounds:l=8,summarization:u,skills:d,extraTools:f}=e;if(!t&&!n&&r===!1)throw Error(`[page-agent-sdk][createRagSubagent] 至少配一种知识源:retriever / loader / useVfs(true)`);let p=[];t&&p.push(mE(s,t,o)),n&&p.push(hE(c,n)),f&&p.push(...f);let m=r?[`vfs_grep`,`vfs_read`,`vfs_json_read`]:void 0;return{id:i,description:a??`检索知识库(组件文档/UI 规范/业务规则),返回有依据的结构化结论。需要查阅文档才能回答或决定如何配置时委派`,systemPrompt:dE,tools:p.length?p:void 0,allowedTools:m,skills:d??[pE],maxToolRounds:l,...u===void 0?{}:{summarization:u}}}function _E(e){return`你是纯代码组件生成专家。可用工具:vfs_write / vfs_edit / vfs_rm(写/改/删代码到 vfs ${e}) / vfs_grep + vfs_read(读 vfs) / write + set(写 data 引用,writablePaths 限定) / read / write_todos + update_todo(规划)。
213
213
 
214
214
  代码存储约定(重要):
215
215
  - 代码正文写 vfs:${e}<name>.vue(如 ${e}hero.vue)
@@ -220,7 +220,7 @@ app.mount('#app');
220
220
  1. 中等任务(多组件 / 大段代码)先 write_todos 拆解:读现有结构 → 规划各组件 → 逐个生成 → read 确认;
221
221
  2. 遵循 html-builder skill 规范(SFC 规范 / 安全底线 / 可访问性 / props 定义 / 组件库引用);
222
222
  3. 小段代码 vfs_write 整体写;大段用 vfs_edit 增量拼(避免单次输出超限);
223
- 4. 生成后 read(vfs 文件 + data 引用)确认结构正确;只写 writablePaths 内 data + ${e} 下 vfs。`}var bE=`# 纯代码组件生成规范
223
+ 4. 生成后 read(vfs 文件 + data 引用)确认结构正确;只写 writablePaths 内 data + ${e} 下 vfs。`}var vE=`# 纯代码组件生成规范
224
224
 
225
225
  ## 代码存储约定(重要)
226
226
  - 代码正文写 vfs:html/<name>.vue(如 html/hero.vue)
@@ -249,4 +249,4 @@ app.mount('#app');
249
249
 
250
250
  ## 可访问性 + 语义化
251
251
  - 语义化标签(button / nav / section);图片 alt;交互可键盘聚焦
252
- - 颜色对比达标;不只用颜色传达信息`,xE={name:`html-builder`,description:`纯代码组件(custom Vue SFC)生成规范:代码存 vfs+data 引用 / SFC 规范 / 安全底线 / props / 组件库引用 / 可访问性`,getContent:()=>bE};function SE(e){let{writablePaths:t,codeVfsPrefix:n=`html/`,id:r=`html`,description:i,planning:a=!0,summarization:o=!0,maxToolRounds:s=12,temperature:c=.4,skills:l,extraTools:u}=e;if(!t?.length)throw Error(`[page-agent-sdk][createHtmlSubagent] writablePaths 必填(代码组件 data 区,如 ["components"])`);let d=[];a&&d.push(Ru());let f=u??[];return{id:r,description:i??`生成/修改纯代码组件(custom Vue SFC)。代码写 vfs,data 存引用;能规划(write_todos)+ 执行。需写代码组件或灵活定制时委派`,systemPrompt:yE(n),writablePaths:t,allowedTools:[`vfs_write`,`vfs_edit`,`vfs_rm`,`vfs_grep`,`vfs_read`],middleware:d.length?d:void 0,summarization:o===!1?void 0:o,temperature:c,skills:l??[xE],maxToolRounds:s,tools:f.length?f:void 0}}function CE(e){return ng(e,fE)}e.ApprovalBar=Rx,e.CAPABILITIES=Gp,e.CONTEXT_PRESETS=Jp,e.ChatDialog=dE,e.ChatHeader=xg,e.ChatInput=sS,e.CodePreview=Jb,e.CompressDecisionSchema=ap,e.ConflictBar=Yx,e.DEFAULT_SYSTEM_PROMPT=$f,e.DebugDrawer=qT,e.FocusBar=Dg,e.HLJS_BLOCK_MAX_CHARS=Db,e.HUMAN_CONFIRM_TOOL_NAME=Ad,e.MIN_CONTEXT_WINDOW=Ll,e.MessageContent=Xb,e.MessageList=vx,e.MessageRow=dx,e.QueuedBar=Ex,e.STOP_WORDS=Zd,e.SkillPanel=uE,e.UNSAFE_KEYS=$p,e.actionsToInspectInfo=Mh,e.actionsToTools=jh,e.agentError=Al,e.analyzeContext=qf,e.applyPatchToClone=fm,e.applyPatchToLive=pm,e.asAgentError=kl,e.buildDataPrompt=ep,e.buildSystemPrompt=tp,e.chatContextKey=ag,e.commitSetToBind=dh,e.connectMcp=Qf,e.constructLlmFromConfig=v,e.constructOpenLlmSync=_,e.copyText=ig,e.createAgent=_u,e.createApprovalMiddleware=kd,e.createChatContext=og,e.createChatSdk=CE,e.createCheckpointManager=Bd,e.createCheckpointMiddleware=Vd,e.createConflictManager=_p,e.createContextInspectorMiddleware=Jf,e.createDataOps=ph,e.createHtmlSubagent=SE,e.createHumanConfirmMiddleware=Nd,e.createHumanConfirmTool=Md,e.createMemoryBackend=Rp,e.createMemoryMiddleware=Sd,e.createProxyLlm=g,e.createRagSubagent=vE,e.createSandboxRunner=od,e.createSdkEvents=qp,e.createSerialRunner=Yh,e.createSessionStore=Hp,e.createSkillStore=Gh,e.createSubagentMiddleware=wf,e.createSubagentTracker=cf,e.createSubagentsMiddleware=Df,e.createUsageHintsMiddleware=zh,e.createVerifyMiddleware=Of,e.createVfs=bm,e.createWebStorageBackend=Bp,e.createWriteBackCheck=Pf,e.deepClone=am,e.defineDataToolset=Fh,e.defineSkill=cd,e.defineTool=np,e.deleteByPath=im,e.deriveTitle=op,e.describeSchemaNode=ku,e.detectGarbledToolCall=su,e.diffObjects=gm,e.domToStructure=yh,e.domTools=xh,e.domToolsStatic=Ph,e.estimateMessageTokens=$d,e.estimateRoundTokens=ef,e.estimateTokens=zl,e.extractReasoningDelta=b,e.extractSchemaHint=Ju,e.extractText=Yf,e.extractTextDelta=y,e.extractUsage=x,e.fetchDocTools=hh,e.fetchTools=Nh,e.filterByToolMode=uh,e.formatConstraints=Au,e.formatZodIssues=Tl,e.getByPath=nm,e.getDomTool=bh,e.getEnvSummary=wh,e.getSchemaAtPath=xu,e.getSchemaTopKeys=vu,e.getTraceMetrics=Hl,e.hashValue=dm,e.indexSummarize=tf,e.inspectEnvTool=Dh,e.inspectTools=Oh,e.isChatModel=sp,e.isContextLengthError=Ql,e.isPathAllowed=yu,e.isQuotaError=Ap,e.isUnsafePath=em,e.jpEval=zm,e.jsonParseError=Dl,e.limitDepth=cm,e.markedToHtml=Nb,e.maybeParseValue=om,e.normalizeUsage=S,e.offloadPassThroughChars=Vl,e.offloadThresholdChars=Bl,e.presets=Uu,e.projectBySchema=Cu,e.projectBySchemaDeep=Su,e.projectFields=sm,e.recallRounds=nf,e.renderMarkdownHtml=Pb,e.renderSchemaHint=ju,e.renderSchemaOverview=Mu,e.renderSchemaShallow=Pu,e.resolveCapabilities=Kp,e.resolveContextOptions=Xp,e.resolveDialogConfig=Wp,e.resolveLlm=gp,e.resolveModelCaps=Rl,e.resolveStorage=Up,e.restoreInPlace=hm,e.restoreLive=mm,e.routeError=Ol,e.runHostScript=sd,e.runSandboxedScript=Um,e.safeMerge=tm,e.safeSerialize=Ch,e.safeStringify=lm,e.searchJson=Vm,e.selectBuiltinTools=Ih,e.setByPath=rm,e.shouldTriggerCompression=rf,e.systemPromptHelpers=Wu,e.tokenize=Qd,e.toolError=$,e.unwrapSchema=bu,e.useChat=rg,e.useChatContext=sg,Object.defineProperty(e,"z",{enumerable:!0,get:function(){return t.z}}),e.zodError=El});
252
+ - 颜色对比达标;不只用颜色传达信息`,yE={name:`html-builder`,description:`纯代码组件(custom Vue SFC)生成规范:代码存 vfs+data 引用 / SFC 规范 / 安全底线 / props / 组件库引用 / 可访问性`,getContent:()=>vE};function bE(e){let{writablePaths:t,codeVfsPrefix:n=`html/`,id:r=`html`,description:i,planning:a=!0,summarization:o=!0,maxToolRounds:s=12,temperature:c=.4,skills:l,extraTools:u}=e;if(!t?.length)throw Error(`[page-agent-sdk][createHtmlSubagent] writablePaths 必填(代码组件 data 区,如 ["components"])`);let d=[];a&&d.push(Ru());let f=u??[];return{id:r,description:i??`生成/修改纯代码组件(custom Vue SFC)。代码写 vfs,data 存引用;能规划(write_todos)+ 执行。需写代码组件或灵活定制时委派`,systemPrompt:_E(n),writablePaths:t,allowedTools:[`vfs_write`,`vfs_edit`,`vfs_rm`,`vfs_grep`,`vfs_read`],middleware:d.length?d:void 0,summarization:o===!1?void 0:o,temperature:c,skills:l??[yE],maxToolRounds:s,tools:f.length?f:void 0}}function xE(e){return ng(e,uE)}e.ApprovalBar=Lx,e.CAPABILITIES=Gp,e.CONTEXT_PRESETS=Jp,e.ChatDialog=lE,e.ChatHeader=xg,e.ChatInput=oS,e.CodePreview=Jb,e.CompressDecisionSchema=ap,e.ConflictBar=Jx,e.DEFAULT_SYSTEM_PROMPT=$f,e.DebugDrawer=GT,e.FocusBar=Dg,e.HLJS_BLOCK_MAX_CHARS=Db,e.HUMAN_CONFIRM_TOOL_NAME=Ad,e.MIN_CONTEXT_WINDOW=Ll,e.MessageContent=Xb,e.MessageList=_x,e.MessageRow=ux,e.QueuedBar=Tx,e.STOP_WORDS=Zd,e.SkillPanel=cE,e.UNSAFE_KEYS=$p,e.actionsToInspectInfo=Mh,e.actionsToTools=jh,e.agentError=Al,e.analyzeContext=qf,e.applyPatchToClone=fm,e.applyPatchToLive=pm,e.asAgentError=kl,e.buildDataPrompt=ep,e.buildSystemPrompt=tp,e.chatContextKey=ag,e.commitSetToBind=dh,e.connectMcp=Qf,e.constructLlmFromConfig=v,e.constructOpenLlmSync=_,e.copyText=ig,e.createAgent=_u,e.createApprovalMiddleware=kd,e.createChatContext=og,e.createChatSdk=xE,e.createCheckpointManager=Bd,e.createCheckpointMiddleware=Vd,e.createConflictManager=_p,e.createContextInspectorMiddleware=Jf,e.createDataOps=ph,e.createHtmlSubagent=bE,e.createHumanConfirmMiddleware=Nd,e.createHumanConfirmTool=Md,e.createMemoryBackend=Rp,e.createMemoryMiddleware=Sd,e.createProxyLlm=g,e.createRagSubagent=gE,e.createSandboxRunner=od,e.createSdkEvents=qp,e.createSerialRunner=Yh,e.createSessionStore=Hp,e.createSkillStore=Gh,e.createSubagentMiddleware=wf,e.createSubagentTracker=cf,e.createSubagentsMiddleware=Df,e.createUsageHintsMiddleware=zh,e.createVerifyMiddleware=Of,e.createVfs=bm,e.createWebStorageBackend=Bp,e.createWriteBackCheck=Pf,e.deepClone=am,e.defineDataToolset=Fh,e.defineSkill=cd,e.defineTool=np,e.deleteByPath=im,e.deriveTitle=op,e.describeSchemaNode=ku,e.detectGarbledToolCall=su,e.diffObjects=gm,e.domToStructure=yh,e.domTools=xh,e.domToolsStatic=Ph,e.estimateMessageTokens=$d,e.estimateRoundTokens=ef,e.estimateTokens=zl,e.extractReasoningDelta=b,e.extractSchemaHint=Ju,e.extractText=Yf,e.extractTextDelta=y,e.extractUsage=x,e.fetchDocTools=hh,e.fetchTools=Nh,e.filterByToolMode=uh,e.formatConstraints=Au,e.formatZodIssues=Tl,e.getByPath=nm,e.getDomTool=bh,e.getEnvSummary=wh,e.getSchemaAtPath=xu,e.getSchemaTopKeys=vu,e.getTraceMetrics=Hl,e.hashValue=dm,e.indexSummarize=tf,e.inspectEnvTool=Dh,e.inspectTools=Oh,e.isChatModel=sp,e.isContextLengthError=Ql,e.isPathAllowed=yu,e.isQuotaError=Ap,e.isUnsafePath=em,e.jpEval=zm,e.jsonParseError=Dl,e.limitDepth=cm,e.markedToHtml=Nb,e.maybeParseValue=om,e.normalizeUsage=S,e.offloadPassThroughChars=Vl,e.offloadThresholdChars=Bl,e.presets=Uu,e.projectBySchema=Cu,e.projectBySchemaDeep=Su,e.projectFields=sm,e.recallRounds=nf,e.renderMarkdownHtml=Pb,e.renderSchemaHint=ju,e.renderSchemaOverview=Mu,e.renderSchemaShallow=Pu,e.resolveCapabilities=Kp,e.resolveContextOptions=Xp,e.resolveDialogConfig=Wp,e.resolveLlm=gp,e.resolveModelCaps=Rl,e.resolveStorage=Up,e.restoreInPlace=hm,e.restoreLive=mm,e.routeError=Ol,e.runHostScript=sd,e.runSandboxedScript=Um,e.safeMerge=tm,e.safeSerialize=Ch,e.safeStringify=lm,e.searchJson=Vm,e.selectBuiltinTools=Ih,e.setByPath=rm,e.shouldTriggerCompression=rf,e.systemPromptHelpers=Wu,e.tokenize=Qd,e.toolError=$,e.unwrapSchema=bu,e.useChat=rg,e.useChatContext=sg,Object.defineProperty(e,"z",{enumerable:!0,get:function(){return t.z}}),e.zodError=El});