page-agent-sdk 2.36.0 → 2.37.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.
- package/README.md +1 -0
- package/README.zh-CN.md +1 -0
- package/dist/page-agent-sdk.headless.js +479 -358
- package/dist/page-agent-sdk.iife.js +186 -115
- package/dist/page-agent-sdk.js +471 -350
- package/dist/page-agent-sdk.umd.cjs +84 -13
- package/package.json +1 -1
- package/skills/html-builder/SKILL.md +51 -0
- package/skills/rag-search/SKILL.md +35 -0
- package/types/headless.d.ts +41 -0
- package/types/index.d.ts +44 -0
|
@@ -45,27 +45,27 @@ self.onmessage = async (e) => {
|
|
|
45
45
|
|
|
46
46
|
`:``)+n.text:(n.ok||(r=(r?r+`
|
|
47
47
|
|
|
48
|
-
`:``)+`(skill 脚本执行失败:${n.error})`),i=!1)}return{content:r,cacheable:i}}async function pd(e){if(!e.tools?.length)return[];let t=[];for(let n of e.tools)try{let e=await n(),r=Array.isArray(e)?e:[e];t.push(...r)}catch(t){console.warn(`skill "${e.name}" 工具工厂执行失败:`,t)}return t}function md(e,n){let i=[...e],a=new Map(i.map(e=>[e.name,e])),o=new Set,s=new Map,c={set(e){i=[...e],a=new Map(i.map(e=>[e.name,e])),s.clear(),o.clear()},get(){return i},invalidateCache(e){e?s.delete(e):s.clear()},async getContent(e){let t=a.get(e);if(!t)return null;let r=s.get(e);if(r!=null)return r;let i=await fd(t,n);return r=i.content,i.cacheable&&s.set(e,r),r}},l={name:`skills`,tools:[(0,r.tool)(async({name:e})=>{let t=a.get(e);if(!t)return`未找到 skill "${e}"。`;if(o.has(e))return`skill "${e}" 已在本轮加载,无需重复。`;let r=s.get(e);if(r==null){let i=await fd(t,n);if(r=i.content,!r)return`skill "${e}" 未配置内容(doc / getContent / exec 任选其一)。`;i.cacheable&&s.set(e,r)}if(o.add(e),t.tools?.length&&n?.onToolsReady&&a.get(e)===t)try{let e=await pd(t);e.length&&n.onToolsReady(t.name,e)}catch(t){console.warn(`skill "${e}" 工具加载失败:`,t)}return`skill "${e}" 完整指令:\n\n${r}`},{name:`load_skill`,description:`加载某个 skill 的完整指令到当前上下文(若 skill 配 exec,加载时自动执行脚本注入实时数据;若配 tools,加载后注入附带工具)。先从 system prompt 的 Skills 索引选合适的 skill,再调用此工具。`,schema:t.z.object({name:t.z.string().describe(`skill 名`)})})],beforeAgent:()=>(o.clear(),{skillsMetadata:i.map(e=>({name:e.name,description:e.description})),skillsLoaded:[]}),augmentPrompt:()=>cd(i),afterModel:()=>({skillsLoaded:[...o]})};return Object.defineProperty(l,"controller",{value:c,enumerable:!1,configurable:!1,writable:!1}),l}function hd(e=``){let t=e,n=typeof e==`string`?e:void 0;async function r(){if(typeof t==`string`)return n=t,t;try{n=await t()}catch(e){console.warn(`[page-agent-sdk][memory] 异步求值失败,降级为空:`,e),n=``}return n}return{name:`memory`,beforeAgent:async()=>(n===void 0&&await r(),{memory:n??``}),augmentPrompt:e=>e.memory?`## 持久指令(Memory)\n${e.memory}`:void 0,reset:e=>{t=e,n=typeof e==`string`?e:void 0},get:()=>n??``,refresh:async()=>typeof t==`function`?r():n??``}}var gd=new Set([`set_data`,`edit_data`,`delete_data`,`write`,`vfs_write`,`vfs_edit`]),_d=new Set([`get_data`,`describe_data`,`read`,`query_data`,`search_data`,`vfs_read`,`vfs_ls`,`vfs_glob`,`vfs_grep`]);function vd(e){let t=``;for(let n=0;n<e.length;n++){let r=e[n];r===`*`?e[n+1]===`*`?(t+=`.*`,n++):t+=`[^/]*`:".+?^${}()|[]\\".includes(r)?t+=`\\`+r:t+=r}return RegExp(`^`+t+`$`)}function yd(e,t,n){for(let r of e)if(r.operations.includes(t)&&r.scopes.some(e=>vd(e).test(n)))return r.mode;return`allow`}function bd(e){let t=e??{},n=new Set;if(typeof t.jsonPath==`string`&&t.jsonPath&&n.add(t.jsonPath),typeof t.path==`string`&&t.path&&n.add(t.path),t.patch&&typeof t.patch.jsonPath==`string`&&t.patch.jsonPath&&n.add(t.patch.jsonPath),Array.isArray(t.patches))for(let e of t.patches)e&&typeof e.jsonPath==`string`&&e.jsonPath&&n.add(e.jsonPath);return[...n]}function xd(e){return{name:`permissions`,wrapToolCall:async(t,n)=>{let r=gd.has(t.name)?`write`:_d.has(t.name)?`read`:null,i=bd(t.args);if(r&&i.length){for(let t of i)if(yd(e,r,t)===`deny`)return{content:`权限拒绝:${r} 操作 "${t}" 被 permissions 规则禁止。`,status:`error`}}return n(t)}}}function Sd(e={}){let t=(t,n)=>e.confirm?!!e.confirm(t,n):e.tools===void 0||e.tools.includes(t);return{name:`approval`,wrapToolCall:async(n,r)=>t(n.name,n.args)?new Promise(t=>{let i=!1,a=[],o=e=>{if(!i)if(i=!0,a.forEach(e=>e()),e===!1){let e=n.args??{},r=e.path||e.jsonPath||e.patch?.jsonPath||(Array.isArray(e.patches)?e.patches.map(e=>e?.jsonPath).filter(Boolean).join(`,`):``)||``;t({content:`用户拒绝了 ${n.name} 调用${r?`(path=${r})`:``}。请改用只读工具、调整路径或换方案后再试。`,status:`error`})}else r(n).then(t,e=>t({content:`工具执行失败:${e?.message??e}`,status:`error`}))};if(n.signal){if(n.signal.aborted)return o(!1);let e=()=>o(!1);n.signal.addEventListener(`abort`,e,{once:!0}),a.push(()=>n.signal?.removeEventListener(`abort`,e))}if(e.timeoutMs&&e.timeoutMs>0){let t=setTimeout(()=>o(!1),e.timeoutMs);a.push(()=>clearTimeout(t))}n.emit?.({type:`approval_request`,toolName:n.name,args:n.args,resolve:o})}):r(n)}}var Cd=`request_human_confirmation`,wd=t.z.object({question:t.z.string().describe(`要征询用户的问题/方案描述。清晰具体:说明当前情况、为什么需要确认、确认什么。`),options:t.z.array(t.z.string()).optional().describe(`可选方案列表(2-4 个)。用户从中选一个。不传则用户只回答允许/拒绝。`),recommendation:t.z.string().optional().describe(`你推荐的方案(优先在 options 中选一个)及推荐理由,帮用户快速决策。`),context:t.z.string().optional().describe(`补充上下文:已做了什么、约束、影响范围等,帮用户判断。`)});function Td(){return(0,r.tool)(async()=>`人工确认中间件未装载,无法征询用户。请直接向用户说明情况并等待回复。`,{name:Cd,description:[`当遇到以下情况时,主动调用本工具征询用户确认后再继续(不要默默猜测后直接执行高风险动作):`,`1) 不确定用户意图、需求有歧义;`,`2) 存在多种可行方案且取舍影响较大;`,`3) 即将执行高风险或不可逆操作(删除、覆盖、批量改动、对外发布等);`,`4) 操作超出原始指令范围。`,`入参:question=问题/方案描述;options=可选方案列表(多方案时给);recommendation=你推荐的方案及理由。`,`用户选择后,据其回答继续;若用户拒绝,停止当前操作并询问如何调整。`].join(``),schema:wd})}function Ed(){return{name:`humanConfirm`,wrapToolCall:async(e,t)=>e.name===`request_human_confirmation`?new Promise(t=>{let n=!1,r=[],i=i=>{n||(n=!0,r.forEach(e=>e()),t(i===!1?{content:`用户拒绝了该方案。请停止当前操作,询问用户希望如何调整,不要擅自执行。`,status:`done`}:i===!0?{content:`用户同意了方案${e.args?.recommendation?`(${e.args.recommendation})`:``}。请继续执行。`,status:`done`}:{content:`用户选择了:${i}。请据此方案继续。`,status:`done`}))};if(e.signal){if(e.signal.aborted)return i(!1);let t=()=>i(!1);e.signal.addEventListener(`abort`,t,{once:!0}),r.push(()=>e.signal?.removeEventListener(`abort`,t))}e.emit?.({type:`approval_request`,toolName:e.name,args:e.args,resolve:i})}):t(e)}}function Dd(e){if(typeof e!=`object`||!e)return e;if(typeof structuredClone==`function`)try{return structuredClone(e)}catch{}return JSON.parse(JSON.stringify(e))}function Od(e,t){let n=t.split(`.`),r=e;for(let e of n){if(r==null)return;r=r[e]}return r}function kd(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++)i[r[e]]??(i[r[e]]={}),i=i[r[e]];i[r[r.length-1]]=n}function Ad(e,t){if(Array.isArray(e)){e.length=0,Array.isArray(t)&&e.push(...t);return}let n=t&&typeof t==`object`&&!Array.isArray(t)?t:{};for(let t of Object.keys(e))t in n||delete e[t];for(let t of Object.keys(n))e[t]=n[t]}function jd(e,t){let n=Od(window,e);typeof n==`object`&&n?Ad(n,t):kd(window,e,t)}function Md(e){let t=e.slice();for(;t.length;){let e=t[t.length-1];if(e.role===`assistant`&&!e.content&&!e.steps?.length&&!e.reasoning)t.pop();else break}return t}function Nd(e){let t=[],n=e.maxCheckpoints??5,r=1,i,a;return{save(o){let s=Md(e.messages),c={};if(e.getData)((e.consumeDataDirty?.()??!0)||a===void 0)&&(a=Dd(e.getData())),c[``]=a;else for(let t of e.slotPaths??[])c[t]=Dd(Od(window,t));((e.vfsStore.consumeDirty?.()??!0)||i===void 0)&&(i=Dd(e.vfsStore.files));let l={id:r++,label:o,timestamp:Date.now(),messages:Dd(s),windowVals:c,vfs:i,todos:Dd(e.getTodos()),messageCount:s.length};for(t.push(l);t.length>n;)t.shift();return l.id},list(){return t.map(e=>({id:e.id,label:e.label,timestamp:e.timestamp,messageCount:e.messageCount}))},canRestore(){return t.length>0},restore(n){let r=n==null?t[t.length-1]:t.find(e=>e.id===n);if(!r)return!1;if(e.messages.splice(0,e.messages.length,...Dd(r.messages)),e.getData){let t=r.windowVals[``];if(t!==void 0){let n=e.getData();typeof n==`object`&&n&&Ad(n,Dd(t))}}else for(let[e,t]of Object.entries(r.windowVals))jd(e,Dd(t));let o=e.vfsStore.files;for(let e of Object.keys(o))delete o[e];return Object.assign(o,Dd(r.vfs)),e.todosMw.reset(Dd(r.todos)),a=void 0,i=void 0,!0},exportStack(){return Dd(t)},importStack(e){t.length=0,i=void 0,a=void 0;let n=Array.isArray(e)?e:[];for(let e of n)e&&typeof e==`object`&&`id`in e&&`messages`in e&&typeof e.id==`number`&&Number.isFinite(e.id)&&t.push(e);r=t.reduce((e,t)=>Math.max(e,t.id),0)+1}}}function Pd(e){let t=!1;return{name:`checkpoint`,beforeAgent:()=>{t=!1},beforeModel:()=>{t||(t=!0,e.save(`auto`))}}}function Fd(e){return!!e&&typeof e==`object`&&typeof e.invoke==`function`&&typeof e.stream==`function`}var Id=[`describe_data`,`get_data`,`read`,`query_data`,`search_data`,`fetch_document`],Ld=1,Rd=4,zd=6,Bd=[`spawn_agent`,`spawn_agents`],Vd=[`write`,`set_data`,`edit_data`,`delete_data`,`draft_commit`];function Hd(e){let t=[];if(typeof e.jsonPath==`string`&&e.jsonPath&&t.push(e.jsonPath),typeof e.path==`string`&&e.path&&t.push(e.path),e.patch&&typeof e.patch.jsonPath==`string`&&t.push(e.patch.jsonPath),Array.isArray(e.patches))for(let n of e.patches)n&&typeof n.jsonPath==`string`&&t.push(n.jsonPath);return t}function Ud(e,t){return t.some(t=>e===t||e.startsWith(t+`.`)||e.startsWith(t+`[`))}function Wd(e,t){let n=e.invoke.bind(e),r=async e=>{let r=Hd(e);if(!r.length)return`PATH_OUT_OF_SCOPE:子 agent 仅可增量 patch(writablePaths: ${t.join(`, `)}),不能整体替换(无 jsonPath)。用 write({patch:{jsonPath,...}}) 增量改。`;for(let e of r)if(!Ud(e,t))return`PATH_OUT_OF_SCOPE:子 agent 写 "${e}" 越界(仅可写 ${t.join(`, `)})。`;return n(e)};return new Proxy(e,{get(e,t,n){return t===`invoke`?r:Reflect.get(e,t,n)}})}async function Gd(e,t,n,r,i){let a=t.depth??0,o=t.maxDepth??Ld,s=new Set([...Id,...t.allowedTools??[]]),c=()=>typeof t.allTools==`function`?t.allTools():t.allTools,l=[...c().filter(e=>s.has(e.name)&&!Bd.includes(e.name)),...t.extraTools??[]];if(t.writablePaths?.length){l=l.filter(e=>!Vd.includes(e.name));let e=c().filter(e=>Vd.includes(e.name)&&!Bd.includes(e.name)).map(e=>Wd(e,t.writablePaths));l=[...l,...e]}let u=a+1<o?[Kd({...t,depth:a+1})]:[],d=t.getFocuses?.()??[],f=d.length?Ju({getSchema:t.getSchema??(()=>null),initialFocuses:d}):void 0,p=Il({model:Fd(t.llm)?t.llm.model??t.llm.modelName:e.model??t.llm.model,contextWindow:t.llm.contextWindow,maxOutputTokens:t.llm.maxOutputTokens});if(p.contextWindow<2e5)throw Error(`[page-agent-sdk][subagent] 子 agent 模型上下文窗口 ${p.contextWindow} 小于最小支持 ${Fl}(需 ≥200K 窗口模型)`);let m=fu({contextWindow:p.contextWindow,maxOutputTokens:p.maxOutputTokens,...Fd(t.llm)?{llm:t.llm}:{apiKey:t.llm.apiKey,baseUrl:t.llm.baseUrl,model:e.model??t.llm.model,temperature:t.temperature??t.llm.temperature,maxTokens:t.maxTokens??t.llm.maxTokens},systemPrompt:e.role?.trim()||t.systemPrompt||`你是一个专注的子任务执行者。你只有只读工具(读主数据 / 抓文档),用它们完成给定任务,给出简洁结论,不要展开多余解释。`,tools:l,middleware:[...t.skills?.length?[md(t.skills)]:[],...u,...f?[f]:[]],maxToolRounds:t.maxToolRounds??zd,onLog:i,debug:t.debug});return t.debug&&console.log(`[subagent] 启动子 agent(depth=${a},工具 ${l.length} 个)`),m.stream([{role:`user`,content:e.prompt,timestamp:Date.now()}],e=>{r&&(e.type===`tool_call`||e.type===`tool_result`)&&r(e)},n)}function Kd(e){let n=e.maxParallel??Rd,i,a,o,s=(e,t)=>n=>{a&&a({type:`subagent`,taskId:e,label:t,kind:n.type,name:n.name,args:n.type===`tool_call`?n.args:void 0,result:n.type===`tool_result`?n.result:void 0,status:n.type===`tool_result`?n.status:void 0})};return{name:`subagent`,tools:[(0,r.tool)(async({prompt:t,role:n,tools:r,writablePaths:a,model:c})=>{let l=r?.length||a?.length?{...e,...r?.length?{allowedTools:r}:{},...a?.length?{writablePaths:a}:{}}:e,u=`sub-${Math.random().toString(36).slice(2,8)}`,d=n?.trim()||`子任务`;return await Gd({prompt:t,role:n,model:c},l,i,s(u,d),e=>o?.({...e,source:`子:${d}`}))},{name:`spawn_agent`,description:`委派一个独立子 agent 执行子任务,返回其最终结论(过程隔离,不占主上下文)。用于:分治大任务、专项调研、独立验证。子 agent 默认只读(不改页面)。`,schema:t.z.object({prompt:t.z.string().describe(`子任务描述(子 agent 的唯一输入)`),role:t.z.string().optional().describe(`子 agent 身份(如"你是代码审查专家")`),tools:t.z.array(t.z.string()).optional().describe(`子 agent 可用工具名白名单(默认只读主数据 + fetch)`),writablePaths:t.z.array(t.z.string()).optional().describe(`子 agent 可写路径前缀(给写权限;越界 PATH_OUT_OF_SCOPE;如 ["components"] 允许写 components.* )`),model:t.z.string().optional().describe(`覆盖模型(默认同主)`)})}),(0,r.tool)(async({tasks:t})=>(await Ml(t,n,async(t,n)=>{let r=`sub-${n}-${Math.random().toString(36).slice(2,6)}`,a=t.role?.trim()||`子任务${n+1}`;return Gd(t,e,i,s(r,a),e=>o?.({...e,source:`子:${a}`}))},i)).map((e,t)=>`【子任务 ${t+1}】\n${e??`(未完成)`}`).join(`
|
|
49
|
-
|
|
50
|
-
`),{
|
|
51
|
-
`):void 0,wrapToolCall:async(e,t)=>(e.signal&&(i=e.signal),e.emit&&(a=e.emit),e.logSink&&(o=e.logSink),t(e))};return Object.defineProperty(m,"controller",{value:p,enumerable:!1}),Object.defineProperty(m,"setReconfigureHook",{value:e=>{u=e},enumerable:!1}),m}function Xd(e){return{name:`verify`,async beforeReturn({messages:t,state:n,log:r}){let i=await e.check({messages:t,state:n});if(!i.ok)return i.feedback??`结果未通过验证,请复查。`;if(e.adversarial){r?.(`middleware`,{stage:`adversarial_start`,model:af(e.adversarial.llm),tools:(e.adversarial.tools??[]).length});let n=await lf(t,e.adversarial.llm,r,e.adversarial.tools);if(r?.(`middleware`,{stage:`adversarial_done`,clean:n===null,feedback:n}),n)return n}return null}}}var Zd=new Set([`set_data`,`edit_data`,`delete_data`,`write`]),Qd=/校验失败|SCHEMA_INVALID|未注册|不存在|仅支持|必须是|NOT_OBJECT|PATH_UNSAFE|VERSION_CONFLICT|WRITE_INTERCEPT/;function $d(e){let t=new Map;for(let n of e){let e=n?.tool_calls;if(Array.isArray(e))for(let n of e){if(!Zd.has(n.name))continue;let e=n.id,r=n?.args??{};if(n.name===`write`)if(r.del&&r.patch?.jsonPath)t.set(r.patch.jsonPath,{path:r.patch.jsonPath,op:`delete_data`,callId:e});else if(Array.isArray(r.patches)&&r.patches.length)for(let n of r.patches){let r=typeof n?.jsonPath==`string`?n.jsonPath:``;t.set(r,{path:r,op:n?.op===`remove`?`delete_data`:`edit_data`,callId:e})}else if(r.patch){let n=typeof r.patch.jsonPath==`string`?r.patch.jsonPath:``;t.set(n,{path:n,op:r.patch.op===`remove`?`delete_data`:`edit_data`,callId:e})}else t.set(``,{path:``,op:`set_data`,callId:e});else{let i=typeof r.jsonPath==`string`?r.jsonPath:``;t.set(i,{path:i,op:n.name,callId:e})}}}return[...t.values()]}function ef(e){let t=new Map;for(let n of e){let e=n?.tool_call_id,r=n?.content;typeof e==`string`&&typeof r==`string`&&t.set(e,r)}return t}function tf(e,t){if(t===``)return e;if(e==null)return;let n=e;for(let e of t.split(`.`)){if(n==null)return;n=n[e]}return n}function nf(e={}){let t=typeof e.root==`function`?e.root:e.root===void 0?()=>e.window??globalThis.window:()=>e.root,n=typeof e.schemas==`function`?e.schemas:()=>e.schemas??{};return async({messages:e})=>{let r=$d(e);if(!r.length)return{ok:!0};let i=ef(e),a=n()[``],o=t(),s=[];for(let{path:e,op:t,callId:n}of r){let r=n?i.get(n):void 0;if(r&&Qd.test(r))continue;let c=tf(o,e);if(t===`delete_data`)c!==void 0&&s.push(`${e} 删除后读回仍有值,疑似未生效`);else if(c==null)s.push(`写入 ${e} 后读回为空,疑似未生效`);else if(a){let t=a.safeParse(o);t.success||s.push(`${e} 读回值不符合 schema:${t.error.issues?.[0]?.message??`校验失败`}`)}}return s.length?{ok:!1,feedback:s.join(`;
|
|
52
|
-
`)}:{ok:!0}}}function rf(e){return!!e&&typeof e==`object`&&typeof e.invoke==`function`&&typeof e.stream==`function`}function af(e){return rf(e)?e.model??e.modelName??`<实例>`:e.model??`<配置>`}var of=/无问题|没有问题|未发现问题|没有发现|没问题|未发现/;function sf(e){return of.test(e)}function cf(e){let t=``,n=``;for(let r of e)r instanceof i.HumanMessage?t=typeof r.content==`string`?r.content:``:r instanceof i.AIMessage&&!(r.tool_calls?.length>0)&&(n=typeof r.content==`string`?r.content:``);return{lastUser:t,lastReply:n}}async function lf(e,t,n,r){let{lastUser:i,lastReply:a}=cf(e);if(!a)return null;let o=Array.isArray(r)&&r.length>0,s=[`你是严格的对抗式审查者,目标是找出以下 AI 助手回复的错误并证明它有问题(事实错误 / 遗漏 / 逻辑矛盾 / 与需求不符)。`,`用户需求:${i||`(未明确)`}`,`助手回复:${a}`,o?`重点检查主数据修改:① jsonPath 是否正确(是否误写不存在的子路径);② 值类型是否符合主数据 schema;③ 语义是否符合字段 description。可用只读工具(read / get_data / describe_data 等)读回实际值实证。`:`只报告具体、可验证的问题。`,`若确实无问题,只回复"无问题"。`].join(`
|
|
53
|
-
`),c=`你是严格的对抗式审查者,只找问题不赞美。目标是反驳,不是改进。`,l=n?e=>n(e.type,{...e.data,source:`adversarial`}):void 0,u=await fu(rf(t)?{llm:t,tools:r,maxToolRounds:o?4:1,systemPrompt:c,onLog:l}:{apiKey:t.apiKey,baseUrl:t.baseUrl,model:t.model,temperature:0,maxTokens:t.maxTokens,tools:r,maxToolRounds:o?4:1,systemPrompt:c,onLog:l}).invoke([{role:`user`,content:s,timestamp:Date.now()}]);return n?.(`middleware`,{stage:`adversarial_verdict`,verdict:u,source:`adversarial`}),sf(u)?null:u.trim()}var uf=[{prefix:`## 可操作数据`,key:`dataHint`},{prefix:`## 能力使用提示`,key:`usageHints`},{prefix:`## 当前主线目标`,key:`mission`},{prefix:`## 工作记忆`,key:`workingMemory`},{prefix:`【更早对话摘要`,key:`memory`},{prefix:`【对话历史摘要】`,key:`summary`},{prefix:`【与当前问题可能相关的早期对话】`,key:`recall`}],df=[{key:`systemPrompt`,label:`系统提示词(身份/规则)`},{key:`dataHint`,label:`可操作数据(schema)`},{key:`usageHints`,label:`能力使用提示`},{key:`mission`,label:`主线目标(mission)`},{key:`workingMemory`,label:`工作记忆`},{key:`memory`,label:`更早对话摘要`},{key:`summary`,label:`对话历史摘要`},{key:`recall`,label:`相关早期对话(召回)`},{key:`history`,label:`历史对话`},{key:`current`,label:`当前问题`},{key:`assistant`,label:`助手回复`},{key:`toolResults`,label:`工具结果/参数`},{key:`other`,label:`其他`}];function ff(){let e={};for(let t of df)e[t.key]={key:t.key,label:t.label,tokens:0,pct:0,msgCount:0};return e}function pf(e,t){e.tokens+=t,e.msgCount+=1}function mf(e){let t=e.content;return typeof t==`string`?t:JSON.stringify(t??``)}function hf(e,t){let n=[];for(let t of uf){let r=0;for(;;){let i=e.indexOf(t.prefix,r);if(i<0)break;n.push({idx:i,key:t.key}),r=i+t.prefix.length}}if(n.sort((e,t)=>e.idx-t.idx),!n.length){let n=e.trim();n&&pf(t.systemPrompt,Ll(n));return}if(n[0].idx>0){let r=e.slice(0,n[0].idx).trim();r&&pf(t.systemPrompt,Ll(r))}for(let r=0;r<n.length;r++){let i=n[r].idx,a=r+1<n.length?n[r+1].idx:e.length,o=e.slice(i,a).trim();o&&pf(t[n[r].key],Ll(o))}}function gf(e,t={}){let n=ff(),r=-1;for(let t=e.length-1;t>=0;t--)if(e[t]instanceof i.HumanMessage){r=t;break}for(let t=0;t<e.length;t++){let a=e[t];if(a instanceof i.SystemMessage)hf(mf(a),n);else if(a instanceof i.HumanMessage)pf(n[t===r?`current`:`history`],Ll(mf(a)));else if(a instanceof i.AIMessage){let e=a.tool_calls??[];if(e.length){let t=e.map(e=>JSON.stringify(e.args??{})).join(` `);pf(n.toolResults,Ll(t))}else pf(n.assistant,Ll(mf(a)))}else a instanceof i.ToolMessage?pf(n.toolResults,Ll(mf(a))):pf(n.other,Ll(mf(a)))}let a=Object.values(n).filter(e=>e.tokens>0);a.sort((e,t)=>t.tokens-e.tokens);let o=a.reduce((e,t)=>e+t.tokens,0);for(let e of a)e.pct=o>0?e.tokens/o:0;let s=t.contextWindow;return{totalTokens:o,contextWindow:s,occupancy:s?o/s:0,thresholdRatio:t.thresholdRatio??0,categories:a}}function _f(e={}){let t,n=e.contextWindow;return{name:`context-inspector`,async wrapModelCall(r,i){return t=gf(r.messages,{contextWindow:n,thresholdRatio:e.thresholdRatio}),i(r)},getSnapshot:()=>t,setContextWindow:e=>{n=e}}}function vf(e){let t=e?.content;if(!Array.isArray(t)||!t.length)return``;let n=t.map(e=>e.type===`text`&&e.text?e.text:e.type===`image`&&e.data?`[image:${String(e.data).slice(0,32)}…]`:e.type===`audio`&&e.data?`[audio]`:e.type===`resource`&&e.resource?e.resource.text??e.resource.blob??``:``).filter(Boolean).join(`
|
|
54
|
-
`);return e?.isError?`工具错误:${n}`:n}async function yf(e){let t=new URL(e.url),n=e.requestInit;if(e.transport===`http`){let{StreamableHTTPClientTransport:e}=await import(`@modelcontextprotocol/sdk/client/streamableHttp.js`);return new e(t,{requestInit:n})}if(e.transport===`sse`){let{SSEClientTransport:e}=await import(`@modelcontextprotocol/sdk/client/sse.js`);return new e(t,{requestInit:n})}let{WebSocketClientTransport:r}=await import(`@modelcontextprotocol/sdk/client/websocket.js`);return new r(t)}function bf(e,t){return(0,r.tool)(async n=>vf(await t.callTool({name:e.name,arguments:n})),{name:e.name,description:e.description??`MCP tool: ${e.name}`,schema:e.inputSchema})}async function xf(e){let{Client:t}=await import(`@modelcontextprotocol/sdk/client`),n=await yf(e),r=new t({name:`page-agent-sdk`,version:`1.0`},{capabilities:{}});await r.connect(n);let{tools:i}=await r.listTools();return{tools:i.map(e=>bf(e,r)),close:()=>r.close()}}function Sf(e){let t=[],n=null,r=0;for(let i=0;i<e.length;i++){let a=e[i];a.role===`user`?(n&&t.push(n),r++,n={round:r,userMsg:a,assistantMsgs:[],startIdx:i,endIdx:i}):n&&(n.assistantMsgs.push(a),n.endIdx=i)}return n&&t.push(n),t}function Cf(e,t){let n=(e||``).replace(/```[\s\S]*?```/g,`[代码]`).replace(/`([^`]+)`/g,`$1`).replace(/[#*_>\-]\s?/g,``).replace(/\[(代码)\]/g,`「代码」`).replace(/\s+/g,` `).trim();return n.length>t?n.slice(0,t)+`…`:n}function wf(e){let t=[];for(let n of e.assistantMsgs)for(let e of n.steps||[])t.push(e.name);return t}var Tf=`【更早对话摘要`;function Ef(e,t){return!t||!t.body?e:{body:`${t.body}\n【续】\n${e.body}`,rounds:(t.rounds??0)+(e.rounds??0),cumulative:!0}}function Df(e){return typeof e!=`string`||!e.startsWith(`【更早对话摘要`)?null:{body:e.replace(/^【[^】]*】\n?/,``)}}function Of(e){return`${Tf}${e.cumulative?`(${e.rounds??0} 轮,含累积)`:e.rounds?`(${e.rounds} 轮)`:``}】\n${e.body}`}function kf(e,t,n){return Of(Ef({body:n,rounds:e.length},t??void 0))}function Af(e,t){if(t<=0)return{trimmed:!1};let n=Sf(e);if(n.length<=t)return{trimmed:!1};let r=n[n.length-t].startIdx,i=n.slice(0,n.length-t),a=n[0].startIdx,o=null;for(let t=0;t<a;t++){let n=e[t];if(n.role===`system`&&(o=Df(n.content),o))break}return{trimmed:!0,deleteFrom:0,deleteCount:r,summary:{role:`system`,content:Of(Ef({body:i.map(e=>{let t=Cf(e.userMsg.content,60)||`(空)`,n=e.assistantMsgs[0]?Cf(e.assistantMsgs[0].content,80):`(无回复)`;return`- 第${e.round}轮:${t} → ${n}`}).join(`
|
|
55
|
-
`),rounds:i.length},o??void 0)),timestamp:i[0].userMsg.timestamp},older:i,prevSeg:o}}var jf=new Set(`的.了.是.在.我.你.他.她.它.这.那.和.与.及.或.一个.什么.怎么.如何.为什么.可以.能.请.帮.一下.需要.想要.the.a.an.is.are.of.to.in.on`.split(`.`));function Mf(e){return e.toLowerCase().split(/[^a-z0-9一-龥]+/i).map(e=>e.trim()).filter(e=>e.length>=2&&!jf.has(e))}function Nf(e){let t=typeof e.content==`string`?e.content:``;if(e.reasoning&&(t+=e.reasoning),e.steps)for(let n of e.steps)t+=` `+(n.name||``),n.args!=null&&(t+=` `+(typeof n.args==`string`?n.args:JSON.stringify(n.args))),n.result&&(t+=` `+n.result);return Ll(t)}function Pf(e){let t=Nf(e.userMsg);for(let n of e.assistantMsgs)t+=Nf(n);return t}function Ff(e,t){return e.map(e=>{let n=Cf(e.userMsg.content,60)||`(空)`,r=e.assistantMsgs[0]?Cf(e.assistantMsgs[0].content,80):`(无回复)`,i=e.assistantMsgs.flatMap(e=>(e.steps||[]).map(e=>e.name)),a=i.length?` [工具: ${i.join(`, `)}]`:``,o=``;if(t&&t.size){let n=[];for(let r of e.assistantMsgs)for(let e of r.steps||[])e.name&&t.has(e.name)&&e.result&&n.push(`${e.name}: ${Cf(e.result,120)}`);n.length&&(o=`\n 字段提示: ${n.join(` | `)}`)}return`- 第${e.round}轮:${n} → ${r}${a}${o}`}).join(`
|
|
56
|
-
`)}function If(e,t,n){let r=Mf(t);return r.length===0?[]:e.map(e=>{let t=(e.userMsg.content+` `+e.assistantMsgs.map(e=>e.content).join(` `)+` `+e.assistantMsgs.flatMap(e=>(e.steps||[]).map(e=>Cf(e.result||``,120))).join(` `)).toLowerCase(),n=0;for(let e of r)t.includes(e)&&n++;return{r:e,score:n}}).filter(e=>e.score>0).sort((e,t)=>t.score-e.score).slice(0,n).map(e=>e.r)}function Lf(e,t){return t.contextWindow&&t.contextWindow>0?e.reduce((e,t)=>e+Pf(t),0)>t.contextWindow*(t.summaryThresholdRatio??.5):e.length>(t.summaryThresholdRounds??8)}var Rf={windowRounds:6,summaryThresholdRounds:8,toolResultMaxChars:800,enableRecall:!0,recallTopK:3,enableLLMSummary:!1};function zf(e={}){let t={...Rf,...e};async function n(e,n){let r=Sf(e),i=e.length,a=``;if(r.length){let t=r[0].startIdx;for(let n=0;n<t;n++){let t=e[n];if(t.role===`system`){let e=Df(t.content);if(e){a=e.body;break}}}}let o=t=>({messages:e,stats:{triggered:!1,roundsTotal:r.length,roundsSummarized:0,roundsRecalled:0,originalMessages:i,compressedMessages:i,strategy:t}});if(!Lf(r,t))return o(`none`);let s,c,l;if(t.contextWindow&&t.contextWindow>0){let e=t.contextWindow*(n?.windowRatio??t.windowRatio??.4),i=0,a=0;for(let t=r.length-1;t>=0;t--)if(i+=Pf(r[t]),i>=e){a=t+1;break}if(a>r.length-1&&(a=r.length-1),a<0&&(a=0),s=r.slice(a),c=r.slice(0,a),!c.length)return o(`none`);l=`token-window+`}else{let e=n?.keepRounds??t.windowRounds,i=Math.min(Math.max(1,e),r.length);if(s=r.slice(r.length-i),c=r.slice(0,r.length-i),!c.length)return o(`none`);l=`window+`}let u=[...e].reverse().find(e=>e.role===`user`)?.content||``,d=n?.summarize?.mode??(t.enableLLMSummary?`llm`:`index`),f=new Set([...t.preserveLastToolResults??[],...n?.preserveTools??[]]),p=f.size?f:void 0,m,h;if(d===`llm`&&t.llmInvoke)try{m=await t.llmInvoke(Ff(c,p)),h=l+`llm_summary`}catch{m=Ff(c,p),h=l+`index_summary(llm_fallback)`}else m=Ff(c,p),h=l+`index_summary`;let g=n?.recallTopK==null?t.enableRecall?t.recallTopK:0:n.recallTopK,_=g>0?If(c,u,g):[],v=_.length?_.map(e=>`- 第${e.round}轮:${Cf(e.userMsg.content,60)} → ${e.assistantMsgs[0]?Cf(e.assistantMsgs[0].content,80):``}`).join(`
|
|
48
|
+
`:``)+`(skill 脚本执行失败:${n.error})`),i=!1)}return{content:r,cacheable:i}}async function pd(e){if(!e.tools?.length)return[];let t=[];for(let n of e.tools)try{let e=await n(),r=Array.isArray(e)?e:[e];t.push(...r)}catch(t){console.warn(`skill "${e.name}" 工具工厂执行失败:`,t)}return t}function md(e,n){let i=[...e],a=new Map(i.map(e=>[e.name,e])),o=new Set,s=new Map,c={set(e){i=[...e],a=new Map(i.map(e=>[e.name,e])),s.clear(),o.clear()},get(){return i},invalidateCache(e){e?s.delete(e):s.clear()},async getContent(e){let t=a.get(e);if(!t)return null;let r=s.get(e);if(r!=null)return r;let i=await fd(t,n);return r=i.content,i.cacheable&&s.set(e,r),r}},l={name:`skills`,tools:[(0,r.tool)(async({name:e})=>{let t=a.get(e);if(!t)return`未找到 skill "${e}"。`;if(o.has(e))return`skill "${e}" 已在本轮加载,无需重复。`;let r=s.get(e);if(r==null){let i=await fd(t,n);if(r=i.content,!r)return`skill "${e}" 未配置内容(doc / getContent / exec 任选其一)。`;i.cacheable&&s.set(e,r)}if(o.add(e),t.tools?.length&&n?.onToolsReady&&a.get(e)===t)try{let e=await pd(t);e.length&&n.onToolsReady(t.name,e)}catch(t){console.warn(`skill "${e}" 工具加载失败:`,t)}return`skill "${e}" 完整指令:\n\n${r}`},{name:`load_skill`,description:`加载某个 skill 的完整指令到当前上下文(若 skill 配 exec,加载时自动执行脚本注入实时数据;若配 tools,加载后注入附带工具)。先从 system prompt 的 Skills 索引选合适的 skill,再调用此工具。`,schema:t.z.object({name:t.z.string().describe(`skill 名`)})})],beforeAgent:()=>(o.clear(),{skillsMetadata:i.map(e=>({name:e.name,description:e.description})),skillsLoaded:[]}),augmentPrompt:()=>cd(i),afterModel:()=>({skillsLoaded:[...o]})};return Object.defineProperty(l,"controller",{value:c,enumerable:!1,configurable:!1,writable:!1}),l}function hd(e=``){let t=e,n=typeof e==`string`?e:void 0;async function r(){if(typeof t==`string`)return n=t,t;try{n=await t()}catch(e){console.warn(`[page-agent-sdk][memory] 异步求值失败,降级为空:`,e),n=``}return n}return{name:`memory`,beforeAgent:async()=>(n===void 0&&await r(),{memory:n??``}),augmentPrompt:e=>e.memory?`## 持久指令(Memory)\n${e.memory}`:void 0,reset:e=>{t=e,n=typeof e==`string`?e:void 0},get:()=>n??``,refresh:async()=>typeof t==`function`?r():n??``}}var gd=new Set([`set_data`,`edit_data`,`delete_data`,`write`,`vfs_write`,`vfs_edit`]),_d=new Set([`get_data`,`describe_data`,`read`,`query_data`,`search_data`,`vfs_read`,`vfs_ls`,`vfs_glob`,`vfs_grep`]);function vd(e){let t=``;for(let n=0;n<e.length;n++){let r=e[n];r===`*`?e[n+1]===`*`?(t+=`.*`,n++):t+=`[^/]*`:".+?^${}()|[]\\".includes(r)?t+=`\\`+r:t+=r}return RegExp(`^`+t+`$`)}function yd(e,t,n){for(let r of e)if(r.operations.includes(t)&&r.scopes.some(e=>vd(e).test(n)))return r.mode;return`allow`}function bd(e){let t=e??{},n=new Set;if(typeof t.jsonPath==`string`&&t.jsonPath&&n.add(t.jsonPath),typeof t.path==`string`&&t.path&&n.add(t.path),t.patch&&typeof t.patch.jsonPath==`string`&&t.patch.jsonPath&&n.add(t.patch.jsonPath),Array.isArray(t.patches))for(let e of t.patches)e&&typeof e.jsonPath==`string`&&e.jsonPath&&n.add(e.jsonPath);return[...n]}function xd(e){return{name:`permissions`,wrapToolCall:async(t,n)=>{let r=gd.has(t.name)?`write`:_d.has(t.name)?`read`:null,i=bd(t.args);if(r&&i.length){for(let t of i)if(yd(e,r,t)===`deny`)return{content:`权限拒绝:${r} 操作 "${t}" 被 permissions 规则禁止。`,status:`error`}}return n(t)}}}function Sd(e={}){let t=(t,n)=>e.confirm?!!e.confirm(t,n):e.tools===void 0||e.tools.includes(t);return{name:`approval`,wrapToolCall:async(n,r)=>t(n.name,n.args)?new Promise(t=>{let i=!1,a=[],o=e=>{if(!i)if(i=!0,a.forEach(e=>e()),e===!1){let e=n.args??{},r=e.path||e.jsonPath||e.patch?.jsonPath||(Array.isArray(e.patches)?e.patches.map(e=>e?.jsonPath).filter(Boolean).join(`,`):``)||``;t({content:`用户拒绝了 ${n.name} 调用${r?`(path=${r})`:``}。请改用只读工具、调整路径或换方案后再试。`,status:`error`})}else r(n).then(t,e=>t({content:`工具执行失败:${e?.message??e}`,status:`error`}))};if(n.signal){if(n.signal.aborted)return o(!1);let e=()=>o(!1);n.signal.addEventListener(`abort`,e,{once:!0}),a.push(()=>n.signal?.removeEventListener(`abort`,e))}if(e.timeoutMs&&e.timeoutMs>0){let t=setTimeout(()=>o(!1),e.timeoutMs);a.push(()=>clearTimeout(t))}n.emit?.({type:`approval_request`,toolName:n.name,args:n.args,resolve:o})}):r(n)}}var Cd=`request_human_confirmation`,wd=t.z.object({question:t.z.string().describe(`要征询用户的问题/方案描述。清晰具体:说明当前情况、为什么需要确认、确认什么。`),options:t.z.array(t.z.string()).optional().describe(`可选方案列表(2-4 个)。用户从中选一个。不传则用户只回答允许/拒绝。`),recommendation:t.z.string().optional().describe(`你推荐的方案(优先在 options 中选一个)及推荐理由,帮用户快速决策。`),context:t.z.string().optional().describe(`补充上下文:已做了什么、约束、影响范围等,帮用户判断。`)});function Td(){return(0,r.tool)(async()=>`人工确认中间件未装载,无法征询用户。请直接向用户说明情况并等待回复。`,{name:Cd,description:[`当遇到以下情况时,主动调用本工具征询用户确认后再继续(不要默默猜测后直接执行高风险动作):`,`1) 不确定用户意图、需求有歧义;`,`2) 存在多种可行方案且取舍影响较大;`,`3) 即将执行高风险或不可逆操作(删除、覆盖、批量改动、对外发布等);`,`4) 操作超出原始指令范围。`,`入参:question=问题/方案描述;options=可选方案列表(多方案时给);recommendation=你推荐的方案及理由。`,`用户选择后,据其回答继续;若用户拒绝,停止当前操作并询问如何调整。`].join(``),schema:wd})}function Ed(){return{name:`humanConfirm`,wrapToolCall:async(e,t)=>e.name===`request_human_confirmation`?new Promise(t=>{let n=!1,r=[],i=i=>{n||(n=!0,r.forEach(e=>e()),t(i===!1?{content:`用户拒绝了该方案。请停止当前操作,询问用户希望如何调整,不要擅自执行。`,status:`done`}:i===!0?{content:`用户同意了方案${e.args?.recommendation?`(${e.args.recommendation})`:``}。请继续执行。`,status:`done`}:{content:`用户选择了:${i}。请据此方案继续。`,status:`done`}))};if(e.signal){if(e.signal.aborted)return i(!1);let t=()=>i(!1);e.signal.addEventListener(`abort`,t,{once:!0}),r.push(()=>e.signal?.removeEventListener(`abort`,t))}e.emit?.({type:`approval_request`,toolName:e.name,args:e.args,resolve:i})}):t(e)}}function Dd(e){if(typeof e!=`object`||!e)return e;if(typeof structuredClone==`function`)try{return structuredClone(e)}catch{}return JSON.parse(JSON.stringify(e))}function Od(e,t){let n=t.split(`.`),r=e;for(let e of n){if(r==null)return;r=r[e]}return r}function kd(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++)i[r[e]]??(i[r[e]]={}),i=i[r[e]];i[r[r.length-1]]=n}function Ad(e,t){if(Array.isArray(e)){e.length=0,Array.isArray(t)&&e.push(...t);return}let n=t&&typeof t==`object`&&!Array.isArray(t)?t:{};for(let t of Object.keys(e))t in n||delete e[t];for(let t of Object.keys(n))e[t]=n[t]}function jd(e,t){let n=Od(window,e);typeof n==`object`&&n?Ad(n,t):kd(window,e,t)}function Md(e){let t=e.slice();for(;t.length;){let e=t[t.length-1];if(e.role===`assistant`&&!e.content&&!e.steps?.length&&!e.reasoning)t.pop();else break}return t}function Nd(e){let t=[],n=e.maxCheckpoints??5,r=1,i,a;return{save(o){let s=Md(e.messages),c={};if(e.getData)((e.consumeDataDirty?.()??!0)||a===void 0)&&(a=Dd(e.getData())),c[``]=a;else for(let t of e.slotPaths??[])c[t]=Dd(Od(window,t));((e.vfsStore.consumeDirty?.()??!0)||i===void 0)&&(i=Dd(e.vfsStore.files));let l={id:r++,label:o,timestamp:Date.now(),messages:Dd(s),windowVals:c,vfs:i,todos:Dd(e.getTodos()),messageCount:s.length};for(t.push(l);t.length>n;)t.shift();return l.id},list(){return t.map(e=>({id:e.id,label:e.label,timestamp:e.timestamp,messageCount:e.messageCount}))},canRestore(){return t.length>0},restore(n){let r=n==null?t[t.length-1]:t.find(e=>e.id===n);if(!r)return!1;if(e.messages.splice(0,e.messages.length,...Dd(r.messages)),e.getData){let t=r.windowVals[``];if(t!==void 0){let n=e.getData();typeof n==`object`&&n&&Ad(n,Dd(t))}}else for(let[e,t]of Object.entries(r.windowVals))jd(e,Dd(t));let o=e.vfsStore.files;for(let e of Object.keys(o))delete o[e];return Object.assign(o,Dd(r.vfs)),e.todosMw.reset(Dd(r.todos)),a=void 0,i=void 0,!0},exportStack(){return Dd(t)},importStack(e){t.length=0,i=void 0,a=void 0;let n=Array.isArray(e)?e:[];for(let e of n)e&&typeof e==`object`&&`id`in e&&`messages`in e&&typeof e.id==`number`&&Number.isFinite(e.id)&&t.push(e);r=t.reduce((e,t)=>Math.max(e,t.id),0)+1}}}function Pd(e){let t=!1;return{name:`checkpoint`,beforeAgent:()=>{t=!1},beforeModel:()=>{t||(t=!0,e.save(`auto`))}}}function Fd(e){let t=[],n=null,r=0;for(let i=0;i<e.length;i++){let a=e[i];a.role===`user`?(n&&t.push(n),r++,n={round:r,userMsg:a,assistantMsgs:[],startIdx:i,endIdx:i}):n&&(n.assistantMsgs.push(a),n.endIdx=i)}return n&&t.push(n),t}function Id(e,t){let n=(e||``).replace(/```[\s\S]*?```/g,`[代码]`).replace(/`([^`]+)`/g,`$1`).replace(/[#*_>\-]\s?/g,``).replace(/\[(代码)\]/g,`「代码」`).replace(/\s+/g,` `).trim();return n.length>t?n.slice(0,t)+`…`:n}function Ld(e){let t=[];for(let n of e.assistantMsgs)for(let e of n.steps||[])t.push(e.name);return t}var Rd=`【更早对话摘要`;function zd(e,t){return!t||!t.body?e:{body:`${t.body}\n【续】\n${e.body}`,rounds:(t.rounds??0)+(e.rounds??0),cumulative:!0}}function Bd(e){return typeof e!=`string`||!e.startsWith(`【更早对话摘要`)?null:{body:e.replace(/^【[^】]*】\n?/,``)}}function Vd(e){return`${Rd}${e.cumulative?`(${e.rounds??0} 轮,含累积)`:e.rounds?`(${e.rounds} 轮)`:``}】\n${e.body}`}function Hd(e,t,n){return Vd(zd({body:n,rounds:e.length},t??void 0))}function Ud(e,t){if(t<=0)return{trimmed:!1};let n=Fd(e);if(n.length<=t)return{trimmed:!1};let r=n[n.length-t].startIdx,i=n.slice(0,n.length-t),a=n[0].startIdx,o=null;for(let t=0;t<a;t++){let n=e[t];if(n.role===`system`&&(o=Bd(n.content),o))break}return{trimmed:!0,deleteFrom:0,deleteCount:r,summary:{role:`system`,content:Vd(zd({body:i.map(e=>{let t=Id(e.userMsg.content,60)||`(空)`,n=e.assistantMsgs[0]?Id(e.assistantMsgs[0].content,80):`(无回复)`;return`- 第${e.round}轮:${t} → ${n}`}).join(`
|
|
49
|
+
`),rounds:i.length},o??void 0)),timestamp:i[0].userMsg.timestamp},older:i,prevSeg:o}}var Wd=new Set(`的.了.是.在.我.你.他.她.它.这.那.和.与.及.或.一个.什么.怎么.如何.为什么.可以.能.请.帮.一下.需要.想要.the.a.an.is.are.of.to.in.on`.split(`.`));function Gd(e){return e.toLowerCase().split(/[^a-z0-9一-龥]+/i).map(e=>e.trim()).filter(e=>e.length>=2&&!Wd.has(e))}function Kd(e){let t=typeof e.content==`string`?e.content:``;if(e.reasoning&&(t+=e.reasoning),e.steps)for(let n of e.steps)t+=` `+(n.name||``),n.args!=null&&(t+=` `+(typeof n.args==`string`?n.args:JSON.stringify(n.args))),n.result&&(t+=` `+n.result);return Ll(t)}function qd(e){let t=Kd(e.userMsg);for(let n of e.assistantMsgs)t+=Kd(n);return t}function Jd(e,t){return e.map(e=>{let n=Id(e.userMsg.content,60)||`(空)`,r=e.assistantMsgs[0]?Id(e.assistantMsgs[0].content,80):`(无回复)`,i=e.assistantMsgs.flatMap(e=>(e.steps||[]).map(e=>e.name)),a=i.length?` [工具: ${i.join(`, `)}]`:``,o=``;if(t&&t.size){let n=[];for(let r of e.assistantMsgs)for(let e of r.steps||[])e.name&&t.has(e.name)&&e.result&&n.push(`${e.name}: ${Id(e.result,120)}`);n.length&&(o=`\n 字段提示: ${n.join(` | `)}`)}return`- 第${e.round}轮:${n} → ${r}${a}${o}`}).join(`
|
|
50
|
+
`)}function Yd(e,t,n){let r=Gd(t);return r.length===0?[]:e.map(e=>{let t=(e.userMsg.content+` `+e.assistantMsgs.map(e=>e.content).join(` `)+` `+e.assistantMsgs.flatMap(e=>(e.steps||[]).map(e=>Id(e.result||``,120))).join(` `)).toLowerCase(),n=0;for(let e of r)t.includes(e)&&n++;return{r:e,score:n}}).filter(e=>e.score>0).sort((e,t)=>t.score-e.score).slice(0,n).map(e=>e.r)}function Xd(e,t){return t.contextWindow&&t.contextWindow>0?e.reduce((e,t)=>e+qd(t),0)>t.contextWindow*(t.summaryThresholdRatio??.5):e.length>(t.summaryThresholdRounds??8)}var Zd={windowRounds:6,summaryThresholdRounds:8,toolResultMaxChars:800,enableRecall:!0,recallTopK:3,enableLLMSummary:!1};function Qd(e={}){let t={...Zd,...e};async function n(e,n){let r=Fd(e),i=e.length,a=``;if(r.length){let t=r[0].startIdx;for(let n=0;n<t;n++){let t=e[n];if(t.role===`system`){let e=Bd(t.content);if(e){a=e.body;break}}}}let o=t=>({messages:e,stats:{triggered:!1,roundsTotal:r.length,roundsSummarized:0,roundsRecalled:0,originalMessages:i,compressedMessages:i,strategy:t}});if(!Xd(r,t))return o(`none`);let s,c,l;if(t.contextWindow&&t.contextWindow>0){let e=t.contextWindow*(n?.windowRatio??t.windowRatio??.4),i=0,a=0;for(let t=r.length-1;t>=0;t--)if(i+=qd(r[t]),i>=e){a=t+1;break}if(a>r.length-1&&(a=r.length-1),a<0&&(a=0),s=r.slice(a),c=r.slice(0,a),!c.length)return o(`none`);l=`token-window+`}else{let e=n?.keepRounds??t.windowRounds,i=Math.min(Math.max(1,e),r.length);if(s=r.slice(r.length-i),c=r.slice(0,r.length-i),!c.length)return o(`none`);l=`window+`}let u=[...e].reverse().find(e=>e.role===`user`)?.content||``,d=n?.summarize?.mode??(t.enableLLMSummary?`llm`:`index`),f=new Set([...t.preserveLastToolResults??[],...n?.preserveTools??[]]),p=f.size?f:void 0,m,h;if(d===`llm`&&t.llmInvoke)try{m=await t.llmInvoke(Jd(c,p)),h=l+`llm_summary`}catch{m=Jd(c,p),h=l+`index_summary(llm_fallback)`}else m=Jd(c,p),h=l+`index_summary`;let g=n?.recallTopK==null?t.enableRecall?t.recallTopK:0:n.recallTopK,_=g>0?Yd(c,u,g):[],v=_.length?_.map(e=>`- 第${e.round}轮:${Id(e.userMsg.content,60)} → ${e.assistantMsgs[0]?Id(e.assistantMsgs[0].content,80):``}`).join(`
|
|
57
51
|
`):``,y=a?`${m}\n【更早累积摘要】\n${a}`:m,b=[`【对话历史摘要】以下是之前 ${c.length} 轮对话的要点(最新 ${s.length} 轮已完整保留):`,y];if(n){let e=t.contextWindow&&t.contextWindow>0?`windowRatio=${n.windowRatio??t.windowRatio}`:`keepRounds=${n.keepRounds??t.windowRounds}`;b.push(`\n(压缩决策:${e} · 摘要=${n.summarize.mode} · 召回=${g}${n.reason?` · `+n.reason:``})`)}v&&b.push(`
|
|
58
52
|
【与当前问题可能相关的早期对话】`,v);let x=t.getRegisteredData??t.getRegisteredSlots;if(x)try{let e=x();if(e.length){let t=e.map(e=>`- ${e.path?e.path+`: `:``}${e.description}`).join(`
|
|
59
53
|
`);b.push(`
|
|
60
54
|
【当前可操作数据(动态增删后的最新状态,操作前以 describe_data / read 为准)】`,t)}}catch{}let S={role:`system`,content:b.join(`
|
|
61
|
-
`),timestamp:Date.now()},C=[];for(let e of s)C.push(e.userMsg),C.push(...e.assistantMsgs);let w=[S,...C],T=w.reduce((e,t)=>e+Ll(typeof t.content==`string`?t.content:JSON.stringify(t.content)),0);return t.contextWindow&&T>t.contextWindow&&console.warn(`[page-agent-sdk] compress 后仍超窗口:${T} > ${t.contextWindow} tokens(单条消息超窗口,compress 无法压)`),{messages:w,stats:{triggered:!0,roundsTotal:r.length,roundsSummarized:c.length,roundsRecalled:_.length,originalMessages:i,compressedMessages:w.length,strategy:h,decision:n}}}return{compress:n,config:t}}function
|
|
55
|
+
`),timestamp:Date.now()},C=[];for(let e of s)C.push(e.userMsg),C.push(...e.assistantMsgs);let w=[S,...C],T=w.reduce((e,t)=>e+Ll(typeof t.content==`string`?t.content:JSON.stringify(t.content)),0);return t.contextWindow&&T>t.contextWindow&&console.warn(`[page-agent-sdk] compress 后仍超窗口:${T} > ${t.contextWindow} tokens(单条消息超窗口,compress 无法压)`),{messages:w,stats:{triggered:!0,roundsTotal:r.length,roundsSummarized:c.length,roundsRecalled:_.length,originalMessages:i,compressedMessages:w.length,strategy:h,decision:n}}}return{compress:n,config:t}}function $d(e={}){let t=Qd(e);return Object.assign({name:`summarization`,compressInput:async n=>{let r;if(e.decideInvoke){let i=Fd(n);if(Xd(i,t.config)){let a=t.config.contextWindow&&t.config.contextWindow>0?`token`:`rounds`,o=a===`token`?`历史 token 超阈值 ${Math.round((t.config.contextWindow??0)*(t.config.summaryThresholdRatio??.5))}`:`轮数 ${i.length} 超阈值 ${t.config.summaryThresholdRounds}`;try{r=await e.decideInvoke({getMessages:()=>n,getSnapshot:e.getSnapshot,contextWindow:t.config.contextWindow,thresholdRatio:t.config.summaryThresholdRatio,triggerReason:o,triggerMode:a})??void 0}catch{r=void 0}}}let{messages:i,stats:a}=await t.compress(n,r);return{messages:i,stats:a}}},{setContextWindow(e){t.config.contextWindow=e}})}function ef(e){return!!e&&typeof e==`object`&&typeof e.invoke==`function`&&typeof e.stream==`function`}var tf=[`describe_data`,`get_data`,`read`,`query_data`,`search_data`,`fetch_document`],nf=1,rf=4,af=6,of=[`spawn_agent`,`spawn_agents`],sf=[`write`,`set_data`,`edit_data`,`delete_data`,`draft_commit`];function cf(e){let t=[];if(typeof e.jsonPath==`string`&&e.jsonPath&&t.push(e.jsonPath),typeof e.path==`string`&&e.path&&t.push(e.path),e.patch&&typeof e.patch.jsonPath==`string`&&t.push(e.patch.jsonPath),Array.isArray(e.patches))for(let n of e.patches)n&&typeof n.jsonPath==`string`&&t.push(n.jsonPath);return t}function lf(e,t){return t.some(t=>e===t||e.startsWith(t+`.`)||e.startsWith(t+`[`))}function uf(e,t){let n=e.invoke.bind(e),r=async e=>{let r=cf(e);if(!r.length)return`PATH_OUT_OF_SCOPE:子 agent 仅可增量 patch(writablePaths: ${t.join(`, `)}),不能整体替换(无 jsonPath)。用 write({patch:{jsonPath,...}}) 增量改。`;for(let e of r)if(!lf(e,t))return`PATH_OUT_OF_SCOPE:子 agent 写 "${e}" 越界(仅可写 ${t.join(`, `)})。`;return n(e)};return new Proxy(e,{get(e,t,n){return t===`invoke`?r:Reflect.get(e,t,n)}})}async function df(e,t,n,r,i){let a=t.depth??0,o=t.maxDepth??nf,s=new Set([...tf,...t.allowedTools??[]]),c=()=>typeof t.allTools==`function`?t.allTools():t.allTools,l=[...c().filter(e=>s.has(e.name)&&!of.includes(e.name)),...t.extraTools??[]];if(t.writablePaths?.length){l=l.filter(e=>!sf.includes(e.name));let e=c().filter(e=>sf.includes(e.name)&&!of.includes(e.name)).map(e=>uf(e,t.writablePaths));l=[...l,...e]}let u=a+1<o?[ff({...t,depth:a+1})]:[],d=t.getFocuses?.()??[],f=d.length?Ju({getSchema:t.getSchema??(()=>null),initialFocuses:d}):void 0,p=Il({model:ef(t.llm)?t.llm.model??t.llm.modelName:e.model??t.llm.model,contextWindow:t.llm.contextWindow,maxOutputTokens:t.llm.maxOutputTokens});if(p.contextWindow<2e5)throw Error(`[page-agent-sdk][subagent] 子 agent 模型上下文窗口 ${p.contextWindow} 小于最小支持 ${Fl}(需 ≥200K 窗口模型)`);let m=t.summarization===void 0?void 0:$d(typeof t.summarization==`object`?{contextWindow:p.contextWindow,...t.summarization}:{contextWindow:p.contextWindow}),h=fu({contextWindow:p.contextWindow,maxOutputTokens:p.maxOutputTokens,...ef(t.llm)?{llm:t.llm}:{apiKey:t.llm.apiKey,baseUrl:t.llm.baseUrl,model:e.model??t.llm.model,temperature:t.temperature??t.llm.temperature,maxTokens:t.maxTokens??t.llm.maxTokens},systemPrompt:e.role?.trim()||t.systemPrompt||`你是一个专注的子任务执行者。你只有只读工具(读主数据 / 抓文档),用它们完成给定任务,给出简洁结论,不要展开多余解释。`,tools:l,middleware:[...t.skills?.length?[md(t.skills)]:[],...m?[m]:[],...u,...f?[f]:[],...t.middleware??[]],maxToolRounds:t.maxToolRounds??af,onLog:i,debug:t.debug});return t.debug&&console.log(`[subagent] 启动子 agent(depth=${a},工具 ${l.length} 个)`),h.stream([{role:`user`,content:e.prompt,timestamp:Date.now()}],e=>{r&&(e.type===`tool_call`||e.type===`tool_result`)&&r(e)},n)}function ff(e){let n=e.maxParallel??rf,i,a,o,s=(e,t)=>n=>{a&&a({type:`subagent`,taskId:e,label:t,kind:n.type,name:n.name,args:n.type===`tool_call`?n.args:void 0,result:n.type===`tool_result`?n.result:void 0,status:n.type===`tool_result`?n.status:void 0})};return{name:`subagent`,tools:[(0,r.tool)(async({prompt:t,role:n,tools:r,writablePaths:a,model:c})=>{let l=r?.length||a?.length?{...e,...r?.length?{allowedTools:r}:{},...a?.length?{writablePaths:a}:{}}:e,u=`sub-${Math.random().toString(36).slice(2,8)}`,d=n?.trim()||`子任务`;return await df({prompt:t,role:n,model:c},l,i,s(u,d),e=>o?.({...e,source:`子:${d}`}))},{name:`spawn_agent`,description:`委派一个独立子 agent 执行子任务,返回其最终结论(过程隔离,不占主上下文)。用于:分治大任务、专项调研、独立验证。子 agent 默认只读(不改页面)。`,schema:t.z.object({prompt:t.z.string().describe(`子任务描述(子 agent 的唯一输入)`),role:t.z.string().optional().describe(`子 agent 身份(如"你是代码审查专家")`),tools:t.z.array(t.z.string()).optional().describe(`子 agent 可用工具名白名单(默认只读主数据 + fetch)`),writablePaths:t.z.array(t.z.string()).optional().describe(`子 agent 可写路径前缀(给写权限;越界 PATH_OUT_OF_SCOPE;如 ["components"] 允许写 components.* )`),model:t.z.string().optional().describe(`覆盖模型(默认同主)`)})}),(0,r.tool)(async({tasks:t})=>(await Ml(t,n,async(t,n)=>{let r=`sub-${n}-${Math.random().toString(36).slice(2,6)}`,a=t.role?.trim()||`子任务${n+1}`;return df(t,e,i,s(r,a),e=>o?.({...e,source:`子:${a}`}))},i)).map((e,t)=>`【子任务 ${t+1}】\n${e??`(未完成)`}`).join(`
|
|
56
|
+
|
|
57
|
+
`),{name:`spawn_agents`,description:`并行委派多个独立子 agent,聚合各自结论(子 agent 间互不通信,由你汇总)。适合:多路调研、多视角审查、批量处理。`,schema:t.z.object({tasks:t.z.array(t.z.object({prompt:t.z.string().describe(`子任务描述`),role:t.z.string().optional()})).min(1).max(8).describe(`子任务列表(最多 8 个)`)})})],wrapToolCall:async(e,t)=>(e.signal&&(i=e.signal),e.emit&&(a=e.emit),e.logSink&&(o=e.logSink),t(e))}}var pf=/^[a-zA-Z_][a-zA-Z0-9_]*$/;function mf(e,t){let n=e.tools??[];return{llm:e.llm??t.llm,allTools:t.allTools,systemPrompt:e.systemPrompt,temperature:e.temperature,maxTokens:e.maxTokens,skills:e.skills,extraTools:n.length?n:void 0,maxToolRounds:e.maxToolRounds,debug:t.debug,...e.writablePaths?.length?{writablePaths:e.writablePaths}:{},...e.allowedTools?.length?{allowedTools:e.allowedTools}:{},...e.middleware?.length?{middleware:e.middleware}:{},...e.summarization===void 0?{}:{summarization:e.summarization},...t.getFocuses?{getFocuses:t.getFocuses}:{},...t.getSchema?{getSchema:t.getSchema}:{}}}function hf(e,n){let i,a,o,s=(e,t)=>n=>{a&&a({type:`subagent`,taskId:e,label:t,kind:n.type,name:n.name,args:n.type===`tool_call`?n.args:void 0,result:n.type===`tool_result`?n.result:void 0,status:n.type===`tool_result`?n.status:void 0})},c=[],l=[],u;function d(e){let a=new Set,c=[],l=[];for(let u of e){if(!pf.test(u.id)){console.warn(`[subagents] id "${u.id}" 非合法工具名(须 [a-zA-Z_][a-zA-Z0-9_]*),已跳过`);continue}let e=`use_${u.id}`;if(a.has(e)){console.warn(`[subagents] id "${u.id}" 重复,已跳过`);continue}a.add(e),c.push(u),l.push((0,r.tool)(async({task:e})=>{let t=mf(u,n);return df({prompt:e},t,i,s(`use_${u.id}`,u.id),e=>o?.({...e,source:`子:${u.id}`}))},{name:`use_${u.id}`,description:`委派给「${u.description}」子 agent 执行任务,返回其结论(过程隔离,不占主上下文)。`,schema:t.z.object({task:t.z.string().describe(`委派给该子 agent 的任务描述`)})}))}return{valid:c,tools:l}}let f=d(e);c=f.valid,l=f.tools;let p={set(e){let t=d(e);c=t.valid,l=t.tools,u?.()},add(e){if(c.some(t=>t.id===e.id)){console.warn(`[subagents] add: id "${e.id}" 已存在,已跳过`);return}let t=d([...c,e]);c=t.valid,l=t.tools,u?.()},remove(e){if(c.findIndex(t=>t.id===e)<0)return!1;let t=d(c.filter(t=>t.id!==e));return c=t.valid,l=t.tools,u?.(),!0},get:()=>[...c]},m={name:`subagents`,get tools(){return l},augmentPrompt:()=>c.length?[`## 可用子 agent(预声明,经专属工具委派)`,...c.map(e=>`- use_${e.id}: ${e.description}`),`复杂或专项任务(检索 / 生成 / 调研 / 多步等)优先委派子 agent:过程隔离不占主上下文 + 各子 agent 专项处理更优。需要时直接调 use_<id>({ task }) 委派,任务描述要清晰(含背景 + 用户观点/反馈,转述给子 agent);委派后信任子 agent 自主完成,不微操、不读其代码/中间细节(少占主上下文),只据其结论继续。简单任务(单字段改、直接读)用内置工具更快,不必委派。`].join(`
|
|
58
|
+
`):void 0,wrapToolCall:async(e,t)=>(e.signal&&(i=e.signal),e.emit&&(a=e.emit),e.logSink&&(o=e.logSink),t(e))};return Object.defineProperty(m,"controller",{value:p,enumerable:!1}),Object.defineProperty(m,"setReconfigureHook",{value:e=>{u=e},enumerable:!1}),m}function gf(e){return{name:`verify`,async beforeReturn({messages:t,state:n,log:r}){let i=await e.check({messages:t,state:n});if(!i.ok)return i.feedback??`结果未通过验证,请复查。`;if(e.adversarial){r?.(`middleware`,{stage:`adversarial_start`,model:wf(e.adversarial.llm),tools:(e.adversarial.tools??[]).length});let n=await Of(t,e.adversarial.llm,r,e.adversarial.tools);if(r?.(`middleware`,{stage:`adversarial_done`,clean:n===null,feedback:n}),n)return n}return null}}}var _f=new Set([`set_data`,`edit_data`,`delete_data`,`write`]),vf=/校验失败|SCHEMA_INVALID|未注册|不存在|仅支持|必须是|NOT_OBJECT|PATH_UNSAFE|VERSION_CONFLICT|WRITE_INTERCEPT/;function yf(e){let t=new Map;for(let n of e){let e=n?.tool_calls;if(Array.isArray(e))for(let n of e){if(!_f.has(n.name))continue;let e=n.id,r=n?.args??{};if(n.name===`write`)if(r.del&&r.patch?.jsonPath)t.set(r.patch.jsonPath,{path:r.patch.jsonPath,op:`delete_data`,callId:e});else if(Array.isArray(r.patches)&&r.patches.length)for(let n of r.patches){let r=typeof n?.jsonPath==`string`?n.jsonPath:``;t.set(r,{path:r,op:n?.op===`remove`?`delete_data`:`edit_data`,callId:e})}else if(r.patch){let n=typeof r.patch.jsonPath==`string`?r.patch.jsonPath:``;t.set(n,{path:n,op:r.patch.op===`remove`?`delete_data`:`edit_data`,callId:e})}else t.set(``,{path:``,op:`set_data`,callId:e});else{let i=typeof r.jsonPath==`string`?r.jsonPath:``;t.set(i,{path:i,op:n.name,callId:e})}}}return[...t.values()]}function bf(e){let t=new Map;for(let n of e){let e=n?.tool_call_id,r=n?.content;typeof e==`string`&&typeof r==`string`&&t.set(e,r)}return t}function xf(e,t){if(t===``)return e;if(e==null)return;let n=e;for(let e of t.split(`.`)){if(n==null)return;n=n[e]}return n}function Sf(e={}){let t=typeof e.root==`function`?e.root:e.root===void 0?()=>e.window??globalThis.window:()=>e.root,n=typeof e.schemas==`function`?e.schemas:()=>e.schemas??{};return async({messages:e})=>{let r=yf(e);if(!r.length)return{ok:!0};let i=bf(e),a=n()[``],o=t(),s=[];for(let{path:e,op:t,callId:n}of r){let r=n?i.get(n):void 0;if(r&&vf.test(r))continue;let c=xf(o,e);if(t===`delete_data`)c!==void 0&&s.push(`${e} 删除后读回仍有值,疑似未生效`);else if(c==null)s.push(`写入 ${e} 后读回为空,疑似未生效`);else if(a){let t=a.safeParse(o);t.success||s.push(`${e} 读回值不符合 schema:${t.error.issues?.[0]?.message??`校验失败`}`)}}return s.length?{ok:!1,feedback:s.join(`;
|
|
59
|
+
`)}:{ok:!0}}}function Cf(e){return!!e&&typeof e==`object`&&typeof e.invoke==`function`&&typeof e.stream==`function`}function wf(e){return Cf(e)?e.model??e.modelName??`<实例>`:e.model??`<配置>`}var Tf=/无问题|没有问题|未发现问题|没有发现|没问题|未发现/;function Ef(e){return Tf.test(e)}function Df(e){let t=``,n=``;for(let r of e)r instanceof i.HumanMessage?t=typeof r.content==`string`?r.content:``:r instanceof i.AIMessage&&!(r.tool_calls?.length>0)&&(n=typeof r.content==`string`?r.content:``);return{lastUser:t,lastReply:n}}async function Of(e,t,n,r){let{lastUser:i,lastReply:a}=Df(e);if(!a)return null;let o=Array.isArray(r)&&r.length>0,s=[`你是严格的对抗式审查者,目标是找出以下 AI 助手回复的错误并证明它有问题(事实错误 / 遗漏 / 逻辑矛盾 / 与需求不符)。`,`用户需求:${i||`(未明确)`}`,`助手回复:${a}`,o?`重点检查主数据修改:① jsonPath 是否正确(是否误写不存在的子路径);② 值类型是否符合主数据 schema;③ 语义是否符合字段 description。可用只读工具(read / get_data / describe_data 等)读回实际值实证。`:`只报告具体、可验证的问题。`,`若确实无问题,只回复"无问题"。`].join(`
|
|
60
|
+
`),c=`你是严格的对抗式审查者,只找问题不赞美。目标是反驳,不是改进。`,l=n?e=>n(e.type,{...e.data,source:`adversarial`}):void 0,u=await fu(Cf(t)?{llm:t,tools:r,maxToolRounds:o?4:1,systemPrompt:c,onLog:l}:{apiKey:t.apiKey,baseUrl:t.baseUrl,model:t.model,temperature:0,maxTokens:t.maxTokens,tools:r,maxToolRounds:o?4:1,systemPrompt:c,onLog:l}).invoke([{role:`user`,content:s,timestamp:Date.now()}]);return n?.(`middleware`,{stage:`adversarial_verdict`,verdict:u,source:`adversarial`}),Ef(u)?null:u.trim()}var kf=[{prefix:`## 可操作数据`,key:`dataHint`},{prefix:`## 能力使用提示`,key:`usageHints`},{prefix:`## 当前主线目标`,key:`mission`},{prefix:`## 工作记忆`,key:`workingMemory`},{prefix:`【更早对话摘要`,key:`memory`},{prefix:`【对话历史摘要】`,key:`summary`},{prefix:`【与当前问题可能相关的早期对话】`,key:`recall`}],Af=[{key:`systemPrompt`,label:`系统提示词(身份/规则)`},{key:`dataHint`,label:`可操作数据(schema)`},{key:`usageHints`,label:`能力使用提示`},{key:`mission`,label:`主线目标(mission)`},{key:`workingMemory`,label:`工作记忆`},{key:`memory`,label:`更早对话摘要`},{key:`summary`,label:`对话历史摘要`},{key:`recall`,label:`相关早期对话(召回)`},{key:`history`,label:`历史对话`},{key:`current`,label:`当前问题`},{key:`assistant`,label:`助手回复`},{key:`toolResults`,label:`工具结果/参数`},{key:`other`,label:`其他`}];function jf(){let e={};for(let t of Af)e[t.key]={key:t.key,label:t.label,tokens:0,pct:0,msgCount:0};return e}function Mf(e,t){e.tokens+=t,e.msgCount+=1}function Nf(e){let t=e.content;return typeof t==`string`?t:JSON.stringify(t??``)}function Pf(e,t){let n=[];for(let t of kf){let r=0;for(;;){let i=e.indexOf(t.prefix,r);if(i<0)break;n.push({idx:i,key:t.key}),r=i+t.prefix.length}}if(n.sort((e,t)=>e.idx-t.idx),!n.length){let n=e.trim();n&&Mf(t.systemPrompt,Ll(n));return}if(n[0].idx>0){let r=e.slice(0,n[0].idx).trim();r&&Mf(t.systemPrompt,Ll(r))}for(let r=0;r<n.length;r++){let i=n[r].idx,a=r+1<n.length?n[r+1].idx:e.length,o=e.slice(i,a).trim();o&&Mf(t[n[r].key],Ll(o))}}function Ff(e,t={}){let n=jf(),r=-1;for(let t=e.length-1;t>=0;t--)if(e[t]instanceof i.HumanMessage){r=t;break}for(let t=0;t<e.length;t++){let a=e[t];if(a instanceof i.SystemMessage)Pf(Nf(a),n);else if(a instanceof i.HumanMessage)Mf(n[t===r?`current`:`history`],Ll(Nf(a)));else if(a instanceof i.AIMessage){let e=a.tool_calls??[];if(e.length){let t=e.map(e=>JSON.stringify(e.args??{})).join(` `);Mf(n.toolResults,Ll(t))}else Mf(n.assistant,Ll(Nf(a)))}else a instanceof i.ToolMessage?Mf(n.toolResults,Ll(Nf(a))):Mf(n.other,Ll(Nf(a)))}let a=Object.values(n).filter(e=>e.tokens>0);a.sort((e,t)=>t.tokens-e.tokens);let o=a.reduce((e,t)=>e+t.tokens,0);for(let e of a)e.pct=o>0?e.tokens/o:0;let s=t.contextWindow;return{totalTokens:o,contextWindow:s,occupancy:s?o/s:0,thresholdRatio:t.thresholdRatio??0,categories:a}}function If(e={}){let t,n=e.contextWindow;return{name:`context-inspector`,async wrapModelCall(r,i){return t=Ff(r.messages,{contextWindow:n,thresholdRatio:e.thresholdRatio}),i(r)},getSnapshot:()=>t,setContextWindow:e=>{n=e}}}function Lf(e){let t=e?.content;if(!Array.isArray(t)||!t.length)return``;let n=t.map(e=>e.type===`text`&&e.text?e.text:e.type===`image`&&e.data?`[image:${String(e.data).slice(0,32)}…]`:e.type===`audio`&&e.data?`[audio]`:e.type===`resource`&&e.resource?e.resource.text??e.resource.blob??``:``).filter(Boolean).join(`
|
|
61
|
+
`);return e?.isError?`工具错误:${n}`:n}async function Rf(e){let t=new URL(e.url),n=e.requestInit;if(e.transport===`http`){let{StreamableHTTPClientTransport:e}=await import(`@modelcontextprotocol/sdk/client/streamableHttp.js`);return new e(t,{requestInit:n})}if(e.transport===`sse`){let{SSEClientTransport:e}=await import(`@modelcontextprotocol/sdk/client/sse.js`);return new e(t,{requestInit:n})}let{WebSocketClientTransport:r}=await import(`@modelcontextprotocol/sdk/client/websocket.js`);return new r(t)}function zf(e,t){return(0,r.tool)(async n=>Lf(await t.callTool({name:e.name,arguments:n})),{name:e.name,description:e.description??`MCP tool: ${e.name}`,schema:e.inputSchema})}async function Bf(e){let{Client:t}=await import(`@modelcontextprotocol/sdk/client`),n=await Rf(e),r=new t({name:`page-agent-sdk`,version:`1.0`},{capabilities:{}});await r.connect(n);let{tools:i}=await r.listTools();return{tools:i.map(e=>zf(e,r)),close:()=>r.close()}}var Vf=[`你是一个 JSON 操作助手。集成方声明了一个主数据对象(含 zod schema 校验),你通过专用工具安全地读写它来完成任务。`,`所有写操作都经范围控制(仅 schema 声明字段内)与 schema 校验(不合法会返回结构化错误而非写入),并自动留快照可回退。`,`大对象/数组优先用增量 patch(只发改动)而非整体重传,避免输出被截断。`,`---`,zu.reliableWriteRules].join(`
|
|
62
62
|
|
|
63
63
|
`);function Hf(e,t){if(!e)return``;let n=Uu(e.schema,t);return`\n\n## 可操作数据(字段以 read 工具返回的实际值为准)\n${e.description?e.description+`
|
|
64
64
|
`:``}${n}`}function Uf(e){let t=e.appendReliableWriteRules!==!1;return e.systemPrompt?t?e.systemPrompt+`
|
|
65
65
|
|
|
66
66
|
---
|
|
67
67
|
|
|
68
|
-
`+zu.reliableWriteRules:e.systemPrompt:Vf}function Wf(e){return(0,r.tool)(async t=>{let n=await e.handler(t);return typeof n==`string`?n:JSON.stringify(n)},{name:e.name,description:e.description,schema:e.schema})}var Gf=t.z.object({path:t.z.string().optional().describe(`分类 key 过滤(如 toolResults/history/systemPrompt/dataHint);不传=全部分类`),role:t.z.enum([`user`,`assistant`,`system`,`tool`]).optional().describe(`聚焦每轮首句的角色(assistant→回复摘要,user→问题摘要);不影响工具列表`),limit:t.z.number().int().min(1).max(50).optional().describe(`返回最近 N 轮(默认全部;超 50 自动截最近 50 防返回过大)`)});function Kf(e){return Wf({name:`inspect_context`,description:`查看当前对话上下文的构成(供压缩决策)。返回:totalTokens(历史轮次 token 总和,与触发判断同口径)、occupancy(窗口占用比)、contextWindow、categories(分类占用)、rounds(每轮 token/工具/首句)。先调用本工具查看构成,再决定压缩策略。`,schema:Gf,handler:t=>{let n=
|
|
68
|
+
`+zu.reliableWriteRules:e.systemPrompt:Vf}function Wf(e){return(0,r.tool)(async t=>{let n=await e.handler(t);return typeof n==`string`?n:JSON.stringify(n)},{name:e.name,description:e.description,schema:e.schema})}var Gf=t.z.object({path:t.z.string().optional().describe(`分类 key 过滤(如 toolResults/history/systemPrompt/dataHint);不传=全部分类`),role:t.z.enum([`user`,`assistant`,`system`,`tool`]).optional().describe(`聚焦每轮首句的角色(assistant→回复摘要,user→问题摘要);不影响工具列表`),limit:t.z.number().int().min(1).max(50).optional().describe(`返回最近 N 轮(默认全部;超 50 自动截最近 50 防返回过大)`)});function Kf(e){return Wf({name:`inspect_context`,description:`查看当前对话上下文的构成(供压缩决策)。返回:totalTokens(历史轮次 token 总和,与触发判断同口径)、occupancy(窗口占用比)、contextWindow、categories(分类占用)、rounds(每轮 token/工具/首句)。先调用本工具查看构成,再决定压缩策略。`,schema:Gf,handler:t=>{let n=Fd(e.getMessages()),r=n.length>50?n.slice(n.length-50):n,i=(t.limit&&r.length>t.limit?r.slice(r.length-t.limit):r).map(e=>{let n=qd(e),r=Ld(e),i=t.role===`assistant`?e.assistantMsgs[0]??e.userMsg:e.userMsg,a=Id(typeof i.content==`string`?i.content:``,60);return{round:e.round,tokens:n,tools:r,head:a}}),a=i.reduce((e,t)=>e+t.tokens,0),o=e.contextWindow,s=o?a/o:0,c=e.getSnapshot?.()?.categories??[];return{totalTokens:a,occupancy:s,contextWindow:o,categories:t.path?c.filter(e=>e.key===t.path):c,rounds:i}}})}var qf=t.z.object({keepRounds:t.z.number().int().min(0).max(50).optional(),windowRatio:t.z.number().min(0).max(1).optional(),summarize:t.z.object({mode:t.z.enum([`index`,`llm`])}),recallTopK:t.z.number().int().min(0).max(10).optional(),preserveTools:t.z.array(t.z.string()).max(10).optional(),reason:t.z.string().max(200).optional()}).refine(e=>e.keepRounds!==void 0||e.windowRatio!==void 0,{message:`keepRounds 与 windowRatio 至少填一个(按当前触发模式)`});function Jf(e){let t=e.find(e=>e.role===`user`);if(!t)return;let n=t.content,r=(typeof n==`string`?n:Array.isArray(n)?n.map(e=>typeof e==`string`?e:e?.text??``).join(``):String(n??``)).trim().replace(/[\n\r]+/g,` `);if(r)return r.length>30?r.slice(0,30)+`…`:r}function Yf(e){return!!e&&typeof e==`object`&&typeof e.invoke==`function`&&typeof e.stream==`function`}function Xf(e){let t=e.content;return typeof t==`string`?t:Array.isArray(t)?t.map(e=>typeof e==`string`?e:e?.text??``).join(``):String(t??``)}function Zf(e){let t=e.summaryLlm??e.llm;if(!t)return;let n=e.summaryTemperature??.3,r=e.summaryMaxTokens??1024,a=e.summaryTimeoutMs??15e3,o=Yf(t)?t:null,s=Yf(t)?null:t;if(s&&!s.apiKey){e.summaryLlm&&console.warn(`[page-agent-sdk][summarization] summaryLlm 已配置但缺 apiKey,摘要回退主 agent 模型或零成本索引摘要`);return}let c=o;return async e=>{let t=new AbortController,o=setTimeout(()=>t.abort(),a);try{return!c&&s&&(c=await v(s,{temperature:n,maxTokens:r})),Xf(await c.invoke([new i.SystemMessage(`你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。`),new i.HumanMessage(e)],{signal:t.signal})).trim()}finally{clearTimeout(o)}}}function Qf(e){let t=e.titleLlm??e.summaryLlm??e.llm;if(!t)return;let n=Yf(t)?t:null,r=Yf(t)?null:t;if(r&&!r.apiKey)return;let a=n;return async e=>{let t=e.filter(e=>e.role===`user`||e.role===`assistant`).map(e=>`${e.role===`user`?`用户`:`助手`}: ${e.content}`).join(`
|
|
69
69
|
`).slice(0,800),n=new AbortController,o=setTimeout(()=>n.abort(),1e4);try{return!a&&r&&(a=await v(r,{temperature:0,maxTokens:30})),Xf(await a.invoke([new i.SystemMessage(`根据以下对话的主旨,生成一个简短的中文标题(不超过15个字,不要标点和引号,直接输出标题文字)。`),new i.HumanMessage(t)],{signal:n.signal})).trim().replace(/^["'""「『]|["'""」』]$/g,``).split(`
|
|
70
70
|
`)[0].slice(0,20)}catch{return``}finally{clearTimeout(o)}}}function $f(){return`call_dec_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}function ep(e){let t=e.match(/```(?:json)?\s*([\s\S]*?)```/),n=t?t[1]:e,r=n.indexOf(`{`),i=n.lastIndexOf(`}`);if(r<0||i<0||i<=r)return null;try{return JSON.parse(n.slice(r,i+1))}catch{return null}}function tp(e){if(!e)return null;let t=ep(e);if(t==null)return null;let n=qf.safeParse(t);return n.success?n.data:null}async function np(e,t,n,r){let a=[...n];for(let n=0;n<3;n++){let n=await e.invoke(a,{signal:r}),o=n?.tool_calls??[];if(!o.length)return Xf(n).trim();a=[...a,n];for(let e of o){let n=e.id??$f();try{let r=await t.invoke(e.args??{}),o=typeof r==`string`?r:r?.content??JSON.stringify(r);a=[...a,new i.ToolMessage({content:o,tool_call_id:n})]}catch(e){a=[...a,new i.ToolMessage({content:`工具执行失败: ${e.message}`,tool_call_id:n})]}}}return``}function rp(e){let t=e.summaryLlm??e.llm;if(!t)return;let n=Yf(t)?t:null,r=Yf(t)?null:t;if(r&&!r.apiKey)return;let a=e.decisionTimeoutMs??6e3,o=e.decisionMaxTokens??2048,s=n;return async e=>{let t=new AbortController,n=setTimeout(()=>t.abort(),a);try{!s&&r&&(s=await v(r,{temperature:0,maxTokens:o}));let n=s;if(typeof n.bindTools!=`function`)return null;let a=Kf({getMessages:e.getMessages,getSnapshot:e.getSnapshot,contextWindow:e.contextWindow}),c=n.bindTools([a]),l=e.triggerMode===`token`?`token 模式:必填 windowRatio(0~1 保留窗口预算比例,如 0.4);keepRounds 可选`:`轮数模式:必填 keepRounds(保留最近几轮,如 6);windowRatio 可选`,u=[new i.SystemMessage(`你是对话历史压缩决策助手。当前触发模式 = ${e.triggerMode}(${e.triggerReason})。先调用 inspect_context 查看上下文构成,再输出压缩决策 JSON。${l}。仅输出 JSON,不要多余文字/markdown。schema:{keepRounds?(int 0-50), windowRatio?(0-1), summarize:{mode:"index"|"llm"}, recallTopK?(int 0-10), preserveTools?(string[]≤10), reason?(≤200字)}。keepRounds/windowRatio 至少填一个。`),new i.HumanMessage(`触发原因:${e.triggerReason}\n上下文窗口:${e.contextWindow??`未知`} tokens\n阈值比例:${e.thresholdRatio??`未知`}\n\n请决策压缩策略(先 inspect_context 查看,再输出 JSON)。`)];return tp(await np(c,a,u,t.signal))||tp(await np(c,a,[...u,new i.HumanMessage(`上一次输出无效(JSON 解析失败或 schema 校验不通过)。请只输出符合 schema 的压缩决策 JSON,不要多余文字/markdown 代码块。`)],t.signal))}catch{return null}finally{clearTimeout(n)}}}function ip(e){let t=e.llm,n=Yf(e.llm)?void 0:e.llm;return{modelCaps:Il({model:n?.model??t?.model??t?.modelName,contextWindow:e.contextWindow??n?.contextWindow??t?.contextWindow,maxOutputTokens:e.maxOutputTokens??n?.maxOutputTokens??t?.maxOutputTokens}),summaryLlmInvoke:Zf(e),titleLlmInvoke:Qf(e),compressDecisionInvoke:rp(e)}}function ap(e){let t=hn(null),n=0;function r(r){return new Promise(i=>{let a=t.value;a&&a.resolve({action:`keep_external`});let o={...r,id:++n,resolve:i};t.value=o;let s=e?.();s?.({type:`conflict`,conflict:o})})}function i(e){let n=t.value;n&&(t.value=null,n.resolve({action:e}))}return{pendingConflict:t,set:r,resolve:i}}function op(){try{if(typeof crypto<`u`&&typeof crypto.randomUUID==`function`)return crypto.randomUUID()}catch{}return Date.now().toString(36)+Math.random().toString(36).slice(2,10)}var sp=`chat-sdk`,cp=50*1024*1024,lp=4*1024*1024,up=10*1024*1024,dp=.9,fp=500,pp=300,mp=`__meta__`,hp=`v:1`,gp=[`messages`,`vfs`,`todos`,`memory`,`checkpoints`,`usage`,`mission`,`workingMemory`,`focus`];function _p(e){return e===`local`||e===`session`?lp:cp}function vp(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.name===`QuotaExceededError`||t.name===`NS_ERROR_DOM_QUOTA_REACHED`||t.code===22||t.code===1014}function yp(e,t,n,r){return[hp,e,t,n,r].join(`::`)}function bp(e,t,n){return[hp,e,t,n].join(`::`)+`::`}function xp(e,t){return[hp,e,t].join(`::`)+`::`}function Sp(e){return[hp,e].join(`::`)+`::`}var Cp=null;function wp(e){Cp||=new TextEncoder;try{return Cp.encode(JSON.stringify(e)).length}catch{return 0}}function Tp(e,t,n){let r=e.reduce((e,t)=>e+t.bytes,0);if(r<=t)return[];let i=t*n,a=[...e].sort((e,t)=>e.lastAccessed-t.lastAccessed),o=[];for(let e of a){if(r<=i)break;o.push(e),r-=e.bytes}return o}function Ep(){let e=new Map;return{async get(t){return e.has(t)?e.get(t):void 0},async set(t,n){e.set(t,n)},async del(t){e.delete(t)},async scan(t,n){for(let r of Array.from(e.keys()).sort())if(r.startsWith(t)&&n(r,e.get(r))===!1)return},async clearPrefix(t){for(let n of Array.from(e.keys()))n.startsWith(t)&&e.delete(n)}}}function Dp(e){return new Promise((t,n)=>{if(typeof indexedDB>`u`){n(Error(`indexedDB 不可用`));return}let r=indexedDB.open(e,1);r.onupgradeneeded=()=>{let e=r.result;e.objectStoreNames.contains(`kv`)||e.createObjectStore(`kv`)},r.onblocked=()=>n(Error(`indexedDB 升级被阻塞,请关闭其他标签页后重试`)),r.onsuccess=()=>{let e=r.result;e.onversionchange=()=>{e.close()},t({get(t){return new Promise((n,r)=>{let i=e.transaction(`kv`,`readonly`).objectStore(`kv`).get(t);i.onsuccess=()=>n(i.result),i.onerror=()=>r(i.error)})},set(t,n){return new Promise((r,i)=>{let a=e.transaction(`kv`,`readwrite`);a.objectStore(`kv`).put(n,t),a.oncomplete=()=>r(),a.onerror=()=>i(a.error),a.onabort=()=>i(a.error)})},del(t){return new Promise((n,r)=>{let i=e.transaction(`kv`,`readwrite`);i.objectStore(`kv`).delete(t),i.oncomplete=()=>n(),i.onerror=()=>r(i.error),i.onabort=()=>r(i.error)})},scan(t,n){return new Promise((r,i)=>{let a=!1,o=e.transaction(`kv`,`readonly`),s=IDBKeyRange.bound(t,t+``),c=o.objectStore(`kv`).openCursor(s);c.onsuccess=()=>{let e=c.result;if(!e||a)return;let r=e.key;if(r.startsWith(t)&&n(r,e.value)===!1){a=!0;return}e.continue()},c.onerror=()=>i(c.error),o.oncomplete=()=>r(),o.onerror=()=>i(o.error),o.onabort=()=>i(o.error)})},clearPrefix(t){return new Promise((n,r)=>{let i=e.transaction(`kv`,`readwrite`),a=IDBKeyRange.bound(t,t+``),o=i.objectStore(`kv`).openCursor(a);o.onsuccess=()=>{let e=o.result;e&&(e.key.startsWith(t)&&e.delete(),e.continue())},o.onerror=()=>r(o.error),i.oncomplete=()=>n(),i.onerror=()=>r(i.error),i.onabort=()=>r(i.error)})}})},r.onerror=()=>n(r.error)})}function Op(e){return{async get(t){let n=e.getItem(t);return n==null?void 0:JSON.parse(n)},async set(t,n){e.setItem(t,JSON.stringify(n))},async del(t){e.removeItem(t)},async scan(t,n){let r=[];for(let n=0;n<e.length;n++){let i=e.key(n);i&&i.startsWith(t)&&r.push(i)}r.sort();for(let t of r){let r=e.getItem(t);if(r!=null&&n(t,JSON.parse(r))===!1)return}},async clearPrefix(t){let n=[];for(let r=0;r<e.length;r++){let i=e.key(r);i&&i.startsWith(t)&&n.push(i)}for(let t of n)e.removeItem(t)}}}function kp(e,t,n){let r=(e.get(t)??Promise.resolve()).then(n,n);return e.set(t,r.then(()=>void 0,()=>void 0)),r}function Ap(e={}){let t=e.dbName??sp,n=e.backend??`indexed`,r=e.maxBytes??_p(n),i=e.maxBytesPerSession??up,a=e.evictionWatermark??dp,o=e.debounceMs??fp,s=new Set;function c(e){for(let t of s)try{t(e)}catch{}}let l,u=!1,d,f=new Promise(e=>{d=e});(async()=>{try{if(n===`indexed`){if(typeof indexedDB>`u`)throw Error(`indexedDB 不可用`);l=await Dp(t),d(!0)}else if(n===`session`){if(typeof sessionStorage>`u`)throw Error(`sessionStorage 不可用`);l=Op(sessionStorage),d(!0)}else if(n===`local`){if(typeof localStorage>`u`)throw Error(`localStorage 不可用`);l=Op(localStorage),d(!0)}else l=Ep(),d(!1)}catch(e){l=Ep();let t=e instanceof Error?e.message:String(e);d(!1),Promise.resolve().then(()=>c({type:`degraded`,reason:t}))}})();let p=new Map,m=new Map,h=new Map;function g(e,n,r,a){let o=yp(t,r,a,mp);return kp(h,o,async()=>{let t=async()=>{let t=await l.get(o),s=await l.get(e),u=s==null?0:wp(s),d=wp(n),f=(t?.bytes??0)+(d-u);if(f>i){c({type:`quota`,sessionBytes:f,limit:i});return}await l.set(e,n);let p=Date.now(),m=t??{agentId:r,sessionId:a,createdAt:p,lastAccessed:p,bytes:0};m.bytes+=d-u,m.lastAccessed=p,await l.set(o,m),y()};try{await t()}catch(e){if(vp(e)&&!u){u=!0;try{await b()}catch{}l=Ep(),Promise.resolve().then(()=>c({type:`degraded`,reason:`存储配额超限(QuotaExceededError),已淘汰最旧会话并降级内存`}));try{await t()}catch{}}}})}function _(e,n,r,i){let a=yp(t,e,n,r),s=p.get(a);s&&s.resolve();let c=m.get(a);return c&&clearTimeout(c),new Promise(t=>{p.set(a,{value:i,agentId:e,sessionId:n,kind:r,resolve:t});let s=setTimeout(()=>{m.delete(a);let e=p.get(a);if(p.delete(a),!e){t();return}g(a,e.value,e.agentId,e.sessionId).then(t,t)},o);m.set(a,s)})}let v=null;function y(){v||=setTimeout(()=>{v=null,b()},pp)}async function b(){let e=[];await l.scan(Sp(t),(t,n)=>{t.endsWith(`::__meta__`)&&e.push(n)});let n=Tp(e,r,a);for(let e of n)await l.clearPrefix(bp(t,e.agentId,e.sessionId)),c({type:`evicted`,agentId:e.agentId,sessionId:e.sessionId,bytes:e.bytes})}return{ready:f,async listSessions(e){let n=[];return await l.scan(xp(t,e),(e,t)=>{e.endsWith(`::__meta__`)&&n.push(t)}),n.sort((e,t)=>t.lastAccessed-e.lastAccessed)},async load(e,n){let r=yp(t,e,n,mp);return await kp(h,r,async()=>{let i=await l.get(r);if(!i)return;let a={messages:[],vfs:{},todos:[],memory:``};for(let r of gp){let i=await l.get(yp(t,e,n,r));i!=null&&(a[r]=i)}return i.lastAccessed=Date.now(),await l.set(r,i),a})},async save(e,t,n){let r=[];for(let i of gp)n[i]!==void 0&&r.push(_(e,t,i,n[i]));await Promise.all(r)},async updateTitle(e,n,r){let i=yp(t,e,n,mp);return kp(h,i,async()=>{let e=await l.get(i);e&&(e.title=r,e.lastAccessed=Date.now(),await l.set(i,e))})},async flush(){for(let e of Array.from(m.keys())){let t=m.get(e);t&&(clearTimeout(t),m.delete(e))}let e=Array.from(p.entries());p.clear(),await Promise.all(e.map(async([e,t])=>{await g(e,t.value,t.agentId,t.sessionId),t.resolve()})),c({type:`flush`}),await b()},async deleteSession(e,n){await l.clearPrefix(bp(t,e,n))},async createSession(e,n,r){let i=r??op(),a=Date.now(),o={agentId:e,sessionId:i,createdAt:a,lastAccessed:a,bytes:0,title:n};return await l.set(yp(t,e,i,mp),o),i},onEvent(e){s.add(e)},dispose(){for(let e of m.values())clearTimeout(e);m.clear();for(let e of p.values())e.resolve();p.clear(),v&&=(clearTimeout(v),null),h.clear(),s.clear()}}}function jp(e){return e===void 0||e===!1?null:typeof e==`string`?Ap({backend:e}):e.enabled===!1?null:Ap(e)}function Mp(e){return e.dialog??{}}var Np=[{name:`dataOps`,defaultOn:!0},{name:`fetch`,defaultOn:!0},{name:`planning`,defaultOn:!0},{name:`missionAnchor`,defaultOn:!0},{name:`workingMemory`,defaultOn:!0},{name:`focus`,defaultOn:!0},{name:`skills`,defaultOn:!0},{name:`vfs`,defaultOn:!0},{name:`summarization`,defaultOn:!0},{name:`memory`,defaultOn:!0},{name:`subagent`,defaultOn:!0},{name:`inspectEnv`,defaultOn:!0},{name:`contextInspector`,defaultOn:!0},{name:`verify`,defaultOn:!1},{name:`domInspect`,defaultOn:!1},{name:`draftWrite`,defaultOn:!1,requires:[`dataOps`,`vfs`]},{name:`tracing`,defaultOn:!1},{name:`todoDeps`,defaultOn:!1},{name:`skillHostScript`,defaultOn:!1,requires:[`skills`]},{name:`automation`,defaultOn:!1},{name:`agentCompression`,defaultOn:!1,requires:[`summarization`]}];function Pp(e){let t={};for(let n of Np){let r=e?.[n.name];t[n.name]=n.defaultOn?r!==!1:r===!0}for(let e of Np)if(e.requires&&t[e.name]){for(let n of e.requires)if(!t[n]){t[e.name]=!1;break}}return t}function Fp(e){let t=new Set,n=n=>{if(n.type!==`approval_request`){if(e)try{e(n)}catch(e){console.warn(`[page-agent-sdk] onEvent 回调出错(observable,已忽略):`,Dl(e,`observable`).message)}for(let e of t)try{e(n)}catch(e){console.warn(`[page-agent-sdk] 事件监听器出错(observable,已忽略):`,Dl(e,`observable`).message)}}};function r(e){return t.add(e),()=>t.delete(e)}return{listeners:t,emit:n,hook:r}}var Ip={auto:{summaryThresholdRatio:.5,windowRatio:.4,recallTopK:3,enableRecall:!0},conservative:{summaryThresholdRatio:.7,windowRatio:.5,recallTopK:2,enableRecall:!0,enableLLMSummary:!1},aggressive:{summaryThresholdRatio:.3,windowRatio:.3,recallTopK:5,enableRecall:!0,enableLLMSummary:!0},complex:{summaryThresholdRatio:.7,windowRatio:.6,recallTopK:5,enableRecall:!0,enableLLMSummary:!0}},Lp={auto:[`describe_data`,`read`],conservative:[`describe_data`],aggressive:[`describe_data`,`read`],complex:[`describe_data`,`read`,`query_data`,`search_data`]};function Rp(e,t){let n=Ip[e.contextPreset??`auto`]??{},r=e.contextOptions===!1?{}:e.contextOptions??{};return{...n,...r,contextWindow:r.contextWindow??t,enableLLMSummary:r.enableLLMSummary??n.enableLLMSummary??!0}}var zp={dataHint:10,usageHints:20,todos:30,skills:40,vfs:50,summarization:60,memory:70,permissions:80,checkpoint:90,humanConfirm:100,approval:110,verify:120,subagent:130,subagents:140,augmentSystem:150};function Bp(e){return e.map((e,t)=>({m:e,i:t,p:zp[e.name]??1/0})).sort((e,t)=>e.p-t.p||e.i-t.i).map(e=>e.m)}var Vp=new Set([`__proto__`,`constructor`,`prototype`]);function Hp(e){return e.split(`.`).some(e=>Vp.has(e))}function Up(e,t){if(!(!t||typeof t!=`object`||Array.isArray(t)))for(let n of Object.keys(t))Vp.has(n)||(e[n]=t[n])}function Wp(e,t){if(!t)return e;if(Hp(t))return;let n=t.split(`.`),r=e;for(let e of n){if(r==null)return;r=r[e]}return r}function Gp(e,t,n){if(!t||Hp(t))return;let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];(i[t]==null||typeof i[t]!=`object`)&&(i[t]={}),i=i[t]}i[r[r.length-1]]=n}function Kp(e,t){if(!t||Hp(t))return!1;let n=t.split(`.`),r=e;for(let e=0;e<n.length-1;e++){if(r==null)return!1;r=r[n[e]]}let i=n[n.length-1];return r==null||!(i in r)?!1:(Array.isArray(r)&&/^\d+$/.test(i)?r.splice(Number(i),1):delete r[i],!0)}function qp(e){return e===void 0?void 0:JSON.parse(JSON.stringify(e))}function Jp(e){if(typeof e!=`string`)return{parsed:e};let t=e.trim();if(!t)return{parsed:e};let n=t[0]===`{`||t[0]===`[`;try{return{parsed:JSON.parse(t)}}catch(t){return n?{parseError:t}:{parsed:e}}}function Yp(e,t){if(typeof e!=`object`||!e)return e;let n=new Set(t);if(Array.isArray(e))return e.map(e=>Yp(e,t));let r={};for(let t of Object.keys(e))n.has(t)&&(r[t]=e[t]);return r}function Xp(e,t){if(typeof e!=`object`||!e)return e;if(t<=0)return Array.isArray(e)?`[...${e.length}]`:`{...}`;if(Array.isArray(e))return e.map(e=>Xp(e,t-1));let n={};for(let r of Object.keys(e))n[r]=Xp(e[r],t-1);return n}function Zp(e,t=1/0){let n=new WeakSet,r;try{r=JSON.stringify(e,(e,t)=>{if(typeof t==`function`)return`[Function]`;if(typeof t==`bigint`)return t.toString();if(typeof t==`object`&&t){if(typeof HTMLElement<`u`&&t instanceof HTMLElement)return`[HTMLElement: <${t.tagName.toLowerCase()}>]`;if(typeof Node<`u`&&t instanceof Node)return`[Node: type=${t.nodeType}]`;if(n.has(t))return`[Circular]`;n.add(t)}return t},0)}catch(e){r=`[无法序列化: ${e?.message||String(e)}]`}return r.length>t&&(r=r.slice(0,t)+`\n…[已截断,原长度 ${r.length}]`),r}function Qp(e,t=0){let n=3735928559^t,r=1103547991^t;for(let t=0;t<e.length;t++){let i=e.charCodeAt(t);n=Math.imul(n^i,2654435761),r=Math.imul(r^i,1597334677)}return n=Math.imul(n^n>>>16,2246822507)^Math.imul(r^r>>>13,3266489909),r=Math.imul(r^r>>>16,2246822507)^Math.imul(n^n>>>13,3266489909),4294967296*(2097151&r)+(n>>>0)}function $p(e){return Qp(Zp(e)).toString(36)}function em(e,t,n,r){if(t===`set`)return n?(Gp(e,n,r),null):`set 操作需要 jsonPath(整体替换请用 set_data)`;if(t===`remove`)return n?(Kp(e,n),null):`remove 操作需要 jsonPath`;if(t===`merge`){let t=n?Wp(e,n):e;return typeof t!=`object`||!t||Array.isArray(t)?`merge 目标${n?`(${n})`:`(根)`}不是对象`:(Up(t,r),null)}let i=n?Wp(e,n):e;return Array.isArray(i)?(Array.isArray(r)?i.push(...r):i.push(r),null):`append 目标${n?`(${n})`:`(根)`}不是数组`}function tm(e,t,n,r){if(t===`set`)Gp(e,n,r);else if(t===`remove`)Kp(e,n);else if(t===`merge`)Up(n?Wp(e,n):e,r);else{let t=n?Wp(e,n):e;Array.isArray(r)?t.push(...r):t.push(r)}}function nm(e,t){typeof e==`object`&&e&&rm(e,t)}function rm(e,t){if(Array.isArray(e)){e.length=0,Array.isArray(t)&&e.push(...t);return}let n=t&&typeof t==`object`&&!Array.isArray(t)?t:{};for(let t of Object.keys(e))t in n||delete e[t];for(let t of Object.keys(n))e[t]=n[t]}function im(e,t,n=``){let r=[];if(!(typeof e==`object`&&e)||!(typeof t==`object`&&t)||Array.isArray(e)!==Array.isArray(t))return e!==t&&r.push({path:n||`(root)`,from:e,to:t}),r;if(Array.isArray(e)&&Array.isArray(t)){let i=Math.max(e.length,t.length);for(let a=0;a<i;a++){let i=n?`${n}.${a}`:`${a}`;a>=e.length?r.push({path:i,from:void 0,to:t[a]}):a>=t.length?r.push({path:i,from:e[a],to:void 0}):r.push(...im(e[a],t[a],i))}return r}let i=e,a=t,o=new Set([...Object.keys(i),...Object.keys(a)]);for(let e of o){let t=n?`${n}.${e}`:e;e in i?e in a?r.push(...im(i[e],a[e],t)):r.push({path:t,from:i[e],to:void 0}):r.push({path:t,from:void 0,to:a[e]})}return r}var am={largeResults:4*1024*1024,drafts:2*1024*1024,userFiles:2*1024*1024,resources:4*1024*1024},om=[`largeResults`,`drafts`,`userFiles`,`resources`],sm=.9;function cm(e,t={}){let n=Object.create(null);if(e)for(let[t,r]of Object.entries(e))n[fm(t)]={content:r,updatedAt:mm()};let{persist:r}=t,i=t.maxBytes??8388608,a={...am,...t.poolBytes??{}};function o(e){let t=fm(e);return t.startsWith(`large_results/`)?`largeResults`:t.startsWith(`drafts/`)?`drafts`:t.startsWith(`resources/`)?`resources`:`userFiles`}function s(e){let t=0;for(let[r,i]of Object.entries(n))o(r)===e&&(t+=um(i.content));return t}function c(){for(let e of om){let t=a[e];if(s(e)<=t)continue;let r=t*sm,i=e===`largeResults`,c=i&&s(e)>t*1.5;c&&console.warn(`[page-agent-sdk] vfs large_results 池 ${s(e)} > ${Math.round(t*1.5)}(被引用撑爆)→ 无视 protectedRefs 强制删`);let l=Object.entries(n).filter(([t])=>o(t)===e).sort((e,t)=>e[1].updatedAt-t[1].updatedAt);for(let[t]of l)if(!(i&&!c&&u.has(t))&&(delete n[t],s(e)<=r))break}if(dm(n)>i){let e=i*sm,t=dm(n)>i*1.5,r=Object.entries(n).sort((e,t)=>e[1].updatedAt-t[1].updatedAt);for(let[i]of r)if(!(o(i)===`largeResults`&&!t&&u.has(i))&&(delete n[i],dm(n)<=e))break}}let l=!0,u=new Set,d=null;function f(){if(!r?.save)return;let e={};for(let[t,r]of Object.entries(n))e[t]={...r};r.save(e)}function p(){r?.save&&(d&&clearTimeout(d),d=setTimeout(()=>{d=null,f()},800))}let m={files:new Proxy(n,{set(e,t,n){let r=Reflect.set(e,t,n);return r&&(l=!0,c(),p()),r},deleteProperty(e,t){let n=Reflect.deleteProperty(e,t);return n&&(l=!0,p()),n}}),isDirty:()=>l,consumeDirty:()=>{let e=l;return l=!1,e},setProtectedRefs:e=>{u=e}};return r&&(m.hydrate=e=>{for(let[t,r]of Object.entries(e))n[fm(t)]=r;c(),l=!0},m.flush=()=>{d&&=(clearTimeout(d),null),f()},m.clear=()=>{for(let e of Object.keys(n))delete n[e];p(),l=!0}),m}var lm=null;function um(e){return lm||=new TextEncoder,lm.encode(e).length}function dm(e){let t=0;for(let n of Object.values(e))t+=um(n.content);return t}function fm(e){return e.replace(/^\/+/,``).replace(/\/+/g,`/`)}function pm(e){let t=``;for(let n=0;n<e.length;n++){let r=e[n];r===`*`?e[n+1]===`*`?(t+=`.*`,n++):t+=`[^/]*`:".+?^${}()|[]\\".includes(r)?t+=`\\`+r:t+=r}return RegExp(`^`+t+`$`)}function mm(){return Date.now()}var hm=[`vfs_read`,`vfs_write`,`vfs_edit`,`vfs_ls`,`vfs_glob`,`vfs_grep`,`vfs_json_read`,`vfs_json_patch`,`vfs_rm`];function gm(e){return[(0,r.tool)(async({path:t,offset:n,limit:r})=>{let i=e.files[fm(t)];if(!i)return $({code:`NOT_FOUND`,path:t,message:`未找到文件 "${t}"`,hint:`用 vfs_ls 查看虚拟工作区文件列表;大工具结果外存后路径由系统在工具返回里给出`});let a=i.content.split(`
|
|
71
71
|
`),o=n,s=Math.min(o+r,a.length),c=a.slice(o,s).join(`
|
|
@@ -85,7 +85,7 @@ self.onmessage = async (e) => {
|
|
|
85
85
|
`):void 0}}}function Oh(e){return{name:`resourcesPin`,augmentPrompt:()=>{let t=e.getResourcesSnapshot();if(!t.length)return;let n=[`## 受保护资源(跨压缩保留 · 精确值保护)`];for(let e of t)e.mode===`freeze`?n.push(`- ${e.path} (freeze 已冻结,不可改)`):n.push(`- ${e.path} (verbatim 原样保留)${e.handle?` ⟦res:${e.handle}⟧`:``}`);return n.push(`读到 ⟦frozen:path⟧/⟦res:handle⟧ 占位符 = 精确值在冻结区/资源池(不入消息流);需真值用 resource_get({path});freeze 字段不可写(撞 FROZEN_FIELD 即放弃);verbatim 直接写新值会 VERBATIM_MISMATCH,先 resource_update 再写回句柄;撞 RESOURCE_EVICTED/RESOURCE_NOT_FOUND 重新 read 懒注册。`),n.join(`
|
|
86
86
|
`)}}}var kh=`v:1::skill-store`,Ah=`chat-sdk`;function jh(e,t,n){return`${kh}::${e}::${t}::${n}`}function Mh(e,t){return`${kh}::${e}::${t}::`}function Nh(e={}){let t=e.dbName??Ah,n=e.backend??`indexed`,r=e.id??``,i,a,o=new Promise(e=>{a=e});return(async()=>{try{if(n===`indexed`){if(typeof indexedDB>`u`)throw Error(`indexedDB 不可用`);i=await Dp(t),a(!0)}else if(n===`session`){if(typeof sessionStorage>`u`)throw Error(`sessionStorage 不可用`);i=Op(sessionStorage),a(!0)}else if(n===`local`){if(typeof localStorage>`u`)throw Error(`localStorage 不可用`);i=Op(localStorage),a(!0)}else i=Ep(),a(!1)}catch{i=Ep(),a(!1)}})(),{ready:o,async list(){let e=[];return await i.scan(Mh(t,r),(t,n)=>{e.push(n)}),e},async get(e){return await i.get(jh(t,r,e))},async put(e){try{await i.set(jh(t,r,e.name),e)}catch(e){vp(e)&&(i=Ep())}},async remove(e){let n=jh(t,r,e);return await i.get(n)==null?!1:(await i.del(n),!0)},async clear(){await i.clearPrefix(Mh(t,r))},dispose(){}}}var Ph=/large_results\/[^\s"'`),]+\.txt/g;function Fh(e){let t=new Set,n=e=>{if(typeof e!=`string`||!e)return;let n;for(Ph.lastIndex=0;(n=Ph.exec(e))!==null;)t.add(n[0])};for(let t of e)if(n(t.content),t.steps)for(let e of t.steps)n(e.result);return t}function Ih(e,t){let n=[];for(let r of Object.keys(e))r.startsWith(`large_results/`)&&!t.has(r)&&n.push(r);return n}function Lh(){let e=Promise.resolve();return function(t){let n=e.then(t,t);return e=n.then(()=>void 0,()=>void 0),n}}var Rh=30,zh=new Map;function Bh(e,t){return e===`set_data`?`set`:e===`edit_data`?`edit`:e===`delete_data`?`delete`:e===`restore_data`?`restore`:e===`write`?t?.del?`delete`:t?.patch?`edit`:`set`:null}function Vh(e,t,n,r){let i=0;return{name:`sdk-events`,wrapToolCall:async(t,r)=>{let i=await r(t),a=Bh(t.name,t.args);return a&&e({type:`data_change`,operation:a,value:n()?.bind}),i},afterModel:t=>{let n=t.message.additional_kwargs||{},a=t.message.response_metadata||{},o=n.usage||a.usage||a.token_usage||a.tokenUsage;if(o&&typeof o==`object`){let t=Number(o.prompt_tokens??o.promptTokens??0)||0,n=Number(o.completion_tokens??o.completionTokens??0)||0,a=Number(o.total_tokens??o.totalTokens??t+n)||0,s={prompt_tokens:t,completion_tokens:n,total_tokens:a};r.prompt_tokens=(r.prompt_tokens??0)+t,r.completion_tokens=(r.completion_tokens??0)+n,r.total_tokens=(r.total_tokens??0)+a,i++,e({type:`usage`,round:i,usage:s,cumulative:{prompt_tokens:r.prompt_tokens,completion_tokens:r.completion_tokens,total_tokens:r.total_tokens}})}},afterAgent:async()=>{e({type:`message_update`,count:t.length})}}}function Hh(e,t,n,r,i){if(!n)return i&&console.warn(`[page-agent-sdk][focus] capabilities.focus 关闭,${t} 忽略`),{ok:!1,error:`capabilities.focus 关闭`};if(!e||!e.path)return i&&console.warn(`[page-agent-sdk][focus] ${t} 拒绝:path 必填且非空`),{ok:!1,error:`path 必填且非空`};let a=r();return a?gu(a,e.path)?{ok:!0}:(i&&console.warn(`[page-agent-sdk][focus] ${t} 拒绝:path "${e.path}" 不在 schema 内(getSchemaAtPath 返 null;数组组件须 z.array(...) 包裹,裸 discriminatedUnion/Union 会降级)`),{ok:!1,error:`path "${e.path}" 不在 schema 内`}):(i&&console.warn(`[page-agent-sdk][focus] ${t} 拒绝:当前无主数据 schema`),{ok:!1,error:`当前无主数据 schema,无法聚焦`})}function Uh(e,n){let i={prompt_tokens:0,completion_tokens:0,total_tokens:0},a=ap(()=>U),o=hn(0),s=jp(e.storage);e.debug&&s&&s.onEvent(e=>console.log(`[page-agent-sdk][storage]`,e));let{modelCaps:c,summaryLlmInvoke:l,titleLlmInvoke:u,compressDecisionInvoke:d}=ip(e),f=c;if(e.debug&&console.log(`[page-agent-sdk][modelCaps]`,f),f.contextWindow<2e5)throw Error(`[page-agent-sdk] 模型上下文窗口 ${f.contextWindow} 小于最小支持 ${Fl}(需 ≥200K 窗口模型,如 GLM-5.2/Claude/Kimi/Qwen-1M/DeepSeek-v4)`);let p=Rp(e,f.contextWindow),m=p.enableLLMSummary!==!1,h=(e.contextOptions&&e.contextOptions.preserveLastToolResults)??Lp[e.contextPreset??`auto`],g=new Set(h),y=e.llm;e.debug&&!l&&console.warn(`[page-agent-sdk][summarization] 未构造 llmInvoke(apiKey 缺失?),摘要回退零成本索引摘要`);let b=tn([]),x=cm(e.vfs?.initialFiles,{persist:s?{save:e=>{W.sessionId&&s&&s.save(n,W.sessionId,{vfs:e})}}:void 0,maxBytes:e.vfs?.maxBytes,poolBytes:e.vfs?.poolBytes}),S=Nu([],{maxPlanRevisions:e.maxPlanRevisions}),C=Lu(),w=Ju({getSchema:()=>ae()?.schema}),T=Zu(),E=hd(e.memory||``);typeof e.memory==`function`&&E.refresh();let D={current:null},O=e.data?{...e.data,description:e.data.description??`主数据对象`}:void 0,k=e.checkpoint,A=k!==void 0&&k!==!1,j=A?Nd({getData:()=>ae()?.bind,consumeDataDirty:()=>re?.consumeDataDirty?.()??!0,slotPaths:O?[``]:[],vfsStore:x,todosMw:S,getTodos:()=>D.current?.getState?.()?.todos??[],messages:b,maxCheckpoints:k&&typeof k==`object`?k.maxCheckpoints:void 0}):null,M=!k||typeof k!=`object`||k.auto!==!1,N=Pp(e.capabilities),P=N.dataOps,ee=N.draftWrite,te=N.tracing,F=N.automation,I=Uf(e),ne=P&&O?th(O,{onAudit:e.onAudit??(e.debug?e=>console.log(`[page-agent-sdk][data audit]`,e):void 0),maxSnapshots:e.maxSnapshots,onConflict:a.set,autoLock:e.autoLock,interceptors:e.interceptors,vfsStore:ee||O?.resources?.length?x:void 0}):[],L=P?Qm(ne,e.toolMode):[],re=P&&O?ne.controller??null:null,ie=P&&O?.resources?.length&&re?.getResourcesSnapshot?Oh({getResourcesSnapshot:()=>re?.getResourcesSnapshot?.()??[]}):void 0,ae=()=>re?.get()??O,R=new Map,oe=wh(N,L,rh,lh,gh);oe.forEach(e=>R.set(e.name,`builtin`));let se=[...e.tools||[]];se.forEach(e=>R.set(e.name,`user`));let z=yh(e.actions??{});z.forEach(e=>R.set(e.name,`action`));let ce=[],le=e.humanConfirm!==!1&&(!e.approval||e.approval.humanConfirmTool!==!1),ue=le?Td():null;ue&&R.set(Cd,`builtin`);let B=A&&j?[(0,r.tool)(async()=>{let e=j.list();return e.length?j.restore()?`已回退到最近一次正常状态(checkpoint #${e[e.length-1].id})。对话历史、主数据、vfs、todos 已整体还原。请基于回退后的状态重新判断并继续。`:`回退失败:无可用 checkpoint。`:`无可用 checkpoint,无法回退。`},{name:`restore_last_checkpoint`,description:`回退到最近一次正常状态(整体还原对话历史 + 主数据 + vfs + todos)。当本轮操作出错、页面被改坏、或走偏时调用,回到本轮起点重新来过。不传参数即回退最近一次。`,schema:t.z.object({}).optional()}),(0,r.tool)(async()=>{let e=j.list();return e.length?`可用 checkpoint:
|
|
87
87
|
`+e.map(e=>`#${e.id} [${e.label??`auto`}] 消息数=${e.messageCount} 时间=${new Date(e.timestamp).toLocaleTimeString()}`).join(`
|
|
88
|
-
`):`无可用 checkpoint。`},{name:`list_checkpoints`,description:`列出可用会话 checkpoint(回退点)。`,schema:t.z.object({}).optional()})]:[];B.forEach(e=>R.set(e.name,`builtin`));let de=N.focus,fe=(0,r.tool)(async({path:e,label:t})=>{let n=ae()?.schema;return n?gu(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(`人类可读标签,如「导航栏」`)})}),pe=(0,r.tool)(async()=>(w.clearFocus(),`已清除聚焦,恢复全量可操作范围(可读写所有组件)。`),{name:`clear_focus`,description:`清除当前聚焦,退出精修模式,恢复对全部组件的读写权限。`,schema:t.z.object({}).optional()}),me=(0,r.tool)(async({path:e,label:t})=>{let n=ae()?.schema;if(!n)return`聚焦失败:当前无主数据 schema,无法聚焦。`;if(!gu(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(`人类可读标签`)})}),he=(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`)})}),ge=de&&e.toolMode===`advanced`?[fe,pe,me,he]:[];ge.forEach(e=>R.set(e.name,`builtin`));let _e=[],ve=new Map,ye=be();function be(){let{tools:e,collisions:t}=Th([{label:`builtin`,tools:oe},{label:`user`,tools:se},{label:`action`,tools:z},{label:`humanConfirm`,tools:ue?[ue]:[]},{label:`checkpoint`,tools:B},{label:`focus`,tools:ge},{label:`mcp`,tools:ce},{label:`skill`,tools:_e}]);return t.length&&console.warn(`[page-agent-sdk] 工具重名,后注册覆盖先注册:`,t.map(e=>`${e.name}(${e.loser}→${e.winner})`).join(`, `)),e}let xe=N.planning,Se=N.missionAnchor,Ce=N.workingMemory,we=N.skills,Te=N.vfs;if(Te)for(let e of hm)R.set(e,`builtin`);if(xe)for(let e of S.tools??[])R.set(e.name,`builtin`);let Ee=N.summarization,V=N.agentCompression&&!!d;e.debug&&N.agentCompression&&!d&&console.warn(`[page-agent-sdk][agentCompression] agentCompression 开启但 summaryLlm 不可用(或缺 apiKey / 模型不支持工具),压缩决策不启用,回退静态压缩`);let De=N.memory,Oe=N.subagent,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=!Oe||Me?.enabled===!1?void 0:Kd({llm:Me?.llm??e.llm,allTools:()=>ye,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:()=>ae()?.schema??null}),Fe=Oe&&e.subagents!==void 0?Yd(e.subagents,{llm:e.llm,allTools:()=>ye,debug:e.debug,getFocuses:()=>w.getFocuses(),getSchema:()=>ae()?.schema??null}):void 0,Ie=Fe?Fe.controller:null,Le=[`get_data`,`describe_data`,`read`,`fetch_document`],Re=ye.filter(e=>Le.includes(e.name)),H=Ae?Xd({check:e.verify.check??nf({schemas:()=>ae()?{"":ae().schema}:{},root:()=>ae()?.bind}),adversarial:e.verify?.adversarial?{llm:e.llm,tools:Re}:void 0}):void 0,ze=je?_f({contextWindow:f.contextWindow,thresholdRatio:Rp(e,f.contextWindow).summaryThresholdRatio}):void 0,Be=Dh({...N,humanConfirm:le,subagents:e.subagents?.map(e=>({id:e.id,description:e.description,temperature:e.temperature}))},P&&!!O,e.toolMode,!!O?.resources?.length),Ve=O?{name:`dataHint`,augmentPrompt:()=>Hf(ae(),e.schemaHint)||void 0}:null,He=e.augmentSystem?{name:`augmentSystem`,augmentPrompt:t=>{try{return e.augmentSystem({state:t,data:ae()})}catch(t){e.debug&&console.log(`[page-agent-sdk][augmentSystem] 回调抛错,降级跳过:`,t.message);return}}}:null,Ue=e.onEvent,We=Fp(e.onEvent),U=We.emit,Ge,Ke=[],qe=e=>({name:e.name,description:e.description,content:typeof e.getContent==`function`?e.getContent():``}),Je=e=>({name:e.name,description:e.description,getContent:()=>e.content}),Ye=e.skillStorage===!1?null:Nh({...typeof e.skillStorage==`object`?e.skillStorage:{},id:e.skillStorage&&typeof e.skillStorage==`object`&&e.skillStorage.id?e.skillStorage.id:`agent::${n}`}),Xe=()=>{let t=Ge?Ge.controller:null;if(t){let n=(e.skills||[]).filter(e=>!Ke.some(t=>t.name===e.name));t.set([...n,...Ke])}W.infoTick.value++},Ze=async()=>{if(Ye)try{let t=await Ye.list();if(t.length){Ke=t.map(Je);let n=Ge?Ge.controller:null;if(n){let t=(e.skills||[]).filter(e=>!Ke.some(t=>t.name===e.name));n.set([...t,...Ke])}W.infoTick.value++}}catch{}},Qe=Ee?Bf({...p,llmInvoke:l,getRegisteredData:()=>ae()?[{description:ae().description??`主数据对象`}]:[],preserveLastToolResults:h,...V?{decideInvoke:d,getSnapshot:()=>ze?.getSnapshot()}:{}}):void 0,$e=Bp([...Ve?[Ve]:[],Be,...Se?[C]:[],...xe?[S]:[],...we?[Ge=md(e.skills||[],{readVfs:Te?e=>x.files[e]?.content:void 0,hostScriptEnabled:N.skillHostScript,onToolsReady:(e,t)=>{for(let n of t){let t=_e.findIndex(e=>e.name===n.name);t>=0&&_e.splice(t,1),_e.push(n),ve.set(n.name,e),R.set(n.name,`skill:${e}`)}ye=be(),W.agent&&W.agent.setTools(ye),W.infoTick.value++}})]:[],...Te?[_m(x)]:[],...Qe?[Qe]:[],...Ce?[T]:[],...de?[w]:[],...ie?[ie]:[],...De?[E]:[],...e.permissions?.length?[xd(e.permissions)]:[],...A&&M&&j?[Pd(j)]:[],...le?[Ed()]:[],...e.approval&&(e.approval.tools!==void 0||e.approval.confirm)?[Sd(e.approval)]:[],...H?[H]:[],...Pe?[Pe]:[],...Fe?[Fe]:[],...He?[He]:[],...ze?[ze]:[],...e.middleware||[],...F?[_h(i,{tokenBudget:e.tokenBudget,timeBudgetMs:e.timeBudgetMs},U)]:[],Vh(U,b,ae,i)]),et=e.maxMemoryRounds??Rh,tt=hn([]);async function nt(){s&&(tt.value=(await s.listSessions(n)).sort((e,t)=>t.lastAccessed-e.lastAccessed))}let W={agentId:n,store:s,messages:b,vfsStore:x,listeners:We.listeners,todosMw:S,memoryMw:E,missionMw:C,workingMemoryMw:T,focusMw:w,agent:null,initDone:Promise.resolve(),sessionId:``,refCount:0,mcpClosers:[],mcpServers:[],checkpoint:j,dataOpsController:re,skillsController:Ge?Ge.controller:null,infoTick:o,pendingConflict:a.pendingConflict,sessions:tt,refreshSessions:nt,liveData:ae,usage:i,emit:U,unloadSkillTools(e){if(e){let t=_e.length;if(_e=_e.filter(t=>ve.get(t.name)===e?(R.delete(t.name),ve.delete(t.name),!1):!0),_e.length===t)return}else{if(!_e.length)return;for(let e of _e)R.delete(e.name),ve.delete(e.name);_e=[]}ye=be(),W.agent&&W.agent.setTools(ye)},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&&Se&&C.setMission(t.mission),t.workingMemory&&Ce&&T.restore(t.workingMemory),de){let n=t.focus,r=n?Array.isArray(n)?n:[n]:[];if(r.length){let t=ae()?.schema,n=t?r.filter(e=>gu(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)}}}ot()},addSkill(e){let t=Ke.findIndex(t=>t.name===e.name);t>=0?Ke[t]=e:Ke.push(e),Xe(),Ye&&Ye.put(qe(e))},removeSkill(e){let t=Ke.findIndex(t=>t.name===e);return t<0?!1:(Ke.splice(t,1),Xe(),Ye&&Ye.remove(e),!0)},listUserSkills(){return Ke.map(e=>e.name)},getUserSkill(e){let t=Ke.find(t=>t.name===e);if(t)return{name:t.name,description:t.description,content:typeof t.getContent==`function`?t.getContent():``}},afterRound(){st(),ut()},async send(e,t){await W.initDone,t??={},t?.mission&&Se&&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=F?t.maxAutoRetries??1:0,i=0,a=!1;for(;;){a||=(b.push({role:`user`,content:n,timestamp:Date.now()}),!0);try{let e=await W.agent.invoke(b);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){let t=Dl(e,`fatal`);if(i<r&&j?.canRestore()){i+=1,j.restore(),a=!0,U({type:`error`,message:`致命错误自动恢复(${i}/${r}):${t.message},已回退 checkpoint 重试`,severity:`observable`,code:`AUTO_RECOVER_RETRY`,context:{attempt:i,cause:t.code??t.message.slice(0,120)}});continue}throw U({type:`error`,message:t.message,severity:t.severity,...t.code?{code:t.code}:{},...t.context===void 0?{}:{context:t.context}}),e}}},async batch(e,t){if(await W.initDone,!e.length)return[];let n=[];for(let r=0;r<e.length;r++){let i=e[r];j&&j.save(`batch:${r}`);let a=b.length;try{b.push({role:`user`,content:i,timestamp:Date.now()});let a=await W.agent.invoke(b);b.push({role:`assistant`,content:a,timestamp:Date.now()}),W.afterRound(),s&&await s.flush(),n.push({index:r,task:i,reply:a,ok:!0}),t?.({done:r+1,total:e.length,task:i,ok:!0})}catch(o){b.length>a&&b.splice(a);let s=Dl(o,`fatal`);U({type:`error`,message:`批量任务 ${r+1}/${e.length} 失败:${s.message}`,severity:`observable`,code:`BATCH_TASK_FAILED`,context:{index:r,task:i.slice(0,100)}}),n.push({index:r,task:i,error:s.message,ok:!1}),t?.({done:r+1,total:e.length,task:i,ok:!1})}}return n},async switchSession(t){if(await W.initDone,!s)throw Error(`page-agent-sdk: storage 未开启,无法切换会话(请传 storage 选项)`);if(a.resolve(`keep_external`),W.sessionId&&s){if(Se){let e=C.getMission();e&&s.save(n,W.sessionId,{mission:e})}if(Ce){let e=T.getWorkingMemory();e&&s.save(n,W.sessionId,{workingMemory:e})}if(de){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),U({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:``)}),nt(),ct=void 0,lt=!1,r},resetSession:()=>{s&&(W.sessionId=op(),x.clear?.(),S.reset([]),e.memory||E.reset(``),C.reset(),T.reset(),w.reset(),j&&j.importStack([]),W.agent&&(W.agent.debugLogs.value=[]),s.createSession(W.agentId,e.session?.title,W.sessionId),U({type:`session_restored`,sessionId:W.sessionId,rounds:0}),nt(),ct=void 0,lt=!1)},stream:(e,t,n)=>{if(!W.agent)throw Error(`page-agent-sdk: agent 尚未初始化完成,请先 await mount()`);x?.setProtectedRefs?.(Fh(e));let r=Ue?e=>{t?.(e),U(e)}:t;if(n){let e=()=>a.resolve(`keep_external`);n.aborted?e():n.addEventListener(`abort`,e,{once:!0})}return W.agent.stream(e,r,n)},release(){if(W.refCount--,W.refCount<=0){s&&(x.flush?.(),s.flush(),s.dispose()),Ye&&Ye.dispose();let e=W.mcpClosers.splice(0);e.length&&Promise.allSettled(e.map(e=>e())),zh.delete(n)}},resolveConflict:a.resolve,setTools(e){se.length=0,e.forEach(e=>{se.push(e),R.set(e.name,`user`)}),ye=be(),W.agent&&W.agent.setTools(ye),W.infoTick.value++},addTool(e){ye.some(t=>t.name===e.name)&&console.warn(`[page-agent-sdk] 工具 "${e.name}" 已存在,新工具覆盖(后注册覆盖先注册)`);for(let t=se.length-1;t>=0;t--)se[t].name===e.name&&se.splice(t,1);se.push(e),R.set(e.name,`user`),ye=be(),W.agent&&W.agent.setTools(ye),W.infoTick.value++},removeTool(e){let t=se.findIndex(t=>t.name===e);return t<0?!1:(se.splice(t,1),R.delete(e),ye=be(),W.agent&&W.agent.setTools(ye),W.infoTick.value++,!0)},setLlm(t){let n;if(Yf(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=Yf(t)?void 0:t;if(f=Il({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} 小于最小支持 ${Fl}(需 ≥200K 窗口模型)`);W.agent&&(W.agent.setLlm(n),W.agent.setModelCaps?.(f)),Qe?.setContextWindow?.(f.contextWindow),ze?.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(!Ie){e.debug&&console.warn(`[page-agent-sdk][setSubagents] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略`);return}Ie.set(t),W.infoTick.value++},addSubagent(t){if(!Ie){e.debug&&console.warn(`[page-agent-sdk][addSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略`);return}Ie.add(t),W.infoTick.value++},removeSubagent(t){if(!Ie)return e.debug&&console.warn(`[page-agent-sdk][removeSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略`),!1;let n=Ie.remove(t);return n&&W.infoTick.value++,n},getInfo(){return{id:n,sessionId:W.sessionId,model:Yf(y)?y.model??y.modelName:y.model,systemPrompt:W.agent?.getEffectiveSystemPrompt?.()??I+Hf(ae(),e.schemaHint),tools:(W.agent?.allTools??ye).map(e=>({name:e.name,description:e.description,schema:e.schema,source:R.get(e.name)||`user`})),skills:(Ge?Ge.controller.get():e.skills??[]).map(e=>({name:e.name,description:e.description})),data:ae()?{description:ae().description,schema:ae().schema}:void 0,contextPreset:e.contextPreset??`auto`,memory:E.get(),middleware:$e.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:Se?C.getMission():void 0,workingMemory:Ce?T.getWorkingMemory():void 0,focus:de?w.getFocus():void 0,focuses:de?w.getFocuses():[],trace:te&&W.agent?.spans?{spans:W.agent.spans.value,metrics:Bl(W.agent.spans.value)}:void 0,actions:bh(e.actions??{}),subagent:{enabled:!!Pe,maxDepth:e.subagent?.maxDepth??1,maxParallel:e.subagent?.maxParallel??4,allowedTools:e.subagent?.allowedTools??[],subagents:Ie?.get()??[]},verify:{enabled:!!H,maxAttempts:Ae?ke:0,adversarial:Ae&&!!e.verify?.adversarial},context:(()=>{let e=ze?.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 Se?C.getMission():void 0},setMission(t){if(!Se){e.debug&&console.warn(`[page-agent-sdk][mission] capabilities.missionAnchor 关闭,setMission 忽略`);return}C.setMission(t),W.infoTick.value++},getFocus(){return de?w.getFocus():void 0},getFocuses(){return de?w.getFocuses():[]},setFocus(t){let n=Hh(t,`setFocus`,de,()=>ae()?.schema,e.debug);return n.ok?(w.setFocus(t),W.infoTick.value++,{ok:!0}):n},addFocus(t){let n=Hh(t,`addFocus`,de,()=>ae()?.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){de&&(w.removeFocus(e),W.infoTick.value++)},clearFocus(){de&&(w.clearFocus(),W.infoTick.value++)}};async function rt(){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),U({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),U({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:``)}),nt()}async function it(){await Ze()}function at(e){let t={};for(let n of Fh(e)){let e=x.files[n];e&&(t[n]=e.content)}return t}function ot(){let e=Ih(x.files,Fh(b));for(let t of e)delete x.files[t]}function st(){let e=Af(b,et);if(!e.trimmed)return;let{older:t,summary:n}=e;if(U({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:at(t.flatMap(e=>[e.userMsg,...e.assistantMsgs])),summary:n.content,reason:`max_memory_rounds`}),b.splice(e.deleteFrom,e.deleteCount,n),ot(),m&&l){let n=e.summary,{prevSeg:r}=e;(async()=>{try{let e=await l(Ff(t,g)),i=b.indexOf(n);if(i<0)return;b[i].content=kf(t,r,e),ut()}catch{}})()}}let ct,lt=!1;function ut(){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}),Se){let e=C.getMission();e&&s.save(n,W.sessionId,{mission:e})}if(Ce){let e=T.getWorkingMemory();e&&s.save(n,W.sessionId,{workingMemory:e})}if(de){let e=w.getFocuses();s.save(n,W.sessionId,{focus:e.length?e:null})}F&&j&&(s.save(n,W.sessionId,{checkpoints:j.exportStack()}),s.save(n,W.sessionId,{usage:i}));let a=Jf(b);a&&a!==ct&&(ct=a,s.updateTitle(n,W.sessionId,a)),e.autoTitle!==!1&&u&&!lt&&b.some(e=>e.role===`user`)&&b.some(e=>e.role===`assistant`)&&(lt=!0,(async()=>{let e=await u(b);e&&(await s.updateTitle(n,W.sessionId,e),await nt())})()),e.debug&&console.log(`[page-agent-sdk][persist] save`,W.sessionId,`${b.length} msgs`)}return W.initDone=(async()=>{if(await rt(),await it(),e.mcp?.length){let t=await Promise.allSettled(e.mcp.map(e=>xf(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=>R.set(e.name,`mcp:${i}`)),ce.push(...t.value.tools)):console.warn(`[page-agent-sdk][mcp] server ${i} 连接失败:`,t.reason)}),ye=be(),e.debug&&console.log(`[page-agent-sdk][mcp] 注入 ${ce.length} 个工具,${W.mcpServers.length} 个 server`)}let t=Yf(e.llm)?e.llm:await v(e.llm);W.agent=fu({llm:t,systemPrompt:I,tools:ye,middleware:$e,maxToolRounds:e.maxToolRounds,maxRetries:e.maxRetries,maxParallelTools:e.maxParallelTools,contextWindow:f.contextWindow,maxOutputTokens:f.maxOutputTokens,maxVerifyAttempts:Ae?ke:0,onLlmChange:e=>{y=e},onTrace:te?(e,t)=>{try{U({type:`trace`,spans:e,metrics:t})}catch{}}:void 0,debug:e.debug}),D.current=W.agent,Fe&&Fe.setReconfigureHook&&Fe.setReconfigureHook(()=>{W.agent&&W.agent.setTools(be())})})(),W}function Wh(e,t){let n=e.id??op();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=Uh(e,n),e.shareContext&&zh.set(n,a)),a.refCount++;let s=null,c=Mp(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:h,hide:p,unmount:f,onDialogUnmounted:()=>{s=null,a.release()}}),c.drawer===!0&&c.drawerHidden===!0&&s.hide(),o()}function f(){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()}let h=Lh();return{mount:d,unmount:f,hide:p,show:m,send:(...e)=>h(()=>a.send(...e)),batch:(...e)=>h(()=>a.batch(...e)),switchSession:(...e)=>h(()=>a.switchSession(...e)),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:a.stream,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 Ad(r,e),a.dataOpsController?.markDataDirty?.(),t?.emit!==!1&&a.emit({type:`data_change`,operation:`set`,value:r}),{ok:!0}},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)}}function Gh(e={}){let{fetchResponse:t,fetchStream:n,onPersist:r,onClear:i}=e,a=tn({messages:e.messages??[],loading:!1,error:null}),o=hn(null),s=hn(!0),c=null,l=hn([]),u=hn(null);function d(){}function f(e){let t=o.value;e.deltaY<0?s.value=!1:t&&(s.value=t.scrollHeight-t.scrollTop-t.clientHeight<64)}function p(){o.value&&requestAnimationFrame(()=>{let e=o.value;!e||!s.value||(e.scrollTop=e.scrollHeight)})}function m(e,t,n){a.messages.push({role:e,content:t,timestamp:Date.now(),...n&&n.length?{focuses:n}:{}}),s.value=!0,p()}async function h(e){if(s.value=!0,n){let t=tn({role:`assistant`,content:``,timestamp:Date.now(),reasoning:``,steps:[]}),r=!1;a.messages.push(t);try{await n(a.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+=`
|
|
88
|
+
`):`无可用 checkpoint。`},{name:`list_checkpoints`,description:`列出可用会话 checkpoint(回退点)。`,schema:t.z.object({}).optional()})]:[];B.forEach(e=>R.set(e.name,`builtin`));let de=N.focus,fe=(0,r.tool)(async({path:e,label:t})=>{let n=ae()?.schema;return n?gu(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(`人类可读标签,如「导航栏」`)})}),pe=(0,r.tool)(async()=>(w.clearFocus(),`已清除聚焦,恢复全量可操作范围(可读写所有组件)。`),{name:`clear_focus`,description:`清除当前聚焦,退出精修模式,恢复对全部组件的读写权限。`,schema:t.z.object({}).optional()}),me=(0,r.tool)(async({path:e,label:t})=>{let n=ae()?.schema;if(!n)return`聚焦失败:当前无主数据 schema,无法聚焦。`;if(!gu(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(`人类可读标签`)})}),he=(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`)})}),ge=de&&e.toolMode===`advanced`?[fe,pe,me,he]:[];ge.forEach(e=>R.set(e.name,`builtin`));let _e=[],ve=new Map,ye=be();function be(){let{tools:e,collisions:t}=Th([{label:`builtin`,tools:oe},{label:`user`,tools:se},{label:`action`,tools:z},{label:`humanConfirm`,tools:ue?[ue]:[]},{label:`checkpoint`,tools:B},{label:`focus`,tools:ge},{label:`mcp`,tools:ce},{label:`skill`,tools:_e}]);return t.length&&console.warn(`[page-agent-sdk] 工具重名,后注册覆盖先注册:`,t.map(e=>`${e.name}(${e.loser}→${e.winner})`).join(`, `)),e}let xe=N.planning,Se=N.missionAnchor,Ce=N.workingMemory,we=N.skills,Te=N.vfs;if(Te)for(let e of hm)R.set(e,`builtin`);if(xe)for(let e of S.tools??[])R.set(e.name,`builtin`);let Ee=N.summarization,V=N.agentCompression&&!!d;e.debug&&N.agentCompression&&!d&&console.warn(`[page-agent-sdk][agentCompression] agentCompression 开启但 summaryLlm 不可用(或缺 apiKey / 模型不支持工具),压缩决策不启用,回退静态压缩`);let De=N.memory,Oe=N.subagent,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=!Oe||Me?.enabled===!1?void 0:ff({llm:Me?.llm??e.llm,allTools:()=>ye,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:()=>ae()?.schema??null}),Fe=Oe&&e.subagents!==void 0?hf(e.subagents,{llm:e.llm,allTools:()=>ye,debug:e.debug,getFocuses:()=>w.getFocuses(),getSchema:()=>ae()?.schema??null}):void 0,Ie=Fe?Fe.controller:null,Le=[`get_data`,`describe_data`,`read`,`fetch_document`],Re=ye.filter(e=>Le.includes(e.name)),H=Ae?gf({check:e.verify.check??Sf({schemas:()=>ae()?{"":ae().schema}:{},root:()=>ae()?.bind}),adversarial:e.verify?.adversarial?{llm:e.llm,tools:Re}:void 0}):void 0,ze=je?If({contextWindow:f.contextWindow,thresholdRatio:Rp(e,f.contextWindow).summaryThresholdRatio}):void 0,Be=Dh({...N,humanConfirm:le,subagents:e.subagents?.map(e=>({id:e.id,description:e.description,temperature:e.temperature}))},P&&!!O,e.toolMode,!!O?.resources?.length),Ve=O?{name:`dataHint`,augmentPrompt:()=>Hf(ae(),e.schemaHint)||void 0}:null,He=e.augmentSystem?{name:`augmentSystem`,augmentPrompt:t=>{try{return e.augmentSystem({state:t,data:ae()})}catch(t){e.debug&&console.log(`[page-agent-sdk][augmentSystem] 回调抛错,降级跳过:`,t.message);return}}}:null,Ue=e.onEvent,We=Fp(e.onEvent),U=We.emit,Ge,Ke=[],qe=e=>({name:e.name,description:e.description,content:typeof e.getContent==`function`?e.getContent():``}),Je=e=>({name:e.name,description:e.description,getContent:()=>e.content}),Ye=e.skillStorage===!1?null:Nh({...typeof e.skillStorage==`object`?e.skillStorage:{},id:e.skillStorage&&typeof e.skillStorage==`object`&&e.skillStorage.id?e.skillStorage.id:`agent::${n}`}),Xe=()=>{let t=Ge?Ge.controller:null;if(t){let n=(e.skills||[]).filter(e=>!Ke.some(t=>t.name===e.name));t.set([...n,...Ke])}W.infoTick.value++},Ze=async()=>{if(Ye)try{let t=await Ye.list();if(t.length){Ke=t.map(Je);let n=Ge?Ge.controller:null;if(n){let t=(e.skills||[]).filter(e=>!Ke.some(t=>t.name===e.name));n.set([...t,...Ke])}W.infoTick.value++}}catch{}},Qe=Ee?$d({...p,llmInvoke:l,getRegisteredData:()=>ae()?[{description:ae().description??`主数据对象`}]:[],preserveLastToolResults:h,...V?{decideInvoke:d,getSnapshot:()=>ze?.getSnapshot()}:{}}):void 0,$e=Bp([...Ve?[Ve]:[],Be,...Se?[C]:[],...xe?[S]:[],...we?[Ge=md(e.skills||[],{readVfs:Te?e=>x.files[e]?.content:void 0,hostScriptEnabled:N.skillHostScript,onToolsReady:(e,t)=>{for(let n of t){let t=_e.findIndex(e=>e.name===n.name);t>=0&&_e.splice(t,1),_e.push(n),ve.set(n.name,e),R.set(n.name,`skill:${e}`)}ye=be(),W.agent&&W.agent.setTools(ye),W.infoTick.value++}})]:[],...Te?[_m(x)]:[],...Qe?[Qe]:[],...Ce?[T]:[],...de?[w]:[],...ie?[ie]:[],...De?[E]:[],...e.permissions?.length?[xd(e.permissions)]:[],...A&&M&&j?[Pd(j)]:[],...le?[Ed()]:[],...e.approval&&(e.approval.tools!==void 0||e.approval.confirm)?[Sd(e.approval)]:[],...H?[H]:[],...Pe?[Pe]:[],...Fe?[Fe]:[],...He?[He]:[],...ze?[ze]:[],...e.middleware||[],...F?[_h(i,{tokenBudget:e.tokenBudget,timeBudgetMs:e.timeBudgetMs},U)]:[],Vh(U,b,ae,i)]),et=e.maxMemoryRounds??Rh,tt=hn([]);async function nt(){s&&(tt.value=(await s.listSessions(n)).sort((e,t)=>t.lastAccessed-e.lastAccessed))}let W={agentId:n,store:s,messages:b,vfsStore:x,listeners:We.listeners,todosMw:S,memoryMw:E,missionMw:C,workingMemoryMw:T,focusMw:w,agent:null,initDone:Promise.resolve(),sessionId:``,refCount:0,mcpClosers:[],mcpServers:[],checkpoint:j,dataOpsController:re,skillsController:Ge?Ge.controller:null,infoTick:o,pendingConflict:a.pendingConflict,sessions:tt,refreshSessions:nt,liveData:ae,usage:i,emit:U,unloadSkillTools(e){if(e){let t=_e.length;if(_e=_e.filter(t=>ve.get(t.name)===e?(R.delete(t.name),ve.delete(t.name),!1):!0),_e.length===t)return}else{if(!_e.length)return;for(let e of _e)R.delete(e.name),ve.delete(e.name);_e=[]}ye=be(),W.agent&&W.agent.setTools(ye)},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&&Se&&C.setMission(t.mission),t.workingMemory&&Ce&&T.restore(t.workingMemory),de){let n=t.focus,r=n?Array.isArray(n)?n:[n]:[];if(r.length){let t=ae()?.schema,n=t?r.filter(e=>gu(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)}}}ot()},addSkill(e){let t=Ke.findIndex(t=>t.name===e.name);t>=0?Ke[t]=e:Ke.push(e),Xe(),Ye&&Ye.put(qe(e))},removeSkill(e){let t=Ke.findIndex(t=>t.name===e);return t<0?!1:(Ke.splice(t,1),Xe(),Ye&&Ye.remove(e),!0)},listUserSkills(){return Ke.map(e=>e.name)},getUserSkill(e){let t=Ke.find(t=>t.name===e);if(t)return{name:t.name,description:t.description,content:typeof t.getContent==`function`?t.getContent():``}},afterRound(){st(),ut()},async send(e,t){await W.initDone,t??={},t?.mission&&Se&&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=F?t.maxAutoRetries??1:0,i=0,a=!1;for(;;){a||=(b.push({role:`user`,content:n,timestamp:Date.now()}),!0);try{let e=await W.agent.invoke(b);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){let t=Dl(e,`fatal`);if(i<r&&j?.canRestore()){i+=1,j.restore(),a=!0,U({type:`error`,message:`致命错误自动恢复(${i}/${r}):${t.message},已回退 checkpoint 重试`,severity:`observable`,code:`AUTO_RECOVER_RETRY`,context:{attempt:i,cause:t.code??t.message.slice(0,120)}});continue}throw U({type:`error`,message:t.message,severity:t.severity,...t.code?{code:t.code}:{},...t.context===void 0?{}:{context:t.context}}),e}}},async batch(e,t){if(await W.initDone,!e.length)return[];let n=[];for(let r=0;r<e.length;r++){let i=e[r];j&&j.save(`batch:${r}`);let a=b.length;try{b.push({role:`user`,content:i,timestamp:Date.now()});let a=await W.agent.invoke(b);b.push({role:`assistant`,content:a,timestamp:Date.now()}),W.afterRound(),s&&await s.flush(),n.push({index:r,task:i,reply:a,ok:!0}),t?.({done:r+1,total:e.length,task:i,ok:!0})}catch(o){b.length>a&&b.splice(a);let s=Dl(o,`fatal`);U({type:`error`,message:`批量任务 ${r+1}/${e.length} 失败:${s.message}`,severity:`observable`,code:`BATCH_TASK_FAILED`,context:{index:r,task:i.slice(0,100)}}),n.push({index:r,task:i,error:s.message,ok:!1}),t?.({done:r+1,total:e.length,task:i,ok:!1})}}return n},async switchSession(t){if(await W.initDone,!s)throw Error(`page-agent-sdk: storage 未开启,无法切换会话(请传 storage 选项)`);if(a.resolve(`keep_external`),W.sessionId&&s){if(Se){let e=C.getMission();e&&s.save(n,W.sessionId,{mission:e})}if(Ce){let e=T.getWorkingMemory();e&&s.save(n,W.sessionId,{workingMemory:e})}if(de){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),U({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:``)}),nt(),ct=void 0,lt=!1,r},resetSession:()=>{s&&(W.sessionId=op(),x.clear?.(),S.reset([]),e.memory||E.reset(``),C.reset(),T.reset(),w.reset(),j&&j.importStack([]),W.agent&&(W.agent.debugLogs.value=[]),s.createSession(W.agentId,e.session?.title,W.sessionId),U({type:`session_restored`,sessionId:W.sessionId,rounds:0}),nt(),ct=void 0,lt=!1)},stream:(e,t,n)=>{if(!W.agent)throw Error(`page-agent-sdk: agent 尚未初始化完成,请先 await mount()`);x?.setProtectedRefs?.(Fh(e));let r=Ue?e=>{t?.(e),U(e)}:t;if(n){let e=()=>a.resolve(`keep_external`);n.aborted?e():n.addEventListener(`abort`,e,{once:!0})}return W.agent.stream(e,r,n)},release(){if(W.refCount--,W.refCount<=0){s&&(x.flush?.(),s.flush(),s.dispose()),Ye&&Ye.dispose();let e=W.mcpClosers.splice(0);e.length&&Promise.allSettled(e.map(e=>e())),zh.delete(n)}},resolveConflict:a.resolve,setTools(e){se.length=0,e.forEach(e=>{se.push(e),R.set(e.name,`user`)}),ye=be(),W.agent&&W.agent.setTools(ye),W.infoTick.value++},addTool(e){ye.some(t=>t.name===e.name)&&console.warn(`[page-agent-sdk] 工具 "${e.name}" 已存在,新工具覆盖(后注册覆盖先注册)`);for(let t=se.length-1;t>=0;t--)se[t].name===e.name&&se.splice(t,1);se.push(e),R.set(e.name,`user`),ye=be(),W.agent&&W.agent.setTools(ye),W.infoTick.value++},removeTool(e){let t=se.findIndex(t=>t.name===e);return t<0?!1:(se.splice(t,1),R.delete(e),ye=be(),W.agent&&W.agent.setTools(ye),W.infoTick.value++,!0)},setLlm(t){let n;if(Yf(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=Yf(t)?void 0:t;if(f=Il({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} 小于最小支持 ${Fl}(需 ≥200K 窗口模型)`);W.agent&&(W.agent.setLlm(n),W.agent.setModelCaps?.(f)),Qe?.setContextWindow?.(f.contextWindow),ze?.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(!Ie){e.debug&&console.warn(`[page-agent-sdk][setSubagents] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略`);return}Ie.set(t),W.infoTick.value++},addSubagent(t){if(!Ie){e.debug&&console.warn(`[page-agent-sdk][addSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略`);return}Ie.add(t),W.infoTick.value++},removeSubagent(t){if(!Ie)return e.debug&&console.warn(`[page-agent-sdk][removeSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略`),!1;let n=Ie.remove(t);return n&&W.infoTick.value++,n},getInfo(){return{id:n,sessionId:W.sessionId,model:Yf(y)?y.model??y.modelName:y.model,systemPrompt:W.agent?.getEffectiveSystemPrompt?.()??I+Hf(ae(),e.schemaHint),tools:(W.agent?.allTools??ye).map(e=>({name:e.name,description:e.description,schema:e.schema,source:R.get(e.name)||`user`})),skills:(Ge?Ge.controller.get():e.skills??[]).map(e=>({name:e.name,description:e.description})),data:ae()?{description:ae().description,schema:ae().schema}:void 0,contextPreset:e.contextPreset??`auto`,memory:E.get(),middleware:$e.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:Se?C.getMission():void 0,workingMemory:Ce?T.getWorkingMemory():void 0,focus:de?w.getFocus():void 0,focuses:de?w.getFocuses():[],trace:te&&W.agent?.spans?{spans:W.agent.spans.value,metrics:Bl(W.agent.spans.value)}:void 0,actions:bh(e.actions??{}),subagent:{enabled:!!Pe,maxDepth:e.subagent?.maxDepth??1,maxParallel:e.subagent?.maxParallel??4,allowedTools:e.subagent?.allowedTools??[],subagents:Ie?.get()??[]},verify:{enabled:!!H,maxAttempts:Ae?ke:0,adversarial:Ae&&!!e.verify?.adversarial},context:(()=>{let e=ze?.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 Se?C.getMission():void 0},setMission(t){if(!Se){e.debug&&console.warn(`[page-agent-sdk][mission] capabilities.missionAnchor 关闭,setMission 忽略`);return}C.setMission(t),W.infoTick.value++},getFocus(){return de?w.getFocus():void 0},getFocuses(){return de?w.getFocuses():[]},setFocus(t){let n=Hh(t,`setFocus`,de,()=>ae()?.schema,e.debug);return n.ok?(w.setFocus(t),W.infoTick.value++,{ok:!0}):n},addFocus(t){let n=Hh(t,`addFocus`,de,()=>ae()?.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){de&&(w.removeFocus(e),W.infoTick.value++)},clearFocus(){de&&(w.clearFocus(),W.infoTick.value++)}};async function rt(){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),U({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),U({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:``)}),nt()}async function it(){await Ze()}function at(e){let t={};for(let n of Fh(e)){let e=x.files[n];e&&(t[n]=e.content)}return t}function ot(){let e=Ih(x.files,Fh(b));for(let t of e)delete x.files[t]}function st(){let e=Ud(b,et);if(!e.trimmed)return;let{older:t,summary:n}=e;if(U({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:at(t.flatMap(e=>[e.userMsg,...e.assistantMsgs])),summary:n.content,reason:`max_memory_rounds`}),b.splice(e.deleteFrom,e.deleteCount,n),ot(),m&&l){let n=e.summary,{prevSeg:r}=e;(async()=>{try{let e=await l(Jd(t,g)),i=b.indexOf(n);if(i<0)return;b[i].content=Hd(t,r,e),ut()}catch{}})()}}let ct,lt=!1;function ut(){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}),Se){let e=C.getMission();e&&s.save(n,W.sessionId,{mission:e})}if(Ce){let e=T.getWorkingMemory();e&&s.save(n,W.sessionId,{workingMemory:e})}if(de){let e=w.getFocuses();s.save(n,W.sessionId,{focus:e.length?e:null})}F&&j&&(s.save(n,W.sessionId,{checkpoints:j.exportStack()}),s.save(n,W.sessionId,{usage:i}));let a=Jf(b);a&&a!==ct&&(ct=a,s.updateTitle(n,W.sessionId,a)),e.autoTitle!==!1&&u&&!lt&&b.some(e=>e.role===`user`)&&b.some(e=>e.role===`assistant`)&&(lt=!0,(async()=>{let e=await u(b);e&&(await s.updateTitle(n,W.sessionId,e),await nt())})()),e.debug&&console.log(`[page-agent-sdk][persist] save`,W.sessionId,`${b.length} msgs`)}return W.initDone=(async()=>{if(await rt(),await it(),e.mcp?.length){let t=await Promise.allSettled(e.mcp.map(e=>Bf(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=>R.set(e.name,`mcp:${i}`)),ce.push(...t.value.tools)):console.warn(`[page-agent-sdk][mcp] server ${i} 连接失败:`,t.reason)}),ye=be(),e.debug&&console.log(`[page-agent-sdk][mcp] 注入 ${ce.length} 个工具,${W.mcpServers.length} 个 server`)}let t=Yf(e.llm)?e.llm:await v(e.llm);W.agent=fu({llm:t,systemPrompt:I,tools:ye,middleware:$e,maxToolRounds:e.maxToolRounds,maxRetries:e.maxRetries,maxParallelTools:e.maxParallelTools,contextWindow:f.contextWindow,maxOutputTokens:f.maxOutputTokens,maxVerifyAttempts:Ae?ke:0,onLlmChange:e=>{y=e},onTrace:te?(e,t)=>{try{U({type:`trace`,spans:e,metrics:t})}catch{}}:void 0,debug:e.debug}),D.current=W.agent,Fe&&Fe.setReconfigureHook&&Fe.setReconfigureHook(()=>{W.agent&&W.agent.setTools(be())})})(),W}function Wh(e,t){let n=e.id??op();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=Uh(e,n),e.shareContext&&zh.set(n,a)),a.refCount++;let s=null,c=Mp(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:h,hide:p,unmount:f,onDialogUnmounted:()=>{s=null,a.release()}}),c.drawer===!0&&c.drawerHidden===!0&&s.hide(),o()}function f(){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()}let h=Lh();return{mount:d,unmount:f,hide:p,show:m,send:(...e)=>h(()=>a.send(...e)),batch:(...e)=>h(()=>a.batch(...e)),switchSession:(...e)=>h(()=>a.switchSession(...e)),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:a.stream,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 Ad(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[fm(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)}}function Gh(e={}){let{fetchResponse:t,fetchStream:n,onPersist:r,onClear:i}=e,a=tn({messages:e.messages??[],loading:!1,error:null}),o=hn(null),s=hn(!0),c=null,l=hn([]),u=hn(null);function d(){}function f(e){let t=o.value;e.deltaY<0?s.value=!1:t&&(s.value=t.scrollHeight-t.scrollTop-t.clientHeight<64)}function p(){o.value&&requestAnimationFrame(()=>{let e=o.value;!e||!s.value||(e.scrollTop=e.scrollHeight)})}function m(e,t,n){a.messages.push({role:e,content:t,timestamp:Date.now(),...n&&n.length?{focuses:n}:{}}),s.value=!0,p()}async function h(e){if(s.value=!0,n){let t=tn({role:`assistant`,content:``,timestamp:Date.now(),reasoning:``,steps:[]}),r=!1;a.messages.push(t);try{await n(a.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+=`
|
|
89
89
|
`,!1),t.reasoning+=e.delta;break;case`text`:r&&=(t.content+=`
|
|
90
90
|
`,!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`:u.value={toolName:e.toolName,args:e.args,resolve:e.resolve};break}p()},e)}catch(n){if(Hl(n,e)||(a.error=n.message||`请求失败,请重试`),!t.content&&!t.reasoning){let e=a.messages.indexOf(t);e>=0&&a.messages.splice(e,1)}}finally{await g()}return}try{m(`assistant`,await(t||b)(a.messages,e))}catch(t){Hl(t,e)||(a.error=t.message||`请求失败,请重试`)}finally{await g()}}async function g(){try{await r?.(a.messages)}catch{}a.loading=!1,c=null;let e=l.value.shift();e!==void 0&&(m(`user`,e),a.loading=!0,a.error=null,c=new AbortController,await h(c.signal))}function _(e){l.value.splice(e,1)}async function v(e,t){if(e.trim()){if(a.loading){l.value.push(e.trim());return}m(`user`,e.trim(),t),a.loading=!0,a.error=null,c=new AbortController,await h(c.signal)}}async function y(){if(a.loading)return;let e=a.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`)&&(a.loading=!0,a.error=null,c=new AbortController,await h(c.signal))}async function b(e){return await new Promise(e=>setTimeout(e,800+Math.random()*1200)),`收到你的消息:"${e.filter(e=>e.role===`user`).pop()?.content}"。这是一个模拟回复,请接入实际的 AI API。`}function x(){i?.(),a.messages.splice(0,a.messages.length),a.error=null}function S(){l.value=[],c?.abort()}function C(){l.value=[],c?.abort(),c=null,a.loading=!1,a.error=null,u.value=null}function w(e){let t=u.value;t&&(u.value=null,t.resolve(e))}async function T(){if(!a.error)return;let e=a.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),a.error=null,await v(n)}return{state:a,scrollContainer:o,pendingApproval:u,queuedTasks:l,sendMessage:v,removeQueuedTask:_,clearMessages:x,stop:S,reset:C,retry:T,regenerate:y,resolveApproval:w,onScroll:d,onWheel:f}}async function Kh(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 qh=Symbol(`chatContext`);function Jh(e={}){let t=Gh({fetchResponse:e.fetchResponse,fetchStream:e.fetchStream,messages:e.messages,onPersist:e.onPersist,onClear:e.onClear}),{state:n,sendMessage:r,removeQueuedTask:i,queuedTasks:a}=t,o=hn(``),s=hn(!0),c=()=>{s.value=!s.value},l=hn(!1),u=()=>{l.value=!0},d=()=>{l.value=!1},f=hn(!1),p=()=>{f.value=!0},m=()=>{f.value=!1},h=hn({}),g=e=>h.value[e]!==!1,_=e=>{h.value[e]=!g(e)},v=hn(!1),y=e=>{Kh(e).then(e=>{e&&(v.value=!0,setTimeout(()=>{v.value=!1},1500))})},b=Ws(()=>{let t=e.getInfo?.();return{mcp:t?.mcp?.servers?.length??0,tools:t?.tools?.length??0}}),x=Ws(()=>(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=Ws(()=>(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 Yh(){let e=Gr(qh);if(!e)throw Error(`useChatContext 必须在 provide(chatContextKey) 的组件子树内调用`);return e}var Xh={class:`chat-header`},Zh={class:`header-left`},Qh={class:`header-title`},$h={key:0,class:`status-dot pulse`},eg=[`data-sid`,`onClick`],tg={class:`hist-title`},ng={class:`hist-meta`},rg=[`onClick`],ig={key:0,class:`debug-badge`},ag={key:0,class:`more-item-badge`},og=[`disabled`],sg=Di({__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=Yh(),{chat:r}=n,{state:i,reset:a,clearMessages:o}=r,s=hn(!1),c=hn(!1),l=Ws(()=>i.messages.length>0),u=Ws(()=>(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`,Xh,[Z(`div`,Zh,[r[10]||=Z(`span`,{class:`header-icon`},`🤖`,-1),Z(`span`,Qh,H(e.title),1),K(i).loading?(Y(),X(`span`,$h)):Q(``,!0)]),Z(`div`,{class:`header-actions`,onClick:r[8]||=dl(()=>{},[`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:V([`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]||=dl(()=>{},[`stop`])},[(Y(!0),X(J,null,$i(e.sessions,t=>(Y(),X(`div`,{key:t.sessionId,class:V([`hist-item`,{active:e.currentSessionId===t.sessionId}]),"data-sid":t.sessionId,onClick:e=>p(t.sessionId)},[Z(`div`,tg,H(t.title||`会话 `+t.sessionId.slice(-6)),1),Z(`div`,ng,[Z(`span`,null,H(d(t.lastAccessed)),1),e.currentSessionId===t.sessionId?Q(``,!0):(Y(),X(`button`,{key:0,class:`hist-del`,"data-test":`del-btn`,onClick:dl(n=>e.onRemoveSession?.(t.sessionId),[`stop`])},`✕`,8,rg))])],10,eg))),128))])):Q(``,!0),Z(`button`,{class:V([`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`,ig,H(e.debugLogs?.length),1)):Q(``,!0)],2),s.value?(Y(),X(`div`,{key:3,class:`more-menu`,onClick:r[6]||=dl(()=>{},[`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`,ag,H(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,og)])):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)]))}}),cg=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},lg=cg(sg,[[`__scopeId`,`data-v-faeba147`]]),ug={key:0,class:`focus-bar`},dg={class:`focus-bar-text`},fg={key:0,class:`focus-bar-label`},pg={class:`focus-bar-path`},mg={key:0,class:`focus-edit-row`},hg=cg(Di({__name:`FocusBar`,props:{getFocus:{type:Function},onSetFocus:{type:Function},onClearFocus:{type:Function},infoTick:{}},setup(e){let t=e,n=Ws(()=>(t.infoTick?.value,t.getFocus?.())),r=hn(!1),i=hn(``),a=hn(``);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`,ug,[t[3]||=Z(`span`,{class:`focus-bar-icon`},`🎯`,-1),Z(`span`,dg,[n.value.label?(Y(),X(`span`,fg,H(n.value.label),1)):Q(``,!0),Z(`code`,pg,H(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`,mg,[Hr(Z(`input`,{"onUpdate:modelValue":t[1]||=e=>i.value=e,class:`focus-edit-input`,placeholder:`jsonPath,如 components.3`,"data-test":`focus-path-input`,onKeyup:pl(o,[`enter`])},null,544),[[cl,i.value]]),Hr(Z(`input`,{"onUpdate:modelValue":t[2]||=e=>a.value=e,class:`focus-edit-input focus-edit-label`,placeholder:`标签(可选)`,onKeyup:pl(o,[`enter`])},null,544),[[cl,a.value]]),Z(`button`,{class:`focus-edit-go`,"data-test":`focus-submit`,onClick:o},`聚焦`)])):Q(``,!0)])):Q(``,!0)}}),[[`__scopeId`,`data-v-0d078a41`]]),gg={class:`reasoning-toggle`},_g={key:0,class:`reasoning-body`},vg=cg(Di({__name:`MessageReasoning`,props:{text:{},expanded:{type:Boolean}},emits:[`toggle`],setup(e){return(t,n)=>e.text?(Y(),X(`div`,{key:0,class:V([`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`,gg,H(e.expanded?`收起`:`展开`),1)]),e.expanded?(Y(),X(`div`,_g,H(e.text),1)):Q(``,!0)],2)):Q(``,!0)}}),[[`__scopeId`,`data-v-01f28016`]]),yg={key:0,class:`steps-block`},bg={class:`step-head`},xg={class:`step-name`},Sg={key:0,class:`step-count`},Cg={key:1,class:`step-duration`},wg={key:0,class:`step-children`},Tg={class:`step-name`},Eg={key:0,class:`step-status running`},Dg=cg(Di({__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=Ws(()=>r(t.steps));return(t,r)=>e.steps.length?(Y(),X(`div`,yg,[(Y(!0),X(J,null,$i(i.value,(e,t)=>(Y(),X(`div`,{key:t,class:V([`step-item`,e.status])},[Z(`div`,bg,[Z(`span`,{class:V([`status-dot`,e.status])},null,2),Z(`span`,xg,H(e.name),1),e.count>1?(Y(),X(`span`,Sg,`×`+H(e.count),1)):Q(``,!0),Z(`span`,{class:V([`step-status`,e.status])},H(n(e.status)),3),e.durationMs!=null&&e.status!==`running`?(Y(),X(`span`,Cg,H(e.durationMs)+`ms`,1)):Q(``,!0)]),e.children&&e.children.length?(Y(),X(`div`,wg,[r[0]||=Z(`div`,{class:`step-children-label`},`🧬 子 agent 进度`,-1),(Y(!0),X(J,null,$i(e.children,(e,t)=>(Y(),X(`div`,{key:t,class:V([`step-child`,e.status])},[Z(`span`,{class:V([`status-dot sm`,e.status])},null,2),Z(`span`,Tg,H(e.name),1),e.status===`running`?(Y(),X(`span`,Eg,`…`)):Q(``,!0)],2))),128))])):Q(``,!0)],2))),128))])):Q(``,!0)}}),[[`__scopeId`,`data-v-c9f48455`]]);function Og(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var kg=Og();function Ag(e){kg=e}var jg={exec:()=>null};function Mg(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 Ng(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(Fg.caret,`$1`),n=n.replace(e,i),r},getRegex:()=>new RegExp(n,t)};return r}var Pg=((e=``)=>{try{return!!RegExp(`(?<=1)(?<!1)`+e)}catch{return!1}})(),Fg={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:Mg(e=>RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:Mg(e=>RegExp(`^ {0,${e}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)),fencesBeginRegex:Mg(e=>RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)),headingBeginRegex:Mg(e=>RegExp(`^ {0,${e}}#`)),htmlBeginRegex:Mg(e=>RegExp(`^ {0,${e}}<(?:[a-z].*>|!--)`,`i`)),blockquoteBeginRegex:Mg(e=>RegExp(`^ {0,${e}}>`))},Ig=/^(?:[ \t]*(?:\n|$))+/,Lg=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Rg=/^ {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+|$)/,Bg=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,Vg=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,Hg=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Ug=Ng(Hg).replace(/bull/g,Vg).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(),Wg=Ng(Hg).replace(/bull/g,Vg).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(),Gg=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,Kg=/^[^\n]+/,qg=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,Jg=Ng(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace(`label`,qg).replace(`title`,/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Yg=Ng(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,Vg).getRegex(),Xg=`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`,Zg=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,Qg=Ng(`^ {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`,Zg).replace(`tag`,Xg).replace(`attribute`,/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),$g=e=>Ng(Gg).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`,Xg).getRegex(),e_=$g(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/),t_=$g(/ {0,3}(?:[*+-]|\d{1,9}[.)])[ \t]+[^ \t\n]/),n_={blockquote:Ng(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace(`paragraph`,t_).getRegex(),code:Lg,def:Jg,fences:Rg,heading:Bg,hr:zg,html:Qg,lheading:Ug,list:Yg,newline:Ig,paragraph:e_,table:jg,text:Kg},r_=Ng(`^ *([^\\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`,Xg).getRegex(),i_={...n_,lheading:Wg,table:r_,paragraph:Ng(Gg).replace(`hr`,zg).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`table`,r_).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`,Xg).getRegex()},a_={...n_,html:Ng(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace(`comment`,Zg).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:jg,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:Ng(Gg).replace(`hr`,zg).replace(`heading`,` *#{1,6} *[^
|
|
91
91
|
]`).replace(`lheading`,Ug).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`|fences`,``).replace(`|list`,``).replace(`|html`,``).replace(`|tag`,``).getRegex()},o_=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,s_=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,c_=/^( {2,}|\\)\n(?!\s*$)/,l_=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,u_=/[\p{P}\p{S}]/u,d_=/[\s\p{P}\p{S}]/u,f_=/[^\s\p{P}\p{S}]/u,p_=Ng(/^((?![*_])punctSpace)/,`u`).replace(/punctSpace/g,d_).getRegex(),m_=/(?!~)[\p{P}\p{S}]/u,h_=/(?!~)[\s\p{P}\p{S}]/u,g_=/(?:[^\s\p{P}\p{S}]|~)/u,__=Ng(/link|precode-code|html/,`g`).replace(`link`,/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace(`precode-`,Pg?"(?<!`)()":"(^^|[^`])").replace(`code`,/(?<b>`+)[^`]+\k<b>(?!`)/).replace(`html`,/<(?! )[^<>]*?>/).getRegex(),v_=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,y_=Ng(v_,`u`).replace(/punct/g,u_).getRegex(),b_=Ng(v_,`u`).replace(/punct/g,m_).getRegex(),x_=`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)`,S_=Ng(x_,`gu`).replace(/notPunctSpace/g,f_).replace(/punctSpace/g,d_).replace(/punct/g,u_).getRegex(),C_=Ng(x_,`gu`).replace(/notPunctSpace/g,g_).replace(/punctSpace/g,h_).replace(/punct/g,m_).getRegex(),w_=Ng(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)`,`gu`).replace(/notPunctSpace/g,f_).replace(/punctSpace/g,d_).replace(/punct/g,u_).getRegex(),T_=Ng(/^~~?(?:((?!~)punct)|[^\s~])/,`u`).replace(/punct/g,u_).getRegex(),E_=Ng(`^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,f_).replace(/punctSpace/g,d_).replace(/punct/g,u_).getRegex(),D_=Ng(/\\(punct)/,`gu`).replace(/punct/g,u_).getRegex(),O_=Ng(/^<(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(),k_=Ng(Zg).replace(`(?:-->|$)`,`-->`).getRegex(),A_=Ng(`^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`,k_).replace(`attribute`,/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),j_=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/,M_=Ng(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace(`label`,j_).replace(`href`,/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace(`title`,/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),N_=Ng(/^!?\[(label)\]\[(ref)\]/).replace(`label`,j_).replace(`ref`,qg).getRegex(),P_=Ng(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,qg).getRegex(),F_=Ng(`reflink|nolink(?!\\()`,`g`).replace(`reflink`,N_).replace(`nolink`,P_).getRegex(),I_=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,L_={_backpedal:jg,anyPunctuation:D_,autolink:O_,blockSkip:__,br:c_,code:s_,del:jg,delLDelim:jg,delRDelim:jg,emStrongLDelim:y_,emStrongRDelimAst:S_,emStrongRDelimUnd:w_,escape:o_,link:M_,nolink:P_,punctuation:p_,reflink:N_,reflinkSearch:F_,tag:A_,text:l_,url:jg},R_={...L_,link:Ng(/^!?\[(label)\]\((.*?)\)/).replace(`label`,j_).getRegex(),reflink:Ng(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace(`label`,j_).getRegex()},z_={...L_,emStrongRDelimAst:C_,emStrongLDelim:b_,delLDelim:T_,delRDelim:E_,url:Ng(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace(`protocol`,I_).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:Ng(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace(`protocol`,I_).getRegex()},B_={...z_,br:Ng(c_).replace(`{2,}`,`*`).getRegex(),text:Ng(z_.text).replace(`\\b_`,`\\b_| {2,}\\n`).replace(/\{2,\}/g,`*`).getRegex()},V_={normal:n_,gfm:i_,pedantic:a_},H_={normal:L_,gfm:z_,breaks:B_,pedantic:R_},U_={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`},W_=e=>U_[e];function G_(e,t){if(t){if(Fg.escapeTest.test(e))return e.replace(Fg.escapeReplace,W_)}else if(Fg.escapeTestNoEncode.test(e))return e.replace(Fg.escapeReplaceNoEncode,W_);return e}function K_(e){try{e=encodeURI(e).replace(Fg.percentDecode,`%`)}catch{return null}return e}function q_(e,t){let n=e.replace(Fg.findPipe,(e,t,n)=>{let r=!1,i=t;for(;--i>=0&&n[i]===`\\`;)r=!r;return r?`|`:` |`}).split(Fg.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(Fg.slashPipe,`|`);return n}function J_(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 Y_(e){let t=e.split(`
|
|
@@ -177,4 +177,75 @@ app.mount('#app');
|
|
|
177
177
|
<\/script></body></html>`}Jr(()=>a.value,async()=>{await $n(),a.value===`preview`&&i.value&&(i.value.srcdoc=c.value)},{immediate:!0});function u(){Kh(n.code).then(e=>{e&&(o.value=!0,setTimeout(()=>o.value=!1,1500))})}function d(){let e=e=>e.replace(/&/g,`&`).replace(/"/g,`"`).replace(/</g,`<`),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]||=dl(e=>r(`close`),[`self`])},[Z(`div`,xb,[Z(`div`,Sb,[Z(`span`,Cb,`代码预览 · `+H(e.lang),1),Z(`div`,wb,[Z(`button`,{class:V({active:a.value===`preview`}),disabled:!s.value,onClick:n[0]||=e=>a.value=`preview`},`预览`,10,Tb),Z(`button`,{class:V({active:a.value===`source`}),onClick:n[1]||=e=>a.value=`source`},`源码`,2)]),Z(`div`,Eb,[Z(`button`,{class:`icon-btn`,title:o.value?`已复制`:`复制代码`,onClick:u},H(o.value?`✓`:`📋`),9,Db),Z(`button`,{class:`icon-btn`,title:`新窗口打开`,onClick:d},`↗`),Z(`button`,{class:`icon-btn`,title:`关闭`,onClick:n[2]||=e=>r(`close`)},`✕`)])]),Z(`div`,Ob,[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`,Ab,[Z(`code`,null,H(e.code),1)]))])])]))}}),[[`__scopeId`,`data-v-985c5382`]]),Mb=[`innerHTML`],Nb=Di({__name:`MessageContent`,props:{content:{}},setup(e){let t=e,{html:n,codeBlocks:r}=bb(()=>t.content),i=hn(null),a=hn(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 $n();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 Kh(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 Ui(l),Gi(l),Jr(()=>t.content,l),(e,t)=>(Y(),X(J,null,[Z(`div`,{class:`message-md`,ref_key:`containerRef`,ref:i,innerHTML:K(n)},null,8,Mb),(Y(),Zo(li,{to:`body`},[a.value?(Y(),Zo(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))}}),Pb={key:1,class:`typing-text`},Fb={key:0,class:`stream-cursor`},Ib=cg(Di({__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:V([`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`,Pb,`思考中…`))],64)):(Y(),X(J,{key:1},[e.role===`assistant`?(Y(),Zo(Nb,{key:0,content:e.content},null,8,[`content`])):(Y(),X(J,{key:1},[ls(H(e.content),1)],64))],64))],2),e.showCursor?(Y(),X(`span`,Fb)):Q(``,!0)],64))}}),[[`__scopeId`,`data-v-186e68d9`]]),Lb={class:`message-time`},Rb=cg(Di({__name:`MessageTime`,props:{time:{}},setup(e){return(t,n)=>(Y(),X(`div`,Lb,H(e.time),1))}}),[[`__scopeId`,`data-v-4a976e4a`]]),zb={class:`msg-actions`},Bb=[`title`],Vb=cg(Di({__name:`MessageActions`,props:{copied:{type:Boolean}},emits:[`copy`,`regenerate`],setup(e){return(t,n)=>(Y(),X(`div`,zb,[Z(`button`,{class:`msg-action-btn`,title:e.copied?`已复制`:`复制`,onClick:n[0]||=e=>t.$emit(`copy`)},H(e.copied?`✓ 已复制`:`📋 复制`),9,Bb),Z(`button`,{class:`msg-action-btn`,title:`重新生成`,onClick:n[1]||=e=>t.$emit(`regenerate`)},`🔄 重新生成`)]))}}),[[`__scopeId`,`data-v-33638c4b`]]),Hb=[`data-msg-idx`],Ub={key:0,class:`message-avatar`},Wb={class:`message-content`},Gb={key:2,class:`msg-focuses`},Kb=[`title`,`onClick`],qb=[`onClick`],Jb=cg(Di({__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=Yh(),r=Ws(()=>t.message.role===`assistant`),i=Ws(()=>r.value&&`reasoning`in t.message?t.message.reasoning??``:``),a=Ws(()=>r.value&&`steps`in t.message?t.message.steps??[]:[]),o=Ws(()=>r.value&&!!t.message.content&&!t.loading&&t.isLast),s=Ws(()=>r.value&&t.loading&&t.isLast&&!!t.message.content);return(t,c)=>(Y(),X(`div`,{class:V([`message-row`,e.message.role]),"data-msg-idx":e.index},[e.showAvatar?(Y(),X(`div`,Ub,H(e.message.role===`user`?`👤`:`🤖`),1)):Q(``,!0),Z(`div`,Wb,[r.value?(Y(),Zo(vg,{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(),Zo(Dg,{key:1,steps:a.value},null,8,[`steps`])):Q(``,!0),e.message.role===`user`&&e.message.focuses?.length?(Y(),X(`div`,Gb,[(Y(!0),X(J,null,$i(e.message.focuses,e=>(Y(),X(`span`,{key:e.path,class:`msg-focus-chip`,title:`回看 ${e.path}`,onClick:t=>K(n).focusChipClick(e)},[ls(`🎯 `+H(e.path),1),Z(`button`,{type:`button`,class:`msg-focus-chip-x`,onClick:dl(t=>K(n).removeFocus(e.path),[`stop`])},`✕`,8,qb)],8,Kb))),128))])):Q(``,!0),is(Ib,{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`]),is(Rb,{time:e.time},null,8,[`time`]),o.value?(Y(),Zo(Vb,{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,Hb))}}),[[`__scopeId`,`data-v-d4e22dfc`]]),Yb={key:0,class:`empty-state`},Xb={key:1,class:`message-row assistant`},Zb={key:0,class:`message-avatar`},Qb={class:`message-content`},$b={key:2,class:`error-bar`},ex={class:`error-text`},tx=cg(Di({__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}=Yh(),{state:u,scrollContainer:d,onScroll:f,onWheel:p,retry:m,regenerate:h}=t,g=Ws(()=>u.messages.length>0),_=Ws(()=>u.messages.some(e=>e.role===`user`)),v=Ws(()=>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`,Yb,[...y[4]||=[Z(`div`,{class:`empty-icon`},`💬`,-1),Z(`p`,null,`有什么可以帮你的?`,-1)]])),(Y(!0),X(J,null,$i(K(u).messages,(t,c)=>(Y(),Zo(Jb,{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`,Xb,[e.showAvatar?(Y(),X(`div`,Zb,`🤖`)):Q(``,!0),Z(`div`,Qb,[is(Ib,{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`,$b,[Z(`span`,ex,H(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`]]),nx={key:0,class:`queued-bar`},rx={class:`queued-head`},ix={class:`queued-count`},ax={class:`queued-idx`},ox={class:`queued-text`},sx=[`onClick`],cx=[`onClick`],lx=cg(Di({__name:`QueuedBar`,setup(e){let{chat:t,editQueued:n}=Yh(),{queuedTasks:r,removeQueuedTask:i}=t;return(e,t)=>K(r).length?(Y(),X(`div`,nx,[Z(`div`,rx,[t[0]||=Z(`span`,{class:`queued-icon`},`📋`,-1),t[1]||=Z(`span`,{class:`queued-title`},`排队中 · 生成完后自动执行`,-1),Z(`span`,ix,H(K(r).length),1)]),(Y(!0),X(J,null,$i(K(r),(e,t)=>(Y(),X(`div`,{key:t,class:`queued-item`},[Z(`span`,ax,H(t+1),1),Z(`span`,ox,H(e),1),Z(`button`,{class:`queued-act`,title:`修改(填回输入框编辑)`,onClick:e=>K(n)(t)},`✏️`,8,sx),Z(`button`,{class:`queued-act queued-del`,title:`撤销该任务`,onClick:e=>K(i)(t)},`✕`,8,cx)]))),128))])):Q(``,!0)}}),[[`__scopeId`,`data-v-f32730a9`]]),ux={key:0,class:`approval-bar`},dx={key:0,class:`approval-question`},fx={key:1,class:`approval-context`},px={key:2,class:`approval-recommend`},mx={class:`approval-actions`},hx=[`onClick`],gx={class:`approval-head`},_x={class:`approval-title`},vx={key:0,class:`approval-args`},yx={class:`approval-actions`},bx=cg(Di({__name:`ApprovalBar`,setup(e){let{pendingApproval:t,resolveApproval:n}=Yh().chat,r=hn(!1);Jr(t,()=>{r.value=!1});let i=Ws(()=>t.value?.toolName===`request_human_confirmation`),a=Ws(()=>{let e=t.value?.args?.options;return Array.isArray(e)?e.map(String):[]}),o=Ws(()=>{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)+`
|
|
178
178
|
…(已截断)`:t}catch{return String(e)}});return(e,s)=>K(t)?(Y(),X(`div`,ux,[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,H(K(t).args.question),1)):Q(``,!0),K(t).args?.context?(Y(),X(`div`,fx,H(K(t).args.context),1)):Q(``,!0),K(t).args?.recommendation?(Y(),X(`div`,px,`💡 推荐:`+H(K(t).args.recommendation),1)):Q(``,!0),Z(`div`,mx,[Z(`button`,{class:`approval-deny`,onClick:s[0]||=e=>K(n)(!1)},`拒绝`),a.value.length?(Y(!0),X(J,{key:0},$i(a.value,e=>(Y(),X(`button`,{key:e,class:`approval-opt`,onClick:t=>K(n)(e)},H(e),9,hx))),128)):(Y(),X(`button`,{key:1,class:`approval-allow`,onClick:s[1]||=e=>K(n)(!0)},`允许`))])],64)):(Y(),X(J,{key:1},[Z(`div`,gx,[s[7]||=Z(`span`,{class:`approval-icon`},`✋`,-1),Z(`span`,_x,[s[6]||=ls(`需确认工具调用:`,-1),Z(`code`,null,H(K(t).toolName),1)]),o.value?(Y(),X(`button`,{key:0,class:`approval-toggle`,onClick:s[2]||=e=>r.value=!r.value},H(r.value?`收起参数`:`查看参数`)+H(r.value?` ▴`:` ▾`),1)):Q(``,!0)]),o.value&&r.value?(Y(),X(`pre`,vx,H(o.value),1)):Q(``,!0),Z(`div`,yx,[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-239eb931`]]),xx={key:0,class:`conflict-bar`},Sx={class:`conflict-head`},Cx={class:`conflict-title`},wx={class:`conflict-detail`},Tx={key:0,class:`conflict-diff`},Ex={class:`conflict-diff-col`},Dx={class:`conflict-diff-pre`},Ox={class:`conflict-diff-col`},kx={class:`conflict-diff-pre`},Ax={class:`conflict-actions`},jx=cg(Di({__name:`ConflictBar`,props:{pendingConflict:{},onResolve:{type:Function}},setup(e){let t=e,n=hn(!1);Jr(()=>t.pendingConflict,()=>{n.value=!1});let r=Ws(()=>{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)+`
|
|
179
179
|
…(已截断)`:t}catch{return String(e)}}),i=Ws(()=>{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)+`
|
|
180
|
-
…(已截断)`:t}catch{return String(e)}});return(t,a)=>e.pendingConflict?(Y(),X(`div`,xx,[Z(`div`,Sx,[a[6]||=Z(`span`,{class:`conflict-icon`},`⚠️`,-1),Z(`span`,Cx,[a[4]||=ls(`写入冲突:`,-1),Z(`code`,null,H(e.pendingConflict.path),1),a[5]||=ls(` 已被外部修改`,-1)])]),Z(`div`,wx,` AI 基于「读取时的旧值」准备`+H(e.pendingConflict.op===`delete`?`删除`:`写入`)+`,但该属性在你读取之后被外部代码/其他 agent/手动改过。 `,1),Z(`button`,{class:`conflict-toggle`,onClick:a[0]||=e=>n.value=!n.value},H(n.value?`收起对比`:`查看值对比`)+H(n.value?` ▴`:` ▾`),1),n.value?(Y(),X(`div`,Tx,[Z(`div`,Ex,[a[7]||=Z(`div`,{class:`conflict-diff-label`},`AI 想写的值`,-1),Z(`pre`,Dx,H(r.value||`(delete 操作无值)`),1)]),Z(`div`,Ox,[a[8]||=Z(`div`,{class:`conflict-diff-label`},`外部改后的当前值`,-1),Z(`pre`,kx,H(i.value),1)])])):Q(``,!0),Z(`div`,Ax,[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`]]),Mx={class:`chat-footer`},Nx={class:`chat-input-wrap`},Px={key:0,class:`focus-chips`},Fx=[`title`,`onClick`],Ix={class:`focus-chip-path`},Lx=[`onClick`],Rx=[`placeholder`,`rows`],zx={class:`input-actions`},Bx=[`disabled`,`title`],Vx={key:0,width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`currentColor`},Hx={key:1,width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},Ux=cg(Di({__name:`ChatInput`,props:{placeholder:{},inputRows:{}},setup(e){let t=Yh(),{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`,Mx,[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`,Nx,[K(s).length?(Y(),X(`div`,Px,[(Y(!0),X(J,null,$i(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`,Ix,H(e.path),1),Z(`button`,{type:`button`,class:`focus-chip-x`,"data-test":`focus-clear`,title:`移除此焦点`,onClick:dl(t=>K(c)(e.path),[`stop`])},`✕`,8,Lx)],8,Fx))),128))])):Q(``,!0),Hr(Z(`textarea`,{"onUpdate:modelValue":f[1]||=e=>mn(n)?n.value=e:null,class:V([`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,Rx),[[cl,K(n)]]),Z(`div`,zx,[f[7]||=Z(`span`,{class:`send-hint`},`Enter 发送 · Shift+Enter 换行`,-1),Z(`button`,{class:V([`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`,Vx,[...f[5]||=[Z(`rect`,{x:`6`,y:`6`,width:`12`,height:`12`,rx:`2`},null,-1)]])):(Y(),X(`svg`,Hx,[...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,Bx)])])]))}}),[[`__scopeId`,`data-v-3a3e4dfa`]]),Wx={key:0,class:`debug-drawer`},Gx={class:`drawer-panel`},Kx={class:`drawer-header`},qx={class:`tab-group`},Jx={class:`header-actions`},Yx={key:0,class:`drawer-filters`},Xx=[`onClick`],Zx={class:`chip-count`},Qx={class:`chip-count`},$x={class:`drawer-body`},eS={key:0,class:`trace-panel`},tS={key:0,class:`trace-empty`},nS={class:`trace-metrics`},rS={class:`metric-card`},iS={class:`metric-card`},aS={class:`metric-card`},oS={class:`metric-card`},sS={key:0,class:`metric-card`},cS={key:1,class:`metric-card`},lS={class:`trace-spans`},uS={class:`span-ico`},dS={class:`span-name`},fS={key:0,class:`span-dur`},pS={key:1,class:`span-status`},mS={key:1,class:`context-panel`},hS={key:0,class:`trace-empty`},gS={class:`ctx-overview`},_S={class:`ctx-occupancy`},vS=[`title`],yS={class:`ctx-pct`},bS={class:`ctx-kv-row`},xS={class:`ctx-kv`},SS={key:0,class:`ctx-kv`},CS={key:1,class:`ctx-kv`},wS=[`title`],TS={class:`ctx-cat-bar`},ES={class:`ctx-cat-tokens`},DS={key:0,class:`ctx-compression`},OS={class:`ctx-kv-row`},kS={class:`ctx-kv`},AS={class:`ctx-kv`},jS={class:`ctx-kv`},MS={key:0,class:`ctx-kv`},NS={key:0,class:`empty`},PS={class:`log-head`},FS={key:0,class:`log-source`},IS={class:`log-time`},LS={class:`log-body`},RS={class:`kv-grid`},zS={class:`kv`},BS={class:`v`},VS={class:`kv`},HS={class:`v`},US={class:`kv`},WS={class:`v`},GS={class:`kv`},KS={class:`v`},qS={class:`section-label`},JS={class:`chip-row`},YS={class:`msg-list`},XS={class:`msg-text`},ZS={class:`badge-row`},QS={class:`badge`},$S={key:0,class:`badge muted`},eC={class:`badge muted`},tC={key:1,class:`badge muted`},nC=[`onClick`],rC={key:0,class:`msg-list`},iC={class:`msg-detail`},aC={key:0,class:`msg-text`},oC={class:`tc-inline-name`},sC={class:`tc-inline-args`},cC={key:1,class:`tc-id`},lC={key:1,class:`log-raw`},uC={class:`badge-row`},dC={class:`badge`},fC={key:0,class:`badge warn`},pC={key:0,class:`resp-content`},mC={key:1,class:`tc-list`},hC={class:`tc-name`},gC={class:`tc-args`},_C={key:2,class:`usage-row`},vC={class:`usage`},yC={class:`usage`},bC={class:`usage`},xC={key:3,class:`tc-card inline`},SC={class:`tc-name`},CC={class:`tc-args`},wC={key:4,class:`tc-card inline`},TC={class:`tc-name`},EC={class:`tc-args`},DC={key:5,class:`err-box`},OC={class:`log-footer`},kC=[`onClick`],AC=[`onClick`],jC={key:0,class:`log-raw`},MC={key:0,class:`empty`},NC={key:1,class:`flow-section`},PC={class:`flow-ico`},FC={class:`flow-label`},IC={class:`flow-detail`},LC={class:`flow-time`},RC={class:`flow-round-head`},zC={class:`flow-round-body`},BC={class:`flow-ico`},VC={class:`flow-label`},HC={class:`flow-detail`},UC={class:`flow-time`},WC={key:4,class:`info-body`},GC={key:0,class:`empty`},KC={class:`info-section`},qC={class:`kv-grid`},JC={class:`kv`},YC={class:`v`},XC={class:`kv`},ZC={class:`v`},QC={class:`kv`},$C={class:`v`},ew={class:`kv`},tw={class:`v`},nw={class:`kv`,style:{"margin-top":`6px`}},rw={class:`v`,style:{"font-size":`11px`}},iw={class:`info-section`},aw={class:`info-title`},ow={class:`info-name`},sw={class:`info-desc`},cw={key:0,class:`info-section`},lw={class:`info-title`},uw=[`onClick`],dw={class:`info-desc`},fw={key:0,class:`skill-content`},pw={key:0,class:`skill-loading`},mw={key:1,class:`skill-error`},hw={key:2,class:`skill-pre`},gw={key:1,class:`info-section`},_w={class:`info-item`},vw={class:`info-name`},yw={class:`info-desc`},bw={class:`info-section`},xw={class:`kv-grid`},Sw={class:`kv`},Cw={class:`v`},ww={class:`kv`},Tw={class:`v`},Ew={class:`kv`},Dw={class:`v`},Ow={class:`kv`},kw={class:`v`,style:{"font-size":`11px`}},Aw={key:2,class:`info-section`},jw={class:`info-title`},Mw={class:`info-name`},Nw={class:`src-tag mcp`},Pw={class:`info-desc`},Fw={key:3,class:`info-section`},Iw={class:`kv-grid`},Lw={class:`kv`},Rw={class:`v`},zw={class:`kv`},Bw={class:`v`},Vw={class:`kv`},Hw={class:`v`},Uw={key:0,class:`kv`},Ww={class:`v`,style:{"font-size":`11px`}},Gw={key:4,class:`info-section`},Kw={class:`info-title`},qw={key:5,class:`info-section`},Jw={class:`info-pre`},Yw={key:6,class:`info-section`},Xw={class:`info-kv`},Zw={class:`kv`},Qw={class:`v`},$w={class:`kv`},eT={class:`v`},tT={class:`kv`},nT={class:`v`},rT={class:`kv`},iT={class:`v`},aT={class:`kv`},oT={class:`v`,style:{"font-size":`11px`}},sT={key:0,class:`kv`},cT={class:`v`,style:{"font-size":`11px`}},lT=cg(Di({__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=hn(`all`),a=hn(new Set),o=hn(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=Ws(()=>Array.isArray(n.logs)?n.logs:[]),l=Ws(()=>i.value===`all`?c.value:c.value.filter(e=>e.type===i.value)),u=Ws(()=>{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=hn(`logs`),b=hn(null),x=hn({});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===`info`||e===`context`)&&C()}Jr(()=>n.infoTick?.value,()=>{n.visible&&(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=Ws(()=>{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=Ws(()=>b.value?.trace?.spans??[]),j=Ws(()=>b.value?.trace?.metrics),M=Ws(()=>b.value?.context),N=Ws(()=>{let e=M.value;return e?e.occupancy>=1?`red`:e.thresholdRatio>0&&e.occupancy>=e.thresholdRatio?`yellow`:`green`:``});function P(e){return e===`round`?`🔄`:e===`model`?`🧠`:e===`tool`?`🔧`:e===`compression`?`📦`:`•`}function ee(e){return`${e.windowRatio==null?`keepRounds=${e.keepRounds??`?`}`:`windowRatio=${e.windowRatio}`} · ${e.summarize.mode}摘要 · 召回${e.recallTopK??`?`}${e.reason?` · `+e.reason:``}`}function te(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(),Zo(li,{to:`body`},[is(cc,{name:`drawer`},{default:Br(()=>[e.visible?(Y(),X(`div`,Wx,[Z(`div`,Gx,[Z(`div`,Kx,[Z(`div`,qx,[Z(`button`,{class:V([`tab-btn`,{active:y.value===`logs`}]),onClick:n[0]||=e=>w(`logs`)},`🐛 日志`,2),Z(`button`,{class:V([`tab-btn`,{active:y.value===`flow`}]),onClick:n[1]||=e=>w(`flow`)},`🔀 流程`,2),e.getInfo?(Y(),X(`button`,{key:0,class:V([`tab-btn`,{active:y.value===`trace`}]),onClick:n[2]||=e=>w(`trace`)},`🌳 Trace`,2)):Q(``,!0),e.getInfo?(Y(),X(`button`,{key:1,class:V([`tab-btn`,{active:y.value===`context`}]),onClick:n[3]||=e=>w(`context`)},`📊 上下文`,2)):Q(``,!0),e.getInfo?(Y(),X(`button`,{key:2,class:V([`tab-btn`,{active:y.value===`info`}]),onClick:n[4]||=e=>w(`info`)},`🧬 Agent 信息`,2)):Q(``,!0)]),Z(`div`,Jx,[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`,Yx,[(Y(),X(J,null,$i(s,(e,t)=>Z(`button`,{key:t,class:V([`filter-chip`,{active:i.value===t}]),style:Se({"--chip-color":e.color}),onClick:e=>i.value=t},[ls(H(e.icon)+` `+H(e.label)+` `,1),Z(`span`,Zx,H(u.value[t]||0),1)],14,Xx)),64)),Z(`button`,{class:V([`filter-chip all`,{active:i.value===`all`}]),onClick:n[5]||=e=>i.value=`all`},[n[6]||=ls(` 全部 `,-1),Z(`span`,Qx,H(u.value.all||0),1)],2)])):Q(``,!0),Z(`div`,$x,[y.value===`trace`?(Y(),X(`div`,eS,[j.value?(Y(),X(J,{key:1},[Z(`div`,nS,[Z(`div`,rS,[n[8]||=Z(`span`,null,`轮次`,-1),Z(`b`,null,H(j.value.rounds),1)]),Z(`div`,iS,[n[9]||=Z(`span`,null,`总耗时`,-1),Z(`b`,null,H(j.value.totalDurationMs)+`ms`,1)]),Z(`div`,aS,[n[10]||=Z(`span`,null,`平均/轮`,-1),Z(`b`,null,H(j.value.avgRoundMs)+`ms`,1)]),Z(`div`,oS,[n[11]||=Z(`span`,null,`工具`,-1),Z(`b`,null,H(j.value.toolCalls)+`(✅`+H(Math.round(j.value.toolSuccessRate*100))+`%)`,1)]),j.value.compressions?(Y(),X(`div`,sS,[n[12]||=Z(`span`,null,`压缩`,-1),Z(`b`,null,H(j.value.compressions),1)])):Q(``,!0),j.value.totalTokens?(Y(),X(`div`,cS,[n[13]||=Z(`span`,null,`Token`,-1),Z(`b`,null,H(j.value.totalTokens.total),1)])):Q(``,!0)]),Z(`div`,lS,[(Y(!0),X(J,null,$i(A.value,e=>(Y(),X(`div`,{key:e.id,class:V([`trace-span`,[e.type,e.status]])},[Z(`span`,uS,H(P(e.type)),1),Z(`span`,dS,H(e.name),1),e.durationMs?(Y(),X(`span`,fS,H(e.durationMs)+`ms`,1)):Q(``,!0),e.status===`error`?(Y(),X(`span`,pS,`❌`)):Q(``,!0)],2))),128))])],64)):(Y(),X(`div`,tS,[...n[7]||=[ls(`未开启 tracing(`,-1),Z(`code`,null,`capabilities.tracing:true`,-1),ls(`)或暂无 trace。跑一轮 agent 后刷新。`,-1)]]))])):Q(``,!0),y.value===`context`?(Y(),X(`div`,mS,[M.value?(Y(),X(J,{key:1},[Z(`div`,gS,[Z(`div`,_S,[Z(`div`,{class:`ctx-bar-track`,title:`占用 ${Math.round(M.value.occupancy*100)}%`},[Z(`div`,{class:V([`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,vS),Z(`span`,yS,H(Math.round(M.value.occupancy*100))+`%`,1)]),Z(`div`,bS,[Z(`span`,xS,`估算 `+H(M.value.totalTokens)+` token`,1),M.value.contextWindow?(Y(),X(`span`,SS,`窗口 `+H(M.value.contextWindow),1)):Q(``,!0),M.value.thresholdRatio>0?(Y(),X(`span`,CS,`阈值 `+H(Math.round(M.value.thresholdRatio*100))+`%`,1)):Q(``,!0)])]),n[15]||=Z(`div`,{class:`ctx-section-title`},`分类构成(近似)`,-1),(Y(!0),X(J,null,$i(M.value.categories,e=>(Y(),X(`div`,{key:e.key,class:`ctx-cat`},[Z(`span`,{class:`ctx-cat-label`,title:e.label},H(e.label),9,wS),Z(`div`,TS,[Z(`div`,{class:`ctx-cat-fill`,style:Se({width:Math.max(Math.round(e.pct*100),2)+`%`})},null,4)]),Z(`span`,ES,[ls(H(e.tokens)+` `,1),Z(`i`,null,`(`+H(Math.round(e.pct*100))+`%)`,1)])]))),128)),M.value.compression?(Y(),X(`div`,DS,[n[14]||=Z(`div`,{class:`ctx-section-title`},`最近压缩`,-1),Z(`div`,OS,[Z(`span`,kS,`摘要 `+H(M.value.compression.roundsSummarized)+`/`+H(M.value.compression.roundsTotal)+` 轮`,1),Z(`span`,AS,`召回 `+H(M.value.compression.roundsRecalled),1),Z(`span`,jS,H(M.value.compression.strategy),1),M.value.compression.decision?(Y(),X(`span`,MS,`🤖 agent 决策:`+H(ee(M.value.compression.decision)),1)):Q(``,!0)])])):Q(``,!0)],64)):(Y(),X(`div`,hS,`未开启 contextInspector(默认开)或暂无快照。跑一轮 agent 后切回刷新。`))])):Q(``,!0),y.value===`logs`?(Y(),X(J,{key:2},[l.value.length===0?(Y(),X(`div`,NS,` 暂无日志,发送消息后这里会显示 Agent 的完整上下文、工具调用等信息 `)):Q(``,!0),(Y(!0),X(J,null,$i(l.value,(e,t)=>(Y(),X(`div`,{key:t,class:`log-item`},[Z(`div`,PS,[Z(`span`,{class:`log-type`,style:Se({background:s[e.type].color})},H(s[e.type].icon)+` `+H(s[e.type].label),5),e.source?(Y(),X(`span`,FS,`↳ `+H(e.source),1)):Q(``,!0),Z(`span`,IS,H(d(e.timestamp)),1)]),Z(`div`,LS,[e.type===`context`?(Y(),X(J,{key:0},[Z(`div`,RS,[Z(`div`,zS,[n[16]||=Z(`span`,{class:`k`},`模型`,-1),Z(`span`,BS,H(e.data.model),1)]),Z(`div`,VS,[n[17]||=Z(`span`,{class:`k`},`温度`,-1),Z(`span`,HS,H(e.data.temperature),1)]),Z(`div`,US,[n[18]||=Z(`span`,{class:`k`},`MaxTokens`,-1),Z(`span`,WS,H(e.data.maxTokens),1)]),Z(`div`,GS,[n[19]||=Z(`span`,{class:`k`},`消息数`,-1),Z(`span`,KS,H(e.data.totalMessages),1)])]),Z(`div`,qS,`工具 (`+H(e.data.tools?.length||0)+`)`,1),Z(`div`,JS,[(Y(!0),X(J,null,$i(e.data.tools,e=>(Y(),X(`span`,{key:e,class:`tool-chip`},H(e),1))),128))]),n[20]||=Z(`div`,{class:`section-label`},`上下文消息`,-1),Z(`div`,YS,[(Y(!0),X(J,null,$i(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})},H(g(e.type).label),5),Z(`span`,XS,H(e.content),1)]))),128))])],64)):e.type===`llm_request`?(Y(),X(J,{key:1},[Z(`div`,ZS,[Z(`span`,QS,`第 `+H(e.data.round)+` 轮`,1),e.data.model?(Y(),X(`span`,$S,H(e.data.model),1)):Q(``,!0),Z(`span`,eC,H((e.data.messages||[]).length)+` 条消息`,1),e.data.tools?.length?(Y(),X(`span`,tC,H(e.data.tools.length)+` 工具`,1)):Q(``,!0),Z(`button`,{class:`view-toggle`,onClick:e=>p(t)},H(o.value.has(t)?`🗂 卡片视图`:`📋 请求体`),9,nC)]),o.value.has(t)?(Y(),X(`pre`,lC,[Z(`code`,null,H(m(e.data.messages)),1)])):(Y(),X(`div`,rC,[(Y(!0),X(J,null,$i(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})},H(g(e.role).label),5),Z(`div`,iC,[e.content?(Y(),X(`span`,aC,H(e.content),1)):Q(``,!0),(Y(!0),X(J,null,$i(e.tool_calls||[],(e,t)=>(Y(),X(`div`,{key:t,class:`tc-inline`},[Z(`span`,oC,`🔧 `+H(e.function?.name||e.name),1),Z(`code`,sC,H(e.function?.arguments??e.args),1)]))),128)),e.tool_call_id?(Y(),X(`span`,cC,`↳ tool_call_id: `+H(e.tool_call_id),1)):Q(``,!0)])]))),128))]))],64)):e.type===`llm_response`?(Y(),X(J,{key:2},[Z(`div`,uC,[Z(`span`,dC,`第 `+H(e.data.round)+` 轮`,1),e.data.toolCalls?.length?(Y(),X(`span`,fC,`🔧 `+H(e.data.toolCalls.length)+` 个工具调用`,1)):Q(``,!0)]),e.data.content?(Y(),X(`div`,pC,H(e.data.content),1)):Q(``,!0),e.data.toolCalls?.length?(Y(),X(`div`,mC,[(Y(!0),X(J,null,$i(e.data.toolCalls,(e,t)=>(Y(),X(`div`,{key:t,class:`tc-card`},[Z(`div`,hC,`🔧 `+H(e.name),1),Z(`pre`,gC,H(m(e.args)),1)]))),128))])):Q(``,!0),e.data.usage?(Y(),X(`div`,_C,[Z(`span`,vC,`prompt: `+H(e.data.usage.prompt_tokens??`-`),1),Z(`span`,yC,`completion: `+H(e.data.usage.completion_tokens??`-`),1),Z(`span`,bC,`total: `+H(e.data.usage.total_tokens??`-`),1)])):Q(``,!0)],64)):e.type===`tool_call`?(Y(),X(`div`,xC,[Z(`div`,SC,`🔧 `+H(e.data.name),1),Z(`pre`,CC,H(m(e.data.args)),1)])):e.type===`tool_result`?(Y(),X(`div`,wC,[Z(`div`,TC,`✅ `+H(e.data.name)+` 结果`,1),Z(`pre`,EC,H(e.data.result),1)])):e.type===`error`?(Y(),X(`div`,DC,H(e.data.tool?`[${e.data.tool}] `:``)+H(e.data.error),1)):Q(``,!0)]),Z(`div`,OC,[Z(`button`,{class:`raw-toggle`,onClick:e=>f(t)},H(a.value.has(t)?`收起原始 JSON`:`查看原始 JSON`),9,kC),Z(`button`,{class:`raw-toggle`,onClick:t=>K(Kh)(m(e.data))},`复制`,8,AC)]),a.value.has(t)?(Y(),X(`pre`,jC,[Z(`code`,null,H(m(e.data)),1)])):Q(``,!0)]))),128))],64)):y.value===`flow`?(Y(),X(J,{key:3},[c.value.length?Q(``,!0):(Y(),X(`div`,MC,`暂无日志,发送消息后这里按轮次展示执行流程`)),O.value.pre.length?(Y(),X(`div`,NC,[n[21]||=Z(`div`,{class:`flow-section-title`},`⚙️ 准备 / 其他`,-1),(Y(!0),X(J,null,$i(O.value.pre,(e,t)=>(Y(),X(`div`,{key:`p`+t,class:V([`flow-node`,e.type])},[Z(`span`,PC,H(s[e.type]?.icon),1),Z(`span`,FC,H(s[e.type]?.label),1),Z(`span`,IC,H(te(e)),1),Z(`span`,LC,H(d(e.timestamp)),1)],2))),128))])):Q(``,!0),(Y(!0),X(J,null,$i(O.value.rounds,e=>(Y(),X(`div`,{key:e.round,class:`flow-round`},[Z(`div`,RC,`🔁 第 `+H(e.round)+` 轮`,1),Z(`div`,zC,[(Y(!0),X(J,null,$i(e.items,(e,t)=>(Y(),X(`div`,{key:t,class:V([`flow-node`,e.type])},[Z(`span`,BC,H(s[e.type]?.icon),1),Z(`span`,VC,H(s[e.type]?.label),1),Z(`span`,HC,H(te(e)),1),Z(`span`,UC,H(d(e.timestamp)),1)],2))),128))])]))),128))],64)):(Y(),X(`div`,WC,[b.value?(Y(),X(J,{key:1},[Z(`div`,KC,[n[27]||=Z(`div`,{class:`info-title`},`基本信息`,-1),Z(`div`,qC,[Z(`div`,JC,[n[22]||=Z(`span`,{class:`k`},`ID`,-1),Z(`span`,YC,H(b.value.id),1)]),Z(`div`,XC,[n[23]||=Z(`span`,{class:`k`},`模型`,-1),Z(`span`,ZC,H(b.value.model||`-`),1)]),Z(`div`,QC,[n[24]||=Z(`span`,{class:`k`},`工具数`,-1),Z(`span`,$C,H(b.value.tools.length),1)]),Z(`div`,ew,[n[25]||=Z(`span`,{class:`k`},`中间件`,-1),Z(`span`,tw,H(b.value.middleware.length),1)])]),Z(`div`,nw,[n[26]||=Z(`span`,{class:`k`},`中间件栈`,-1),Z(`span`,rw,H(b.value.middleware.join(` → `)||`-`),1)])]),Z(`div`,iw,[Z(`div`,aw,`🔧 工具 (`+H(b.value.tools.length)+`)`,1),(Y(!0),X(J,null,$i(b.value.tools,e=>(Y(),X(`div`,{key:e.name,class:`info-item`},[Z(`div`,ow,[ls(H(e.name),1),e.source?(Y(),X(`span`,{key:0,class:V([`src-tag`,D(e.source)])},H(e.source),3)):Q(``,!0)]),Z(`div`,sw,H(e.description),1)]))),128))]),b.value.skills.length?(Y(),X(`div`,cw,[Z(`div`,lw,[ls(`📘 技能 (`+H(b.value.skills.length)+`)`,1),n[28]||=Z(`span`,{class:`info-hint`},`点击展开查看全文`,-1)]),(Y(!0),X(J,null,$i(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:V([`skill-arrow`,{open:!!x.value[e.name]}])},`▶`,2),ls(` `+H(e.name),1)],8,uw),Z(`div`,dw,H(e.description),1),x.value[e.name]?(Y(),X(`div`,fw,[x.value[e.name].loading?(Y(),X(`div`,pw,`加载中…`)):x.value[e.name].error?(Y(),X(`div`,mw,H(x.value[e.name].error),1)):x.value[e.name].content?(Y(),X(`pre`,hw,H(x.value[e.name].content),1)):Q(``,!0)])):Q(``,!0)]))),128))])):Q(``,!0),b.value.data?(Y(),X(`div`,gw,[n[29]||=Z(`div`,{class:`info-title`},`📊 可操作数据`,-1),Z(`div`,_w,[Z(`div`,vw,H(b.value.data.description||`主数据对象`),1),Z(`div`,yw,`schema: `+H(b.value.data.schema?`已声明`:`未声明`),1)])])):Q(``,!0),Z(`div`,bw,[n[34]||=Z(`div`,{class:`info-title`},`🧬 子 Agent`,-1),Z(`div`,xw,[Z(`div`,Sw,[n[30]||=Z(`span`,{class:`k`},`启用`,-1),Z(`span`,Cw,H(b.value.subagent.enabled?`是`:`否`),1)]),Z(`div`,ww,[n[31]||=Z(`span`,{class:`k`},`最大递归`,-1),Z(`span`,Tw,H(b.value.subagent.maxDepth),1)]),Z(`div`,Ew,[n[32]||=Z(`span`,{class:`k`},`并行上限`,-1),Z(`span`,Dw,H(b.value.subagent.maxParallel),1)]),Z(`div`,Ow,[n[33]||=Z(`span`,{class:`k`},`额外工具`,-1),Z(`span`,kw,H(b.value.subagent.allowedTools.length?b.value.subagent.allowedTools.join(`, `):`默认只读`),1)])])]),b.value.mcp?.servers?.length?(Y(),X(`div`,Aw,[Z(`div`,jw,`🔌 MCP (`+H(b.value.mcp.servers.length)+`)`,1),(Y(!0),X(J,null,$i(b.value.mcp.servers,e=>(Y(),X(`div`,{key:e.name,class:`info-item`},[Z(`div`,Mw,[ls(H(e.name)+` `,1),Z(`span`,Nw,H(e.toolCount)+` 工具`,1)]),Z(`div`,Pw,H(e.url),1)]))),128))])):Q(``,!0),b.value.verify?(Y(),X(`div`,Fw,[n[39]||=Z(`div`,{class:`info-title`},`✅ Verify 自检`,-1),Z(`div`,Iw,[Z(`div`,Lw,[n[35]||=Z(`span`,{class:`k`},`启用`,-1),Z(`span`,Rw,H(b.value.verify.enabled?`是`:`否`),1)]),Z(`div`,zw,[n[36]||=Z(`span`,{class:`k`},`自纠上限`,-1),Z(`span`,Bw,H(b.value.verify.maxAttempts),1)]),Z(`div`,Vw,[n[37]||=Z(`span`,{class:`k`},`对抗验证`,-1),Z(`span`,Hw,H(b.value.verify.adversarial?`开启`:`关闭`),1)]),b.value.verify.adversarial?(Y(),X(`div`,Uw,[n[38]||=Z(`span`,{class:`k`},`对抗模型`,-1),Z(`span`,Ww,H(b.value.model||`-`)+`(同主)`,1)])):Q(``,!0)])])):Q(``,!0),b.value.todos.length?(Y(),X(`div`,Gw,[Z(`div`,Kw,`📋 任务清单 (`+H(b.value.todos.length)+`)`,1),(Y(!0),X(J,null,$i(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`})},H(E(e.status)),5),Z(`span`,null,H(e.content),1)]))),128))])):Q(``,!0),b.value.memory?(Y(),X(`div`,qw,[n[40]||=Z(`div`,{class:`info-title`},`📝 持久指令 (memory)`,-1),Z(`pre`,Jw,H(b.value.memory),1)])):Q(``,!0),b.value.lastCompression?(Y(),X(`div`,Yw,[n[47]||=Z(`div`,{class:`info-title`},`🗜️ 上轮压缩`,-1),Z(`div`,Xw,[Z(`div`,Zw,[n[41]||=Z(`span`,{class:`k`},`触发`,-1),Z(`span`,Qw,H(b.value.lastCompression.triggered?`✓`:`✗(未达阈值)`),1)]),Z(`div`,$w,[n[42]||=Z(`span`,{class:`k`},`摘要轮次`,-1),Z(`span`,eT,H(b.value.lastCompression.roundsSummarized)+` / `+H(b.value.lastCompression.roundsTotal),1)]),Z(`div`,tT,[n[43]||=Z(`span`,{class:`k`},`召回`,-1),Z(`span`,nT,H(b.value.lastCompression.roundsRecalled)+` 条`,1)]),Z(`div`,rT,[n[44]||=Z(`span`,{class:`k`},`消息数`,-1),Z(`span`,iT,H(b.value.lastCompression.originalMessages)+` → `+H(b.value.lastCompression.compressedMessages),1)]),Z(`div`,aT,[n[45]||=Z(`span`,{class:`k`},`策略`,-1),Z(`span`,oT,H(b.value.lastCompression.strategy),1)]),b.value.lastCompression.decision?(Y(),X(`div`,sT,[n[46]||=Z(`span`,{class:`k`},`压缩决策`,-1),Z(`span`,cT,`🤖 `+H(ee(b.value.lastCompression.decision)),1)])):Q(``,!0)])])):Q(``,!0)],64)):(Y(),X(`div`,GC,`暂无信息`))]))])]),Z(`div`,{class:`drawer-mask`,onClick:_})])):Q(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-1d1935da`]]),uT={class:`skill-panel`},dT={class:`skill-header`},fT={class:`skill-section`},pT={class:`section-title`},mT={class:`field`},hT=[`disabled`],gT={class:`field`},_T={class:`field field-textarea`},vT={key:0,class:`skill-error`},yT={class:`skill-section`},bT={class:`section-title`},xT={key:0,class:`empty-hint`},ST={key:1,class:`skill-list`},CT={class:`skill-actions`},wT=[`onClick`],TT=[`onClick`],ET=cg(Di({__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=hn(``),a=hn(``),o=hn(``),s=hn(``),c=hn([]),l=hn(0),u=hn(null);Jr(()=>n.visible,e=>{e&&d()},{immediate:!0}),Jr(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(),Zo(li,{to:`body`},[is(cc,{name:`cs-skill-fade`},{default:Br(()=>[e.visible?(Y(),X(`div`,{key:0,class:`skill-mask`,onClick:n[4]||=dl(e=>r(`close`),[`self`])},[Z(`div`,uT,[Z(`div`,dT,[n[5]||=Z(`span`,{class:`skill-title`},`🧩 Skill 管理`,-1),Z(`button`,{class:`skill-close`,title:`关闭`,onClick:n[0]||=e=>r(`close`)},`✕`)]),Z(`div`,fT,[Z(`div`,pT,[ls(H(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`,mT,[n[6]||=Z(`span`,{class:`field-label`},`名称`,-1),Hr(Z(`input`,{"onUpdate:modelValue":n[1]||=e=>i.value=e,disabled:!!u.value,placeholder:`如:my-writer`,class:`field-input`},null,8,hT),[[cl,i.value]])]),Z(`label`,gT,[n[7]||=Z(`span`,{class:`field-label`},`描述`,-1),Hr(Z(`input`,{"onUpdate:modelValue":n[2]||=e=>a.value=e,placeholder:`一句话说明用途与触发时机`,class:`field-input`},null,512),[[cl,a.value]])]),Z(`label`,_T,[n[8]||=Z(`span`,{class:`field-label`},`内容`,-1),Hr(Z(`textarea`,{"onUpdate:modelValue":n[3]||=e=>o.value=e,placeholder:`skill 全文指令(支持 Markdown)`,rows:`6`,class:`field-input`},null,512),[[cl,o.value]])]),s.value?(Y(),X(`div`,vT,H(s.value),1)):Q(``,!0),Z(`button`,{class:`btn btn-primary`,onClick:f},H(u.value?`保存修改`:`添加 Skill`),1)]),Z(`div`,yT,[Z(`div`,bT,`已创建 Skill(`+H(c.value.length)+`)`,1),c.value.length?(Y(),X(`ul`,ST,[(Y(!0),X(J,null,$i(c.value,e=>(Y(),X(`li`,{key:e,class:`skill-item`},[Z(`span`,{class:V([`skill-name`,{active:u.value===e}])},H(e),3),Z(`span`,CT,[Z(`button`,{class:`btn btn-ghost btn-edit`,title:`加载到表单编辑`,onClick:t=>m(e)},`编辑`,8,wT),Z(`button`,{class:`btn btn-ghost btn-del`,title:`删除该用户 skill`,onClick:t=>p(e)},`删除`,8,TT)])]))),128))])):(Y(),X(`div`,xT,`暂无用户创建的 skill`))]),n[9]||=Z(`div`,{class:`skill-hint`},[ls(` 💡 创建/编辑的 skill 会自动加入 agent(下轮 system prompt 索引可见),agent 经 `),Z(`code`,null,`load_skill(name)`),ls(` 按需加载全文; 持久化由独立 SkillStore 管理(默认 indexedDB,与 storage 选项分离),跨刷新自动恢复;可经 `),Z(`code`,null,`skillStorage.id`),ls(` 跨页面复用。 `)],-1)])])):Q(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-c6a22ea5`]]),DT=cg(Di({__name:`ChatDialog`,props:{fetchResponse:{},fetchStream:{},title:{default:`AI 助手`},placeholder:{default:`输入消息,Enter 发送...`},debugLogs:{},initialMessages:{},onPersist:{},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=Jh({fetchResponse:n.fetchResponse,fetchStream:n.fetchStream,messages:n.initialMessages,onPersist:n.onPersist,onClear:n.onClear,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});Wr(qh,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=Ws(()=>!!n.onAddSkill),d=Ws(()=>{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:V([`chat-dialog`,{collapsed:!K(a)&&!e.drawer,drawer:e.drawer}]),style:Se(d.value?{width:d.value,maxWidth:d.value}:null)},[l(`header`)?ea(t.$slots,`header`,{key:0,chat:K(i)},()=>[is(lg,{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`)?ea(t.$slots,`focus`,{key:1,chat:K(i)},()=>[is(hg,{"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(),Zo(cc,{key:2,name:`cs-slide`},{default:Br(()=>[ea(t.$slots,`body`,{chat:K(i)},()=>[Hr(is(tx,{"show-avatar":e.showAvatar,"show-typing":e.showTyping},null,8,[`show-avatar`,`show-typing`]),[[Ec,K(a)]])],!0)]),_:3})):Q(``,!0),l(`queued`)?ea(t.$slots,`queued`,{key:3,chat:K(i)},()=>[is(lx)],!0):Q(``,!0),l(`approval`)?ea(t.$slots,`approval`,{key:4,chat:K(i)},()=>[is(bx)],!0):Q(``,!0),l(`conflict`)?ea(t.$slots,`conflict`,{key:5,chat:K(i)},()=>[is(jx,{"pending-conflict":e.pendingConflict,"on-resolve":e.onResolveConflict},null,8,[`pending-conflict`,`on-resolve`])],!0):Q(``,!0),l(`footer`)?(Y(),Zo(cc,{key:6,name:`cs-slide`},{default:Br(()=>[ea(t.$slots,`footer`,{chat:K(i)},()=>[is(Ux,{placeholder:e.placeholder,"input-rows":e.inputRows},null,8,[`placeholder`,`input-rows`])],!0)]),_:3})):Q(``,!0),l(`debug`)?ea(t.$slots,`debug`,{key:7,chat:K(i)},()=>[is(lT,{visible:K(o),"onUpdate:visible":n[2]||=e=>mn(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`)?ea(t.$slots,`skill`,{key:8,chat:K(i)},()=>[is(ET,{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-1b784c76`]]);function OT(e){let{core:t,dialogCfg:n}=e,r=null,i=e.el,a=t.agent.debugLogs;return r=_l(Di({setup(){return()=>Gs(DT,{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(),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`)}}}function kT(e){return Wh(e,OT)}e.ApprovalBar=bx,e.CAPABILITIES=Np,e.CONTEXT_PRESETS=Ip,e.ChatDialog=DT,e.ChatHeader=lg,e.ChatInput=Ux,e.CodePreview=jb,e.CompressDecisionSchema=qf,e.ConflictBar=jx,e.DEFAULT_SYSTEM_PROMPT=Vf,e.DebugDrawer=lT,e.FocusBar=hg,e.HUMAN_CONFIRM_TOOL_NAME=Cd,e.MIN_CONTEXT_WINDOW=Fl,e.MessageContent=Nb,e.MessageList=tx,e.MessageRow=Jb,e.QueuedBar=lx,e.STOP_WORDS=jf,e.SkillPanel=ET,e.UNSAFE_KEYS=Vp,e.actionsToInspectInfo=bh,e.actionsToTools=yh,e.agentError=Ol,e.analyzeContext=gf,e.applyPatchToClone=em,e.applyPatchToLive=tm,e.asAgentError=Dl,e.buildDataPrompt=Hf,e.buildSystemPrompt=Uf,e.chatContextKey=qh,e.commitSetToBind=$m,e.connectMcp=xf,e.constructLlmFromConfig=v,e.constructOpenLlmSync=_,e.copyText=Kh,e.createAgent=fu,e.createApprovalMiddleware=Sd,e.createChatContext=Jh,e.createChatSdk=kT,e.createCheckpointManager=Nd,e.createCheckpointMiddleware=Pd,e.createConflictManager=ap,e.createContextInspectorMiddleware=_f,e.createDataOps=th,e.createHumanConfirmMiddleware=Ed,e.createHumanConfirmTool=Td,e.createMemoryBackend=Ep,e.createMemoryMiddleware=hd,e.createProxyLlm=g,e.createSandboxRunner=td,e.createSdkEvents=Fp,e.createSerialRunner=Lh,e.createSessionStore=Ap,e.createSkillStore=Nh,e.createSubagentMiddleware=Kd,e.createSubagentsMiddleware=Yd,e.createUsageHintsMiddleware=Dh,e.createVerifyMiddleware=Xd,e.createVfs=cm,e.createWebStorageBackend=Op,e.createWriteBackCheck=nf,e.deepClone=qp,e.defineDataToolset=Ch,e.defineSkill=rd,e.defineTool=Wf,e.deleteByPath=Kp,e.deriveTitle=Jf,e.describeSchemaNode=wu,e.detectGarbledToolCall=nu,e.diffObjects=im,e.domToStructure=sh,e.domTools=lh,e.domToolsStatic=Sh,e.estimateMessageTokens=Nf,e.estimateRoundTokens=Pf,e.estimateTokens=Ll,e.extractReasoningDelta=b,e.extractSchemaHint=Uu,e.extractText=vf,e.extractTextDelta=y,e.extractUsage=x,e.fetchDocTools=rh,e.fetchTools=xh,e.filterByToolMode=Qm,e.formatConstraints=Tu,e.formatZodIssues=Cl,e.getByPath=Wp,e.getDomTool=ch,e.getEnvSummary=fh,e.getSchemaAtPath=gu,e.getSchemaTopKeys=pu,e.getTraceMetrics=Bl,e.hashValue=$p,e.indexSummarize=Ff,e.inspectEnvTool=hh,e.inspectTools=gh,e.isChatModel=Yf,e.isContextLengthError=ql,e.isPathAllowed=mu,e.isQuotaError=vp,e.isUnsafePath=Hp,e.jpEval=Dm,e.jsonParseError=Tl,e.limitDepth=Xp,e.maybeParseValue=Jp,e.offloadPassThroughChars=zl,e.offloadThresholdChars=Rl,e.presets=Ru,e.projectBySchema=vu,e.projectBySchemaDeep=_u,e.projectFields=Yp,e.recallRounds=If,e.renderSchemaHint=Eu,e.renderSchemaOverview=Du,e.renderSchemaShallow=ku,e.resolveCapabilities=Pp,e.resolveContextOptions=Rp,e.resolveDialogConfig=Mp,e.resolveLlm=ip,e.resolveModelCaps=Il,e.resolveStorage=jp,e.restoreInPlace=rm,e.restoreLive=nm,e.routeError=El,e.runHostScript=nd,e.runSandboxedScript=jm,e.safeMerge=Up,e.safeSerialize=dh,e.safeStringify=Zp,e.searchJson=km,e.selectBuiltinTools=wh,e.setByPath=Gp,e.shouldTriggerCompression=Lf,e.systemPromptHelpers=zu,e.tokenize=Mf,e.toolError=$,e.unwrapSchema=hu,e.useChat=Gh,e.useChatContext=Yh,Object.defineProperty(e,"z",{enumerable:!0,get:function(){return t.z}}),e.zodError=wl});
|
|
180
|
+
…(已截断)`:t}catch{return String(e)}});return(t,a)=>e.pendingConflict?(Y(),X(`div`,xx,[Z(`div`,Sx,[a[6]||=Z(`span`,{class:`conflict-icon`},`⚠️`,-1),Z(`span`,Cx,[a[4]||=ls(`写入冲突:`,-1),Z(`code`,null,H(e.pendingConflict.path),1),a[5]||=ls(` 已被外部修改`,-1)])]),Z(`div`,wx,` AI 基于「读取时的旧值」准备`+H(e.pendingConflict.op===`delete`?`删除`:`写入`)+`,但该属性在你读取之后被外部代码/其他 agent/手动改过。 `,1),Z(`button`,{class:`conflict-toggle`,onClick:a[0]||=e=>n.value=!n.value},H(n.value?`收起对比`:`查看值对比`)+H(n.value?` ▴`:` ▾`),1),n.value?(Y(),X(`div`,Tx,[Z(`div`,Ex,[a[7]||=Z(`div`,{class:`conflict-diff-label`},`AI 想写的值`,-1),Z(`pre`,Dx,H(r.value||`(delete 操作无值)`),1)]),Z(`div`,Ox,[a[8]||=Z(`div`,{class:`conflict-diff-label`},`外部改后的当前值`,-1),Z(`pre`,kx,H(i.value),1)])])):Q(``,!0),Z(`div`,Ax,[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`]]),Mx={class:`chat-footer`},Nx={class:`chat-input-wrap`},Px={key:0,class:`focus-chips`},Fx=[`title`,`onClick`],Ix={class:`focus-chip-path`},Lx=[`onClick`],Rx=[`placeholder`,`rows`],zx={class:`input-actions`},Bx=[`disabled`,`title`],Vx={key:0,width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`currentColor`},Hx={key:1,width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`},Ux=cg(Di({__name:`ChatInput`,props:{placeholder:{},inputRows:{}},setup(e){let t=Yh(),{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`,Mx,[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`,Nx,[K(s).length?(Y(),X(`div`,Px,[(Y(!0),X(J,null,$i(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`,Ix,H(e.path),1),Z(`button`,{type:`button`,class:`focus-chip-x`,"data-test":`focus-clear`,title:`移除此焦点`,onClick:dl(t=>K(c)(e.path),[`stop`])},`✕`,8,Lx)],8,Fx))),128))])):Q(``,!0),Hr(Z(`textarea`,{"onUpdate:modelValue":f[1]||=e=>mn(n)?n.value=e:null,class:V([`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,Rx),[[cl,K(n)]]),Z(`div`,zx,[f[7]||=Z(`span`,{class:`send-hint`},`Enter 发送 · Shift+Enter 换行`,-1),Z(`button`,{class:V([`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`,Vx,[...f[5]||=[Z(`rect`,{x:`6`,y:`6`,width:`12`,height:`12`,rx:`2`},null,-1)]])):(Y(),X(`svg`,Hx,[...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,Bx)])])]))}}),[[`__scopeId`,`data-v-3a3e4dfa`]]),Wx={key:0,class:`debug-drawer`},Gx={class:`drawer-panel`},Kx={class:`drawer-header`},qx={class:`tab-group`},Jx={class:`header-actions`},Yx={key:0,class:`drawer-filters`},Xx=[`onClick`],Zx={class:`chip-count`},Qx={class:`chip-count`},$x={class:`drawer-body`},eS={key:0,class:`trace-panel`},tS={key:0,class:`trace-empty`},nS={class:`trace-metrics`},rS={class:`metric-card`},iS={class:`metric-card`},aS={class:`metric-card`},oS={class:`metric-card`},sS={key:0,class:`metric-card`},cS={key:1,class:`metric-card`},lS={class:`trace-spans`},uS={class:`span-ico`},dS={class:`span-name`},fS={key:0,class:`span-dur`},pS={key:1,class:`span-status`},mS={key:1,class:`context-panel`},hS={key:0,class:`trace-empty`},gS={class:`ctx-overview`},_S={class:`ctx-occupancy`},vS=[`title`],yS={class:`ctx-pct`},bS={class:`ctx-kv-row`},xS={class:`ctx-kv`},SS={key:0,class:`ctx-kv`},CS={key:1,class:`ctx-kv`},wS=[`title`],TS={class:`ctx-cat-bar`},ES={class:`ctx-cat-tokens`},DS={key:0,class:`ctx-compression`},OS={class:`ctx-kv-row`},kS={class:`ctx-kv`},AS={class:`ctx-kv`},jS={class:`ctx-kv`},MS={key:0,class:`ctx-kv`},NS={key:0,class:`empty`},PS={class:`log-head`},FS={key:0,class:`log-source`},IS={class:`log-time`},LS={class:`log-body`},RS={class:`kv-grid`},zS={class:`kv`},BS={class:`v`},VS={class:`kv`},HS={class:`v`},US={class:`kv`},WS={class:`v`},GS={class:`kv`},KS={class:`v`},qS={class:`section-label`},JS={class:`chip-row`},YS={class:`msg-list`},XS={class:`msg-text`},ZS={class:`badge-row`},QS={class:`badge`},$S={key:0,class:`badge muted`},eC={class:`badge muted`},tC={key:1,class:`badge muted`},nC=[`onClick`],rC={key:0,class:`msg-list`},iC={class:`msg-detail`},aC={key:0,class:`msg-text`},oC={class:`tc-inline-name`},sC={class:`tc-inline-args`},cC={key:1,class:`tc-id`},lC={key:1,class:`log-raw`},uC={class:`badge-row`},dC={class:`badge`},fC={key:0,class:`badge warn`},pC={key:0,class:`resp-content`},mC={key:1,class:`tc-list`},hC={class:`tc-name`},gC={class:`tc-args`},_C={key:2,class:`usage-row`},vC={class:`usage`},yC={class:`usage`},bC={class:`usage`},xC={key:3,class:`tc-card inline`},SC={class:`tc-name`},CC={class:`tc-args`},wC={key:4,class:`tc-card inline`},TC={class:`tc-name`},EC={class:`tc-args`},DC={key:5,class:`err-box`},OC={class:`log-footer`},kC=[`onClick`],AC=[`onClick`],jC={key:0,class:`log-raw`},MC={key:0,class:`empty`},NC={key:1,class:`flow-section`},PC={class:`flow-ico`},FC={class:`flow-label`},IC={class:`flow-detail`},LC={class:`flow-time`},RC={class:`flow-round-head`},zC={class:`flow-round-body`},BC={class:`flow-ico`},VC={class:`flow-label`},HC={class:`flow-detail`},UC={class:`flow-time`},WC={key:4,class:`info-body`},GC={key:0,class:`empty`},KC={class:`info-section`},qC={class:`kv-grid`},JC={class:`kv`},YC={class:`v`},XC={class:`kv`},ZC={class:`v`},QC={class:`kv`},$C={class:`v`},ew={class:`kv`},tw={class:`v`},nw={class:`kv`,style:{"margin-top":`6px`}},rw={class:`v`,style:{"font-size":`11px`}},iw={class:`info-section`},aw={class:`info-title`},ow={class:`info-name`},sw={class:`info-desc`},cw={key:0,class:`info-section`},lw={class:`info-title`},uw=[`onClick`],dw={class:`info-desc`},fw={key:0,class:`skill-content`},pw={key:0,class:`skill-loading`},mw={key:1,class:`skill-error`},hw={key:2,class:`skill-pre`},gw={key:1,class:`info-section`},_w={class:`info-item`},vw={class:`info-name`},yw={class:`info-desc`},bw={class:`info-section`},xw={class:`kv-grid`},Sw={class:`kv`},Cw={class:`v`},ww={class:`kv`},Tw={class:`v`},Ew={class:`kv`},Dw={class:`v`},Ow={class:`kv`},kw={class:`v`,style:{"font-size":`11px`}},Aw={key:2,class:`info-section`},jw={class:`info-title`},Mw={class:`info-name`},Nw={class:`src-tag mcp`},Pw={class:`info-desc`},Fw={key:3,class:`info-section`},Iw={class:`kv-grid`},Lw={class:`kv`},Rw={class:`v`},zw={class:`kv`},Bw={class:`v`},Vw={class:`kv`},Hw={class:`v`},Uw={key:0,class:`kv`},Ww={class:`v`,style:{"font-size":`11px`}},Gw={key:4,class:`info-section`},Kw={class:`info-title`},qw={key:5,class:`info-section`},Jw={class:`info-pre`},Yw={key:6,class:`info-section`},Xw={class:`info-kv`},Zw={class:`kv`},Qw={class:`v`},$w={class:`kv`},eT={class:`v`},tT={class:`kv`},nT={class:`v`},rT={class:`kv`},iT={class:`v`},aT={class:`kv`},oT={class:`v`,style:{"font-size":`11px`}},sT={key:0,class:`kv`},cT={class:`v`,style:{"font-size":`11px`}},lT=cg(Di({__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=hn(`all`),a=hn(new Set),o=hn(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=Ws(()=>Array.isArray(n.logs)?n.logs:[]),l=Ws(()=>i.value===`all`?c.value:c.value.filter(e=>e.type===i.value)),u=Ws(()=>{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=hn(`logs`),b=hn(null),x=hn({});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===`info`||e===`context`)&&C()}Jr(()=>n.infoTick?.value,()=>{n.visible&&(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=Ws(()=>{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=Ws(()=>b.value?.trace?.spans??[]),j=Ws(()=>b.value?.trace?.metrics),M=Ws(()=>b.value?.context),N=Ws(()=>{let e=M.value;return e?e.occupancy>=1?`red`:e.thresholdRatio>0&&e.occupancy>=e.thresholdRatio?`yellow`:`green`:``});function P(e){return e===`round`?`🔄`:e===`model`?`🧠`:e===`tool`?`🔧`:e===`compression`?`📦`:`•`}function ee(e){return`${e.windowRatio==null?`keepRounds=${e.keepRounds??`?`}`:`windowRatio=${e.windowRatio}`} · ${e.summarize.mode}摘要 · 召回${e.recallTopK??`?`}${e.reason?` · `+e.reason:``}`}function te(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(),Zo(li,{to:`body`},[is(cc,{name:`drawer`},{default:Br(()=>[e.visible?(Y(),X(`div`,Wx,[Z(`div`,Gx,[Z(`div`,Kx,[Z(`div`,qx,[Z(`button`,{class:V([`tab-btn`,{active:y.value===`logs`}]),onClick:n[0]||=e=>w(`logs`)},`🐛 日志`,2),Z(`button`,{class:V([`tab-btn`,{active:y.value===`flow`}]),onClick:n[1]||=e=>w(`flow`)},`🔀 流程`,2),e.getInfo?(Y(),X(`button`,{key:0,class:V([`tab-btn`,{active:y.value===`trace`}]),onClick:n[2]||=e=>w(`trace`)},`🌳 Trace`,2)):Q(``,!0),e.getInfo?(Y(),X(`button`,{key:1,class:V([`tab-btn`,{active:y.value===`context`}]),onClick:n[3]||=e=>w(`context`)},`📊 上下文`,2)):Q(``,!0),e.getInfo?(Y(),X(`button`,{key:2,class:V([`tab-btn`,{active:y.value===`info`}]),onClick:n[4]||=e=>w(`info`)},`🧬 Agent 信息`,2)):Q(``,!0)]),Z(`div`,Jx,[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`,Yx,[(Y(),X(J,null,$i(s,(e,t)=>Z(`button`,{key:t,class:V([`filter-chip`,{active:i.value===t}]),style:Se({"--chip-color":e.color}),onClick:e=>i.value=t},[ls(H(e.icon)+` `+H(e.label)+` `,1),Z(`span`,Zx,H(u.value[t]||0),1)],14,Xx)),64)),Z(`button`,{class:V([`filter-chip all`,{active:i.value===`all`}]),onClick:n[5]||=e=>i.value=`all`},[n[6]||=ls(` 全部 `,-1),Z(`span`,Qx,H(u.value.all||0),1)],2)])):Q(``,!0),Z(`div`,$x,[y.value===`trace`?(Y(),X(`div`,eS,[j.value?(Y(),X(J,{key:1},[Z(`div`,nS,[Z(`div`,rS,[n[8]||=Z(`span`,null,`轮次`,-1),Z(`b`,null,H(j.value.rounds),1)]),Z(`div`,iS,[n[9]||=Z(`span`,null,`总耗时`,-1),Z(`b`,null,H(j.value.totalDurationMs)+`ms`,1)]),Z(`div`,aS,[n[10]||=Z(`span`,null,`平均/轮`,-1),Z(`b`,null,H(j.value.avgRoundMs)+`ms`,1)]),Z(`div`,oS,[n[11]||=Z(`span`,null,`工具`,-1),Z(`b`,null,H(j.value.toolCalls)+`(✅`+H(Math.round(j.value.toolSuccessRate*100))+`%)`,1)]),j.value.compressions?(Y(),X(`div`,sS,[n[12]||=Z(`span`,null,`压缩`,-1),Z(`b`,null,H(j.value.compressions),1)])):Q(``,!0),j.value.totalTokens?(Y(),X(`div`,cS,[n[13]||=Z(`span`,null,`Token`,-1),Z(`b`,null,H(j.value.totalTokens.total),1)])):Q(``,!0)]),Z(`div`,lS,[(Y(!0),X(J,null,$i(A.value,e=>(Y(),X(`div`,{key:e.id,class:V([`trace-span`,[e.type,e.status]])},[Z(`span`,uS,H(P(e.type)),1),Z(`span`,dS,H(e.name),1),e.durationMs?(Y(),X(`span`,fS,H(e.durationMs)+`ms`,1)):Q(``,!0),e.status===`error`?(Y(),X(`span`,pS,`❌`)):Q(``,!0)],2))),128))])],64)):(Y(),X(`div`,tS,[...n[7]||=[ls(`未开启 tracing(`,-1),Z(`code`,null,`capabilities.tracing:true`,-1),ls(`)或暂无 trace。跑一轮 agent 后刷新。`,-1)]]))])):Q(``,!0),y.value===`context`?(Y(),X(`div`,mS,[M.value?(Y(),X(J,{key:1},[Z(`div`,gS,[Z(`div`,_S,[Z(`div`,{class:`ctx-bar-track`,title:`占用 ${Math.round(M.value.occupancy*100)}%`},[Z(`div`,{class:V([`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,vS),Z(`span`,yS,H(Math.round(M.value.occupancy*100))+`%`,1)]),Z(`div`,bS,[Z(`span`,xS,`估算 `+H(M.value.totalTokens)+` token`,1),M.value.contextWindow?(Y(),X(`span`,SS,`窗口 `+H(M.value.contextWindow),1)):Q(``,!0),M.value.thresholdRatio>0?(Y(),X(`span`,CS,`阈值 `+H(Math.round(M.value.thresholdRatio*100))+`%`,1)):Q(``,!0)])]),n[15]||=Z(`div`,{class:`ctx-section-title`},`分类构成(近似)`,-1),(Y(!0),X(J,null,$i(M.value.categories,e=>(Y(),X(`div`,{key:e.key,class:`ctx-cat`},[Z(`span`,{class:`ctx-cat-label`,title:e.label},H(e.label),9,wS),Z(`div`,TS,[Z(`div`,{class:`ctx-cat-fill`,style:Se({width:Math.max(Math.round(e.pct*100),2)+`%`})},null,4)]),Z(`span`,ES,[ls(H(e.tokens)+` `,1),Z(`i`,null,`(`+H(Math.round(e.pct*100))+`%)`,1)])]))),128)),M.value.compression?(Y(),X(`div`,DS,[n[14]||=Z(`div`,{class:`ctx-section-title`},`最近压缩`,-1),Z(`div`,OS,[Z(`span`,kS,`摘要 `+H(M.value.compression.roundsSummarized)+`/`+H(M.value.compression.roundsTotal)+` 轮`,1),Z(`span`,AS,`召回 `+H(M.value.compression.roundsRecalled),1),Z(`span`,jS,H(M.value.compression.strategy),1),M.value.compression.decision?(Y(),X(`span`,MS,`🤖 agent 决策:`+H(ee(M.value.compression.decision)),1)):Q(``,!0)])])):Q(``,!0)],64)):(Y(),X(`div`,hS,`未开启 contextInspector(默认开)或暂无快照。跑一轮 agent 后切回刷新。`))])):Q(``,!0),y.value===`logs`?(Y(),X(J,{key:2},[l.value.length===0?(Y(),X(`div`,NS,` 暂无日志,发送消息后这里会显示 Agent 的完整上下文、工具调用等信息 `)):Q(``,!0),(Y(!0),X(J,null,$i(l.value,(e,t)=>(Y(),X(`div`,{key:t,class:`log-item`},[Z(`div`,PS,[Z(`span`,{class:`log-type`,style:Se({background:s[e.type].color})},H(s[e.type].icon)+` `+H(s[e.type].label),5),e.source?(Y(),X(`span`,FS,`↳ `+H(e.source),1)):Q(``,!0),Z(`span`,IS,H(d(e.timestamp)),1)]),Z(`div`,LS,[e.type===`context`?(Y(),X(J,{key:0},[Z(`div`,RS,[Z(`div`,zS,[n[16]||=Z(`span`,{class:`k`},`模型`,-1),Z(`span`,BS,H(e.data.model),1)]),Z(`div`,VS,[n[17]||=Z(`span`,{class:`k`},`温度`,-1),Z(`span`,HS,H(e.data.temperature),1)]),Z(`div`,US,[n[18]||=Z(`span`,{class:`k`},`MaxTokens`,-1),Z(`span`,WS,H(e.data.maxTokens),1)]),Z(`div`,GS,[n[19]||=Z(`span`,{class:`k`},`消息数`,-1),Z(`span`,KS,H(e.data.totalMessages),1)])]),Z(`div`,qS,`工具 (`+H(e.data.tools?.length||0)+`)`,1),Z(`div`,JS,[(Y(!0),X(J,null,$i(e.data.tools,e=>(Y(),X(`span`,{key:e,class:`tool-chip`},H(e),1))),128))]),n[20]||=Z(`div`,{class:`section-label`},`上下文消息`,-1),Z(`div`,YS,[(Y(!0),X(J,null,$i(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})},H(g(e.type).label),5),Z(`span`,XS,H(e.content),1)]))),128))])],64)):e.type===`llm_request`?(Y(),X(J,{key:1},[Z(`div`,ZS,[Z(`span`,QS,`第 `+H(e.data.round)+` 轮`,1),e.data.model?(Y(),X(`span`,$S,H(e.data.model),1)):Q(``,!0),Z(`span`,eC,H((e.data.messages||[]).length)+` 条消息`,1),e.data.tools?.length?(Y(),X(`span`,tC,H(e.data.tools.length)+` 工具`,1)):Q(``,!0),Z(`button`,{class:`view-toggle`,onClick:e=>p(t)},H(o.value.has(t)?`🗂 卡片视图`:`📋 请求体`),9,nC)]),o.value.has(t)?(Y(),X(`pre`,lC,[Z(`code`,null,H(m(e.data.messages)),1)])):(Y(),X(`div`,rC,[(Y(!0),X(J,null,$i(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})},H(g(e.role).label),5),Z(`div`,iC,[e.content?(Y(),X(`span`,aC,H(e.content),1)):Q(``,!0),(Y(!0),X(J,null,$i(e.tool_calls||[],(e,t)=>(Y(),X(`div`,{key:t,class:`tc-inline`},[Z(`span`,oC,`🔧 `+H(e.function?.name||e.name),1),Z(`code`,sC,H(e.function?.arguments??e.args),1)]))),128)),e.tool_call_id?(Y(),X(`span`,cC,`↳ tool_call_id: `+H(e.tool_call_id),1)):Q(``,!0)])]))),128))]))],64)):e.type===`llm_response`?(Y(),X(J,{key:2},[Z(`div`,uC,[Z(`span`,dC,`第 `+H(e.data.round)+` 轮`,1),e.data.toolCalls?.length?(Y(),X(`span`,fC,`🔧 `+H(e.data.toolCalls.length)+` 个工具调用`,1)):Q(``,!0)]),e.data.content?(Y(),X(`div`,pC,H(e.data.content),1)):Q(``,!0),e.data.toolCalls?.length?(Y(),X(`div`,mC,[(Y(!0),X(J,null,$i(e.data.toolCalls,(e,t)=>(Y(),X(`div`,{key:t,class:`tc-card`},[Z(`div`,hC,`🔧 `+H(e.name),1),Z(`pre`,gC,H(m(e.args)),1)]))),128))])):Q(``,!0),e.data.usage?(Y(),X(`div`,_C,[Z(`span`,vC,`prompt: `+H(e.data.usage.prompt_tokens??`-`),1),Z(`span`,yC,`completion: `+H(e.data.usage.completion_tokens??`-`),1),Z(`span`,bC,`total: `+H(e.data.usage.total_tokens??`-`),1)])):Q(``,!0)],64)):e.type===`tool_call`?(Y(),X(`div`,xC,[Z(`div`,SC,`🔧 `+H(e.data.name),1),Z(`pre`,CC,H(m(e.data.args)),1)])):e.type===`tool_result`?(Y(),X(`div`,wC,[Z(`div`,TC,`✅ `+H(e.data.name)+` 结果`,1),Z(`pre`,EC,H(e.data.result),1)])):e.type===`error`?(Y(),X(`div`,DC,H(e.data.tool?`[${e.data.tool}] `:``)+H(e.data.error),1)):Q(``,!0)]),Z(`div`,OC,[Z(`button`,{class:`raw-toggle`,onClick:e=>f(t)},H(a.value.has(t)?`收起原始 JSON`:`查看原始 JSON`),9,kC),Z(`button`,{class:`raw-toggle`,onClick:t=>K(Kh)(m(e.data))},`复制`,8,AC)]),a.value.has(t)?(Y(),X(`pre`,jC,[Z(`code`,null,H(m(e.data)),1)])):Q(``,!0)]))),128))],64)):y.value===`flow`?(Y(),X(J,{key:3},[c.value.length?Q(``,!0):(Y(),X(`div`,MC,`暂无日志,发送消息后这里按轮次展示执行流程`)),O.value.pre.length?(Y(),X(`div`,NC,[n[21]||=Z(`div`,{class:`flow-section-title`},`⚙️ 准备 / 其他`,-1),(Y(!0),X(J,null,$i(O.value.pre,(e,t)=>(Y(),X(`div`,{key:`p`+t,class:V([`flow-node`,e.type])},[Z(`span`,PC,H(s[e.type]?.icon),1),Z(`span`,FC,H(s[e.type]?.label),1),Z(`span`,IC,H(te(e)),1),Z(`span`,LC,H(d(e.timestamp)),1)],2))),128))])):Q(``,!0),(Y(!0),X(J,null,$i(O.value.rounds,e=>(Y(),X(`div`,{key:e.round,class:`flow-round`},[Z(`div`,RC,`🔁 第 `+H(e.round)+` 轮`,1),Z(`div`,zC,[(Y(!0),X(J,null,$i(e.items,(e,t)=>(Y(),X(`div`,{key:t,class:V([`flow-node`,e.type])},[Z(`span`,BC,H(s[e.type]?.icon),1),Z(`span`,VC,H(s[e.type]?.label),1),Z(`span`,HC,H(te(e)),1),Z(`span`,UC,H(d(e.timestamp)),1)],2))),128))])]))),128))],64)):(Y(),X(`div`,WC,[b.value?(Y(),X(J,{key:1},[Z(`div`,KC,[n[27]||=Z(`div`,{class:`info-title`},`基本信息`,-1),Z(`div`,qC,[Z(`div`,JC,[n[22]||=Z(`span`,{class:`k`},`ID`,-1),Z(`span`,YC,H(b.value.id),1)]),Z(`div`,XC,[n[23]||=Z(`span`,{class:`k`},`模型`,-1),Z(`span`,ZC,H(b.value.model||`-`),1)]),Z(`div`,QC,[n[24]||=Z(`span`,{class:`k`},`工具数`,-1),Z(`span`,$C,H(b.value.tools.length),1)]),Z(`div`,ew,[n[25]||=Z(`span`,{class:`k`},`中间件`,-1),Z(`span`,tw,H(b.value.middleware.length),1)])]),Z(`div`,nw,[n[26]||=Z(`span`,{class:`k`},`中间件栈`,-1),Z(`span`,rw,H(b.value.middleware.join(` → `)||`-`),1)])]),Z(`div`,iw,[Z(`div`,aw,`🔧 工具 (`+H(b.value.tools.length)+`)`,1),(Y(!0),X(J,null,$i(b.value.tools,e=>(Y(),X(`div`,{key:e.name,class:`info-item`},[Z(`div`,ow,[ls(H(e.name),1),e.source?(Y(),X(`span`,{key:0,class:V([`src-tag`,D(e.source)])},H(e.source),3)):Q(``,!0)]),Z(`div`,sw,H(e.description),1)]))),128))]),b.value.skills.length?(Y(),X(`div`,cw,[Z(`div`,lw,[ls(`📘 技能 (`+H(b.value.skills.length)+`)`,1),n[28]||=Z(`span`,{class:`info-hint`},`点击展开查看全文`,-1)]),(Y(!0),X(J,null,$i(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:V([`skill-arrow`,{open:!!x.value[e.name]}])},`▶`,2),ls(` `+H(e.name),1)],8,uw),Z(`div`,dw,H(e.description),1),x.value[e.name]?(Y(),X(`div`,fw,[x.value[e.name].loading?(Y(),X(`div`,pw,`加载中…`)):x.value[e.name].error?(Y(),X(`div`,mw,H(x.value[e.name].error),1)):x.value[e.name].content?(Y(),X(`pre`,hw,H(x.value[e.name].content),1)):Q(``,!0)])):Q(``,!0)]))),128))])):Q(``,!0),b.value.data?(Y(),X(`div`,gw,[n[29]||=Z(`div`,{class:`info-title`},`📊 可操作数据`,-1),Z(`div`,_w,[Z(`div`,vw,H(b.value.data.description||`主数据对象`),1),Z(`div`,yw,`schema: `+H(b.value.data.schema?`已声明`:`未声明`),1)])])):Q(``,!0),Z(`div`,bw,[n[34]||=Z(`div`,{class:`info-title`},`🧬 子 Agent`,-1),Z(`div`,xw,[Z(`div`,Sw,[n[30]||=Z(`span`,{class:`k`},`启用`,-1),Z(`span`,Cw,H(b.value.subagent.enabled?`是`:`否`),1)]),Z(`div`,ww,[n[31]||=Z(`span`,{class:`k`},`最大递归`,-1),Z(`span`,Tw,H(b.value.subagent.maxDepth),1)]),Z(`div`,Ew,[n[32]||=Z(`span`,{class:`k`},`并行上限`,-1),Z(`span`,Dw,H(b.value.subagent.maxParallel),1)]),Z(`div`,Ow,[n[33]||=Z(`span`,{class:`k`},`额外工具`,-1),Z(`span`,kw,H(b.value.subagent.allowedTools.length?b.value.subagent.allowedTools.join(`, `):`默认只读`),1)])])]),b.value.mcp?.servers?.length?(Y(),X(`div`,Aw,[Z(`div`,jw,`🔌 MCP (`+H(b.value.mcp.servers.length)+`)`,1),(Y(!0),X(J,null,$i(b.value.mcp.servers,e=>(Y(),X(`div`,{key:e.name,class:`info-item`},[Z(`div`,Mw,[ls(H(e.name)+` `,1),Z(`span`,Nw,H(e.toolCount)+` 工具`,1)]),Z(`div`,Pw,H(e.url),1)]))),128))])):Q(``,!0),b.value.verify?(Y(),X(`div`,Fw,[n[39]||=Z(`div`,{class:`info-title`},`✅ Verify 自检`,-1),Z(`div`,Iw,[Z(`div`,Lw,[n[35]||=Z(`span`,{class:`k`},`启用`,-1),Z(`span`,Rw,H(b.value.verify.enabled?`是`:`否`),1)]),Z(`div`,zw,[n[36]||=Z(`span`,{class:`k`},`自纠上限`,-1),Z(`span`,Bw,H(b.value.verify.maxAttempts),1)]),Z(`div`,Vw,[n[37]||=Z(`span`,{class:`k`},`对抗验证`,-1),Z(`span`,Hw,H(b.value.verify.adversarial?`开启`:`关闭`),1)]),b.value.verify.adversarial?(Y(),X(`div`,Uw,[n[38]||=Z(`span`,{class:`k`},`对抗模型`,-1),Z(`span`,Ww,H(b.value.model||`-`)+`(同主)`,1)])):Q(``,!0)])])):Q(``,!0),b.value.todos.length?(Y(),X(`div`,Gw,[Z(`div`,Kw,`📋 任务清单 (`+H(b.value.todos.length)+`)`,1),(Y(!0),X(J,null,$i(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`})},H(E(e.status)),5),Z(`span`,null,H(e.content),1)]))),128))])):Q(``,!0),b.value.memory?(Y(),X(`div`,qw,[n[40]||=Z(`div`,{class:`info-title`},`📝 持久指令 (memory)`,-1),Z(`pre`,Jw,H(b.value.memory),1)])):Q(``,!0),b.value.lastCompression?(Y(),X(`div`,Yw,[n[47]||=Z(`div`,{class:`info-title`},`🗜️ 上轮压缩`,-1),Z(`div`,Xw,[Z(`div`,Zw,[n[41]||=Z(`span`,{class:`k`},`触发`,-1),Z(`span`,Qw,H(b.value.lastCompression.triggered?`✓`:`✗(未达阈值)`),1)]),Z(`div`,$w,[n[42]||=Z(`span`,{class:`k`},`摘要轮次`,-1),Z(`span`,eT,H(b.value.lastCompression.roundsSummarized)+` / `+H(b.value.lastCompression.roundsTotal),1)]),Z(`div`,tT,[n[43]||=Z(`span`,{class:`k`},`召回`,-1),Z(`span`,nT,H(b.value.lastCompression.roundsRecalled)+` 条`,1)]),Z(`div`,rT,[n[44]||=Z(`span`,{class:`k`},`消息数`,-1),Z(`span`,iT,H(b.value.lastCompression.originalMessages)+` → `+H(b.value.lastCompression.compressedMessages),1)]),Z(`div`,aT,[n[45]||=Z(`span`,{class:`k`},`策略`,-1),Z(`span`,oT,H(b.value.lastCompression.strategy),1)]),b.value.lastCompression.decision?(Y(),X(`div`,sT,[n[46]||=Z(`span`,{class:`k`},`压缩决策`,-1),Z(`span`,cT,`🤖 `+H(ee(b.value.lastCompression.decision)),1)])):Q(``,!0)])])):Q(``,!0)],64)):(Y(),X(`div`,GC,`暂无信息`))]))])]),Z(`div`,{class:`drawer-mask`,onClick:_})])):Q(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-1d1935da`]]),uT={class:`skill-panel`},dT={class:`skill-header`},fT={class:`skill-section`},pT={class:`section-title`},mT={class:`field`},hT=[`disabled`],gT={class:`field`},_T={class:`field field-textarea`},vT={key:0,class:`skill-error`},yT={class:`skill-section`},bT={class:`section-title`},xT={key:0,class:`empty-hint`},ST={key:1,class:`skill-list`},CT={class:`skill-actions`},wT=[`onClick`],TT=[`onClick`],ET=cg(Di({__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=hn(``),a=hn(``),o=hn(``),s=hn(``),c=hn([]),l=hn(0),u=hn(null);Jr(()=>n.visible,e=>{e&&d()},{immediate:!0}),Jr(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(),Zo(li,{to:`body`},[is(cc,{name:`cs-skill-fade`},{default:Br(()=>[e.visible?(Y(),X(`div`,{key:0,class:`skill-mask`,onClick:n[4]||=dl(e=>r(`close`),[`self`])},[Z(`div`,uT,[Z(`div`,dT,[n[5]||=Z(`span`,{class:`skill-title`},`🧩 Skill 管理`,-1),Z(`button`,{class:`skill-close`,title:`关闭`,onClick:n[0]||=e=>r(`close`)},`✕`)]),Z(`div`,fT,[Z(`div`,pT,[ls(H(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`,mT,[n[6]||=Z(`span`,{class:`field-label`},`名称`,-1),Hr(Z(`input`,{"onUpdate:modelValue":n[1]||=e=>i.value=e,disabled:!!u.value,placeholder:`如:my-writer`,class:`field-input`},null,8,hT),[[cl,i.value]])]),Z(`label`,gT,[n[7]||=Z(`span`,{class:`field-label`},`描述`,-1),Hr(Z(`input`,{"onUpdate:modelValue":n[2]||=e=>a.value=e,placeholder:`一句话说明用途与触发时机`,class:`field-input`},null,512),[[cl,a.value]])]),Z(`label`,_T,[n[8]||=Z(`span`,{class:`field-label`},`内容`,-1),Hr(Z(`textarea`,{"onUpdate:modelValue":n[3]||=e=>o.value=e,placeholder:`skill 全文指令(支持 Markdown)`,rows:`6`,class:`field-input`},null,512),[[cl,o.value]])]),s.value?(Y(),X(`div`,vT,H(s.value),1)):Q(``,!0),Z(`button`,{class:`btn btn-primary`,onClick:f},H(u.value?`保存修改`:`添加 Skill`),1)]),Z(`div`,yT,[Z(`div`,bT,`已创建 Skill(`+H(c.value.length)+`)`,1),c.value.length?(Y(),X(`ul`,ST,[(Y(!0),X(J,null,$i(c.value,e=>(Y(),X(`li`,{key:e,class:`skill-item`},[Z(`span`,{class:V([`skill-name`,{active:u.value===e}])},H(e),3),Z(`span`,CT,[Z(`button`,{class:`btn btn-ghost btn-edit`,title:`加载到表单编辑`,onClick:t=>m(e)},`编辑`,8,wT),Z(`button`,{class:`btn btn-ghost btn-del`,title:`删除该用户 skill`,onClick:t=>p(e)},`删除`,8,TT)])]))),128))])):(Y(),X(`div`,xT,`暂无用户创建的 skill`))]),n[9]||=Z(`div`,{class:`skill-hint`},[ls(` 💡 创建/编辑的 skill 会自动加入 agent(下轮 system prompt 索引可见),agent 经 `),Z(`code`,null,`load_skill(name)`),ls(` 按需加载全文; 持久化由独立 SkillStore 管理(默认 indexedDB,与 storage 选项分离),跨刷新自动恢复;可经 `),Z(`code`,null,`skillStorage.id`),ls(` 跨页面复用。 `)],-1)])])):Q(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-c6a22ea5`]]),DT=cg(Di({__name:`ChatDialog`,props:{fetchResponse:{},fetchStream:{},title:{default:`AI 助手`},placeholder:{default:`输入消息,Enter 发送...`},debugLogs:{},initialMessages:{},onPersist:{},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=Jh({fetchResponse:n.fetchResponse,fetchStream:n.fetchStream,messages:n.initialMessages,onPersist:n.onPersist,onClear:n.onClear,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});Wr(qh,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=Ws(()=>!!n.onAddSkill),d=Ws(()=>{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:V([`chat-dialog`,{collapsed:!K(a)&&!e.drawer,drawer:e.drawer}]),style:Se(d.value?{width:d.value,maxWidth:d.value}:null)},[l(`header`)?ea(t.$slots,`header`,{key:0,chat:K(i)},()=>[is(lg,{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`)?ea(t.$slots,`focus`,{key:1,chat:K(i)},()=>[is(hg,{"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(),Zo(cc,{key:2,name:`cs-slide`},{default:Br(()=>[ea(t.$slots,`body`,{chat:K(i)},()=>[Hr(is(tx,{"show-avatar":e.showAvatar,"show-typing":e.showTyping},null,8,[`show-avatar`,`show-typing`]),[[Ec,K(a)]])],!0)]),_:3})):Q(``,!0),l(`queued`)?ea(t.$slots,`queued`,{key:3,chat:K(i)},()=>[is(lx)],!0):Q(``,!0),l(`approval`)?ea(t.$slots,`approval`,{key:4,chat:K(i)},()=>[is(bx)],!0):Q(``,!0),l(`conflict`)?ea(t.$slots,`conflict`,{key:5,chat:K(i)},()=>[is(jx,{"pending-conflict":e.pendingConflict,"on-resolve":e.onResolveConflict},null,8,[`pending-conflict`,`on-resolve`])],!0):Q(``,!0),l(`footer`)?(Y(),Zo(cc,{key:6,name:`cs-slide`},{default:Br(()=>[ea(t.$slots,`footer`,{chat:K(i)},()=>[is(Ux,{placeholder:e.placeholder,"input-rows":e.inputRows},null,8,[`placeholder`,`input-rows`])],!0)]),_:3})):Q(``,!0),l(`debug`)?ea(t.$slots,`debug`,{key:7,chat:K(i)},()=>[is(lT,{visible:K(o),"onUpdate:visible":n[2]||=e=>mn(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`)?ea(t.$slots,`skill`,{key:8,chat:K(i)},()=>[is(ET,{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-1b784c76`]]);function OT(e){let{core:t,dialogCfg:n}=e,r=null,i=e.el,a=t.agent.debugLogs;return r=_l(Di({setup(){return()=>Gs(DT,{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(),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 kT=`你是知识检索专家。可用工具:search_docs(语义检索)/ load_doc(按 source 加载)/ vfs_grep+vfs_read(搜预注入文档)/ fetch_document(公网 URL)。
|
|
181
|
+
|
|
182
|
+
工作方式:
|
|
183
|
+
1. 分析任务,拆出需查证的要点(如:需要哪些组件、各自的 props 约束、UI 规范要求);
|
|
184
|
+
2. 多源检索:先 vfs_grep 搜预注入文档(快、静态)→ 不够用 search_docs 语义检索 → 需特定文档用 load_doc → 公网用 fetch_document;
|
|
185
|
+
3. 检索结果不足时换关键词、扩大 topK、或换源重试;
|
|
186
|
+
4. 综合成结构化、可执行结论(不堆原文,提炼成可直接用于决策/配置的信息);
|
|
187
|
+
5. 标注关键信息来源(文档名/段落),便于溯源;检索不到明确说「未检索到」,不编造。
|
|
188
|
+
|
|
189
|
+
你是只读检索角色,不要尝试修改任何数据。`,AT=`# 知识检索策略(RAG)
|
|
190
|
+
|
|
191
|
+
## 多源决策树
|
|
192
|
+
- vfs_grep / vfs_read:搜集成方预注入 vfs 的文档(组件文档 / UI 规范)—— 快、静态,先查
|
|
193
|
+
- search_docs:语义检索(retriever 向量库)—— 模糊匹配,关键词不确定 / 语义相似时用
|
|
194
|
+
- load_doc:按 source 精确加载(已知文档 id / URL / key)—— 精确取特定文档
|
|
195
|
+
- fetch_document:公网 URL —— 查公开资料
|
|
196
|
+
|
|
197
|
+
## 综合规范
|
|
198
|
+
- 多源交叉验证(关键结论优先 ≥2 源印证,或单一权威源)
|
|
199
|
+
- 标注来源(文档名 / URL / 段落),便于溯源
|
|
200
|
+
- 结构化、可执行结论(组件清单 + 各自 props 约束 + 适用场景),不堆原文
|
|
201
|
+
- 未检索到明确说「未检索到」,不编造;建议替代方案(改关键词 / 建议写代码组件等)
|
|
202
|
+
|
|
203
|
+
## 何时用何源
|
|
204
|
+
- 静态文档(组件库文档 / UI 规范):vfs_grep
|
|
205
|
+
- 语义相似(「瀑布流组件」「倒计时」「拼团」):search_docs
|
|
206
|
+
- 已知文档 id / URL:load_doc
|
|
207
|
+
- 公开 URL(设计规范网站 / 第三方文档):fetch_document`,jT={name:`rag-search`,description:`多源知识检索策略:vfs 预注入文档 → 语义检索 → 指定文档加载 → 公网;综合结构化结论 + 溯源`,getContent:()=>AT};function MT(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
|
+
|
|
209
|
+
`):`未检索到与「${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 NT(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
|
+
|
|
211
|
+
`):`未加载到「${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 PT(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(MT(s,t,o)),n&&p.push(NT(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:kT,tools:p.length?p:void 0,allowedTools:m,skills:d??[jT],maxToolRounds:l,...u===void 0?{}:{summarization:u}}}function FT(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
|
+
|
|
213
|
+
代码存储约定(重要):
|
|
214
|
+
- 代码正文写 vfs:${e}<name>.vue(如 ${e}hero.vue)
|
|
215
|
+
- data 存引用:write({ patch:{ op:'set', jsonPath:'components.N', value:{ type:'custom', codeRef:'vfs://${e}<name>.vue', name, props } } })
|
|
216
|
+
- 改代码:先 vfs_edit 改 vfs 文件(data 的 codeRef 引用不变,无需改 data)
|
|
217
|
+
|
|
218
|
+
工作方式:
|
|
219
|
+
1. 中等任务(多组件 / 大段代码)先 write_todos 拆解:读现有结构 → 规划各组件 → 逐个生成 → read 确认;
|
|
220
|
+
2. 遵循 html-builder skill 规范(SFC 规范 / 安全底线 / 可访问性 / props 定义 / 组件库引用);
|
|
221
|
+
3. 小段代码 vfs_write 整体写;大段用 vfs_edit 增量拼(避免单次输出超限);
|
|
222
|
+
4. 生成后 read(vfs 文件 + data 引用)确认结构正确;只写 writablePaths 内 data + ${e} 下 vfs。`}var IT=`# 纯代码组件生成规范
|
|
223
|
+
|
|
224
|
+
## 代码存储约定(重要)
|
|
225
|
+
- 代码正文写 vfs:html/<name>.vue(如 html/hero.vue)
|
|
226
|
+
- data 存引用:{ type:'custom', codeRef:'vfs://html/<name>.vue', name, props }
|
|
227
|
+
- 改代码:vfs_edit 改 vfs 文件(data 的 codeRef 引用不变)
|
|
228
|
+
|
|
229
|
+
## 何时写代码组件
|
|
230
|
+
- 组件库无对应类型(高度定制交互 / 一次性特效 / 特殊布局)→ 写 custom 代码组件
|
|
231
|
+
- 组件库已有(按钮 / 卡片 / 列表)→ 用现有组件配置,不重造
|
|
232
|
+
|
|
233
|
+
## Vue SFC 规范
|
|
234
|
+
- Vue 3 <template> + <script setup>(组合式)
|
|
235
|
+
- props 用 defineProps;事件用 defineEmits
|
|
236
|
+
- 只渲染 UI,不做副作用(不发请求 / 不读写 storage)
|
|
237
|
+
|
|
238
|
+
## props 定义
|
|
239
|
+
- 代码组件 defineProps 接受外部 data 传入(集成方渲染时按 data 的 props 字段传)
|
|
240
|
+
|
|
241
|
+
## 组件库引用
|
|
242
|
+
- 代码内可 import 组件库组件(如 <Button>);所用依赖以集成方渲染层已注入为准,不重复造
|
|
243
|
+
|
|
244
|
+
## 安全底线(必须)
|
|
245
|
+
- 禁 eval / new Function / Function 构造器
|
|
246
|
+
- 禁访问 window 敏感属性(document.cookie / apiKey / token)
|
|
247
|
+
- 不引入外部脚本 / CDN
|
|
248
|
+
|
|
249
|
+
## 可访问性 + 语义化
|
|
250
|
+
- 语义化标签(button / nav / section);图片 alt;交互可键盘聚焦
|
|
251
|
+
- 颜色对比达标;不只用颜色传达信息`,LT={name:`html-builder`,description:`纯代码组件(custom Vue SFC)生成规范:代码存 vfs+data 引用 / SFC 规范 / 安全底线 / props / 组件库引用 / 可访问性`,getContent:()=>IT};function RT(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(Nu());let f=u??[];return{id:r,description:i??`生成/修改纯代码组件(custom Vue SFC)。代码写 vfs,data 存引用;能规划(write_todos)+ 执行。需写代码组件或灵活定制时委派`,systemPrompt:FT(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??[LT],maxToolRounds:s,tools:f.length?f:void 0}}function zT(e){return Wh(e,OT)}e.ApprovalBar=bx,e.CAPABILITIES=Np,e.CONTEXT_PRESETS=Ip,e.ChatDialog=DT,e.ChatHeader=lg,e.ChatInput=Ux,e.CodePreview=jb,e.CompressDecisionSchema=qf,e.ConflictBar=jx,e.DEFAULT_SYSTEM_PROMPT=Vf,e.DebugDrawer=lT,e.FocusBar=hg,e.HUMAN_CONFIRM_TOOL_NAME=Cd,e.MIN_CONTEXT_WINDOW=Fl,e.MessageContent=Nb,e.MessageList=tx,e.MessageRow=Jb,e.QueuedBar=lx,e.STOP_WORDS=Wd,e.SkillPanel=ET,e.UNSAFE_KEYS=Vp,e.actionsToInspectInfo=bh,e.actionsToTools=yh,e.agentError=Ol,e.analyzeContext=Ff,e.applyPatchToClone=em,e.applyPatchToLive=tm,e.asAgentError=Dl,e.buildDataPrompt=Hf,e.buildSystemPrompt=Uf,e.chatContextKey=qh,e.commitSetToBind=$m,e.connectMcp=Bf,e.constructLlmFromConfig=v,e.constructOpenLlmSync=_,e.copyText=Kh,e.createAgent=fu,e.createApprovalMiddleware=Sd,e.createChatContext=Jh,e.createChatSdk=zT,e.createCheckpointManager=Nd,e.createCheckpointMiddleware=Pd,e.createConflictManager=ap,e.createContextInspectorMiddleware=If,e.createDataOps=th,e.createHtmlSubagent=RT,e.createHumanConfirmMiddleware=Ed,e.createHumanConfirmTool=Td,e.createMemoryBackend=Ep,e.createMemoryMiddleware=hd,e.createProxyLlm=g,e.createRagSubagent=PT,e.createSandboxRunner=td,e.createSdkEvents=Fp,e.createSerialRunner=Lh,e.createSessionStore=Ap,e.createSkillStore=Nh,e.createSubagentMiddleware=ff,e.createSubagentsMiddleware=hf,e.createUsageHintsMiddleware=Dh,e.createVerifyMiddleware=gf,e.createVfs=cm,e.createWebStorageBackend=Op,e.createWriteBackCheck=Sf,e.deepClone=qp,e.defineDataToolset=Ch,e.defineSkill=rd,e.defineTool=Wf,e.deleteByPath=Kp,e.deriveTitle=Jf,e.describeSchemaNode=wu,e.detectGarbledToolCall=nu,e.diffObjects=im,e.domToStructure=sh,e.domTools=lh,e.domToolsStatic=Sh,e.estimateMessageTokens=Kd,e.estimateRoundTokens=qd,e.estimateTokens=Ll,e.extractReasoningDelta=b,e.extractSchemaHint=Uu,e.extractText=Lf,e.extractTextDelta=y,e.extractUsage=x,e.fetchDocTools=rh,e.fetchTools=xh,e.filterByToolMode=Qm,e.formatConstraints=Tu,e.formatZodIssues=Cl,e.getByPath=Wp,e.getDomTool=ch,e.getEnvSummary=fh,e.getSchemaAtPath=gu,e.getSchemaTopKeys=pu,e.getTraceMetrics=Bl,e.hashValue=$p,e.indexSummarize=Jd,e.inspectEnvTool=hh,e.inspectTools=gh,e.isChatModel=Yf,e.isContextLengthError=ql,e.isPathAllowed=mu,e.isQuotaError=vp,e.isUnsafePath=Hp,e.jpEval=Dm,e.jsonParseError=Tl,e.limitDepth=Xp,e.maybeParseValue=Jp,e.offloadPassThroughChars=zl,e.offloadThresholdChars=Rl,e.presets=Ru,e.projectBySchema=vu,e.projectBySchemaDeep=_u,e.projectFields=Yp,e.recallRounds=Yd,e.renderSchemaHint=Eu,e.renderSchemaOverview=Du,e.renderSchemaShallow=ku,e.resolveCapabilities=Pp,e.resolveContextOptions=Rp,e.resolveDialogConfig=Mp,e.resolveLlm=ip,e.resolveModelCaps=Il,e.resolveStorage=jp,e.restoreInPlace=rm,e.restoreLive=nm,e.routeError=El,e.runHostScript=nd,e.runSandboxedScript=jm,e.safeMerge=Up,e.safeSerialize=dh,e.safeStringify=Zp,e.searchJson=km,e.selectBuiltinTools=wh,e.setByPath=Gp,e.shouldTriggerCompression=Xd,e.systemPromptHelpers=zu,e.tokenize=Gd,e.toolError=$,e.unwrapSchema=hu,e.useChat=Gh,e.useChatContext=Yh,Object.defineProperty(e,"z",{enumerable:!0,get:function(){return t.z}}),e.zodError=wl});
|