page-agent-sdk 3.23.0 → 3.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -534,7 +534,7 @@ function switchTo(i: number) {
534
534
 
535
535
  ```bash
536
536
  npm test # 2377 assertions (tsx, source-level; no LLM dependency)
537
- npm run test:e2e # 737 integration assertions (node, built dist; covers APIs/options/modules/simple&complex scenes: default systemPrompt(capability overview) / dynamic register + inspect sync / inspect(tools/middleware/subagent/verify/mcp/todos/lastCompression/checkpoints reflect config) / custom tools/middleware/skills/memory injection / runtime dynamic reconfiguration(setTools/addTool/removeTool/setLlm/setMemory/setSubagents reflect) / switchSession(on/off) / shareContext on/off sharing/independent / storage backends + object config / presets(3) / checkpoint / exports complete(39+ fns/components) / util fns usable(isQuotaError/estimateTokens/jpEval/searchJson) / source=builtin / mount boundary / hook multi-listener / llm config / hide/show / error scenes)
537
+ npm run test:e2e # 742 integration assertions (node, built dist; covers APIs/options/modules/simple&complex scenes: default systemPrompt(capability overview) / dynamic register + inspect sync / inspect(tools/middleware/subagent/verify/mcp/todos/lastCompression/checkpoints reflect config) / custom tools/middleware/skills/memory injection / runtime dynamic reconfiguration(setTools/addTool/removeTool/setLlm/setMemory/setSubagents reflect) / switchSession(on/off) / shareContext on/off sharing/independent / storage backends + object config / presets(3) / checkpoint / exports complete(39+ fns/components) / util fns usable(isQuotaError/estimateTokens/jpEval/searchJson) / source=builtin / mount boundary / hook multi-listener / llm config / hide/show / error scenes)
538
538
  ```
539
539
 
540
540
  ## Local npm package test
package/README.zh-CN.md CHANGED
@@ -479,7 +479,7 @@ function switchTo(i: number) {
479
479
 
480
480
  ```bash
481
481
  npm test # 2377 项断言(tsx 源码级,不依赖 LLM)
482
- npm run test:e2e # 737 项集成断言(node 跑构建产物 dist;覆盖各 API/配置项/功能模块/简单与复杂场景:默认 systemPrompt(含能力概述) / 动态注册与 inspect 同步 / inspect(tools/middleware/subagent/verify/mcp/todos/lastCompression/checkpoints 反映配置) / 自定义 tools/middleware/skills/memory 注入 / 运行时动态重配置(setTools/addTool/removeTool/setLlm/setMemory/setSubagents 反映) / switchSession(开/未开) / shareContext 开/关共享独立 / storage 后端+对象配置 / presets 三预设 / checkpoint / 导出项完整(39+ 函数/组件) / 工具函数可用(isQuotaError/estimateTokens/jpEval/searchJson) / source=builtin / mount 边界 / hook 多监听器 / llm 配置 / 错误场景)
482
+ npm run test:e2e # 742 项集成断言(node 跑构建产物 dist;覆盖各 API/配置项/功能模块/简单与复杂场景:默认 systemPrompt(含能力概述) / 动态注册与 inspect 同步 / inspect(tools/middleware/subagent/verify/mcp/todos/lastCompression/checkpoints 反映配置) / 自定义 tools/middleware/skills/memory 注入 / 运行时动态重配置(setTools/addTool/removeTool/setLlm/setMemory/setSubagents 反映) / switchSession(开/未开) / shareContext 开/关共享独立 / storage 后端+对象配置 / presets 三预设 / checkpoint / 导出项完整(39+ 函数/组件) / 工具函数可用(isQuotaError/estimateTokens/jpEval/searchJson) / source=builtin / mount 边界 / hook 多监听器 / llm 配置 / 错误场景)
483
483
  ```
484
484
 
485
485
  ## 本地 npm 包测试
@@ -2822,7 +2822,8 @@ function Wi(e) {
2822
2822
  t({
2823
2823
  type: "tool_call",
2824
2824
  name: r.call.name,
2825
- args: r.call.args
2825
+ args: r.call.args,
2826
+ id: r.id
2826
2827
  }), L("tool_call", {
2827
2828
  round: f + 1,
2828
2829
  name: r.call.name,
@@ -2845,7 +2846,8 @@ function Wi(e) {
2845
2846
  name: r.call.name,
2846
2847
  result: o.content,
2847
2848
  status: o.status,
2848
- durationMs: s
2849
+ durationMs: s,
2850
+ id: r.id
2849
2851
  }), L("tool_result", {
2850
2852
  round: f + 1,
2851
2853
  name: r.call.name,
@@ -5050,31 +5052,33 @@ function Es(e) {
5050
5052
  signal: i,
5051
5053
  emit: a,
5052
5054
  logSink: o
5053
- }, c = (t, n, r) => (i) => {
5054
- if (i.type === "reasoning") {
5055
- r?.({
5055
+ }, c = (t, n, r, i) => (a) => {
5056
+ if (a.type === "reasoning") {
5057
+ i?.({
5056
5058
  type: "subagent",
5057
5059
  taskId: t,
5058
5060
  label: n,
5059
5061
  kind: "reasoning",
5060
5062
  name: "",
5061
- delta: i.delta
5063
+ delta: a.delta,
5064
+ toolCallId: r
5062
5065
  });
5063
5066
  return;
5064
5067
  }
5065
5068
  e.tracker?.pushStep(t, {
5066
- kind: i.type,
5067
- name: i.name,
5069
+ kind: a.type,
5070
+ name: a.name,
5068
5071
  ts: Date.now()
5069
- }), r && r({
5072
+ }), i && i({
5070
5073
  type: "subagent",
5071
5074
  taskId: t,
5072
5075
  label: n,
5073
- kind: i.type,
5074
- name: i.name,
5075
- args: i.type === "tool_call" ? i.args : void 0,
5076
- result: i.type === "tool_result" ? i.result : void 0,
5077
- status: i.type === "tool_result" ? i.status : void 0
5076
+ kind: a.type,
5077
+ name: a.name,
5078
+ args: a.type === "tool_call" ? a.args : void 0,
5079
+ result: a.type === "tool_result" ? a.result : void 0,
5080
+ status: a.type === "tool_result" ? a.status : void 0,
5081
+ toolCallId: r
5078
5082
  });
5079
5083
  };
5080
5084
  return {
@@ -5094,7 +5098,7 @@ function Es(e) {
5094
5098
  prompt: t,
5095
5099
  role: n,
5096
5100
  model: a
5097
- }, d, l.signal, c(f, p, l.emit), m, l.emit);
5101
+ }, d, l.signal, c(f, p, l.toolCallId, l.emit), m, l.emit);
5098
5102
  return e.tracker?.finish(f, "done", r), r;
5099
5103
  } catch (t) {
5100
5104
  throw e.tracker?.finish(f, "error", String(t?.message ?? t)), t;
@@ -5118,7 +5122,7 @@ function Es(e) {
5118
5122
  }), s = Date.now();
5119
5123
  e.tracker?.start(r, t.prompt, a, s);
5120
5124
  try {
5121
- let n = await Ts(t, e, i.signal, c(r, a, i.emit), o, i.emit);
5125
+ let n = await Ts(t, e, i.signal, c(r, a, i.toolCallId, i.emit), o, i.emit);
5122
5126
  return e.tracker?.finish(r, "done", n ?? "(未完成)"), {
5123
5127
  ok: !0,
5124
5128
  text: n ?? "(未完成)"
@@ -5144,7 +5148,8 @@ function Es(e) {
5144
5148
  __pgSubagentCall: {
5145
5149
  signal: e.signal ?? i,
5146
5150
  emit: e.emit ?? a,
5147
- logSink: e.logSink ?? o
5151
+ logSink: e.logSink ?? o,
5152
+ toolCallId: e.id
5148
5153
  }
5149
5154
  }, t(e))
5150
5155
  };
@@ -5183,27 +5188,29 @@ function ks(e, n) {
5183
5188
  signal: i,
5184
5189
  emit: a,
5185
5190
  logSink: o
5186
- }, c = (e, t, n) => (r) => {
5187
- if (r.type === "reasoning") {
5188
- n?.({
5191
+ }, c = (e, t, n, r) => (i) => {
5192
+ if (i.type === "reasoning") {
5193
+ r?.({
5189
5194
  type: "subagent",
5190
5195
  taskId: e,
5191
5196
  label: t,
5192
5197
  kind: "reasoning",
5193
5198
  name: "",
5194
- delta: r.delta
5199
+ delta: i.delta,
5200
+ toolCallId: n
5195
5201
  });
5196
5202
  return;
5197
5203
  }
5198
- n && n({
5204
+ r && r({
5199
5205
  type: "subagent",
5200
5206
  taskId: e,
5201
5207
  label: t,
5202
- kind: r.type,
5203
- name: r.name,
5204
- args: r.type === "tool_call" ? r.args : void 0,
5205
- result: r.type === "tool_result" ? r.result : void 0,
5206
- status: r.type === "tool_result" ? r.status : void 0
5208
+ kind: i.type,
5209
+ name: i.name,
5210
+ args: i.type === "tool_call" ? i.args : void 0,
5211
+ result: i.type === "tool_result" ? i.result : void 0,
5212
+ status: i.type === "tool_result" ? i.status : void 0,
5213
+ toolCallId: n
5207
5214
  });
5208
5215
  }, l = [], u = [], d;
5209
5216
  function f(e) {
@@ -5241,7 +5248,7 @@ function ks(e, n) {
5241
5248
  if (!e.ok) return g("conflict", { heldBy: e.heldBy }), `COMPONENT_BUSY · 组件 [${h.join(", ")}] 正在被子 agent(${e.heldBy})修改,本次委派未执行。同一组件同一时间只能有一个委派在途;请先做其他组件,或等该委派结束后(下一轮)再重试本组件。`;
5242
5249
  m = e.release, g("acquire");
5243
5250
  }
5244
- let _ = c(`use_${l.id}`, l.id, i.emit), v = u ? (e) => {
5251
+ let _ = c(`use_${l.id}`, l.id, i.toolCallId, i.emit), v = u ? (e) => {
5245
5252
  e.type !== "reasoning" && u.pushStep(d, {
5246
5253
  kind: e.type,
5247
5254
  name: e.name,
@@ -5307,7 +5314,8 @@ function ks(e, n) {
5307
5314
  __pgSubagentCall: {
5308
5315
  signal: e.signal ?? i,
5309
5316
  emit: e.emit ?? a,
5310
- logSink: e.logSink ?? o
5317
+ logSink: e.logSink ?? o,
5318
+ toolCallId: e.id
5311
5319
  }
5312
5320
  }, t(e))
5313
5321
  };
@@ -11711,19 +11719,28 @@ function Qd(e = {}) {
11711
11719
  t.steps.push({
11712
11720
  name: e.name,
11713
11721
  args: e.args,
11714
- status: "running"
11722
+ status: "running",
11723
+ id: e.id
11715
11724
  });
11716
11725
  break;
11717
- case "tool_result":
11718
- for (let n = t.steps.length - 1; n >= 0; n--) if (t.steps[n].name === e.name && t.steps[n].status === "running") {
11719
- t.steps[n].result = e.result, t.steps[n].status = e.status, t.steps[n].durationMs = e.durationMs;
11720
- let r = t.steps[n].subReason;
11721
- r && r.length > 80 && (t.steps[n].subReason = r.slice(0, 80) + "…");
11722
- break;
11726
+ case "tool_result": {
11727
+ let n = -1;
11728
+ if (e.id !== void 0 && (n = t.steps.findIndex((t) => t.id === e.id)), n < 0) {
11729
+ for (let r = t.steps.length - 1; r >= 0; r--) if (t.steps[r].name === e.name && t.steps[r].status === "running") {
11730
+ n = r;
11731
+ break;
11732
+ }
11733
+ }
11734
+ if (n >= 0) {
11735
+ let r = t.steps[n];
11736
+ r.result = e.result, r.status = e.status, r.durationMs = e.durationMs;
11737
+ let i = r.subReason;
11738
+ i && i.length > 80 && (r.subReason = i.slice(0, 80) + "…");
11723
11739
  }
11724
11740
  break;
11741
+ }
11725
11742
  case "subagent": {
11726
- let n = t.steps[t.steps.length - 1];
11743
+ let n = e.toolCallId === void 0 ? t.steps[t.steps.length - 1] : t.steps.find((t) => t.id === e.toolCallId);
11727
11744
  if (!n) break;
11728
11745
  if (e.kind === "reasoning") {
11729
11746
  let t = e.delta || "";
@@ -150,7 +150,7 @@ Actual: `+e.attribValue);else{var i=e.tag,a=e.tags[e.tags.length-1]||e;i.ns===a.
150
150
 
151
151
  `):null}function oJ(e,t){return e.reduceRight((e,t)=>n=>t.wrapModelCall?t.wrapModelCall(n,e):e(n),t)}function sJ(e,t){return e.reduceRight((e,t)=>n=>t.wrapToolCall?t.wrapToolCall(n,e):e(n),t)}function cJ(e){return e?/<|tool_calls|>|<||[^>]*tool_call|<||?DSML|<||?tool[_a-z]*|?>|<invoke\s+name=|<\/?tool_call>|<function_call>/i.test(e):!1}function lJ(e){if(!e)return``;let t=e.search(/<|tool_calls|>|<||[^>]*tool_call|<||?DSML|<||?tool[_a-z]*|?>|<function_call>|<invoke\s+name=/i);return(t>=0?e.slice(0,t):e).trim()}var uJ=/(我先|让我先|我先看|先看看|先了解|先加载|先查阅|稍后|接下来我|我将先|等我|查完.{0,12}再|看完.{0,12}再|了解.{0,8}再)/,dJ=/(已完成|已生成|已修改|已创建|已添加|已删除|已更新|已调整|已处理|已委派|已配置|已切换|成功|完成[。!?]|搞定了|做好了)/;function fJ(e){if(!e)return!1;let t=e.trim();return t.length>160||dJ.test(t)?!1:uJ.test(t)}var pJ=/<|tool_calls|>|<||[^>]*tool_call|<||?DSML|<||?tool[_a-z]*|?>/i;function mJ(e){return e.replace(/```[\w-]*\n?[\s\S]*?```/g,``)}function hJ(e){if(!e||!cJ(e))return null;let t=mJ(e);if(!pJ.test(t))return null;t=t.replace(/<|(?!|)[^|<>]*?|>/g,``);let n=/<(?:||?DSML||?)?\s*invoke\s+name=["']([^"']+)["'][^>]*>/gi,r=[],i;for(;(i=n.exec(t))!==null;)r.push({name:i[1],tagStart:i.index,after:n.lastIndex});if(!r.length)return null;let a=/<\/?\s*(?:||?DSML||?)?\/?\s*invoke\s*>/i,o=/<(?:||?DSML||?)?\s*parameter\s+name=["']([^"']+)["'][^>]*>([\s\S]*?)<\/?\s*(?:||?DSML||?)?\/?\s*parameter\s*>/gi,s=/<(?:||?DSML||?)?\s*parameter\s+name=["'][^"']+["'][^>]*>/gi,c=/<\/?\s*(?:||?DSML||?)?\/?\s*parameter\s*>/gi,l=[];for(let e=0;e<r.length;e++){let n=e+1<r.length?r[e+1].tagStart:t.length,i=t.slice(r[e].after,n),u=i.match(a);if(u&&u.index!==void 0&&(i=i.slice(0,u.index)),(i.match(s)||[]).length>(i.match(c)||[]).length)continue;let d={};o.lastIndex=0;let f;for(;(f=o.exec(i))!==null;)d[f[1]]=gJ(f[2].trim());l.push({id:`dsml_${e}_${Date.now().toString(36)}`,name:r[e].name,args:d})}return l.length?l:null}function gJ(e){if(e===`true`)return!0;if(e===`false`)return!1;if(e===`null`)return null;try{return JSON.parse(e)}catch{return e}}var _J=10,vJ=300,yJ=6e3;function bJ(e,t){let n=e=>Bq(typeof e.content==`string`?e.content:JSON.stringify(e.content)),r=e.reduce((e,t)=>e+n(t),0);if(r<=t)return e;let i=0,a=r-t,o=Math.max(100,Math.min(400,Math.round(t/500))),s=e.map(e=>{if(i>=a||!(e instanceof yS))return e;let t=typeof e.content==`string`?e.content:JSON.stringify(e.content);if(t.length<=400)return e;let n=`…[已自动压缩 ${t.length} 字符,保留首 ${o}]\n`+t.slice(0,o);return i+=Bq(t)-Bq(n),new yS({tool_call_id:e.tool_call_id,content:n})}),c=s.reduce((e,t)=>e+n(t),0);return c>t&&console.warn(`[page-agent-sdk] trim 后仍超窗口:${c} > ${t} tokens(系统段/历史超预算,见 Phase 5/P3)`),s}function xJ(e,t){return t??Math.max(e*3,30)}var SJ=new Set([`write`,`set_data`,`edit_data`,`delete_data`,`draft_commit`]);function CJ(e){if(!e||typeof e!=`object`)return``;let t=e;if(typeof t.jsonPath==`string`)return t.jsonPath;let n=t.patch;if(n&&typeof n.jsonPath==`string`)return n.jsonPath;let r=t.patches;return Array.isArray(r)&&r.length&&r[0]&&typeof r[0].jsonPath==`string`?r[0].jsonPath:``}function wJ(e){let{apiKey:t,baseUrl:n,model:r=`gpt-3.5-turbo`,temperature:i=.7,maxTokens:a,extraBody:o,extraConfig:s,systemPrompt:c,tools:l=[],middleware:u=[],maxToolRounds:d,maxIterations:f,maxRetries:p=2,retryDelayMs:m=500,stallMs:h=Zq,maxParallelTools:g=1,maxVerifyAttempts:_=0,roundTokenBudget:v=0,onLog:y,onSpan:b,onTrace:x,onLlmChange:S,debug:C=!1}=e,w=d??_J;(!Number.isFinite(w)||w<1)&&(console.warn(`[page-agent-sdk] maxToolRounds=${w} 非法(须 ≥1 正整数),已 clamp 到 1(0/负数致主循环 while 不进 → agent 不调 LLM 静默返回兜底文案)`),w=1),g>1&&console.warn(`[page-agent-sdk] maxParallelTools=${g}:并发工具下 dataOps 写工具不互锁(同轮并发两写都在 await handleConflict 让出前取旧基线 → 均通过乐观锁 → 后写覆盖前写,无 VERSION_CONFLICT 回灌);如需精确乐观锁保持 maxParallelTools=1 或写时显式传 expectedHash`);let T=zq({model:r,contextWindow:e.contextWindow,maxOutputTokens:e.maxOutputTokens}),ee=a??T.maxOutputTokens,E=Vq(T.contextWindow),te=Hq(T.contextWindow);function ne(e){T=e,E=Vq(T.contextWindow),te=Hq(T.contextWindow)}let D=oH([]);function re(e,t){let n={timestamp:Date.now(),type:e,data:t};D.value.push(n),D.value.length>vJ&&D.value.splice(0,D.value.length-vJ),cH(D),y?.(n),C&&console.log(`%c[Agent] ${e}`,`color:#667eea;font-weight:bold`,t)}let O=e=>{D.value.push(e),D.value.length>vJ&&D.value.splice(0,D.value.length-vJ),cH(D)},ie=oH([]),k=0,ae=!!b||!!x;function A(e,t,n,r={}){if(!ae)return null;let i={id:`span-${++k}`,parentId:e,name:n,type:t,startTs:Date.now(),status:`ok`,attributes:r};return ie.value.push(i),ie.value.length>vJ&&ie.value.splice(0,ie.value.length-vJ),cH(ie),i}function oe(e,t=`ok`,n){!e||!ae||(e.endTs=Date.now(),e.durationMs=e.endTs-e.startTs,e.status=t,n&&Object.assign(e.attributes,n),cH(ie),b?.(e))}let se=[...u.flatMap(e=>e.tools||[]),...l],ce=e.llm??new nB({apiKey:t,model:r,temperature:i,maxTokens:ee,configuration:{...n?{baseURL:oB(n)}:{},fetch:aB,...s},...o?{modelKwargs:o}:{}}),le=se.length>0?ce.bindTools?.(se)??ce:ce;function ue(){le=se.length>0?ce.bindTools?.(se)??ce:ce}let de=Wq(),fe=.25,pe=new Set([`mission`,`workingMemory`]);function me(){let e=c||`你是一个智能助手。`,t=[];for(let e of u)if(e.augmentPrompt){let n=e.augmentPrompt(de);n&&t.push({name:e.name,text:n,tokens:Bq(n),pin:pe.has(e.name)})}let n=Math.max(2e3,Math.round(T.contextWindow*fe)),r=Bq(e)+t.reduce((e,t)=>e+t.tokens,0);if(r>n){let e=r,i=[];for(let e of t.filter(e=>!e.pin).sort((e,t)=>t.tokens-e.tokens)){if(r<=n)break;i.push(`${e.name}(${e.tokens})`),r-=e.tokens,e.text=``}i.length&&console.warn(`[page-agent-sdk] 系统段超预算(${e} > ${n} tokens,窗口 ${T.contextWindow} 的 ${fe*100}%),drop 非核心段:${i.join(`, `)}(保 base/mission/workingMemory)`)}return[e,...t.filter(e=>e.text).map(e=>e.text)].join(`
152
152
 
153
- `)}function he(e){let t=[new nC(me())];for(let n of e)n.role===`user`?t.push(new $S(n.content)):n.role===`assistant`?t.push(new hC(n.content)):n.role===`system`&&t.push(new nC(n.content));return t}function ge(e){let t=e[0]&&ye(e[0])===`system`?e.slice(1):e.slice();return[new nC(me()),...t]}async function _e(e,t,n,r){let i=r??le,a={signal:n,maxRetries:p,baseDelayMs:m,onRetry:({attempt:e,error:t,waitMs:n})=>{let r=t?.message??String(t);re(`error`,{stage:`model_retry`,attempt:e,waitMs:n,error:r}),console.warn(`[Agent] 模型调用失败,第 ${e}/${p} 次重试(等 ${n}ms):${r}`)}},o=new AbortController;n&&(n.aborted?o.abort():n.addEventListener(`abort`,()=>o.abort(),{once:!0}));let s;try{let t;try{s=await Yq(()=>{clearTimeout(t);let n=h>0?h:Zq,r=i.stream(e.messages,{signal:o.signal});return h>0?Promise.race([r,new Promise((e,r)=>{t=setTimeout(()=>r(new Xq(n)),n)})]):r},a)}finally{clearTimeout(t)}}catch(i){if(Gq(i,n))return{message:new hC(``),toolCalls:[],content:``,aborted:!0};if($q(i)&&!e._ctxRetry){e._ctxRetry=!0;let i=e=>Bq(typeof e.content==`string`?e.content:JSON.stringify(e.content)),a=e.messages.reduce((e,t)=>e+i(t),0),o=be(e.messages,Math.round(T.contextWindow*.3)),s=o.reduce((e,t)=>e+i(t),0);return re(`error`,{stage:`context_overflow_retry`,at:`launch`,beforeTokens:a,afterTokens:s,window:T.contextWindow}),console.warn(`[page-agent-sdk] 上下文超限(启动)→ 激进 trim 重试:${a} → ${s} tokens`),_e({...e,messages:o},t,n,r)}throw i}if(!s)return{message:new hC(``),toolCalls:[],content:``,aborted:!0};let c=null,l=``;try{for await(let e of Qq(s,h)){c=c?c.concat(e):e;let n=lB(e);n&&t&&(l+=n,t({type:`text`,delta:n}));let r=uB(e);r&&t&&t({type:`reasoning`,delta:r})}}catch(i){if(i instanceof Xq)throw o.abort(),re(`error`,{stage:`stream_stalled`,waitedMs:i.waitedMs,stallMs:h}),i;if(Gq(i,n))return{message:c??new hC(l),toolCalls:[],content:l,aborted:!0};if($q(i)&&c===null&&l===``&&!e._ctxRetry){e._ctxRetry=!0;let i=e=>Bq(typeof e.content==`string`?e.content:JSON.stringify(e.content)),a=e.messages.reduce((e,t)=>e+i(t),0),o=be(e.messages,Math.round(T.contextWindow*.3)),s=o.reduce((e,t)=>e+i(t),0);return re(`error`,{stage:`context_overflow_retry`,beforeTokens:a,afterTokens:s,window:T.contextWindow}),console.warn(`[page-agent-sdk] 上下文超限 → 激进 trim 重试:${a} → ${s} tokens(窗口 ${T.contextWindow})`),_e({...e,messages:o},t,n,r)}throw i}let u=c;return{message:u,toolCalls:u.tool_calls||[],content:l}}async function ve(e){let t=se.find(t=>t.name===e.name);if(!t)return{content:`工具 "${e.name}" 不存在`,status:`error`};try{let n={__pgDataScope:``,...e.callConfig??{}},r=await t.invoke(e.args,{configurable:n}),i=typeof r==`string`?r:JSON.stringify(r);return i=Pq(i,{files:e.state.files,vfsAvailable:se.some(e=>e.name===`vfs_read`),toolName:e.name,threshold:E,passThroughChars:te}).content,{content:i,status:`done`}}catch(e){return{content:`工具执行出错:${Aq(e,`recoverable`).message}`,status:`error`}}}function ye(e){return e instanceof $S?`human`:e instanceof hC?`ai`:e instanceof nC?`system`:e instanceof yS?`tool`:`unknown`}function be(e,t){return bJ(e,t)}function j(e){return!C&&!y?[]:e.map(e=>{let t=ye(e),n={role:t===`human`?`user`:t===`ai`?`assistant`:t},r=typeof e.content==`string`?e.content:JSON.stringify(e.content);r&&(n.content=r.length>yJ?r.slice(0,yJ)+`…(截断 ${r.length-yJ} 字符)`:r);let i=e.tool_calls;Array.isArray(i)&&i.length&&(n.tool_calls=i.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:typeof e.args==`string`?e.args:JSON.stringify(e.args)}})));let a=e.tool_call_id;return a&&(n.tool_call_id=a),n})}async function xe(e,t,n){D.value=[],ie.value=[],k=0,de=Wq(),de.messages=e,de=await tJ(u,de);let i=e;for(let e of u)if(e.compressInput){let t=A(void 0,`compression`,`compress:${e.name}`,{}),n=await e.compressInput(i);i=Array.isArray(n)?n:n.messages,n&&!Array.isArray(n)&&n.stats?(de={...de,lastCompression:n.stats},oe(t,`ok`,{stats:n.stats})):oe(t)}{let e=Bq(c||`你是一个智能助手。`),n=Math.max(2e3,Math.round(T.contextWindow*fe));if(e>n){let r=`[page-agent-sdk] systemPrompt 本身(${e} tokens)超过系统段预算(${n} tokens,窗口 ${T.contextWindow} 的 ${fe*100}%);请缩减 systemPrompt 或换更大窗口模型`;return console.error(r),t({type:`error`,message:r,severity:`fatal`,code:`SYSTEM_PROMPT_OVER_BUDGET`}),t({type:`done`,content:``}),``}}let a=he(i);re(`context`,{model:r,tools:se.map(e=>e.name),middleware:u.map(e=>e.name)});let o=oJ(u,e=>_e(e,t,n)),s=sJ(u,ve),l={rounds:0,maxToolRounds:w,invokeUsage:{prompt_tokens:0,completion_tokens:0,total_tokens:0},writeFailures:{},budgetHinted:!1};de.loopProgress=l;let d=0,p=0,m=xJ(w,f),h=null,y=0,b=!1,S=0;try{for(;(d<w||b)&&p<m&&(p++,!n?.aborted);){if(v>0&&l.invokeUsage.total_tokens>v){let e=`本轮 token 预算(约 ${v})已用尽:任务在 ${d} 轮工具调用后中断,已完成的部分均保留。可继续对话,指定下一步(如「继续完成」/「只改 X」/「提高预算重试」)。`;return re(`error`,{stage:`round_token_budget_exceeded`,used:l.invokeUsage.total_tokens,budget:v,rounds:d}),t({type:`error`,message:e,severity:`observable`,code:`ROUND_TOKEN_BUDGET_EXCEEDED`,context:{used:l.invokeUsage.total_tokens,budget:v}}),t({type:`done`,content:e}),e}let e=A(void 0,`round`,`round ${p}`,{round:p})?.id;t({type:`round_start`,round:p}),de=nJ(u,{messages:a,state:de}),a=ge(a),a=be(a,Math.round(T.contextWindow*.6));let i=A(e,`model`,r,{round:d+1,tools:se.map(e=>e.name)});re(`llm_request`,{round:d+1,model:r,tools:se.map(e=>e.name),messages:j(a)});let c=await o({messages:a,state:de});a.push(c.message),re(`llm_response`,{round:d+1,content:c.content,toolCalls:c.toolCalls}),oe(i,c.aborted?`timeout`:`ok`,{usage:dB(c.message)});{let e=fB(c.message);e&&(l.invokeUsage.prompt_tokens+=e.prompt_tokens??0,l.invokeUsage.completion_tokens+=e.completion_tokens??0,l.invokeUsage.total_tokens+=e.total_tokens??0)}if(de=rJ(u,c,de),c.aborted)return t({type:`done`,content:c.content}),c.content;if(!c.toolCalls.length){let e=cJ(c.content),n=e?hJ(c.content):null;if(n&&n.length){c.toolCalls=n;let e=c.message;e&&(e.tool_calls=n.map(e=>({id:e.id,name:e.name,args:e.args,type:`tool_call`}))),re(`middleware`,{stage:`dsml_parsed`,count:n.length,names:n.map(e=>e.name)})}else{if(e&&y<2){y+=1,b=!0,re(`middleware`,{stage:`format_retry`,attempt:y,content:c.content.slice(0,200)}),a.push(new $S(`⚠️ 你刚才把工具调用写成了文本(伪 XML/标签/DSML 标记,如 <|tool_calls|>、<||DSML||>、<invoke name=...>),未被系统识别为工具调用,因此未执行,页面无变化。请直接用标准 function calling(工具调用)格式重新发起工具调用,不要在回复正文里输出这些标签或 JSON 文本。`));continue}if(e&&(re(`error`,{stage:`garbled_exhausted`,retries:y,content:c.content.slice(0,200)}),t({type:`error`,message:`模型连续 2 次输出无法解析的工具调用格式(DSML/伪标签),任务可能未完成。请重试或换模型。`,severity:`observable`,code:`GARBLED_TOOL_CALL_EXHAUSTED`,context:{content:c.content.slice(0,200)}})),!e&&d>0&&S<2&&fJ(c.content)){S+=1,b=!0,re(`middleware`,{stage:`transitional_retry`,attempt:S,content:c.content.slice(0,160)}),a.push(new $S(`⚠️ 你刚才输出的是计划/过渡性表述(如「我先看看」「稍后委派」),任务尚未完成。请立即继续执行 —— 调用所需工具把任务做完,全部完成后再给出总结回复。`));continue}if(!e&&_>0&&de.verifyAttempts<_){let e=await aJ(u,{messages:a,state:de,response:c,log:(e,t)=>re(e,t)});if(e){h=c.content,de.verifyAttempts+=1,a.push(new $S(`⚠️ 验证未通过,请修正:${e}`)),re(`middleware`,{stage:`verify_retry`,attempt:de.verifyAttempts,feedback:e});continue}}b=!1;let n=c.content;if(e){let e=lJ(n);n=e?`${e}\n\n(注:此后模型输出了无法解析的工具调用文本,该调用未执行,任务可能未完成。)`:`模型多次输出无法解析的工具调用格式,本次任务可能未完成。请重试或继续指示。`}return t({type:`done`,content:n}),n}}b=!1;let f=c.toolCalls.map(e=>{let r=e.id||`call_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return{id:r,call:e,ctx:{id:r,name:e.name,args:e.args,state:de,signal:n,emit:t,logSink:O}}}),m=await Fq(f,g,async r=>{if(n?.aborted)return;let i=A(e,`tool`,r.call.name,{name:r.call.name}),a=Date.now();t({type:`tool_call`,name:r.call.name,args:r.call.args}),re(`tool_call`,{round:d+1,name:r.call.name,args:r.call.args,id:r.id});let o;try{o=await s(r.ctx)}catch(e){if(Gq(e,n))throw e;o={content:`工具执行出错:${Aq(e,`recoverable`).message}`,status:`error`}}let c=Date.now()-a;return t({type:`tool_result`,name:r.call.name,result:o.content,status:o.status,durationMs:c}),re(`tool_result`,{round:d+1,name:r.call.name,result:o.content,status:o.status,durationMs:c}),oe(i,o.status===`error`?`error`:`ok`,{resultSnippet:String(o.content).slice(0,100)}),o},n);for(let e=0;e<f.length;e++){let t=m[e];t&&a.push(new yS({tool_call_id:f[e].id,content:t.content}))}for(let e=0;e<f.length;e++){let t=m[e];if(!t||!SJ.has(f[e].call.name))continue;let n=CJ(f[e].call.args);t.status===`error`?l.writeFailures[n]=(l.writeFailures[n]??0)+1:delete l.writeFailures[n]}if(n?.aborted)break;d++,l.rounds=d}if(n?.aborted)return t({type:`done`,content:``}),``;if(h!=null)return t({type:`done`,content:h}),h;let e=a[a.length-1];if(e&&ye(e)===`tool`){let e=a[0]&&ye(a[0])===`system`?a.slice(1):a.slice(),i=[new nC(me()+`
153
+ `)}function he(e){let t=[new nC(me())];for(let n of e)n.role===`user`?t.push(new $S(n.content)):n.role===`assistant`?t.push(new hC(n.content)):n.role===`system`&&t.push(new nC(n.content));return t}function ge(e){let t=e[0]&&ye(e[0])===`system`?e.slice(1):e.slice();return[new nC(me()),...t]}async function _e(e,t,n,r){let i=r??le,a={signal:n,maxRetries:p,baseDelayMs:m,onRetry:({attempt:e,error:t,waitMs:n})=>{let r=t?.message??String(t);re(`error`,{stage:`model_retry`,attempt:e,waitMs:n,error:r}),console.warn(`[Agent] 模型调用失败,第 ${e}/${p} 次重试(等 ${n}ms):${r}`)}},o=new AbortController;n&&(n.aborted?o.abort():n.addEventListener(`abort`,()=>o.abort(),{once:!0}));let s;try{let t;try{s=await Yq(()=>{clearTimeout(t);let n=h>0?h:Zq,r=i.stream(e.messages,{signal:o.signal});return h>0?Promise.race([r,new Promise((e,r)=>{t=setTimeout(()=>r(new Xq(n)),n)})]):r},a)}finally{clearTimeout(t)}}catch(i){if(Gq(i,n))return{message:new hC(``),toolCalls:[],content:``,aborted:!0};if($q(i)&&!e._ctxRetry){e._ctxRetry=!0;let i=e=>Bq(typeof e.content==`string`?e.content:JSON.stringify(e.content)),a=e.messages.reduce((e,t)=>e+i(t),0),o=be(e.messages,Math.round(T.contextWindow*.3)),s=o.reduce((e,t)=>e+i(t),0);return re(`error`,{stage:`context_overflow_retry`,at:`launch`,beforeTokens:a,afterTokens:s,window:T.contextWindow}),console.warn(`[page-agent-sdk] 上下文超限(启动)→ 激进 trim 重试:${a} → ${s} tokens`),_e({...e,messages:o},t,n,r)}throw i}if(!s)return{message:new hC(``),toolCalls:[],content:``,aborted:!0};let c=null,l=``;try{for await(let e of Qq(s,h)){c=c?c.concat(e):e;let n=lB(e);n&&t&&(l+=n,t({type:`text`,delta:n}));let r=uB(e);r&&t&&t({type:`reasoning`,delta:r})}}catch(i){if(i instanceof Xq)throw o.abort(),re(`error`,{stage:`stream_stalled`,waitedMs:i.waitedMs,stallMs:h}),i;if(Gq(i,n))return{message:c??new hC(l),toolCalls:[],content:l,aborted:!0};if($q(i)&&c===null&&l===``&&!e._ctxRetry){e._ctxRetry=!0;let i=e=>Bq(typeof e.content==`string`?e.content:JSON.stringify(e.content)),a=e.messages.reduce((e,t)=>e+i(t),0),o=be(e.messages,Math.round(T.contextWindow*.3)),s=o.reduce((e,t)=>e+i(t),0);return re(`error`,{stage:`context_overflow_retry`,beforeTokens:a,afterTokens:s,window:T.contextWindow}),console.warn(`[page-agent-sdk] 上下文超限 → 激进 trim 重试:${a} → ${s} tokens(窗口 ${T.contextWindow})`),_e({...e,messages:o},t,n,r)}throw i}let u=c;return{message:u,toolCalls:u.tool_calls||[],content:l}}async function ve(e){let t=se.find(t=>t.name===e.name);if(!t)return{content:`工具 "${e.name}" 不存在`,status:`error`};try{let n={__pgDataScope:``,...e.callConfig??{}},r=await t.invoke(e.args,{configurable:n}),i=typeof r==`string`?r:JSON.stringify(r);return i=Pq(i,{files:e.state.files,vfsAvailable:se.some(e=>e.name===`vfs_read`),toolName:e.name,threshold:E,passThroughChars:te}).content,{content:i,status:`done`}}catch(e){return{content:`工具执行出错:${Aq(e,`recoverable`).message}`,status:`error`}}}function ye(e){return e instanceof $S?`human`:e instanceof hC?`ai`:e instanceof nC?`system`:e instanceof yS?`tool`:`unknown`}function be(e,t){return bJ(e,t)}function j(e){return!C&&!y?[]:e.map(e=>{let t=ye(e),n={role:t===`human`?`user`:t===`ai`?`assistant`:t},r=typeof e.content==`string`?e.content:JSON.stringify(e.content);r&&(n.content=r.length>yJ?r.slice(0,yJ)+`…(截断 ${r.length-yJ} 字符)`:r);let i=e.tool_calls;Array.isArray(i)&&i.length&&(n.tool_calls=i.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:typeof e.args==`string`?e.args:JSON.stringify(e.args)}})));let a=e.tool_call_id;return a&&(n.tool_call_id=a),n})}async function xe(e,t,n){D.value=[],ie.value=[],k=0,de=Wq(),de.messages=e,de=await tJ(u,de);let i=e;for(let e of u)if(e.compressInput){let t=A(void 0,`compression`,`compress:${e.name}`,{}),n=await e.compressInput(i);i=Array.isArray(n)?n:n.messages,n&&!Array.isArray(n)&&n.stats?(de={...de,lastCompression:n.stats},oe(t,`ok`,{stats:n.stats})):oe(t)}{let e=Bq(c||`你是一个智能助手。`),n=Math.max(2e3,Math.round(T.contextWindow*fe));if(e>n){let r=`[page-agent-sdk] systemPrompt 本身(${e} tokens)超过系统段预算(${n} tokens,窗口 ${T.contextWindow} 的 ${fe*100}%);请缩减 systemPrompt 或换更大窗口模型`;return console.error(r),t({type:`error`,message:r,severity:`fatal`,code:`SYSTEM_PROMPT_OVER_BUDGET`}),t({type:`done`,content:``}),``}}let a=he(i);re(`context`,{model:r,tools:se.map(e=>e.name),middleware:u.map(e=>e.name)});let o=oJ(u,e=>_e(e,t,n)),s=sJ(u,ve),l={rounds:0,maxToolRounds:w,invokeUsage:{prompt_tokens:0,completion_tokens:0,total_tokens:0},writeFailures:{},budgetHinted:!1};de.loopProgress=l;let d=0,p=0,m=xJ(w,f),h=null,y=0,b=!1,S=0;try{for(;(d<w||b)&&p<m&&(p++,!n?.aborted);){if(v>0&&l.invokeUsage.total_tokens>v){let e=`本轮 token 预算(约 ${v})已用尽:任务在 ${d} 轮工具调用后中断,已完成的部分均保留。可继续对话,指定下一步(如「继续完成」/「只改 X」/「提高预算重试」)。`;return re(`error`,{stage:`round_token_budget_exceeded`,used:l.invokeUsage.total_tokens,budget:v,rounds:d}),t({type:`error`,message:e,severity:`observable`,code:`ROUND_TOKEN_BUDGET_EXCEEDED`,context:{used:l.invokeUsage.total_tokens,budget:v}}),t({type:`done`,content:e}),e}let e=A(void 0,`round`,`round ${p}`,{round:p})?.id;t({type:`round_start`,round:p}),de=nJ(u,{messages:a,state:de}),a=ge(a),a=be(a,Math.round(T.contextWindow*.6));let i=A(e,`model`,r,{round:d+1,tools:se.map(e=>e.name)});re(`llm_request`,{round:d+1,model:r,tools:se.map(e=>e.name),messages:j(a)});let c=await o({messages:a,state:de});a.push(c.message),re(`llm_response`,{round:d+1,content:c.content,toolCalls:c.toolCalls}),oe(i,c.aborted?`timeout`:`ok`,{usage:dB(c.message)});{let e=fB(c.message);e&&(l.invokeUsage.prompt_tokens+=e.prompt_tokens??0,l.invokeUsage.completion_tokens+=e.completion_tokens??0,l.invokeUsage.total_tokens+=e.total_tokens??0)}if(de=rJ(u,c,de),c.aborted)return t({type:`done`,content:c.content}),c.content;if(!c.toolCalls.length){let e=cJ(c.content),n=e?hJ(c.content):null;if(n&&n.length){c.toolCalls=n;let e=c.message;e&&(e.tool_calls=n.map(e=>({id:e.id,name:e.name,args:e.args,type:`tool_call`}))),re(`middleware`,{stage:`dsml_parsed`,count:n.length,names:n.map(e=>e.name)})}else{if(e&&y<2){y+=1,b=!0,re(`middleware`,{stage:`format_retry`,attempt:y,content:c.content.slice(0,200)}),a.push(new $S(`⚠️ 你刚才把工具调用写成了文本(伪 XML/标签/DSML 标记,如 <|tool_calls|>、<||DSML||>、<invoke name=...>),未被系统识别为工具调用,因此未执行,页面无变化。请直接用标准 function calling(工具调用)格式重新发起工具调用,不要在回复正文里输出这些标签或 JSON 文本。`));continue}if(e&&(re(`error`,{stage:`garbled_exhausted`,retries:y,content:c.content.slice(0,200)}),t({type:`error`,message:`模型连续 2 次输出无法解析的工具调用格式(DSML/伪标签),任务可能未完成。请重试或换模型。`,severity:`observable`,code:`GARBLED_TOOL_CALL_EXHAUSTED`,context:{content:c.content.slice(0,200)}})),!e&&d>0&&S<2&&fJ(c.content)){S+=1,b=!0,re(`middleware`,{stage:`transitional_retry`,attempt:S,content:c.content.slice(0,160)}),a.push(new $S(`⚠️ 你刚才输出的是计划/过渡性表述(如「我先看看」「稍后委派」),任务尚未完成。请立即继续执行 —— 调用所需工具把任务做完,全部完成后再给出总结回复。`));continue}if(!e&&_>0&&de.verifyAttempts<_){let e=await aJ(u,{messages:a,state:de,response:c,log:(e,t)=>re(e,t)});if(e){h=c.content,de.verifyAttempts+=1,a.push(new $S(`⚠️ 验证未通过,请修正:${e}`)),re(`middleware`,{stage:`verify_retry`,attempt:de.verifyAttempts,feedback:e});continue}}b=!1;let n=c.content;if(e){let e=lJ(n);n=e?`${e}\n\n(注:此后模型输出了无法解析的工具调用文本,该调用未执行,任务可能未完成。)`:`模型多次输出无法解析的工具调用格式,本次任务可能未完成。请重试或继续指示。`}return t({type:`done`,content:n}),n}}b=!1;let f=c.toolCalls.map(e=>{let r=e.id||`call_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return{id:r,call:e,ctx:{id:r,name:e.name,args:e.args,state:de,signal:n,emit:t,logSink:O}}}),m=await Fq(f,g,async r=>{if(n?.aborted)return;let i=A(e,`tool`,r.call.name,{name:r.call.name}),a=Date.now();t({type:`tool_call`,name:r.call.name,args:r.call.args,id:r.id}),re(`tool_call`,{round:d+1,name:r.call.name,args:r.call.args,id:r.id});let o;try{o=await s(r.ctx)}catch(e){if(Gq(e,n))throw e;o={content:`工具执行出错:${Aq(e,`recoverable`).message}`,status:`error`}}let c=Date.now()-a;return t({type:`tool_result`,name:r.call.name,result:o.content,status:o.status,durationMs:c,id:r.id}),re(`tool_result`,{round:d+1,name:r.call.name,result:o.content,status:o.status,durationMs:c}),oe(i,o.status===`error`?`error`:`ok`,{resultSnippet:String(o.content).slice(0,100)}),o},n);for(let e=0;e<f.length;e++){let t=m[e];t&&a.push(new yS({tool_call_id:f[e].id,content:t.content}))}for(let e=0;e<f.length;e++){let t=m[e];if(!t||!SJ.has(f[e].call.name))continue;let n=CJ(f[e].call.args);t.status===`error`?l.writeFailures[n]=(l.writeFailures[n]??0)+1:delete l.writeFailures[n]}if(n?.aborted)break;d++,l.rounds=d}if(n?.aborted)return t({type:`done`,content:``}),``;if(h!=null)return t({type:`done`,content:h}),h;let e=a[a.length-1];if(e&&ye(e)===`tool`){let e=a[0]&&ye(a[0])===`system`?a.slice(1):a.slice(),i=[new nC(me()+`
154
154
 
155
155
  工具调用次数已达上限,请基于已有工具结果直接给出最终回答,不要再调用工具。`),...e];re(`llm_request`,{round:`wrap_up`,model:r,tools:[],messages:j(i)});let o=await oJ(u,e=>_e(e,t,n,ce))({messages:i,state:de});if(de=rJ(u,o,de),re(`llm_response`,{round:`wrap_up`,content:o.content}),o.aborted)return t({type:`done`,content:o.content}),o.content;if(o.content){let e=o.content;if(cJ(e)){let n=lJ(e);re(`error`,{stage:`garbled_wrapup`,content:e.slice(0,200)}),t({type:`error`,message:`模型在收口(工具轮耗尽)时输出无法解析的工具调用格式,任务可能未完成。请重试或换模型。`,severity:`observable`,code:`GARBLED_TOOL_CALL_EXHAUSTED`,context:{content:e.slice(0,200)}}),e=n?`${n}\n\n(注:工具调用次数已达上限,模型最后试图发起的调用未执行,任务可能未完成。)`:`我已完成本轮能做的部分操作,但最后的计划未能执行(工具调用次数已达上限)。请重试或继续指示。`}return t({type:`done`,content:e}),e}}let i=`我已完成本轮能做的操作,但未能综合出最终结论。请基于上方已完成的工具操作结果继续,或告诉我下一步重点。`;return t({type:`done`,content:i}),i}finally{try{await iJ(u,de)}catch(e){let t=Aq(e,`observable`);console.warn(`[Agent] afterAgent 清理出错(observable,已忽略):`,t.message)}if(ae&&x)try{x(ie.value,Uq(ie.value))}catch{}}}async function M(e,t,n){let r=``;return await xe(e,e=>{e.type===`done`&&(r=e.content),n?.(e)},t),r}function Se(e){se=[...u.flatMap(e=>e.tools||[]),...e],ue()}function N(e){ce=e,ue(),S?.(e)}return{invoke:M,stream:xe,getState:()=>de,get allTools(){return se},setTools:Se,setLlm:N,setModelCaps:ne,debugLogs:D,spans:ie,getEffectiveSystemPrompt:()=>me()}}xm();function TJ(e){let t=e;for(let e=0;e<5&&t&&t._def;e++){if(t._def.innerType){t=t._def.innerType;continue}break}if(!t||!t.shape||typeof t.shape!=`object`)return null;try{let e=typeof t.shape==`function`?t.shape():t.shape;return Object.keys(e)}catch{return null}}function EJ(e,t,n){if(!n||!e)return!0;let r=DJ(t);for(let t of e.split(`.`)){if(t.startsWith(`__pg`)||!r)return!1;if(r=DJ(r),r&&r.shape&&typeof r.shape==`object`){let e=typeof r.shape==`function`?r.shape():r.shape;if(!(t in e))return!1;r=e[t]}else if(r&&(r._def?.type===`array`||r.constructor?.name===`ZodArray`)){if(!/^\d+$/.test(t))return!1;r=r.element}else if(r&&(r._def?.type===`union`||r._def?.type===`discriminatedUnion`||Array.isArray(r.options)))return!0;else return!1}return!0}function DJ(e){let t=e;for(let e=0;e<8&&t&&t._def;e++){if(t._def.innerType){t=t._def.innerType;continue}if(t._def.schema){t=t._def.schema;continue}if(t._def.getter){t=t._def.getter();continue}break}return t}function OJ(e,t){if(!t)return e;let n=DJ(e),r=t.split(`.`);for(let e=0;e<r.length;e++){let t=r[e];if(!n)return null;if(n=DJ(n),n&&n.shape&&typeof n.shape==`object`)n=(typeof n.shape==`function`?n.shape():n.shape)[t];else if(n&&(n._def?.type===`array`||n.constructor?.name===`ZodArray`)){if(!/^\d+$/.test(t))return null;n=n.element}else if(n&&(n._def?.type===`union`||n._def?.type===`discriminatedUnion`||Array.isArray(n.options))){let t=r.slice(e).join(`.`),i=(n.options??[]).map(e=>OJ(e,t)).filter(e=>e!=null);return i.length?i[0]:null}else return null}return n??null}function kJ(e){let t=DJ(e);return t?._def?.type===`string`||t?.constructor?.name===`ZodString`}function AJ(e){let t=DJ(e);return t?._def?.type===`array`||t?.constructor?.name===`ZodArray`?t.element??null:null}function jJ(e,t=`code`){let n=DJ(e);if(!n)return!1;if(n.shape&&typeof n.shape==`object`){let e=typeof n.shape==`function`?n.shape():n.shape;return t in e&&kJ(e[t])}return n._def?.type===`union`||Array.isArray(n.options)?(n.options??[]).some(e=>jJ(e,t)):!1}function MJ(e){let t=DJ(e);if(!t||!t.shape||typeof t.shape!=`object`)return!1;let n=typeof t.shape==`function`?t.shape():t.shape;for(let e of Object.keys(n)){if(e===`code`&&kJ(n[e]))return!0;let t=AJ(n[e]);if(t&&jJ(t))return!0}return!1}function NJ(e,t=`code`){let n=DJ(e);if(!n||!n.shape||typeof n.shape!=`object`)return[];let r=typeof n.shape==`function`?n.shape():n.shape,i=[];for(let e of Object.keys(r)){if(e.startsWith(`__pg`))continue;let n=AJ(r[e]);n&&jJ(n,t)&&i.push(e)}return i}function PJ(e,t){if(typeof e!=`object`||!e||!t)return e;let n=DJ(t);if(!n||!n.shape){if(Array.isArray(e)&&(n?._def?.type||n?.element)){let t=n.element??n._def?.type;return e.map(e=>PJ(e,t))}if(!Array.isArray(e)){let t=e,n=Object.keys(t);if(!n.some(e=>e.startsWith(`__pg`)))return e;let r={};for(let e of n)e.startsWith(`__pg`)||(r[e]=t[e]);return r}return e}let r=typeof n.shape==`function`?n.shape():n.shape,i={};for(let t of Object.keys(e))if(t in r&&!t.startsWith(`__pg`)){let n=e[t];i[t]=PJ(n,r[t])}return i}function FJ(e,t){if(!t||typeof e!=`object`||!e||Array.isArray(e))return e;let n=new Set(t),r={};for(let t of Object.keys(e))n.has(t)&&(r[t]=e[t]);return r}var IJ=!1;function LJ(){IJ||=!0}function RJ(e){let t=e?._def?.checks;if(!Array.isArray(t))return[];let n=[];for(let e of t)e?._zod?.def&&n.push(e._zod.def);return n}function zJ(e){return e===-(2**53-1)||e===-1/0}function BJ(e){return e===2**53-1||e===1/0}function VJ(e,t=new WeakSet,n=0){let r=!1,i=!1,a=!1,o,s=e;for(let e=0;e<8&&s&&s._def;e++){let e=s._def.type;if(e===`optional`||e==="default"||e===`nullable`||e===`catch`||e===`readonly`||e===`prefault`){e===`optional`?r=!0:e===`nullable`?i=!0:(e==="default"||e===`prefault`)&&(a=!0,o=s._def.defaultValue),s=s._def.innerType;continue}if(e===`lazy`){s=s._def.getter?s._def.getter():s._def.schema;continue}if(e===`pipe`){s=s._def.in??s._def.innerType;continue}break}let c=s?._def?.type||`unknown`;if(s?._def||LJ(),n>15)return{type:c,description:`↩ 深度截断(>15,防栈溢出;查深层用 schema_data({jsonPath}))`};if(s&&typeof s==`object`&&t.has(s))return{type:c,description:`↩ 递归引用(容器 children 自引用,已截断防栈溢出)`};s&&typeof s==`object`&&t.add(s);let l={type:c};r&&(l.optional=!0),i&&(l.nullable=!0),a&&(l.default=o),s?.description&&(l.description=s.description);let u={};switch(c){case`string`:{s.minLength!=null&&(u.minLength=s.minLength),s.maxLength!=null&&(u.maxLength=s.maxLength);let e=RJ(s).filter(e=>e.check===`string_format`).map(e=>e.format).filter(Boolean);e.length&&(u.format=e.length===1?e[0]:e);break}case`number`:s.minValue!=null&&!zJ(s.minValue)&&(u.min=s.minValue),s.maxValue!=null&&!BJ(s.maxValue)&&(u.max=s.maxValue),s.isInt&&(u.int=!0),s.format&&s.format!==`number`&&(u.format=s.format);break;case`enum`:u.values=s.options;break;case`literal`:{let e=s._def?.values??(s._def?.value===void 0?[]:[s._def.value]);u.value=e.length===1?e[0]:e;break}case`array`:u.item=VJ(s.element,t,n+1);for(let e of RJ(s))e.check===`min_length`?u.minLength=e.minimum:e.check===`max_length`?u.maxLength=e.maximum:e.check===`length_equals`&&(u.length=e.length);break;case`object`:{let e=typeof s.shape==`function`?s.shape():s.shape;u.shape=Object.fromEntries(Object.entries(e||{}).map(([e,r])=>[e,VJ(r,t,n+1)]));break}case`union`:{let e=(s._def?.options||[]).map(e=>VJ(e,t,n+1));e.length&&(u.anyOf=e);break}case`record`:s._def?.valueType&&(u.valueType=VJ(s._def.valueType,t,n+1));break;default:break}return Object.keys(u).length&&(l.constraints=u),l}function HJ(e){let t=[];return e.minLength!==void 0&&t.push(`minLen=${e.minLength}`),e.maxLength!==void 0&&t.push(`maxLen=${e.maxLength}`),e.length!==void 0&&t.push(`len=${e.length}`),e.min!==void 0&&t.push(`min=${e.min}`),e.max!==void 0&&t.push(`max=${e.max}`),e.int&&t.push(`int`),e.format&&t.push(`format=${Array.isArray(e.format)?e.format.join(`|`):e.format}`),e.values&&t.push(`enum=[${e.values.map(e=>String(e)).join(`|`)}]`),e.value!==void 0&&t.push(`=${JSON.stringify(e.value)}`),t.join(`, `)}function UJ(e,t){let n=t.constraints?HJ(t.constraints):``,r=n?`[${n}]`:``,i=t.optional?`?`:``,a=t.description?`: ${t.description}`:``;return`- ${e} (${t.type}${i})${r}${a}`}function WJ(e){if(!e)return``;try{let t=e;for(let e=0;e<8&&t&&t._def;e++){if(t._def.innerType){t=t._def.innerType;continue}if(t._def.getter){t=t._def.getter();continue}if(t._def.schema){t=t._def.schema;continue}break}let n=t?.shape?typeof t.shape==`function`?t.shape():t.shape:null;if(n&&typeof n==`object`&&Object.keys(n).length)return Object.entries(n).map(([e,t])=>UJ(e,VJ(t))).join(`
156
156
  `)}catch{}try{return UJ(`(root)`,VJ(e))}catch{}return``}function GJ(e,t){let n=VJ(t),r=n.description?`: ${n.description}`:``;return`- ${e} (${n.type})${r}`}function KJ(e,t){let n=[],r=DJ(e);if(!r?.shape)return{schema:e,fallback:[...t]};let i={...typeof r.shape==`function`?r.shape():r.shape};for(let e of t){if(e.includes(`.`)){n.push(e);continue}let t=i[e];if(!t){n.push(e);continue}let r=DJ(t),a=r?.element?DJ(r.element):null;if(a?.shape)i[e]=I(a.extend({__pgId:F().optional()}));else if(Array.isArray(a?.options)){let t=a.options.map(e=>{let t=DJ(e);return t?.shape?t.extend({__pgId:F().optional()}):e});i[e]=I(a._def?.discriminator===void 0?cf(t):uf(a._def.discriminator,t))}else n.push(e)}return{schema:L(i),fallback:n}}function qJ(e){if(!e)return``;try{let t=e;for(let e=0;e<8&&t&&t._def;e++){if(t._def.innerType){t=t._def.innerType;continue}if(t._def.getter){t=t._def.getter();continue}if(t._def.schema){t=t._def.schema;continue}break}let n=t?.shape?typeof t.shape==`function`?t.shape():t.shape:null;if(n&&typeof n==`object`&&Object.keys(n).length)return Object.entries(n).map(([e,t])=>GJ(e,t)).join(`
@@ -197,10 +197,10 @@ self.onmessage = async (e) => {
197
197
  【与当前问题可能相关的早期对话】`,b);let C=t.getRegisteredData??t.getRegisteredSlots;if(C)try{let e=C();if(e.length){let t=e.map(e=>`- ${e.path?e.path+`: `:``}${e.description}`).join(`
198
198
  `);S.push(`
199
199
  【当前可操作数据(动态增删后的最新状态,操作前以 describe_data / read 为准)】`,t)}}catch{}let w={role:`system`,content:S.join(`
200
- `),timestamp:Date.now()},T=[];for(let e of l)T.push(e.userMsg),T.push(...e.assistantMsgs);let ee=[w,...T],E=ee.reduce((e,t)=>e+Bq(typeof t.content==`string`?t.content:JSON.stringify(t.content)),0);return t.contextWindow&&E>t.contextWindow&&console.warn(`[page-agent-sdk] compress 后仍超窗口:${E} > ${t.contextWindow} tokens(单条消息超窗口,compress 无法压)`),{messages:ee,stats:{triggered:!0,roundsTotal:a.length,roundsSummarized:u.length,roundsRecalled:y.length,originalMessages:o,compressedMessages:ee.length,strategy:_,decision:r}}}return{compress:a,config:t}}function GX(e={}){let t=WX(e);return Object.assign({name:`summarization`,compressInput:async n=>{let r;if(e.decideInvoke){let i=wX(n);if(HX(i,t.config)){let a=t.config.contextWindow&&t.config.contextWindow>0?`token`:`rounds`,o=a===`token`?`历史 token 超阈值 ${Math.round(Math.min((t.config.contextWindow??0)*(t.config.summaryThresholdRatio??.5),VX(t.config.contextWindow,t.config.promptSoftCapTokens)))}`:`轮数 ${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}})}xm();function KX(e=20){let t=new Map,n=[];return{start(e,n,r,i){t.set(e,{taskId:e,task:n,label:r,status:`running`,steps:[],startedAt:i})},pushStep(e,n){let r=t.get(e);r&&r.steps.push(n)},finish(r,i,a){let o=t.get(r);if(o)for(o.status=i,o.durationMs=Date.now()-o.startedAt,o.resultPreview=a.length>120?a.slice(0,120)+`…`:a,t.delete(r),n.unshift(o);n.length>e;)n.pop()},getActive(){return[...t.values()]},getHistory(){return[...n]}}}function qX(e){return!!e&&typeof e==`object`&&typeof e.invoke==`function`&&typeof e.stream==`function`}var JX=[`describe_data`,`get_data`,`read`,`query_data`,`search_data`,`fetch_document`],YX=1,XX=4,ZX=6,QX=[`spawn_agent`,`spawn_agents`],$X=[`load_skill`,`write_todos`,`update_todo`,`restore_last_checkpoint`,`request_human_confirmation`,`set_focus`,`add_focus`,`remove_focus`,`clear_focus`];function eZ(e){return QX.includes(e)||$X.includes(e)||e.startsWith(`use_`)}function tZ(e,t,n=[]){return[...e.filter(e=>t.has(e.name)&&!eZ(e.name)),...n]}function nZ(e,t){let n=typeof e==`string`?void 0:e,r=n&&`writeCapable`in n?n.writeCapable:void 0;return typeof r==`boolean`?r:typeof r==`function`?t===void 0||r(t):!1}function rZ(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 iZ(e,t){return t.some(t=>e===t||e.startsWith(t+`.`)||e.startsWith(t+`[`))}function aZ(e,t){let n=e.invoke.bind(e),r=async(e,r)=>{if(Array.isArray(e?.patches)&&e.patches.some(e=>!e||typeof e.jsonPath!=`string`||!e.jsonPath))return`PATH_OUT_OF_SCOPE:patches 含无 jsonPath 项(作用于根),子 agent 仅可写 ${t.join(`, `)} 范围内子路径。请为每个 patch 指定 jsonPath。`;let i=rZ(e);if(!i.length)return`PATH_OUT_OF_SCOPE:子 agent 仅可增量 patch(writablePaths: ${t.join(`, `)}),不能整体替换(无 jsonPath)。用 write({patch:{jsonPath,...}}) 增量改。`;for(let e of i)if(!iZ(e,t))return`PATH_OUT_OF_SCOPE:子 agent 写 "${e}" 越界(仅可写 ${t.join(`, `)})。`;return r===void 0?n(e):n(e,r)};return new Proxy(e,{get(e,t,n){return t===`invoke`?r:Reflect.get(e,t,n)}})}function oZ(e,t,n){return new Proxy(e,{get(e,r,i){return r===`invoke`?async(r,i)=>{let a=n(t);try{return await e.invoke(r,{...i,configurable:{...i?.configurable,__pgDataScope:t}})}finally{a()}}:Reflect.get(e,r,i)}})}async function sZ(e,t,n,r,i,a){let o=t.depth??0,s=t.maxDepth??YX,c=new Set([...JX,...t.allowedTools??[]]),l=()=>typeof t.allTools==`function`?t.allTools():t.allTools,u=tZ(l(),c,t.extraTools??[]);if(t.writablePaths?.length){u=u.filter(e=>!nZ(e));let e=l().filter(e=>nZ(e)&&!eZ(e.name)).map(e=>aZ(e,t.writablePaths));u=[...u,...e]}let d=`sub-${o}-${Math.random().toString(36).slice(2,10)}`;t.enterDataScope&&(u=u.map(e=>e.__dataOpsScoped?oZ(e,d,t.enterDataScope):e));let f=o+1<s?[cZ({...t,depth:o+1})]:[],p=t.getFocuses?.()??[],m=p.length?FY({getSchema:t.getSchema??(()=>null),getBind:t.getBind,initialFocuses:p,unfocusGuidance:`report-parent`}):void 0,h=t.getVfsFiles?{name:`vfs-bridge`,beforeAgent:()=>({files:t.getVfsFiles()})}:void 0,g=zq({model:qX(t.llm)?t.llm.model??t.llm.modelName:e.model??t.llm.model,contextWindow:t.llm.contextWindow,maxOutputTokens:t.llm.maxOutputTokens});if(g.contextWindow<2e5)throw Error(`[page-agent-sdk][subagent] 子 agent 模型上下文窗口 ${g.contextWindow} 小于最小支持 ${Rq}(需 ≥200K 窗口模型)`);let _=t.summarization===void 0?void 0:GX(typeof t.summarization==`object`?{contextWindow:g.contextWindow,...t.summarization}:{contextWindow:g.contextWindow}),v=t.onUsage?{name:`sub-usage`,afterModel:e=>{let n=fB(e.message);n&&t.onUsage(n)}}:void 0,y;!qX(t.llm)&&t.llm.provider===`anthropic`&&(y=await cB({...t.llm,model:e.model??t.llm.model},{temperature:t.temperature??t.llm.temperature,maxTokens:t.maxTokens??t.llm.maxTokens}));let b=wJ({contextWindow:g.contextWindow,maxOutputTokens:g.maxOutputTokens,...qX(t.llm)?{llm:t.llm}:y?{llm:y}:{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,...t.llm.extraConfig?{extraConfig:t.llm.extraConfig}:{},...t.llm.extraBody?{extraBody:t.llm.extraBody}:{}},systemPrompt:e.role?.trim()||t.systemPrompt||`你是一个专注的子任务执行者。你只有只读工具(读主数据 / 抓文档),用它们完成给定任务,给出简洁结论,不要展开多余解释。`,tools:u,middleware:[...t.skills?.length?[rX(t.skills)]:[],..._?[_]:[],...h?[h]:[],...f,...m?[m]:[],...v?[v]:[],...t.guardMiddleware??[],...t.middleware??[]],maxToolRounds:t.maxToolRounds??ZX,maxVerifyAttempts:t.maxVerifyAttempts??0,onLog:i,debug:t.debug});t.debug&&console.log(`[subagent] 启动子 agent(depth=${o},工具 ${u.length} 个)`);let x=new AbortController,S=()=>x.abort();n?.addEventListener(`abort`,S,{once:!0});let C=()=>{n?.removeEventListener(`abort`,S),t.exitDataScope?.(d)},w=b.stream([{role:`user`,content:e.prompt,timestamp:Date.now()}],e=>{if(e.type===`approval_request`){a?.(e);return}r&&(e.type===`tool_call`||e.type===`tool_result`||e.type===`reasoning`)&&r(e)},x.signal);if(!t.timeoutMs||t.timeoutMs<=0)try{return await w}finally{C()}let T,ee=new Promise((e,n)=>{T=setTimeout(()=>{x.abort(),n(Error(`子 agent 执行超时(${t.timeoutMs}ms),已中止。可简化子任务或拆更小的子任务重试`))},t.timeoutMs)});w.catch(()=>{});try{return await Promise.race([w,ee])}finally{clearTimeout(T),C()}}function cZ(e){let t=e.maxParallel??XX,n,r,i,a=e=>e?.configurable?.__pgSubagentCall??{signal:n,emit:r,logSink:i},o=(t,n,r)=>i=>{if(i.type===`reasoning`){r?.({type:`subagent`,taskId:t,label:n,kind:`reasoning`,name:``,delta:i.delta});return}e.tracker?.pushStep(t,{kind:i.type,name:i.name,ts:Date.now()}),r&&r({type:`subagent`,taskId:t,label:n,kind:i.type,name:i.name,args:i.type===`tool_call`?i.args:void 0,result:i.type===`tool_result`?i.result:void 0,status:i.type===`tool_result`?i.status:void 0})};return{name:`subagent`,tools:[iB(async({prompt:t,role:n,tools:r,writablePaths:i,model:s},c)=>{let l=a(c),u=(r??[]).filter(e=>!nZ(e)),d=u.length||i?.length?{...e,...u.length?{allowedTools:u}:{},...i?.length?{writablePaths:i}:{}}:e,f=`sub-${Math.random().toString(36).slice(2,8)}`,p=n?.trim()||`子任务`,m=e=>l.logSink?.({...e,source:`子:${p}`}),h=Date.now();e.tracker?.start(f,t,p,h);try{let r=await sZ({prompt:t,role:n,model:s},d,l.signal,o(f,p,l.emit),m,l.emit);return e.tracker?.finish(f,`done`,r),r}catch(t){throw e.tracker?.finish(f,`error`,String(t?.message??t)),t}},{name:`spawn_agent`,description:`委派一个独立子 agent 执行子任务,返回其最终结论(过程隔离,不占主上下文)。用于:分治大任务、专项调研、独立验证。子 agent 默认只读(不改页面)。`,schema:L({prompt:F().describe(`子任务描述(子 agent 的唯一输入)`),role:F().optional().describe(`子 agent 身份(如"你是代码审查专家")`),tools:I(F()).optional().describe(`子 agent 可用工具名白名单(默认只读主数据 + fetch)。写工具不可自授——写权限用 writablePaths;委派/框架类工具系统保留不可授`),writablePaths:I(F()).optional().describe(`子 agent 可写路径前缀(给写权限;越界 PATH_OUT_OF_SCOPE;如 ["components"] 允许写 components.* )`),model:F().optional().describe(`覆盖模型(默认同主)`)})}),iB(async({tasks:n},r)=>{let i=a(r);return(await Fq(n,t,async(t,n)=>{let r=`sub-${n}-${Math.random().toString(36).slice(2,6)}`,a=t.role?.trim()||`子任务${n+1}`,s=e=>i.logSink?.({...e,source:`子:${a}`}),c=Date.now();e.tracker?.start(r,t.prompt,a,c);try{let n=await sZ(t,e,i.signal,o(r,a,i.emit),s,i.emit);return e.tracker?.finish(r,`done`,n??`(未完成)`),{ok:!0,text:n??`(未完成)`}}catch(t){let n=String(t?.message??t);return e.tracker?.finish(r,`error`,n),{ok:!1,error:n}}},i.signal)).map((e,t)=>e===void 0?`【子任务 ${t+1}】(未完成:已中止/未启动)`:e.ok?`【子任务 ${t+1}】✓\n${e.text}`:`【子任务 ${t+1}】✗ 失败:${e.error}`).join(`
200
+ `),timestamp:Date.now()},T=[];for(let e of l)T.push(e.userMsg),T.push(...e.assistantMsgs);let ee=[w,...T],E=ee.reduce((e,t)=>e+Bq(typeof t.content==`string`?t.content:JSON.stringify(t.content)),0);return t.contextWindow&&E>t.contextWindow&&console.warn(`[page-agent-sdk] compress 后仍超窗口:${E} > ${t.contextWindow} tokens(单条消息超窗口,compress 无法压)`),{messages:ee,stats:{triggered:!0,roundsTotal:a.length,roundsSummarized:u.length,roundsRecalled:y.length,originalMessages:o,compressedMessages:ee.length,strategy:_,decision:r}}}return{compress:a,config:t}}function GX(e={}){let t=WX(e);return Object.assign({name:`summarization`,compressInput:async n=>{let r;if(e.decideInvoke){let i=wX(n);if(HX(i,t.config)){let a=t.config.contextWindow&&t.config.contextWindow>0?`token`:`rounds`,o=a===`token`?`历史 token 超阈值 ${Math.round(Math.min((t.config.contextWindow??0)*(t.config.summaryThresholdRatio??.5),VX(t.config.contextWindow,t.config.promptSoftCapTokens)))}`:`轮数 ${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}})}xm();function KX(e=20){let t=new Map,n=[];return{start(e,n,r,i){t.set(e,{taskId:e,task:n,label:r,status:`running`,steps:[],startedAt:i})},pushStep(e,n){let r=t.get(e);r&&r.steps.push(n)},finish(r,i,a){let o=t.get(r);if(o)for(o.status=i,o.durationMs=Date.now()-o.startedAt,o.resultPreview=a.length>120?a.slice(0,120)+`…`:a,t.delete(r),n.unshift(o);n.length>e;)n.pop()},getActive(){return[...t.values()]},getHistory(){return[...n]}}}function qX(e){return!!e&&typeof e==`object`&&typeof e.invoke==`function`&&typeof e.stream==`function`}var JX=[`describe_data`,`get_data`,`read`,`query_data`,`search_data`,`fetch_document`],YX=1,XX=4,ZX=6,QX=[`spawn_agent`,`spawn_agents`],$X=[`load_skill`,`write_todos`,`update_todo`,`restore_last_checkpoint`,`request_human_confirmation`,`set_focus`,`add_focus`,`remove_focus`,`clear_focus`];function eZ(e){return QX.includes(e)||$X.includes(e)||e.startsWith(`use_`)}function tZ(e,t,n=[]){return[...e.filter(e=>t.has(e.name)&&!eZ(e.name)),...n]}function nZ(e,t){let n=typeof e==`string`?void 0:e,r=n&&`writeCapable`in n?n.writeCapable:void 0;return typeof r==`boolean`?r:typeof r==`function`?t===void 0||r(t):!1}function rZ(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 iZ(e,t){return t.some(t=>e===t||e.startsWith(t+`.`)||e.startsWith(t+`[`))}function aZ(e,t){let n=e.invoke.bind(e),r=async(e,r)=>{if(Array.isArray(e?.patches)&&e.patches.some(e=>!e||typeof e.jsonPath!=`string`||!e.jsonPath))return`PATH_OUT_OF_SCOPE:patches 含无 jsonPath 项(作用于根),子 agent 仅可写 ${t.join(`, `)} 范围内子路径。请为每个 patch 指定 jsonPath。`;let i=rZ(e);if(!i.length)return`PATH_OUT_OF_SCOPE:子 agent 仅可增量 patch(writablePaths: ${t.join(`, `)}),不能整体替换(无 jsonPath)。用 write({patch:{jsonPath,...}}) 增量改。`;for(let e of i)if(!iZ(e,t))return`PATH_OUT_OF_SCOPE:子 agent 写 "${e}" 越界(仅可写 ${t.join(`, `)})。`;return r===void 0?n(e):n(e,r)};return new Proxy(e,{get(e,t,n){return t===`invoke`?r:Reflect.get(e,t,n)}})}function oZ(e,t,n){return new Proxy(e,{get(e,r,i){return r===`invoke`?async(r,i)=>{let a=n(t);try{return await e.invoke(r,{...i,configurable:{...i?.configurable,__pgDataScope:t}})}finally{a()}}:Reflect.get(e,r,i)}})}async function sZ(e,t,n,r,i,a){let o=t.depth??0,s=t.maxDepth??YX,c=new Set([...JX,...t.allowedTools??[]]),l=()=>typeof t.allTools==`function`?t.allTools():t.allTools,u=tZ(l(),c,t.extraTools??[]);if(t.writablePaths?.length){u=u.filter(e=>!nZ(e));let e=l().filter(e=>nZ(e)&&!eZ(e.name)).map(e=>aZ(e,t.writablePaths));u=[...u,...e]}let d=`sub-${o}-${Math.random().toString(36).slice(2,10)}`;t.enterDataScope&&(u=u.map(e=>e.__dataOpsScoped?oZ(e,d,t.enterDataScope):e));let f=o+1<s?[cZ({...t,depth:o+1})]:[],p=t.getFocuses?.()??[],m=p.length?FY({getSchema:t.getSchema??(()=>null),getBind:t.getBind,initialFocuses:p,unfocusGuidance:`report-parent`}):void 0,h=t.getVfsFiles?{name:`vfs-bridge`,beforeAgent:()=>({files:t.getVfsFiles()})}:void 0,g=zq({model:qX(t.llm)?t.llm.model??t.llm.modelName:e.model??t.llm.model,contextWindow:t.llm.contextWindow,maxOutputTokens:t.llm.maxOutputTokens});if(g.contextWindow<2e5)throw Error(`[page-agent-sdk][subagent] 子 agent 模型上下文窗口 ${g.contextWindow} 小于最小支持 ${Rq}(需 ≥200K 窗口模型)`);let _=t.summarization===void 0?void 0:GX(typeof t.summarization==`object`?{contextWindow:g.contextWindow,...t.summarization}:{contextWindow:g.contextWindow}),v=t.onUsage?{name:`sub-usage`,afterModel:e=>{let n=fB(e.message);n&&t.onUsage(n)}}:void 0,y;!qX(t.llm)&&t.llm.provider===`anthropic`&&(y=await cB({...t.llm,model:e.model??t.llm.model},{temperature:t.temperature??t.llm.temperature,maxTokens:t.maxTokens??t.llm.maxTokens}));let b=wJ({contextWindow:g.contextWindow,maxOutputTokens:g.maxOutputTokens,...qX(t.llm)?{llm:t.llm}:y?{llm:y}:{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,...t.llm.extraConfig?{extraConfig:t.llm.extraConfig}:{},...t.llm.extraBody?{extraBody:t.llm.extraBody}:{}},systemPrompt:e.role?.trim()||t.systemPrompt||`你是一个专注的子任务执行者。你只有只读工具(读主数据 / 抓文档),用它们完成给定任务,给出简洁结论,不要展开多余解释。`,tools:u,middleware:[...t.skills?.length?[rX(t.skills)]:[],..._?[_]:[],...h?[h]:[],...f,...m?[m]:[],...v?[v]:[],...t.guardMiddleware??[],...t.middleware??[]],maxToolRounds:t.maxToolRounds??ZX,maxVerifyAttempts:t.maxVerifyAttempts??0,onLog:i,debug:t.debug});t.debug&&console.log(`[subagent] 启动子 agent(depth=${o},工具 ${u.length} 个)`);let x=new AbortController,S=()=>x.abort();n?.addEventListener(`abort`,S,{once:!0});let C=()=>{n?.removeEventListener(`abort`,S),t.exitDataScope?.(d)},w=b.stream([{role:`user`,content:e.prompt,timestamp:Date.now()}],e=>{if(e.type===`approval_request`){a?.(e);return}r&&(e.type===`tool_call`||e.type===`tool_result`||e.type===`reasoning`)&&r(e)},x.signal);if(!t.timeoutMs||t.timeoutMs<=0)try{return await w}finally{C()}let T,ee=new Promise((e,n)=>{T=setTimeout(()=>{x.abort(),n(Error(`子 agent 执行超时(${t.timeoutMs}ms),已中止。可简化子任务或拆更小的子任务重试`))},t.timeoutMs)});w.catch(()=>{});try{return await Promise.race([w,ee])}finally{clearTimeout(T),C()}}function cZ(e){let t=e.maxParallel??XX,n,r,i,a=e=>e?.configurable?.__pgSubagentCall??{signal:n,emit:r,logSink:i},o=(t,n,r,i)=>a=>{if(a.type===`reasoning`){i?.({type:`subagent`,taskId:t,label:n,kind:`reasoning`,name:``,delta:a.delta,toolCallId:r});return}e.tracker?.pushStep(t,{kind:a.type,name:a.name,ts:Date.now()}),i&&i({type:`subagent`,taskId:t,label:n,kind:a.type,name:a.name,args:a.type===`tool_call`?a.args:void 0,result:a.type===`tool_result`?a.result:void 0,status:a.type===`tool_result`?a.status:void 0,toolCallId:r})};return{name:`subagent`,tools:[iB(async({prompt:t,role:n,tools:r,writablePaths:i,model:s},c)=>{let l=a(c),u=(r??[]).filter(e=>!nZ(e)),d=u.length||i?.length?{...e,...u.length?{allowedTools:u}:{},...i?.length?{writablePaths:i}:{}}:e,f=`sub-${Math.random().toString(36).slice(2,8)}`,p=n?.trim()||`子任务`,m=e=>l.logSink?.({...e,source:`子:${p}`}),h=Date.now();e.tracker?.start(f,t,p,h);try{let r=await sZ({prompt:t,role:n,model:s},d,l.signal,o(f,p,l.toolCallId,l.emit),m,l.emit);return e.tracker?.finish(f,`done`,r),r}catch(t){throw e.tracker?.finish(f,`error`,String(t?.message??t)),t}},{name:`spawn_agent`,description:`委派一个独立子 agent 执行子任务,返回其最终结论(过程隔离,不占主上下文)。用于:分治大任务、专项调研、独立验证。子 agent 默认只读(不改页面)。`,schema:L({prompt:F().describe(`子任务描述(子 agent 的唯一输入)`),role:F().optional().describe(`子 agent 身份(如"你是代码审查专家")`),tools:I(F()).optional().describe(`子 agent 可用工具名白名单(默认只读主数据 + fetch)。写工具不可自授——写权限用 writablePaths;委派/框架类工具系统保留不可授`),writablePaths:I(F()).optional().describe(`子 agent 可写路径前缀(给写权限;越界 PATH_OUT_OF_SCOPE;如 ["components"] 允许写 components.* )`),model:F().optional().describe(`覆盖模型(默认同主)`)})}),iB(async({tasks:n},r)=>{let i=a(r);return(await Fq(n,t,async(t,n)=>{let r=`sub-${n}-${Math.random().toString(36).slice(2,6)}`,a=t.role?.trim()||`子任务${n+1}`,s=e=>i.logSink?.({...e,source:`子:${a}`}),c=Date.now();e.tracker?.start(r,t.prompt,a,c);try{let n=await sZ(t,e,i.signal,o(r,a,i.toolCallId,i.emit),s,i.emit);return e.tracker?.finish(r,`done`,n??`(未完成)`),{ok:!0,text:n??`(未完成)`}}catch(t){let n=String(t?.message??t);return e.tracker?.finish(r,`error`,n),{ok:!1,error:n}}},i.signal)).map((e,t)=>e===void 0?`【子任务 ${t+1}】(未完成:已中止/未启动)`:e.ok?`【子任务 ${t+1}】✓\n${e.text}`:`【子任务 ${t+1}】✗ 失败:${e.error}`).join(`
201
201
 
202
- `)},{name:`spawn_agents`,description:`并行委派多个独立子 agent,聚合各自结论(子 agent 间互不通信,由你汇总)。适合:多路调研、多视角审查、批量处理。`,schema:L({tasks:I(L({prompt:F().describe(`子任务描述`),role:F().optional()})).min(1).max(8).describe(`子任务列表(最多 8 个)`)})})],wrapToolCall:async(e,t)=>(e.signal&&(n=e.signal),e.emit&&(r=e.emit),e.logSink&&(i=e.logSink),e.callConfig={...e.callConfig??{},__pgSubagentCall:{signal:e.signal??n,emit:e.emit??r,logSink:e.logSink??i}},t(e))}}var lZ=/^[a-zA-Z_][a-zA-Z0-9_]*$/;function uZ(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},...e.maxVerifyAttempts===void 0?{}:{maxVerifyAttempts:e.maxVerifyAttempts},...t.getFocuses?{getFocuses:t.getFocuses}:{},...t.getSchema?{getSchema:t.getSchema}:{},...t.tracker?{tracker:t.tracker}:{},...t.guardMiddleware?.length?{guardMiddleware:t.guardMiddleware}:{},...t.getVfsFiles?{getVfsFiles:t.getVfsFiles}:{},...t.enterDataScope?{enterDataScope:t.enterDataScope}:{},...t.exitDataScope?{exitDataScope:t.exitDataScope}:{},...t.onUsage?{onUsage:t.onUsage}:{},...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}}}function dZ(e,t){let n,r,i,a=e=>e?.configurable?.__pgSubagentCall??{signal:n,emit:r,logSink:i},o=(e,t,n)=>r=>{if(r.type===`reasoning`){n?.({type:`subagent`,taskId:e,label:t,kind:`reasoning`,name:``,delta:r.delta});return}n&&n({type:`subagent`,taskId:e,label:t,kind:r.type,name:r.name,args:r.type===`tool_call`?r.args:void 0,result:r.type===`tool_result`?r.result:void 0,status:r.type===`tool_result`?r.status:void 0})},s=[],c=[],l;function u(e){let n=new Set,r=[],i=[];for(let s of e){if(!lZ.test(s.id)){console.warn(`[subagents] id "${s.id}" 非合法工具名(须 [a-zA-Z_][a-zA-Z0-9_]*),已跳过`);continue}let e=`use_${s.id}`;if(n.has(e)){console.warn(`[subagents] id "${s.id}" 重复,已跳过`);continue}n.add(e),r.push(s),i.push(iB(async({task:e,components:n},r)=>{let i=a(r),c=uZ(s,t),l=e=>i.logSink?.({...e,source:`子:${s.id}`}),u=t.tracker,d=u?`use_${s.id}-${Math.random().toString(36).slice(2,6)}`:`use_${s.id}`,f=t.componentLock,p=d,m,h=[],g=(e,t)=>i.logSink?.({timestamp:Date.now(),type:`middleware`,data:{name:`component-lock`,kind:e,components:h,owner:p,...t}});if(f&&(h=t.resolveComponents?.({components:n,task:e})?.names??[],h.length)){let e=await f.acquire(h,p);if(!e.ok)return g(`conflict`,{heldBy:e.heldBy}),`COMPONENT_BUSY · 组件 [${h.join(`, `)}] 正在被子 agent(${e.heldBy})修改,本次委派未执行。同一组件同一时间只能有一个委派在途;请先做其他组件,或等该委派结束后(下一轮)再重试本组件。`;m=e.release,g(`acquire`)}let _=o(`use_${s.id}`,s.id,i.emit),v=u?e=>{e.type!==`reasoning`&&u.pushStep(d,{kind:e.type,name:e.name,ts:Date.now()}),_(e)}:_,y=Date.now();u?.start(d,e,s.id,y);try{let t=await sZ({prompt:e},c,i.signal,v,l,i.emit);return u?.finish(d,`done`,t),t}catch(e){throw u?.finish(d,`error`,String(e?.message??e)),e}finally{m&&(m(),g(`release`))}},{name:`use_${s.id}`,description:`委派给「${s.description}」子 agent 执行任务,返回其结论(过程隔离,不占主上下文)。`,schema:L({task:F().describe(`委派给该子 agent 的任务描述`),components:I(F()).optional().describe(`本次委派要修改的组件名列表(并行委派时必填,框架按组件互斥:同组件同时只允许一个委派在途)`)})}))}return{valid:r,tools:i}}let d=u(e);s=d.valid,c=d.tools;let f={set(e){let t=u(e);s=t.valid,c=t.tools,l?.()},add(e){if(s.some(t=>t.id===e.id)){console.warn(`[subagents] add: id "${e.id}" 已存在,已跳过`);return}let t=u([...s,e]);s=t.valid,c=t.tools,l?.()},remove(e){if(s.findIndex(t=>t.id===e)<0)return!1;let t=u(s.filter(t=>t.id!==e));return s=t.valid,c=t.tools,l?.(),!0},get:()=>[...s]},p={name:`subagents`,get tools(){return c},augmentPrompt:()=>s.length?[`## 可用子 agent(预声明,经专属工具委派)`,...s.map(e=>`- use_${e.id}: ${e.description}`),`复杂或专项任务(检索 / 生成 / 调研 / 多步等)优先委派子 agent:过程隔离不占主上下文 + 各子 agent 专项处理更优。需要时直接调 use_<id>({ task }) 委派,任务描述要清晰(含背景 + 用户观点/反馈,转述给子 agent);委派后信任子 agent 自主完成,不微操、不读其代码/中间细节(少占主上下文),只据其结论继续。简单任务(单字段改、直接读)用内置工具更快,不必委派。`].join(`
203
- `):void 0,wrapToolCall:async(e,t)=>(e.signal&&(n=e.signal),e.emit&&(r=e.emit),e.logSink&&(i=e.logSink),e.callConfig={...e.callConfig??{},__pgSubagentCall:{signal:e.signal??n,emit:e.emit??r,logSink:e.logSink??i}},t(e))};return Object.defineProperty(p,"controller",{value:f,enumerable:!1}),Object.defineProperty(p,"setReconfigureHook",{value:e=>{l=e},enumerable:!1}),p}function fZ(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:bZ(e.adversarial.llm),tools:(e.adversarial.tools??[]).length});let n=await wZ(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 pZ=new Set([`set_data`,`edit_data`,`delete_data`,`write`]),mZ=/校验失败|SCHEMA_INVALID|未注册|不存在|仅支持|必须是|NOT_OBJECT|PATH_UNSAFE|VERSION_CONFLICT|WRITE_INTERCEPT/;function hZ(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(!pZ.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 gZ(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 _Z(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 vZ(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=hZ(e);if(!r.length)return{ok:!0};let i=gZ(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&&mZ.test(r))continue;let c=_Z(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(`;
202
+ `)},{name:`spawn_agents`,description:`并行委派多个独立子 agent,聚合各自结论(子 agent 间互不通信,由你汇总)。适合:多路调研、多视角审查、批量处理。`,schema:L({tasks:I(L({prompt:F().describe(`子任务描述`),role:F().optional()})).min(1).max(8).describe(`子任务列表(最多 8 个)`)})})],wrapToolCall:async(e,t)=>(e.signal&&(n=e.signal),e.emit&&(r=e.emit),e.logSink&&(i=e.logSink),e.callConfig={...e.callConfig??{},__pgSubagentCall:{signal:e.signal??n,emit:e.emit??r,logSink:e.logSink??i,toolCallId:e.id}},t(e))}}var lZ=/^[a-zA-Z_][a-zA-Z0-9_]*$/;function uZ(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},...e.maxVerifyAttempts===void 0?{}:{maxVerifyAttempts:e.maxVerifyAttempts},...t.getFocuses?{getFocuses:t.getFocuses}:{},...t.getSchema?{getSchema:t.getSchema}:{},...t.tracker?{tracker:t.tracker}:{},...t.guardMiddleware?.length?{guardMiddleware:t.guardMiddleware}:{},...t.getVfsFiles?{getVfsFiles:t.getVfsFiles}:{},...t.enterDataScope?{enterDataScope:t.enterDataScope}:{},...t.exitDataScope?{exitDataScope:t.exitDataScope}:{},...t.onUsage?{onUsage:t.onUsage}:{},...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}}}function dZ(e,t){let n,r,i,a=e=>e?.configurable?.__pgSubagentCall??{signal:n,emit:r,logSink:i},o=(e,t,n,r)=>i=>{if(i.type===`reasoning`){r?.({type:`subagent`,taskId:e,label:t,kind:`reasoning`,name:``,delta:i.delta,toolCallId:n});return}r&&r({type:`subagent`,taskId:e,label:t,kind:i.type,name:i.name,args:i.type===`tool_call`?i.args:void 0,result:i.type===`tool_result`?i.result:void 0,status:i.type===`tool_result`?i.status:void 0,toolCallId:n})},s=[],c=[],l;function u(e){let n=new Set,r=[],i=[];for(let s of e){if(!lZ.test(s.id)){console.warn(`[subagents] id "${s.id}" 非合法工具名(须 [a-zA-Z_][a-zA-Z0-9_]*),已跳过`);continue}let e=`use_${s.id}`;if(n.has(e)){console.warn(`[subagents] id "${s.id}" 重复,已跳过`);continue}n.add(e),r.push(s),i.push(iB(async({task:e,components:n},r)=>{let i=a(r),c=uZ(s,t),l=e=>i.logSink?.({...e,source:`子:${s.id}`}),u=t.tracker,d=u?`use_${s.id}-${Math.random().toString(36).slice(2,6)}`:`use_${s.id}`,f=t.componentLock,p=d,m,h=[],g=(e,t)=>i.logSink?.({timestamp:Date.now(),type:`middleware`,data:{name:`component-lock`,kind:e,components:h,owner:p,...t}});if(f&&(h=t.resolveComponents?.({components:n,task:e})?.names??[],h.length)){let e=await f.acquire(h,p);if(!e.ok)return g(`conflict`,{heldBy:e.heldBy}),`COMPONENT_BUSY · 组件 [${h.join(`, `)}] 正在被子 agent(${e.heldBy})修改,本次委派未执行。同一组件同一时间只能有一个委派在途;请先做其他组件,或等该委派结束后(下一轮)再重试本组件。`;m=e.release,g(`acquire`)}let _=o(`use_${s.id}`,s.id,i.toolCallId,i.emit),v=u?e=>{e.type!==`reasoning`&&u.pushStep(d,{kind:e.type,name:e.name,ts:Date.now()}),_(e)}:_,y=Date.now();u?.start(d,e,s.id,y);try{let t=await sZ({prompt:e},c,i.signal,v,l,i.emit);return u?.finish(d,`done`,t),t}catch(e){throw u?.finish(d,`error`,String(e?.message??e)),e}finally{m&&(m(),g(`release`))}},{name:`use_${s.id}`,description:`委派给「${s.description}」子 agent 执行任务,返回其结论(过程隔离,不占主上下文)。`,schema:L({task:F().describe(`委派给该子 agent 的任务描述`),components:I(F()).optional().describe(`本次委派要修改的组件名列表(并行委派时必填,框架按组件互斥:同组件同时只允许一个委派在途)`)})}))}return{valid:r,tools:i}}let d=u(e);s=d.valid,c=d.tools;let f={set(e){let t=u(e);s=t.valid,c=t.tools,l?.()},add(e){if(s.some(t=>t.id===e.id)){console.warn(`[subagents] add: id "${e.id}" 已存在,已跳过`);return}let t=u([...s,e]);s=t.valid,c=t.tools,l?.()},remove(e){if(s.findIndex(t=>t.id===e)<0)return!1;let t=u(s.filter(t=>t.id!==e));return s=t.valid,c=t.tools,l?.(),!0},get:()=>[...s]},p={name:`subagents`,get tools(){return c},augmentPrompt:()=>s.length?[`## 可用子 agent(预声明,经专属工具委派)`,...s.map(e=>`- use_${e.id}: ${e.description}`),`复杂或专项任务(检索 / 生成 / 调研 / 多步等)优先委派子 agent:过程隔离不占主上下文 + 各子 agent 专项处理更优。需要时直接调 use_<id>({ task }) 委派,任务描述要清晰(含背景 + 用户观点/反馈,转述给子 agent);委派后信任子 agent 自主完成,不微操、不读其代码/中间细节(少占主上下文),只据其结论继续。简单任务(单字段改、直接读)用内置工具更快,不必委派。`].join(`
203
+ `):void 0,wrapToolCall:async(e,t)=>(e.signal&&(n=e.signal),e.emit&&(r=e.emit),e.logSink&&(i=e.logSink),e.callConfig={...e.callConfig??{},__pgSubagentCall:{signal:e.signal??n,emit:e.emit??r,logSink:e.logSink??i,toolCallId:e.id}},t(e))};return Object.defineProperty(p,"controller",{value:f,enumerable:!1}),Object.defineProperty(p,"setReconfigureHook",{value:e=>{l=e},enumerable:!1}),p}function fZ(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:bZ(e.adversarial.llm),tools:(e.adversarial.tools??[]).length});let n=await wZ(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 pZ=new Set([`set_data`,`edit_data`,`delete_data`,`write`]),mZ=/校验失败|SCHEMA_INVALID|未注册|不存在|仅支持|必须是|NOT_OBJECT|PATH_UNSAFE|VERSION_CONFLICT|WRITE_INTERCEPT/;function hZ(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(!pZ.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 gZ(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 _Z(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 vZ(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=hZ(e);if(!r.length)return{ok:!0};let i=gZ(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&&mZ.test(r))continue;let c=_Z(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(`;
204
204
  `)}:{ok:!0}}}function yZ(e){return!!e&&typeof e==`object`&&typeof e.invoke==`function`&&typeof e.stream==`function`}function bZ(e){return yZ(e)?e.model??e.modelName??`<实例>`:e.model??`<配置>`}var xZ=/无问题|没有问题|未发现问题|没有发现|没问题|未发现/;function SZ(e){return xZ.test(e)}function CZ(e){let t=``,n=``;for(let r of e)r instanceof $S?t=typeof r.content==`string`?r.content:``:r instanceof hC&&!(r.tool_calls?.length>0)&&(n=typeof r.content==`string`?r.content:``);return{lastUser:t,lastReply:n}}async function wZ(e,t,n,r){let{lastUser:i,lastReply:a}=CZ(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(`
205
205
  `),c=`你是严格的对抗式审查者,只找问题不赞美。目标是反驳,不是改进。`,l=n?e=>n(e.type,{...e.data,source:`adversarial`}):void 0,u=await wJ(yZ(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`}),SZ(u)?null:u.trim()}var TZ=[{prefix:`## 可操作数据`,key:`dataHint`},{prefix:`## 能力使用提示`,key:`usageHints`},{prefix:`## 当前主线目标`,key:`mission`},{prefix:`## 工作记忆`,key:`workingMemory`},{prefix:`【更早对话摘要`,key:`memory`},{prefix:`【对话历史摘要】`,key:`summary`},{prefix:`【与当前问题可能相关的早期对话】`,key:`recall`}],EZ=[{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 DZ(){let e={};for(let t of EZ)e[t.key]={key:t.key,label:t.label,tokens:0,pct:0,msgCount:0};return e}function OZ(e,t){e.tokens+=t,e.msgCount+=1}function kZ(e){let t=e.content;return typeof t==`string`?t:JSON.stringify(t??``)}function AZ(e,t){let n=[];for(let t of TZ){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&&OZ(t.systemPrompt,Bq(n));return}if(n[0].idx>0){let r=e.slice(0,n[0].idx).trim();r&&OZ(t.systemPrompt,Bq(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&&OZ(t[n[r].key],Bq(o))}}function jZ(e,t={}){let n=DZ(),r=-1;for(let t=e.length-1;t>=0;t--)if(e[t]instanceof $S){r=t;break}for(let t=0;t<e.length;t++){let i=e[t];if(i instanceof nC)AZ(kZ(i),n);else if(i instanceof $S)OZ(n[t===r?`current`:`history`],Bq(kZ(i)));else if(i instanceof hC){let e=i.tool_calls??[];if(e.length){let t=e.map(e=>JSON.stringify(e.args??{})).join(` `);OZ(n.toolResults,Bq(t))}else OZ(n.assistant,Bq(kZ(i)))}else i instanceof yS?OZ(n.toolResults,Bq(kZ(i))):OZ(n.other,Bq(kZ(i)))}let i=Object.values(n).filter(e=>e.tokens>0);i.sort((e,t)=>t.tokens-e.tokens);let a=i.reduce((e,t)=>e+t.tokens,0);for(let e of i)e.pct=a>0?e.tokens/a:0;let o=t.contextWindow;return{totalTokens:a,contextWindow:o,occupancy:o?a/o:0,thresholdRatio:t.thresholdRatio??0,categories:i}}function MZ(e={}){let t,n=e.contextWindow;return{name:`context-inspector`,async wrapModelCall(r,i){return t=jZ(r.messages,{contextWindow:n,thresholdRatio:e.thresholdRatio}),i(r)},getSnapshot:()=>t,setContextWindow:e=>{n=e}}}function NZ(e){return e?e instanceof Headers?Object.fromEntries(e.entries()):Array.isArray(e)?Object.fromEntries(e):{...e}:{}}function PZ(e=fetch,t){return t?async(n,r)=>e(n,{...t,...r,headers:r?.headers?{...NZ(t.headers),...NZ(r.headers)}:t.headers}):e}var FZ=c((()=>{})),IZ,LZ,RZ,zZ,BZ,VZ,HZ,UZ,WZ,GZ,KZ,qZ,JZ,YZ,XZ,ZZ,QZ,$Z,eQ,tQ,nQ,rQ,iQ,aQ,oQ,sQ,cQ,lQ,uQ,dQ,fQ,pQ,mQ,hQ,gQ,_Q,vQ,yQ,bQ,xQ,SQ,CQ,wQ,TQ,EQ,DQ,OQ,kQ,AQ,jQ,MQ,NQ,PQ,FQ,IQ,LQ,RQ,zQ,BQ,VQ,HQ,UQ,WQ,GQ,KQ,qQ,JQ,YQ,XQ,ZQ,QQ,$Q,e$,t$,n$,r$,i$,a$,o$,s$,c$,l$,u$,d$,f$,p$,m$,h$,g$,_$,v$,y$,b$,x$,S$,C$,w$,T$,E$,D$,O$,k$,A$,j$,M$,N$,P$,F$,I$,L$,R$,z$,B$,V$,H$,U$,W$,G$,K$,q$,J$,Y$,X$,Z$,Q$,$$,e1,t1,n1,r1,i1,a1,o1,s1,c1,l1,u1,d1,f1,p1,m1,h1,g1,_1,v1,y1,b1,x1,S1,C1,w1,T1,E1,D1,O1,k1,A1,j1,M1,N1=c((()=>{KI(),IZ=`2025-11-25`,LZ=[IZ,`2025-06-18`,`2025-03-26`,`2024-11-05`,`2024-10-07`],RZ=`io.modelcontextprotocol/related-task`,zZ=Hf(e=>e!==null&&(typeof e==`object`||typeof e==`function`)),BZ=cf([F(),Bd().int()]),VZ=F(),sf({ttl:Bd().optional(),pollInterval:Bd().optional()}),HZ=L({ttl:Bd().optional()}),UZ=L({taskId:F()}),WZ=sf({progressToken:BZ.optional(),[RZ]:UZ.optional()}),GZ=L({_meta:WZ.optional()}),KZ=GZ.extend({task:HZ.optional()}),qZ=e=>KZ.safeParse(e).success,JZ=L({method:F(),params:GZ.loose().optional()}),YZ=L({_meta:WZ.optional()}),XZ=L({method:F(),params:YZ.loose().optional()}),ZZ=sf({_meta:WZ.optional()}),QZ=cf([F(),Bd().int()]),$Z=L({jsonrpc:bf(`2.0`),id:QZ,...JZ.shape}).strict(),eQ=e=>$Z.safeParse(e).success,tQ=L({jsonrpc:bf(`2.0`),...XZ.shape}).strict(),nQ=e=>tQ.safeParse(e).success,rQ=L({jsonrpc:bf(`2.0`),id:QZ,result:ZZ}).strict(),iQ=e=>rQ.safeParse(e).success,(function(e){e[e.ConnectionClosed=-32e3]=`ConnectionClosed`,e[e.RequestTimeout=-32001]=`RequestTimeout`,e[e.ParseError=-32700]=`ParseError`,e[e.InvalidRequest=-32600]=`InvalidRequest`,e[e.MethodNotFound=-32601]=`MethodNotFound`,e[e.InvalidParams=-32602]=`InvalidParams`,e[e.InternalError=-32603]=`InternalError`,e[e.UrlElicitationRequired=-32042]=`UrlElicitationRequired`})(aQ||={}),oQ=L({jsonrpc:bf(`2.0`),id:QZ.optional(),error:L({code:Bd().int(),message:F(),data:ef().optional()})}).strict(),sQ=e=>oQ.safeParse(e).success,cQ=cf([$Z,tQ,rQ,oQ]),cf([rQ,oQ]),lQ=ZZ.strict(),uQ=YZ.extend({requestId:QZ.optional(),reason:F().optional()}),dQ=XZ.extend({method:bf(`notifications/cancelled`),params:uQ}),fQ=L({src:F(),mimeType:F().optional(),sizes:I(F()).optional(),theme:vf([`light`,`dark`]).optional()}),pQ=L({icons:I(fQ).optional()}),mQ=L({name:F(),title:F().optional()}),hQ=mQ.extend({...mQ.shape,...pQ.shape,version:F(),websiteUrl:F().optional(),description:F().optional()}),gQ=df(L({applyDefaults:Kd().optional()}),pf(F(),ef())),_Q=qf(e=>e&&typeof e==`object`&&!Array.isArray(e)&&Object.keys(e).length===0?{form:{}}:e,df(L({form:gQ.optional(),url:zZ.optional()}),pf(F(),ef()).optional())),vQ=sf({list:zZ.optional(),cancel:zZ.optional(),requests:sf({sampling:sf({createMessage:zZ.optional()}).optional(),elicitation:sf({create:zZ.optional()}).optional()}).optional()}),yQ=sf({list:zZ.optional(),cancel:zZ.optional(),requests:sf({tools:sf({call:zZ.optional()}).optional()}).optional()}),bQ=L({experimental:pf(F(),zZ).optional(),sampling:L({context:zZ.optional(),tools:zZ.optional()}).optional(),elicitation:_Q.optional(),roots:L({listChanged:Kd().optional()}).optional(),tasks:vQ.optional(),extensions:pf(F(),zZ).optional()}),xQ=GZ.extend({protocolVersion:F(),capabilities:bQ,clientInfo:hQ}),SQ=JZ.extend({method:bf(`initialize`),params:xQ}),CQ=L({experimental:pf(F(),zZ).optional(),logging:zZ.optional(),completions:zZ.optional(),prompts:L({listChanged:Kd().optional()}).optional(),resources:L({subscribe:Kd().optional(),listChanged:Kd().optional()}).optional(),tools:L({listChanged:Kd().optional()}).optional(),tasks:yQ.optional(),extensions:pf(F(),zZ).optional()}),wQ=ZZ.extend({protocolVersion:F(),capabilities:CQ,serverInfo:hQ,instructions:F().optional()}),TQ=XZ.extend({method:bf(`notifications/initialized`),params:YZ.optional()}),EQ=e=>TQ.safeParse(e).success,DQ=JZ.extend({method:bf(`ping`),params:GZ.optional()}),OQ=L({progress:Bd(),total:Cf(Bd()),message:Cf(F())}),kQ=L({...YZ.shape,...OQ.shape,progressToken:BZ}),AQ=XZ.extend({method:bf(`notifications/progress`),params:kQ}),jQ=GZ.extend({cursor:VZ.optional()}),MQ=JZ.extend({params:jQ.optional()}),NQ=ZZ.extend({nextCursor:VZ.optional()}),PQ=vf([`working`,`input_required`,`completed`,`failed`,`cancelled`]),FQ=L({taskId:F(),status:PQ,ttl:cf([Bd(),Qd()]),createdAt:F(),lastUpdatedAt:F(),pollInterval:Cf(Bd()),statusMessage:Cf(F())}),IQ=ZZ.extend({task:FQ}),LQ=YZ.merge(FQ),RQ=XZ.extend({method:bf(`notifications/tasks/status`),params:LQ}),zQ=JZ.extend({method:bf(`tasks/get`),params:GZ.extend({taskId:F()})}),BQ=ZZ.merge(FQ),VQ=JZ.extend({method:bf(`tasks/result`),params:GZ.extend({taskId:F()})}),ZZ.loose(),HQ=MQ.extend({method:bf(`tasks/list`)}),UQ=NQ.extend({tasks:I(FQ)}),WQ=JZ.extend({method:bf(`tasks/cancel`),params:GZ.extend({taskId:F()})}),GQ=ZZ.merge(FQ),KQ=L({uri:F(),mimeType:Cf(F()),_meta:pf(F(),ef()).optional()}),qQ=KQ.extend({text:F()}),JQ=F().refine(e=>{try{return atob(e),!0}catch{return!1}},{message:`Invalid Base64 string`}),YQ=KQ.extend({blob:JQ}),XQ=vf([`user`,`assistant`]),ZQ=L({audience:I(XQ).optional(),priority:Bd().min(0).max(1).optional(),lastModified:Ru({offset:!0}).optional()}),QQ=L({...mQ.shape,...pQ.shape,uri:F(),description:Cf(F()),mimeType:Cf(F()),size:Cf(Bd()),annotations:ZQ.optional(),_meta:Cf(sf({}))}),$Q=L({...mQ.shape,...pQ.shape,uriTemplate:F(),description:Cf(F()),mimeType:Cf(F()),annotations:ZQ.optional(),_meta:Cf(sf({}))}),e$=MQ.extend({method:bf(`resources/list`)}),t$=NQ.extend({resources:I(QQ)}),n$=MQ.extend({method:bf(`resources/templates/list`)}),r$=NQ.extend({resourceTemplates:I($Q)}),i$=GZ.extend({uri:F()}),a$=i$,o$=JZ.extend({method:bf(`resources/read`),params:a$}),s$=ZZ.extend({contents:I(cf([qQ,YQ]))}),c$=XZ.extend({method:bf(`notifications/resources/list_changed`),params:YZ.optional()}),l$=i$,u$=JZ.extend({method:bf(`resources/subscribe`),params:l$}),d$=i$,f$=JZ.extend({method:bf(`resources/unsubscribe`),params:d$}),p$=YZ.extend({uri:F()}),m$=XZ.extend({method:bf(`notifications/resources/updated`),params:p$}),h$=L({name:F(),description:Cf(F()),required:Cf(Kd())}),g$=L({...mQ.shape,...pQ.shape,description:Cf(F()),arguments:Cf(I(h$)),_meta:Cf(sf({}))}),_$=MQ.extend({method:bf(`prompts/list`)}),v$=NQ.extend({prompts:I(g$)}),y$=GZ.extend({name:F(),arguments:pf(F(),F()).optional()}),b$=JZ.extend({method:bf(`prompts/get`),params:y$}),x$=L({type:bf(`text`),text:F(),annotations:ZQ.optional(),_meta:pf(F(),ef()).optional()}),S$=L({type:bf(`image`),data:JQ,mimeType:F(),annotations:ZQ.optional(),_meta:pf(F(),ef()).optional()}),C$=L({type:bf(`audio`),data:JQ,mimeType:F(),annotations:ZQ.optional(),_meta:pf(F(),ef()).optional()}),w$=L({type:bf(`tool_use`),name:F(),id:F(),input:pf(F(),ef()),_meta:pf(F(),ef()).optional()}),T$=L({type:bf(`resource`),resource:cf([qQ,YQ]),annotations:ZQ.optional(),_meta:pf(F(),ef()).optional()}),E$=QQ.extend({type:bf(`resource_link`)}),D$=cf([x$,S$,C$,E$,T$]),O$=L({role:XQ,content:D$}),k$=ZZ.extend({description:F().optional(),messages:I(O$)}),A$=XZ.extend({method:bf(`notifications/prompts/list_changed`),params:YZ.optional()}),j$=L({title:F().optional(),readOnlyHint:Kd().optional(),destructiveHint:Kd().optional(),idempotentHint:Kd().optional(),openWorldHint:Kd().optional()}),M$=L({taskSupport:vf([`required`,`optional`,`forbidden`]).optional()}),N$=L({...mQ.shape,...pQ.shape,description:F().optional(),inputSchema:L({type:bf(`object`),properties:pf(F(),zZ).optional(),required:I(F()).optional()}).catchall(ef()),outputSchema:L({type:bf(`object`),properties:pf(F(),zZ).optional(),required:I(F()).optional()}).catchall(ef()).optional(),annotations:j$.optional(),execution:M$.optional(),_meta:pf(F(),ef()).optional()}),P$=MQ.extend({method:bf(`tools/list`)}),F$=NQ.extend({tools:I(N$)}),I$=ZZ.extend({content:I(D$).default([]),structuredContent:pf(F(),ef()).optional(),isError:Kd().optional()}),I$.or(ZZ.extend({toolResult:ef()})),L$=KZ.extend({name:F(),arguments:pf(F(),ef()).optional()}),R$=JZ.extend({method:bf(`tools/call`),params:L$}),z$=XZ.extend({method:bf(`notifications/tools/list_changed`),params:YZ.optional()}),B$=L({autoRefresh:Kd().default(!0),debounceMs:Bd().int().nonnegative().default(300)}),V$=vf([`debug`,`info`,`notice`,`warning`,`error`,`critical`,`alert`,`emergency`]),H$=GZ.extend({level:V$}),U$=JZ.extend({method:bf(`logging/setLevel`),params:H$}),W$=YZ.extend({level:V$,logger:F().optional(),data:ef()}),G$=XZ.extend({method:bf(`notifications/message`),params:W$}),K$=L({name:F().optional()}),q$=L({hints:I(K$).optional(),costPriority:Bd().min(0).max(1).optional(),speedPriority:Bd().min(0).max(1).optional(),intelligencePriority:Bd().min(0).max(1).optional()}),J$=L({mode:vf([`auto`,`required`,`none`]).optional()}),Y$=L({type:bf(`tool_result`),toolUseId:F().describe(`The unique identifier for the corresponding tool call.`),content:I(D$).default([]),structuredContent:L({}).loose().optional(),isError:Kd().optional(),_meta:pf(F(),ef()).optional()}),X$=uf(`type`,[x$,S$,C$]),Z$=uf(`type`,[x$,S$,C$,w$,Y$]),Q$=L({role:XQ,content:cf([Z$,I(Z$)]),_meta:pf(F(),ef()).optional()}),$$=KZ.extend({messages:I(Q$),modelPreferences:q$.optional(),systemPrompt:F().optional(),includeContext:vf([`none`,`thisServer`,`allServers`]).optional(),temperature:Bd().optional(),maxTokens:Bd().int(),stopSequences:I(F()).optional(),metadata:zZ.optional(),tools:I(N$).optional(),toolChoice:J$.optional()}),e1=JZ.extend({method:bf(`sampling/createMessage`),params:$$}),t1=ZZ.extend({model:F(),stopReason:Cf(vf([`endTurn`,`stopSequence`,`maxTokens`]).or(F())),role:XQ,content:X$}),n1=ZZ.extend({model:F(),stopReason:Cf(vf([`endTurn`,`stopSequence`,`maxTokens`,`toolUse`]).or(F())),role:XQ,content:cf([Z$,I(Z$)])}),r1=L({type:bf(`boolean`),title:F().optional(),description:F().optional(),default:Kd().optional()}),i1=L({type:bf(`string`),title:F().optional(),description:F().optional(),minLength:Bd().optional(),maxLength:Bd().optional(),format:vf([`email`,`uri`,`date`,`date-time`]).optional(),default:F().optional()}),a1=L({type:vf([`number`,`integer`]),title:F().optional(),description:F().optional(),minimum:Bd().optional(),maximum:Bd().optional(),default:Bd().optional()}),o1=L({type:bf(`string`),title:F().optional(),description:F().optional(),enum:I(F()),default:F().optional()}),s1=L({type:bf(`string`),title:F().optional(),description:F().optional(),oneOf:I(L({const:F(),title:F()})),default:F().optional()}),c1=L({type:bf(`string`),title:F().optional(),description:F().optional(),enum:I(F()),enumNames:I(F()).optional(),default:F().optional()}),l1=cf([o1,s1]),u1=L({type:bf(`array`),title:F().optional(),description:F().optional(),minItems:Bd().optional(),maxItems:Bd().optional(),items:L({type:bf(`string`),enum:I(F())}),default:I(F()).optional()}),d1=L({type:bf(`array`),title:F().optional(),description:F().optional(),minItems:Bd().optional(),maxItems:Bd().optional(),items:L({anyOf:I(L({const:F(),title:F()}))}),default:I(F()).optional()}),f1=cf([u1,d1]),p1=cf([c1,l1,f1]),m1=cf([p1,r1,i1,a1]),h1=KZ.extend({mode:bf(`form`).optional(),message:F(),requestedSchema:L({type:bf(`object`),properties:pf(F(),m1),required:I(F()).optional()})}),g1=KZ.extend({mode:bf(`url`),message:F(),elicitationId:F(),url:F().url()}),_1=cf([h1,g1]),v1=JZ.extend({method:bf(`elicitation/create`),params:_1}),y1=YZ.extend({elicitationId:F()}),b1=XZ.extend({method:bf(`notifications/elicitation/complete`),params:y1}),x1=ZZ.extend({action:vf([`accept`,`decline`,`cancel`]),content:qf(e=>e===null?void 0:e,pf(F(),cf([F(),Bd(),Kd(),I(F())])).optional())}),S1=L({type:bf(`ref/resource`),uri:F()}),C1=L({type:bf(`ref/prompt`),name:F()}),w1=GZ.extend({ref:cf([C1,S1]),argument:L({name:F(),value:F()}),context:L({arguments:pf(F(),F()).optional()}).optional()}),T1=JZ.extend({method:bf(`completion/complete`),params:w1}),E1=ZZ.extend({completion:sf({values:I(F()).max(100),total:Cf(Bd().int()),hasMore:Cf(Kd())})}),D1=L({uri:F().startsWith(`file://`),name:F().optional(),_meta:pf(F(),ef()).optional()}),O1=JZ.extend({method:bf(`roots/list`),params:GZ.optional()}),k1=ZZ.extend({roots:I(D1)}),A1=XZ.extend({method:bf(`notifications/roots/list_changed`),params:YZ.optional()}),cf([DQ,SQ,T1,U$,b$,_$,e$,n$,o$,u$,f$,R$,P$,zQ,VQ,HQ,WQ]),cf([dQ,AQ,TQ,A1,RQ]),cf([lQ,t1,n1,x1,k1,BQ,UQ,IQ]),cf([DQ,e1,v1,O1,zQ,VQ,HQ,WQ]),cf([dQ,AQ,G$,m$,c$,z$,A$,RQ,b1]),cf([lQ,wQ,E1,k$,v$,t$,r$,s$,I$,F$,BQ,UQ,IQ]),j1=class e extends Error{constructor(e,t,n){super(`MCP error ${e}: ${t}`),this.code=e,this.data=n,this.name=`McpError`}static fromError(t,n,r){if(t===aQ.UrlElicitationRequired&&r){let e=r;if(e.elicitations)return new M1(e.elicitations,n)}return new e(t,n,r)}},M1=class extends j1{constructor(e,t=`URL elicitation${e.length>1?`s`:``} required`){super(aQ.UrlElicitationRequired,t,{elicitations:e})}get elicitations(){return this.data?.elicitations??[]}}}));async function P1(e){return(await z1).getRandomValues(new Uint8Array(e))}async function F1(e){let t=``;for(;t.length<e;){let n=await P1(e-t.length);for(let e of n)e<198&&(t+=`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~`[e%66])}return t}async function I1(e){return await F1(e)}async function L1(e){let t=await(await z1).subtle.digest(`SHA-256`,new TextEncoder().encode(e));return btoa(String.fromCharCode(...new Uint8Array(t))).replace(/\//g,`_`).replace(/\+/g,`-`).replace(/=/g,``)}async function R1(e){if(e||=43,e<43||e>128)throw`Expected a length between 43 and 128. Received ${e}.`;let t=await I1(e);return{code_verifier:t,code_challenge:await L1(t)}}var z1,B1=c((()=>{z1=globalThis.crypto})),V1,H1,U1,W1,G1,K1,q1,J1,Y1,X1,Z1,Q1=c((()=>{KI(),V1=vd().superRefine((e,t)=>{if(!URL.canParse(e))return t.addIssue({code:hm.custom,message:`URL must be parseable`,fatal:!0}),_}).refine(e=>{let t=new URL(e);return t.protocol!==`javascript:`&&t.protocol!==`data:`&&t.protocol!==`vbscript:`},{message:`URL cannot use javascript:, data:, or vbscript: scheme`}),H1=sf({resource:F().url(),authorization_servers:I(V1).optional(),jwks_uri:F().url().optional(),scopes_supported:I(F()).optional(),bearer_methods_supported:I(F()).optional(),resource_signing_alg_values_supported:I(F()).optional(),resource_name:F().optional(),resource_documentation:F().optional(),resource_policy_uri:F().url().optional(),resource_tos_uri:F().url().optional(),tls_client_certificate_bound_access_tokens:Kd().optional(),authorization_details_types_supported:I(F()).optional(),dpop_signing_alg_values_supported:I(F()).optional(),dpop_bound_access_tokens_required:Kd().optional()}),U1=sf({issuer:F(),authorization_endpoint:V1,token_endpoint:V1,registration_endpoint:V1.optional(),scopes_supported:I(F()).optional(),response_types_supported:I(F()),response_modes_supported:I(F()).optional(),grant_types_supported:I(F()).optional(),token_endpoint_auth_methods_supported:I(F()).optional(),token_endpoint_auth_signing_alg_values_supported:I(F()).optional(),service_documentation:V1.optional(),revocation_endpoint:V1.optional(),revocation_endpoint_auth_methods_supported:I(F()).optional(),revocation_endpoint_auth_signing_alg_values_supported:I(F()).optional(),introspection_endpoint:F().optional(),introspection_endpoint_auth_methods_supported:I(F()).optional(),introspection_endpoint_auth_signing_alg_values_supported:I(F()).optional(),code_challenge_methods_supported:I(F()).optional(),client_id_metadata_document_supported:Kd().optional()}),W1=sf({issuer:F(),authorization_endpoint:V1,token_endpoint:V1,userinfo_endpoint:V1.optional(),jwks_uri:V1,registration_endpoint:V1.optional(),scopes_supported:I(F()).optional(),response_types_supported:I(F()),response_modes_supported:I(F()).optional(),grant_types_supported:I(F()).optional(),acr_values_supported:I(F()).optional(),subject_types_supported:I(F()),id_token_signing_alg_values_supported:I(F()),id_token_encryption_alg_values_supported:I(F()).optional(),id_token_encryption_enc_values_supported:I(F()).optional(),userinfo_signing_alg_values_supported:I(F()).optional(),userinfo_encryption_alg_values_supported:I(F()).optional(),userinfo_encryption_enc_values_supported:I(F()).optional(),request_object_signing_alg_values_supported:I(F()).optional(),request_object_encryption_alg_values_supported:I(F()).optional(),request_object_encryption_enc_values_supported:I(F()).optional(),token_endpoint_auth_methods_supported:I(F()).optional(),token_endpoint_auth_signing_alg_values_supported:I(F()).optional(),display_values_supported:I(F()).optional(),claim_types_supported:I(F()).optional(),claims_supported:I(F()).optional(),service_documentation:F().optional(),claims_locales_supported:I(F()).optional(),ui_locales_supported:I(F()).optional(),claims_parameter_supported:Kd().optional(),request_parameter_supported:Kd().optional(),request_uri_parameter_supported:Kd().optional(),require_request_uri_registration:Kd().optional(),op_policy_uri:V1.optional(),op_tos_uri:V1.optional(),client_id_metadata_document_supported:Kd().optional()}),G1=L({...W1.shape,...U1.pick({code_challenge_methods_supported:!0}).shape}),K1=L({access_token:F(),id_token:F().optional(),token_type:F(),expires_in:bm().optional(),scope:F().optional(),refresh_token:F().optional()}).strip(),q1=L({error:F(),error_description:F().optional(),error_uri:F().optional()}),J1=V1.optional().or(bf(``).transform(()=>void 0)),Y1=L({redirect_uris:I(V1),token_endpoint_auth_method:F().optional(),grant_types:I(F()).optional(),response_types:I(F()).optional(),client_name:F().optional(),client_uri:V1.optional(),logo_uri:J1,scope:F().optional(),contacts:I(F()).optional(),tos_uri:J1,policy_uri:F().optional(),jwks_uri:V1.optional(),jwks:$d().optional(),software_id:F().optional(),software_version:F().optional(),software_statement:F().optional()}).strip(),X1=L({client_id:F(),client_secret:F().optional(),client_id_issued_at:Bd().optional(),client_secret_expires_at:Bd().optional()}).strip(),Z1=Y1.merge(X1),L({error:F(),error_description:F().optional()}).strip(),L({token:F(),token_type_hint:F().optional()}).strip()}));function $1(e){let t=typeof e==`string`?new URL(e):new URL(e.href);return t.hash=``,t}function e0({requestedResource:e,configuredResource:t}){let n=typeof e==`string`?new URL(e):new URL(e.href),r=typeof t==`string`?new URL(t):new URL(t.href);if(n.origin!==r.origin||n.pathname.length<r.pathname.length)return!1;let i=n.pathname.endsWith(`/`)?n.pathname:n.pathname+`/`,a=r.pathname.endsWith(`/`)?r.pathname:r.pathname+`/`;return i.startsWith(a)}var t0=c((()=>{})),n0,r0,i0,a0,o0,s0,c0,l0,u0,d0,f0,p0,m0,h0,g0,_0,v0,y0,b0,x0=c((()=>{n0=class extends Error{constructor(e,t){super(e),this.errorUri=t,this.name=this.constructor.name}toResponseObject(){let e={error:this.errorCode,error_description:this.message};return this.errorUri&&(e.error_uri=this.errorUri),e}get errorCode(){return this.constructor.errorCode}},r0=class extends n0{},r0.errorCode=`invalid_request`,i0=class extends n0{},i0.errorCode=`invalid_client`,a0=class extends n0{},a0.errorCode=`invalid_grant`,o0=class extends n0{},o0.errorCode=`unauthorized_client`,s0=class extends n0{},s0.errorCode=`unsupported_grant_type`,c0=class extends n0{},c0.errorCode=`invalid_scope`,l0=class extends n0{},l0.errorCode=`access_denied`,u0=class extends n0{},u0.errorCode=`server_error`,d0=class extends n0{},d0.errorCode=`temporarily_unavailable`,f0=class extends n0{},f0.errorCode=`unsupported_response_type`,p0=class extends n0{},p0.errorCode=`unsupported_token_type`,m0=class extends n0{},m0.errorCode=`invalid_token`,h0=class extends n0{},h0.errorCode=`method_not_allowed`,g0=class extends n0{},g0.errorCode=`too_many_requests`,_0=class extends n0{},_0.errorCode=`invalid_client_metadata`,v0=class extends n0{},v0.errorCode=`insufficient_scope`,y0=class extends n0{},y0.errorCode=`invalid_target`,b0={[r0.errorCode]:r0,[i0.errorCode]:i0,[a0.errorCode]:a0,[o0.errorCode]:o0,[s0.errorCode]:s0,[c0.errorCode]:c0,[l0.errorCode]:l0,[u0.errorCode]:u0,[d0.errorCode]:d0,[f0.errorCode]:f0,[p0.errorCode]:p0,[m0.errorCode]:m0,[h0.errorCode]:h0,[g0.errorCode]:g0,[_0.errorCode]:_0,[v0.errorCode]:v0,[y0.errorCode]:y0}}));function S0(e){return[`client_secret_basic`,`client_secret_post`,`none`].includes(e)}function C0(e,t){let n=e.client_secret!==void 0;return`token_endpoint_auth_method`in e&&e.token_endpoint_auth_method&&S0(e.token_endpoint_auth_method)&&(t.length===0||t.includes(e.token_endpoint_auth_method))?e.token_endpoint_auth_method:t.length===0?n?`client_secret_basic`:`none`:n&&t.includes(`client_secret_basic`)?`client_secret_basic`:n&&t.includes(`client_secret_post`)?`client_secret_post`:t.includes(`none`)?`none`:n?`client_secret_post`:`none`}function w0(e,t,n,r){let{client_id:i,client_secret:a}=t;switch(e){case`client_secret_basic`:T0(i,a,n);return;case`client_secret_post`:E0(i,a,r);return;case`none`:D0(i,r);return;default:throw Error(`Unsupported client authentication method: ${e}`)}}function T0(e,t,n){if(!t)throw Error(`client_secret_basic authentication requires a client_secret`);let r=btoa(`${e}:${t}`);n.set(`Authorization`,`Basic ${r}`)}function E0(e,t,n){n.set(`client_id`,e),t&&n.set(`client_secret`,t)}function D0(e,t){t.set(`client_id`,e)}async function O0(e){let t=e instanceof Response?e.status:void 0,n=e instanceof Response?await e.text():e;try{let{error:e,error_description:t,error_uri:r}=q1.parse(JSON.parse(n));return new(b0[e]||u0)(t||``,r)}catch(e){return new u0(`${t?`HTTP ${t}: `:``}Invalid OAuth error response: ${e}. Raw body: ${n}`)}}async function k0(e,t){try{return await A0(e,t)}catch(n){if(n instanceof i0||n instanceof o0)return await e.invalidateCredentials?.(`all`),await A0(e,t);if(n instanceof a0)return await e.invalidateCredentials?.(`tokens`),await A0(e,t);throw n}}async function A0(e,{serverUrl:t,authorizationCode:n,scope:r,resourceMetadataUrl:i,fetchFn:a}){let o=await e.discoveryState?.(),s,c,l,u=i;if(!u&&o?.resourceMetadataUrl&&(u=new URL(o.resourceMetadataUrl)),o?.authorizationServerUrl){if(c=o.authorizationServerUrl,s=o.resourceMetadata,l=o.authorizationServerMetadata??await H0(c,{fetchFn:a}),!s)try{s=await F0(t,{resourceMetadataUrl:u},a)}catch{}(l!==o.authorizationServerMetadata||s!==o.resourceMetadata)&&await e.saveDiscoveryState?.({authorizationServerUrl:String(c),resourceMetadataUrl:u?.toString(),resourceMetadata:s,authorizationServerMetadata:l})}else{let n=await U0(t,{resourceMetadataUrl:u,fetchFn:a});c=n.authorizationServerUrl,l=n.authorizationServerMetadata,s=n.resourceMetadata,await e.saveDiscoveryState?.({authorizationServerUrl:String(c),resourceMetadataUrl:u?.toString(),resourceMetadata:s,authorizationServerMetadata:l})}let d=await M0(t,e,s),f=r||s?.scopes_supported?.join(` `)||e.clientMetadata.scope,p=await Promise.resolve(e.clientInformation());if(!p){if(n!==void 0)throw Error(`Existing OAuth client information is required when exchanging an authorization code`);let t=l?.client_id_metadata_document_supported===!0,r=e.clientMetadataUrl;if(r&&!j0(r))throw new _0(`clientMetadataUrl must be a valid HTTPS URL with a non-root pathname, got: ${r}`);if(t&&r)p={client_id:r},await e.saveClientInformation?.(p);else{if(!e.saveClientInformation)throw Error(`OAuth client information must be saveable for dynamic registration`);let t=await Y0(c,{metadata:l,clientMetadata:e.clientMetadata,scope:f,fetchFn:a});await e.saveClientInformation(t),p=t}}let m=!e.redirectUrl;if(n!==void 0||m){let t=await J0(e,c,{metadata:l,resource:d,authorizationCode:n,fetchFn:a});return await e.saveTokens(t),`AUTHORIZED`}let h=await e.tokens();if(h?.refresh_token)try{let t=await q0(c,{metadata:l,clientInformation:p,refreshToken:h.refresh_token,resource:d,addClientAuthentication:e.addClientAuthentication,fetchFn:a});return await e.saveTokens(t),`AUTHORIZED`}catch(e){if(!(!(e instanceof n0)||e instanceof u0))throw e}let g=e.state?await e.state():void 0,{authorizationUrl:_,codeVerifier:v}=await W0(c,{metadata:l,clientInformation:p,state:g,redirectUrl:e.redirectUrl,scope:f,resource:d});return await e.saveCodeVerifier(v),await e.redirectToAuthorization(_),`REDIRECT`}function j0(e){if(!e)return!1;try{let t=new URL(e);return t.protocol===`https:`&&t.pathname!==`/`}catch{return!1}}async function M0(e,t,n){let r=$1(e);if(t.validateResourceURL)return await t.validateResourceURL(r,n?.resource);if(n){if(!e0({requestedResource:r,configuredResource:n.resource}))throw Error(`Protected resource ${n.resource} does not match expected ${r} (or origin)`);return new URL(n.resource)}}function N0(e){let t=e.headers.get(`WWW-Authenticate`);if(!t)return{};let[n,r]=t.split(` `);if(n.toLowerCase()!==`bearer`||!r)return{};let i=P0(e,`resource_metadata`)||void 0,a;if(i)try{a=new URL(i)}catch{}let o=P0(e,`scope`)||void 0,s=P0(e,`error`)||void 0;return{resourceMetadataUrl:a,scope:o,error:s}}function P0(e,t){let n=e.headers.get(`WWW-Authenticate`);if(!n)return null;let r=RegExp(`${t}=(?:"([^"]+)"|([^\\s,]+))`),i=n.match(r);return i?i[1]||i[2]:null}async function F0(e,t,n=fetch){let r=await B0(e,`oauth-protected-resource`,n,{protocolVersion:t?.protocolVersion,metadataUrl:t?.resourceMetadataUrl});if(!r||r.status===404)throw await r?.body?.cancel(),Error(`Resource server does not implement OAuth 2.0 Protected Resource Metadata.`);if(!r.ok)throw await r.body?.cancel(),Error(`HTTP ${r.status} trying to load well-known OAuth protected resource metadata.`);return H1.parse(await r.json())}async function I0(e,t,n=fetch){try{return await n(e,{headers:t})}catch(r){if(r instanceof TypeError)return t?I0(e,void 0,n):void 0;throw r}}function L0(e,t=``,n={}){return t.endsWith(`/`)&&(t=t.slice(0,-1)),n.prependPathname?`${t}/.well-known/${e}`:`/.well-known/${e}${t}`}async function R0(e,t,n=fetch){return await I0(e,{"MCP-Protocol-Version":t},n)}function z0(e,t){return!e||e.status>=400&&e.status<500&&t!==`/`}async function B0(e,t,n,r){let i=new URL(e),a=r?.protocolVersion??`2025-11-25`,o;if(r?.metadataUrl)o=new URL(r.metadataUrl);else{let e=L0(t,i.pathname);o=new URL(e,r?.metadataServerUrl??i),o.search=i.search}let s=await R0(o,a,n);return!r?.metadataUrl&&z0(s,i.pathname)&&(s=await R0(new URL(`/.well-known/${t}`,i),a,n)),s}function V0(e){let t=typeof e==`string`?new URL(e):e,n=t.pathname!==`/`,r=[];if(!n)return r.push({url:new URL(`/.well-known/oauth-authorization-server`,t.origin),type:`oauth`}),r.push({url:new URL(`/.well-known/openid-configuration`,t.origin),type:`oidc`}),r;let i=t.pathname;return i.endsWith(`/`)&&(i=i.slice(0,-1)),r.push({url:new URL(`/.well-known/oauth-authorization-server${i}`,t.origin),type:`oauth`}),r.push({url:new URL(`/.well-known/openid-configuration${i}`,t.origin),type:`oidc`}),r.push({url:new URL(`${i}/.well-known/openid-configuration`,t.origin),type:`oidc`}),r}async function H0(e,{fetchFn:t=fetch,protocolVersion:n=IZ}={}){let r={"MCP-Protocol-Version":n,Accept:`application/json`},i=V0(e);for(let{url:e,type:n}of i){let i=await I0(e,r,t);if(i){if(!i.ok){if(await i.body?.cancel(),i.status>=400&&i.status<500)continue;throw Error(`HTTP ${i.status} trying to load ${n===`oauth`?`OAuth`:`OpenID provider`} metadata from ${e}`)}return n===`oauth`?U1.parse(await i.json()):G1.parse(await i.json())}}}async function U0(e,t){let n,r;try{n=await F0(e,{resourceMetadataUrl:t?.resourceMetadataUrl},t?.fetchFn),n.authorization_servers&&n.authorization_servers.length>0&&(r=n.authorization_servers[0])}catch{}r||=String(new URL(`/`,e));let i=await H0(r,{fetchFn:t?.fetchFn});return{authorizationServerUrl:r,authorizationServerMetadata:i,resourceMetadata:n}}async function W0(e,{metadata:t,clientInformation:n,redirectUrl:r,scope:i,state:a,resource:o}){let s;if(t){if(s=new URL(t.authorization_endpoint),!t.response_types_supported.includes(Z0))throw Error(`Incompatible auth server: does not support response type ${Z0}`);if(t.code_challenge_methods_supported&&!t.code_challenge_methods_supported.includes(Q0))throw Error(`Incompatible auth server: does not support code challenge method ${Q0}`)}else s=new URL(`/authorize`,e);let c=await R1(),l=c.code_verifier,u=c.code_challenge;return s.searchParams.set(`response_type`,Z0),s.searchParams.set(`client_id`,n.client_id),s.searchParams.set(`code_challenge`,u),s.searchParams.set(`code_challenge_method`,Q0),s.searchParams.set(`redirect_uri`,String(r)),a&&s.searchParams.set(`state`,a),i&&s.searchParams.set(`scope`,i),i?.includes(`offline_access`)&&s.searchParams.append(`prompt`,`consent`),o&&s.searchParams.set(`resource`,o.href),{authorizationUrl:s,codeVerifier:l}}function G0(e,t,n){return new URLSearchParams({grant_type:`authorization_code`,code:e,code_verifier:t,redirect_uri:String(n)})}async function K0(e,{metadata:t,tokenRequestParams:n,clientInformation:r,addClientAuthentication:i,resource:a,fetchFn:o}){let s=t?.token_endpoint?new URL(t.token_endpoint):new URL(`/token`,e),c=new Headers({"Content-Type":`application/x-www-form-urlencoded`,Accept:`application/json`});a&&n.set(`resource`,a.href),i?await i(c,n,s,t):r&&w0(C0(r,t?.token_endpoint_auth_methods_supported??[]),r,c,n);let l=await(o??fetch)(s,{method:`POST`,headers:c,body:n});if(!l.ok)throw await O0(l);return K1.parse(await l.json())}async function q0(e,{metadata:t,clientInformation:n,refreshToken:r,resource:i,addClientAuthentication:a,fetchFn:o}){return{refresh_token:r,...await K0(e,{metadata:t,tokenRequestParams:new URLSearchParams({grant_type:`refresh_token`,refresh_token:r}),clientInformation:n,addClientAuthentication:a,resource:i,fetchFn:o})}}async function J0(e,t,{metadata:n,resource:r,authorizationCode:i,fetchFn:a}={}){let o=e.clientMetadata.scope,s;if(e.prepareTokenRequest&&(s=await e.prepareTokenRequest(o)),!s){if(!i)throw Error(`Either provider.prepareTokenRequest() or authorizationCode is required`);if(!e.redirectUrl)throw Error(`redirectUrl is required for authorization_code flow`);s=G0(i,await e.codeVerifier(),e.redirectUrl)}let c=await e.clientInformation();return K0(t,{metadata:n,tokenRequestParams:s,clientInformation:c??void 0,addClientAuthentication:e.addClientAuthentication,resource:r,fetchFn:a})}async function Y0(e,{metadata:t,clientMetadata:n,scope:r,fetchFn:i}){let a;if(t){if(!t.registration_endpoint)throw Error(`Incompatible auth server: does not support dynamic client registration`);a=new URL(t.registration_endpoint)}else a=new URL(`/register`,e);let o=await(i??fetch)(a,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...n,...r===void 0?{}:{scope:r}})});if(!o.ok)throw await O0(o);return Z1.parse(await o.json())}var X0,Z0,Q0,$0=c((()=>{B1(),N1(),Q1(),t0(),x0(),X0=class extends Error{constructor(e){super(e??`Unauthorized`)}},Z0=`code`,Q0=`S256`}));function e2(e){}function t2(e){if(typeof e==`function`)throw TypeError("`config` must be an object, got a function instead. Did you mean `createParser({onEvent: fn})`?");let{onEvent:t=e2,onError:n=e2,onRetry:r=e2,onComment:i,maxBufferSize:a}=e,o=[],s=0,c=!0,l,u=``,d=0,f,p=!1;function m(e){if(p)throw Error("Cannot feed parser: it was terminated after exceeding the configured max buffer size. Call `reset()` to resume parsing.");if(c&&(c=!1,e.charCodeAt(0)===239&&e.charCodeAt(1)===187&&e.charCodeAt(2)===191&&(e=e.slice(3))),o.length===0){let t=g(e);t!==``&&(o.push(t),s=t.length),h();return}if(e.indexOf(`
206
206
  `)===-1&&e.indexOf(`\r`)===-1){o.push(e),s+=e.length,h();return}o.push(e);let t=o.join(``);o.length=0,s=0;let n=g(t);n!==``&&(o.push(n),s=n.length),h()}function h(){a!==void 0&&(s+u.length<=a||(p=!0,o.length=0,s=0,l=void 0,u=``,d=0,f=void 0,n(new i2(`Buffered data exceeded max buffer size of ${a} characters`,{type:`max-buffer-size-exceeded`}))))}function g(e){let n=0;if(e.indexOf(`\r`)===-1){let r=e.indexOf(`
@@ -349,7 +349,7 @@ ${`- 输出形态:完整、自包含的 HTML 页面(.${r},可独立成页)`}
349
349
  `+e.map(e=>`#${e.id} [${e.label??`auto`}] 消息数=${e.messageCount} 时间=${new Date(e.timestamp).toLocaleTimeString()}`).join(`
350
350
  `):`无可用 checkpoint。`},{name:`list_checkpoints`,description:`列出可用会话 checkpoint(回退点)。`,schema:L({}).optional()})]:[];Ce.forEach(e=>ve.set(e.name,`builtin`));let we=se.focus,Te=iB(async({path:e,label:t})=>{let n=_e()?.schema;return n?OJ(n,e)?(b.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:L({path:F().describe(`要聚焦的组件 jsonPath,如 components.3`),label:F().optional().describe(`人类可读标签,如「导航栏」`)})}),Ee=iB(async()=>(b.clearFocus(),`已清除聚焦,恢复全量可操作范围(可读写所有组件)。`),{name:`clear_focus`,description:`清除当前聚焦,退出精修模式,恢复对全部组件的读写权限。`,schema:L({}).optional()}),De=iB(async({path:e,label:t})=>{let n=_e()?.schema;if(!n)return`聚焦失败:当前无主数据 schema,无法聚焦。`;if(!OJ(n,e))return`PATH_DENIED · 聚焦失败:path "${e}" 不在 schema 内。请先用 read 查看可操作路径再聚焦。`;b.addFocus({path:e,...t?{label:t}:{}});let r=b.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:L({path:F().describe(`要追加聚焦的组件 jsonPath,如 components.3`),label:F().optional().describe(`人类可读标签`)})}),Oe=iB(async({path:e})=>{let t=b.getFocuses().length;b.removeFocus(e);let n=b.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:L({path:F().describe(`要移除的焦点 jsonPath`)})}),ke=we&&e.toolMode===`advanced`?[Te,Ee,De,Oe]:[];ke.forEach(e=>ve.set(e.name,`builtin`));let Ae=[],je=new Map,Me=Ne();function Ne(){let{tools:e,collisions:t}=ase([{label:`builtin`,tools:ye},{label:`user`,tools:be},{label:`action`,tools:j},{label:`humanConfirm`,tools:N?[N]:[]},{label:`checkpoint`,tools:Ce},{label:`focus`,tools:ke},{label:`mcp`,tools:xe},{label:`skill`,tools:Ae}]);return t.length&&console.warn(`[page-agent-sdk] 工具重名,后注册覆盖先注册:`,t.map(e=>`${e.name}(${e.loser}→${e.winner})`).join(`, `)),e}let Pe=se.planning,Fe=se.missionAnchor,Ie=se.workingMemory,Le=se.skills,Re=se.vfs||re;if(Re)for(let e of Kae)ve.set(e,`builtin`);if(Pe)for(let e of v.tools??[])ve.set(e.name,`builtin`);let ze=se.summarization,Be=se.agentCompression&&!!l;e.debug&&se.agentCompression&&!l&&console.warn(`[page-agent-sdk][agentCompression] agentCompression 开启但 summaryLlm 不可用(或缺 apiKey / 模型不支持工具),压缩决策不启用,回退静态压缩`);let Ve=se.memory,He=se.subagent,Ue=He?KX():void 0,We=e.verify?.maxAttempts??2,Ge=!!(e.verify?.check||e.verify?.maxAttempts||e.verify?.adversarial),Ke=e.capabilities?.verify===!1,qe=(se.verify||Ge&&!Ke)&&e.verify?.enabled!==!1&&We>0,Je=se.contextInspector;Ge&&!qe&&e.verify?.enabled!==!1&&console.warn(`[page-agent-sdk][verify] 检测到 verify 配置(check/maxAttempts/adversarial)但未装载(capabilities.verify:false 显式关闭 或 maxAttempts≤0)`);let Ye=e.subagent,Xe=Ye?.allowedTools??[],Ze=e.permissions?.length?uX(e.permissions):void 0,Qe=e.approval&&(e.approval.tools!==void 0||e.approval.confirm)?dX(e.approval):void 0,$e=[...Ze?[Ze]:[],...Qe?[Qe]:[]],et=!He||Ye?.enabled===!1?void 0:cZ({llm:Ye?.llm??e.llm,allTools:()=>P.agent?.allTools??Me,allowedTools:Xe.length?Xe:void 0,systemPrompt:Ye?.systemPrompt,temperature:Ye?.temperature,maxTokens:Ye?.maxTokens,skills:Ye?.skills,maxDepth:Ye?.maxDepth,maxParallel:Ye?.maxParallel,debug:e.debug,getFocuses:()=>b.getFocuses(),getSchema:()=>_e()?.schema??null,tracker:Ue,guardMiddleware:$e.length?$e:void 0,getVfsFiles:Re?()=>_.files:void 0,enterDataScope:he?.enterScope?e=>he.enterScope(e):void 0,exitDataScope:he?.exitScope?e=>he.exitScope(e):void 0,onUsage:e=>{n.prompt_tokens=(n.prompt_tokens??0)+(e.prompt_tokens??0),n.completion_tokens=(n.completion_tokens??0)+(e.completion_tokens??0),n.total_tokens=(n.total_tokens??0)+(e.total_tokens??0)},timeoutMs:Ye?.timeoutMs}),tt=D?.map(e=>{if(!e._codeAsset)return e;let t=e._codeAsset,n=eoe({writablePaths:t.writablePaths,codeVfsPrefix:t.codeVfsPrefix,ext:t.ext,codeField:t.codeField,craftNotes:t.craftNotes,onWarning:e=>console.warn(`[page-agent-sdk][code-asset] ${e}`),getController:()=>he,vfsStore:_}),r=[...e.middleware??[],n];for(let e of r)e&&typeof e==`object`&&typeof e._setGetController==`function`&&e._setGetController(()=>he);return{...e,middleware:r}}),nt=re&&He?toe():void 0,rt=nt?soe({getBind:()=>_e()?.bind,writablePaths:O,getLocked:()=>nt.locked(),tools:Me}):void 0,it=He&&tt!==void 0?dZ(tt,{llm:e.llm,allTools:()=>P.agent?.allTools??Me,debug:e.debug,getFocuses:()=>b.getFocuses(),getSchema:()=>_e()?.schema??null,getBind:()=>_e()?.bind,tracker:Ue,guardMiddleware:$e.length?$e:void 0,getVfsFiles:Re?()=>_.files:void 0,enterDataScope:he?.enterScope?e=>he.enterScope(e):void 0,exitDataScope:he?.exitScope?e=>he.exitScope(e):void 0,onUsage:e=>{n.prompt_tokens=(n.prompt_tokens??0)+(e.prompt_tokens??0),n.completion_tokens=(n.completion_tokens??0)+(e.completion_tokens??0),n.total_tokens=(n.total_tokens??0)+(e.total_tokens??0)},timeoutMs:e.subagent?.timeoutMs,...nt?{componentLock:nt,resolveComponents:e=>noe(e,Qae(_e()?.bind,O))}:{}}):void 0,at=it?it.controller:null,ot=[`get_data`,`describe_data`,`read`,`fetch_document`],st=Me.filter(e=>ot.includes(e.name)),ct=qe?fZ({check:e.verify.check??vZ({schemas:()=>_e()?{"":_e().schema}:{},root:()=>_e()?.bind}),adversarial:e.verify?.adversarial?{llm:e.llm,tools:st}:void 0}):void 0,lt=Je?MZ({contextWindow:u.contextWindow,thresholdRatio:x8(e,u.contextWindow).summaryThresholdRatio}):void 0,ut=u5({...se,humanConfirm:Se,subagents:D?.map(e=>({id:e.id,description:e.description,temperature:e.temperature}))},ce&&!!w,e.toolMode,!!w?.resources?.length,{promptSoftCap:VX(u.contextWindow,d.promptSoftCapTokens)}),dt=w?{name:`dataHint`,augmentPrompt:()=>S6(_e(),e.schemaHint)||void 0}:null,ft=e.augmentSystem?{name:`augmentSystem`,augmentPrompt:t=>{try{return e.augmentSystem({state:t,data:_e()})}catch(t){e.debug&&console.log(`[page-agent-sdk][augmentSystem] 回调抛错,降级跳过:`,t.message);return}}}:null,pt=y8(e.onEvent),mt=pt.emit,ht,gt=[],_t=e=>({name:e.name,description:e.description,content:typeof e.getContent==`function`?e.getContent():``}),vt=e=>({name:e.name,description:e.description,getContent:()=>e.content}),yt=e.skillStorage===!1?null:m5({...typeof e.skillStorage==`object`?e.skillStorage:{},id:e.skillStorage&&typeof e.skillStorage==`object`&&e.skillStorage.id?e.skillStorage.id:`agent::${t}`}),bt=se.preferences,xt=bt&&e.preferenceStorage!==!1?v5({...typeof e.preferenceStorage==`object`?e.preferenceStorage:{},id:e.preferenceStorage&&typeof e.preferenceStorage==`object`&&e.preferenceStorage.id?e.preferenceStorage.id:`agent::${t}`}):null,St=xt?w5({store:xt,llmInvoke:s,getSessionId:()=>P.sessionId,onDebug:e=>{let t=P.agent?.debugLogs;t&&(t.value.push({timestamp:Date.now(),type:`middleware`,data:e}),cH(t))}}):null,Ct=()=>{let t=ht?ht.controller:null;if(t){let n=(e.skills||[]).filter(e=>!gt.some(t=>t.name===e.name));t.set([...n,...gt])}P.infoTick.value++},wt=async()=>{if(yt)try{let t=await yt.list();if(t.length){gt=t.map(vt);let n=ht?ht.controller:null;if(n){let t=(e.skills||[]).filter(e=>!gt.some(t=>t.name===e.name));n.set([...t,...gt])}P.infoTick.value++}}catch{}},Tt=ze?GX({...d,llmInvoke:s,getRegisteredData:()=>_e()?[{description:_e().description??`主数据对象`}]:[],preserveLastToolResults:p,...Be?{decideInvoke:l,getSnapshot:()=>lt?.getSnapshot()}:{}}):void 0,Et=Moe([...dt?[dt]:[],ut,...Fe?[y]:[],...St?[St]:[],...Pe?[v]:[],...Le?[ht=rX(e.skills||[],{readVfs:Re?e=>_.files[e]?.content:void 0,hostScriptEnabled:se.skillHostScript,onToolsReady:(e,t)=>{for(let n of t){let t=Ae.findIndex(e=>e.name===n.name);t>=0&&Ae.splice(t,1),Ae.push(n),je.set(n.name,e),ve.set(n.name,`skill:${e}`)}Me=Ne(),P.agent&&P.agent.setTools(Me),P.infoTick.value++}})]:[],...Re?[Jae(_)]:[],...Tt?[Tt]:[],...Ie?[x]:[],...we?[b]:[],...ge?[ge]:[],...Ve?[S]:[],...Ze?[Ze]:[],...ae&&oe&&A?[CX(A)]:[],...Se?[hX()]:[],...Qe?[Qe]:[],...ct?[ct]:[],...et?[et]:[],...it?[it]:[],...rt?[rt]:[],...ft?[ft]:[],...lt?[lt]:[],...e.middleware||[],...de?[tse(n,{tokenBudget:e.tokenBudget,timeBudgetMs:e.timeBudgetMs},mt)]:[],xse(mt,g,_e,n)]),Dt=e.maxMemoryRounds??vse,Ot=e.approval?.timeoutMs,kt=Ot===void 0||Ot===0?3e4:!Number.isFinite(Ot)||Ot<0?0:Ot;function At(e){if(kt)return t=>{if(t.type!==`approval_request`)return;let n=Date.now(),r=t.toolName;setTimeout(()=>{e?.aborted||(t.resolve(!1),mt({type:`error`,message:`确认请求(${r})${Math.round((Date.now()-n)/1e3)}s 无响应已自动拒绝 —— send/batch 路径无 UI 响应方;可传 approval.timeoutMs 调整(Infinity = 无限等)`,severity:`observable`,code:`APPROVAL_AUTO_REJECTED`,context:{toolName:r,waitedMs:Date.now()-n}}))},kt)}}function jt(e){let t=At(e);return e=>{t?.(e),e.type===`error`&&mt(e)}}let Mt=aH([]);async function Nt(){if(a)try{Mt.value=(await a.listSessions(t)).sort((e,t)=>t.lastAccessed-e.lastAccessed)}catch(t){e.debug&&console.warn(`[page-agent-sdk][persist] refreshSessions 失败(已吞):`,t)}}let Pt=D5(),Ft=new Set;function It(e){let t=new AbortController,n=()=>t.abort();return e&&(e.aborted?t.abort():e.addEventListener(`abort`,n,{once:!0})),Ft.add(t),{controller:t,untrack:()=>{Ft.delete(t),e?.removeEventListener(`abort`,n)}}}function Lt(){for(let e of Ft)e.abort();Ft.clear()}let P={agentId:t,store:a,messages:g,vfsStore:_,listeners:pt.listeners,todosMw:v,memoryMw:S,missionMw:y,workingMemoryMw:x,focusMw:b,agent:null,initDone:Promise.resolve(),sessionId:``,refCount:0,mcpClosers:[],mcpServers:[],checkpoint:A,dataOpsController:he,skillsController:ht?ht.controller:null,infoTick:i,pendingConflict:r.pendingConflict,sessions:Mt,refreshSessions:Nt,liveData:_e,usage:n,emit:mt,runSerial:Pt,trackActive:It,abortAllActive:Lt,unloadSkillTools(e){if(e){let t=Ae.length;if(Ae=Ae.filter(t=>je.get(t.name)===e?(ve.delete(t.name),je.delete(t.name),!1):!0),Ae.length===t)return}else{if(!Ae.length)return;for(let e of Ae)ve.delete(e.name),je.delete(e.name);Ae=[]}Me=Ne(),P.agent&&P.agent.setTools(Me)},applySnapshot(t){if(t.messages?.length&&g.push(...t.messages),t.vfs&&_.hydrate&&_.hydrate(t.vfs),t.todos?.length&&v.reset(t.todos),t.memory&&!e.memory&&S.reset(t.memory),t.checkpoints?.length&&A&&A.importStack(t.checkpoints),t.usage&&Object.assign(n,t.usage),t.mission&&Fe&&y.setMission(t.mission),t.workingMemory&&Ie&&x.restore(t.workingMemory),we){let n=t.focus,r=n?Array.isArray(n)?n:[n]:[];if(r.length){let t=_e()?.schema,n=t?r.filter(e=>OJ(t,e.path)):[];if(n.length&&(b.setFocus(null),n.forEach(e=>b.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)}}}Vt()},addSkill(e){let t=gt.findIndex(t=>t.name===e.name);t>=0?gt[t]=e:gt.push(e),Ct(),yt&&yt.put(_t(e))},removeSkill(e){let t=gt.findIndex(t=>t.name===e);return t<0?!1:(gt.splice(t,1),Ct(),yt&&yt.remove(e),!0)},listUserSkills(){return gt.map(e=>e.name)},getUserSkill(e){let t=gt.find(t=>t.name===e);if(t)return{name:t.name,description:t.description,content:typeof t.getContent==`function`?t.getContent():``}},afterRound(){Ht(),Jt()},async send(e,t){if(await P.initDone,P.refCount<=0)throw Error(`page-agent-sdk: agent 已释放(unmount),拒绝排队中的 send`);t??={},t?.mission&&Fe&&y.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=de?t.maxAutoRetries??1:0,i=0,o=!1,s=jt(t.signal),c=P.sessionId;for(;;){o||=(g.push({role:`user`,content:n,timestamp:Date.now()}),!0);try{let e=await P.agent.invoke(g,t.signal,s);if(t.signal?.aborted||P.sessionId!==c||P.refCount<=0)return P.agent?.debugLogs?.value?.push({timestamp:Date.now(),type:`middleware`,data:{stage:`orphan_round_dropped`,fromSession:c,aborted:!!t.signal?.aborted,sessionChanged:P.sessionId!==c}}),e;if(t.interceptors?.output)try{let n=t.interceptors.output(e);typeof n==`string`&&(e=n)}catch{}return g.push({role:`assistant`,content:e,timestamp:Date.now()}),P.afterRound(),a&&await a.flush(),e}catch(e){if(Gq(e,t.signal))throw e;let n=Aq(e,`fatal`);if(i<r&&A?.canRestore()){i+=1,A.restore(),o=!0,mt({type:`error`,message:`致命错误自动恢复(${i}/${r}):${n.message},已回退 checkpoint 重试`,severity:`observable`,code:`AUTO_RECOVER_RETRY`,context:{attempt:i,cause:n.code??n.message.slice(0,120)}});continue}throw mt({type:`error`,message:n.message,severity:n.severity,...n.code?{code:n.code}:{},...n.context===void 0?{}:{context:n.context}}),e}}},async batch(e,t,n){if(await P.initDone,!e.length)return[];if(P.refCount<=0)throw Error(`page-agent-sdk: agent 已释放(unmount),拒绝排队中的 batch`);let r=[],i=jt(n);for(let o=0;o<e.length;o++){if(n?.aborted){for(let t=o;t<e.length;t++)r.push({index:t,task:e[t],error:`aborted(外部中止)`,ok:!1});break}let s=e[o];A&&A.save(`batch:${o}`);let c=g.length;try{g.push({role:`user`,content:s,timestamp:Date.now()});let c=await P.agent.invoke(g,n,i);g.push({role:`assistant`,content:c,timestamp:Date.now()}),P.afterRound(),a&&await a.flush(),r.push({index:o,task:s,reply:c,ok:!0}),t?.({done:o+1,total:e.length,task:s,ok:!0})}catch(i){if(g.length>c&&g.splice(c),Gq(i,n)){r.push({index:o,task:s,error:`aborted(外部中止)`,ok:!1});for(let t=o+1;t<e.length;t++)r.push({index:t,task:e[t],error:`aborted(外部中止)`,ok:!1});break}let a=Aq(i,`fatal`);mt({type:`error`,message:`批量任务 ${o+1}/${e.length} 失败:${a.message}`,severity:`observable`,code:`BATCH_TASK_FAILED`,context:{index:o,task:s.slice(0,100)}}),r.push({index:o,task:s,error:a.message,ok:!1}),t?.({done:o+1,total:e.length,task:s,ok:!1})}}return r},async switchSession(n){if(await P.initDone,!a)throw Error(`page-agent-sdk: storage 未开启,无法切换会话(请传 storage 选项)`);if(r.resolve(`keep_external`),P.sessionId&&a){if(Fe){let e=y.getMission();e&&Kt({mission:e})}if(Ie){let e=x.getWorkingMemory();e&&Kt({workingMemory:e})}if(we){let e=b.getFocuses();Kt({focus:e.length?e:null})}}_.flush?.(),await a.flush();let i=n??``,o;return i?(o=await a.load(t,i),o||await a.createSession(t,e.session?.title,i)):i=await a.createSession(t,e.session?.title),P.sessionId=i,g.splice(0,g.length),_.clear?.(),v.reset([]),e.memory||S.reset(``),y.reset(),x.reset(),b.reset(),St?.resetScanCursor(),A&&A.importStack([]),P.agent.debugLogs.value=[],o||=await a.load(t,i),o&&(P.applySnapshot(o),mt({type:`session_restored`,sessionId:i,rounds:o.messages?.length??0})),e.memory&&Kt({memory:S.get()||(typeof e.memory==`string`?e.memory:``)}),Nt(),Ut=void 0,Wt=!1,P.infoTick.value++,i},resetSession:()=>{Lt(),r.resolve(`keep_external`),P.sessionId=t8(),g.splice(0,g.length),_.clear?.(),v.reset([]),e.memory||S.reset(``),y.reset(),x.reset(),b.reset(),St?.resetScanCursor(),A&&A.importStack([]),P.agent&&(P.agent.debugLogs.value=[]),a&&a.createSession(P.agentId,e.session?.title,P.sessionId).catch(t=>{e.debug&&console.warn(`[page-agent-sdk][persist] createSession 失败(已吞):`,t)}),mt({type:`session_restored`,sessionId:P.sessionId,rounds:0}),P.infoTick.value++,Nt(),Ut=void 0,Wt=!1},stream:(e,t,n)=>{if(!P.agent)throw Error(`page-agent-sdk: agent 尚未初始化完成,请先 await mount()`);_?.setProtectedRefs?.(E5(e));let i=e=>{t?.(e),mt(e),e.type===`subagent`&&(e.kind===`tool_call`||e.kind===`tool_result`)&&P.infoTick.value++};if(n){let e=()=>r.resolve(`keep_external`);n.aborted?e():n.addEventListener(`abort`,e,{once:!0})}let{controller:a,untrack:o}=It(n);return P.agent.stream(e,i,a.signal).finally(o)},release(){if(P.refCount--,P.refCount<=0){Lt(),M=!0,a&&(_.flush?.(),a.flush(),a.dispose()),yt&&yt.dispose();let e=P.mcpClosers.splice(0);e.length&&Promise.allSettled(e.map(e=>e())),O5.delete(t)}},resolveConflict:r.resolve,setTools(e){be.length=0,e.forEach(e=>{be.push(e),ve.set(e.name,`user`)}),Me=Ne(),P.agent&&P.agent.setTools(Me),P.infoTick.value++},addTool(e){Me.some(t=>t.name===e.name)&&console.warn(`[page-agent-sdk] 工具 "${e.name}" 已存在,新工具覆盖(后注册覆盖先注册)`);for(let t=be.length-1;t>=0;t--)be[t].name===e.name&&be.splice(t,1);be.push(e),ve.set(e.name,`user`),Me=Ne(),P.agent&&P.agent.setTools(Me),P.infoTick.value++},removeTool(e){let t=be.findIndex(t=>t.name===e);return t<0?!1:(be.splice(t,1),ve.delete(e),Me=Ne(),P.agent&&P.agent.setTools(Me),P.infoTick.value++,!0)},setLlm(t){let n;if(Y6(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=sB(e)}typeof n.bindTools!=`function`&&e.debug&&console.warn(`[page-agent-sdk][setLlm] 新模型不支持 bindTools(tool calling 会失效)`),h=t;let r=Y6(t)?void 0:t;if(u=zq({model:r?.model??t.model??t.modelName,contextWindow:e.contextWindow??r?.contextWindow,maxOutputTokens:e.maxOutputTokens??r?.maxOutputTokens}),u.contextWindow<2e5)throw Error(`[page-agent-sdk][setLlm] 新模型上下文窗口 ${u.contextWindow} 小于最小支持 ${Rq}(需 ≥200K 窗口模型)`);P.agent&&(P.agent.setLlm(n),P.agent.setModelCaps?.(u)),Tt?.setContextWindow?.(u.contextWindow),lt?.setContextWindow?.(u.contextWindow),P.infoTick.value++,e.debug&&console.log(`[page-agent-sdk][setLlm] 重解析 modelCaps + 回灌:`,u)},setMemory(e){S.reset(e),typeof e==`function`&&S.refresh(),P.infoTick.value++},refreshMemory(){return S.refresh()},setSubagents(t){if(!at){e.debug&&console.warn(`[page-agent-sdk][setSubagents] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略`);return}at.set(t),P.infoTick.value++},addSubagent(t){if(!at){e.debug&&console.warn(`[page-agent-sdk][addSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略`);return}at.add(t),P.infoTick.value++},removeSubagent(t){if(!at)return e.debug&&console.warn(`[page-agent-sdk][removeSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略`),!1;let n=at.remove(t);return n&&P.infoTick.value++,n},getActiveSubagents(){return Ue?.getActive()??[]},get subagentHistory(){return Ue?.getHistory()??[]},getInfo(){return{id:t,sessionId:P.sessionId,model:Y6(h)?h.model??h.modelName:h.model,systemPrompt:P.agent?.getEffectiveSystemPrompt?.()??fe+S6(_e(),e.schemaHint),tools:(P.agent?.allTools??Me).map(e=>({name:e.name,description:e.description,schema:e.schema,source:ve.get(e.name)||`user`})),skills:(ht?ht.controller.get():e.skills??[]).map(e=>({name:e.name,description:e.description})),data:_e()?{description:_e().description,schema:_e().schema}:void 0,contextPreset:e.contextPreset??`auto`,compression:{contextWindow:u.contextWindow,summaryThresholdRatio:d.summaryThresholdRatio??.5,promptSoftCap:VX(u.contextWindow,d.promptSoftCapTokens)},memory:S.get(),middleware:Et.map(e=>e.name),todos:(P.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:v.getPlanPhase(),mission:Fe?y.getMission():void 0,preferences:bt&&St?St.getPreferences():void 0,workingMemory:Ie?x.getWorkingMemory():void 0,focus:we?b.getFocus():void 0,focuses:we?b.getFocuses():[],trace:ue&&P.agent?.spans?{spans:P.agent.spans.value,metrics:Uq(P.agent.spans.value)}:void 0,actions:s5(e.actions??{}),subagent:{enabled:!!et,maxDepth:e.subagent?.maxDepth??1,maxParallel:e.subagent?.maxParallel??4,allowedTools:e.subagent?.allowedTools??[],subagents:at?.get()??[],active:Ue?.getActive()??[],history:Ue?.getHistory()??[],lockedComponents:nt?.locked()??{}},verify:{enabled:!!ct,maxAttempts:qe?We:0,adversarial:qe&&!!e.verify?.adversarial},context:(()=>{let e=lt?.getSnapshot();if(e){let t=P.agent?.getState?.()?.lastCompression;t&&(e.compression=t)}return e})(),mcp:{servers:P.mcpServers},lastCompression:P.agent?.getState?.()?.lastCompression,checkpoints:A?{enabled:!0,auto:oe,list:A.list()}:void 0}},getMission(){return Fe?y.getMission():void 0},setMission(t){if(!Fe){e.debug&&console.warn(`[page-agent-sdk][mission] capabilities.missionAnchor 关闭,setMission 忽略`);return}y.setMission(t),P.infoTick.value++},getPreferences(){return St?St.getPreferences():[]},async removePreference(e){if(!St)return!1;let t=await St.removePreference(e);return t&&P.infoTick.value++,t},async clearPreferences(){St&&(await St.clearPreferences(),P.infoTick.value++)},getFocus(){return we?b.getFocus():void 0},getFocuses(){return we?b.getFocuses():[]},setFocus(t){let n=k5(t,`setFocus`,we,()=>_e()?.schema,e.debug);return n.ok?(b.setFocus(t),P.infoTick.value++,{ok:!0}):n},addFocus(t){let n=k5(t,`addFocus`,we,()=>_e()?.schema,e.debug);return n.ok?b.getFocuses().length>=8?(e.debug&&console.warn(`[page-agent-sdk][focus] addFocus 拒绝:焦点数已达上限 8(augmentPrompt 注入每焦点子树 schema,过多致 system prompt 超预算)`),{ok:!1,error:`焦点数上限 8(避免 system prompt 撑爆)`}):(b.addFocus(t),P.infoTick.value++,{ok:!0}):n},removeFocus(e){we&&(b.removeFocus(e),P.infoTick.value++)},clearFocus(){we&&(b.clearFocus(),P.infoTick.value++)}};async function Rt(){if(!a)return;await a.ready;let n=e.session||{};if(n.id){P.sessionId=n.id;let e=await a.load(t,P.sessionId);e?(P.applySnapshot(e),mt({type:`session_restored`,sessionId:P.sessionId,rounds:e.messages?.length??0})):await a.createSession(t,n.title,P.sessionId)}else if(n.autoResume!==!1){let r=await a.listSessions(t);if(e.debug&&console.log(`[page-agent-sdk][restore] listSessions`,t,r.length,r.map(e=>e.sessionId)),r.length){P.sessionId=r[0].sessionId;let n=await a.load(t,P.sessionId);n?(P.applySnapshot(n),mt({type:`session_restored`,sessionId:P.sessionId,rounds:n.messages?.length??0}),e.debug&&console.log(`[page-agent-sdk][restore] 恢复会话`,P.sessionId,`${n.messages?.length??0} msgs`)):e.debug&&console.log(`[page-agent-sdk][restore] 会话 meta 存在但快照为空`,P.sessionId)}else P.sessionId=await a.createSession(t,n.title),e.debug&&console.log(`[page-agent-sdk][restore] 新建会话(无历史)`,P.sessionId)}else P.sessionId=await a.createSession(t,n.title);e.memory&&Kt({memory:S.get()||(typeof e.memory==`string`?e.memory:``)}),Nt()}async function zt(){await wt()}function Bt(e){let t={};for(let n of E5(e)){let e=_.files[n];e&&(t[n]=e.content)}return t}function Vt(){let e=_se(_.files,E5(g));for(let t of e)delete _.files[t]}function Ht(){let e=MX(g,Dt);if(!e.trimmed)return;let{older:t,summary:n}=e;if(mt({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:Bt(t.flatMap(e=>[e.userMsg,...e.assistantMsgs])),summary:n.content,reason:`max_memory_rounds`}),g.splice(e.deleteFrom,e.deleteCount,n),Vt(),f&&s){let n=e.summary,{prevSeg:r}=e;(async()=>{try{let e=await s(LX(t,m)),i=g.indexOf(n);if(i<0)return;g[i].content=jX(t,r,e),Jt()}catch{}})()}}let Ut,Wt=!1;function Gt(t,n){e.debug&&console.warn(`[page-agent-sdk][persist] ${t} 失败(已吞):`,n);let r=P.agent?.debugLogs;r&&r.value.push({timestamp:Date.now(),type:`middleware`,data:{stage:`persist_save_failed`,kind:t,error:String(n).slice(0,160)}})}function Kt(e){!P.sessionId||!a||a.save(t,P.sessionId,e).catch(e=>Gt(`save`,e))}function qt(e,n){a&&a.updateTitle(t,e,n).catch(e=>Gt(`updateTitle`,e))}function Jt(){if(!P.sessionId||!a)return;if(Kt({messages:JSON.parse(JSON.stringify(g))}),Kt({todos:P.agent?.getState?.()?.todos??[]}),Fe){let e=y.getMission();e&&Kt({mission:e})}if(Ie){let e=x.getWorkingMemory();e&&Kt({workingMemory:e})}if(we){let e=b.getFocuses();Kt({focus:e.length?e:null})}de&&A&&(Kt({checkpoints:A.exportStack()}),Kt({usage:n}));let r=J6(g);if(r&&r!==Ut&&(Ut=r,qt(P.sessionId,r)),e.autoTitle!==!1&&c&&!Wt&&g.some(e=>e.role===`user`)&&g.some(e=>e.role===`assistant`)){Wt=!0;let e=P.sessionId;(async()=>{try{let n=await c(g);if(n&&P.refCount>0&&P.sessionId===e){try{await a.updateTitle(t,e,n)}catch(e){Gt(`updateTitle`,e)}await Nt()}}catch{}})()}e.debug&&console.log(`[page-agent-sdk][persist] save`,P.sessionId,`${g.length} msgs`)}return P.initDone=(async()=>{await Rt(),await zt(),St&&await St.preload(),e.mcp?.length&&(async()=>{let t=await Promise.allSettled(e.mcp.map(e=>y6(e))),n=t.flatMap(e=>e.status===`fulfilled`?[e.value.close]:[]);if(M){Promise.allSettled(n.map(e=>e()));return}P.mcpClosers=n,P.mcpServers=[];let r=new Set;for(let e of Me){let t=ve.get(e.name);t&&!t.startsWith(`mcp:`)&&r.add(e.name)}t.forEach((t,n)=>{let i=e.mcp[n],a=i.name??i.url;t.status===`fulfilled`?(P.mcpServers.push({name:a,url:i.url,toolCount:t.value.tools.length}),t.value.tools.forEach(e=>{if(r.has(e.name)){console.warn(`[page-agent-sdk][mcp] 工具 "${e.name}" 与内置工具重名,已拒绝注入(安全保留字保护)`);return}ve.set(e.name,`mcp:${a}`),xe.push(e)})):console.warn(`[page-agent-sdk][mcp] server ${a} 连接失败:`,t.reason)}),xe.length&&(Me=Ne(),P.agent&&P.agent.setTools(Me),P.infoTick.value++),e.debug&&console.log(`[page-agent-sdk][mcp] 注入 ${xe.length} 个工具,${P.mcpServers.length} 个 server`)})();let t=Y6(e.llm)?e.llm:await cB(e.llm);P.agent=wJ({llm:t,systemPrompt:fe,tools:Me,middleware:Et,maxToolRounds:e.maxToolRounds,maxRetries:e.maxRetries,stallMs:e.streamStallMs??9e4,maxParallelTools:e.maxParallelTools,contextWindow:u.contextWindow,maxOutputTokens:u.maxOutputTokens,maxVerifyAttempts:qe?We:0,roundTokenBudget:e.roundTokenBudget??0,onLlmChange:e=>{h=e},onTrace:ue?(e,t)=>{try{mt({type:`trace`,spans:e,metrics:t})}catch{}}:void 0,debug:e.debug}),C.current=P.agent,it&&it.setReconfigureHook&&it.setReconfigureHook(()=>{P.agent&&P.agent.setTools(Ne())})})(),P}function Cse(e,t){let n=e.id??t8();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?O5.get(n):void 0;o?a=o:(a=Sse(e,n),e.shareContext&&O5.set(n,a)),a.refCount++;let s=null,c=g8(e),l=null,u=null;async function d(n){if(await a.initDone,s){s.show();return}let o=n===void 0?e.container:n,d=()=>{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 主包`),d();return}let m=typeof o==`string`?document.querySelector(o):o;if(!m)throw Error(`createChatSdk: 挂载点未找到(${o})`);s=t({el:m,core:a,dialogCfg:c,i18n:e.i18n,streaming:r,runSerial:a.runSerial,hide:p,unmount:f,onDialogUnmounted:()=>{s=null,a.release()}}),c.drawer===!0&&c.drawerHidden===!0&&s.hide(),d()}function f(){a.abortAllActive(),a.resolveConflict(`keep_external`),l&&typeof window<`u`&&window.removeEventListener(`pagehide`,l),u&&typeof document<`u`&&document.removeEventListener(`visibilitychange`,u),l=null,u=null,s?s.unmount():a.release()}function p(){s?.hide()}function m(){s?.show()}return{mount:d,unmount:f,hide:p,show:m,send:(e,t)=>a.runSerial(async()=>{let{controller:n,untrack:r}=a.trackActive(t?.signal);try{return await a.send(e,{...t,signal:n.signal})}finally{r()}}),batch:(e,t,n)=>a.runSerial(async()=>{let{controller:r,untrack:i}=a.trackActive(n);try{return await a.batch(e,t,r.signal)}finally{i()}}),switchSession:(...e)=>a.runSerial(async()=>(a.abortAllActive(),a.switchSession(...e))),resetSession:()=>a.resetSession(),sessions:a.sessions,async listSessions(){return a.store?a.store.listSessions(n):[]},async deleteSession(e){if(a.store){if(e===a.sessionId){console.warn(`[page-agent-sdk] deleteSession 忽略:不能删除当前会话,请先 switchSession 切到其他会话`);return}await a.store.deleteSession(n,e),await a.refreshSessions()}},get sessionId(){return a.sessionId},stream:(e,t,n)=>a.stream(e,t,n),afterRound:a.afterRound,get debugLogs(){return a.agent.debugLogs},infoTick:a.infoTick,inspect:a.getInfo,inspectContext:()=>a.getInfo().context,getMission:a.getMission,setMission:a.setMission,getPreferences:a.getPreferences,removePreference:a.removePreference,clearPreferences:a.clearPreferences,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 yX(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[A6(e)]={content:n,updatedAt:Date.now()}},vfsRead:e=>a.vfsStore.files[A6(e)]?.content,createResource:(e,t)=>{let n=a.dataOpsController;if(!n?.createResource)throw Error(`[page-agent-sdk] createResource 不可用:需配 data.resources + vfsStore(capabilities.vfs 默认开)`);return n.createResource(e,t)},getResource:e=>a.dataOpsController?.getResource?.(e),updateResource:(e,t)=>{let n=a.dataOpsController;if(!n?.updateResource)throw Error(`[page-agent-sdk] updateResource 不可用:需配 data.resources + vfsStore`);n.updateResource(e,t)},deleteResource:e=>a.dataOpsController?.deleteResource?.(e)??!1,listResources:()=>a.dataOpsController?.listResources?.()??[],releaseResources:e=>{let t=a.dataOpsController;if(!(!t?.listResources||!t.deleteResource))if(e&&e.length)for(let n of e)t.deleteResource(n);else for(let e of t.listResources())t.deleteResource(e.path)},usage:a.usage,pendingConflict:a.pendingConflict,resolveConflict:e=>a.resolveConflict(e),setTools:e=>a.setTools(e),addTool:e=>a.addTool(e),removeTool:e=>a.removeTool(e),setLlm:e=>a.setLlm(e),setMemory:e=>a.setMemory(e),refreshMemory:()=>a.refreshMemory(),setSubagents:e=>a.setSubagents(e),addSubagent:e=>a.addSubagent(e),removeSubagent:e=>a.removeSubagent(e),getActiveSubagents:()=>a.getActiveSubagents(),get subagentHistory(){return a.subagentHistory}}}var wse=4e3;function A5(e={}){let{fetchResponse:t,fetchStream:n,onPersist:r,onClear:i,onQueuedCleared:a}=e,o=JV({messages:e.messages??[],loading:!1,error:null}),s=aH(null),c=aH(!0),l=null,u=aH([]),d=aH(null);function f(){}function p(e){let t=s.value;e.deltaY<0?c.value=!1:t&&(c.value=t.scrollHeight-t.scrollTop-t.clientHeight<64)}function m(){s.value&&requestAnimationFrame(()=>{let e=s.value;!e||!c.value||(e.scrollTop=e.scrollHeight)})}function h(e,t,n){o.messages.push({role:e,content:t,timestamp:Date.now(),...n&&n.length?{focuses:n}:{}}),c.value=!0,m()}async function g(e){if(c.value=!0,n){let t=JV({role:`assistant`,content:``,timestamp:Date.now(),reasoning:``,steps:[]}),r=!1;o.messages.push(t);try{await n(o.messages.slice(0,-1),e=>{switch(e.type){case`round_start`:e.round>1&&(t.content||t.reasoning)&&(r=!0);break;case`reasoning`:r&&=(t.reasoning+=`
351
351
  `,!1),t.reasoning=(t.reasoning+e.delta).slice(-4e3);break;case`text`:r&&=(t.content+=`
352
- `,!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;let r=t.steps[n].subReason;r&&r.length>80&&(t.steps[n].subReason=r.slice(0,80)+`…`);break}break;case`subagent`:{let n=t.steps[t.steps.length-1];if(!n)break;if(e.kind===`reasoning`){let t=e.delta||``;n.subReasonFull=(n.subReasonFull||``)+t;let r=(n.subReason||``)+t;n.subReason=r.length>wse?r.slice(-4e3):r;break}n.children||=[];let r=e.label?`[${e.label}] ${e.name}`:e.name;if(e.kind===`tool_call`)n.children.push({name:r,args:e.args,status:`running`});else for(let t=n.children.length-1;t>=0;t--)if(n.children[t].status===`running`&&n.children[t].name===r){n.children[t].result=e.result,n.children[t].status=e.status||`done`;break}break}case`approval_request`:d.value={toolName:e.toolName,args:e.args,resolve:e.resolve};break}m()},e)}catch(n){if(Gq(n,e)||(o.error=n.message||`请求失败,请重试`),!t.content&&!t.reasoning){let e=o.messages.indexOf(t);e>=0&&o.messages.splice(e,1)}}finally{await v()}return}try{h(`assistant`,await(t||S)(o.messages,e))}catch(t){Gq(t,e)||(o.error=t.message||`请求失败,请重试`)}finally{await v()}}function _(e){let t=e=>{if(e?.length)for(let n of e)n.status===`running`&&(n.status=`error`,n.result||=`(本轮已结束,该步骤未收到结果 —— 子 agent 中断/异常)`),n.children?.length&&t(n.children)};for(let n=e.length-1;n>=0;n--)if(e[n].role===`assistant`){t(e[n].steps);break}}async function v(){_(o.messages);try{await r?.(o.messages)}catch{}o.loading=!1,l=null;let e=u.value.shift();e!==void 0&&(h(`user`,e),o.loading=!0,o.error=null,l=new AbortController,await g(l.signal))}function y(e){u.value.splice(e,1)}async function b(e,t){if(e.trim()){if(o.loading){u.value.push(e.trim());return}h(`user`,e.trim(),t),o.loading=!0,o.error=null,l=new AbortController,await g(l.signal)}}async function x(){if(o.loading)return;let e=o.messages;for(let t=e.length-1;t>=0;t--)if(e[t].role===`assistant`){e.splice(t);break}e.some(e=>e.role===`user`)&&(o.loading=!0,o.error=null,l=new AbortController,await g(l.signal))}async function S(e){return await new Promise(e=>setTimeout(e,800+Math.random()*1200)),`收到你的消息:"${e.filter(e=>e.role===`user`).pop()?.content}"。这是一个模拟回复,请接入实际的 AI API。`}function C(){i?.(),o.messages.splice(0,o.messages.length),o.error=null}function w(){u.value.length&&a?.([...u.value]),u.value=[],l?.abort()}function T(){u.value=[],l?.abort(),l=null,o.loading=!1,o.error=null,d.value=null}function ee(e){let t=d.value;t&&(d.value=null,t.resolve(e))}async function E(){if(!o.error)return;let e=o.messages,t=-1;for(let n=e.length-1;n>=0;n--)if(e[n].role===`user`){t=n;break}if(t<0)return;let n=e[t].content;e.splice(t),o.error=null,await b(n)}return{state:o,scrollContainer:s,pendingApproval:d,queuedTasks:u,sendMessage:b,removeQueuedTask:y,clearMessages:C,stop:w,reset:T,retry:E,regenerate:x,resolveApproval:ee,onScroll:f,onWheel:p}}async function j5(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 M5={header:`🤖`,subagent:`🤖`,subagentProgress:`🧬`,empty:`💬`,focus:`🎯`,queued:`📋`,queuedEdit:`✏️`,recommend:`💡`,conflict:`⚠️`};function N5(e){let t={...M5};if(!e)return t;let n=Object.keys(M5);for(let r of n){let n=e[r];typeof n==`string`&&(t[r]=n)}return e.assistantAvatar&&(t.assistantAvatar=e.assistantAvatar),e.userAvatar&&(t.userAvatar=e.userAvatar),e.send&&(t.send=e.send),t}var P5={defaultTitle:`AI 助手`,inputPlaceholder:`输入消息,Enter 发送...`,newSession:`新建会话`,history:`历史记录`,more:`更多`,close:`关闭`,debugMenu:`调试 / 日志`,debugMenuTitle:`日志 / 执行流程 / Agent 信息`,skillMenu:`Skill 管理`,skillMenuTitle:`创建 / 管理自定义 Skill`,clearChat:`清空对话`,sessionFallbackPrefix:`会话 `,justNow:`刚刚`,minutesAgoSuffix:`分钟前`,emptyGreeting:`有什么可以帮你的?`,retry:`重试`,undo:`↩ 回退`,undoTitle:`回退到上次正常状态(还原对话历史 + 页面属性 + 工作区)`,thinking:`思考中...`,statusRunning:`执行中`,statusDone:`成功`,statusError:`失败`,subagentBadge:`子`,subagentBadgeTitle:`子 agent 委派(独立上下文,只回结论)`,subagentProgress:`子 agent 进度`,nthCallPrefix:`第 `,nthCallSuffix:` 次`,argsLabel:`入参`,resultLabel:`返回值`,copy:`复制`,copied:`已复制`,regenerate:`重新生成`,expand:`展开`,collapse:`收起`,noResult:`(无返回值)`,displayTruncatedSuffix:`
352
+ `,!1),t.content+=e.delta;break;case`tool_call`:t.steps.push({name:e.name,args:e.args,status:`running`,id:e.id});break;case`tool_result`:{let n=-1;if(e.id!==void 0&&(n=t.steps.findIndex(t=>t.id===e.id)),n<0){for(let r=t.steps.length-1;r>=0;r--)if(t.steps[r].name===e.name&&t.steps[r].status===`running`){n=r;break}}if(n>=0){let r=t.steps[n];r.result=e.result,r.status=e.status,r.durationMs=e.durationMs;let i=r.subReason;i&&i.length>80&&(r.subReason=i.slice(0,80)+`…`)}break}case`subagent`:{let n=e.toolCallId===void 0?t.steps[t.steps.length-1]:t.steps.find(t=>t.id===e.toolCallId);if(!n)break;if(e.kind===`reasoning`){let t=e.delta||``;n.subReasonFull=(n.subReasonFull||``)+t;let r=(n.subReason||``)+t;n.subReason=r.length>wse?r.slice(-4e3):r;break}n.children||=[];let r=e.label?`[${e.label}] ${e.name}`:e.name;if(e.kind===`tool_call`)n.children.push({name:r,args:e.args,status:`running`});else for(let t=n.children.length-1;t>=0;t--)if(n.children[t].status===`running`&&n.children[t].name===r){n.children[t].result=e.result,n.children[t].status=e.status||`done`;break}break}case`approval_request`:d.value={toolName:e.toolName,args:e.args,resolve:e.resolve};break}m()},e)}catch(n){if(Gq(n,e)||(o.error=n.message||`请求失败,请重试`),!t.content&&!t.reasoning){let e=o.messages.indexOf(t);e>=0&&o.messages.splice(e,1)}}finally{await v()}return}try{h(`assistant`,await(t||S)(o.messages,e))}catch(t){Gq(t,e)||(o.error=t.message||`请求失败,请重试`)}finally{await v()}}function _(e){let t=e=>{if(e?.length)for(let n of e)n.status===`running`&&(n.status=`error`,n.result||=`(本轮已结束,该步骤未收到结果 —— 子 agent 中断/异常)`),n.children?.length&&t(n.children)};for(let n=e.length-1;n>=0;n--)if(e[n].role===`assistant`){t(e[n].steps);break}}async function v(){_(o.messages);try{await r?.(o.messages)}catch{}o.loading=!1,l=null;let e=u.value.shift();e!==void 0&&(h(`user`,e),o.loading=!0,o.error=null,l=new AbortController,await g(l.signal))}function y(e){u.value.splice(e,1)}async function b(e,t){if(e.trim()){if(o.loading){u.value.push(e.trim());return}h(`user`,e.trim(),t),o.loading=!0,o.error=null,l=new AbortController,await g(l.signal)}}async function x(){if(o.loading)return;let e=o.messages;for(let t=e.length-1;t>=0;t--)if(e[t].role===`assistant`){e.splice(t);break}e.some(e=>e.role===`user`)&&(o.loading=!0,o.error=null,l=new AbortController,await g(l.signal))}async function S(e){return await new Promise(e=>setTimeout(e,800+Math.random()*1200)),`收到你的消息:"${e.filter(e=>e.role===`user`).pop()?.content}"。这是一个模拟回复,请接入实际的 AI API。`}function C(){i?.(),o.messages.splice(0,o.messages.length),o.error=null}function w(){u.value.length&&a?.([...u.value]),u.value=[],l?.abort()}function T(){u.value=[],l?.abort(),l=null,o.loading=!1,o.error=null,d.value=null}function ee(e){let t=d.value;t&&(d.value=null,t.resolve(e))}async function E(){if(!o.error)return;let e=o.messages,t=-1;for(let n=e.length-1;n>=0;n--)if(e[n].role===`user`){t=n;break}if(t<0)return;let n=e[t].content;e.splice(t),o.error=null,await b(n)}return{state:o,scrollContainer:s,pendingApproval:d,queuedTasks:u,sendMessage:b,removeQueuedTask:y,clearMessages:C,stop:w,reset:T,retry:E,regenerate:x,resolveApproval:ee,onScroll:f,onWheel:p}}async function j5(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 M5={header:`🤖`,subagent:`🤖`,subagentProgress:`🧬`,empty:`💬`,focus:`🎯`,queued:`📋`,queuedEdit:`✏️`,recommend:`💡`,conflict:`⚠️`};function N5(e){let t={...M5};if(!e)return t;let n=Object.keys(M5);for(let r of n){let n=e[r];typeof n==`string`&&(t[r]=n)}return e.assistantAvatar&&(t.assistantAvatar=e.assistantAvatar),e.userAvatar&&(t.userAvatar=e.userAvatar),e.send&&(t.send=e.send),t}var P5={defaultTitle:`AI 助手`,inputPlaceholder:`输入消息,Enter 发送...`,newSession:`新建会话`,history:`历史记录`,more:`更多`,close:`关闭`,debugMenu:`调试 / 日志`,debugMenuTitle:`日志 / 执行流程 / Agent 信息`,skillMenu:`Skill 管理`,skillMenuTitle:`创建 / 管理自定义 Skill`,clearChat:`清空对话`,sessionFallbackPrefix:`会话 `,justNow:`刚刚`,minutesAgoSuffix:`分钟前`,emptyGreeting:`有什么可以帮你的?`,retry:`重试`,undo:`↩ 回退`,undoTitle:`回退到上次正常状态(还原对话历史 + 页面属性 + 工作区)`,thinking:`思考中...`,statusRunning:`执行中`,statusDone:`成功`,statusError:`失败`,subagentBadge:`子`,subagentBadgeTitle:`子 agent 委派(独立上下文,只回结论)`,subagentProgress:`子 agent 进度`,nthCallPrefix:`第 `,nthCallSuffix:` 次`,argsLabel:`入参`,resultLabel:`返回值`,copy:`复制`,copied:`已复制`,regenerate:`重新生成`,expand:`展开`,collapse:`收起`,noResult:`(无返回值)`,displayTruncatedSuffix:`
353
353
  …(展示截断,复制可得全量)`,thinkingCountPrefix:`思考中… `,charCountSuffix:`字`,reasoningTitle:`思考过程`,truncatedNotePrefix:`(仅显最近 `,truncatedNoteSuffix:` 字)`,copyThinking:`复制完整思考内容`,copyThinkingTruncTitle:`复制完整思考(渲染已截尾,复制取全量)`,focusChipTitlePrefix:`精修中:`,focusChipTitleHint:`(点击回看 · ✕ 移除)`,historyFocusChipTitlePrefix:`回看 `,removeFocus:`移除此焦点`,sendHint:`Enter 发送 · Shift+Enter 换行`,sendTitle:`发送`,stopTitle:`停止生成`,queuedTitle:`排队中 · 生成完后自动执行`,queuedEditTitle:`修改(填回输入框编辑)`,removeQueuedTitle:`撤销该任务`,humanConfirmTitle:`AI 需要你确认`,recommendPrefix:` 推荐:`,approve:`允许`,deny:`拒绝`,toolConfirmPrefix:`需确认工具调用:`,viewArgs:`查看参数`,collapseArgs:`收起参数`,argsTruncatedSuffix:`
354
354
  …(已截断)`,conflictTitlePrefix:`写入冲突:`,conflictTitleSuffix:` 已被外部修改`,conflictDetailTemplate:`AI 基于「读取时的旧值」准备{op},但该属性在你读取之后被外部代码/其他 agent/手动改过。`,conflictOpWrite:`写入`,conflictOpDelete:`删除`,viewDiff:`查看值对比`,collapseDiff:`收起对比`,agentValueLabel:`AI 想写的值`,currentValueLabel:`外部改后的当前值`,deleteNoValue:`(delete 操作无值)`,keepExternal:`保留外部`,keepExternalTitle:`不写入,保留外部修改后的值,AI 重新读取再改`,overwrite:`强制覆盖`,overwriteTitle:`用 AI 的值覆盖外部修改`,restore:`回退`,restoreTitle:`回退到最近一次历史快照(agent 之前操作的检查点),撤销外部修改 + AI 不写入`,switchFocusTitle:`切换聚焦路径`,exitFocusTitle:`退出精修`,focusPathPlaceholder:`jsonPath,如 components.3`,focusLabelPlaceholder:`标签(可选)`,focusSubmit:`聚焦`,debugTabLogs:`日志`,debugTabFlow:`流程`,debugTabContext:`上下文`,debugTabSubagent:`子 agent`,debugTabInfo:`Agent 信息`,debugClearLogs:`清空日志`,debugTypeContext:`上下文`,debugTypeLlmRequest:`LLM请求`,debugTypeLlmResponse:`LLM响应`,debugTypeToolCall:`工具调用`,debugTypeToolResult:`工具结果`,debugTypeError:`错误`,debugTypeMiddleware:`中间件`,debugFilterAll:`全部`,debugFlowPrep:`准备 / 其他`,debugLogsEmpty:`暂无日志,发送消息后这里会显示 Agent 的完整上下文、工具调用等信息`,debugFlowEmpty:`暂无日志,发送消息后这里按轮次展示执行流程`,debugNoInfo:`暂无信息`,debugCardView:`🗂 卡片视图`,debugRequestBody:`📋 请求体`,debugViewRawJson:`查看原始 JSON`,debugCollapseRawJson:`收起原始 JSON`,debugModel:`模型`,debugTemperature:`温度`,debugMessageCount:`消息数`,debugToolsLabel:`工具`,debugContextMessages:`上下文消息`,debugRoundPrefix:`第 `,debugRoundSuffix:` 轮`,debugMsgCountSuffix:` 条消息`,debugToolCountSuffix:` 工具`,debugToolCallsSuffix:` 个工具调用`,debugResultSuffix:` 结果`,debugTodoPending:`待办`,debugTodoInProgress:`进行中`,debugTodoCompleted:`完成`,debugSubRunning:`运行中`,debugSubDone:`完成`,debugSubError:`错误`,debugLocksTitle:`组件锁`,debugSubagentEmpty:`尚未委派子 agent。主 agent 调用 use_<id> 或 spawn_agent 后,这里展示运行状态与委派历史。`,debugSubRunningTitle:`运行中`,debugSubHistoryTitle:`历史`,debugStepsBtn:`步骤`,debugStepsCountSuffix:` 步`,debugTraceEmpty:`未开启 tracing(capabilities.tracing:true)或暂无 trace。跑一轮 agent 后刷新。`,debugMetricRounds:`轮次`,debugMetricTotal:`总耗时`,debugMetricAvg:`平均/轮`,debugMetricTools:`工具`,debugMetricCompressions:`压缩`,debugCtxEmpty:`未开启 contextInspector(默认开)或暂无快照。跑一轮 agent 后切回刷新。`,debugCtxOccupancy:`占用`,debugCtxThreshold:`压缩阈值`,debugCtxTokens:`估算`,debugCtxWindow:`窗口`,debugCtxThresholdPct:`阈值`,debugCtxCategories:`分类构成(近似)`,debugCtxLastCompression:`最近压缩`,debugCtxSummarized:`摘要`,debugCtxRoundsSuffix:` 轮`,debugCtxRecalled:`召回`,debugCtxAgentDecision:`agent 决策:`,debugInfoBasic:`基本信息`,debugToolCount:`工具数`,debugMiddleware:`中间件`,debugMiddlewareStack:`中间件栈`,debugSkillsTitle:`技能`,debugSkillsHint:`点击展开查看全文`,debugLoading:`加载中…`,debugDataTitle:`可操作数据`,debugDataFallback:`主数据对象`,debugSchemaPrefix:`schema: `,debugSchemaDeclared:`已声明`,debugSchemaMissing:`未声明`,debugSubagentTitle:`子 Agent`,debugEnabled:`启用`,debugYes:`是`,debugNo:`否`,debugMaxDepth:`最大递归`,debugMaxParallel:`并行上限`,debugExtraTools:`额外工具`,debugDefaultReadonly:`默认只读`,debugVerifyTitle:`Verify 自检`,debugMaxAttempts:`自纠上限`,debugAdversarial:`对抗验证`,debugOn:`开启`,debugOff:`关闭`,debugAdversarialModel:`对抗模型`,debugSameAsMain:`(同主)`,debugTodosTitle:`任务清单`,debugMemoryTitle:`持久指令 (memory)`,debugPrefsTitle:`用户偏好(跨会话)`,debugPrefTopicColor:`颜色`,debugPrefTopicCopy:`文案`,debugPrefTopicLayout:`排版`,debugPrefTopicInteraction:`交互`,debugPrefTopicTech:`技术`,debugPrefTopicOther:`其他`,debugLastCompTitle:`上轮压缩`,debugTriggered:`触发`,debugNotTriggered:`✗(未达阈值)`,debugRoundsSummarized:`摘要轮次`,debugCountSuffix:` 条`,debugStrategy:`策略`,debugDecision:`压缩决策`,debugSummaryMode:`摘要`,debugSkillNoReader:`当前 SDK 未注入 getSkillContent,无法查看 skill 全文`,debugSkillEmpty:`skill 无内容或读取失败`,skillPanelTitle:`🧩 Skill 管理`,skillEditingPrefix:`编辑 Skill: `,skillCreateNew:`创建新 Skill`,skillCancelEdit:`取消编辑`,skillNameLabel:`名称`,skillNamePlaceholder:`如:my-writer`,skillDescLabel:`描述`,skillDescPlaceholder:`一句话说明用途与触发时机`,skillContentLabel:`内容`,skillContentPlaceholder:`skill 全文指令(支持 Markdown)`,skillSave:`保存修改`,skillAdd:`添加 Skill`,skillCreatedTitle:`已创建 Skill`,skillEmpty:`暂无用户创建的 skill`,skillEditBtn:`编辑`,skillEditTitle:`加载到表单编辑`,skillDeleteBtn:`删除`,skillDeleteTitle:`删除该用户 skill`,skillErrName:`skill 名不能为空`,skillErrDesc:`描述不能为空`,skillErrContent:`内容不能为空`,skillDupWarnPrefix:`已存在同名用户 skill "`,skillDupWarnSuffix:`",将覆盖`,skillHintA:`创建/编辑的 skill 会自动加入 agent(下轮 system prompt 索引可见),agent 经`,skillHintB:`按需加载全文;持久化由独立 SkillStore 管理(默认 indexedDB,与 storage 选项分离),跨刷新自动恢复;可经`,skillHintC:`跨页面复用。`,codeCopyTitle:`复制代码`,codeOpenTitle:`新窗口打开`,codePreviewTitlePrefix:`代码预览 · `,codePreviewTab:`预览`,codeSourceTab:`源码`,codeDemoTitle:`CSS 预览`,codeDemoText:`这是一段示例文字,用于展示 CSS 效果。`,codeDemoButton:`按钮`,codeDemoInput:`输入框`},F5={defaultTitle:`AI Assistant`,inputPlaceholder:`Type a message, Enter to send...`,newSession:`New chat`,history:`History`,more:`More`,close:`Close`,debugMenu:`Debug / Logs`,debugMenuTitle:`Logs / execution flow / agent info`,skillMenu:`Skills`,skillMenuTitle:`Create / manage custom skills`,clearChat:`Clear conversation`,sessionFallbackPrefix:`Session `,justNow:`just now`,minutesAgoSuffix:` min ago`,emptyGreeting:`How can I help you?`,retry:`Retry`,undo:`↩ Undo`,undoTitle:`Restore the last good state (conversation + page data + workspace)`,thinking:`Thinking...`,statusRunning:`Running`,statusDone:`Success`,statusError:`Failed`,subagentBadge:`sub`,subagentBadgeTitle:`Sub-agent delegation (isolated context, conclusion only)`,subagentProgress:`Sub-agent progress`,nthCallPrefix:`Call #`,nthCallSuffix:``,argsLabel:`Args`,resultLabel:`Result`,copy:`Copy`,copied:`Copied`,regenerate:`Regenerate`,expand:`Expand`,collapse:`Collapse`,noResult:`(no result)`,displayTruncatedSuffix:`
355
355
  …(truncated for display, copy for full)`,thinkingCountPrefix:`Thinking… `,charCountSuffix:` chars`,reasoningTitle:`Reasoning`,truncatedNotePrefix:`(last `,truncatedNoteSuffix:` chars only)`,copyThinking:`Copy full reasoning`,copyThinkingTruncTitle:`Copy full reasoning (display truncated, copy gets all)`,focusChipTitlePrefix:`Focus:`,focusChipTitleHint:`(click to view · ✕ remove)`,historyFocusChipTitlePrefix:`View `,removeFocus:`Remove this focus`,sendHint:`Enter to send · Shift+Enter for newline`,sendTitle:`Send`,stopTitle:`Stop generating`,queuedTitle:`Queued · runs when current finishes`,queuedEditTitle:`Edit (fill back into input)`,removeQueuedTitle:`Drop this task`,humanConfirmTitle:`AI needs your confirmation`,recommendPrefix:` Recommend:`,approve:`Allow`,deny:`Deny`,toolConfirmPrefix:`Confirm tool call:`,viewArgs:`View args`,collapseArgs:`Collapse args`,argsTruncatedSuffix:`
@@ -5243,7 +5243,8 @@ function ku(e) {
5243
5243
  t({
5244
5244
  type: "tool_call",
5245
5245
  name: r.call.name,
5246
- args: r.call.args
5246
+ args: r.call.args,
5247
+ id: r.id
5247
5248
  }), R("tool_call", {
5248
5249
  round: f + 1,
5249
5250
  name: r.call.name,
@@ -5266,7 +5267,8 @@ function ku(e) {
5266
5267
  name: r.call.name,
5267
5268
  result: o.content,
5268
5269
  status: o.status,
5269
- durationMs: s
5270
+ durationMs: s,
5271
+ id: r.id
5270
5272
  }), R("tool_result", {
5271
5273
  round: f + 1,
5272
5274
  name: r.call.name,
@@ -7471,31 +7473,33 @@ function mp(e) {
7471
7473
  signal: i,
7472
7474
  emit: a,
7473
7475
  logSink: o
7474
- }, c = (t, n, r) => (i) => {
7475
- if (i.type === "reasoning") {
7476
- r?.({
7476
+ }, c = (t, n, r, i) => (a) => {
7477
+ if (a.type === "reasoning") {
7478
+ i?.({
7477
7479
  type: "subagent",
7478
7480
  taskId: t,
7479
7481
  label: n,
7480
7482
  kind: "reasoning",
7481
7483
  name: "",
7482
- delta: i.delta
7484
+ delta: a.delta,
7485
+ toolCallId: r
7483
7486
  });
7484
7487
  return;
7485
7488
  }
7486
7489
  e.tracker?.pushStep(t, {
7487
- kind: i.type,
7488
- name: i.name,
7490
+ kind: a.type,
7491
+ name: a.name,
7489
7492
  ts: Date.now()
7490
- }), r && r({
7493
+ }), i && i({
7491
7494
  type: "subagent",
7492
7495
  taskId: t,
7493
7496
  label: n,
7494
- kind: i.type,
7495
- name: i.name,
7496
- args: i.type === "tool_call" ? i.args : void 0,
7497
- result: i.type === "tool_result" ? i.result : void 0,
7498
- status: i.type === "tool_result" ? i.status : void 0
7497
+ kind: a.type,
7498
+ name: a.name,
7499
+ args: a.type === "tool_call" ? a.args : void 0,
7500
+ result: a.type === "tool_result" ? a.result : void 0,
7501
+ status: a.type === "tool_result" ? a.status : void 0,
7502
+ toolCallId: r
7499
7503
  });
7500
7504
  };
7501
7505
  return {
@@ -7515,7 +7519,7 @@ function mp(e) {
7515
7519
  prompt: t,
7516
7520
  role: n,
7517
7521
  model: a
7518
- }, d, l.signal, c(f, p, l.emit), m, l.emit);
7522
+ }, d, l.signal, c(f, p, l.toolCallId, l.emit), m, l.emit);
7519
7523
  return e.tracker?.finish(f, "done", r), r;
7520
7524
  } catch (t) {
7521
7525
  throw e.tracker?.finish(f, "error", String(t?.message ?? t)), t;
@@ -7539,7 +7543,7 @@ function mp(e) {
7539
7543
  }), s = Date.now();
7540
7544
  e.tracker?.start(r, t.prompt, a, s);
7541
7545
  try {
7542
- let n = await pp(t, e, i.signal, c(r, a, i.emit), o, i.emit);
7546
+ let n = await pp(t, e, i.signal, c(r, a, i.toolCallId, i.emit), o, i.emit);
7543
7547
  return e.tracker?.finish(r, "done", n ?? "(未完成)"), {
7544
7548
  ok: !0,
7545
7549
  text: n ?? "(未完成)"
@@ -7565,7 +7569,8 @@ function mp(e) {
7565
7569
  __pgSubagentCall: {
7566
7570
  signal: e.signal ?? i,
7567
7571
  emit: e.emit ?? a,
7568
- logSink: e.logSink ?? o
7572
+ logSink: e.logSink ?? o,
7573
+ toolCallId: e.id
7569
7574
  }
7570
7575
  }, t(e))
7571
7576
  };
@@ -7604,27 +7609,29 @@ function _p(e, n) {
7604
7609
  signal: i,
7605
7610
  emit: a,
7606
7611
  logSink: o
7607
- }, c = (e, t, n) => (r) => {
7608
- if (r.type === "reasoning") {
7609
- n?.({
7612
+ }, c = (e, t, n, r) => (i) => {
7613
+ if (i.type === "reasoning") {
7614
+ r?.({
7610
7615
  type: "subagent",
7611
7616
  taskId: e,
7612
7617
  label: t,
7613
7618
  kind: "reasoning",
7614
7619
  name: "",
7615
- delta: r.delta
7620
+ delta: i.delta,
7621
+ toolCallId: n
7616
7622
  });
7617
7623
  return;
7618
7624
  }
7619
- n && n({
7625
+ r && r({
7620
7626
  type: "subagent",
7621
7627
  taskId: e,
7622
7628
  label: t,
7623
- kind: r.type,
7624
- name: r.name,
7625
- args: r.type === "tool_call" ? r.args : void 0,
7626
- result: r.type === "tool_result" ? r.result : void 0,
7627
- status: r.type === "tool_result" ? r.status : void 0
7629
+ kind: i.type,
7630
+ name: i.name,
7631
+ args: i.type === "tool_call" ? i.args : void 0,
7632
+ result: i.type === "tool_result" ? i.result : void 0,
7633
+ status: i.type === "tool_result" ? i.status : void 0,
7634
+ toolCallId: n
7628
7635
  });
7629
7636
  }, l = [], u = [], d;
7630
7637
  function f(e) {
@@ -7662,7 +7669,7 @@ function _p(e, n) {
7662
7669
  if (!e.ok) return g("conflict", { heldBy: e.heldBy }), `COMPONENT_BUSY · 组件 [${h.join(", ")}] 正在被子 agent(${e.heldBy})修改,本次委派未执行。同一组件同一时间只能有一个委派在途;请先做其他组件,或等该委派结束后(下一轮)再重试本组件。`;
7663
7670
  m = e.release, g("acquire");
7664
7671
  }
7665
- let _ = c(`use_${l.id}`, l.id, i.emit), v = u ? (e) => {
7672
+ let _ = c(`use_${l.id}`, l.id, i.toolCallId, i.emit), v = u ? (e) => {
7666
7673
  e.type !== "reasoning" && u.pushStep(d, {
7667
7674
  kind: e.type,
7668
7675
  name: e.name,
@@ -7728,7 +7735,8 @@ function _p(e, n) {
7728
7735
  __pgSubagentCall: {
7729
7736
  signal: e.signal ?? i,
7730
7737
  emit: e.emit ?? a,
7731
- logSink: e.logSink ?? o
7738
+ logSink: e.logSink ?? o,
7739
+ toolCallId: e.id
7732
7740
  }
7733
7741
  }, t(e))
7734
7742
  };
@@ -14020,19 +14028,28 @@ function F_(e = {}) {
14020
14028
  t.steps.push({
14021
14029
  name: e.name,
14022
14030
  args: e.args,
14023
- status: "running"
14031
+ status: "running",
14032
+ id: e.id
14024
14033
  });
14025
14034
  break;
14026
- case "tool_result":
14027
- for (let n = t.steps.length - 1; n >= 0; n--) if (t.steps[n].name === e.name && t.steps[n].status === "running") {
14028
- t.steps[n].result = e.result, t.steps[n].status = e.status, t.steps[n].durationMs = e.durationMs;
14029
- let r = t.steps[n].subReason;
14030
- r && r.length > 80 && (t.steps[n].subReason = r.slice(0, 80) + "…");
14031
- break;
14035
+ case "tool_result": {
14036
+ let n = -1;
14037
+ if (e.id !== void 0 && (n = t.steps.findIndex((t) => t.id === e.id)), n < 0) {
14038
+ for (let r = t.steps.length - 1; r >= 0; r--) if (t.steps[r].name === e.name && t.steps[r].status === "running") {
14039
+ n = r;
14040
+ break;
14041
+ }
14042
+ }
14043
+ if (n >= 0) {
14044
+ let r = t.steps[n];
14045
+ r.result = e.result, r.status = e.status, r.durationMs = e.durationMs;
14046
+ let i = r.subReason;
14047
+ i && i.length > 80 && (r.subReason = i.slice(0, 80) + "…");
14032
14048
  }
14033
14049
  break;
14050
+ }
14034
14051
  case "subagent": {
14035
- let n = t.steps[t.steps.length - 1];
14052
+ let n = e.toolCallId === void 0 ? t.steps[t.steps.length - 1] : t.steps.find((t) => t.id === e.toolCallId);
14036
14053
  if (!n) break;
14037
14054
  if (e.kind === "reasoning") {
14038
14055
  let t = e.delta || "";
@@ -10,7 +10,7 @@ Expected function or array of functions, received type ${typeof e}.`),k)}var il=
10
10
 
11
11
  `):null}function cu(e,t){return e.reduceRight((e,t)=>n=>t.wrapModelCall?t.wrapModelCall(n,e):e(n),t)}function lu(e,t){return e.reduceRight((e,t)=>n=>t.wrapToolCall?t.wrapToolCall(n,e):e(n),t)}function uu(e){return e?/<|tool_calls|>|<||[^>]*tool_call|<||?DSML|<||?tool[_a-z]*|?>|<invoke\s+name=|<\/?tool_call>|<function_call>/i.test(e):!1}function du(e){if(!e)return``;let t=e.search(/<|tool_calls|>|<||[^>]*tool_call|<||?DSML|<||?tool[_a-z]*|?>|<function_call>|<invoke\s+name=/i);return(t>=0?e.slice(0,t):e).trim()}var fu=/(我先|让我先|我先看|先看看|先了解|先加载|先查阅|稍后|接下来我|我将先|等我|查完.{0,12}再|看完.{0,12}再|了解.{0,8}再)/,pu=/(已完成|已生成|已修改|已创建|已添加|已删除|已更新|已调整|已处理|已委派|已配置|已切换|成功|完成[。!?]|搞定了|做好了)/;function mu(e){if(!e)return!1;let t=e.trim();return t.length>160||pu.test(t)?!1:fu.test(t)}var hu=/<|tool_calls|>|<||[^>]*tool_call|<||?DSML|<||?tool[_a-z]*|?>/i;function gu(e){return e.replace(/```[\w-]*\n?[\s\S]*?```/g,``)}function _u(e){if(!e||!uu(e))return null;let t=gu(e);if(!hu.test(t))return null;t=t.replace(/<|(?!|)[^|<>]*?|>/g,``);let n=/<(?:||?DSML||?)?\s*invoke\s+name=["']([^"']+)["'][^>]*>/gi,r=[],i;for(;(i=n.exec(t))!==null;)r.push({name:i[1],tagStart:i.index,after:n.lastIndex});if(!r.length)return null;let a=/<\/?\s*(?:||?DSML||?)?\/?\s*invoke\s*>/i,o=/<(?:||?DSML||?)?\s*parameter\s+name=["']([^"']+)["'][^>]*>([\s\S]*?)<\/?\s*(?:||?DSML||?)?\/?\s*parameter\s*>/gi,s=/<(?:||?DSML||?)?\s*parameter\s+name=["'][^"']+["'][^>]*>/gi,c=/<\/?\s*(?:||?DSML||?)?\/?\s*parameter\s*>/gi,l=[];for(let e=0;e<r.length;e++){let n=e+1<r.length?r[e+1].tagStart:t.length,i=t.slice(r[e].after,n),u=i.match(a);if(u&&u.index!==void 0&&(i=i.slice(0,u.index)),(i.match(s)||[]).length>(i.match(c)||[]).length)continue;let d={};o.lastIndex=0;let f;for(;(f=o.exec(i))!==null;)d[f[1]]=vu(f[2].trim());l.push({id:`dsml_${e}_${Date.now().toString(36)}`,name:r[e].name,args:d})}return l.length?l:null}function vu(e){if(e===`true`)return!0;if(e===`false`)return!1;if(e===`null`)return null;try{return JSON.parse(e)}catch{return e}}var yu=10,bu=300,xu=6e3;function Su(e,t){let n=e=>Hl(typeof e.content==`string`?e.content:JSON.stringify(e.content)),r=e.reduce((e,t)=>e+n(t),0);if(r<=t)return e;let a=0,o=r-t,s=Math.max(100,Math.min(400,Math.round(t/500))),c=e.map(e=>{if(a>=o||!(e instanceof i.ToolMessage))return e;let t=typeof e.content==`string`?e.content:JSON.stringify(e.content);if(t.length<=400)return e;let n=`…[已自动压缩 ${t.length} 字符,保留首 ${s}]\n`+t.slice(0,s);return a+=Hl(t)-Hl(n),new i.ToolMessage({tool_call_id:e.tool_call_id,content:n})}),l=c.reduce((e,t)=>e+n(t),0);return l>t&&console.warn(`[page-agent-sdk] trim 后仍超窗口:${l} > ${t} tokens(系统段/历史超预算,见 Phase 5/P3)`),c}function Cu(e,t){return t??Math.max(e*3,30)}var wu=new Set([`write`,`set_data`,`edit_data`,`delete_data`,`draft_commit`]);function Tu(e){if(!e||typeof e!=`object`)return``;let t=e;if(typeof t.jsonPath==`string`)return t.jsonPath;let n=t.patch;if(n&&typeof n.jsonPath==`string`)return n.jsonPath;let r=t.patches;return Array.isArray(r)&&r.length&&r[0]&&typeof r[0].jsonPath==`string`?r[0].jsonPath:``}function Eu(e){let{apiKey:t,baseUrl:r,model:a=`gpt-3.5-turbo`,temperature:o=.7,maxTokens:s,extraBody:c,extraConfig:l,systemPrompt:u,tools:d=[],middleware:f=[],maxToolRounds:p,maxIterations:m,maxRetries:h=2,retryDelayMs:g=500,stallMs:y=$l,maxParallelTools:b=1,maxVerifyAttempts:w=0,roundTokenBudget:E=0,onLog:D,onSpan:O,onTrace:k,onLlmChange:A,debug:ee=!1}=e,j=p??yu;(!Number.isFinite(j)||j<1)&&(console.warn(`[page-agent-sdk] maxToolRounds=${j} 非法(须 ≥1 正整数),已 clamp 到 1(0/负数致主循环 while 不进 → agent 不调 LLM 静默返回兜底文案)`),j=1),b>1&&console.warn(`[page-agent-sdk] maxParallelTools=${b}:并发工具下 dataOps 写工具不互锁(同轮并发两写都在 await handleConflict 让出前取旧基线 → 均通过乐观锁 → 后写覆盖前写,无 VERSION_CONFLICT 回灌);如需精确乐观锁保持 maxParallelTools=1 或写时显式传 expectedHash`);let M=Vl({model:a,contextWindow:e.contextWindow,maxOutputTokens:e.maxOutputTokens}),N=s??M.maxOutputTokens,te=Ul(M.contextWindow),P=Wl(M.contextWindow);function F(e){M=e,te=Ul(M.contextWindow),P=Wl(M.contextWindow)}let ne=Sn([]);function re(e,t){let n={timestamp:Date.now(),type:e,data:t};ne.value.push(n),ne.value.length>bu&&ne.value.splice(0,ne.value.length-bu),Tn(ne),D?.(n),ee&&console.log(`%c[Agent] ${e}`,`color:#667eea;font-weight:bold`,t)}let I=e=>{ne.value.push(e),ne.value.length>bu&&ne.value.splice(0,ne.value.length-bu),Tn(ne)},L=Sn([]),R=0,ie=!!O||!!k;function z(e,t,n,r={}){if(!ie)return null;let i={id:`span-${++R}`,parentId:e,name:n,type:t,startTs:Date.now(),status:`ok`,attributes:r};return L.value.push(i),L.value.length>bu&&L.value.splice(0,L.value.length-bu),Tn(L),i}function ae(e,t=`ok`,n){!e||!ie||(e.endTs=Date.now(),e.durationMs=e.endTs-e.startTs,e.status=t,n&&Object.assign(e.attributes,n),Tn(L),O?.(e))}let oe=[...f.flatMap(e=>e.tools||[]),...d],B=e.llm??new n.ChatOpenAI({apiKey:t,model:a,temperature:o,maxTokens:N,configuration:{...r?{baseURL:v(r)}:{},fetch:_,...l},...c?{modelKwargs:c}:{}}),se=oe.length>0?B.bindTools?.(oe)??B:B;function ce(){se=oe.length>0?B.bindTools?.(oe)??B:B}let V=Kl(),le=.25,ue=new Set([`mission`,`workingMemory`]);function de(){let e=u||`你是一个智能助手。`,t=[];for(let e of f)if(e.augmentPrompt){let n=e.augmentPrompt(V);n&&t.push({name:e.name,text:n,tokens:Hl(n),pin:ue.has(e.name)})}let n=Math.max(2e3,Math.round(M.contextWindow*le)),r=Hl(e)+t.reduce((e,t)=>e+t.tokens,0);if(r>n){let e=r,i=[];for(let e of t.filter(e=>!e.pin).sort((e,t)=>t.tokens-e.tokens)){if(r<=n)break;i.push(`${e.name}(${e.tokens})`),r-=e.tokens,e.text=``}i.length&&console.warn(`[page-agent-sdk] 系统段超预算(${e} > ${n} tokens,窗口 ${M.contextWindow} 的 ${le*100}%),drop 非核心段:${i.join(`, `)}(保 base/mission/workingMemory)`)}return[e,...t.filter(e=>e.text).map(e=>e.text)].join(`
12
12
 
13
- `)}function fe(e){let t=[new i.SystemMessage(de())];for(let n of e)n.role===`user`?t.push(new i.HumanMessage(n.content)):n.role===`assistant`?t.push(new i.AIMessage(n.content)):n.role===`system`&&t.push(new i.SystemMessage(n.content));return t}function pe(e){let t=e[0]&&ge(e[0])===`system`?e.slice(1):e.slice();return[new i.SystemMessage(de()),...t]}async function me(e,t,n,r){let a=r??se,o={signal:n,maxRetries:h,baseDelayMs:g,onRetry:({attempt:e,error:t,waitMs:n})=>{let r=t?.message??String(t);re(`error`,{stage:`model_retry`,attempt:e,waitMs:n,error:r}),console.warn(`[Agent] 模型调用失败,第 ${e}/${h} 次重试(等 ${n}ms):${r}`)}},s=new AbortController;n&&(n.aborted?s.abort():n.addEventListener(`abort`,()=>s.abort(),{once:!0}));let c;try{let t;try{c=await Zl(()=>{clearTimeout(t);let n=y>0?y:$l,r=a.stream(e.messages,{signal:s.signal});return y>0?Promise.race([r,new Promise((e,r)=>{t=setTimeout(()=>r(new Ql(n)),n)})]):r},o)}finally{clearTimeout(t)}}catch(a){if(ql(a,n))return{message:new i.AIMessage(``),toolCalls:[],content:``,aborted:!0};if(tu(a)&&!e._ctxRetry){e._ctxRetry=!0;let i=e=>Hl(typeof e.content==`string`?e.content:JSON.stringify(e.content)),a=e.messages.reduce((e,t)=>e+i(t),0),o=_e(e.messages,Math.round(M.contextWindow*.3)),s=o.reduce((e,t)=>e+i(t),0);return re(`error`,{stage:`context_overflow_retry`,at:`launch`,beforeTokens:a,afterTokens:s,window:M.contextWindow}),console.warn(`[page-agent-sdk] 上下文超限(启动)→ 激进 trim 重试:${a} → ${s} tokens`),me({...e,messages:o},t,n,r)}throw a}if(!c)return{message:new i.AIMessage(``),toolCalls:[],content:``,aborted:!0};let l=null,u=``;try{for await(let e of eu(c,y)){l=l?l.concat(e):e;let n=x(e);n&&t&&(u+=n,t({type:`text`,delta:n}));let r=S(e);r&&t&&t({type:`reasoning`,delta:r})}}catch(a){if(a instanceof Ql)throw s.abort(),re(`error`,{stage:`stream_stalled`,waitedMs:a.waitedMs,stallMs:y}),a;if(ql(a,n))return{message:l??new i.AIMessage(u),toolCalls:[],content:u,aborted:!0};if(tu(a)&&l===null&&u===``&&!e._ctxRetry){e._ctxRetry=!0;let i=e=>Hl(typeof e.content==`string`?e.content:JSON.stringify(e.content)),a=e.messages.reduce((e,t)=>e+i(t),0),o=_e(e.messages,Math.round(M.contextWindow*.3)),s=o.reduce((e,t)=>e+i(t),0);return re(`error`,{stage:`context_overflow_retry`,beforeTokens:a,afterTokens:s,window:M.contextWindow}),console.warn(`[page-agent-sdk] 上下文超限 → 激进 trim 重试:${a} → ${s} tokens(窗口 ${M.contextWindow})`),me({...e,messages:o},t,n,r)}throw a}let d=l;return{message:d,toolCalls:d.tool_calls||[],content:u}}async function he(e){let t=oe.find(t=>t.name===e.name);if(!t)return{content:`工具 "${e.name}" 不存在`,status:`error`};try{let n={__pgDataScope:``,...e.callConfig??{}},r=await t.invoke(e.args,{configurable:n}),i=typeof r==`string`?r:JSON.stringify(r);return i=Il(i,{files:e.state.files,vfsAvailable:oe.some(e=>e.name===`vfs_read`),toolName:e.name,threshold:te,passThroughChars:P}).content,{content:i,status:`done`}}catch(e){return{content:`工具执行出错:${Ml(e,`recoverable`).message}`,status:`error`}}}function ge(e){return e instanceof i.HumanMessage?`human`:e instanceof i.AIMessage?`ai`:e instanceof i.SystemMessage?`system`:e instanceof i.ToolMessage?`tool`:`unknown`}function _e(e,t){return Su(e,t)}function ve(e){return!ee&&!D?[]:e.map(e=>{let t=ge(e),n={role:t===`human`?`user`:t===`ai`?`assistant`:t},r=typeof e.content==`string`?e.content:JSON.stringify(e.content);r&&(n.content=r.length>xu?r.slice(0,xu)+`…(截断 ${r.length-xu} 字符)`:r);let i=e.tool_calls;Array.isArray(i)&&i.length&&(n.tool_calls=i.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:typeof e.args==`string`?e.args:JSON.stringify(e.args)}})));let a=e.tool_call_id;return a&&(n.tool_call_id=a),n})}async function ye(e,t,n){ne.value=[],L.value=[],R=0,V=Kl(),V.messages=e,V=await ru(f,V);let r=e;for(let e of f)if(e.compressInput){let t=z(void 0,`compression`,`compress:${e.name}`,{}),n=await e.compressInput(r);r=Array.isArray(n)?n:n.messages,n&&!Array.isArray(n)&&n.stats?(V={...V,lastCompression:n.stats},ae(t,`ok`,{stats:n.stats})):ae(t)}{let e=Hl(u||`你是一个智能助手。`),n=Math.max(2e3,Math.round(M.contextWindow*le));if(e>n){let r=`[page-agent-sdk] systemPrompt 本身(${e} tokens)超过系统段预算(${n} tokens,窗口 ${M.contextWindow} 的 ${le*100}%);请缩减 systemPrompt 或换更大窗口模型`;return console.error(r),t({type:`error`,message:r,severity:`fatal`,code:`SYSTEM_PROMPT_OVER_BUDGET`}),t({type:`done`,content:``}),``}}let o=fe(r);re(`context`,{model:a,tools:oe.map(e=>e.name),middleware:f.map(e=>e.name)});let s=cu(f,e=>me(e,t,n)),c=lu(f,he),l={rounds:0,maxToolRounds:j,invokeUsage:{prompt_tokens:0,completion_tokens:0,total_tokens:0},writeFailures:{},budgetHinted:!1};V.loopProgress=l;let d=0,p=0,h=Cu(j,m),g=null,_=0,v=!1,y=0;try{for(;(d<j||v)&&p<h&&(p++,!n?.aborted);){if(E>0&&l.invokeUsage.total_tokens>E){let e=`本轮 token 预算(约 ${E})已用尽:任务在 ${d} 轮工具调用后中断,已完成的部分均保留。可继续对话,指定下一步(如「继续完成」/「只改 X」/「提高预算重试」)。`;return re(`error`,{stage:`round_token_budget_exceeded`,used:l.invokeUsage.total_tokens,budget:E,rounds:d}),t({type:`error`,message:e,severity:`observable`,code:`ROUND_TOKEN_BUDGET_EXCEEDED`,context:{used:l.invokeUsage.total_tokens,budget:E}}),t({type:`done`,content:e}),e}let e=z(void 0,`round`,`round ${p}`,{round:p})?.id;t({type:`round_start`,round:p}),V=iu(f,{messages:o,state:V}),o=pe(o),o=_e(o,Math.round(M.contextWindow*.6));let r=z(e,`model`,a,{round:d+1,tools:oe.map(e=>e.name)});re(`llm_request`,{round:d+1,model:a,tools:oe.map(e=>e.name),messages:ve(o)});let u=await s({messages:o,state:V});o.push(u.message),re(`llm_response`,{round:d+1,content:u.content,toolCalls:u.toolCalls}),ae(r,u.aborted?`timeout`:`ok`,{usage:C(u.message)});{let e=T(u.message);e&&(l.invokeUsage.prompt_tokens+=e.prompt_tokens??0,l.invokeUsage.completion_tokens+=e.completion_tokens??0,l.invokeUsage.total_tokens+=e.total_tokens??0)}if(V=au(f,u,V),u.aborted)return t({type:`done`,content:u.content}),u.content;if(!u.toolCalls.length){let e=uu(u.content),n=e?_u(u.content):null;if(n&&n.length){u.toolCalls=n;let e=u.message;e&&(e.tool_calls=n.map(e=>({id:e.id,name:e.name,args:e.args,type:`tool_call`}))),re(`middleware`,{stage:`dsml_parsed`,count:n.length,names:n.map(e=>e.name)})}else{if(e&&_<2){_+=1,v=!0,re(`middleware`,{stage:`format_retry`,attempt:_,content:u.content.slice(0,200)}),o.push(new i.HumanMessage(`⚠️ 你刚才把工具调用写成了文本(伪 XML/标签/DSML 标记,如 <|tool_calls|>、<||DSML||>、<invoke name=...>),未被系统识别为工具调用,因此未执行,页面无变化。请直接用标准 function calling(工具调用)格式重新发起工具调用,不要在回复正文里输出这些标签或 JSON 文本。`));continue}if(e&&(re(`error`,{stage:`garbled_exhausted`,retries:_,content:u.content.slice(0,200)}),t({type:`error`,message:`模型连续 2 次输出无法解析的工具调用格式(DSML/伪标签),任务可能未完成。请重试或换模型。`,severity:`observable`,code:`GARBLED_TOOL_CALL_EXHAUSTED`,context:{content:u.content.slice(0,200)}})),!e&&d>0&&y<2&&mu(u.content)){y+=1,v=!0,re(`middleware`,{stage:`transitional_retry`,attempt:y,content:u.content.slice(0,160)}),o.push(new i.HumanMessage(`⚠️ 你刚才输出的是计划/过渡性表述(如「我先看看」「稍后委派」),任务尚未完成。请立即继续执行 —— 调用所需工具把任务做完,全部完成后再给出总结回复。`));continue}if(!e&&w>0&&V.verifyAttempts<w){let e=await su(f,{messages:o,state:V,response:u,log:(e,t)=>re(e,t)});if(e){g=u.content,V.verifyAttempts+=1,o.push(new i.HumanMessage(`⚠️ 验证未通过,请修正:${e}`)),re(`middleware`,{stage:`verify_retry`,attempt:V.verifyAttempts,feedback:e});continue}}v=!1;let n=u.content;if(e){let e=du(n);n=e?`${e}\n\n(注:此后模型输出了无法解析的工具调用文本,该调用未执行,任务可能未完成。)`:`模型多次输出无法解析的工具调用格式,本次任务可能未完成。请重试或继续指示。`}return t({type:`done`,content:n}),n}}v=!1;let m=u.toolCalls.map(e=>{let r=e.id||`call_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return{id:r,call:e,ctx:{id:r,name:e.name,args:e.args,state:V,signal:n,emit:t,logSink:I}}}),h=await Ll(m,b,async r=>{if(n?.aborted)return;let i=z(e,`tool`,r.call.name,{name:r.call.name}),a=Date.now();t({type:`tool_call`,name:r.call.name,args:r.call.args}),re(`tool_call`,{round:d+1,name:r.call.name,args:r.call.args,id:r.id});let o;try{o=await c(r.ctx)}catch(e){if(ql(e,n))throw e;o={content:`工具执行出错:${Ml(e,`recoverable`).message}`,status:`error`}}let s=Date.now()-a;return t({type:`tool_result`,name:r.call.name,result:o.content,status:o.status,durationMs:s}),re(`tool_result`,{round:d+1,name:r.call.name,result:o.content,status:o.status,durationMs:s}),ae(i,o.status===`error`?`error`:`ok`,{resultSnippet:String(o.content).slice(0,100)}),o},n);for(let e=0;e<m.length;e++){let t=h[e];t&&o.push(new i.ToolMessage({tool_call_id:m[e].id,content:t.content}))}for(let e=0;e<m.length;e++){let t=h[e];if(!t||!wu.has(m[e].call.name))continue;let n=Tu(m[e].call.args);t.status===`error`?l.writeFailures[n]=(l.writeFailures[n]??0)+1:delete l.writeFailures[n]}if(n?.aborted)break;d++,l.rounds=d}if(n?.aborted)return t({type:`done`,content:``}),``;if(g!=null)return t({type:`done`,content:g}),g;let e=o[o.length-1];if(e&&ge(e)===`tool`){let e=o[0]&&ge(o[0])===`system`?o.slice(1):o.slice(),r=[new i.SystemMessage(de()+`
13
+ `)}function fe(e){let t=[new i.SystemMessage(de())];for(let n of e)n.role===`user`?t.push(new i.HumanMessage(n.content)):n.role===`assistant`?t.push(new i.AIMessage(n.content)):n.role===`system`&&t.push(new i.SystemMessage(n.content));return t}function pe(e){let t=e[0]&&ge(e[0])===`system`?e.slice(1):e.slice();return[new i.SystemMessage(de()),...t]}async function me(e,t,n,r){let a=r??se,o={signal:n,maxRetries:h,baseDelayMs:g,onRetry:({attempt:e,error:t,waitMs:n})=>{let r=t?.message??String(t);re(`error`,{stage:`model_retry`,attempt:e,waitMs:n,error:r}),console.warn(`[Agent] 模型调用失败,第 ${e}/${h} 次重试(等 ${n}ms):${r}`)}},s=new AbortController;n&&(n.aborted?s.abort():n.addEventListener(`abort`,()=>s.abort(),{once:!0}));let c;try{let t;try{c=await Zl(()=>{clearTimeout(t);let n=y>0?y:$l,r=a.stream(e.messages,{signal:s.signal});return y>0?Promise.race([r,new Promise((e,r)=>{t=setTimeout(()=>r(new Ql(n)),n)})]):r},o)}finally{clearTimeout(t)}}catch(a){if(ql(a,n))return{message:new i.AIMessage(``),toolCalls:[],content:``,aborted:!0};if(tu(a)&&!e._ctxRetry){e._ctxRetry=!0;let i=e=>Hl(typeof e.content==`string`?e.content:JSON.stringify(e.content)),a=e.messages.reduce((e,t)=>e+i(t),0),o=_e(e.messages,Math.round(M.contextWindow*.3)),s=o.reduce((e,t)=>e+i(t),0);return re(`error`,{stage:`context_overflow_retry`,at:`launch`,beforeTokens:a,afterTokens:s,window:M.contextWindow}),console.warn(`[page-agent-sdk] 上下文超限(启动)→ 激进 trim 重试:${a} → ${s} tokens`),me({...e,messages:o},t,n,r)}throw a}if(!c)return{message:new i.AIMessage(``),toolCalls:[],content:``,aborted:!0};let l=null,u=``;try{for await(let e of eu(c,y)){l=l?l.concat(e):e;let n=x(e);n&&t&&(u+=n,t({type:`text`,delta:n}));let r=S(e);r&&t&&t({type:`reasoning`,delta:r})}}catch(a){if(a instanceof Ql)throw s.abort(),re(`error`,{stage:`stream_stalled`,waitedMs:a.waitedMs,stallMs:y}),a;if(ql(a,n))return{message:l??new i.AIMessage(u),toolCalls:[],content:u,aborted:!0};if(tu(a)&&l===null&&u===``&&!e._ctxRetry){e._ctxRetry=!0;let i=e=>Hl(typeof e.content==`string`?e.content:JSON.stringify(e.content)),a=e.messages.reduce((e,t)=>e+i(t),0),o=_e(e.messages,Math.round(M.contextWindow*.3)),s=o.reduce((e,t)=>e+i(t),0);return re(`error`,{stage:`context_overflow_retry`,beforeTokens:a,afterTokens:s,window:M.contextWindow}),console.warn(`[page-agent-sdk] 上下文超限 → 激进 trim 重试:${a} → ${s} tokens(窗口 ${M.contextWindow})`),me({...e,messages:o},t,n,r)}throw a}let d=l;return{message:d,toolCalls:d.tool_calls||[],content:u}}async function he(e){let t=oe.find(t=>t.name===e.name);if(!t)return{content:`工具 "${e.name}" 不存在`,status:`error`};try{let n={__pgDataScope:``,...e.callConfig??{}},r=await t.invoke(e.args,{configurable:n}),i=typeof r==`string`?r:JSON.stringify(r);return i=Il(i,{files:e.state.files,vfsAvailable:oe.some(e=>e.name===`vfs_read`),toolName:e.name,threshold:te,passThroughChars:P}).content,{content:i,status:`done`}}catch(e){return{content:`工具执行出错:${Ml(e,`recoverable`).message}`,status:`error`}}}function ge(e){return e instanceof i.HumanMessage?`human`:e instanceof i.AIMessage?`ai`:e instanceof i.SystemMessage?`system`:e instanceof i.ToolMessage?`tool`:`unknown`}function _e(e,t){return Su(e,t)}function ve(e){return!ee&&!D?[]:e.map(e=>{let t=ge(e),n={role:t===`human`?`user`:t===`ai`?`assistant`:t},r=typeof e.content==`string`?e.content:JSON.stringify(e.content);r&&(n.content=r.length>xu?r.slice(0,xu)+`…(截断 ${r.length-xu} 字符)`:r);let i=e.tool_calls;Array.isArray(i)&&i.length&&(n.tool_calls=i.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:typeof e.args==`string`?e.args:JSON.stringify(e.args)}})));let a=e.tool_call_id;return a&&(n.tool_call_id=a),n})}async function ye(e,t,n){ne.value=[],L.value=[],R=0,V=Kl(),V.messages=e,V=await ru(f,V);let r=e;for(let e of f)if(e.compressInput){let t=z(void 0,`compression`,`compress:${e.name}`,{}),n=await e.compressInput(r);r=Array.isArray(n)?n:n.messages,n&&!Array.isArray(n)&&n.stats?(V={...V,lastCompression:n.stats},ae(t,`ok`,{stats:n.stats})):ae(t)}{let e=Hl(u||`你是一个智能助手。`),n=Math.max(2e3,Math.round(M.contextWindow*le));if(e>n){let r=`[page-agent-sdk] systemPrompt 本身(${e} tokens)超过系统段预算(${n} tokens,窗口 ${M.contextWindow} 的 ${le*100}%);请缩减 systemPrompt 或换更大窗口模型`;return console.error(r),t({type:`error`,message:r,severity:`fatal`,code:`SYSTEM_PROMPT_OVER_BUDGET`}),t({type:`done`,content:``}),``}}let o=fe(r);re(`context`,{model:a,tools:oe.map(e=>e.name),middleware:f.map(e=>e.name)});let s=cu(f,e=>me(e,t,n)),c=lu(f,he),l={rounds:0,maxToolRounds:j,invokeUsage:{prompt_tokens:0,completion_tokens:0,total_tokens:0},writeFailures:{},budgetHinted:!1};V.loopProgress=l;let d=0,p=0,h=Cu(j,m),g=null,_=0,v=!1,y=0;try{for(;(d<j||v)&&p<h&&(p++,!n?.aborted);){if(E>0&&l.invokeUsage.total_tokens>E){let e=`本轮 token 预算(约 ${E})已用尽:任务在 ${d} 轮工具调用后中断,已完成的部分均保留。可继续对话,指定下一步(如「继续完成」/「只改 X」/「提高预算重试」)。`;return re(`error`,{stage:`round_token_budget_exceeded`,used:l.invokeUsage.total_tokens,budget:E,rounds:d}),t({type:`error`,message:e,severity:`observable`,code:`ROUND_TOKEN_BUDGET_EXCEEDED`,context:{used:l.invokeUsage.total_tokens,budget:E}}),t({type:`done`,content:e}),e}let e=z(void 0,`round`,`round ${p}`,{round:p})?.id;t({type:`round_start`,round:p}),V=iu(f,{messages:o,state:V}),o=pe(o),o=_e(o,Math.round(M.contextWindow*.6));let r=z(e,`model`,a,{round:d+1,tools:oe.map(e=>e.name)});re(`llm_request`,{round:d+1,model:a,tools:oe.map(e=>e.name),messages:ve(o)});let u=await s({messages:o,state:V});o.push(u.message),re(`llm_response`,{round:d+1,content:u.content,toolCalls:u.toolCalls}),ae(r,u.aborted?`timeout`:`ok`,{usage:C(u.message)});{let e=T(u.message);e&&(l.invokeUsage.prompt_tokens+=e.prompt_tokens??0,l.invokeUsage.completion_tokens+=e.completion_tokens??0,l.invokeUsage.total_tokens+=e.total_tokens??0)}if(V=au(f,u,V),u.aborted)return t({type:`done`,content:u.content}),u.content;if(!u.toolCalls.length){let e=uu(u.content),n=e?_u(u.content):null;if(n&&n.length){u.toolCalls=n;let e=u.message;e&&(e.tool_calls=n.map(e=>({id:e.id,name:e.name,args:e.args,type:`tool_call`}))),re(`middleware`,{stage:`dsml_parsed`,count:n.length,names:n.map(e=>e.name)})}else{if(e&&_<2){_+=1,v=!0,re(`middleware`,{stage:`format_retry`,attempt:_,content:u.content.slice(0,200)}),o.push(new i.HumanMessage(`⚠️ 你刚才把工具调用写成了文本(伪 XML/标签/DSML 标记,如 <|tool_calls|>、<||DSML||>、<invoke name=...>),未被系统识别为工具调用,因此未执行,页面无变化。请直接用标准 function calling(工具调用)格式重新发起工具调用,不要在回复正文里输出这些标签或 JSON 文本。`));continue}if(e&&(re(`error`,{stage:`garbled_exhausted`,retries:_,content:u.content.slice(0,200)}),t({type:`error`,message:`模型连续 2 次输出无法解析的工具调用格式(DSML/伪标签),任务可能未完成。请重试或换模型。`,severity:`observable`,code:`GARBLED_TOOL_CALL_EXHAUSTED`,context:{content:u.content.slice(0,200)}})),!e&&d>0&&y<2&&mu(u.content)){y+=1,v=!0,re(`middleware`,{stage:`transitional_retry`,attempt:y,content:u.content.slice(0,160)}),o.push(new i.HumanMessage(`⚠️ 你刚才输出的是计划/过渡性表述(如「我先看看」「稍后委派」),任务尚未完成。请立即继续执行 —— 调用所需工具把任务做完,全部完成后再给出总结回复。`));continue}if(!e&&w>0&&V.verifyAttempts<w){let e=await su(f,{messages:o,state:V,response:u,log:(e,t)=>re(e,t)});if(e){g=u.content,V.verifyAttempts+=1,o.push(new i.HumanMessage(`⚠️ 验证未通过,请修正:${e}`)),re(`middleware`,{stage:`verify_retry`,attempt:V.verifyAttempts,feedback:e});continue}}v=!1;let n=u.content;if(e){let e=du(n);n=e?`${e}\n\n(注:此后模型输出了无法解析的工具调用文本,该调用未执行,任务可能未完成。)`:`模型多次输出无法解析的工具调用格式,本次任务可能未完成。请重试或继续指示。`}return t({type:`done`,content:n}),n}}v=!1;let m=u.toolCalls.map(e=>{let r=e.id||`call_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return{id:r,call:e,ctx:{id:r,name:e.name,args:e.args,state:V,signal:n,emit:t,logSink:I}}}),h=await Ll(m,b,async r=>{if(n?.aborted)return;let i=z(e,`tool`,r.call.name,{name:r.call.name}),a=Date.now();t({type:`tool_call`,name:r.call.name,args:r.call.args,id:r.id}),re(`tool_call`,{round:d+1,name:r.call.name,args:r.call.args,id:r.id});let o;try{o=await c(r.ctx)}catch(e){if(ql(e,n))throw e;o={content:`工具执行出错:${Ml(e,`recoverable`).message}`,status:`error`}}let s=Date.now()-a;return t({type:`tool_result`,name:r.call.name,result:o.content,status:o.status,durationMs:s,id:r.id}),re(`tool_result`,{round:d+1,name:r.call.name,result:o.content,status:o.status,durationMs:s}),ae(i,o.status===`error`?`error`:`ok`,{resultSnippet:String(o.content).slice(0,100)}),o},n);for(let e=0;e<m.length;e++){let t=h[e];t&&o.push(new i.ToolMessage({tool_call_id:m[e].id,content:t.content}))}for(let e=0;e<m.length;e++){let t=h[e];if(!t||!wu.has(m[e].call.name))continue;let n=Tu(m[e].call.args);t.status===`error`?l.writeFailures[n]=(l.writeFailures[n]??0)+1:delete l.writeFailures[n]}if(n?.aborted)break;d++,l.rounds=d}if(n?.aborted)return t({type:`done`,content:``}),``;if(g!=null)return t({type:`done`,content:g}),g;let e=o[o.length-1];if(e&&ge(e)===`tool`){let e=o[0]&&ge(o[0])===`system`?o.slice(1):o.slice(),r=[new i.SystemMessage(de()+`
14
14
 
15
15
  工具调用次数已达上限,请基于已有工具结果直接给出最终回答,不要再调用工具。`),...e];re(`llm_request`,{round:`wrap_up`,model:a,tools:[],messages:ve(r)});let s=await cu(f,e=>me(e,t,n,B))({messages:r,state:V});if(V=au(f,s,V),re(`llm_response`,{round:`wrap_up`,content:s.content}),s.aborted)return t({type:`done`,content:s.content}),s.content;if(s.content){let e=s.content;if(uu(e)){let n=du(e);re(`error`,{stage:`garbled_wrapup`,content:e.slice(0,200)}),t({type:`error`,message:`模型在收口(工具轮耗尽)时输出无法解析的工具调用格式,任务可能未完成。请重试或换模型。`,severity:`observable`,code:`GARBLED_TOOL_CALL_EXHAUSTED`,context:{content:e.slice(0,200)}}),e=n?`${n}\n\n(注:工具调用次数已达上限,模型最后试图发起的调用未执行,任务可能未完成。)`:`我已完成本轮能做的部分操作,但最后的计划未能执行(工具调用次数已达上限)。请重试或继续指示。`}return t({type:`done`,content:e}),e}}let r=`我已完成本轮能做的操作,但未能综合出最终结论。请基于上方已完成的工具操作结果继续,或告诉我下一步重点。`;return t({type:`done`,content:r}),r}finally{try{await ou(f,V)}catch(e){let t=Ml(e,`observable`);console.warn(`[Agent] afterAgent 清理出错(observable,已忽略):`,t.message)}if(ie&&k)try{k(L.value,Gl(L.value))}catch{}}}async function be(e,t,n){let r=``;return await ye(e,e=>{e.type===`done`&&(r=e.content),n?.(e)},t),r}function xe(e){oe=[...f.flatMap(e=>e.tools||[]),...e],ce()}function Se(e){B=e,ce(),A?.(e)}return{invoke:be,stream:ye,getState:()=>V,get allTools(){return oe},setTools:xe,setLlm:Se,setModelCaps:F,debugLogs:ne,spans:L,getEffectiveSystemPrompt:()=>de()}}function Du(e){let t=e;for(let e=0;e<5&&t&&t._def;e++){if(t._def.innerType){t=t._def.innerType;continue}break}if(!t||!t.shape||typeof t.shape!=`object`)return null;try{let e=typeof t.shape==`function`?t.shape():t.shape;return Object.keys(e)}catch{return null}}function Ou(e,t,n){if(!n||!e)return!0;let r=ku(t);for(let t of e.split(`.`)){if(t.startsWith(`__pg`)||!r)return!1;if(r=ku(r),r&&r.shape&&typeof r.shape==`object`){let e=typeof r.shape==`function`?r.shape():r.shape;if(!(t in e))return!1;r=e[t]}else if(r&&(r._def?.type===`array`||r.constructor?.name===`ZodArray`)){if(!/^\d+$/.test(t))return!1;r=r.element}else if(r&&(r._def?.type===`union`||r._def?.type===`discriminatedUnion`||Array.isArray(r.options)))return!0;else return!1}return!0}function ku(e){let t=e;for(let e=0;e<8&&t&&t._def;e++){if(t._def.innerType){t=t._def.innerType;continue}if(t._def.schema){t=t._def.schema;continue}if(t._def.getter){t=t._def.getter();continue}break}return t}function Au(e,t){if(!t)return e;let n=ku(e),r=t.split(`.`);for(let e=0;e<r.length;e++){let t=r[e];if(!n)return null;if(n=ku(n),n&&n.shape&&typeof n.shape==`object`)n=(typeof n.shape==`function`?n.shape():n.shape)[t];else if(n&&(n._def?.type===`array`||n.constructor?.name===`ZodArray`)){if(!/^\d+$/.test(t))return null;n=n.element}else if(n&&(n._def?.type===`union`||n._def?.type===`discriminatedUnion`||Array.isArray(n.options))){let t=r.slice(e).join(`.`),i=(n.options??[]).map(e=>Au(e,t)).filter(e=>e!=null);return i.length?i[0]:null}else return null}return n??null}function ju(e){let t=ku(e);return t?._def?.type===`string`||t?.constructor?.name===`ZodString`}function Mu(e){let t=ku(e);return t?._def?.type===`array`||t?.constructor?.name===`ZodArray`?t.element??null:null}function Nu(e,t=`code`){let n=ku(e);if(!n)return!1;if(n.shape&&typeof n.shape==`object`){let e=typeof n.shape==`function`?n.shape():n.shape;return t in e&&ju(e[t])}return n._def?.type===`union`||Array.isArray(n.options)?(n.options??[]).some(e=>Nu(e,t)):!1}function Pu(e){let t=ku(e);if(!t||!t.shape||typeof t.shape!=`object`)return!1;let n=typeof t.shape==`function`?t.shape():t.shape;for(let e of Object.keys(n)){if(e===`code`&&ju(n[e]))return!0;let t=Mu(n[e]);if(t&&Nu(t))return!0}return!1}function Fu(e,t=`code`){let n=ku(e);if(!n||!n.shape||typeof n.shape!=`object`)return[];let r=typeof n.shape==`function`?n.shape():n.shape,i=[];for(let e of Object.keys(r)){if(e.startsWith(`__pg`))continue;let n=Mu(r[e]);n&&Nu(n,t)&&i.push(e)}return i}function Iu(e,t){if(typeof e!=`object`||!e||!t)return e;let n=ku(t);if(!n||!n.shape){if(Array.isArray(e)&&(n?._def?.type||n?.element)){let t=n.element??n._def?.type;return e.map(e=>Iu(e,t))}if(!Array.isArray(e)){let t=e,n=Object.keys(t);if(!n.some(e=>e.startsWith(`__pg`)))return e;let r={};for(let e of n)e.startsWith(`__pg`)||(r[e]=t[e]);return r}return e}let r=typeof n.shape==`function`?n.shape():n.shape,i={};for(let t of Object.keys(e))if(t in r&&!t.startsWith(`__pg`)){let n=e[t];i[t]=Iu(n,r[t])}return i}function Lu(e,t){if(!t||typeof e!=`object`||!e||Array.isArray(e))return e;let n=new Set(t),r={};for(let t of Object.keys(e))n.has(t)&&(r[t]=e[t]);return r}var Ru=!1;function zu(){Ru||=!0}function Bu(e){let t=e?._def?.checks;if(!Array.isArray(t))return[];let n=[];for(let e of t)e?._zod?.def&&n.push(e._zod.def);return n}function Vu(e){return e===-(2**53-1)||e===-1/0}function Hu(e){return e===2**53-1||e===1/0}function Uu(e,t=new WeakSet,n=0){let r=!1,i=!1,a=!1,o,s=e;for(let e=0;e<8&&s&&s._def;e++){let e=s._def.type;if(e===`optional`||e==="default"||e===`nullable`||e===`catch`||e===`readonly`||e===`prefault`){e===`optional`?r=!0:e===`nullable`?i=!0:(e==="default"||e===`prefault`)&&(a=!0,o=s._def.defaultValue),s=s._def.innerType;continue}if(e===`lazy`){s=s._def.getter?s._def.getter():s._def.schema;continue}if(e===`pipe`){s=s._def.in??s._def.innerType;continue}break}let c=s?._def?.type||`unknown`;if(s?._def||zu(),n>15)return{type:c,description:`↩ 深度截断(>15,防栈溢出;查深层用 schema_data({jsonPath}))`};if(s&&typeof s==`object`&&t.has(s))return{type:c,description:`↩ 递归引用(容器 children 自引用,已截断防栈溢出)`};s&&typeof s==`object`&&t.add(s);let l={type:c};r&&(l.optional=!0),i&&(l.nullable=!0),a&&(l.default=o),s?.description&&(l.description=s.description);let u={};switch(c){case`string`:{s.minLength!=null&&(u.minLength=s.minLength),s.maxLength!=null&&(u.maxLength=s.maxLength);let e=Bu(s).filter(e=>e.check===`string_format`).map(e=>e.format).filter(Boolean);e.length&&(u.format=e.length===1?e[0]:e);break}case`number`:s.minValue!=null&&!Vu(s.minValue)&&(u.min=s.minValue),s.maxValue!=null&&!Hu(s.maxValue)&&(u.max=s.maxValue),s.isInt&&(u.int=!0),s.format&&s.format!==`number`&&(u.format=s.format);break;case`enum`:u.values=s.options;break;case`literal`:{let e=s._def?.values??(s._def?.value===void 0?[]:[s._def.value]);u.value=e.length===1?e[0]:e;break}case`array`:u.item=Uu(s.element,t,n+1);for(let e of Bu(s))e.check===`min_length`?u.minLength=e.minimum:e.check===`max_length`?u.maxLength=e.maximum:e.check===`length_equals`&&(u.length=e.length);break;case`object`:{let e=typeof s.shape==`function`?s.shape():s.shape;u.shape=Object.fromEntries(Object.entries(e||{}).map(([e,r])=>[e,Uu(r,t,n+1)]));break}case`union`:{let e=(s._def?.options||[]).map(e=>Uu(e,t,n+1));e.length&&(u.anyOf=e);break}case`record`:s._def?.valueType&&(u.valueType=Uu(s._def.valueType,t,n+1));break;default:break}return Object.keys(u).length&&(l.constraints=u),l}function Wu(e){let t=[];return e.minLength!==void 0&&t.push(`minLen=${e.minLength}`),e.maxLength!==void 0&&t.push(`maxLen=${e.maxLength}`),e.length!==void 0&&t.push(`len=${e.length}`),e.min!==void 0&&t.push(`min=${e.min}`),e.max!==void 0&&t.push(`max=${e.max}`),e.int&&t.push(`int`),e.format&&t.push(`format=${Array.isArray(e.format)?e.format.join(`|`):e.format}`),e.values&&t.push(`enum=[${e.values.map(e=>String(e)).join(`|`)}]`),e.value!==void 0&&t.push(`=${JSON.stringify(e.value)}`),t.join(`, `)}function Gu(e,t){let n=t.constraints?Wu(t.constraints):``,r=n?`[${n}]`:``,i=t.optional?`?`:``,a=t.description?`: ${t.description}`:``;return`- ${e} (${t.type}${i})${r}${a}`}function Ku(e){if(!e)return``;try{let t=e;for(let e=0;e<8&&t&&t._def;e++){if(t._def.innerType){t=t._def.innerType;continue}if(t._def.getter){t=t._def.getter();continue}if(t._def.schema){t=t._def.schema;continue}break}let n=t?.shape?typeof t.shape==`function`?t.shape():t.shape:null;if(n&&typeof n==`object`&&Object.keys(n).length)return Object.entries(n).map(([e,t])=>Gu(e,Uu(t))).join(`
16
16
  `)}catch{}try{return Gu(`(root)`,Uu(e))}catch{}return``}function qu(e,t){let n=Uu(t),r=n.description?`: ${n.description}`:``;return`- ${e} (${n.type})${r}`}function Ju(e,n){let r=[],i=ku(e);if(!i?.shape)return{schema:e,fallback:[...n]};let a={...typeof i.shape==`function`?i.shape():i.shape};for(let e of n){if(e.includes(`.`)){r.push(e);continue}let n=a[e];if(!n){r.push(e);continue}let i=ku(n),o=i?.element?ku(i.element):null;if(o?.shape){let n=o.extend({__pgId:t.z.string().optional()});a[e]=t.z.array(n)}else if(Array.isArray(o?.options)){let n=o.options.map(e=>{let n=ku(e);return n?.shape?n.extend({__pgId:t.z.string().optional()}):e}),r=o._def?.discriminator===void 0?t.z.union(n):t.z.discriminatedUnion(o._def.discriminator,n);a[e]=t.z.array(r)}else r.push(e)}return{schema:t.z.object(a),fallback:r}}function Yu(e){if(!e)return``;try{let t=e;for(let e=0;e<8&&t&&t._def;e++){if(t._def.innerType){t=t._def.innerType;continue}if(t._def.getter){t=t._def.getter();continue}if(t._def.schema){t=t._def.schema;continue}break}let n=t?.shape?typeof t.shape==`function`?t.shape():t.shape:null;if(n&&typeof n==`object`&&Object.keys(n).length)return Object.entries(n).map(([e,t])=>qu(e,t)).join(`
@@ -57,10 +57,10 @@ self.onmessage = async (e) => {
57
57
  【与当前问题可能相关的早期对话】`,b);let C=t.getRegisteredData??t.getRegisteredSlots;if(C)try{let e=C();if(e.length){let t=e.map(e=>`- ${e.path?e.path+`: `:``}${e.description}`).join(`
58
58
  `);S.push(`
59
59
  【当前可操作数据(动态增删后的最新状态,操作前以 describe_data / read 为准)】`,t)}}catch{}let w={role:`system`,content:S.join(`
60
- `),timestamp:Date.now()},T=[];for(let e of l)T.push(e.userMsg),T.push(...e.assistantMsgs);let E=[w,...T],D=E.reduce((e,t)=>e+Hl(typeof t.content==`string`?t.content:JSON.stringify(t.content)),0);return t.contextWindow&&D>t.contextWindow&&console.warn(`[page-agent-sdk] compress 后仍超窗口:${D} > ${t.contextWindow} tokens(单条消息超窗口,compress 无法压)`),{messages:E,stats:{triggered:!0,roundsTotal:a.length,roundsSummarized:u.length,roundsRecalled:y.length,originalMessages:o,compressedMessages:E.length,strategy:_,decision:r}}}return{compress:a,config:t}}function Jf(e={}){let t=qf(e);return Object.assign({name:`summarization`,compressInput:async n=>{let r;if(e.decideInvoke){let i=Df(n);if(Gf(i,t.config)){let a=t.config.contextWindow&&t.config.contextWindow>0?`token`:`rounds`,o=a===`token`?`历史 token 超阈值 ${Math.round(Math.min((t.config.contextWindow??0)*(t.config.summaryThresholdRatio??.5),Wf(t.config.contextWindow,t.config.promptSoftCapTokens)))}`:`轮数 ${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 Yf(e=20){let t=new Map,n=[];return{start(e,n,r,i){t.set(e,{taskId:e,task:n,label:r,status:`running`,steps:[],startedAt:i})},pushStep(e,n){let r=t.get(e);r&&r.steps.push(n)},finish(r,i,a){let o=t.get(r);if(o)for(o.status=i,o.durationMs=Date.now()-o.startedAt,o.resultPreview=a.length>120?a.slice(0,120)+`…`:a,t.delete(r),n.unshift(o);n.length>e;)n.pop()},getActive(){return[...t.values()]},getHistory(){return[...n]}}}function Xf(e){return!!e&&typeof e==`object`&&typeof e.invoke==`function`&&typeof e.stream==`function`}var Zf=[`describe_data`,`get_data`,`read`,`query_data`,`search_data`,`fetch_document`],Qf=1,$f=4,ep=6,tp=[`spawn_agent`,`spawn_agents`],np=[`load_skill`,`write_todos`,`update_todo`,`restore_last_checkpoint`,`request_human_confirmation`,`set_focus`,`add_focus`,`remove_focus`,`clear_focus`];function rp(e){return tp.includes(e)||np.includes(e)||e.startsWith(`use_`)}function ip(e,t,n=[]){return[...e.filter(e=>t.has(e.name)&&!rp(e.name)),...n]}function ap(e,t){let n=typeof e==`string`?void 0:e,r=n&&`writeCapable`in n?n.writeCapable:void 0;return typeof r==`boolean`?r:typeof r==`function`?t===void 0||r(t):!1}function op(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 sp(e,t){return t.some(t=>e===t||e.startsWith(t+`.`)||e.startsWith(t+`[`))}function cp(e,t){let n=e.invoke.bind(e),r=async(e,r)=>{if(Array.isArray(e?.patches)&&e.patches.some(e=>!e||typeof e.jsonPath!=`string`||!e.jsonPath))return`PATH_OUT_OF_SCOPE:patches 含无 jsonPath 项(作用于根),子 agent 仅可写 ${t.join(`, `)} 范围内子路径。请为每个 patch 指定 jsonPath。`;let i=op(e);if(!i.length)return`PATH_OUT_OF_SCOPE:子 agent 仅可增量 patch(writablePaths: ${t.join(`, `)}),不能整体替换(无 jsonPath)。用 write({patch:{jsonPath,...}}) 增量改。`;for(let e of i)if(!sp(e,t))return`PATH_OUT_OF_SCOPE:子 agent 写 "${e}" 越界(仅可写 ${t.join(`, `)})。`;return r===void 0?n(e):n(e,r)};return new Proxy(e,{get(e,t,n){return t===`invoke`?r:Reflect.get(e,t,n)}})}function lp(e,t,n){return new Proxy(e,{get(e,r,i){return r===`invoke`?async(r,i)=>{let a=n(t);try{return await e.invoke(r,{...i,configurable:{...i?.configurable,__pgDataScope:t}})}finally{a()}}:Reflect.get(e,r,i)}})}async function up(e,t,n,r,i,a){let o=t.depth??0,s=t.maxDepth??Qf,c=new Set([...Zf,...t.allowedTools??[]]),l=()=>typeof t.allTools==`function`?t.allTools():t.allTools,u=ip(l(),c,t.extraTools??[]);if(t.writablePaths?.length){u=u.filter(e=>!ap(e));let e=l().filter(e=>ap(e)&&!rp(e.name)).map(e=>cp(e,t.writablePaths));u=[...u,...e]}let d=`sub-${o}-${Math.random().toString(36).slice(2,10)}`;t.enterDataScope&&(u=u.map(e=>e.__dataOpsScoped?lp(e,d,t.enterDataScope):e));let f=o+1<s?[dp({...t,depth:o+1})]:[],p=t.getFocuses?.()??[],m=p.length?Ld({getSchema:t.getSchema??(()=>null),getBind:t.getBind,initialFocuses:p,unfocusGuidance:`report-parent`}):void 0,h=t.getVfsFiles?{name:`vfs-bridge`,beforeAgent:()=>({files:t.getVfsFiles()})}:void 0,g=Vl({model:Xf(t.llm)?t.llm.model??t.llm.modelName:e.model??t.llm.model,contextWindow:t.llm.contextWindow,maxOutputTokens:t.llm.maxOutputTokens});if(g.contextWindow<2e5)throw Error(`[page-agent-sdk][subagent] 子 agent 模型上下文窗口 ${g.contextWindow} 小于最小支持 ${Bl}(需 ≥200K 窗口模型)`);let _=t.summarization===void 0?void 0:Jf(typeof t.summarization==`object`?{contextWindow:g.contextWindow,...t.summarization}:{contextWindow:g.contextWindow}),v=t.onUsage?{name:`sub-usage`,afterModel:e=>{let n=T(e.message);n&&t.onUsage(n)}}:void 0,y;!Xf(t.llm)&&t.llm.provider===`anthropic`&&(y=await b({...t.llm,model:e.model??t.llm.model},{temperature:t.temperature??t.llm.temperature,maxTokens:t.maxTokens??t.llm.maxTokens}));let x=Eu({contextWindow:g.contextWindow,maxOutputTokens:g.maxOutputTokens,...Xf(t.llm)?{llm:t.llm}:y?{llm:y}:{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,...t.llm.extraConfig?{extraConfig:t.llm.extraConfig}:{},...t.llm.extraBody?{extraBody:t.llm.extraBody}:{}},systemPrompt:e.role?.trim()||t.systemPrompt||`你是一个专注的子任务执行者。你只有只读工具(读主数据 / 抓文档),用它们完成给定任务,给出简洁结论,不要展开多余解释。`,tools:u,middleware:[...t.skills?.length?[of(t.skills)]:[],..._?[_]:[],...h?[h]:[],...f,...m?[m]:[],...v?[v]:[],...t.guardMiddleware??[],...t.middleware??[]],maxToolRounds:t.maxToolRounds??ep,maxVerifyAttempts:t.maxVerifyAttempts??0,onLog:i,debug:t.debug});t.debug&&console.log(`[subagent] 启动子 agent(depth=${o},工具 ${u.length} 个)`);let S=new AbortController,C=()=>S.abort();n?.addEventListener(`abort`,C,{once:!0});let w=()=>{n?.removeEventListener(`abort`,C),t.exitDataScope?.(d)},E=x.stream([{role:`user`,content:e.prompt,timestamp:Date.now()}],e=>{if(e.type===`approval_request`){a?.(e);return}r&&(e.type===`tool_call`||e.type===`tool_result`||e.type===`reasoning`)&&r(e)},S.signal);if(!t.timeoutMs||t.timeoutMs<=0)try{return await E}finally{w()}let D,O=new Promise((e,n)=>{D=setTimeout(()=>{S.abort(),n(Error(`子 agent 执行超时(${t.timeoutMs}ms),已中止。可简化子任务或拆更小的子任务重试`))},t.timeoutMs)});E.catch(()=>{});try{return await Promise.race([E,O])}finally{clearTimeout(D),w()}}function dp(e){let n=e.maxParallel??$f,i,a,o,s=e=>e?.configurable?.__pgSubagentCall??{signal:i,emit:a,logSink:o},c=(t,n,r)=>i=>{if(i.type===`reasoning`){r?.({type:`subagent`,taskId:t,label:n,kind:`reasoning`,name:``,delta:i.delta});return}e.tracker?.pushStep(t,{kind:i.type,name:i.name,ts:Date.now()}),r&&r({type:`subagent`,taskId:t,label:n,kind:i.type,name:i.name,args:i.type===`tool_call`?i.args:void 0,result:i.type===`tool_result`?i.result:void 0,status:i.type===`tool_result`?i.status:void 0})};return{name:`subagent`,tools:[(0,r.tool)(async({prompt:t,role:n,tools:r,writablePaths:i,model:a},o)=>{let l=s(o),u=(r??[]).filter(e=>!ap(e)),d=u.length||i?.length?{...e,...u.length?{allowedTools:u}:{},...i?.length?{writablePaths:i}:{}}:e,f=`sub-${Math.random().toString(36).slice(2,8)}`,p=n?.trim()||`子任务`,m=e=>l.logSink?.({...e,source:`子:${p}`}),h=Date.now();e.tracker?.start(f,t,p,h);try{let r=await up({prompt:t,role:n,model:a},d,l.signal,c(f,p,l.emit),m,l.emit);return e.tracker?.finish(f,`done`,r),r}catch(t){throw e.tracker?.finish(f,`error`,String(t?.message??t)),t}},{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;委派/框架类工具系统保留不可授`),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},r)=>{let i=s(r);return(await Ll(t,n,async(t,n)=>{let r=`sub-${n}-${Math.random().toString(36).slice(2,6)}`,a=t.role?.trim()||`子任务${n+1}`,o=e=>i.logSink?.({...e,source:`子:${a}`}),s=Date.now();e.tracker?.start(r,t.prompt,a,s);try{let n=await up(t,e,i.signal,c(r,a,i.emit),o,i.emit);return e.tracker?.finish(r,`done`,n??`(未完成)`),{ok:!0,text:n??`(未完成)`}}catch(t){let n=String(t?.message??t);return e.tracker?.finish(r,`error`,n),{ok:!1,error:n}}},i.signal)).map((e,t)=>e===void 0?`【子任务 ${t+1}】(未完成:已中止/未启动)`:e.ok?`【子任务 ${t+1}】✓\n${e.text}`:`【子任务 ${t+1}】✗ 失败:${e.error}`).join(`
60
+ `),timestamp:Date.now()},T=[];for(let e of l)T.push(e.userMsg),T.push(...e.assistantMsgs);let E=[w,...T],D=E.reduce((e,t)=>e+Hl(typeof t.content==`string`?t.content:JSON.stringify(t.content)),0);return t.contextWindow&&D>t.contextWindow&&console.warn(`[page-agent-sdk] compress 后仍超窗口:${D} > ${t.contextWindow} tokens(单条消息超窗口,compress 无法压)`),{messages:E,stats:{triggered:!0,roundsTotal:a.length,roundsSummarized:u.length,roundsRecalled:y.length,originalMessages:o,compressedMessages:E.length,strategy:_,decision:r}}}return{compress:a,config:t}}function Jf(e={}){let t=qf(e);return Object.assign({name:`summarization`,compressInput:async n=>{let r;if(e.decideInvoke){let i=Df(n);if(Gf(i,t.config)){let a=t.config.contextWindow&&t.config.contextWindow>0?`token`:`rounds`,o=a===`token`?`历史 token 超阈值 ${Math.round(Math.min((t.config.contextWindow??0)*(t.config.summaryThresholdRatio??.5),Wf(t.config.contextWindow,t.config.promptSoftCapTokens)))}`:`轮数 ${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 Yf(e=20){let t=new Map,n=[];return{start(e,n,r,i){t.set(e,{taskId:e,task:n,label:r,status:`running`,steps:[],startedAt:i})},pushStep(e,n){let r=t.get(e);r&&r.steps.push(n)},finish(r,i,a){let o=t.get(r);if(o)for(o.status=i,o.durationMs=Date.now()-o.startedAt,o.resultPreview=a.length>120?a.slice(0,120)+`…`:a,t.delete(r),n.unshift(o);n.length>e;)n.pop()},getActive(){return[...t.values()]},getHistory(){return[...n]}}}function Xf(e){return!!e&&typeof e==`object`&&typeof e.invoke==`function`&&typeof e.stream==`function`}var Zf=[`describe_data`,`get_data`,`read`,`query_data`,`search_data`,`fetch_document`],Qf=1,$f=4,ep=6,tp=[`spawn_agent`,`spawn_agents`],np=[`load_skill`,`write_todos`,`update_todo`,`restore_last_checkpoint`,`request_human_confirmation`,`set_focus`,`add_focus`,`remove_focus`,`clear_focus`];function rp(e){return tp.includes(e)||np.includes(e)||e.startsWith(`use_`)}function ip(e,t,n=[]){return[...e.filter(e=>t.has(e.name)&&!rp(e.name)),...n]}function ap(e,t){let n=typeof e==`string`?void 0:e,r=n&&`writeCapable`in n?n.writeCapable:void 0;return typeof r==`boolean`?r:typeof r==`function`?t===void 0||r(t):!1}function op(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 sp(e,t){return t.some(t=>e===t||e.startsWith(t+`.`)||e.startsWith(t+`[`))}function cp(e,t){let n=e.invoke.bind(e),r=async(e,r)=>{if(Array.isArray(e?.patches)&&e.patches.some(e=>!e||typeof e.jsonPath!=`string`||!e.jsonPath))return`PATH_OUT_OF_SCOPE:patches 含无 jsonPath 项(作用于根),子 agent 仅可写 ${t.join(`, `)} 范围内子路径。请为每个 patch 指定 jsonPath。`;let i=op(e);if(!i.length)return`PATH_OUT_OF_SCOPE:子 agent 仅可增量 patch(writablePaths: ${t.join(`, `)}),不能整体替换(无 jsonPath)。用 write({patch:{jsonPath,...}}) 增量改。`;for(let e of i)if(!sp(e,t))return`PATH_OUT_OF_SCOPE:子 agent 写 "${e}" 越界(仅可写 ${t.join(`, `)})。`;return r===void 0?n(e):n(e,r)};return new Proxy(e,{get(e,t,n){return t===`invoke`?r:Reflect.get(e,t,n)}})}function lp(e,t,n){return new Proxy(e,{get(e,r,i){return r===`invoke`?async(r,i)=>{let a=n(t);try{return await e.invoke(r,{...i,configurable:{...i?.configurable,__pgDataScope:t}})}finally{a()}}:Reflect.get(e,r,i)}})}async function up(e,t,n,r,i,a){let o=t.depth??0,s=t.maxDepth??Qf,c=new Set([...Zf,...t.allowedTools??[]]),l=()=>typeof t.allTools==`function`?t.allTools():t.allTools,u=ip(l(),c,t.extraTools??[]);if(t.writablePaths?.length){u=u.filter(e=>!ap(e));let e=l().filter(e=>ap(e)&&!rp(e.name)).map(e=>cp(e,t.writablePaths));u=[...u,...e]}let d=`sub-${o}-${Math.random().toString(36).slice(2,10)}`;t.enterDataScope&&(u=u.map(e=>e.__dataOpsScoped?lp(e,d,t.enterDataScope):e));let f=o+1<s?[dp({...t,depth:o+1})]:[],p=t.getFocuses?.()??[],m=p.length?Ld({getSchema:t.getSchema??(()=>null),getBind:t.getBind,initialFocuses:p,unfocusGuidance:`report-parent`}):void 0,h=t.getVfsFiles?{name:`vfs-bridge`,beforeAgent:()=>({files:t.getVfsFiles()})}:void 0,g=Vl({model:Xf(t.llm)?t.llm.model??t.llm.modelName:e.model??t.llm.model,contextWindow:t.llm.contextWindow,maxOutputTokens:t.llm.maxOutputTokens});if(g.contextWindow<2e5)throw Error(`[page-agent-sdk][subagent] 子 agent 模型上下文窗口 ${g.contextWindow} 小于最小支持 ${Bl}(需 ≥200K 窗口模型)`);let _=t.summarization===void 0?void 0:Jf(typeof t.summarization==`object`?{contextWindow:g.contextWindow,...t.summarization}:{contextWindow:g.contextWindow}),v=t.onUsage?{name:`sub-usage`,afterModel:e=>{let n=T(e.message);n&&t.onUsage(n)}}:void 0,y;!Xf(t.llm)&&t.llm.provider===`anthropic`&&(y=await b({...t.llm,model:e.model??t.llm.model},{temperature:t.temperature??t.llm.temperature,maxTokens:t.maxTokens??t.llm.maxTokens}));let x=Eu({contextWindow:g.contextWindow,maxOutputTokens:g.maxOutputTokens,...Xf(t.llm)?{llm:t.llm}:y?{llm:y}:{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,...t.llm.extraConfig?{extraConfig:t.llm.extraConfig}:{},...t.llm.extraBody?{extraBody:t.llm.extraBody}:{}},systemPrompt:e.role?.trim()||t.systemPrompt||`你是一个专注的子任务执行者。你只有只读工具(读主数据 / 抓文档),用它们完成给定任务,给出简洁结论,不要展开多余解释。`,tools:u,middleware:[...t.skills?.length?[of(t.skills)]:[],..._?[_]:[],...h?[h]:[],...f,...m?[m]:[],...v?[v]:[],...t.guardMiddleware??[],...t.middleware??[]],maxToolRounds:t.maxToolRounds??ep,maxVerifyAttempts:t.maxVerifyAttempts??0,onLog:i,debug:t.debug});t.debug&&console.log(`[subagent] 启动子 agent(depth=${o},工具 ${u.length} 个)`);let S=new AbortController,C=()=>S.abort();n?.addEventListener(`abort`,C,{once:!0});let w=()=>{n?.removeEventListener(`abort`,C),t.exitDataScope?.(d)},E=x.stream([{role:`user`,content:e.prompt,timestamp:Date.now()}],e=>{if(e.type===`approval_request`){a?.(e);return}r&&(e.type===`tool_call`||e.type===`tool_result`||e.type===`reasoning`)&&r(e)},S.signal);if(!t.timeoutMs||t.timeoutMs<=0)try{return await E}finally{w()}let D,O=new Promise((e,n)=>{D=setTimeout(()=>{S.abort(),n(Error(`子 agent 执行超时(${t.timeoutMs}ms),已中止。可简化子任务或拆更小的子任务重试`))},t.timeoutMs)});E.catch(()=>{});try{return await Promise.race([E,O])}finally{clearTimeout(D),w()}}function dp(e){let n=e.maxParallel??$f,i,a,o,s=e=>e?.configurable?.__pgSubagentCall??{signal:i,emit:a,logSink:o},c=(t,n,r,i)=>a=>{if(a.type===`reasoning`){i?.({type:`subagent`,taskId:t,label:n,kind:`reasoning`,name:``,delta:a.delta,toolCallId:r});return}e.tracker?.pushStep(t,{kind:a.type,name:a.name,ts:Date.now()}),i&&i({type:`subagent`,taskId:t,label:n,kind:a.type,name:a.name,args:a.type===`tool_call`?a.args:void 0,result:a.type===`tool_result`?a.result:void 0,status:a.type===`tool_result`?a.status:void 0,toolCallId:r})};return{name:`subagent`,tools:[(0,r.tool)(async({prompt:t,role:n,tools:r,writablePaths:i,model:a},o)=>{let l=s(o),u=(r??[]).filter(e=>!ap(e)),d=u.length||i?.length?{...e,...u.length?{allowedTools:u}:{},...i?.length?{writablePaths:i}:{}}:e,f=`sub-${Math.random().toString(36).slice(2,8)}`,p=n?.trim()||`子任务`,m=e=>l.logSink?.({...e,source:`子:${p}`}),h=Date.now();e.tracker?.start(f,t,p,h);try{let r=await up({prompt:t,role:n,model:a},d,l.signal,c(f,p,l.toolCallId,l.emit),m,l.emit);return e.tracker?.finish(f,`done`,r),r}catch(t){throw e.tracker?.finish(f,`error`,String(t?.message??t)),t}},{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;委派/框架类工具系统保留不可授`),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},r)=>{let i=s(r);return(await Ll(t,n,async(t,n)=>{let r=`sub-${n}-${Math.random().toString(36).slice(2,6)}`,a=t.role?.trim()||`子任务${n+1}`,o=e=>i.logSink?.({...e,source:`子:${a}`}),s=Date.now();e.tracker?.start(r,t.prompt,a,s);try{let n=await up(t,e,i.signal,c(r,a,i.toolCallId,i.emit),o,i.emit);return e.tracker?.finish(r,`done`,n??`(未完成)`),{ok:!0,text:n??`(未完成)`}}catch(t){let n=String(t?.message??t);return e.tracker?.finish(r,`error`,n),{ok:!1,error:n}}},i.signal)).map((e,t)=>e===void 0?`【子任务 ${t+1}】(未完成:已中止/未启动)`:e.ok?`【子任务 ${t+1}】✓\n${e.text}`:`【子任务 ${t+1}】✗ 失败:${e.error}`).join(`
61
61
 
62
- `)},{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),e.callConfig={...e.callConfig??{},__pgSubagentCall:{signal:e.signal??i,emit:e.emit??a,logSink:e.logSink??o}},t(e))}}var fp=/^[a-zA-Z_][a-zA-Z0-9_]*$/;function pp(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},...e.maxVerifyAttempts===void 0?{}:{maxVerifyAttempts:e.maxVerifyAttempts},...t.getFocuses?{getFocuses:t.getFocuses}:{},...t.getSchema?{getSchema:t.getSchema}:{},...t.tracker?{tracker:t.tracker}:{},...t.guardMiddleware?.length?{guardMiddleware:t.guardMiddleware}:{},...t.getVfsFiles?{getVfsFiles:t.getVfsFiles}:{},...t.enterDataScope?{enterDataScope:t.enterDataScope}:{},...t.exitDataScope?{exitDataScope:t.exitDataScope}:{},...t.onUsage?{onUsage:t.onUsage}:{},...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}}}function mp(e,n){let i,a,o,s=e=>e?.configurable?.__pgSubagentCall??{signal:i,emit:a,logSink:o},c=(e,t,n)=>r=>{if(r.type===`reasoning`){n?.({type:`subagent`,taskId:e,label:t,kind:`reasoning`,name:``,delta:r.delta});return}n&&n({type:`subagent`,taskId:e,label:t,kind:r.type,name:r.name,args:r.type===`tool_call`?r.args:void 0,result:r.type===`tool_result`?r.result:void 0,status:r.type===`tool_result`?r.status:void 0})},l=[],u=[],d;function f(e){let i=new Set,a=[],o=[];for(let l of e){if(!fp.test(l.id)){console.warn(`[subagents] id "${l.id}" 非合法工具名(须 [a-zA-Z_][a-zA-Z0-9_]*),已跳过`);continue}let e=`use_${l.id}`;if(i.has(e)){console.warn(`[subagents] id "${l.id}" 重复,已跳过`);continue}i.add(e),a.push(l),o.push((0,r.tool)(async({task:e,components:t},r)=>{let i=s(r),a=pp(l,n),o=e=>i.logSink?.({...e,source:`子:${l.id}`}),u=n.tracker,d=u?`use_${l.id}-${Math.random().toString(36).slice(2,6)}`:`use_${l.id}`,f=n.componentLock,p=d,m,h=[],g=(e,t)=>i.logSink?.({timestamp:Date.now(),type:`middleware`,data:{name:`component-lock`,kind:e,components:h,owner:p,...t}});if(f&&(h=n.resolveComponents?.({components:t,task:e})?.names??[],h.length)){let e=await f.acquire(h,p);if(!e.ok)return g(`conflict`,{heldBy:e.heldBy}),`COMPONENT_BUSY · 组件 [${h.join(`, `)}] 正在被子 agent(${e.heldBy})修改,本次委派未执行。同一组件同一时间只能有一个委派在途;请先做其他组件,或等该委派结束后(下一轮)再重试本组件。`;m=e.release,g(`acquire`)}let _=c(`use_${l.id}`,l.id,i.emit),v=u?e=>{e.type!==`reasoning`&&u.pushStep(d,{kind:e.type,name:e.name,ts:Date.now()}),_(e)}:_,y=Date.now();u?.start(d,e,l.id,y);try{let t=await up({prompt:e},a,i.signal,v,o,i.emit);return u?.finish(d,`done`,t),t}catch(e){throw u?.finish(d,`error`,String(e?.message??e)),e}finally{m&&(m(),g(`release`))}},{name:`use_${l.id}`,description:`委派给「${l.description}」子 agent 执行任务,返回其结论(过程隔离,不占主上下文)。`,schema:t.z.object({task:t.z.string().describe(`委派给该子 agent 的任务描述`),components:t.z.array(t.z.string()).optional().describe(`本次委派要修改的组件名列表(并行委派时必填,框架按组件互斥:同组件同时只允许一个委派在途)`)})}))}return{valid:a,tools:o}}let p=f(e);l=p.valid,u=p.tools;let m={set(e){let t=f(e);l=t.valid,u=t.tools,d?.()},add(e){if(l.some(t=>t.id===e.id)){console.warn(`[subagents] add: id "${e.id}" 已存在,已跳过`);return}let t=f([...l,e]);l=t.valid,u=t.tools,d?.()},remove(e){if(l.findIndex(t=>t.id===e)<0)return!1;let t=f(l.filter(t=>t.id!==e));return l=t.valid,u=t.tools,d?.(),!0},get:()=>[...l]},h={name:`subagents`,get tools(){return u},augmentPrompt:()=>l.length?[`## 可用子 agent(预声明,经专属工具委派)`,...l.map(e=>`- use_${e.id}: ${e.description}`),`复杂或专项任务(检索 / 生成 / 调研 / 多步等)优先委派子 agent:过程隔离不占主上下文 + 各子 agent 专项处理更优。需要时直接调 use_<id>({ task }) 委派,任务描述要清晰(含背景 + 用户观点/反馈,转述给子 agent);委派后信任子 agent 自主完成,不微操、不读其代码/中间细节(少占主上下文),只据其结论继续。简单任务(单字段改、直接读)用内置工具更快,不必委派。`].join(`
63
- `):void 0,wrapToolCall:async(e,t)=>(e.signal&&(i=e.signal),e.emit&&(a=e.emit),e.logSink&&(o=e.logSink),e.callConfig={...e.callConfig??{},__pgSubagentCall:{signal:e.signal??i,emit:e.emit??a,logSink:e.logSink??o}},t(e))};return Object.defineProperty(h,"controller",{value:m,enumerable:!1}),Object.defineProperty(h,"setReconfigureHook",{value:e=>{d=e},enumerable:!1}),h}function hp(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:Cp(e.adversarial.llm),tools:(e.adversarial.tools??[]).length});let n=await Dp(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 gp=new Set([`set_data`,`edit_data`,`delete_data`,`write`]),_p=/校验失败|SCHEMA_INVALID|未注册|不存在|仅支持|必须是|NOT_OBJECT|PATH_UNSAFE|VERSION_CONFLICT|WRITE_INTERCEPT/;function vp(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(!gp.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 yp(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 bp(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 xp(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=vp(e);if(!r.length)return{ok:!0};let i=yp(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&&_p.test(r))continue;let c=bp(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(`;
62
+ `)},{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),e.callConfig={...e.callConfig??{},__pgSubagentCall:{signal:e.signal??i,emit:e.emit??a,logSink:e.logSink??o,toolCallId:e.id}},t(e))}}var fp=/^[a-zA-Z_][a-zA-Z0-9_]*$/;function pp(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},...e.maxVerifyAttempts===void 0?{}:{maxVerifyAttempts:e.maxVerifyAttempts},...t.getFocuses?{getFocuses:t.getFocuses}:{},...t.getSchema?{getSchema:t.getSchema}:{},...t.tracker?{tracker:t.tracker}:{},...t.guardMiddleware?.length?{guardMiddleware:t.guardMiddleware}:{},...t.getVfsFiles?{getVfsFiles:t.getVfsFiles}:{},...t.enterDataScope?{enterDataScope:t.enterDataScope}:{},...t.exitDataScope?{exitDataScope:t.exitDataScope}:{},...t.onUsage?{onUsage:t.onUsage}:{},...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}}}function mp(e,n){let i,a,o,s=e=>e?.configurable?.__pgSubagentCall??{signal:i,emit:a,logSink:o},c=(e,t,n,r)=>i=>{if(i.type===`reasoning`){r?.({type:`subagent`,taskId:e,label:t,kind:`reasoning`,name:``,delta:i.delta,toolCallId:n});return}r&&r({type:`subagent`,taskId:e,label:t,kind:i.type,name:i.name,args:i.type===`tool_call`?i.args:void 0,result:i.type===`tool_result`?i.result:void 0,status:i.type===`tool_result`?i.status:void 0,toolCallId:n})},l=[],u=[],d;function f(e){let i=new Set,a=[],o=[];for(let l of e){if(!fp.test(l.id)){console.warn(`[subagents] id "${l.id}" 非合法工具名(须 [a-zA-Z_][a-zA-Z0-9_]*),已跳过`);continue}let e=`use_${l.id}`;if(i.has(e)){console.warn(`[subagents] id "${l.id}" 重复,已跳过`);continue}i.add(e),a.push(l),o.push((0,r.tool)(async({task:e,components:t},r)=>{let i=s(r),a=pp(l,n),o=e=>i.logSink?.({...e,source:`子:${l.id}`}),u=n.tracker,d=u?`use_${l.id}-${Math.random().toString(36).slice(2,6)}`:`use_${l.id}`,f=n.componentLock,p=d,m,h=[],g=(e,t)=>i.logSink?.({timestamp:Date.now(),type:`middleware`,data:{name:`component-lock`,kind:e,components:h,owner:p,...t}});if(f&&(h=n.resolveComponents?.({components:t,task:e})?.names??[],h.length)){let e=await f.acquire(h,p);if(!e.ok)return g(`conflict`,{heldBy:e.heldBy}),`COMPONENT_BUSY · 组件 [${h.join(`, `)}] 正在被子 agent(${e.heldBy})修改,本次委派未执行。同一组件同一时间只能有一个委派在途;请先做其他组件,或等该委派结束后(下一轮)再重试本组件。`;m=e.release,g(`acquire`)}let _=c(`use_${l.id}`,l.id,i.toolCallId,i.emit),v=u?e=>{e.type!==`reasoning`&&u.pushStep(d,{kind:e.type,name:e.name,ts:Date.now()}),_(e)}:_,y=Date.now();u?.start(d,e,l.id,y);try{let t=await up({prompt:e},a,i.signal,v,o,i.emit);return u?.finish(d,`done`,t),t}catch(e){throw u?.finish(d,`error`,String(e?.message??e)),e}finally{m&&(m(),g(`release`))}},{name:`use_${l.id}`,description:`委派给「${l.description}」子 agent 执行任务,返回其结论(过程隔离,不占主上下文)。`,schema:t.z.object({task:t.z.string().describe(`委派给该子 agent 的任务描述`),components:t.z.array(t.z.string()).optional().describe(`本次委派要修改的组件名列表(并行委派时必填,框架按组件互斥:同组件同时只允许一个委派在途)`)})}))}return{valid:a,tools:o}}let p=f(e);l=p.valid,u=p.tools;let m={set(e){let t=f(e);l=t.valid,u=t.tools,d?.()},add(e){if(l.some(t=>t.id===e.id)){console.warn(`[subagents] add: id "${e.id}" 已存在,已跳过`);return}let t=f([...l,e]);l=t.valid,u=t.tools,d?.()},remove(e){if(l.findIndex(t=>t.id===e)<0)return!1;let t=f(l.filter(t=>t.id!==e));return l=t.valid,u=t.tools,d?.(),!0},get:()=>[...l]},h={name:`subagents`,get tools(){return u},augmentPrompt:()=>l.length?[`## 可用子 agent(预声明,经专属工具委派)`,...l.map(e=>`- use_${e.id}: ${e.description}`),`复杂或专项任务(检索 / 生成 / 调研 / 多步等)优先委派子 agent:过程隔离不占主上下文 + 各子 agent 专项处理更优。需要时直接调 use_<id>({ task }) 委派,任务描述要清晰(含背景 + 用户观点/反馈,转述给子 agent);委派后信任子 agent 自主完成,不微操、不读其代码/中间细节(少占主上下文),只据其结论继续。简单任务(单字段改、直接读)用内置工具更快,不必委派。`].join(`
63
+ `):void 0,wrapToolCall:async(e,t)=>(e.signal&&(i=e.signal),e.emit&&(a=e.emit),e.logSink&&(o=e.logSink),e.callConfig={...e.callConfig??{},__pgSubagentCall:{signal:e.signal??i,emit:e.emit??a,logSink:e.logSink??o,toolCallId:e.id}},t(e))};return Object.defineProperty(h,"controller",{value:m,enumerable:!1}),Object.defineProperty(h,"setReconfigureHook",{value:e=>{d=e},enumerable:!1}),h}function hp(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:Cp(e.adversarial.llm),tools:(e.adversarial.tools??[]).length});let n=await Dp(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 gp=new Set([`set_data`,`edit_data`,`delete_data`,`write`]),_p=/校验失败|SCHEMA_INVALID|未注册|不存在|仅支持|必须是|NOT_OBJECT|PATH_UNSAFE|VERSION_CONFLICT|WRITE_INTERCEPT/;function vp(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(!gp.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 yp(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 bp(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 xp(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=vp(e);if(!r.length)return{ok:!0};let i=yp(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&&_p.test(r))continue;let c=bp(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(`;
64
64
  `)}:{ok:!0}}}function Sp(e){return!!e&&typeof e==`object`&&typeof e.invoke==`function`&&typeof e.stream==`function`}function Cp(e){return Sp(e)?e.model??e.modelName??`<实例>`:e.model??`<配置>`}var wp=/无问题|没有问题|未发现问题|没有发现|没问题|未发现/;function Tp(e){return wp.test(e)}function Ep(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 Dp(e,t,n,r){let{lastUser:i,lastReply:a}=Ep(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(`
65
65
  `),c=`你是严格的对抗式审查者,只找问题不赞美。目标是反驳,不是改进。`,l=n?e=>n(e.type,{...e.data,source:`adversarial`}):void 0,u=await Eu(Sp(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`}),Tp(u)?null:u.trim()}var Op=[{prefix:`## 可操作数据`,key:`dataHint`},{prefix:`## 能力使用提示`,key:`usageHints`},{prefix:`## 当前主线目标`,key:`mission`},{prefix:`## 工作记忆`,key:`workingMemory`},{prefix:`【更早对话摘要`,key:`memory`},{prefix:`【对话历史摘要】`,key:`summary`},{prefix:`【与当前问题可能相关的早期对话】`,key:`recall`}],kp=[{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 Ap(){let e={};for(let t of kp)e[t.key]={key:t.key,label:t.label,tokens:0,pct:0,msgCount:0};return e}function jp(e,t){e.tokens+=t,e.msgCount+=1}function Mp(e){let t=e.content;return typeof t==`string`?t:JSON.stringify(t??``)}function Np(e,t){let n=[];for(let t of Op){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&&jp(t.systemPrompt,Hl(n));return}if(n[0].idx>0){let r=e.slice(0,n[0].idx).trim();r&&jp(t.systemPrompt,Hl(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&&jp(t[n[r].key],Hl(o))}}function Pp(e,t={}){let n=Ap(),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)Np(Mp(a),n);else if(a instanceof i.HumanMessage)jp(n[t===r?`current`:`history`],Hl(Mp(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(` `);jp(n.toolResults,Hl(t))}else jp(n.assistant,Hl(Mp(a)))}else a instanceof i.ToolMessage?jp(n.toolResults,Hl(Mp(a))):jp(n.other,Hl(Mp(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 Fp(e={}){let t,n=e.contextWindow;return{name:`context-inspector`,async wrapModelCall(r,i){return t=Pp(r.messages,{contextWindow:n,thresholdRatio:e.thresholdRatio}),i(r)},getSnapshot:()=>t,setContextWindow:e=>{n=e}}}function Ip(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(`
66
66
  `);return e?.isError?`工具错误:${n}`:n}async function Lp(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)}async function Rp(e,t,n){let r;try{return await Promise.race([e,new Promise((e,i)=>{r=setTimeout(()=>i(Error(`MCP 工具 ${t} 调用超时(${n}ms)`)),n)})])}finally{clearTimeout(r)}}function zp(e,t,n){return(0,r.tool)(async r=>Ip(await Rp(t.callTool({name:e.name,arguments:r}),e.name,n)),{name:e.name,description:e.description??`MCP tool: ${e.name}`,schema:e.inputSchema})}async function Bp(e){let{Client:t}=await import(`@modelcontextprotocol/sdk/client`),n=await Lp(e),r=new t({name:`page-agent-sdk`,version:`1.0`},{capabilities:{}}),i=e.timeoutMs??15e3,a;try{await Promise.race([r.connect(n),new Promise((t,n)=>{a=setTimeout(()=>n(Error(`MCP 握手超时(${i}ms):${e.url}`)),i)})])}catch(e){try{await n.close?.()}catch{}throw e}finally{clearTimeout(a)}let{tools:o}=await r.listTools();return{tools:o.map(t=>zp(t,r,e.callTimeoutMs??6e4)),close:()=>r.close()}}var Vp=[`你是一个 JSON 操作助手。集成方声明了一个主数据对象(含 zod schema 校验),你通过专用工具安全地读写它来完成任务。`,`所有写操作都经范围控制(仅 schema 声明字段内)与 schema 校验(不合法会返回结构化错误而非写入),并自动留快照可回退。`,`大对象/数组优先用增量 patch(只发改动)而非整体重传,避免输出被截断。`,`---`,Qu.reliableWriteRules].join(`
@@ -193,7 +193,7 @@ ${`- 输出形态:完整、自包含的 HTML 页面(.${r},可独立成页)`}
193
193
  `+e.map(e=>`#${e.id} [${e.label??`auto`}] 消息数=${e.messageCount} 时间=${new Date(e.timestamp).toLocaleTimeString()}`).join(`
194
194
  `):`无可用 checkpoint。`},{name:`list_checkpoints`,description:`列出可用会话 checkpoint(回退点)。`,schema:t.z.object({}).optional()})]:[];ye.forEach(e=>de.set(e.name,`builtin`));let be=R.focus,xe=(0,r.tool)(async({path:e,label:t})=>{let n=ue()?.schema;return n?Au(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(`人类可读标签,如「导航栏」`)})}),Se=(0,r.tool)(async()=>(w.clearFocus(),`已清除聚焦,恢复全量可操作范围(可读写所有组件)。`),{name:`clear_focus`,description:`清除当前聚焦,退出精修模式,恢复对全部组件的读写权限。`,schema:t.z.object({}).optional()}),Ce=(0,r.tool)(async({path:e,label:t})=>{let n=ue()?.schema;if(!n)return`聚焦失败:当前无主数据 schema,无法聚焦。`;if(!Au(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(`人类可读标签`)})}),we=(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`)})}),Te=be&&e.toolMode===`advanced`?[xe,Se,Ce,we]:[];Te.forEach(e=>de.set(e.name,`builtin`));let Ee=[],De=new Map,Oe=ke();function ke(){let{tools:e,collisions:t}=Gg([{label:`builtin`,tools:fe},{label:`user`,tools:pe},{label:`action`,tools:me},{label:`humanConfirm`,tools:ve?[ve]:[]},{label:`checkpoint`,tools:ye},{label:`focus`,tools:Te},{label:`mcp`,tools:he},{label:`skill`,tools:Ee}]);return t.length&&console.warn(`[page-agent-sdk] 工具重名,后注册覆盖先注册:`,t.map(e=>`${e.name}(${e.loser}→${e.winner})`).join(`, `)),e}let H=R.planning,Ae=R.missionAnchor,je=R.workingMemory,Me=R.skills,Ne=R.vfs||te;if(Ne)for(let e of tm)de.set(e,`builtin`);if(H)for(let e of S.tools??[])de.set(e.name,`builtin`);let Pe=R.summarization,Fe=R.agentCompression&&!!d;e.debug&&R.agentCompression&&!d&&console.warn(`[page-agent-sdk][agentCompression] agentCompression 开启但 summaryLlm 不可用(或缺 apiKey / 模型不支持工具),压缩决策不启用,回退静态压缩`);let Ie=R.memory,Le=R.subagent,Re=Le?Yf():void 0,ze=e.verify?.maxAttempts??2,Be=!!(e.verify?.check||e.verify?.maxAttempts||e.verify?.adversarial),Ve=e.capabilities?.verify===!1,U=(R.verify||Be&&!Ve)&&e.verify?.enabled!==!1&&ze>0,He=R.contextInspector;Be&&!U&&e.verify?.enabled!==!1&&console.warn(`[page-agent-sdk][verify] 检测到 verify 配置(check/maxAttempts/adversarial)但未装载(capabilities.verify:false 显式关闭 或 maxAttempts≤0)`);let Ue=e.subagent,We=Ue?.allowedTools??[],Ge=e.permissions?.length?pf(e.permissions):void 0,Ke=e.approval&&(e.approval.tools!==void 0||e.approval.confirm)?mf(e.approval):void 0,qe=[...Ge?[Ge]:[],...Ke?[Ke]:[]],Je=!Le||Ue?.enabled===!1?void 0:dp({llm:Ue?.llm??e.llm,allTools:()=>W.agent?.allTools??Oe,allowedTools:We.length?We:void 0,systemPrompt:Ue?.systemPrompt,temperature:Ue?.temperature,maxTokens:Ue?.maxTokens,skills:Ue?.skills,maxDepth:Ue?.maxDepth,maxParallel:Ue?.maxParallel,debug:e.debug,getFocuses:()=>w.getFocuses(),getSchema:()=>ue()?.schema??null,tracker:Re,guardMiddleware:qe.length?qe:void 0,getVfsFiles:Ne?()=>x.files:void 0,enterDataScope:V?.enterScope?e=>V.enterScope(e):void 0,exitDataScope:V?.exitScope?e=>V.exitScope(e):void 0,onUsage:e=>{i.prompt_tokens=(i.prompt_tokens??0)+(e.prompt_tokens??0),i.completion_tokens=(i.completion_tokens??0)+(e.completion_tokens??0),i.total_tokens=(i.total_tokens??0)+(e.total_tokens??0)},timeoutMs:Ue?.timeoutMs}),Ye=N?.map(e=>{if(!e._codeAsset)return e;let t=e._codeAsset,n=ym({writablePaths:t.writablePaths,codeVfsPrefix:t.codeVfsPrefix,ext:t.ext,codeField:t.codeField,craftNotes:t.craftNotes,onWarning:e=>console.warn(`[page-agent-sdk][code-asset] ${e}`),getController:()=>V,vfsStore:x}),r=[...e.middleware??[],n];for(let e of r)e&&typeof e==`object`&&typeof e._setGetController==`function`&&e._setGetController(()=>V);return{...e,middleware:r}}),Xe=te&&Le?bm():void 0,Ze=Xe?Em({getBind:()=>ue()?.bind,writablePaths:P,getLocked:()=>Xe.locked(),tools:Oe}):void 0,Qe=Le&&Ye!==void 0?mp(Ye,{llm:e.llm,allTools:()=>W.agent?.allTools??Oe,debug:e.debug,getFocuses:()=>w.getFocuses(),getSchema:()=>ue()?.schema??null,getBind:()=>ue()?.bind,tracker:Re,guardMiddleware:qe.length?qe:void 0,getVfsFiles:Ne?()=>x.files:void 0,enterDataScope:V?.enterScope?e=>V.enterScope(e):void 0,exitDataScope:V?.exitScope?e=>V.exitScope(e):void 0,onUsage:e=>{i.prompt_tokens=(i.prompt_tokens??0)+(e.prompt_tokens??0),i.completion_tokens=(i.completion_tokens??0)+(e.completion_tokens??0),i.total_tokens=(i.total_tokens??0)+(e.total_tokens??0)},timeoutMs:e.subagent?.timeoutMs,...Xe?{componentLock:Xe,resolveComponents:e=>xm(e,hm(ue()?.bind,P))}:{}}):void 0,$e=Qe?Qe.controller:null,et=[`get_data`,`describe_data`,`read`,`fetch_document`],tt=Oe.filter(e=>et.includes(e.name)),nt=U?hp({check:e.verify.check??xp({schemas:()=>ue()?{"":ue().schema}:{},root:()=>ue()?.bind}),adversarial:e.verify?.adversarial?{llm:e.llm,tools:tt}:void 0}):void 0,rt=He?Fp({contextWindow:f.contextWindow,thresholdRatio:kh(e,f.contextWindow).summaryThresholdRatio}):void 0,it=qg({...R,humanConfirm:_e,subagents:N?.map(e=>({id:e.id,description:e.description,temperature:e.temperature}))},ie&&!!O,e.toolMode,!!O?.resources?.length,{promptSoftCap:Wf(f.contextWindow,p.promptSoftCapTokens)}),at=O?{name:`dataHint`,augmentPrompt:()=>Up(ue(),e.schemaHint)||void 0}:null,ot=e.augmentSystem?{name:`augmentSystem`,augmentPrompt:t=>{try{return e.augmentSystem({state:t,data:ue()})}catch(t){e.debug&&console.log(`[page-agent-sdk][augmentSystem] 回调抛错,降级跳过:`,t.message);return}}}:null,st=Eh(e.onEvent),ct=st.emit,lt,ut=[],dt=e=>({name:e.name,description:e.description,content:typeof e.getContent==`function`?e.getContent():``}),ft=e=>({name:e.name,description:e.description,getContent:()=>e.content}),pt=e.skillStorage===!1?null:$g({...typeof e.skillStorage==`object`?e.skillStorage:{},id:e.skillStorage&&typeof e.skillStorage==`object`&&e.skillStorage.id?e.skillStorage.id:`agent::${n}`}),mt=R.preferences,ht=mt&&e.preferenceStorage!==!1?s_({...typeof e.preferenceStorage==`object`?e.preferenceStorage:{},id:e.preferenceStorage&&typeof e.preferenceStorage==`object`&&e.preferenceStorage.id?e.preferenceStorage.id:`agent::${n}`}):null,gt=ht?v_({store:ht,llmInvoke:l,getSessionId:()=>W.sessionId,onDebug:e=>{let t=W.agent?.debugLogs;t&&(t.value.push({timestamp:Date.now(),type:`middleware`,data:e}),Tn(t))}}):null,_t=()=>{let t=lt?lt.controller:null;if(t){let n=(e.skills||[]).filter(e=>!ut.some(t=>t.name===e.name));t.set([...n,...ut])}W.infoTick.value++},vt=async()=>{if(pt)try{let t=await pt.list();if(t.length){ut=t.map(ft);let n=lt?lt.controller:null;if(n){let t=(e.skills||[]).filter(e=>!ut.some(t=>t.name===e.name));n.set([...t,...ut])}W.infoTick.value++}}catch{}},yt=Pe?Jf({...p,llmInvoke:l,getRegisteredData:()=>ue()?[{description:ue().description??`主数据对象`}]:[],preserveLastToolResults:h,...Fe?{decideInvoke:d,getSnapshot:()=>rt?.getSnapshot()}:{}}):void 0,bt=jh([...at?[at]:[],it,...Ae?[C]:[],...gt?[gt]:[],...H?[S]:[],...Me?[lt=of(e.skills||[],{readVfs:Ne?e=>x.files[e]?.content:void 0,hostScriptEnabled:R.skillHostScript,onToolsReady:(e,t)=>{for(let n of t){let t=Ee.findIndex(e=>e.name===n.name);t>=0&&Ee.splice(t,1),Ee.push(n),De.set(n.name,e),de.set(n.name,`skill:${e}`)}Oe=ke(),W.agent&&W.agent.setTools(Oe),W.infoTick.value++}})]:[],...Ne?[rm(x)]:[],...yt?[yt]:[],...je?[T]:[],...be?[w]:[],...le?[le]:[],...Ie?[E]:[],...Ge?[Ge]:[],...re&&L&&I?[Ef(I)]:[],..._e?[vf()]:[],...Ke?[Ke]:[],...nt?[nt]:[],...Je?[Je]:[],...Qe?[Qe]:[],...Ze?[Ze]:[],...ot?[ot]:[],...rt?[rt]:[],...e.middleware||[],...oe?[Lg(i,{tokenBudget:e.tokenBudget,timeBudgetMs:e.timeBudgetMs},ct)]:[],D_(ct,v,ue,i)]),xt=e.maxMemoryRounds??C_,St=e.approval?.timeoutMs,Ct=St===void 0||St===0?3e4:!Number.isFinite(St)||St<0?0:St;function wt(e){if(Ct)return t=>{if(t.type!==`approval_request`)return;let n=Date.now(),r=t.toolName;setTimeout(()=>{e?.aborted||(t.resolve(!1),ct({type:`error`,message:`确认请求(${r})${Math.round((Date.now()-n)/1e3)}s 无响应已自动拒绝 —— send/batch 路径无 UI 响应方;可传 approval.timeoutMs 调整(Infinity = 无限等)`,severity:`observable`,code:`APPROVAL_AUTO_REJECTED`,context:{toolName:r,waitedMs:Date.now()-n}}))},Ct)}}function Tt(e){let t=wt(e);return e=>{t?.(e),e.type===`error`&&ct(e)}}let Et=xn([]);async function Dt(){if(s)try{Et.value=(await s.listSessions(n)).sort((e,t)=>t.lastAccessed-e.lastAccessed)}catch(t){e.debug&&console.warn(`[page-agent-sdk][persist] refreshSessions 失败(已吞):`,t)}}let Ot=S_(),kt=new Set;function At(e){let t=new AbortController,n=()=>t.abort();return e&&(e.aborted?t.abort():e.addEventListener(`abort`,n,{once:!0})),kt.add(t),{controller:t,untrack:()=>{kt.delete(t),e?.removeEventListener(`abort`,n)}}}function jt(){for(let e of kt)e.abort();kt.clear()}let W={agentId:n,store:s,messages:v,vfsStore:x,listeners:st.listeners,todosMw:S,memoryMw:E,missionMw:C,workingMemoryMw:T,focusMw:w,agent:null,initDone:Promise.resolve(),sessionId:``,refCount:0,mcpClosers:[],mcpServers:[],checkpoint:I,dataOpsController:V,skillsController:lt?lt.controller:null,infoTick:o,pendingConflict:a.pendingConflict,sessions:Et,refreshSessions:Dt,liveData:ue,usage:i,emit:ct,runSerial:Ot,trackActive:At,abortAllActive:jt,unloadSkillTools(e){if(e){let t=Ee.length;if(Ee=Ee.filter(t=>De.get(t.name)===e?(de.delete(t.name),De.delete(t.name),!1):!0),Ee.length===t)return}else{if(!Ee.length)return;for(let e of Ee)de.delete(e.name),De.delete(e.name);Ee=[]}Oe=ke(),W.agent&&W.agent.setTools(Oe)},applySnapshot(t){if(t.messages?.length&&v.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&&I&&I.importStack(t.checkpoints),t.usage&&Object.assign(i,t.usage),t.mission&&Ae&&C.setMission(t.mission),t.workingMemory&&je&&T.restore(t.workingMemory),be){let n=t.focus,r=n?Array.isArray(n)?n:[n]:[];if(r.length){let t=ue()?.schema,n=t?r.filter(e=>Au(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)}}}Ft()},addSkill(e){let t=ut.findIndex(t=>t.name===e.name);t>=0?ut[t]=e:ut.push(e),_t(),pt&&pt.put(dt(e))},removeSkill(e){let t=ut.findIndex(t=>t.name===e);return t<0?!1:(ut.splice(t,1),_t(),pt&&pt.remove(e),!0)},listUserSkills(){return ut.map(e=>e.name)},getUserSkill(e){let t=ut.find(t=>t.name===e);if(t)return{name:t.name,description:t.description,content:typeof t.getContent==`function`?t.getContent():``}},afterRound(){It(),Ht()},async send(e,t){if(await W.initDone,W.refCount<=0)throw Error(`page-agent-sdk: agent 已释放(unmount),拒绝排队中的 send`);t??={},t?.mission&&Ae&&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=oe?t.maxAutoRetries??1:0,i=0,a=!1,o=Tt(t.signal),c=W.sessionId;for(;;){a||=(v.push({role:`user`,content:n,timestamp:Date.now()}),!0);try{let e=await W.agent.invoke(v,t.signal,o);if(t.signal?.aborted||W.sessionId!==c||W.refCount<=0)return W.agent?.debugLogs?.value?.push({timestamp:Date.now(),type:`middleware`,data:{stage:`orphan_round_dropped`,fromSession:c,aborted:!!t.signal?.aborted,sessionChanged:W.sessionId!==c}}),e;if(t.interceptors?.output)try{let n=t.interceptors.output(e);typeof n==`string`&&(e=n)}catch{}return v.push({role:`assistant`,content:e,timestamp:Date.now()}),W.afterRound(),s&&await s.flush(),e}catch(e){if(ql(e,t.signal))throw e;let n=Ml(e,`fatal`);if(i<r&&I?.canRestore()){i+=1,I.restore(),a=!0,ct({type:`error`,message:`致命错误自动恢复(${i}/${r}):${n.message},已回退 checkpoint 重试`,severity:`observable`,code:`AUTO_RECOVER_RETRY`,context:{attempt:i,cause:n.code??n.message.slice(0,120)}});continue}throw ct({type:`error`,message:n.message,severity:n.severity,...n.code?{code:n.code}:{},...n.context===void 0?{}:{context:n.context}}),e}}},async batch(e,t,n){if(await W.initDone,!e.length)return[];if(W.refCount<=0)throw Error(`page-agent-sdk: agent 已释放(unmount),拒绝排队中的 batch`);let r=[],i=Tt(n);for(let a=0;a<e.length;a++){if(n?.aborted){for(let t=a;t<e.length;t++)r.push({index:t,task:e[t],error:`aborted(外部中止)`,ok:!1});break}let o=e[a];I&&I.save(`batch:${a}`);let c=v.length;try{v.push({role:`user`,content:o,timestamp:Date.now()});let c=await W.agent.invoke(v,n,i);v.push({role:`assistant`,content:c,timestamp:Date.now()}),W.afterRound(),s&&await s.flush(),r.push({index:a,task:o,reply:c,ok:!0}),t?.({done:a+1,total:e.length,task:o,ok:!0})}catch(i){if(v.length>c&&v.splice(c),ql(i,n)){r.push({index:a,task:o,error:`aborted(外部中止)`,ok:!1});for(let t=a+1;t<e.length;t++)r.push({index:t,task:e[t],error:`aborted(外部中止)`,ok:!1});break}let s=Ml(i,`fatal`);ct({type:`error`,message:`批量任务 ${a+1}/${e.length} 失败:${s.message}`,severity:`observable`,code:`BATCH_TASK_FAILED`,context:{index:a,task:o.slice(0,100)}}),r.push({index:a,task:o,error:s.message,ok:!1}),t?.({done:a+1,total:e.length,task:o,ok:!1})}}return r},async switchSession(t){if(await W.initDone,!s)throw Error(`page-agent-sdk: storage 未开启,无法切换会话(请传 storage 选项)`);if(a.resolve(`keep_external`),W.sessionId&&s){if(Ae){let e=C.getMission();e&&Bt({mission:e})}if(je){let e=T.getWorkingMemory();e&&Bt({workingMemory:e})}if(be){let e=w.getFocuses();Bt({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,v.splice(0,v.length),x.clear?.(),S.reset([]),e.memory||E.reset(``),C.reset(),T.reset(),w.reset(),gt?.resetScanCursor(),I&&I.importStack([]),W.agent.debugLogs.value=[],i||=await s.load(n,r),i&&(W.applySnapshot(i),ct({type:`session_restored`,sessionId:r,rounds:i.messages?.length??0})),e.memory&&Bt({memory:E.get()||(typeof e.memory==`string`?e.memory:``)}),Dt(),Lt=void 0,Rt=!1,W.infoTick.value++,r},resetSession:()=>{jt(),a.resolve(`keep_external`),W.sessionId=Zm(),v.splice(0,v.length),x.clear?.(),S.reset([]),e.memory||E.reset(``),C.reset(),T.reset(),w.reset(),gt?.resetScanCursor(),I&&I.importStack([]),W.agent&&(W.agent.debugLogs.value=[]),s&&s.createSession(W.agentId,e.session?.title,W.sessionId).catch(t=>{e.debug&&console.warn(`[page-agent-sdk][persist] createSession 失败(已吞):`,t)}),ct({type:`session_restored`,sessionId:W.sessionId,rounds:0}),W.infoTick.value++,Dt(),Lt=void 0,Rt=!1},stream:(e,t,n)=>{if(!W.agent)throw Error(`page-agent-sdk: agent 尚未初始化完成,请先 await mount()`);x?.setProtectedRefs?.(b_(e));let r=e=>{t?.(e),ct(e),e.type===`subagent`&&(e.kind===`tool_call`||e.kind===`tool_result`)&&W.infoTick.value++};if(n){let e=()=>a.resolve(`keep_external`);n.aborted?e():n.addEventListener(`abort`,e,{once:!0})}let{controller:i,untrack:o}=At(n);return W.agent.stream(e,r,i.signal).finally(o)},release(){if(W.refCount--,W.refCount<=0){jt(),ge=!0,s&&(x.flush?.(),s.flush(),s.dispose()),pt&&pt.dispose();let e=W.mcpClosers.splice(0);e.length&&Promise.allSettled(e.map(e=>e())),w_.delete(n)}},resolveConflict:a.resolve,setTools(e){pe.length=0,e.forEach(e=>{pe.push(e),de.set(e.name,`user`)}),Oe=ke(),W.agent&&W.agent.setTools(Oe),W.infoTick.value++},addTool(e){Oe.some(t=>t.name===e.name)&&console.warn(`[page-agent-sdk] 工具 "${e.name}" 已存在,新工具覆盖(后注册覆盖先注册)`);for(let t=pe.length-1;t>=0;t--)pe[t].name===e.name&&pe.splice(t,1);pe.push(e),de.set(e.name,`user`),Oe=ke(),W.agent&&W.agent.setTools(Oe),W.infoTick.value++},removeTool(e){let t=pe.findIndex(t=>t.name===e);return t<0?!1:(pe.splice(t,1),de.delete(e),Oe=ke(),W.agent&&W.agent.setTools(Oe),W.infoTick.value++,!0)},setLlm(t){let n;if(Bm(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=y(e)}typeof n.bindTools!=`function`&&e.debug&&console.warn(`[page-agent-sdk][setLlm] 新模型不支持 bindTools(tool calling 会失效)`),_=t;let r=Bm(t)?void 0:t;if(f=Vl({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} 小于最小支持 ${Bl}(需 ≥200K 窗口模型)`);W.agent&&(W.agent.setLlm(n),W.agent.setModelCaps?.(f)),yt?.setContextWindow?.(f.contextWindow),rt?.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(!$e){e.debug&&console.warn(`[page-agent-sdk][setSubagents] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略`);return}$e.set(t),W.infoTick.value++},addSubagent(t){if(!$e){e.debug&&console.warn(`[page-agent-sdk][addSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略`);return}$e.add(t),W.infoTick.value++},removeSubagent(t){if(!$e)return e.debug&&console.warn(`[page-agent-sdk][removeSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略`),!1;let n=$e.remove(t);return n&&W.infoTick.value++,n},getActiveSubagents(){return Re?.getActive()??[]},get subagentHistory(){return Re?.getHistory()??[]},getInfo(){return{id:n,sessionId:W.sessionId,model:Bm(_)?_.model??_.modelName:_.model,systemPrompt:W.agent?.getEffectiveSystemPrompt?.()??B+Up(ue(),e.schemaHint),tools:(W.agent?.allTools??Oe).map(e=>({name:e.name,description:e.description,schema:e.schema,source:de.get(e.name)||`user`})),skills:(lt?lt.controller.get():e.skills??[]).map(e=>({name:e.name,description:e.description})),data:ue()?{description:ue().description,schema:ue().schema}:void 0,contextPreset:e.contextPreset??`auto`,compression:{contextWindow:f.contextWindow,summaryThresholdRatio:p.summaryThresholdRatio??.5,promptSoftCap:Wf(f.contextWindow,p.promptSoftCapTokens)},memory:E.get(),middleware:bt.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:Ae?C.getMission():void 0,preferences:mt&&gt?gt.getPreferences():void 0,workingMemory:je?T.getWorkingMemory():void 0,focus:be?w.getFocus():void 0,focuses:be?w.getFocuses():[],trace:ae&&W.agent?.spans?{spans:W.agent.spans.value,metrics:Gl(W.agent.spans.value)}:void 0,actions:Bg(e.actions??{}),subagent:{enabled:!!Je,maxDepth:e.subagent?.maxDepth??1,maxParallel:e.subagent?.maxParallel??4,allowedTools:e.subagent?.allowedTools??[],subagents:$e?.get()??[],active:Re?.getActive()??[],history:Re?.getHistory()??[],lockedComponents:Xe?.locked()??{}},verify:{enabled:!!nt,maxAttempts:U?ze:0,adversarial:U&&!!e.verify?.adversarial},context:(()=>{let e=rt?.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:I?{enabled:!0,auto:L,list:I.list()}:void 0}},getMission(){return Ae?C.getMission():void 0},setMission(t){if(!Ae){e.debug&&console.warn(`[page-agent-sdk][mission] capabilities.missionAnchor 关闭,setMission 忽略`);return}C.setMission(t),W.infoTick.value++},getPreferences(){return gt?gt.getPreferences():[]},async removePreference(e){if(!gt)return!1;let t=await gt.removePreference(e);return t&&W.infoTick.value++,t},async clearPreferences(){gt&&(await gt.clearPreferences(),W.infoTick.value++)},getFocus(){return be?w.getFocus():void 0},getFocuses(){return be?w.getFocuses():[]},setFocus(t){let n=O_(t,`setFocus`,be,()=>ue()?.schema,e.debug);return n.ok?(w.setFocus(t),W.infoTick.value++,{ok:!0}):n},addFocus(t){let n=O_(t,`addFocus`,be,()=>ue()?.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){be&&(w.removeFocus(e),W.infoTick.value++)},clearFocus(){be&&(w.clearFocus(),W.infoTick.value++)}};async function Mt(){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),ct({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),ct({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&&Bt({memory:E.get()||(typeof e.memory==`string`?e.memory:``)}),Dt()}async function Nt(){await vt()}function Pt(e){let t={};for(let n of b_(e)){let e=x.files[n];e&&(t[n]=e.content)}return t}function Ft(){let e=x_(x.files,b_(v));for(let t of e)delete x.files[t]}function It(){let e=Ff(v,xt);if(!e.trimmed)return;let{older:t,summary:n}=e;if(ct({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:Pt(t.flatMap(e=>[e.userMsg,...e.assistantMsgs])),summary:n.content,reason:`max_memory_rounds`}),v.splice(e.deleteFrom,e.deleteCount,n),Ft(),m&&l){let n=e.summary,{prevSeg:r}=e;(async()=>{try{let e=await l(Bf(t,g)),i=v.indexOf(n);if(i<0)return;v[i].content=Pf(t,r,e),Ht()}catch{}})()}}let Lt,Rt=!1;function zt(t,n){e.debug&&console.warn(`[page-agent-sdk][persist] ${t} 失败(已吞):`,n);let r=W.agent?.debugLogs;r&&r.value.push({timestamp:Date.now(),type:`middleware`,data:{stage:`persist_save_failed`,kind:t,error:String(n).slice(0,160)}})}function Bt(e){!W.sessionId||!s||s.save(n,W.sessionId,e).catch(e=>zt(`save`,e))}function Vt(e,t){s&&s.updateTitle(n,e,t).catch(e=>zt(`updateTitle`,e))}function Ht(){if(!W.sessionId||!s)return;if(Bt({messages:JSON.parse(JSON.stringify(v))}),Bt({todos:W.agent?.getState?.()?.todos??[]}),Ae){let e=C.getMission();e&&Bt({mission:e})}if(je){let e=T.getWorkingMemory();e&&Bt({workingMemory:e})}if(be){let e=w.getFocuses();Bt({focus:e.length?e:null})}oe&&I&&(Bt({checkpoints:I.exportStack()}),Bt({usage:i}));let t=zm(v);if(t&&t!==Lt&&(Lt=t,Vt(W.sessionId,t)),e.autoTitle!==!1&&u&&!Rt&&v.some(e=>e.role===`user`)&&v.some(e=>e.role===`assistant`)){Rt=!0;let e=W.sessionId;(async()=>{try{let t=await u(v);if(t&&W.refCount>0&&W.sessionId===e){try{await s.updateTitle(n,e,t)}catch(e){zt(`updateTitle`,e)}await Dt()}}catch{}})()}e.debug&&console.log(`[page-agent-sdk][persist] save`,W.sessionId,`${v.length} msgs`)}return W.initDone=(async()=>{await Mt(),await Nt(),gt&&await gt.preload(),e.mcp?.length&&(async()=>{let t=await Promise.allSettled(e.mcp.map(e=>Bp(e))),n=t.flatMap(e=>e.status===`fulfilled`?[e.value.close]:[]);if(ge){Promise.allSettled(n.map(e=>e()));return}W.mcpClosers=n,W.mcpServers=[];let r=new Set;for(let e of Oe){let t=de.get(e.name);t&&!t.startsWith(`mcp:`)&&r.add(e.name)}t.forEach((t,n)=>{let i=e.mcp[n],a=i.name??i.url;t.status===`fulfilled`?(W.mcpServers.push({name:a,url:i.url,toolCount:t.value.tools.length}),t.value.tools.forEach(e=>{if(r.has(e.name)){console.warn(`[page-agent-sdk][mcp] 工具 "${e.name}" 与内置工具重名,已拒绝注入(安全保留字保护)`);return}de.set(e.name,`mcp:${a}`),he.push(e)})):console.warn(`[page-agent-sdk][mcp] server ${a} 连接失败:`,t.reason)}),he.length&&(Oe=ke(),W.agent&&W.agent.setTools(Oe),W.infoTick.value++),e.debug&&console.log(`[page-agent-sdk][mcp] 注入 ${he.length} 个工具,${W.mcpServers.length} 个 server`)})();let t=Bm(e.llm)?e.llm:await b(e.llm);W.agent=Eu({llm:t,systemPrompt:B,tools:Oe,middleware:bt,maxToolRounds:e.maxToolRounds,maxRetries:e.maxRetries,stallMs:e.streamStallMs??9e4,maxParallelTools:e.maxParallelTools,contextWindow:f.contextWindow,maxOutputTokens:f.maxOutputTokens,maxVerifyAttempts:U?ze:0,roundTokenBudget:e.roundTokenBudget??0,onLlmChange:e=>{_=e},onTrace:ae?(e,t)=>{try{ct({type:`trace`,spans:e,metrics:t})}catch{}}:void 0,debug:e.debug}),D.current=W.agent,Qe&&Qe.setReconfigureHook&&Qe.setReconfigureHook(()=>{W.agent&&W.agent.setTools(ke())})})(),W}function A_(e,t){let n=e.id??Zm();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?w_.get(n):void 0;o?a=o:(a=k_(e,n),e.shareContext&&w_.set(n,a)),a.refCount++;let s=null,c=Ch(e),l=null,u=null;async function d(n){if(await a.initDone,s){s.show();return}let o=n===void 0?e.container:n,d=()=>{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 主包`),d();return}let m=typeof o==`string`?document.querySelector(o):o;if(!m)throw Error(`createChatSdk: 挂载点未找到(${o})`);s=t({el:m,core:a,dialogCfg:c,i18n:e.i18n,streaming:r,runSerial:a.runSerial,hide:p,unmount:f,onDialogUnmounted:()=>{s=null,a.release()}}),c.drawer===!0&&c.drawerHidden===!0&&s.hide(),d()}function f(){a.abortAllActive(),a.resolveConflict(`keep_external`),l&&typeof window<`u`&&window.removeEventListener(`pagehide`,l),u&&typeof document<`u`&&document.removeEventListener(`visibilitychange`,u),l=null,u=null,s?s.unmount():a.release()}function p(){s?.hide()}function m(){s?.show()}return{mount:d,unmount:f,hide:p,show:m,send:(e,t)=>a.runSerial(async()=>{let{controller:n,untrack:r}=a.trackActive(t?.signal);try{return await a.send(e,{...t,signal:n.signal})}finally{r()}}),batch:(e,t,n)=>a.runSerial(async()=>{let{controller:r,untrack:i}=a.trackActive(n);try{return await a.batch(e,t,r.signal)}finally{i()}}),switchSession:(...e)=>a.runSerial(async()=>(a.abortAllActive(),a.switchSession(...e))),resetSession:()=>a.resetSession(),sessions:a.sessions,async listSessions(){return a.store?a.store.listSessions(n):[]},async deleteSession(e){if(a.store){if(e===a.sessionId){console.warn(`[page-agent-sdk] deleteSession 忽略:不能删除当前会话,请先 switchSession 切到其他会话`);return}await a.store.deleteSession(n,e),await a.refreshSessions()}},get sessionId(){return a.sessionId},stream:(e,t,n)=>a.stream(e,t,n),afterRound:a.afterRound,get debugLogs(){return a.agent.debugLogs},infoTick:a.infoTick,inspect:a.getInfo,inspectContext:()=>a.getInfo().context,getMission:a.getMission,setMission:a.setMission,getPreferences:a.getPreferences,removePreference:a.removePreference,clearPreferences:a.clearPreferences,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 Sf(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[Qp(e)]={content:n,updatedAt:Date.now()}},vfsRead:e=>a.vfsStore.files[Qp(e)]?.content,createResource:(e,t)=>{let n=a.dataOpsController;if(!n?.createResource)throw Error(`[page-agent-sdk] createResource 不可用:需配 data.resources + vfsStore(capabilities.vfs 默认开)`);return n.createResource(e,t)},getResource:e=>a.dataOpsController?.getResource?.(e),updateResource:(e,t)=>{let n=a.dataOpsController;if(!n?.updateResource)throw Error(`[page-agent-sdk] updateResource 不可用:需配 data.resources + vfsStore`);n.updateResource(e,t)},deleteResource:e=>a.dataOpsController?.deleteResource?.(e)??!1,listResources:()=>a.dataOpsController?.listResources?.()??[],releaseResources:e=>{let t=a.dataOpsController;if(!(!t?.listResources||!t.deleteResource))if(e&&e.length)for(let n of e)t.deleteResource(n);else for(let e of t.listResources())t.deleteResource(e.path)},usage:a.usage,pendingConflict:a.pendingConflict,resolveConflict:e=>a.resolveConflict(e),setTools:e=>a.setTools(e),addTool:e=>a.addTool(e),removeTool:e=>a.removeTool(e),setLlm:e=>a.setLlm(e),setMemory:e=>a.setMemory(e),refreshMemory:()=>a.refreshMemory(),setSubagents:e=>a.setSubagents(e),addSubagent:e=>a.addSubagent(e),removeSubagent:e=>a.removeSubagent(e),getActiveSubagents:()=>a.getActiveSubagents(),get subagentHistory(){return a.subagentHistory}}}var j_=4e3;function M_(e={}){let{fetchResponse:t,fetchStream:n,onPersist:r,onClear:i,onQueuedCleared:a}=e,o=sn({messages:e.messages??[],loading:!1,error:null}),s=xn(null),c=xn(!0),l=null,u=xn([]),d=xn(null);function f(){}function p(e){let t=s.value;e.deltaY<0?c.value=!1:t&&(c.value=t.scrollHeight-t.scrollTop-t.clientHeight<64)}function m(){s.value&&requestAnimationFrame(()=>{let e=s.value;!e||!c.value||(e.scrollTop=e.scrollHeight)})}function h(e,t,n){o.messages.push({role:e,content:t,timestamp:Date.now(),...n&&n.length?{focuses:n}:{}}),c.value=!0,m()}async function g(e){if(c.value=!0,n){let t=sn({role:`assistant`,content:``,timestamp:Date.now(),reasoning:``,steps:[]}),r=!1;o.messages.push(t);try{await n(o.messages.slice(0,-1),e=>{switch(e.type){case`round_start`:e.round>1&&(t.content||t.reasoning)&&(r=!0);break;case`reasoning`:r&&=(t.reasoning+=`
195
195
  `,!1),t.reasoning=(t.reasoning+e.delta).slice(-4e3);break;case`text`:r&&=(t.content+=`
196
- `,!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;let r=t.steps[n].subReason;r&&r.length>80&&(t.steps[n].subReason=r.slice(0,80)+`…`);break}break;case`subagent`:{let n=t.steps[t.steps.length-1];if(!n)break;if(e.kind===`reasoning`){let t=e.delta||``;n.subReasonFull=(n.subReasonFull||``)+t;let r=(n.subReason||``)+t;n.subReason=r.length>j_?r.slice(-4e3):r;break}n.children||=[];let r=e.label?`[${e.label}] ${e.name}`:e.name;if(e.kind===`tool_call`)n.children.push({name:r,args:e.args,status:`running`});else for(let t=n.children.length-1;t>=0;t--)if(n.children[t].status===`running`&&n.children[t].name===r){n.children[t].result=e.result,n.children[t].status=e.status||`done`;break}break}case`approval_request`:d.value={toolName:e.toolName,args:e.args,resolve:e.resolve};break}m()},e)}catch(n){if(ql(n,e)||(o.error=n.message||`请求失败,请重试`),!t.content&&!t.reasoning){let e=o.messages.indexOf(t);e>=0&&o.messages.splice(e,1)}}finally{await v()}return}try{h(`assistant`,await(t||S)(o.messages,e))}catch(t){ql(t,e)||(o.error=t.message||`请求失败,请重试`)}finally{await v()}}function _(e){let t=e=>{if(e?.length)for(let n of e)n.status===`running`&&(n.status=`error`,n.result||=`(本轮已结束,该步骤未收到结果 —— 子 agent 中断/异常)`),n.children?.length&&t(n.children)};for(let n=e.length-1;n>=0;n--)if(e[n].role===`assistant`){t(e[n].steps);break}}async function v(){_(o.messages);try{await r?.(o.messages)}catch{}o.loading=!1,l=null;let e=u.value.shift();e!==void 0&&(h(`user`,e),o.loading=!0,o.error=null,l=new AbortController,await g(l.signal))}function y(e){u.value.splice(e,1)}async function b(e,t){if(e.trim()){if(o.loading){u.value.push(e.trim());return}h(`user`,e.trim(),t),o.loading=!0,o.error=null,l=new AbortController,await g(l.signal)}}async function x(){if(o.loading)return;let e=o.messages;for(let t=e.length-1;t>=0;t--)if(e[t].role===`assistant`){e.splice(t);break}e.some(e=>e.role===`user`)&&(o.loading=!0,o.error=null,l=new AbortController,await g(l.signal))}async function S(e){return await new Promise(e=>setTimeout(e,800+Math.random()*1200)),`收到你的消息:"${e.filter(e=>e.role===`user`).pop()?.content}"。这是一个模拟回复,请接入实际的 AI API。`}function C(){i?.(),o.messages.splice(0,o.messages.length),o.error=null}function w(){u.value.length&&a?.([...u.value]),u.value=[],l?.abort()}function T(){u.value=[],l?.abort(),l=null,o.loading=!1,o.error=null,d.value=null}function E(e){let t=d.value;t&&(d.value=null,t.resolve(e))}async function D(){if(!o.error)return;let e=o.messages,t=-1;for(let n=e.length-1;n>=0;n--)if(e[n].role===`user`){t=n;break}if(t<0)return;let n=e[t].content;e.splice(t),o.error=null,await b(n)}return{state:o,scrollContainer:s,pendingApproval:d,queuedTasks:u,sendMessage:b,removeQueuedTask:y,clearMessages:C,stop:w,reset:T,retry:D,regenerate:x,resolveApproval:E,onScroll:f,onWheel:p}}async function N_(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 P_={header:`🤖`,subagent:`🤖`,subagentProgress:`🧬`,empty:`💬`,focus:`🎯`,queued:`📋`,queuedEdit:`✏️`,recommend:`💡`,conflict:`⚠️`};function F_(e){let t={...P_};if(!e)return t;let n=Object.keys(P_);for(let r of n){let n=e[r];typeof n==`string`&&(t[r]=n)}return e.assistantAvatar&&(t.assistantAvatar=e.assistantAvatar),e.userAvatar&&(t.userAvatar=e.userAvatar),e.send&&(t.send=e.send),t}var I_={defaultTitle:`AI 助手`,inputPlaceholder:`输入消息,Enter 发送...`,newSession:`新建会话`,history:`历史记录`,more:`更多`,close:`关闭`,debugMenu:`调试 / 日志`,debugMenuTitle:`日志 / 执行流程 / Agent 信息`,skillMenu:`Skill 管理`,skillMenuTitle:`创建 / 管理自定义 Skill`,clearChat:`清空对话`,sessionFallbackPrefix:`会话 `,justNow:`刚刚`,minutesAgoSuffix:`分钟前`,emptyGreeting:`有什么可以帮你的?`,retry:`重试`,undo:`↩ 回退`,undoTitle:`回退到上次正常状态(还原对话历史 + 页面属性 + 工作区)`,thinking:`思考中...`,statusRunning:`执行中`,statusDone:`成功`,statusError:`失败`,subagentBadge:`子`,subagentBadgeTitle:`子 agent 委派(独立上下文,只回结论)`,subagentProgress:`子 agent 进度`,nthCallPrefix:`第 `,nthCallSuffix:` 次`,argsLabel:`入参`,resultLabel:`返回值`,copy:`复制`,copied:`已复制`,regenerate:`重新生成`,expand:`展开`,collapse:`收起`,noResult:`(无返回值)`,displayTruncatedSuffix:`
196
+ `,!1),t.content+=e.delta;break;case`tool_call`:t.steps.push({name:e.name,args:e.args,status:`running`,id:e.id});break;case`tool_result`:{let n=-1;if(e.id!==void 0&&(n=t.steps.findIndex(t=>t.id===e.id)),n<0){for(let r=t.steps.length-1;r>=0;r--)if(t.steps[r].name===e.name&&t.steps[r].status===`running`){n=r;break}}if(n>=0){let r=t.steps[n];r.result=e.result,r.status=e.status,r.durationMs=e.durationMs;let i=r.subReason;i&&i.length>80&&(r.subReason=i.slice(0,80)+`…`)}break}case`subagent`:{let n=e.toolCallId===void 0?t.steps[t.steps.length-1]:t.steps.find(t=>t.id===e.toolCallId);if(!n)break;if(e.kind===`reasoning`){let t=e.delta||``;n.subReasonFull=(n.subReasonFull||``)+t;let r=(n.subReason||``)+t;n.subReason=r.length>j_?r.slice(-4e3):r;break}n.children||=[];let r=e.label?`[${e.label}] ${e.name}`:e.name;if(e.kind===`tool_call`)n.children.push({name:r,args:e.args,status:`running`});else for(let t=n.children.length-1;t>=0;t--)if(n.children[t].status===`running`&&n.children[t].name===r){n.children[t].result=e.result,n.children[t].status=e.status||`done`;break}break}case`approval_request`:d.value={toolName:e.toolName,args:e.args,resolve:e.resolve};break}m()},e)}catch(n){if(ql(n,e)||(o.error=n.message||`请求失败,请重试`),!t.content&&!t.reasoning){let e=o.messages.indexOf(t);e>=0&&o.messages.splice(e,1)}}finally{await v()}return}try{h(`assistant`,await(t||S)(o.messages,e))}catch(t){ql(t,e)||(o.error=t.message||`请求失败,请重试`)}finally{await v()}}function _(e){let t=e=>{if(e?.length)for(let n of e)n.status===`running`&&(n.status=`error`,n.result||=`(本轮已结束,该步骤未收到结果 —— 子 agent 中断/异常)`),n.children?.length&&t(n.children)};for(let n=e.length-1;n>=0;n--)if(e[n].role===`assistant`){t(e[n].steps);break}}async function v(){_(o.messages);try{await r?.(o.messages)}catch{}o.loading=!1,l=null;let e=u.value.shift();e!==void 0&&(h(`user`,e),o.loading=!0,o.error=null,l=new AbortController,await g(l.signal))}function y(e){u.value.splice(e,1)}async function b(e,t){if(e.trim()){if(o.loading){u.value.push(e.trim());return}h(`user`,e.trim(),t),o.loading=!0,o.error=null,l=new AbortController,await g(l.signal)}}async function x(){if(o.loading)return;let e=o.messages;for(let t=e.length-1;t>=0;t--)if(e[t].role===`assistant`){e.splice(t);break}e.some(e=>e.role===`user`)&&(o.loading=!0,o.error=null,l=new AbortController,await g(l.signal))}async function S(e){return await new Promise(e=>setTimeout(e,800+Math.random()*1200)),`收到你的消息:"${e.filter(e=>e.role===`user`).pop()?.content}"。这是一个模拟回复,请接入实际的 AI API。`}function C(){i?.(),o.messages.splice(0,o.messages.length),o.error=null}function w(){u.value.length&&a?.([...u.value]),u.value=[],l?.abort()}function T(){u.value=[],l?.abort(),l=null,o.loading=!1,o.error=null,d.value=null}function E(e){let t=d.value;t&&(d.value=null,t.resolve(e))}async function D(){if(!o.error)return;let e=o.messages,t=-1;for(let n=e.length-1;n>=0;n--)if(e[n].role===`user`){t=n;break}if(t<0)return;let n=e[t].content;e.splice(t),o.error=null,await b(n)}return{state:o,scrollContainer:s,pendingApproval:d,queuedTasks:u,sendMessage:b,removeQueuedTask:y,clearMessages:C,stop:w,reset:T,retry:D,regenerate:x,resolveApproval:E,onScroll:f,onWheel:p}}async function N_(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 P_={header:`🤖`,subagent:`🤖`,subagentProgress:`🧬`,empty:`💬`,focus:`🎯`,queued:`📋`,queuedEdit:`✏️`,recommend:`💡`,conflict:`⚠️`};function F_(e){let t={...P_};if(!e)return t;let n=Object.keys(P_);for(let r of n){let n=e[r];typeof n==`string`&&(t[r]=n)}return e.assistantAvatar&&(t.assistantAvatar=e.assistantAvatar),e.userAvatar&&(t.userAvatar=e.userAvatar),e.send&&(t.send=e.send),t}var I_={defaultTitle:`AI 助手`,inputPlaceholder:`输入消息,Enter 发送...`,newSession:`新建会话`,history:`历史记录`,more:`更多`,close:`关闭`,debugMenu:`调试 / 日志`,debugMenuTitle:`日志 / 执行流程 / Agent 信息`,skillMenu:`Skill 管理`,skillMenuTitle:`创建 / 管理自定义 Skill`,clearChat:`清空对话`,sessionFallbackPrefix:`会话 `,justNow:`刚刚`,minutesAgoSuffix:`分钟前`,emptyGreeting:`有什么可以帮你的?`,retry:`重试`,undo:`↩ 回退`,undoTitle:`回退到上次正常状态(还原对话历史 + 页面属性 + 工作区)`,thinking:`思考中...`,statusRunning:`执行中`,statusDone:`成功`,statusError:`失败`,subagentBadge:`子`,subagentBadgeTitle:`子 agent 委派(独立上下文,只回结论)`,subagentProgress:`子 agent 进度`,nthCallPrefix:`第 `,nthCallSuffix:` 次`,argsLabel:`入参`,resultLabel:`返回值`,copy:`复制`,copied:`已复制`,regenerate:`重新生成`,expand:`展开`,collapse:`收起`,noResult:`(无返回值)`,displayTruncatedSuffix:`
197
197
  …(展示截断,复制可得全量)`,thinkingCountPrefix:`思考中… `,charCountSuffix:`字`,reasoningTitle:`思考过程`,truncatedNotePrefix:`(仅显最近 `,truncatedNoteSuffix:` 字)`,copyThinking:`复制完整思考内容`,copyThinkingTruncTitle:`复制完整思考(渲染已截尾,复制取全量)`,focusChipTitlePrefix:`精修中:`,focusChipTitleHint:`(点击回看 · ✕ 移除)`,historyFocusChipTitlePrefix:`回看 `,removeFocus:`移除此焦点`,sendHint:`Enter 发送 · Shift+Enter 换行`,sendTitle:`发送`,stopTitle:`停止生成`,queuedTitle:`排队中 · 生成完后自动执行`,queuedEditTitle:`修改(填回输入框编辑)`,removeQueuedTitle:`撤销该任务`,humanConfirmTitle:`AI 需要你确认`,recommendPrefix:` 推荐:`,approve:`允许`,deny:`拒绝`,toolConfirmPrefix:`需确认工具调用:`,viewArgs:`查看参数`,collapseArgs:`收起参数`,argsTruncatedSuffix:`
198
198
  …(已截断)`,conflictTitlePrefix:`写入冲突:`,conflictTitleSuffix:` 已被外部修改`,conflictDetailTemplate:`AI 基于「读取时的旧值」准备{op},但该属性在你读取之后被外部代码/其他 agent/手动改过。`,conflictOpWrite:`写入`,conflictOpDelete:`删除`,viewDiff:`查看值对比`,collapseDiff:`收起对比`,agentValueLabel:`AI 想写的值`,currentValueLabel:`外部改后的当前值`,deleteNoValue:`(delete 操作无值)`,keepExternal:`保留外部`,keepExternalTitle:`不写入,保留外部修改后的值,AI 重新读取再改`,overwrite:`强制覆盖`,overwriteTitle:`用 AI 的值覆盖外部修改`,restore:`回退`,restoreTitle:`回退到最近一次历史快照(agent 之前操作的检查点),撤销外部修改 + AI 不写入`,switchFocusTitle:`切换聚焦路径`,exitFocusTitle:`退出精修`,focusPathPlaceholder:`jsonPath,如 components.3`,focusLabelPlaceholder:`标签(可选)`,focusSubmit:`聚焦`,debugTabLogs:`日志`,debugTabFlow:`流程`,debugTabContext:`上下文`,debugTabSubagent:`子 agent`,debugTabInfo:`Agent 信息`,debugClearLogs:`清空日志`,debugTypeContext:`上下文`,debugTypeLlmRequest:`LLM请求`,debugTypeLlmResponse:`LLM响应`,debugTypeToolCall:`工具调用`,debugTypeToolResult:`工具结果`,debugTypeError:`错误`,debugTypeMiddleware:`中间件`,debugFilterAll:`全部`,debugFlowPrep:`准备 / 其他`,debugLogsEmpty:`暂无日志,发送消息后这里会显示 Agent 的完整上下文、工具调用等信息`,debugFlowEmpty:`暂无日志,发送消息后这里按轮次展示执行流程`,debugNoInfo:`暂无信息`,debugCardView:`🗂 卡片视图`,debugRequestBody:`📋 请求体`,debugViewRawJson:`查看原始 JSON`,debugCollapseRawJson:`收起原始 JSON`,debugModel:`模型`,debugTemperature:`温度`,debugMessageCount:`消息数`,debugToolsLabel:`工具`,debugContextMessages:`上下文消息`,debugRoundPrefix:`第 `,debugRoundSuffix:` 轮`,debugMsgCountSuffix:` 条消息`,debugToolCountSuffix:` 工具`,debugToolCallsSuffix:` 个工具调用`,debugResultSuffix:` 结果`,debugTodoPending:`待办`,debugTodoInProgress:`进行中`,debugTodoCompleted:`完成`,debugSubRunning:`运行中`,debugSubDone:`完成`,debugSubError:`错误`,debugLocksTitle:`组件锁`,debugSubagentEmpty:`尚未委派子 agent。主 agent 调用 use_<id> 或 spawn_agent 后,这里展示运行状态与委派历史。`,debugSubRunningTitle:`运行中`,debugSubHistoryTitle:`历史`,debugStepsBtn:`步骤`,debugStepsCountSuffix:` 步`,debugTraceEmpty:`未开启 tracing(capabilities.tracing:true)或暂无 trace。跑一轮 agent 后刷新。`,debugMetricRounds:`轮次`,debugMetricTotal:`总耗时`,debugMetricAvg:`平均/轮`,debugMetricTools:`工具`,debugMetricCompressions:`压缩`,debugCtxEmpty:`未开启 contextInspector(默认开)或暂无快照。跑一轮 agent 后切回刷新。`,debugCtxOccupancy:`占用`,debugCtxThreshold:`压缩阈值`,debugCtxTokens:`估算`,debugCtxWindow:`窗口`,debugCtxThresholdPct:`阈值`,debugCtxCategories:`分类构成(近似)`,debugCtxLastCompression:`最近压缩`,debugCtxSummarized:`摘要`,debugCtxRoundsSuffix:` 轮`,debugCtxRecalled:`召回`,debugCtxAgentDecision:`agent 决策:`,debugInfoBasic:`基本信息`,debugToolCount:`工具数`,debugMiddleware:`中间件`,debugMiddlewareStack:`中间件栈`,debugSkillsTitle:`技能`,debugSkillsHint:`点击展开查看全文`,debugLoading:`加载中…`,debugDataTitle:`可操作数据`,debugDataFallback:`主数据对象`,debugSchemaPrefix:`schema: `,debugSchemaDeclared:`已声明`,debugSchemaMissing:`未声明`,debugSubagentTitle:`子 Agent`,debugEnabled:`启用`,debugYes:`是`,debugNo:`否`,debugMaxDepth:`最大递归`,debugMaxParallel:`并行上限`,debugExtraTools:`额外工具`,debugDefaultReadonly:`默认只读`,debugVerifyTitle:`Verify 自检`,debugMaxAttempts:`自纠上限`,debugAdversarial:`对抗验证`,debugOn:`开启`,debugOff:`关闭`,debugAdversarialModel:`对抗模型`,debugSameAsMain:`(同主)`,debugTodosTitle:`任务清单`,debugMemoryTitle:`持久指令 (memory)`,debugPrefsTitle:`用户偏好(跨会话)`,debugPrefTopicColor:`颜色`,debugPrefTopicCopy:`文案`,debugPrefTopicLayout:`排版`,debugPrefTopicInteraction:`交互`,debugPrefTopicTech:`技术`,debugPrefTopicOther:`其他`,debugLastCompTitle:`上轮压缩`,debugTriggered:`触发`,debugNotTriggered:`✗(未达阈值)`,debugRoundsSummarized:`摘要轮次`,debugCountSuffix:` 条`,debugStrategy:`策略`,debugDecision:`压缩决策`,debugSummaryMode:`摘要`,debugSkillNoReader:`当前 SDK 未注入 getSkillContent,无法查看 skill 全文`,debugSkillEmpty:`skill 无内容或读取失败`,skillPanelTitle:`🧩 Skill 管理`,skillEditingPrefix:`编辑 Skill: `,skillCreateNew:`创建新 Skill`,skillCancelEdit:`取消编辑`,skillNameLabel:`名称`,skillNamePlaceholder:`如:my-writer`,skillDescLabel:`描述`,skillDescPlaceholder:`一句话说明用途与触发时机`,skillContentLabel:`内容`,skillContentPlaceholder:`skill 全文指令(支持 Markdown)`,skillSave:`保存修改`,skillAdd:`添加 Skill`,skillCreatedTitle:`已创建 Skill`,skillEmpty:`暂无用户创建的 skill`,skillEditBtn:`编辑`,skillEditTitle:`加载到表单编辑`,skillDeleteBtn:`删除`,skillDeleteTitle:`删除该用户 skill`,skillErrName:`skill 名不能为空`,skillErrDesc:`描述不能为空`,skillErrContent:`内容不能为空`,skillDupWarnPrefix:`已存在同名用户 skill "`,skillDupWarnSuffix:`",将覆盖`,skillHintA:`创建/编辑的 skill 会自动加入 agent(下轮 system prompt 索引可见),agent 经`,skillHintB:`按需加载全文;持久化由独立 SkillStore 管理(默认 indexedDB,与 storage 选项分离),跨刷新自动恢复;可经`,skillHintC:`跨页面复用。`,codeCopyTitle:`复制代码`,codeOpenTitle:`新窗口打开`,codePreviewTitlePrefix:`代码预览 · `,codePreviewTab:`预览`,codeSourceTab:`源码`,codeDemoTitle:`CSS 预览`,codeDemoText:`这是一段示例文字,用于展示 CSS 效果。`,codeDemoButton:`按钮`,codeDemoInput:`输入框`},L_={defaultTitle:`AI Assistant`,inputPlaceholder:`Type a message, Enter to send...`,newSession:`New chat`,history:`History`,more:`More`,close:`Close`,debugMenu:`Debug / Logs`,debugMenuTitle:`Logs / execution flow / agent info`,skillMenu:`Skills`,skillMenuTitle:`Create / manage custom skills`,clearChat:`Clear conversation`,sessionFallbackPrefix:`Session `,justNow:`just now`,minutesAgoSuffix:` min ago`,emptyGreeting:`How can I help you?`,retry:`Retry`,undo:`↩ Undo`,undoTitle:`Restore the last good state (conversation + page data + workspace)`,thinking:`Thinking...`,statusRunning:`Running`,statusDone:`Success`,statusError:`Failed`,subagentBadge:`sub`,subagentBadgeTitle:`Sub-agent delegation (isolated context, conclusion only)`,subagentProgress:`Sub-agent progress`,nthCallPrefix:`Call #`,nthCallSuffix:``,argsLabel:`Args`,resultLabel:`Result`,copy:`Copy`,copied:`Copied`,regenerate:`Regenerate`,expand:`Expand`,collapse:`Collapse`,noResult:`(no result)`,displayTruncatedSuffix:`
199
199
  …(truncated for display, copy for full)`,thinkingCountPrefix:`Thinking… `,charCountSuffix:` chars`,reasoningTitle:`Reasoning`,truncatedNotePrefix:`(last `,truncatedNoteSuffix:` chars only)`,copyThinking:`Copy full reasoning`,copyThinkingTruncTitle:`Copy full reasoning (display truncated, copy gets all)`,focusChipTitlePrefix:`Focus:`,focusChipTitleHint:`(click to view · ✕ remove)`,historyFocusChipTitlePrefix:`View `,removeFocus:`Remove this focus`,sendHint:`Enter to send · Shift+Enter for newline`,sendTitle:`Send`,stopTitle:`Stop generating`,queuedTitle:`Queued · runs when current finishes`,queuedEditTitle:`Edit (fill back into input)`,removeQueuedTitle:`Drop this task`,humanConfirmTitle:`AI needs your confirmation`,recommendPrefix:` Recommend:`,approve:`Allow`,deny:`Deny`,toolConfirmPrefix:`Confirm tool call:`,viewArgs:`View args`,collapseArgs:`Collapse args`,argsTruncatedSuffix:`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "page-agent-sdk",
3
- "version": "3.23.0",
3
+ "version": "3.23.1",
4
4
  "type": "module",
5
5
  "description": "AI agent SDK for web pages — embed a chat assistant that edits page data via schema-validated tools. A lighter, framework-agnostic alternative to CopilotKit/LangChain for in-page JSON-editing agents. Vue-bundled; works with DeepSeek, OpenAI, MCP.",
6
6
  "main": "./dist/page-agent-sdk.umd.cjs",
@@ -41,6 +41,8 @@ export declare function normalizeUsage(message: import('@langchain/core/messages
41
41
 
42
42
  export interface ToolStep {
43
43
  name: string;
44
+ /** 工具调用关联 id(与 tool_call/tool_result 事件同 id;并行同轮同名工具按 id 精确归属 UI step,缺省按 name 兜底) */
45
+ id?: string;
44
46
  args?: any;
45
47
  result?: string;
46
48
  status: 'running' | 'done' | 'error';
@@ -81,9 +83,9 @@ export type StreamEvent =
81
83
  | { type: 'round_start'; round: number }
82
84
  | { type: 'reasoning'; delta: string }
83
85
  | { type: 'text'; delta: string }
84
- | { type: 'tool_call'; name: string; args: any }
85
- | { type: 'tool_result'; name: string; result: string; status: 'done' | 'error' }
86
- | { type: 'subagent'; taskId: string; label: string; kind: 'tool_call' | 'tool_result'; name: string; args?: any; result?: string; status?: 'done' | 'error' }
86
+ | { type: 'tool_call'; name: string; args: any; id?: string }
87
+ | { type: 'tool_result'; name: string; result: string; status: 'done' | 'error'; id?: string }
88
+ | { type: 'subagent'; taskId: string; label: string; kind: 'tool_call' | 'tool_result'; name: string; args?: any; result?: string; status?: 'done' | 'error'; /** 关联主循环工具调用 id(并行双委派各归各 step) */ toolCallId?: string }
87
89
  | { type: 'done'; content: string };
88
90
 
89
91
  export type StreamHandler = (event: StreamEvent) => void;
@@ -97,9 +99,9 @@ export type SdkEvent =
97
99
  | { type: 'round_start'; round: number }
98
100
  | { type: 'reasoning'; delta: string }
99
101
  | { type: 'text'; delta: string }
100
- | { type: 'tool_call'; name: string; args: any }
101
- | { type: 'tool_result'; name: string; result: string; status: 'done' | 'error' }
102
- | { type: 'subagent'; taskId: string; label: string; kind: 'tool_call' | 'tool_result'; name: string; args?: any; result?: string; status?: 'done' | 'error' }
102
+ | { type: 'tool_call'; name: string; args: any; id?: string }
103
+ | { type: 'tool_result'; name: string; result: string; status: 'done' | 'error'; id?: string }
104
+ | { type: 'subagent'; taskId: string; label: string; kind: 'tool_call' | 'tool_result'; name: string; args?: any; result?: string; status?: 'done' | 'error'; toolCallId?: string }
103
105
  | { type: 'done'; content: string }
104
106
  | { type: 'data_change'; operation: 'set' | 'edit' | 'delete' | 'restore'; value?: unknown }
105
107
  | { type: 'message_update'; count: number }
package/types/index.d.ts CHANGED
@@ -44,6 +44,8 @@ export declare function normalizeUsage(message: import('@langchain/core/messages
44
44
 
45
45
  export interface ToolStep {
46
46
  name: string;
47
+ /** 工具调用关联 id(与 tool_call/tool_result 事件同 id;并行同轮同名工具按 id 精确归属 UI step,缺省按 name 兜底) */
48
+ id?: string;
47
49
  args?: any;
48
50
  result?: string;
49
51
  status: 'running' | 'done' | 'error';
@@ -100,9 +102,9 @@ export type SdkEvent =
100
102
  | { type: 'round_start'; round: number }
101
103
  | { type: 'reasoning'; delta: string }
102
104
  | { type: 'text'; delta: string }
103
- | { type: 'tool_call'; name: string; args: any }
104
- | { type: 'tool_result'; name: string; result: string; status: 'done' | 'error' }
105
- | { type: 'subagent'; taskId: string; label: string; kind: 'tool_call' | 'tool_result'; name: string; args?: any; result?: string; status?: 'done' | 'error' }
105
+ | { type: 'tool_call'; name: string; args: any; id?: string }
106
+ | { type: 'tool_result'; name: string; result: string; status: 'done' | 'error'; durationMs?: number; id?: string }
107
+ | { type: 'subagent'; taskId: string; label: string; kind: 'tool_call' | 'tool_result'; name: string; args?: any; result?: string; status?: 'done' | 'error'; /** 关联主循环工具调用 id(并行双委派各归各 UI step) */ toolCallId?: string }
106
108
  | { type: 'done'; content: string }
107
109
  | { type: 'data_change'; operation: 'set' | 'edit' | 'delete' | 'restore'; value?: unknown }
108
110
  | { type: 'message_update'; count: number }