page-agent-sdk 2.34.0 → 2.35.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 +3 -4
- package/README.zh-CN.md +3 -4
- package/dist/page-agent-sdk.iife.js +19 -19
- package/dist/page-agent-sdk.js +6 -1
- package/dist/page-agent-sdk.umd.cjs +1 -1
- package/package.json +1 -1
- package/types/index.d.ts +19 -0
package/dist/page-agent-sdk.js
CHANGED
|
@@ -23079,6 +23079,11 @@ function AT(e) {
|
|
|
23079
23079
|
return i.sessionId;
|
|
23080
23080
|
},
|
|
23081
23081
|
stream: i.stream,
|
|
23082
|
+
afterRound: i.afterRound,
|
|
23083
|
+
get debugLogs() {
|
|
23084
|
+
return i.agent.debugLogs;
|
|
23085
|
+
},
|
|
23086
|
+
infoTick: i.infoTick,
|
|
23082
23087
|
inspect: i.getInfo,
|
|
23083
23088
|
inspectContext: () => i.getInfo().context,
|
|
23084
23089
|
getMission: i.getMission,
|
|
@@ -23192,4 +23197,4 @@ function AT(e) {
|
|
|
23192
23197
|
};
|
|
23193
23198
|
}
|
|
23194
23199
|
//#endregion
|
|
23195
|
-
export { sh as ApprovalBar, yC as CAPABILITIES, SC as CONTEXT_PRESETS, my as ChatDialog, Yl as ChatHeader, Ah as ChatInput, vm as CodePreview, NS as CompressDecisionSchema, vh as ConflictBar, DS as DEFAULT_SYSTEM_PROMPT, tu as FocusBar, ux as HUMAN_CONFIRM_TOOL_NAME, Dy as MIN_CONTEXT_WINDOW, bm as MessageContent, Hm as MessageList, Fm as MessageRow, Xm as QueuedBar, _S as STOP_WORDS, py as SkillPanel, DC as UNSAFE_KEYS, oT as actionsToInspectInfo, aT as actionsToTools, by as agentError, nS as analyzeContext, BC as applyPatchToClone, VC as applyPatchToLive, yy as asAgentError, OS as buildDataPrompt, kS as buildSystemPrompt, Nl as chatContextKey, zw as commitSetToBind, sS as connectMcp, x as constructLlmFromConfig, b as constructOpenLlmSync, Ml as copyText, $y as createAgent, lx as createApprovalMiddleware, Pl as createChatContext, AT as createChatSdk, bx as createCheckpointManager, xx as createCheckpointMiddleware, GS as createConflictManager, rS as createContextInspectorMiddleware, Vw as createDataOps, px as createHumanConfirmMiddleware, fx as createHumanConfirmTool, fC as createMemoryBackend, nx as createMemoryMiddleware, y as createProxyLlm, Hb as createSandboxRunner, xC as createSdkEvents, CT as createSerialRunner, gC as createSessionStore, yT as createSkillStore, Nx as createSubagentMiddleware, Ix as createSubagentsMiddleware, pT as createUsageHintsMiddleware, Lx as createVerifyMiddleware, JC as createVfs, mC as createWebStorageBackend, Ux as createWriteBackCheck, NC as deepClone, lT as defineDataToolset, Wb as defineSkill, AS as defineTool, MC as deleteByPath, PS as deriveTitle, db as describeSchemaNode, Uy as detectGarbledToolCall, WC as diffObjects, qw as domToStructure, Yw as domTools, cT as domToolsStatic, yS as estimateMessageTokens, bS as estimateRoundTokens, ky as estimateTokens, C as extractReasoningDelta, Ab as extractSchemaHint, iS as extractText, S as extractTextDelta, w as extractUsage, Uw as fetchDocTools, sT as fetchTools, Rw as filterByToolMode, fb as formatConstraints, hy as formatZodIssues, AC as getByPath, Jw as getDomTool, Qw as getEnvSummary, rb as getSchemaAtPath, eb as getSchemaTopKeys, My as getTraceMetrics, zC as hashValue, xS as indexSummarize, tT as inspectEnvTool, nT as inspectTools, FS as isChatModel, Py as isContextLengthError, tb as isPathAllowed, iC as isQuotaError, OC as isUnsafePath, pw as jpEval, _y as jsonParseError, IC as limitDepth, PC as maybeParseValue, jy as offloadPassThroughChars, Ay as offloadThresholdChars, Tb as presets, ab as projectBySchema, ib as projectBySchemaDeep, FC as projectFields, SS as recallRounds, pb as renderSchemaHint, mb as renderSchemaOverview, gb as renderSchemaShallow, bC as resolveCapabilities, wC as resolveContextOptions, vC as resolveDialogConfig, WS as resolveLlm, Oy as resolveModelCaps, _C as resolveStorage, UC as restoreInPlace, HC as restoreLive, vy as routeError, Ub as runHostScript, _w as runSandboxedScript, kC as safeMerge, Zw as safeSerialize, LC as safeStringify, hw as searchJson, uT as selectBuiltinTools, jC as setByPath, CS as shouldTriggerCompression, Eb as systemPromptHelpers, vS as tokenize, $ as toolError, nb as unwrapSchema, jl as useChat, Fl as useChatContext, e as z, gy as zodError };
|
|
23200
|
+
export { sh as ApprovalBar, yC as CAPABILITIES, SC as CONTEXT_PRESETS, my as ChatDialog, Yl as ChatHeader, Ah as ChatInput, vm as CodePreview, NS as CompressDecisionSchema, vh as ConflictBar, DS as DEFAULT_SYSTEM_PROMPT, Xv as DebugDrawer, tu as FocusBar, ux as HUMAN_CONFIRM_TOOL_NAME, Dy as MIN_CONTEXT_WINDOW, bm as MessageContent, Hm as MessageList, Fm as MessageRow, Xm as QueuedBar, _S as STOP_WORDS, py as SkillPanel, DC as UNSAFE_KEYS, oT as actionsToInspectInfo, aT as actionsToTools, by as agentError, nS as analyzeContext, BC as applyPatchToClone, VC as applyPatchToLive, yy as asAgentError, OS as buildDataPrompt, kS as buildSystemPrompt, Nl as chatContextKey, zw as commitSetToBind, sS as connectMcp, x as constructLlmFromConfig, b as constructOpenLlmSync, Ml as copyText, $y as createAgent, lx as createApprovalMiddleware, Pl as createChatContext, AT as createChatSdk, bx as createCheckpointManager, xx as createCheckpointMiddleware, GS as createConflictManager, rS as createContextInspectorMiddleware, Vw as createDataOps, px as createHumanConfirmMiddleware, fx as createHumanConfirmTool, fC as createMemoryBackend, nx as createMemoryMiddleware, y as createProxyLlm, Hb as createSandboxRunner, xC as createSdkEvents, CT as createSerialRunner, gC as createSessionStore, yT as createSkillStore, Nx as createSubagentMiddleware, Ix as createSubagentsMiddleware, pT as createUsageHintsMiddleware, Lx as createVerifyMiddleware, JC as createVfs, mC as createWebStorageBackend, Ux as createWriteBackCheck, NC as deepClone, lT as defineDataToolset, Wb as defineSkill, AS as defineTool, MC as deleteByPath, PS as deriveTitle, db as describeSchemaNode, Uy as detectGarbledToolCall, WC as diffObjects, qw as domToStructure, Yw as domTools, cT as domToolsStatic, yS as estimateMessageTokens, bS as estimateRoundTokens, ky as estimateTokens, C as extractReasoningDelta, Ab as extractSchemaHint, iS as extractText, S as extractTextDelta, w as extractUsage, Uw as fetchDocTools, sT as fetchTools, Rw as filterByToolMode, fb as formatConstraints, hy as formatZodIssues, AC as getByPath, Jw as getDomTool, Qw as getEnvSummary, rb as getSchemaAtPath, eb as getSchemaTopKeys, My as getTraceMetrics, zC as hashValue, xS as indexSummarize, tT as inspectEnvTool, nT as inspectTools, FS as isChatModel, Py as isContextLengthError, tb as isPathAllowed, iC as isQuotaError, OC as isUnsafePath, pw as jpEval, _y as jsonParseError, IC as limitDepth, PC as maybeParseValue, jy as offloadPassThroughChars, Ay as offloadThresholdChars, Tb as presets, ab as projectBySchema, ib as projectBySchemaDeep, FC as projectFields, SS as recallRounds, pb as renderSchemaHint, mb as renderSchemaOverview, gb as renderSchemaShallow, bC as resolveCapabilities, wC as resolveContextOptions, vC as resolveDialogConfig, WS as resolveLlm, Oy as resolveModelCaps, _C as resolveStorage, UC as restoreInPlace, HC as restoreLive, vy as routeError, Ub as runHostScript, _w as runSandboxedScript, kC as safeMerge, Zw as safeSerialize, LC as safeStringify, hw as searchJson, uT as selectBuiltinTools, jC as setByPath, CS as shouldTriggerCompression, Eb as systemPromptHelpers, vS as tokenize, $ as toolError, nb as unwrapSchema, jl as useChat, Fl as useChatContext, e as z, gy as zodError };
|
|
@@ -177,4 +177,4 @@ self.onmessage = async (e) => {
|
|
|
177
177
|
`):void 0}}}function dT(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(`
|
|
178
178
|
`)}}}var fT=`v:1::skill-store`,pT=`chat-sdk`;function mT(e,t,n){return`${fT}::${e}::${t}::${n}`}function hT(e,t){return`${fT}::${e}::${t}::`}function gT(e={}){let t=e.dbName??pT,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 uC(t),a(!0)}else if(n===`session`){if(typeof sessionStorage>`u`)throw Error(`sessionStorage 不可用`);i=dC(sessionStorage),a(!0)}else if(n===`local`){if(typeof localStorage>`u`)throw Error(`localStorage 不可用`);i=dC(localStorage),a(!0)}else i=lC(),a(!1)}catch{i=lC(),a(!1)}})(),{ready:o,async list(){let e=[];return await i.scan(hT(t,r),(t,n)=>{e.push(n)}),e},async get(e){return await i.get(mT(t,r,e))},async put(e){try{await i.set(mT(t,r,e.name),e)}catch(e){tC(e)&&(i=lC())}},async remove(e){let n=mT(t,r,e);return await i.get(n)==null?!1:(await i.del(n),!0)},async clear(){await i.clearPrefix(hT(t,r))},dispose(){}}}var _T=/large_results\/[^\s"'`),]+\.txt/g;function vT(e){let t=new Set,n=e=>{if(typeof e!=`string`||!e)return;let n;for(_T.lastIndex=0;(n=_T.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 yT(e,t){let n=[];for(let r of Object.keys(e))r.startsWith(`large_results/`)&&!t.has(r)&&n.push(r);return n}function bT(){let e=Promise.resolve();return function(t){let n=e.then(t,t);return e=n.then(()=>void 0,()=>void 0),n}}var xT=30,ST=new Map;function CT(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 wT(e,t,n,r){let i=0;return{name:`sdk-events`,wrapToolCall:async(t,r)=>{let i=await r(t),a=CT(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 TT(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?eb(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 ET(e,n){let i={prompt_tokens:0,completion_tokens:0,total_tokens:0},a=HS(()=>U),o=hn(0),s=mC(e.storage);e.debug&&s&&s.onEvent(e=>console.log(`[page-agent-sdk][storage]`,e));let{modelCaps:c,summaryLlmInvoke:l,titleLlmInvoke:u,compressDecisionInvoke:d}=VS(e),f=c;if(e.debug&&console.log(`[page-agent-sdk][modelCaps]`,f),f.contextWindow<2e5)throw Error(`[page-agent-sdk] 模型上下文窗口 ${f.contextWindow} 小于最小支持 ${wy}(需 ≥200K 窗口模型,如 GLM-5.2/Claude/Kimi/Qwen-1M/DeepSeek-v4)`);let p=xC(e,f.contextWindow),m=p.enableLLMSummary!==!1,h=(e.contextOptions&&e.contextOptions.preserveLastToolResults)??bC[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=GC(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=_b([],{maxPlanRevisions:e.maxPlanRevisions}),C=xb(),w=Mb({getSchema:()=>ae()?.schema}),T=Fb(),E=$b(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?_x({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=_C(e.capabilities),P=N.dataOps,ee=N.draftWrite,te=N.tracing,F=N.automation,I=ES(e),ne=P&&O?Rw(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?Fw(ne,e.toolMode):[],re=P&&O?ne.controller??null:null,ie=P&&O?.resources?.length&&re?.getResourcesSnapshot?dT({getResourcesSnapshot:()=>re?.getResourcesSnapshot?.()??[]}):void 0,ae=()=>re?.get()??O,R=new Map,oe=sT(N,L,Bw,Kw,$w);oe.forEach(e=>R.set(e.name,`builtin`));let se=[...e.tools||[]];se.forEach(e=>R.set(e.name,`user`));let z=nT(e.actions??{});z.forEach(e=>R.set(e.name,`action`));let ce=[],le=e.humanConfirm!==!1&&(!e.approval||e.approval.humanConfirmTool!==!1),ue=le?lx():null;ue&&R.set(sx,`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:
|
|
179
179
|
`+e.map(e=>`#${e.id} [${e.label??`auto`}] 消息数=${e.messageCount} 时间=${new Date(e.timestamp).toLocaleTimeString()}`).join(`
|
|
180
|
-
`):`无可用 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?eb(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(!eb(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}=cT([{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 QC)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:Ax({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?Nx(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?Px({check:e.verify.check??Bx({schemas:()=>ae()?{"":ae().schema}:{},root:()=>ae()?.bind}),adversarial:e.verify?.adversarial?{llm:e.llm,tools:Re}:void 0}):void 0,ze=je?eS({contextWindow:f.contextWindow,thresholdRatio:xC(e,f.contextWindow).summaryThresholdRatio}):void 0,Be=uT({...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:()=>TS(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=vC(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:gT({...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?CS({...p,llmInvoke:l,getRegisteredData:()=>ae()?[{description:ae().description??`主数据对象`}]:[],preserveLastToolResults:h,...V?{decideInvoke:d,getSnapshot:()=>ze?.getSnapshot()}:{}}):void 0,$e=CC([...Ve?[Ve]:[],Be,...Se?[C]:[],...xe?[S]:[],...we?[Ge=Qb(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?[ew(x)]:[],...Qe?[Qe]:[],...Ce?[T]:[],...de?[w]:[],...ie?[ie]:[],...De?[E]:[],...e.permissions?.length?[ax(e.permissions)]:[],...A&&M&&j?[vx(j)]:[],...le?[ux()]:[],...e.approval&&(e.approval.tools!==void 0||e.approval.confirm)?[ox(e.approval)]:[],...H?[H]:[],...Pe?[Pe]:[],...Fe?[Fe]:[],...He?[He]:[],...ze?[ze]:[],...e.middleware||[],...F?[eT(i,{tokenBudget:e.tokenBudget,timeBudgetMs:e.timeBudgetMs},U)]:[],wT(U,b,ae,i)]),et=e.maxMemoryRounds??xT,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=>eb(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=gy(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=gy(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=US(),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?.(vT(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())),ST.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(MS(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=MS(t)?void 0:t;if(f=Ty({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} 小于最小支持 ${wy}(需 ≥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:MS(y)?y.model??y.modelName:y.model,systemPrompt:W.agent?.getEffectiveSystemPrompt?.()??I+TS(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:ky(W.agent.spans.value)}:void 0,actions:rT(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=TT(t,`setFocus`,de,()=>ae()?.schema,e.debug);return n.ok?(w.setFocus(t),W.infoTick.value++,{ok:!0}):n},addFocus(t){let n=TT(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 vT(e)){let e=x.files[n];e&&(t[n]=e.content)}return t}function ot(){let e=yT(x.files,vT(b));for(let t of e)delete x.files[t]}function st(){let e=pS(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(vS(t,g)),i=b.indexOf(n);if(i<0)return;b[i].content=fS(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=jS(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=>iS(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=MS(e.llm)?e.llm:await v(e.llm);W.agent=Xy({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 DT(e){let t=e.id??US();e.id||console.warn(`[page-agent-sdk] 未传 options.id,已生成随机 id "${t}"。刷新后持久化数据无法恢复,请传稳定 id。`);let n=e.streaming??!0,r=e.ui??`default`,i,a=e.shareContext?ST.get(t):void 0;a?i=a:(i=ET(e,t),e.shareContext&&ST.set(t,i)),i.refCount++;let o=null,s=null,c=hC(e),l=null,u=null;async function d(a){if(await i.initDone,o){m();return}if(a!==void 0&&(e.container=a),r===!1){i.store&&(l=()=>{i.vfsStore.flush?.(),i.store.flush()},u=()=>{document.visibilityState===`hidden`&&i.store.flush()},typeof window<`u`&&window.addEventListener(`pagehide`,l),typeof document<`u`&&document.addEventListener(`visibilitychange`,u));return}let d=typeof e.container==`string`?document.querySelector(e.container):e.container;if(!d)throw Error(`createChatSdk: 挂载点未找到(${e.container})`);s=d;let g=i.agent.debugLogs;o=_l(Di({setup(){return()=>Gs(dy,{fetchStream:n?i.stream:void 0,fetchResponse:n?void 0:(e,t)=>{if(t){let e=()=>i.resolveConflict(`keep_external`);t.aborted?e():t.addEventListener(`abort`,e,{once:!0})}return i.agent.invoke(e,t)},title:c.title,placeholder:c.placeholder,debugLogs:g.value,initialMessages:i.messages,getInfo:()=>i.getInfo(),onUndo:i.checkpoint?()=>i.checkpoint.restore():void 0,canUndo:i.checkpoint?()=>i.checkpoint.canRestore():void 0,onPersist:async()=>{i.afterRound(),i.store&&await i.store.flush()},onClear:()=>i.resetSession(),pendingConflict:i.pendingConflict.value,onResolveConflict:e=>i.resolveConflict(e),infoTick:i.infoTick,getSkillContent:i.skillsController?e=>i.skillsController.getContent(e):void 0,onAddSkill:i.skillsController?e=>i.addSkill(e):void 0,onRemoveSkill:i.skillsController?e=>i.removeSkill(e):void 0,getUserSkillNames:i.skillsController?()=>i.listUserSkills():void 0,onGetSkill:i.skillsController?e=>i.getUserSkill(e):void 0,drawer:c.drawer===!0,drawerWidth:c.drawerWidth,drawerHidden:c.drawerHidden===!0,inputRows:c.inputRows,sections:c.sections,getFocus:()=>i.getFocus(),getFocuses:()=>i.getFocuses(),onSetFocus:e=>i.setFocus(e),onAddFocus:e=>i.addFocus(e),onRemoveFocus:e=>i.removeFocus(e),onClearFocus:()=>i.clearFocus(),onFocusChipClick:e=>i.emit({type:`focus_chip_click`,path:e.path,label:e.label}),onClose:c.onClose??(c.drawer===!0?()=>p():()=>f()),...i.store?{sessions:i.sessions.value,currentSessionId:i.sessionId,onNewSession:()=>{h(()=>i.switchSession())},onOpenSession:e=>{h(()=>i.switchSession(e))},onRemoveSession:async e=>{e!==i.sessionId&&(await i.store.deleteSession(t,e),await i.refreshSessions())}}:{}})}})),o.mount(d),c.drawer===!0&&c.drawerHidden===!0&&p(),i.store&&(l=()=>{i.vfsStore.flush?.(),i.store.flush()},u=()=>{document.visibilityState===`hidden`&&i.store.flush()},typeof window<`u`&&window.addEventListener(`pagehide`,l),typeof document<`u`&&document.addEventListener(`visibilitychange`,u))}function f(){i.resolveConflict(`keep_external`),l&&typeof window<`u`&&window.removeEventListener(`pagehide`,l),u&&typeof document<`u`&&document.removeEventListener(`visibilitychange`,u),l=null,u=null;let e=s?.querySelector?.(`.chat-dialog`);if(o&&e){e.classList.add(`cs-leaving`);let t=s?.querySelector?.(`.chat-mask`);t&&t.classList.add(`cs-leaving`);let n=!1,r=()=>{n||(n=!0,o?.unmount(),o=null,s=null,i.release())};e.addEventListener(`transitionend`,r,{once:!0}),setTimeout(r,320);return}o?.unmount(),o=null,s=null,i.release()}function p(){if(!o)return;let e=s?.querySelector?.(`.chat-dialog`),t=s?.querySelector?.(`.chat-mask`);e&&e.classList.add(`cs-hidden`),t&&t.classList.add(`cs-hidden`)}function m(){if(!o)return;let e=s?.querySelector?.(`.chat-dialog`),t=s?.querySelector?.(`.chat-mask`);e&&e.classList.remove(`cs-hidden`),t&&t.classList.remove(`cs-hidden`)}let h=bT();return{mount:d,unmount:f,hide:p,show:m,send:(...e)=>h(()=>i.send(...e)),batch:(...e)=>h(()=>i.batch(...e)),switchSession:(...e)=>h(()=>i.switchSession(...e)),sessions:i.sessions,async listSessions(){return i.store?i.store.listSessions(t):[]},async deleteSession(e){if(i.store){if(e===i.sessionId){console.warn(`[page-agent-sdk] deleteSession 忽略:不能删除当前会话,请先 switchSession 切到其他会话`);return}await i.store.deleteSession(t,e),await i.refreshSessions()}},get sessionId(){return i.sessionId},stream:i.stream,inspect:i.getInfo,inspectContext:()=>i.getInfo().context,getMission:i.getMission,setMission:i.setMission,getFocus:i.getFocus,getFocuses:i.getFocuses,setFocus:i.setFocus,addFocus:i.addFocus,removeFocus:i.removeFocus,clearFocus:i.clearFocus,messages:i.messages,restoreLastCheckpoint:()=>i.checkpoint?.restore()??!1,listCheckpoints:()=>i.checkpoint?.list()??[],hook:e=>(i.listeners.add(e),()=>i.listeners.delete(e)),setData:e=>{if(!i.dataOpsController){console.warn(`[page-agent-sdk] setData 忽略:dataOps 已关闭(capabilities.dataOps:false)`);return}i.dataOpsController.set(e),i.infoTick.value++},getData:()=>i.liveData(),setSkills:e=>{let t=i.skillsController;if(!t){console.warn(`[page-agent-sdk] setSkills 忽略:skills 已关闭(capabilities.skills:false)`);return}t.set(e),i.unloadSkillTools?.(),i.infoTick.value++},addSkill:e=>{if(!i.skillsController){console.warn(`[page-agent-sdk] addSkill 忽略:skills 已关闭(capabilities.skills:false)`);return}i.addSkill(e),i.unloadSkillTools?.(e.name)},removeSkill:e=>{if(!i.skillsController)return console.warn(`[page-agent-sdk] removeSkill 忽略:skills 已关闭(capabilities.skills:false)`),!1;let t=i.removeSkill(e);return t&&i.unloadSkillTools?.(e),t},listUserSkills:()=>i.listUserSkills(),getUserSkill:e=>i.getUserSkill(e),invalidateSkillCache:e=>{let t=i.skillsController;if(!t){console.warn(`[page-agent-sdk] invalidateSkillCache 忽略:skills 已关闭(capabilities.skills:false)`);return}t.invalidateCache(e),i.unloadSkillTools?.(e)},exportData:()=>{let e=i.liveData()?.bind;return e==null?null:JSON.parse(JSON.stringify(e))},importData:(e,t)=>{let n=i.liveData();if(!n||!i.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 mx(r,e),i.dataOpsController?.markDataDirty?.(),t?.emit!==!1&&i.emit({type:`data_change`,operation:`set`,value:r}),{ok:!0}},createResource:(e,t)=>{let n=i.dataOpsController;if(!n?.createResource)throw Error(`[page-agent-sdk] createResource 不可用:需配 data.resources + vfsStore(capabilities.vfs 默认开)`);return n.createResource(e,t)},getResource:e=>i.dataOpsController?.getResource?.(e),updateResource:(e,t)=>{let n=i.dataOpsController;if(!n?.updateResource)throw Error(`[page-agent-sdk] updateResource 不可用:需配 data.resources + vfsStore`);n.updateResource(e,t)},deleteResource:e=>i.dataOpsController?.deleteResource?.(e)??!1,listResources:()=>i.dataOpsController?.listResources?.()??[],releaseResources:e=>{let t=i.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:i.usage,pendingConflict:i.pendingConflict,resolveConflict:e=>i.resolveConflict(e),setTools:e=>i.setTools(e),addTool:e=>i.addTool(e),removeTool:e=>i.removeTool(e),setLlm:e=>i.setLlm(e),setMemory:e=>i.setMemory(e),refreshMemory:()=>i.refreshMemory(),setSubagents:e=>i.setSubagents(e),addSubagent:e=>i.addSubagent(e),removeSubagent:e=>i.removeSubagent(e)}}e.ApprovalBar=ih,e.CAPABILITIES=gC,e.CONTEXT_PRESETS=yC,e.ChatDialog=dy,e.ChatHeader=Kl,e.ChatInput=Dh,e.CodePreview=hm,e.CompressDecisionSchema=AS,e.ConflictBar=hh,e.DEFAULT_SYSTEM_PROMPT=wS,e.FocusBar=Ql,e.HUMAN_CONFIRM_TOOL_NAME=sx,e.MIN_CONTEXT_WINDOW=wy,e.MessageContent=_m,e.MessageList=zm,e.MessageRow=Mm,e.QueuedBar=qm,e.STOP_WORDS=mS,e.SkillPanel=uy,e.UNSAFE_KEYS=wC,e.actionsToInspectInfo=rT,e.actionsToTools=nT,e.agentError=_y,e.analyzeContext=$x,e.applyPatchToClone=LC,e.applyPatchToLive=RC,e.asAgentError=gy,e.buildDataPrompt=TS,e.buildSystemPrompt=ES,e.chatContextKey=Al,e.commitSetToBind=Iw,e.connectMcp=iS,e.constructLlmFromConfig=v,e.constructOpenLlmSync=_,e.copyText=kl,e.createAgent=Xy,e.createApprovalMiddleware=ox,e.createChatContext=jl,e.createChatSdk=DT,e.createCheckpointManager=_x,e.createCheckpointMiddleware=vx,e.createConflictManager=HS,e.createContextInspectorMiddleware=eS,e.createDataOps=Rw,e.createHumanConfirmMiddleware=ux,e.createHumanConfirmTool=lx,e.createMemoryBackend=lC,e.createMemoryMiddleware=$b,e.createProxyLlm=g,e.createSandboxRunner=zb,e.createSdkEvents=vC,e.createSerialRunner=bT,e.createSessionStore=pC,e.createSkillStore=gT,e.createSubagentMiddleware=Ax,e.createSubagentsMiddleware=Nx,e.createUsageHintsMiddleware=uT,e.createVerifyMiddleware=Px,e.createVfs=GC,e.createWebStorageBackend=dC,e.createWriteBackCheck=Bx,e.deepClone=AC,e.defineDataToolset=oT,e.defineSkill=Vb,e.defineTool=DS,e.deleteByPath=kC,e.deriveTitle=jS,e.describeSchemaNode=cb,e.detectGarbledToolCall=By,e.diffObjects=VC,e.domToStructure=Ww,e.domTools=Kw,e.domToolsStatic=aT,e.estimateMessageTokens=gS,e.estimateRoundTokens=_S,e.estimateTokens=Ey,e.extractReasoningDelta=b,e.extractSchemaHint=Db,e.extractText=tS,e.extractTextDelta=y,e.extractUsage=x,e.fetchDocTools=Bw,e.fetchTools=iT,e.filterByToolMode=Fw,e.formatConstraints=lb,e.formatZodIssues=fy,e.getByPath=DC,e.getDomTool=Gw,e.getEnvSummary=Yw,e.getSchemaAtPath=eb,e.getSchemaTopKeys=Zy,e.getTraceMetrics=ky,e.hashValue=IC,e.indexSummarize=vS,e.inspectEnvTool=Qw,e.inspectTools=$w,e.isChatModel=MS,e.isContextLengthError=jy,e.isPathAllowed=Qy,e.isQuotaError=tC,e.isUnsafePath=TC,e.jpEval=uw,e.jsonParseError=my,e.limitDepth=NC,e.maybeParseValue=jC,e.offloadPassThroughChars=Oy,e.offloadThresholdChars=Dy,e.presets=Sb,e.projectBySchema=nb,e.projectBySchemaDeep=tb,e.projectFields=MC,e.recallRounds=yS,e.renderSchemaHint=ub,e.renderSchemaOverview=db,e.renderSchemaShallow=pb,e.resolveCapabilities=_C,e.resolveContextOptions=xC,e.resolveDialogConfig=hC,e.resolveLlm=VS,e.resolveModelCaps=Ty,e.resolveStorage=mC,e.restoreInPlace=BC,e.restoreLive=zC,e.routeError=hy,e.runHostScript=Bb,e.runSandboxedScript=mw,e.safeMerge=EC,e.safeSerialize=Jw,e.safeStringify=PC,e.searchJson=fw,e.selectBuiltinTools=sT,e.setByPath=OC,e.shouldTriggerCompression=bS,e.systemPromptHelpers=Cb,e.tokenize=hS,e.toolError=$,e.unwrapSchema=$y,e.useChat=Ol,e.useChatContext=Ml,Object.defineProperty(e,"z",{enumerable:!0,get:function(){return t.z}}),e.zodError=py});
|
|
180
|
+
`):`无可用 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?eb(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(!eb(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}=cT([{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 QC)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:Ax({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?Nx(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?Px({check:e.verify.check??Bx({schemas:()=>ae()?{"":ae().schema}:{},root:()=>ae()?.bind}),adversarial:e.verify?.adversarial?{llm:e.llm,tools:Re}:void 0}):void 0,ze=je?eS({contextWindow:f.contextWindow,thresholdRatio:xC(e,f.contextWindow).summaryThresholdRatio}):void 0,Be=uT({...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:()=>TS(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=vC(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:gT({...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?CS({...p,llmInvoke:l,getRegisteredData:()=>ae()?[{description:ae().description??`主数据对象`}]:[],preserveLastToolResults:h,...V?{decideInvoke:d,getSnapshot:()=>ze?.getSnapshot()}:{}}):void 0,$e=CC([...Ve?[Ve]:[],Be,...Se?[C]:[],...xe?[S]:[],...we?[Ge=Qb(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?[ew(x)]:[],...Qe?[Qe]:[],...Ce?[T]:[],...de?[w]:[],...ie?[ie]:[],...De?[E]:[],...e.permissions?.length?[ax(e.permissions)]:[],...A&&M&&j?[vx(j)]:[],...le?[ux()]:[],...e.approval&&(e.approval.tools!==void 0||e.approval.confirm)?[ox(e.approval)]:[],...H?[H]:[],...Pe?[Pe]:[],...Fe?[Fe]:[],...He?[He]:[],...ze?[ze]:[],...e.middleware||[],...F?[eT(i,{tokenBudget:e.tokenBudget,timeBudgetMs:e.timeBudgetMs},U)]:[],wT(U,b,ae,i)]),et=e.maxMemoryRounds??xT,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=>eb(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=gy(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=gy(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=US(),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?.(vT(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())),ST.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(MS(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=MS(t)?void 0:t;if(f=Ty({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} 小于最小支持 ${wy}(需 ≥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:MS(y)?y.model??y.modelName:y.model,systemPrompt:W.agent?.getEffectiveSystemPrompt?.()??I+TS(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:ky(W.agent.spans.value)}:void 0,actions:rT(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=TT(t,`setFocus`,de,()=>ae()?.schema,e.debug);return n.ok?(w.setFocus(t),W.infoTick.value++,{ok:!0}):n},addFocus(t){let n=TT(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 vT(e)){let e=x.files[n];e&&(t[n]=e.content)}return t}function ot(){let e=yT(x.files,vT(b));for(let t of e)delete x.files[t]}function st(){let e=pS(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(vS(t,g)),i=b.indexOf(n);if(i<0)return;b[i].content=fS(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=jS(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=>iS(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=MS(e.llm)?e.llm:await v(e.llm);W.agent=Xy({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 DT(e){let t=e.id??US();e.id||console.warn(`[page-agent-sdk] 未传 options.id,已生成随机 id "${t}"。刷新后持久化数据无法恢复,请传稳定 id。`);let n=e.streaming??!0,r=e.ui??`default`,i,a=e.shareContext?ST.get(t):void 0;a?i=a:(i=ET(e,t),e.shareContext&&ST.set(t,i)),i.refCount++;let o=null,s=null,c=hC(e),l=null,u=null;async function d(a){if(await i.initDone,o){m();return}if(a!==void 0&&(e.container=a),r===!1){i.store&&(l=()=>{i.vfsStore.flush?.(),i.store.flush()},u=()=>{document.visibilityState===`hidden`&&i.store.flush()},typeof window<`u`&&window.addEventListener(`pagehide`,l),typeof document<`u`&&document.addEventListener(`visibilitychange`,u));return}let d=typeof e.container==`string`?document.querySelector(e.container):e.container;if(!d)throw Error(`createChatSdk: 挂载点未找到(${e.container})`);s=d;let g=i.agent.debugLogs;o=_l(Di({setup(){return()=>Gs(dy,{fetchStream:n?i.stream:void 0,fetchResponse:n?void 0:(e,t)=>{if(t){let e=()=>i.resolveConflict(`keep_external`);t.aborted?e():t.addEventListener(`abort`,e,{once:!0})}return i.agent.invoke(e,t)},title:c.title,placeholder:c.placeholder,debugLogs:g.value,initialMessages:i.messages,getInfo:()=>i.getInfo(),onUndo:i.checkpoint?()=>i.checkpoint.restore():void 0,canUndo:i.checkpoint?()=>i.checkpoint.canRestore():void 0,onPersist:async()=>{i.afterRound(),i.store&&await i.store.flush()},onClear:()=>i.resetSession(),pendingConflict:i.pendingConflict.value,onResolveConflict:e=>i.resolveConflict(e),infoTick:i.infoTick,getSkillContent:i.skillsController?e=>i.skillsController.getContent(e):void 0,onAddSkill:i.skillsController?e=>i.addSkill(e):void 0,onRemoveSkill:i.skillsController?e=>i.removeSkill(e):void 0,getUserSkillNames:i.skillsController?()=>i.listUserSkills():void 0,onGetSkill:i.skillsController?e=>i.getUserSkill(e):void 0,drawer:c.drawer===!0,drawerWidth:c.drawerWidth,drawerHidden:c.drawerHidden===!0,inputRows:c.inputRows,sections:c.sections,getFocus:()=>i.getFocus(),getFocuses:()=>i.getFocuses(),onSetFocus:e=>i.setFocus(e),onAddFocus:e=>i.addFocus(e),onRemoveFocus:e=>i.removeFocus(e),onClearFocus:()=>i.clearFocus(),onFocusChipClick:e=>i.emit({type:`focus_chip_click`,path:e.path,label:e.label}),onClose:c.onClose??(c.drawer===!0?()=>p():()=>f()),...i.store?{sessions:i.sessions.value,currentSessionId:i.sessionId,onNewSession:()=>{h(()=>i.switchSession())},onOpenSession:e=>{h(()=>i.switchSession(e))},onRemoveSession:async e=>{e!==i.sessionId&&(await i.store.deleteSession(t,e),await i.refreshSessions())}}:{}})}})),o.mount(d),c.drawer===!0&&c.drawerHidden===!0&&p(),i.store&&(l=()=>{i.vfsStore.flush?.(),i.store.flush()},u=()=>{document.visibilityState===`hidden`&&i.store.flush()},typeof window<`u`&&window.addEventListener(`pagehide`,l),typeof document<`u`&&document.addEventListener(`visibilitychange`,u))}function f(){i.resolveConflict(`keep_external`),l&&typeof window<`u`&&window.removeEventListener(`pagehide`,l),u&&typeof document<`u`&&document.removeEventListener(`visibilitychange`,u),l=null,u=null;let e=s?.querySelector?.(`.chat-dialog`);if(o&&e){e.classList.add(`cs-leaving`);let t=s?.querySelector?.(`.chat-mask`);t&&t.classList.add(`cs-leaving`);let n=!1,r=()=>{n||(n=!0,o?.unmount(),o=null,s=null,i.release())};e.addEventListener(`transitionend`,r,{once:!0}),setTimeout(r,320);return}o?.unmount(),o=null,s=null,i.release()}function p(){if(!o)return;let e=s?.querySelector?.(`.chat-dialog`),t=s?.querySelector?.(`.chat-mask`);e&&e.classList.add(`cs-hidden`),t&&t.classList.add(`cs-hidden`)}function m(){if(!o)return;let e=s?.querySelector?.(`.chat-dialog`),t=s?.querySelector?.(`.chat-mask`);e&&e.classList.remove(`cs-hidden`),t&&t.classList.remove(`cs-hidden`)}let h=bT();return{mount:d,unmount:f,hide:p,show:m,send:(...e)=>h(()=>i.send(...e)),batch:(...e)=>h(()=>i.batch(...e)),switchSession:(...e)=>h(()=>i.switchSession(...e)),sessions:i.sessions,async listSessions(){return i.store?i.store.listSessions(t):[]},async deleteSession(e){if(i.store){if(e===i.sessionId){console.warn(`[page-agent-sdk] deleteSession 忽略:不能删除当前会话,请先 switchSession 切到其他会话`);return}await i.store.deleteSession(t,e),await i.refreshSessions()}},get sessionId(){return i.sessionId},stream:i.stream,afterRound:i.afterRound,get debugLogs(){return i.agent.debugLogs},infoTick:i.infoTick,inspect:i.getInfo,inspectContext:()=>i.getInfo().context,getMission:i.getMission,setMission:i.setMission,getFocus:i.getFocus,getFocuses:i.getFocuses,setFocus:i.setFocus,addFocus:i.addFocus,removeFocus:i.removeFocus,clearFocus:i.clearFocus,messages:i.messages,restoreLastCheckpoint:()=>i.checkpoint?.restore()??!1,listCheckpoints:()=>i.checkpoint?.list()??[],hook:e=>(i.listeners.add(e),()=>i.listeners.delete(e)),setData:e=>{if(!i.dataOpsController){console.warn(`[page-agent-sdk] setData 忽略:dataOps 已关闭(capabilities.dataOps:false)`);return}i.dataOpsController.set(e),i.infoTick.value++},getData:()=>i.liveData(),setSkills:e=>{let t=i.skillsController;if(!t){console.warn(`[page-agent-sdk] setSkills 忽略:skills 已关闭(capabilities.skills:false)`);return}t.set(e),i.unloadSkillTools?.(),i.infoTick.value++},addSkill:e=>{if(!i.skillsController){console.warn(`[page-agent-sdk] addSkill 忽略:skills 已关闭(capabilities.skills:false)`);return}i.addSkill(e),i.unloadSkillTools?.(e.name)},removeSkill:e=>{if(!i.skillsController)return console.warn(`[page-agent-sdk] removeSkill 忽略:skills 已关闭(capabilities.skills:false)`),!1;let t=i.removeSkill(e);return t&&i.unloadSkillTools?.(e),t},listUserSkills:()=>i.listUserSkills(),getUserSkill:e=>i.getUserSkill(e),invalidateSkillCache:e=>{let t=i.skillsController;if(!t){console.warn(`[page-agent-sdk] invalidateSkillCache 忽略:skills 已关闭(capabilities.skills:false)`);return}t.invalidateCache(e),i.unloadSkillTools?.(e)},exportData:()=>{let e=i.liveData()?.bind;return e==null?null:JSON.parse(JSON.stringify(e))},importData:(e,t)=>{let n=i.liveData();if(!n||!i.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 mx(r,e),i.dataOpsController?.markDataDirty?.(),t?.emit!==!1&&i.emit({type:`data_change`,operation:`set`,value:r}),{ok:!0}},createResource:(e,t)=>{let n=i.dataOpsController;if(!n?.createResource)throw Error(`[page-agent-sdk] createResource 不可用:需配 data.resources + vfsStore(capabilities.vfs 默认开)`);return n.createResource(e,t)},getResource:e=>i.dataOpsController?.getResource?.(e),updateResource:(e,t)=>{let n=i.dataOpsController;if(!n?.updateResource)throw Error(`[page-agent-sdk] updateResource 不可用:需配 data.resources + vfsStore`);n.updateResource(e,t)},deleteResource:e=>i.dataOpsController?.deleteResource?.(e)??!1,listResources:()=>i.dataOpsController?.listResources?.()??[],releaseResources:e=>{let t=i.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:i.usage,pendingConflict:i.pendingConflict,resolveConflict:e=>i.resolveConflict(e),setTools:e=>i.setTools(e),addTool:e=>i.addTool(e),removeTool:e=>i.removeTool(e),setLlm:e=>i.setLlm(e),setMemory:e=>i.setMemory(e),refreshMemory:()=>i.refreshMemory(),setSubagents:e=>i.setSubagents(e),addSubagent:e=>i.addSubagent(e),removeSubagent:e=>i.removeSubagent(e)}}e.ApprovalBar=ih,e.CAPABILITIES=gC,e.CONTEXT_PRESETS=yC,e.ChatDialog=dy,e.ChatHeader=Kl,e.ChatInput=Dh,e.CodePreview=hm,e.CompressDecisionSchema=AS,e.ConflictBar=hh,e.DEFAULT_SYSTEM_PROMPT=wS,e.DebugDrawer=qv,e.FocusBar=Ql,e.HUMAN_CONFIRM_TOOL_NAME=sx,e.MIN_CONTEXT_WINDOW=wy,e.MessageContent=_m,e.MessageList=zm,e.MessageRow=Mm,e.QueuedBar=qm,e.STOP_WORDS=mS,e.SkillPanel=uy,e.UNSAFE_KEYS=wC,e.actionsToInspectInfo=rT,e.actionsToTools=nT,e.agentError=_y,e.analyzeContext=$x,e.applyPatchToClone=LC,e.applyPatchToLive=RC,e.asAgentError=gy,e.buildDataPrompt=TS,e.buildSystemPrompt=ES,e.chatContextKey=Al,e.commitSetToBind=Iw,e.connectMcp=iS,e.constructLlmFromConfig=v,e.constructOpenLlmSync=_,e.copyText=kl,e.createAgent=Xy,e.createApprovalMiddleware=ox,e.createChatContext=jl,e.createChatSdk=DT,e.createCheckpointManager=_x,e.createCheckpointMiddleware=vx,e.createConflictManager=HS,e.createContextInspectorMiddleware=eS,e.createDataOps=Rw,e.createHumanConfirmMiddleware=ux,e.createHumanConfirmTool=lx,e.createMemoryBackend=lC,e.createMemoryMiddleware=$b,e.createProxyLlm=g,e.createSandboxRunner=zb,e.createSdkEvents=vC,e.createSerialRunner=bT,e.createSessionStore=pC,e.createSkillStore=gT,e.createSubagentMiddleware=Ax,e.createSubagentsMiddleware=Nx,e.createUsageHintsMiddleware=uT,e.createVerifyMiddleware=Px,e.createVfs=GC,e.createWebStorageBackend=dC,e.createWriteBackCheck=Bx,e.deepClone=AC,e.defineDataToolset=oT,e.defineSkill=Vb,e.defineTool=DS,e.deleteByPath=kC,e.deriveTitle=jS,e.describeSchemaNode=cb,e.detectGarbledToolCall=By,e.diffObjects=VC,e.domToStructure=Ww,e.domTools=Kw,e.domToolsStatic=aT,e.estimateMessageTokens=gS,e.estimateRoundTokens=_S,e.estimateTokens=Ey,e.extractReasoningDelta=b,e.extractSchemaHint=Db,e.extractText=tS,e.extractTextDelta=y,e.extractUsage=x,e.fetchDocTools=Bw,e.fetchTools=iT,e.filterByToolMode=Fw,e.formatConstraints=lb,e.formatZodIssues=fy,e.getByPath=DC,e.getDomTool=Gw,e.getEnvSummary=Yw,e.getSchemaAtPath=eb,e.getSchemaTopKeys=Zy,e.getTraceMetrics=ky,e.hashValue=IC,e.indexSummarize=vS,e.inspectEnvTool=Qw,e.inspectTools=$w,e.isChatModel=MS,e.isContextLengthError=jy,e.isPathAllowed=Qy,e.isQuotaError=tC,e.isUnsafePath=TC,e.jpEval=uw,e.jsonParseError=my,e.limitDepth=NC,e.maybeParseValue=jC,e.offloadPassThroughChars=Oy,e.offloadThresholdChars=Dy,e.presets=Sb,e.projectBySchema=nb,e.projectBySchemaDeep=tb,e.projectFields=MC,e.recallRounds=yS,e.renderSchemaHint=ub,e.renderSchemaOverview=db,e.renderSchemaShallow=pb,e.resolveCapabilities=_C,e.resolveContextOptions=xC,e.resolveDialogConfig=hC,e.resolveLlm=VS,e.resolveModelCaps=Ty,e.resolveStorage=mC,e.restoreInPlace=BC,e.restoreLive=zC,e.routeError=hy,e.runHostScript=Bb,e.runSandboxedScript=mw,e.safeMerge=EC,e.safeSerialize=Jw,e.safeStringify=PC,e.searchJson=fw,e.selectBuiltinTools=sT,e.setByPath=OC,e.shouldTriggerCompression=bS,e.systemPromptHelpers=Cb,e.tokenize=hS,e.toolError=$,e.unwrapSchema=$y,e.useChat=Ol,e.useChatContext=Ml,Object.defineProperty(e,"z",{enumerable:!0,get:function(){return t.z}}),e.zodError=py});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "page-agent-sdk",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.35.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AI agent SDK for web pages — embed a chat assistant that edits page data via schema-validated tools. A lighter, framework-agnostic alternative to CopilotKit/LangChain for in-page JSON-editing agents. Vue-bundled; works with DeepSeek, OpenAI, MCP.",
|
|
6
6
|
"main": "./dist/page-agent-sdk.umd.cjs",
|
package/types/index.d.ts
CHANGED
|
@@ -312,6 +312,19 @@ export declare const QueuedBar: DefineComponent<any>;
|
|
|
312
312
|
export declare const ApprovalBar: DefineComponent<any>;
|
|
313
313
|
export declare const ConflictBar: DefineComponent<any>;
|
|
314
314
|
export declare const FocusBar: DefineComponent<any>;
|
|
315
|
+
/** DebugDrawer props(纯 props 驱动,不耦合 ChatDialog;headless 自建对话框可复用) */
|
|
316
|
+
export interface DebugDrawerProps {
|
|
317
|
+
logs?: DebugLog[];
|
|
318
|
+
visible: boolean;
|
|
319
|
+
/** 取 agent 详情(「Agent 信息」tab) */
|
|
320
|
+
getInfo?: () => AgentInfo;
|
|
321
|
+
/** 刷新 tick(watch 后重拉 getInfo;setSkills/setData 后 ++ 实时反映) */
|
|
322
|
+
infoTick?: Ref<number>;
|
|
323
|
+
/** 读 skill 全文(展开 skill 时调;返回 null 表示无内容) */
|
|
324
|
+
getSkillContent?: (name: string) => Promise<string | null>;
|
|
325
|
+
}
|
|
326
|
+
/** 调试抽屉(7 类日志筛选 / Agent 信息 / 上下文构成 / 上轮压缩 / skill 展开);v-model:visible 显隐,emit clear 清日志 */
|
|
327
|
+
export declare const DebugDrawer: DefineComponent<DebugDrawerProps>;
|
|
315
328
|
// chatContext 枢纽(L2 自建根组件调 createChatContext + provide(chatContextKey);原子组件 useChatContext inject)
|
|
316
329
|
export interface ChatContextOptions {
|
|
317
330
|
fetchResponse?: (messages: AgentMessage[], signal?: AbortSignal) => Promise<string>;
|
|
@@ -832,6 +845,12 @@ export interface ChatSdk {
|
|
|
832
845
|
/** 当前会话 id(switchSession/onClear 后实时反映;供历史列表高亮当前项) */
|
|
833
846
|
readonly sessionId: string;
|
|
834
847
|
stream: (messages: AgentMessage[], onEvent: StreamHandler, signal?: AbortSignal) => Promise<string>;
|
|
848
|
+
/** 显式持久化当前轮(headless 用 sdk.stream 时需手动调:把 messages/vfs/todos 存 store;内置 useChat 经 onPersist 自动调。storage 未开启 → no-op) */
|
|
849
|
+
afterRound(): void;
|
|
850
|
+
/** 调试日志(LLM 请求/响应/工具调用/中间件/错误;switchSession/onClear 清空;供 DebugDrawer 或外部消费) */
|
|
851
|
+
readonly debugLogs: Ref<DebugLog[]>;
|
|
852
|
+
/** Agent 信息刷新 tick(setSkills/setData/setFocus 后 ++);传给 DebugDrawer watch 后重拉 inspect() 实时反映 */
|
|
853
|
+
readonly infoTick: Ref<number>;
|
|
835
854
|
/** 检视 agent 详细信息(tools/skills/data/middleware/todos) */
|
|
836
855
|
inspect(): AgentInfo;
|
|
837
856
|
/** 读取最近一次上下文构成快照(每轮 wrapModelCall 覆盖;capabilities.contextInspector:false → undefined) */
|