page-agent-sdk 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5696,7 +5696,26 @@ function Zs(e, t, n) {
5696
5696
  if (Array.isArray(t)) for (let e of t) e && typeof e == "object" && typeof e.__pgId == "string" && n(e, r);
5697
5697
  }
5698
5698
  }
5699
- function Qs(e) {
5699
+ function Qs(e, t, n) {
5700
+ let r = /* @__PURE__ */ new Set();
5701
+ if (!e || typeof e != "object") return r;
5702
+ for (let i of t) {
5703
+ let t = Z(e, i);
5704
+ if (Array.isArray(t)) for (let e = 0; e < t.length; e++) {
5705
+ let a = t[e];
5706
+ if (!a || typeof a != "object") continue;
5707
+ let o = a.__pgId;
5708
+ if (typeof o != "string") continue;
5709
+ let s = `${i}.${e}`;
5710
+ for (let e of n) if (e.path === s || e.path.startsWith(s + ".")) {
5711
+ r.add(o);
5712
+ break;
5713
+ }
5714
+ }
5715
+ }
5716
+ return r;
5717
+ }
5718
+ function $s(e) {
5700
5719
  let { writablePaths: t, codeVfsPrefix: n, ext: r, getController: i, vfsStore: a } = e;
5701
5720
  return {
5702
5721
  name: "code-asset-checkout-commit",
@@ -5715,19 +5734,27 @@ function Qs(e) {
5715
5734
  [Ys]: /* @__PURE__ */ new Set()
5716
5735
  };
5717
5736
  },
5718
- wrapToolCall: async (e, t) => {
5719
- let r = await t(e);
5720
- if (e.name === "vfs_write" || e.name === "vfs_edit" || e.name === "vfs_rm") {
5721
- let t = e.args?.path;
5722
- if (typeof t == "string") {
5723
- let r = Us(t);
5724
- if (r.startsWith(n)) {
5725
- let t = e.state[Ys];
5726
- t && t.add(r);
5737
+ wrapToolCall: async (e, a) => {
5738
+ let o = e.name === "vfs_write" || e.name === "vfs_edit" || e.name === "vfs_rm" ? e.args?.path : void 0, s = typeof o == "string" ? Us(o) : void 0, c = typeof s == "string" && s.startsWith(n);
5739
+ if (c) {
5740
+ let a = e.state.focuses;
5741
+ if (a && a.length) {
5742
+ let e = Qs(i()?.get?.().bind, t, a);
5743
+ if (e.size) {
5744
+ let t = Xs(s, n);
5745
+ if (t && !e.has(t)) return {
5746
+ content: `PATH_DENIED · vfs 越界:当前聚焦代码文件 [${[...e].map((e) => `${n}${e}.${r}`).join(", ")}],你要改的 "${s}" 不在其中。请只改焦点组件的代码文件;如需改其他组件,请让主 agent clear_focus / 换焦点后重试。`,
5747
+ status: "error"
5748
+ };
5727
5749
  }
5728
5750
  }
5729
5751
  }
5730
- return r;
5752
+ let l = await a(e);
5753
+ if (c) {
5754
+ let t = e.state[Ys];
5755
+ t && t.add(s);
5756
+ }
5757
+ return l;
5731
5758
  },
5732
5759
  afterAgent: (e) => {
5733
5760
  let o = i(), s = o?.get?.().bind, c = e[Ys];
@@ -5752,7 +5779,7 @@ function Qs(e) {
5752
5779
  }
5753
5780
  //#endregion
5754
5781
  //#region src/core/sdk/defineTool.ts
5755
- function $s(e) {
5782
+ function ec(e) {
5756
5783
  return r(async (t) => {
5757
5784
  let n = await e.handler(t);
5758
5785
  return typeof n == "string" ? n : JSON.stringify(n);
@@ -5764,7 +5791,7 @@ function $s(e) {
5764
5791
  }
5765
5792
  //#endregion
5766
5793
  //#region src/core/sdk/inspectContextTool.ts
5767
- var ec = t.object({
5794
+ var tc = t.object({
5768
5795
  path: t.string().optional().describe("分类 key 过滤(如 toolResults/history/systemPrompt/dataHint);不传=全部分类"),
5769
5796
  role: t.enum([
5770
5797
  "user",
@@ -5774,11 +5801,11 @@ var ec = t.object({
5774
5801
  ]).optional().describe("聚焦每轮首句的角色(assistant→回复摘要,user→问题摘要);不影响工具列表"),
5775
5802
  limit: t.number().int().min(1).max(50).optional().describe("返回最近 N 轮(默认全部;超 50 自动截最近 50 防返回过大)")
5776
5803
  });
5777
- function tc(e) {
5778
- return $s({
5804
+ function nc(e) {
5805
+ return ec({
5779
5806
  name: "inspect_context",
5780
5807
  description: "查看当前对话上下文的构成(供压缩决策)。返回:totalTokens(历史轮次 token 总和,与触发判断同口径)、occupancy(窗口占用比)、contextWindow、categories(分类占用)、rounds(每轮 token/工具/首句)。先调用本工具查看构成,再决定压缩策略。",
5781
- schema: ec,
5808
+ schema: tc,
5782
5809
  handler: (t) => {
5783
5810
  let n = so(e.getMessages()), r = n.length > 50 ? n.slice(n.length - 50) : n, i = (t.limit && r.length > t.limit ? r.slice(r.length - t.limit) : r).map((e) => {
5784
5811
  let n = bo(e), r = lo(e), i = t.role === "assistant" ? e.assistantMsgs[0] ?? e.userMsg : e.userMsg, a = co(typeof i.content == "string" ? i.content : "", 60);
@@ -5801,7 +5828,7 @@ function tc(e) {
5801
5828
  }
5802
5829
  //#endregion
5803
5830
  //#region src/core/sdk/compressDecision.ts
5804
- var nc = t.object({
5831
+ var rc = t.object({
5805
5832
  keepRounds: t.number().int().min(0).max(50).optional(),
5806
5833
  windowRatio: t.number().min(0).max(1).optional(),
5807
5834
  summarize: t.object({ mode: t.enum(["index", "llm"]) }),
@@ -5811,23 +5838,23 @@ var nc = t.object({
5811
5838
  }).refine((e) => e.keepRounds !== void 0 || e.windowRatio !== void 0, { message: "keepRounds 与 windowRatio 至少填一个(按当前触发模式)" });
5812
5839
  //#endregion
5813
5840
  //#region src/core/sdk/llmResolver.ts
5814
- function rc(e) {
5841
+ function ic(e) {
5815
5842
  let t = e.find((e) => e.role === "user");
5816
5843
  if (!t) return;
5817
5844
  let n = t.content, r = (typeof n == "string" ? n : Array.isArray(n) ? n.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(n ?? "")).trim().replace(/[\n\r]+/g, " ");
5818
5845
  if (r) return r.length > 30 ? r.slice(0, 30) + "…" : r;
5819
5846
  }
5820
- function ic(e) {
5847
+ function ac(e) {
5821
5848
  return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
5822
5849
  }
5823
- function ac(e) {
5850
+ function oc(e) {
5824
5851
  let t = e.content;
5825
5852
  return typeof t == "string" ? t : Array.isArray(t) ? t.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(t ?? "");
5826
5853
  }
5827
- function oc(e) {
5854
+ function sc(e) {
5828
5855
  let t = e.summaryLlm ?? e.llm;
5829
5856
  if (!t) return;
5830
- let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, i = e.summaryTimeoutMs ?? 15e3, s = ic(t) ? t : null, c = ic(t) ? null : t;
5857
+ let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, i = e.summaryTimeoutMs ?? 15e3, s = ac(t) ? t : null, c = ac(t) ? null : t;
5831
5858
  if (c && !c.apiKey) {
5832
5859
  e.summaryLlm && console.warn("[page-agent-sdk][summarization] summaryLlm 已配置但缺 apiKey,摘要回退主 agent 模型或零成本索引摘要");
5833
5860
  return;
@@ -5839,16 +5866,16 @@ function oc(e) {
5839
5866
  return !l && c && (l = await f(c, {
5840
5867
  temperature: n,
5841
5868
  maxTokens: r
5842
- })), ac(await l.invoke([new o("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new a(e)], { signal: t.signal })).trim();
5869
+ })), oc(await l.invoke([new o("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new a(e)], { signal: t.signal })).trim();
5843
5870
  } finally {
5844
5871
  clearTimeout(s);
5845
5872
  }
5846
5873
  };
5847
5874
  }
5848
- function sc(e) {
5875
+ function cc(e) {
5849
5876
  let t = e.titleLlm ?? e.summaryLlm ?? e.llm;
5850
5877
  if (!t) return;
5851
- let n = ic(t) ? t : null, r = ic(t) ? null : t;
5878
+ let n = ac(t) ? t : null, r = ac(t) ? null : t;
5852
5879
  if (r && !r.apiKey) return;
5853
5880
  let i = n;
5854
5881
  return async (e) => {
@@ -5857,7 +5884,7 @@ function sc(e) {
5857
5884
  return !i && r && (i = await f(r, {
5858
5885
  temperature: 0,
5859
5886
  maxTokens: 30
5860
- })), ac(await i.invoke([new o("根据以下对话的主旨,生成一个简短的中文标题(不超过15个字,不要标点和引号,直接输出标题文字)。"), new a(t)], { signal: n.signal })).trim().replace(/^["'""「『]|["'""」』]$/g, "").split("\n")[0].slice(0, 20);
5887
+ })), oc(await i.invoke([new o("根据以下对话的主旨,生成一个简短的中文标题(不超过15个字,不要标点和引号,直接输出标题文字)。"), new a(t)], { signal: n.signal })).trim().replace(/^["'""「『]|["'""」』]$/g, "").split("\n")[0].slice(0, 20);
5861
5888
  } catch {
5862
5889
  return "";
5863
5890
  } finally {
@@ -5865,10 +5892,10 @@ function sc(e) {
5865
5892
  }
5866
5893
  };
5867
5894
  }
5868
- function cc() {
5895
+ function lc() {
5869
5896
  return `call_dec_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
5870
5897
  }
5871
- function lc(e) {
5898
+ function uc(e) {
5872
5899
  let t = e.match(/```(?:json)?\s*([\s\S]*?)```/), n = t ? t[1] : e, r = n.indexOf("{"), i = n.lastIndexOf("}");
5873
5900
  if (r < 0 || i < 0 || i <= r) return null;
5874
5901
  try {
@@ -5877,21 +5904,21 @@ function lc(e) {
5877
5904
  return null;
5878
5905
  }
5879
5906
  }
5880
- function uc(e) {
5907
+ function dc(e) {
5881
5908
  if (!e) return null;
5882
- let t = lc(e);
5909
+ let t = uc(e);
5883
5910
  if (t == null) return null;
5884
- let n = nc.safeParse(t);
5911
+ let n = rc.safeParse(t);
5885
5912
  return n.success ? n.data : null;
5886
5913
  }
5887
- async function dc(e, t, n, r) {
5914
+ async function fc(e, t, n, r) {
5888
5915
  let i = [...n];
5889
5916
  for (let n = 0; n < 3; n++) {
5890
5917
  let n = await e.invoke(i, { signal: r }), a = n?.tool_calls ?? [];
5891
- if (!a.length) return ac(n).trim();
5918
+ if (!a.length) return oc(n).trim();
5892
5919
  i = [...i, n];
5893
5920
  for (let e of a) {
5894
- let n = e.id ?? cc();
5921
+ let n = e.id ?? lc();
5895
5922
  try {
5896
5923
  let r = await t.invoke(e.args ?? {}), a = typeof r == "string" ? r : r?.content ?? JSON.stringify(r);
5897
5924
  i = [...i, new s({
@@ -5908,10 +5935,10 @@ async function dc(e, t, n, r) {
5908
5935
  }
5909
5936
  return "";
5910
5937
  }
5911
- function fc(e) {
5938
+ function pc(e) {
5912
5939
  let t = e.summaryLlm ?? e.llm;
5913
5940
  if (!t) return;
5914
- let n = ic(t) ? t : null, r = ic(t) ? null : t;
5941
+ let n = ac(t) ? t : null, r = ac(t) ? null : t;
5915
5942
  if (r && !r.apiKey) return;
5916
5943
  let i = e.decisionTimeoutMs ?? 6e3, s = e.decisionMaxTokens ?? 2048, c = n;
5917
5944
  return async (e) => {
@@ -5923,12 +5950,12 @@ function fc(e) {
5923
5950
  }));
5924
5951
  let n = c;
5925
5952
  if (typeof n.bindTools != "function") return null;
5926
- let i = tc({
5953
+ let i = nc({
5927
5954
  getMessages: e.getMessages,
5928
5955
  getSnapshot: e.getSnapshot,
5929
5956
  contextWindow: e.contextWindow
5930
5957
  }), l = n.bindTools([i]), u = e.triggerMode === "token" ? "token 模式:必填 windowRatio(0~1 保留窗口预算比例,如 0.4);keepRounds 可选" : "轮数模式:必填 keepRounds(保留最近几轮,如 6);windowRatio 可选", d = [new o(`你是对话历史压缩决策助手。当前触发模式 = ${e.triggerMode}(${e.triggerReason})。先调用 inspect_context 查看上下文构成,再输出压缩决策 JSON。${u}。仅输出 JSON,不要多余文字/markdown。schema:{keepRounds?(int 0-50), windowRatio?(0-1), summarize:{mode:"index"|"llm"}, recallTopK?(int 0-10), preserveTools?(string[]≤10), reason?(≤200字)}。keepRounds/windowRatio 至少填一个。`), new a(`触发原因:${e.triggerReason}\n上下文窗口:${e.contextWindow ?? "未知"} tokens\n阈值比例:${e.thresholdRatio ?? "未知"}\n\n请决策压缩策略(先 inspect_context 查看,再输出 JSON)。`)];
5931
- return uc(await dc(l, i, d, t.signal)) || uc(await dc(l, i, [...d, new a("上一次输出无效(JSON 解析失败或 schema 校验不通过)。请只输出符合 schema 的压缩决策 JSON,不要多余文字/markdown 代码块。")], t.signal));
5958
+ return dc(await fc(l, i, d, t.signal)) || dc(await fc(l, i, [...d, new a("上一次输出无效(JSON 解析失败或 schema 校验不通过)。请只输出符合 schema 的压缩决策 JSON,不要多余文字/markdown 代码块。")], t.signal));
5932
5959
  } catch {
5933
5960
  return null;
5934
5961
  } finally {
@@ -5936,22 +5963,22 @@ function fc(e) {
5936
5963
  }
5937
5964
  };
5938
5965
  }
5939
- function pc(e) {
5940
- let t = e.llm, n = ic(e.llm) ? void 0 : e.llm;
5966
+ function mc(e) {
5967
+ let t = e.llm, n = ac(e.llm) ? void 0 : e.llm;
5941
5968
  return {
5942
5969
  modelCaps: ri({
5943
5970
  model: n?.model ?? t?.model ?? t?.modelName,
5944
5971
  contextWindow: e.contextWindow ?? n?.contextWindow ?? t?.contextWindow,
5945
5972
  maxOutputTokens: e.maxOutputTokens ?? n?.maxOutputTokens ?? t?.maxOutputTokens
5946
5973
  }),
5947
- summaryLlmInvoke: oc(e),
5948
- titleLlmInvoke: sc(e),
5949
- compressDecisionInvoke: fc(e)
5974
+ summaryLlmInvoke: sc(e),
5975
+ titleLlmInvoke: cc(e),
5976
+ compressDecisionInvoke: pc(e)
5950
5977
  };
5951
5978
  }
5952
5979
  //#endregion
5953
5980
  //#region src/core/sdk/conflictManager.ts
5954
- function mc(e) {
5981
+ function hc(e) {
5955
5982
  let t = /* @__PURE__ */ Ot(null), n = 0;
5956
5983
  function r(r) {
5957
5984
  return new Promise((i) => {
@@ -5982,7 +6009,7 @@ function mc(e) {
5982
6009
  }
5983
6010
  //#endregion
5984
6011
  //#region src/core/utils/id.ts
5985
- function hc() {
6012
+ function gc() {
5986
6013
  try {
5987
6014
  if (typeof crypto < "u" && typeof crypto.randomUUID == "function") return crypto.randomUUID();
5988
6015
  } catch {}
@@ -5990,7 +6017,7 @@ function hc() {
5990
6017
  }
5991
6018
  //#endregion
5992
6019
  //#region src/core/backends/storage.ts
5993
- var gc = "chat-sdk", _c = 50 * 1024 * 1024, vc = 4 * 1024 * 1024, yc = 10 * 1024 * 1024, bc = .9, xc = 500, Sc = 300, Cc = "__meta__", wc = "v:1", Tc = [
6020
+ var _c = "chat-sdk", vc = 50 * 1024 * 1024, yc = 4 * 1024 * 1024, bc = 10 * 1024 * 1024, xc = .9, Sc = 500, Cc = 300, wc = "__meta__", Tc = "v:1", Ec = [
5994
6021
  "messages",
5995
6022
  "vfs",
5996
6023
  "todos",
@@ -6001,51 +6028,51 @@ var gc = "chat-sdk", _c = 50 * 1024 * 1024, vc = 4 * 1024 * 1024, yc = 10 * 1024
6001
6028
  "workingMemory",
6002
6029
  "focus"
6003
6030
  ];
6004
- function Ec(e) {
6005
- return e === "local" || e === "session" ? vc : _c;
6006
- }
6007
6031
  function Dc(e) {
6032
+ return e === "local" || e === "session" ? yc : vc;
6033
+ }
6034
+ function Oc(e) {
6008
6035
  if (typeof e != "object" || !e) return !1;
6009
6036
  let t = e;
6010
6037
  return t.name === "QuotaExceededError" || t.name === "NS_ERROR_DOM_QUOTA_REACHED" || t.code === 22 || t.code === 1014;
6011
6038
  }
6012
- function Oc(e, t, n, r) {
6039
+ function kc(e, t, n, r) {
6013
6040
  return [
6014
- wc,
6041
+ Tc,
6015
6042
  e,
6016
6043
  t,
6017
6044
  n,
6018
6045
  r
6019
6046
  ].join("::");
6020
6047
  }
6021
- function kc(e, t, n) {
6048
+ function Ac(e, t, n) {
6022
6049
  return [
6023
- wc,
6050
+ Tc,
6024
6051
  e,
6025
6052
  t,
6026
6053
  n
6027
6054
  ].join("::") + "::";
6028
6055
  }
6029
- function Ac(e, t) {
6056
+ function jc(e, t) {
6030
6057
  return [
6031
- wc,
6058
+ Tc,
6032
6059
  e,
6033
6060
  t
6034
6061
  ].join("::") + "::";
6035
6062
  }
6036
- function jc(e) {
6037
- return [wc, e].join("::") + "::";
6063
+ function Mc(e) {
6064
+ return [Tc, e].join("::") + "::";
6038
6065
  }
6039
- var Mc = null;
6040
- function Nc(e) {
6041
- Mc ||= new TextEncoder();
6066
+ var Nc = null;
6067
+ function Pc(e) {
6068
+ Nc ||= new TextEncoder();
6042
6069
  try {
6043
- return Mc.encode(JSON.stringify(e)).length;
6070
+ return Nc.encode(JSON.stringify(e)).length;
6044
6071
  } catch {
6045
6072
  return 0;
6046
6073
  }
6047
6074
  }
6048
- function Pc(e, t, n) {
6075
+ function Fc(e, t, n) {
6049
6076
  let r = e.reduce((e, t) => e + t.bytes, 0);
6050
6077
  if (r <= t) return [];
6051
6078
  let i = t * n, a = [...e].sort((e, t) => e.lastAccessed - t.lastAccessed), o = [];
@@ -6055,7 +6082,7 @@ function Pc(e, t, n) {
6055
6082
  }
6056
6083
  return o;
6057
6084
  }
6058
- function Fc() {
6085
+ function Ic() {
6059
6086
  let e = /* @__PURE__ */ new Map();
6060
6087
  return {
6061
6088
  async get(t) {
@@ -6075,7 +6102,7 @@ function Fc() {
6075
6102
  }
6076
6103
  };
6077
6104
  }
6078
- function Ic(e) {
6105
+ function Lc(e) {
6079
6106
  return new Promise((t, n) => {
6080
6107
  if (typeof indexedDB > "u") {
6081
6108
  n(/* @__PURE__ */ Error("indexedDB 不可用"));
@@ -6136,7 +6163,7 @@ function Ic(e) {
6136
6163
  }, r.onerror = () => n(r.error);
6137
6164
  });
6138
6165
  }
6139
- function Lc(e) {
6166
+ function Rc(e) {
6140
6167
  return {
6141
6168
  async get(t) {
6142
6169
  let n = e.getItem(t);
@@ -6181,12 +6208,12 @@ function Lc(e) {
6181
6208
  }
6182
6209
  };
6183
6210
  }
6184
- function Rc(e, t, n) {
6211
+ function zc(e, t, n) {
6185
6212
  let r = (e.get(t) ?? Promise.resolve()).then(n, n);
6186
6213
  return e.set(t, r.then(() => void 0, () => void 0)), r;
6187
6214
  }
6188
- function zc(e = {}) {
6189
- let t = e.dbName ?? gc, n = e.backend ?? "indexed", r = e.maxBytes ?? Ec(n), i = e.maxBytesPerSession ?? yc, a = e.evictionWatermark ?? bc, o = e.debounceMs ?? xc, s = /* @__PURE__ */ new Set();
6215
+ function Bc(e = {}) {
6216
+ let t = e.dbName ?? _c, n = e.backend ?? "indexed", r = e.maxBytes ?? Dc(n), i = e.maxBytesPerSession ?? bc, a = e.evictionWatermark ?? xc, o = e.debounceMs ?? Sc, s = /* @__PURE__ */ new Set();
6190
6217
  function c(e) {
6191
6218
  for (let t of s) try {
6192
6219
  t(e);
@@ -6199,16 +6226,16 @@ function zc(e = {}) {
6199
6226
  try {
6200
6227
  if (n === "indexed") {
6201
6228
  if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
6202
- l = await Ic(t), d(!0);
6229
+ l = await Lc(t), d(!0);
6203
6230
  } else if (n === "session") {
6204
6231
  if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
6205
- l = Lc(sessionStorage), d(!0);
6232
+ l = Rc(sessionStorage), d(!0);
6206
6233
  } else if (n === "local") {
6207
6234
  if (typeof localStorage > "u") throw Error("localStorage 不可用");
6208
- l = Lc(localStorage), d(!0);
6209
- } else l = Fc(), d(!1);
6235
+ l = Rc(localStorage), d(!0);
6236
+ } else l = Ic(), d(!1);
6210
6237
  } catch (e) {
6211
- l = Fc();
6238
+ l = Ic();
6212
6239
  let t = e instanceof Error ? e.message : String(e);
6213
6240
  d(!1), Promise.resolve().then(() => c({
6214
6241
  type: "degraded",
@@ -6218,10 +6245,10 @@ function zc(e = {}) {
6218
6245
  })();
6219
6246
  let p = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map();
6220
6247
  function g(e, n, r, a) {
6221
- let o = Oc(t, r, a, Cc);
6222
- return Rc(h, o, async () => {
6248
+ let o = kc(t, r, a, wc);
6249
+ return zc(h, o, async () => {
6223
6250
  let t = async () => {
6224
- let t = await l.get(o), s = await l.get(e), u = s == null ? 0 : Nc(s), d = Nc(n), f = (t?.bytes ?? 0) + (d - u);
6251
+ let t = await l.get(o), s = await l.get(e), u = s == null ? 0 : Pc(s), d = Pc(n), f = (t?.bytes ?? 0) + (d - u);
6225
6252
  if (f > i) {
6226
6253
  c({
6227
6254
  type: "quota",
@@ -6243,12 +6270,12 @@ function zc(e = {}) {
6243
6270
  try {
6244
6271
  await t();
6245
6272
  } catch (e) {
6246
- if (Dc(e) && !u) {
6273
+ if (Oc(e) && !u) {
6247
6274
  u = !0;
6248
6275
  try {
6249
6276
  await b();
6250
6277
  } catch {}
6251
- l = Fc(), Promise.resolve().then(() => c({
6278
+ l = Ic(), Promise.resolve().then(() => c({
6252
6279
  type: "degraded",
6253
6280
  reason: "存储配额超限(QuotaExceededError),已淘汰最旧会话并降级内存"
6254
6281
  }));
@@ -6260,7 +6287,7 @@ function zc(e = {}) {
6260
6287
  });
6261
6288
  }
6262
6289
  function _(e, n, r, i) {
6263
- let a = Oc(t, e, n, r), s = p.get(a);
6290
+ let a = kc(t, e, n, r), s = p.get(a);
6264
6291
  s && s.resolve();
6265
6292
  let c = m.get(a);
6266
6293
  return c && clearTimeout(c), new Promise((t) => {
@@ -6287,15 +6314,15 @@ function zc(e = {}) {
6287
6314
  function y() {
6288
6315
  v ||= setTimeout(() => {
6289
6316
  v = null, b();
6290
- }, Sc);
6317
+ }, Cc);
6291
6318
  }
6292
6319
  async function b() {
6293
6320
  let e = [];
6294
- await l.scan(jc(t), (t, n) => {
6321
+ await l.scan(Mc(t), (t, n) => {
6295
6322
  t.endsWith("::__meta__") && e.push(n);
6296
6323
  });
6297
- let n = Pc(e, r, a);
6298
- for (let e of n) await l.clearPrefix(kc(t, e.agentId, e.sessionId)), c({
6324
+ let n = Fc(e, r, a);
6325
+ for (let e of n) await l.clearPrefix(Ac(t, e.agentId, e.sessionId)), c({
6299
6326
  type: "evicted",
6300
6327
  agentId: e.agentId,
6301
6328
  sessionId: e.sessionId,
@@ -6306,13 +6333,13 @@ function zc(e = {}) {
6306
6333
  ready: f,
6307
6334
  async listSessions(e) {
6308
6335
  let n = [];
6309
- return await l.scan(Ac(t, e), (e, t) => {
6336
+ return await l.scan(jc(t, e), (e, t) => {
6310
6337
  e.endsWith("::__meta__") && n.push(t);
6311
6338
  }), n.sort((e, t) => t.lastAccessed - e.lastAccessed);
6312
6339
  },
6313
6340
  async load(e, n) {
6314
- let r = Oc(t, e, n, Cc);
6315
- return await Rc(h, r, async () => {
6341
+ let r = kc(t, e, n, wc);
6342
+ return await zc(h, r, async () => {
6316
6343
  let i = await l.get(r);
6317
6344
  if (!i) return;
6318
6345
  let a = {
@@ -6321,8 +6348,8 @@ function zc(e = {}) {
6321
6348
  todos: [],
6322
6349
  memory: ""
6323
6350
  };
6324
- for (let r of Tc) {
6325
- let i = await l.get(Oc(t, e, n, r));
6351
+ for (let r of Ec) {
6352
+ let i = await l.get(kc(t, e, n, r));
6326
6353
  i != null && (a[r] = i);
6327
6354
  }
6328
6355
  return i.lastAccessed = Date.now(), await l.set(r, i), a;
@@ -6330,12 +6357,12 @@ function zc(e = {}) {
6330
6357
  },
6331
6358
  async save(e, t, n) {
6332
6359
  let r = [];
6333
- for (let i of Tc) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
6360
+ for (let i of Ec) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
6334
6361
  await Promise.all(r);
6335
6362
  },
6336
6363
  async updateTitle(e, n, r) {
6337
- let i = Oc(t, e, n, Cc);
6338
- return Rc(h, i, async () => {
6364
+ let i = kc(t, e, n, wc);
6365
+ return zc(h, i, async () => {
6339
6366
  let e = await l.get(i);
6340
6367
  e && (e.title = r, e.lastAccessed = Date.now(), await l.set(i, e));
6341
6368
  });
@@ -6351,10 +6378,10 @@ function zc(e = {}) {
6351
6378
  })), c({ type: "flush" }), await b();
6352
6379
  },
6353
6380
  async deleteSession(e, n) {
6354
- await l.clearPrefix(kc(t, e, n));
6381
+ await l.clearPrefix(Ac(t, e, n));
6355
6382
  },
6356
6383
  async createSession(e, n, r) {
6357
- let i = r ?? hc(), a = Date.now(), o = {
6384
+ let i = r ?? gc(), a = Date.now(), o = {
6358
6385
  agentId: e,
6359
6386
  sessionId: i,
6360
6387
  createdAt: a,
@@ -6362,7 +6389,7 @@ function zc(e = {}) {
6362
6389
  bytes: 0,
6363
6390
  title: n
6364
6391
  };
6365
- return await l.set(Oc(t, e, i, Cc), o), i;
6392
+ return await l.set(kc(t, e, i, wc), o), i;
6366
6393
  },
6367
6394
  onEvent(e) {
6368
6395
  s.add(e);
@@ -6377,15 +6404,15 @@ function zc(e = {}) {
6377
6404
  }
6378
6405
  //#endregion
6379
6406
  //#region src/core/sdk/optionsResolver.ts
6380
- function Bc(e) {
6381
- return e === void 0 || e === !1 ? null : typeof e == "string" ? zc({ backend: e }) : e.enabled === !1 ? null : zc(e);
6382
- }
6383
6407
  function Vc(e) {
6408
+ return e === void 0 || e === !1 ? null : typeof e == "string" ? Bc({ backend: e }) : e.enabled === !1 ? null : Bc(e);
6409
+ }
6410
+ function Hc(e) {
6384
6411
  return e.dialog ?? {};
6385
6412
  }
6386
6413
  //#endregion
6387
6414
  //#region src/core/capabilities.ts
6388
- var Hc = [
6415
+ var Uc = [
6389
6416
  {
6390
6417
  name: "dataOps",
6391
6418
  defaultOn: !0
@@ -6474,13 +6501,13 @@ var Hc = [
6474
6501
  requires: ["summarization"]
6475
6502
  }
6476
6503
  ];
6477
- function Uc(e) {
6504
+ function Wc(e) {
6478
6505
  let t = {};
6479
- for (let n of Hc) {
6506
+ for (let n of Uc) {
6480
6507
  let r = e?.[n.name];
6481
6508
  t[n.name] = n.defaultOn ? r !== !1 : r === !0;
6482
6509
  }
6483
- for (let e of Hc) if (e.requires && t[e.name]) {
6510
+ for (let e of Uc) if (e.requires && t[e.name]) {
6484
6511
  for (let n of e.requires) if (!t[n]) {
6485
6512
  t[e.name] = !1;
6486
6513
  break;
@@ -6490,7 +6517,7 @@ function Uc(e) {
6490
6517
  }
6491
6518
  //#endregion
6492
6519
  //#region src/core/sdk/events.ts
6493
- function Wc(e) {
6520
+ function Gc(e) {
6494
6521
  let t = /* @__PURE__ */ new Set(), n = (n) => {
6495
6522
  if (n.type !== "approval_request") {
6496
6523
  if (e) try {
@@ -6516,7 +6543,7 @@ function Wc(e) {
6516
6543
  }
6517
6544
  //#endregion
6518
6545
  //#region src/core/sdk/contextPreset.ts
6519
- var Gc = {
6546
+ var Kc = {
6520
6547
  auto: {
6521
6548
  summaryThresholdRatio: .5,
6522
6549
  windowRatio: .4,
@@ -6544,7 +6571,7 @@ var Gc = {
6544
6571
  enableRecall: !0,
6545
6572
  enableLLMSummary: !0
6546
6573
  }
6547
- }, Kc = {
6574
+ }, qc = {
6548
6575
  auto: ["describe_data", "read"],
6549
6576
  conservative: ["describe_data"],
6550
6577
  aggressive: ["describe_data", "read"],
@@ -6555,8 +6582,8 @@ var Gc = {
6555
6582
  "search_data"
6556
6583
  ]
6557
6584
  };
6558
- function qc(e, t) {
6559
- let n = Gc[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
6585
+ function Jc(e, t) {
6586
+ let n = Kc[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
6560
6587
  return {
6561
6588
  ...n,
6562
6589
  ...r,
@@ -6566,7 +6593,7 @@ function qc(e, t) {
6566
6593
  }
6567
6594
  //#endregion
6568
6595
  //#region src/core/sdk/middlewareStack.ts
6569
- var Jc = {
6596
+ var Yc = {
6570
6597
  dataHint: 10,
6571
6598
  usageHints: 20,
6572
6599
  todos: 30,
@@ -6583,17 +6610,17 @@ var Jc = {
6583
6610
  subagents: 140,
6584
6611
  augmentSystem: 150
6585
6612
  };
6586
- function Yc(e) {
6613
+ function Xc(e) {
6587
6614
  return e.map((e, t) => ({
6588
6615
  m: e,
6589
6616
  i: t,
6590
- p: Jc[e.name] ?? Infinity
6617
+ p: Yc[e.name] ?? Infinity
6591
6618
  })).sort((e, t) => e.p - t.p || e.i - t.i).map((e) => e.m);
6592
6619
  }
6593
6620
  //#endregion
6594
6621
  //#region src/core/tools/dataSlotQuery.ts
6595
- var Xc = /[\w$-]/;
6596
- function Zc(e) {
6622
+ var Zc = /[\w$-]/;
6623
+ function Qc(e) {
6597
6624
  let t = [], n = e.trim(), r = +(n[0] === "$");
6598
6625
  for (; r < n.length;) {
6599
6626
  let e = n[r];
@@ -6604,7 +6631,7 @@ function Zc(e) {
6604
6631
  continue;
6605
6632
  }
6606
6633
  let e = "";
6607
- for (; r < n.length && Xc.test(n[r]);) e += n[r++];
6634
+ for (; r < n.length && Zc.test(n[r]);) e += n[r++];
6608
6635
  if (!e) throw Error("JSONPath: .. 后缺属性名");
6609
6636
  t.push({
6610
6637
  type: "descendKey",
@@ -6617,7 +6644,7 @@ function Zc(e) {
6617
6644
  continue;
6618
6645
  }
6619
6646
  let e = "";
6620
- for (; r < n.length && Xc.test(n[r]);) e += n[r++];
6647
+ for (; r < n.length && Zc.test(n[r]);) e += n[r++];
6621
6648
  if (!e) throw Error("JSONPath: . 后缺属性名");
6622
6649
  t.push({
6623
6650
  type: "key",
@@ -6673,7 +6700,7 @@ function Zc(e) {
6673
6700
  }
6674
6701
  return t;
6675
6702
  }
6676
- function Qc(e) {
6703
+ function $c(e) {
6677
6704
  let t = [], n = 0, r = e.trim();
6678
6705
  for (; n < r.length;) {
6679
6706
  let e = r[n];
@@ -6718,7 +6745,7 @@ function Qc(e) {
6718
6745
  }
6719
6746
  return t;
6720
6747
  }
6721
- var $c = class {
6748
+ var el = class {
6722
6749
  toks;
6723
6750
  item;
6724
6751
  pos = 0;
@@ -6754,12 +6781,12 @@ var $c = class {
6754
6781
  return this.next(), e;
6755
6782
  }
6756
6783
  let e = this.operand(), t = this.peek();
6757
- return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), nl(t, e, this.operand())) : el(e);
6784
+ return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), rl(t, e, this.operand())) : tl(e);
6758
6785
  }
6759
6786
  operand() {
6760
6787
  let e = this.next();
6761
6788
  if (e === void 0) throw Error("过滤表达式:缺操作数");
6762
- if (e.startsWith("@")) return tl(e, this.item);
6789
+ if (e.startsWith("@")) return nl(e, this.item);
6763
6790
  if (e[0] === "'" || e[0] === "\"") return e.slice(1, -1);
6764
6791
  if (e === "true") return !0;
6765
6792
  if (e === "false") return !1;
@@ -6769,10 +6796,10 @@ var $c = class {
6769
6796
  throw Error(`过滤表达式:未知操作数 '${e}'`);
6770
6797
  }
6771
6798
  };
6772
- function el(e) {
6799
+ function tl(e) {
6773
6800
  return !!e && e !== 0 && e !== "" && e !== null;
6774
6801
  }
6775
- function tl(e, t) {
6802
+ function nl(e, t) {
6776
6803
  let n = e.split(".").filter((e) => e && e !== "@"), r = t;
6777
6804
  for (let e of n) {
6778
6805
  if (typeof r != "object" || !r) return;
@@ -6780,7 +6807,7 @@ function tl(e, t) {
6780
6807
  }
6781
6808
  return r;
6782
6809
  }
6783
- function nl(e, t, n) {
6810
+ function rl(e, t, n) {
6784
6811
  switch (e) {
6785
6812
  case "==": return t === n;
6786
6813
  case "!=": return t !== n;
@@ -6791,47 +6818,47 @@ function nl(e, t, n) {
6791
6818
  default: return !1;
6792
6819
  }
6793
6820
  }
6794
- function rl(e, t) {
6795
- return new $c(Qc(e), t).parse();
6796
- }
6797
6821
  function il(e, t) {
6798
- return e ? `${e}.${t}` : String(t);
6822
+ return new el($c(e), t).parse();
6799
6823
  }
6800
6824
  function al(e, t) {
6825
+ return e ? `${e}.${t}` : String(t);
6826
+ }
6827
+ function ol(e, t) {
6801
6828
  let n = [{
6802
6829
  path: "",
6803
6830
  value: e
6804
6831
  }];
6805
- for (let e of Zc(t)) {
6832
+ for (let e of Qc(t)) {
6806
6833
  let t = [];
6807
6834
  if (e.type === "key") for (let r of n) r.value != null && typeof r.value == "object" && e.key in r.value && t.push({
6808
- path: il(r.path, e.key),
6835
+ path: al(r.path, e.key),
6809
6836
  value: r.value[e.key]
6810
6837
  });
6811
6838
  else if (e.type === "index") {
6812
6839
  for (let r of n) if (Array.isArray(r.value)) {
6813
6840
  let n = r.value[e.index];
6814
6841
  e.index >= 0 && e.index < r.value.length && t.push({
6815
- path: il(r.path, e.index),
6842
+ path: al(r.path, e.index),
6816
6843
  value: n,
6817
6844
  index: e.index
6818
6845
  });
6819
6846
  }
6820
6847
  } else if (e.type === "wildcard") {
6821
6848
  for (let e of n) if (Array.isArray(e.value)) e.value.forEach((n, r) => t.push({
6822
- path: il(e.path, r),
6849
+ path: al(e.path, r),
6823
6850
  value: n,
6824
6851
  index: r
6825
6852
  }));
6826
6853
  else if (e.value != null && typeof e.value == "object") for (let n of Object.keys(e.value)) t.push({
6827
- path: il(e.path, n),
6854
+ path: al(e.path, n),
6828
6855
  value: e.value[n]
6829
6856
  });
6830
6857
  } else if (e.type === "descendKey") {
6831
6858
  let r = e.key, i = (e) => {
6832
6859
  if (!(e.value == null || typeof e.value != "object")) for (let n of Object.keys(e.value)) {
6833
6860
  let a = {
6834
- path: il(e.path, n),
6861
+ path: al(e.path, n),
6835
6862
  value: e.value[n]
6836
6863
  };
6837
6864
  n === r && t.push(a), i(a);
@@ -6842,7 +6869,7 @@ function al(e, t) {
6842
6869
  let e = (n) => {
6843
6870
  if (!(n.value == null || typeof n.value != "object")) for (let r of Object.keys(n.value)) {
6844
6871
  let i = {
6845
- path: il(n.path, r),
6872
+ path: al(n.path, r),
6846
6873
  value: n.value[r]
6847
6874
  };
6848
6875
  t.push(i), e(i);
@@ -6851,16 +6878,16 @@ function al(e, t) {
6851
6878
  for (let t of n) e(t);
6852
6879
  } else if (e.type === "filter") {
6853
6880
  for (let r of n) if (Array.isArray(r.value)) r.value.forEach((n, i) => {
6854
- rl(e.filter, n) && t.push({
6855
- path: il(r.path, i),
6881
+ il(e.filter, n) && t.push({
6882
+ path: al(r.path, i),
6856
6883
  value: n,
6857
6884
  index: i
6858
6885
  });
6859
6886
  });
6860
6887
  else if (r.value != null && typeof r.value == "object") for (let n of Object.keys(r.value)) {
6861
6888
  let i = r.value[n];
6862
- rl(e.filter, i) && t.push({
6863
- path: il(r.path, n),
6889
+ il(e.filter, i) && t.push({
6890
+ path: al(r.path, n),
6864
6891
  value: i
6865
6892
  });
6866
6893
  }
@@ -6869,7 +6896,7 @@ function al(e, t) {
6869
6896
  }
6870
6897
  return n;
6871
6898
  }
6872
- function ol(e, t) {
6899
+ function sl(e, t) {
6873
6900
  let n = e.length, r = t.length;
6874
6901
  if (!n) return r;
6875
6902
  if (!r) return n;
@@ -6885,7 +6912,7 @@ function ol(e, t) {
6885
6912
  }
6886
6913
  return i[r];
6887
6914
  }
6888
- function sl(e, t, n = {}) {
6915
+ function cl(e, t, n = {}) {
6889
6916
  let r = n.mode || "substring", i = n.limit ?? 50, a = n.matchKey !== !1, o = [], s = null;
6890
6917
  if (r === "regex") try {
6891
6918
  s = new RegExp(t, "i");
@@ -6895,11 +6922,11 @@ function sl(e, t, n = {}) {
6895
6922
  let c = (e, l, u) => {
6896
6923
  if (o.length >= i || e == null) return;
6897
6924
  if (typeof e == "object") {
6898
- if (Array.isArray(e)) e.forEach((e, t) => c(e, il(l, t), String(t)));
6899
- else for (let t of Object.keys(e)) c(e[t], il(l, t), t);
6925
+ if (Array.isArray(e)) e.forEach((e, t) => c(e, al(l, t), String(t)));
6926
+ else for (let t of Object.keys(e)) c(e[t], al(l, t), t);
6900
6927
  return;
6901
6928
  }
6902
- let d = String(e), f = cl(d, t, r, n.fuzzyThreshold ?? 2, s);
6929
+ let d = String(e), f = ll(d, t, r, n.fuzzyThreshold ?? 2, s);
6903
6930
  if (f) {
6904
6931
  o.push({
6905
6932
  path: l,
@@ -6910,7 +6937,7 @@ function sl(e, t, n = {}) {
6910
6937
  return;
6911
6938
  }
6912
6939
  if (a && u) {
6913
- let e = cl(u, t, r, n.fuzzyThreshold ?? 2, s);
6940
+ let e = ll(u, t, r, n.fuzzyThreshold ?? 2, s);
6914
6941
  e && o.push({
6915
6942
  path: l,
6916
6943
  key: u,
@@ -6921,51 +6948,51 @@ function sl(e, t, n = {}) {
6921
6948
  };
6922
6949
  return c(e, ""), o;
6923
6950
  }
6924
- function cl(e, t, n, r, i) {
6951
+ function ll(e, t, n, r, i) {
6925
6952
  let a = e.toLowerCase(), o = t.toLowerCase();
6926
6953
  if (n === "substring") return a.includes(o) ? 1 : null;
6927
6954
  if (n === "regex") return i && i.test(e) ? 1 : null;
6928
6955
  if (n === "fuzzy") {
6929
6956
  if (a.includes(o)) return 2;
6930
- let e = ol(a, o);
6957
+ let e = sl(a, o);
6931
6958
  return e <= r ? r - e + 1 : null;
6932
6959
  }
6933
6960
  return null;
6934
6961
  }
6935
- function ll(e, t, n = 3e3) {
6962
+ function ul(e, t, n = 3e3) {
6936
6963
  return Ta(t, n)(e);
6937
6964
  }
6938
6965
  //#endregion
6939
6966
  //#region src/core/tools/resources.ts
6940
- var ul = "⟦frozen:", dl = "⟦res:", fl = "⟧";
6941
- function pl(e) {
6942
- return `${ul}${e}${fl}`;
6943
- }
6967
+ var dl = "⟦frozen:", fl = "⟦res:", pl = "⟧";
6944
6968
  function ml(e) {
6945
- return `${dl}${e}${fl}`;
6969
+ return `${dl}${e}${pl}`;
6946
6970
  }
6947
6971
  function hl(e) {
6948
- return typeof e == "string" ? e.startsWith(ul) && e.endsWith(fl) ? {
6972
+ return `${fl}${e}${pl}`;
6973
+ }
6974
+ function gl(e) {
6975
+ return typeof e == "string" ? e.startsWith(dl) && e.endsWith(pl) ? {
6949
6976
  type: "frozen",
6950
6977
  path: e.slice(8, e.length - 1)
6951
- } : e.startsWith(dl) && e.endsWith(fl) ? {
6978
+ } : e.startsWith(fl) && e.endsWith(pl) ? {
6952
6979
  type: "res",
6953
6980
  handle: e.slice(5, e.length - 1)
6954
6981
  } : null : null;
6955
6982
  }
6956
- function gl(e) {
6983
+ function _l(e) {
6957
6984
  return String(e ?? "").trim().replace(/^\.+/, "");
6958
6985
  }
6959
- function _l(e) {
6986
+ function vl(e) {
6960
6987
  let t = 5381;
6961
6988
  for (let n = 0; n < e.length; n++) t = (t * 33 ^ e.charCodeAt(n)) >>> 0;
6962
6989
  return (t >>> 0).toString(16).padStart(8, "0").slice(0, 8);
6963
6990
  }
6964
- function vl(e, t) {
6991
+ function yl(e, t) {
6965
6992
  return e === t ? !0 : e && t && typeof e == "object" && typeof t == "object" ? JSON.stringify(e) === JSON.stringify(t) : !1;
6966
6993
  }
6967
- function yl(e, t) {
6968
- let n = gl(e);
6994
+ function bl(e, t) {
6995
+ let n = _l(e);
6969
6996
  if (!n) return;
6970
6997
  let r = t.get(n);
6971
6998
  if (r) return {
@@ -6985,7 +7012,7 @@ function yl(e, t) {
6985
7012
  }));
6986
7013
  return i;
6987
7014
  }
6988
- var bl = class {
7015
+ var xl = class {
6989
7016
  vfs;
6990
7017
  constructor(e) {
6991
7018
  this.vfs = e;
@@ -6994,7 +7021,7 @@ var bl = class {
6994
7021
  return `resources/${e}.json`;
6995
7022
  }
6996
7023
  ensure(e, t, n) {
6997
- let r = _l(e), i = {
7024
+ let r = vl(e), i = {
6998
7025
  path: e,
6999
7026
  mode: n,
7000
7027
  value: t,
@@ -7006,7 +7033,7 @@ var bl = class {
7006
7033
  }, r;
7007
7034
  }
7008
7035
  get(e) {
7009
- return this.readEntry(this.key(e)) || this.readEntry(this.key(_l(e)));
7036
+ return this.readEntry(this.key(e)) || this.readEntry(this.key(vl(e)));
7010
7037
  }
7011
7038
  readEntry(e) {
7012
7039
  let t = this.vfs.files[e];
@@ -7022,7 +7049,7 @@ var bl = class {
7022
7049
  this.ensure(e, t, n?.mode ?? "verbatim");
7023
7050
  }
7024
7051
  delete(e) {
7025
- let t = this.get(e)?.handle ?? _l(e), n = this.key(t), r = !!this.vfs.files[n];
7052
+ let t = this.get(e)?.handle ?? vl(e), n = this.key(t), r = !!this.vfs.files[n];
7026
7053
  return r && delete this.vfs.files[n], r;
7027
7054
  }
7028
7055
  list() {
@@ -7042,7 +7069,7 @@ var bl = class {
7042
7069
  for (let e of Object.keys(this.vfs.files)) e.startsWith("resources/") && delete this.vfs.files[e];
7043
7070
  }
7044
7071
  };
7045
- function xl(e) {
7072
+ function Sl(e) {
7046
7073
  let { jp: t, resolved: n, resourcesByPath: r, resourceStore: i } = e;
7047
7074
  if (!r.size) return n;
7048
7075
  let a = !1;
@@ -7056,14 +7083,14 @@ function xl(e) {
7056
7083
  if (t !== "" && e !== t && !e.startsWith(t + ".")) continue;
7057
7084
  if (e === t) {
7058
7085
  if (o === void 0) continue;
7059
- return n.mode === "freeze" ? pl(e) : i ? ml(i.ensure(e, o, "verbatim")) : o;
7086
+ return n.mode === "freeze" ? ml(e) : i ? hl(i.ensure(e, o, "verbatim")) : o;
7060
7087
  }
7061
7088
  let r = t === "" ? e : e.slice(t.length + 1), a = Z(o, r);
7062
- a !== void 0 && (n.mode === "freeze" ? ws(o, r, pl(e)) : i && ws(o, r, ml(i.ensure(e, a, "verbatim"))));
7089
+ a !== void 0 && (n.mode === "freeze" ? ws(o, r, ml(e)) : i && ws(o, r, hl(i.ensure(e, a, "verbatim"))));
7063
7090
  }
7064
7091
  return o;
7065
7092
  }
7066
- function Sl(e, t, n, r) {
7093
+ function Cl(e, t, n, r) {
7067
7094
  if (!r) return {
7068
7095
  code: "RESOURCE_NOT_FOUND",
7069
7096
  message: `句柄 "${e}" 无法展开(资源池未启用)`,
@@ -7074,7 +7101,7 @@ function Sl(e, t, n, r) {
7074
7101
  code: "RESOURCE_NOT_FOUND",
7075
7102
  message: `字段 "${t}" 在 bind 中已不存在,无法展开句柄 "${e}"`,
7076
7103
  hint: "该字段可能已被删除或 restore 到不含此字段的快照;重新 read 确认当前结构"
7077
- } : vl(i.value, n) ? { value: i.value } : (r.update(t, n), { value: n }) : n === void 0 ? {
7104
+ } : yl(i.value, n) ? { value: i.value } : (r.update(t, n), { value: n }) : n === void 0 ? {
7078
7105
  code: "RESOURCE_NOT_FOUND",
7079
7106
  message: `句柄 "${e}" 不存在(字段 "${t}" 可能未注册或已被删除)`,
7080
7107
  hint: "重新 read 该字段触发懒注册"
@@ -7084,7 +7111,7 @@ function Sl(e, t, n, r) {
7084
7111
  hint: "重新 read 该字段触发懒注册重建句柄,再写回新句柄 ⟦res:<handle>⟧"
7085
7112
  };
7086
7113
  }
7087
- function Cl(e, t) {
7114
+ function wl(e, t) {
7088
7115
  let n = t.getBind();
7089
7116
  for (let [r, i] of t.resourcesByPath) {
7090
7117
  let a = Z(n, r), o = Z(e, r);
@@ -7093,11 +7120,11 @@ function Cl(e, t) {
7093
7120
  continue;
7094
7121
  }
7095
7122
  if (i.mode === "freeze") {
7096
- if (o === pl(r)) {
7123
+ if (o === ml(r)) {
7097
7124
  ws(e, r, a);
7098
7125
  continue;
7099
7126
  }
7100
- if (!vl(o, a)) return {
7127
+ if (!yl(o, a)) return {
7101
7128
  ok: !1,
7102
7129
  code: "FROZEN_FIELD",
7103
7130
  path: r,
@@ -7105,9 +7132,9 @@ function Cl(e, t) {
7105
7132
  hint: "该字段由系统/集成方维护,LLM 不得改动。如需展示其值用 resource_get({path}) 取真值"
7106
7133
  };
7107
7134
  } else {
7108
- let n = hl(o);
7135
+ let n = gl(o);
7109
7136
  if (n && n.type === "res") {
7110
- let i = Sl(n.handle, r, a, t.resourceStore);
7137
+ let i = Cl(n.handle, r, a, t.resourceStore);
7111
7138
  if ("value" in i) {
7112
7139
  ws(e, r, i.value);
7113
7140
  continue;
@@ -7120,7 +7147,7 @@ function Cl(e, t) {
7120
7147
  hint: i.hint
7121
7148
  };
7122
7149
  }
7123
- if (!vl(o, a)) return {
7150
+ if (!yl(o, a)) return {
7124
7151
  ok: !1,
7125
7152
  code: "VERBATIM_MISMATCH",
7126
7153
  path: r,
@@ -7131,7 +7158,7 @@ function Cl(e, t) {
7131
7158
  }
7132
7159
  return { ok: !0 };
7133
7160
  }
7134
- function wl(e, t, n) {
7161
+ function Tl(e, t, n) {
7135
7162
  let r = t === void 0 ? e.message : `patches[${t}]${n ? ` @ "${n}"` : ""}: ${e.message}`;
7136
7163
  return Y({
7137
7164
  code: e.code,
@@ -7144,28 +7171,28 @@ function wl(e, t, n) {
7144
7171
  } }
7145
7172
  });
7146
7173
  }
7147
- function Tl(e) {
7174
+ function El(e) {
7148
7175
  let { value: t, ctx: n } = e;
7149
7176
  if (!n || !n.resourcesByPath.size) return {
7150
7177
  ok: !0,
7151
7178
  value: t
7152
7179
  };
7153
- let r = Es(t), i = Cl(r, n);
7180
+ let r = Es(t), i = wl(r, n);
7154
7181
  return i.ok ? {
7155
7182
  ok: !0,
7156
7183
  value: r
7157
7184
  } : {
7158
7185
  ok: !1,
7159
- error: wl(i)
7186
+ error: Tl(i)
7160
7187
  };
7161
7188
  }
7162
- function El(e) {
7189
+ function Dl(e) {
7163
7190
  let { patches: t, clone: n, ctx: r } = e;
7164
7191
  if (!r || !r.resourcesByPath.size) return { ok: !0 };
7165
7192
  for (let e = 0; e < t.length; e++) {
7166
7193
  let n = t[e];
7167
7194
  if (n.op === "remove") {
7168
- let t = yl(n.jsonPath || "", r.resourcesByPath);
7195
+ let t = bl(n.jsonPath || "", r.resourcesByPath);
7169
7196
  if (t) {
7170
7197
  let r = t.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED", i = t.spec.mode === "freeze" ? "冻结字段不可删。如需移除请联系集成方调整 data.resources 配置" : "verbatim 字段不可直接删;先 resource_delete({path}) 释放资源保护后再删";
7171
7198
  return {
@@ -7184,27 +7211,27 @@ function El(e) {
7184
7211
  }
7185
7212
  }
7186
7213
  }
7187
- let i = Cl(n, r);
7214
+ let i = wl(n, r);
7188
7215
  if (!i.ok) {
7189
- let e = Dl(i.path, t);
7216
+ let e = Ol(i.path, t);
7190
7217
  return {
7191
7218
  ok: !1,
7192
- error: wl(i, e >= 0 ? e : void 0, e >= 0 ? t[e].jsonPath : void 0)
7219
+ error: Tl(i, e >= 0 ? e : void 0, e >= 0 ? t[e].jsonPath : void 0)
7193
7220
  };
7194
7221
  }
7195
7222
  return { ok: !0 };
7196
7223
  }
7197
- function Dl(e, t) {
7198
- let n = gl(e);
7224
+ function Ol(e, t) {
7225
+ let n = _l(e);
7199
7226
  for (let e = 0; e < t.length; e++) {
7200
- let r = gl(t[e].jsonPath || "");
7227
+ let r = _l(t[e].jsonPath || "");
7201
7228
  if (r && (r === n || n.startsWith(r + ".") || r.startsWith(n + "."))) return e;
7202
7229
  }
7203
7230
  return -1;
7204
7231
  }
7205
7232
  //#endregion
7206
7233
  //#region src/core/tools/dataOps.ts
7207
- var Ol = /* @__PURE__ */ new Set([
7234
+ var kl = /* @__PURE__ */ new Set([
7208
7235
  "describe_data",
7209
7236
  "get_data",
7210
7237
  "set_data",
@@ -7218,14 +7245,14 @@ var Ol = /* @__PURE__ */ new Set([
7218
7245
  "resource_update",
7219
7246
  "resource_list",
7220
7247
  "resource_delete"
7221
- ]), kl = /* @__PURE__ */ new Set(["read", "write"]);
7222
- function Al(e, t = "simple") {
7223
- return t === "advanced" ? e : t === "minimal" ? e.filter((e) => kl.has(e.name)) : e.filter((e) => !Ol.has(e.name));
7248
+ ]), Al = /* @__PURE__ */ new Set(["read", "write"]);
7249
+ function jl(e, t = "simple") {
7250
+ return t === "advanced" ? e : t === "minimal" ? e.filter((e) => Al.has(e.name)) : e.filter((e) => !kl.has(e.name));
7224
7251
  }
7225
- function jl(e) {
7252
+ function Ml(e) {
7226
7253
  let { bindRef: t, schema: n, allowKeys: r, snapshots: i, maxSnapshots: a, audit: o, dryRun: s, op: c = "set", protectedCtx: l } = e, u = e.value;
7227
7254
  if (l) {
7228
- let e = Tl({
7255
+ let e = El({
7229
7256
  value: u,
7230
7257
  ctx: l
7231
7258
  });
@@ -7270,7 +7297,7 @@ function jl(e) {
7270
7297
  data: d.data
7271
7298
  };
7272
7299
  }
7273
- function Ml(e) {
7300
+ function Nl(e) {
7274
7301
  let { bindRef: t, patches: n, schema: r, allowKeys: i, snapshots: a, maxSnapshots: o, markDataDirty: s, schemaErrorMode: c = "zod", snapshotLabel: l, dryRun: u, protectedCtx: d } = e, f = Es(t), p = [];
7275
7302
  for (let e = 0; e < n.length; e++) {
7276
7303
  let t = n[e], a = t.jsonPath || "";
@@ -7323,7 +7350,7 @@ function Ml(e) {
7323
7350
  });
7324
7351
  }
7325
7352
  if (d) {
7326
- let e = El({
7353
+ let e = Dl({
7327
7354
  patches: n,
7328
7355
  clone: f,
7329
7356
  ctx: d
@@ -7363,41 +7390,41 @@ function Ml(e) {
7363
7390
  clone: f
7364
7391
  };
7365
7392
  }
7366
- function Nl(e) {
7393
+ function Pl(e) {
7367
7394
  return e < 1024 ? `${e}B` : e < 1024 * 1024 ? `${(e / 1024).toFixed(1)}KB` : `${(e / (1024 * 1024)).toFixed(1)}MB`;
7368
7395
  }
7369
- function Pl(e, t, n, r) {
7396
+ function Fl(e, t, n, r) {
7370
7397
  if (!t || !n.length || typeof e != "object" || !e) return e;
7371
7398
  let i = new Set(n.map((e) => e.field)), a = Es(e);
7372
7399
  return (function e(t) {
7373
7400
  if (Array.isArray(t)) for (let n of t) e(n);
7374
7401
  else if (t && typeof t == "object") for (let n of Object.keys(t)) {
7375
7402
  let a = t[n];
7376
- typeof a == "string" && i.has(n) && a.length >= r ? t[n] = `<${n} ${Nl(a.length)}>` : e(a);
7403
+ typeof a == "string" && i.has(n) && a.length >= r ? t[n] = `<${n} ${Pl(a.length)}>` : e(a);
7377
7404
  }
7378
7405
  })(a), a;
7379
7406
  }
7380
- var Fl = 0;
7381
- function Il() {
7382
- return Fl++, "c_" + Math.random().toString(36).slice(2, 8) + Fl.toString(36);
7407
+ var Il = 0;
7408
+ function Ll() {
7409
+ return Il++, "c_" + Math.random().toString(36).slice(2, 8) + Il.toString(36);
7383
7410
  }
7384
- function Ll(e, t) {
7411
+ function Rl(e, t) {
7385
7412
  if (!(!e || typeof e != "object")) for (let n of t) {
7386
7413
  let t = Z(e, n);
7387
- if (Array.isArray(t)) for (let e of t) e && typeof e == "object" && !("__pgId" in e) && (e.__pgId = Il());
7414
+ if (Array.isArray(t)) for (let e of t) e && typeof e == "object" && !("__pgId" in e) && (e.__pgId = Ll());
7388
7415
  }
7389
7416
  }
7390
- function Rl(e) {
7417
+ function zl(e) {
7391
7418
  (function e(t) {
7392
7419
  if (Array.isArray(t)) t.forEach(e);
7393
7420
  else if (t && typeof t == "object") for (let n of Object.keys(t)) n.startsWith("__pg") ? delete t[n] : e(t[n]);
7394
7421
  })(e);
7395
7422
  }
7396
- function zl(e, n = {}) {
7397
- let i = n.pgIdPaths ?? [], a = i.length ? (e) => Ll(e, i) : void 0, o = i.length ? Qi(e.schema, i).schema : e.schema, s = e.bind, c = e.description ?? "主数据对象", l = Ii(o), u = /* @__PURE__ */ new Map(), d = n.vfsStore ? new bl(n.vfsStore) : void 0;
7423
+ function Bl(e, n = {}) {
7424
+ let i = n.pgIdPaths ?? [], a = i.length ? (e) => Rl(e, i) : void 0, o = i.length ? Qi(e.schema, i).schema : e.schema, s = e.bind, c = e.description ?? "主数据对象", l = Ii(o), u = /* @__PURE__ */ new Map(), d = n.vfsStore ? new xl(n.vfsStore) : void 0;
7398
7425
  function f(e) {
7399
7426
  if (u.clear(), e) for (let t of e) {
7400
- let e = gl(t.path);
7427
+ let e = _l(t.path);
7401
7428
  u.set(e, {
7402
7429
  path: e,
7403
7430
  mode: t.mode
@@ -7469,7 +7496,7 @@ function zl(e, n = {}) {
7469
7496
  return e;
7470
7497
  },
7471
7498
  createResource: d ? (e, t) => {
7472
- let n = gl(e), r = u.get(n), i = t === void 0 ? Z(s, n) : t;
7499
+ let n = _l(e), r = u.get(n), i = t === void 0 ? Z(s, n) : t;
7473
7500
  return d.ensure(n, i, r?.mode ?? "verbatim");
7474
7501
  } : void 0,
7475
7502
  getResource: d ? (e) => {
@@ -7482,7 +7509,7 @@ function zl(e, n = {}) {
7482
7509
  } : void 0;
7483
7510
  } : void 0,
7484
7511
  updateResource: d ? (e, t) => {
7485
- let n = gl(e);
7512
+ let n = _l(e);
7486
7513
  d.update(n, t), ws(s, n, t), w();
7487
7514
  } : void 0,
7488
7515
  deleteResource: d ? (e) => d.delete(e) : void 0,
@@ -7543,7 +7570,7 @@ function zl(e, n = {}) {
7543
7570
  hint: "主数据仅暴露 schema 声明的字段;若需操作该字段,集成方需在 schema 中声明它"
7544
7571
  });
7545
7572
  let n = t ? Z(s, t) : s;
7546
- !t && l && (n = Bi(n, o)), p && (n = xl({
7573
+ !t && l && (n = Bi(n, o)), p && (n = Sl({
7547
7574
  jp: t,
7548
7575
  resolved: n,
7549
7576
  resourcesByPath: p.resourcesByPath,
@@ -7560,7 +7587,7 @@ function zl(e, n = {}) {
7560
7587
  if (n !== null) return n;
7561
7588
  let r = Ds(e);
7562
7589
  if (r.parseError) return Kr("", e, r.parseError);
7563
- let i = jl({
7590
+ let i = Ml({
7564
7591
  bindRef: s,
7565
7592
  value: r.parsed,
7566
7593
  schema: o,
@@ -7604,7 +7631,7 @@ function zl(e, n = {}) {
7604
7631
  message: `edit 仅适用于对象/数组主数据,当前是 ${s === void 0 ? "undefined" : typeof s}`,
7605
7632
  hint: "叶子(原始类型)请用 set_data 整体设置"
7606
7633
  });
7607
- let u = Ml({
7634
+ let u = Nl({
7608
7635
  bindRef: s,
7609
7636
  patches: [{
7610
7637
  op: t,
@@ -7668,7 +7695,7 @@ function zl(e, n = {}) {
7668
7695
  hint: "仅 schema 声明的 key 可删"
7669
7696
  });
7670
7697
  if (p) {
7671
- let t = yl(e, p.resourcesByPath);
7698
+ let t = bl(e, p.resourcesByPath);
7672
7699
  if (t) return Y({
7673
7700
  code: t.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED",
7674
7701
  message: `delete_data @ "${e}" 命中受保护字段 "${t.protectedPath}"(${t.spec.mode}),不可删除`,
@@ -7771,7 +7798,7 @@ function zl(e, n = {}) {
7771
7798
  });
7772
7799
  let n = l ? Bi(s, o) : s, r;
7773
7800
  try {
7774
- r = al(n, e);
7801
+ r = ol(n, e);
7775
7802
  } catch (t) {
7776
7803
  return Y({
7777
7804
  code: "JSONPATH_SYNTAX",
@@ -7795,7 +7822,7 @@ function zl(e, n = {}) {
7795
7822
  message: "主数据为空,无可搜索内容"
7796
7823
  });
7797
7824
  try {
7798
- let a = sl(l ? Bi(s, o) : s, e, {
7825
+ let a = cl(l ? Bi(s, o) : s, e, {
7799
7826
  mode: t,
7800
7827
  fuzzyThreshold: n,
7801
7828
  matchKey: r,
@@ -7845,7 +7872,7 @@ function zl(e, n = {}) {
7845
7872
  e && (i = Bi(i, e));
7846
7873
  }
7847
7874
  } else i = l ? Bi(s, o) : s;
7848
- let a = Es(i), c = await ll(a, e, r && JSON.stringify(a).length > 1e5 ? 8e3 : 3e3);
7875
+ let a = Es(i), c = await ul(a, e, r && JSON.stringify(a).length > 1e5 ? 8e3 : 3e3);
7849
7876
  if (!c.ok) {
7850
7877
  let t = /超时/.test(c.error || "");
7851
7878
  return Y({
@@ -7861,7 +7888,7 @@ function zl(e, n = {}) {
7861
7888
  if (t === "transform") {
7862
7889
  let e = c.result;
7863
7890
  if (r) {
7864
- let t = Ml({
7891
+ let t = Nl({
7865
7892
  bindRef: s,
7866
7893
  patches: [{
7867
7894
  op: "set",
@@ -7889,7 +7916,7 @@ function zl(e, n = {}) {
7889
7916
  message: `主数据 bind 为原始类型(${s === null ? "null" : typeof s}),eval transform(patches) 无法就地替换`,
7890
7917
  hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
7891
7918
  });
7892
- let t = Ml({
7919
+ let t = Nl({
7893
7920
  bindRef: s,
7894
7921
  patches: e.patches,
7895
7922
  schema: o,
@@ -7909,7 +7936,7 @@ function zl(e, n = {}) {
7909
7936
  }
7910
7937
  let t = e;
7911
7938
  if (p) {
7912
- let e = Tl({
7939
+ let e = El({
7913
7940
  value: t,
7914
7941
  ctx: p
7915
7942
  });
@@ -7958,7 +7985,7 @@ function zl(e, n = {}) {
7958
7985
  e && (a = Bi(a, e));
7959
7986
  }
7960
7987
  let c = a;
7961
- if (p && (c = xl({
7988
+ if (p && (c = Sl({
7962
7989
  jp: t,
7963
7990
  resolved: c,
7964
7991
  resourcesByPath: p.resourcesByPath,
@@ -7968,7 +7995,7 @@ function zl(e, n = {}) {
7968
7995
  } catch (e) {
7969
7996
  return `- ${t}: [READ_INTERCEPT: ${e.message}]`;
7970
7997
  }
7971
- return r && r.length && (c = Os(c, r)), i != null && (c = ks(c, i)), c = Pl(c, _ === "", S, x), c === void 0 ? `- ${t} = (undefined)` : `- ${t} = ${Q(c)}`;
7998
+ return r && r.length && (c = Os(c, r)), i != null && (c = ks(c, i)), c = Fl(c, _ === "", S, x), c === void 0 ? `- ${t} = (undefined)` : `- ${t} = ${Q(c)}`;
7972
7999
  });
7973
8000
  return `多路径读取(共 ${t.length} 项,hash=${d}):\n${e.join("\n")}`;
7974
8001
  }
@@ -7990,7 +8017,7 @@ function zl(e, n = {}) {
7990
8017
  e && (m = Bi(m, e));
7991
8018
  }
7992
8019
  let h = m;
7993
- if (p && (h = xl({
8020
+ if (p && (h = Sl({
7994
8021
  jp: f,
7995
8022
  resolved: h,
7996
8023
  resourcesByPath: p.resourcesByPath,
@@ -8003,7 +8030,7 @@ function zl(e, n = {}) {
8003
8030
  message: `read 拦截器抛错: ${e.message}`
8004
8031
  });
8005
8032
  }
8006
- r && r.length && (h = Os(h, r)), i != null && (h = ks(h, i)), h = Pl(h, _ === "", S, x);
8033
+ r && r.length && (h = Os(h, r)), i != null && (h = ks(h, i)), h = Fl(h, _ === "", S, x);
8007
8034
  let g = e ? "" : `主数据说明: ${c}\n格式: 写入值需为 JSON,且通过声明的 schema 校验(校验失败时 write 会返回结构化错误)。字段约束(类型/min/max/enum/必填/默认)见 systemPrompt「可操作数据」段,或用 schema_data({ jsonPath }) 按需查。\n\n`, v = r && r.length ? `(字段裁剪:${r.join(",")})` : "", b = i == null ? "" : `(深度≤${i})`, C = v || b ? ` ${v}${b}` : "";
8008
8035
  if ((a !== void 0 || u !== void 0) && Array.isArray(h)) {
8009
8036
  let e = h.length, t = Math.max(0, a ?? 0), n = Math.min(200, Math.max(1, u ?? 50)), r = h.slice(t, t + n), i = t + n < e;
@@ -8076,7 +8103,7 @@ function zl(e, n = {}) {
8076
8103
  hint: "仅 schema 声明的 key 可删"
8077
8104
  });
8078
8105
  if (p) {
8079
- let e = yl(t.jsonPath, p.resourcesByPath);
8106
+ let e = bl(t.jsonPath, p.resourcesByPath);
8080
8107
  if (e) return Y({
8081
8108
  code: e.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED",
8082
8109
  message: `write delete @ "${t.jsonPath}" 命中受保护字段 "${e.protectedPath}"(${e.spec.mode}),不可删除`,
@@ -8109,7 +8136,7 @@ function zl(e, n = {}) {
8109
8136
  op: t.op ?? "set",
8110
8137
  jsonPath: t.jsonPath || "",
8111
8138
  value: d
8112
- }]), i = Ml({
8139
+ }]), i = Nl({
8113
8140
  bindRef: s,
8114
8141
  patches: n,
8115
8142
  schema: o,
@@ -8126,13 +8153,13 @@ function zl(e, n = {}) {
8126
8153
  detail: `${i.applied.length} 个 patch${i.applied.length > 1 ? "(批量)" : ""}`,
8127
8154
  value: i.applied.map((e) => `${e.op}@${e.jp}`),
8128
8155
  timestamp: Date.now()
8129
- }), a && (a(s), w()), y($(s)), Rl(i.clone), `已 write(edit) 主数据(${i.applied.length} 个 patch)。当前值:${Q(i.clone, 600)} (新 hash=${$(s)})`) : i.error;
8156
+ }), a && (a(s), w()), y($(s)), zl(i.clone), `已 write(edit) 主数据(${i.applied.length} 个 patch)。当前值:${Q(i.clone, 600)} (新 hash=${$(s)})`) : i.error;
8130
8157
  }
8131
8158
  let _ = Ds(d);
8132
8159
  if (_.parseError) return Kr("", d, _.parseError);
8133
8160
  let x = await O("set", g);
8134
8161
  if (x !== null) return x;
8135
- let S = jl({
8162
+ let S = Ml({
8136
8163
  bindRef: s,
8137
8164
  value: _.parsed,
8138
8165
  schema: o,
@@ -8148,7 +8175,7 @@ function zl(e, n = {}) {
8148
8175
  if (c) return `dryRun(set): schema 校验通过。预览新值:${Q(S.data, 600)}。未实际写入、未入快照。`;
8149
8176
  a && (a(s), w());
8150
8177
  let C = $(s);
8151
- return y(C), Rl(S.data), `已 write(set) 主数据 = ${Q(S.data, 600)} (新 hash=${C})${l ? "(白名单模式:仅更新 schema 声明字段,未声明字段保留)" : ""}`;
8178
+ return y(C), zl(S.data), `已 write(set) 主数据 = ${Q(S.data, 600)} (新 hash=${C})${l ? "(白名单模式:仅更新 schema 声明字段,未声明字段保留)" : ""}`;
8152
8179
  }, {
8153
8180
  name: "write",
8154
8181
  description: "写入主数据(高层入口,合并 set/edit/delete + 自动乐观锁 + 自动快照)。四种意图:① 整体替换 write({ value }) value 为整个 JSON 对象(推荐)或字符串;② 单个增量 patch write({ patch:{op,jsonPath,value} }) op=set/remove/merge/append,jsonPath 相对主数据根(如 components.0.props.title),patch.value 是该 patch 的值(自带,与 patches 一致——string/number 直传该字段新值,勿包成 {字段:值} 对象);也兼容 write({ value, patch:{op,jsonPath} }) 顶层 value 形式(向后兼容,但优先用 patch.value 避免与①整体 set 的 value 语义混淆);③ 批量增量 write({ patches:[{op,jsonPath,value},...] }) 一次原子应用多个 patch(任一失败整体不写入,适合一次改多处);④ 删除 write({ patch:{jsonPath}, del:true })。写入自动经 schema 校验(失败不写)+ 自动存快照(可 restore_data 回退)+ 自动乐观锁(autoLock,用你最后 read 到的 hash 比对,冲突则 VERSION_CONFLICT)。集成方可能经 write 拦截器校验/转换/拒绝(批量模式拦截器收到 {patches},返回新 patches 数组或 {error})。dryRun(可选):预检模式,走完整校验链(schema + 白名单 + patch 应用到 clone)但不落盘/入快照,返回预览(四意图均支持,复杂改动先看会改成啥、能否过 schema)。",
@@ -8263,7 +8290,7 @@ function zl(e, n = {}) {
8263
8290
  }
8264
8291
  let u = await O("set", n || (b ? v() : void 0));
8265
8292
  if (u !== null) return u;
8266
- let d = jl({
8293
+ let d = Ml({
8267
8294
  bindRef: s,
8268
8295
  value: c,
8269
8296
  schema: o,
@@ -8295,7 +8322,7 @@ function zl(e, n = {}) {
8295
8322
  message: "未提供 path 或有效 handle",
8296
8323
  hint: "传 path(受保护字段)或 handle(占位符 ⟦res:handle⟧ 里的句柄)"
8297
8324
  });
8298
- let r = gl(n);
8325
+ let r = _l(n);
8299
8326
  if (!u.has(r)) return Y({
8300
8327
  code: "RESOURCE_NOT_FOUND",
8301
8328
  message: `"${n}" 不是受保护字段`,
@@ -8334,7 +8361,7 @@ function zl(e, n = {}) {
8334
8361
  message: "resource_update 需要 path",
8335
8362
  hint: "传要更新的 verbatim 受保护字段路径"
8336
8363
  });
8337
- let n = gl(e), r = u.get(n);
8364
+ let n = _l(e), r = u.get(n);
8338
8365
  if (!r) return Y({
8339
8366
  code: "RESOURCE_NOT_FOUND",
8340
8367
  message: `"${e}" 不是受保护字段`,
@@ -8422,8 +8449,8 @@ function zl(e, n = {}) {
8422
8449
  }
8423
8450
  //#endregion
8424
8451
  //#region src/core/tools/fetchDoc.ts
8425
- var Bl = 3e4, Vl = [r(async ({ url: e, as: t }) => {
8426
- let n = new AbortController(), r = setTimeout(() => n.abort(), Bl);
8452
+ var Vl = 3e4, Hl = [r(async ({ url: e, as: t }) => {
8453
+ let n = new AbortController(), r = setTimeout(() => n.abort(), Vl);
8427
8454
  try {
8428
8455
  let r = await fetch(e, {
8429
8456
  method: "GET",
@@ -8440,7 +8467,7 @@ var Bl = 3e4, Vl = [r(async ({ url: e, as: t }) => {
8440
8467
  ].join("\n");
8441
8468
  } catch (t) {
8442
8469
  let r = t?.message || String(t);
8443
- return n.signal.aborted ? `获取失败:请求超时(${Bl}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
8470
+ return n.signal.aborted ? `获取失败:请求超时(${Vl}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
8444
8471
  } finally {
8445
8472
  clearTimeout(r);
8446
8473
  }
@@ -8451,7 +8478,7 @@ var Bl = 3e4, Vl = [r(async ({ url: e, as: t }) => {
8451
8478
  url: t.string().describe("要抓取的 URL(同源或已配 CORS)"),
8452
8479
  as: t.enum(["text", "markdown"]).optional().describe("返回格式标签,默认 text")
8453
8480
  })
8454
- })], Hl = [
8481
+ })], Ul = [
8455
8482
  "id",
8456
8483
  "class",
8457
8484
  "href",
@@ -8463,12 +8490,12 @@ var Bl = 3e4, Vl = [r(async ({ url: e, as: t }) => {
8463
8490
  "aria-label",
8464
8491
  "name",
8465
8492
  "type"
8466
- ], Ul = /^(value|srcdoc|formaction|on\w+)$/i, Wl = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session/i;
8467
- function Gl(e, t) {
8493
+ ], Wl = /^(value|srcdoc|formaction|on\w+)$/i, Gl = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session/i;
8494
+ function Kl(e, t) {
8468
8495
  if (!e) return null;
8469
- let { depth: n, attrs: r, includeText: i = !0 } = t, a = r !== void 0, o = r ?? Hl, s = (e) => {
8496
+ let { depth: n, attrs: r, includeText: i = !0 } = t, a = r !== void 0, o = r ?? Ul, s = (e) => {
8470
8497
  let t = {};
8471
- for (let n of Array.from(e.attributes)) (a ? o.includes(n.name) : o.includes(n.name) || n.name.startsWith("data-")) && (Ul.test(n.name) || Wl.test(n.name) || (t[n.name] = n.value));
8498
+ for (let n of Array.from(e.attributes)) (a ? o.includes(n.name) : o.includes(n.name) || n.name.startsWith("data-")) && (Wl.test(n.name) || Gl.test(n.name) || (t[n.name] = n.value));
8472
8499
  return t;
8473
8500
  }, c = (e, t) => {
8474
8501
  let n = {
@@ -8484,10 +8511,10 @@ function Gl(e, t) {
8484
8511
  };
8485
8512
  return c(e, n);
8486
8513
  }
8487
- var Kl = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
8514
+ var ql = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
8488
8515
  let i = e ? document.querySelector(e) : document.body;
8489
8516
  if (!i) return `未找到匹配元素:selector="${e}"`;
8490
- let a = Gl(i, {
8517
+ let a = Kl(i, {
8491
8518
  depth: t ?? 3,
8492
8519
  attrs: n,
8493
8520
  includeText: r ?? !0
@@ -8502,14 +8529,14 @@ var Kl = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
8502
8529
  attrs: t.array(t.string()).optional().describe("属性白名单(传了 = 严格白名单;不传 = 默认常用 + data-*)"),
8503
8530
  includeText: t.boolean().optional().describe("是否包含直接文本(默认 true)")
8504
8531
  })
8505
- }), ql = [Kl];
8532
+ }), Jl = [ql];
8506
8533
  //#endregion
8507
8534
  //#region src/core/tools/envTool.ts
8508
- function Jl(e) {
8535
+ function Yl(e) {
8509
8536
  let t = e;
8510
8537
  return typeof t.tagName == "string" || typeof t.nodeType == "number" && typeof t.nodeName == "string";
8511
8538
  }
8512
- function Yl(e, t = 3, n = 2e3, r) {
8539
+ function Xl(e, t = 3, n = 2e3, r) {
8513
8540
  if (e == null) return e;
8514
8541
  if (typeof e == "string") return e.length > n ? e.slice(0, n) + "…(已截断)" : e;
8515
8542
  if (typeof e == "number" || typeof e == "boolean") return e;
@@ -8518,14 +8545,14 @@ function Yl(e, t = 3, n = 2e3, r) {
8518
8545
  if (typeof e == "bigint") return `${e.toString()}n`;
8519
8546
  if (typeof e != "object") return String(e);
8520
8547
  let i = e;
8521
- if (Jl(i)) {
8548
+ if (Yl(i)) {
8522
8549
  let e = i;
8523
8550
  return e.tagName ? `[Element: <${e.tagName.toLowerCase()}>]` : `[Node: ${e.nodeName}]`;
8524
8551
  }
8525
8552
  if (r?.has(i)) return "[Circular]";
8526
8553
  let a = r ?? /* @__PURE__ */ new WeakSet();
8527
8554
  if (a.add(i), Array.isArray(e)) {
8528
- let r = e.slice(0, 100).map((e) => Yl(e, t - 1, n, a));
8555
+ let r = e.slice(0, 100).map((e) => Xl(e, t - 1, n, a));
8529
8556
  return e.length > 100 && r.push(`…(共 ${e.length} 项,已截断)`), r;
8530
8557
  }
8531
8558
  if (t < 0) return "(对象,已截断)";
@@ -8537,14 +8564,14 @@ function Yl(e, t = 3, n = 2e3, r) {
8537
8564
  break;
8538
8565
  }
8539
8566
  try {
8540
- o[r] = Yl(i[r], t - 1, n, a);
8567
+ o[r] = Xl(i[r], t - 1, n, a);
8541
8568
  } catch {
8542
8569
  o[r] = "(getter 抛错)";
8543
8570
  }
8544
8571
  }
8545
8572
  return o;
8546
8573
  }
8547
- function Xl(e) {
8574
+ function Zl(e) {
8548
8575
  let t = e ?? (typeof window < "u" ? window : {}), n = t.navigator, r = t.location, i = t.document;
8549
8576
  return {
8550
8577
  location: {
@@ -8577,9 +8604,9 @@ function Xl(e) {
8577
8604
  } : "(无 document)"
8578
8605
  };
8579
8606
  }
8580
- var Zl = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|opener|parent|top|self|window|globalThis|closed|history|navigation|trustedTypes|origin|crossOriginIsolated)$/, Ql = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session|ticket/i, $l = r(({ key: e }) => {
8607
+ var Ql = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|opener|parent|top|self|window|globalThis|closed|history|navigation|trustedTypes|origin|crossOriginIsolated)$/, $l = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session|ticket/i, eu = r(({ key: e }) => {
8581
8608
  if (e) {
8582
- if (Zl.test(e) || Ql.test(e)) return JSON.stringify({
8609
+ if (Ql.test(e) || $l.test(e)) return JSON.stringify({
8583
8610
  key: e,
8584
8611
  denied: !0,
8585
8612
  reason: "安全:该 key 在 denylist(localStorage/sessionStorage/cookie/document 或敏感命名 token/secret/key/auth),不读取防泄漏"
@@ -8589,18 +8616,18 @@ var Zl = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|open
8589
8616
  key: e,
8590
8617
  exists: t !== void 0,
8591
8618
  type: typeof t,
8592
- value: Yl(t)
8619
+ value: Xl(t)
8593
8620
  }, null, 2);
8594
8621
  }
8595
- return JSON.stringify(Xl(), null, 2);
8622
+ return JSON.stringify(Zl(), null, 2);
8596
8623
  }, {
8597
8624
  name: "inspect_env",
8598
8625
  description: "读取宿主页面环境信息(排查调试用,默认开启)。不传参 = 返回环境摘要(location 的 URL/origin/path、navigator 的浏览器/语言、viewport 视口尺寸、document 的 title/readyState);传 key = 读取指定 window 属性值(如 inspect_env({key:\"appConfig\"}) 读集成方挂的调试变量 window.appConfig)。用于排查「当前页面在哪/什么浏览器/视口多大/调试变量值是什么」。轻量只读,大结果自动外存 vfs。",
8599
8626
  schema: t.object({ key: t.string().optional().describe("要读取的 window 属性名(如 \"appConfig\"/\"__DEBUG__\");不传 = 返回环境摘要") })
8600
- }), eu = [$l];
8627
+ }), tu = [eu];
8601
8628
  //#endregion
8602
8629
  //#region src/core/harness/budget.ts
8603
- function tu(e, t, n) {
8630
+ function nu(e, t, n) {
8604
8631
  let r = 0;
8605
8632
  return {
8606
8633
  name: "budget",
@@ -8625,12 +8652,12 @@ function tu(e, t, n) {
8625
8652
  }
8626
8653
  //#endregion
8627
8654
  //#region src/core/sdk/actions.ts
8628
- var nu = /^[a-zA-Z][a-zA-Z0-9_]*$/;
8629
- function ru(e) {
8655
+ var ru = /^[a-zA-Z][a-zA-Z0-9_]*$/;
8656
+ function iu(e) {
8630
8657
  let n = [];
8631
8658
  for (let [i, a] of Object.entries(e)) {
8632
- if (!nu.test(i)) {
8633
- console.warn(`[page-agent-sdk][actions] 动作名 "${i}" 非法(须匹配 ${nu}),已跳过`);
8659
+ if (!ru.test(i)) {
8660
+ console.warn(`[page-agent-sdk][actions] 动作名 "${i}" 非法(须匹配 ${ru}),已跳过`);
8634
8661
  continue;
8635
8662
  }
8636
8663
  let e = a.description || `宿主动作 ${i}`;
@@ -8650,9 +8677,9 @@ function ru(e) {
8650
8677
  }
8651
8678
  return n;
8652
8679
  }
8653
- function iu(e) {
8680
+ function au(e) {
8654
8681
  let t = {};
8655
- for (let [n, r] of Object.entries(e)) nu.test(n) && (t[n] = {
8682
+ for (let [n, r] of Object.entries(e)) ru.test(n) && (t[n] = {
8656
8683
  description: r.description,
8657
8684
  hasParams: !!r.params
8658
8685
  });
@@ -8660,12 +8687,12 @@ function iu(e) {
8660
8687
  }
8661
8688
  //#endregion
8662
8689
  //#region src/core/toolsets.ts
8663
- var au = Vl, ou = ql;
8664
- function su(e, t) {
8665
- return zl(e, t);
8690
+ var ou = Hl, su = Jl;
8691
+ function cu(e, t) {
8692
+ return Bl(e, t);
8666
8693
  }
8667
- function cu(e, t, n, r, i) {
8668
- let a = Uc(e);
8694
+ function lu(e, t, n, r, i) {
8695
+ let a = Wc(e);
8669
8696
  return [
8670
8697
  ...a.dataOps ? t : [],
8671
8698
  ...a.fetch ? n : [],
@@ -8675,7 +8702,7 @@ function cu(e, t, n, r, i) {
8675
8702
  }
8676
8703
  //#endregion
8677
8704
  //#region src/core/sdk/toolRegistry.ts
8678
- function lu(e) {
8705
+ function uu(e) {
8679
8706
  let t = /* @__PURE__ */ new Map(), n = [];
8680
8707
  for (let r of e) for (let e of r.tools) {
8681
8708
  let i = t.get(e.name);
@@ -8695,15 +8722,15 @@ function lu(e) {
8695
8722
  }
8696
8723
  //#endregion
8697
8724
  //#region src/core/harness/usageHints.ts
8698
- var uu = .7;
8699
- function du(e, t, n = "simple", r = !1) {
8700
- let i = Uc(e), a = n !== "advanced";
8725
+ var du = .7;
8726
+ function fu(e, t, n = "simple", r = !1) {
8727
+ let i = Wc(e), a = n !== "advanced";
8701
8728
  return {
8702
8729
  name: "usageHints",
8703
8730
  augmentPrompt: () => {
8704
8731
  let n = [];
8705
8732
  if (i.planning && (n.push("【自适应规划】按任务复杂度决定是否先规划,不要对简单任务过度编排:"), n.push(" · 简单/明确任务(改单字段、调样式、查值)→ 直接 read/write 执行,不必 write_todos。"), n.push(" · 复杂任务(多步、大改、有歧义、不可逆)→ 先 write_todos 拆解,首个任务标 in_progress,逐项推进。"), n.push(" · 执行中发现步骤要改/补/细分 → 用 update_todo({id, content?, status?}) 按 id 增量改单项,不必重传整个清单。"), n.push(" · 规划出多步方案若需用户拍板 → 先 request_human_confirmation 给方案选项,确认后再执行。"), n.push(" · 规划阶段有轮次预算(maxPlanRevisions,默认 5):勿反复调研/改计划而不执行,规划充分后即开始 write 落地。")), t && (a ? (n.push("读写主数据用 read/write(高层入口,自动乐观锁 + 自动快照)。read({jsonPath}) 读子路径当前值(返回含 hash,write 时自动比对,无需手动传);read() 不传读整个主数据 + 说明。write 改值两姿势:① 改单个字段/子路径用 write({patch:{op:\"set\", jsonPath:\"路径.字段\", value:新值}})——patch.value 就是该字段的新值(类型匹配:string 直传字符串、number 传数字、对象传对象),不要包成 {字段:值} 对象(字段名已在 jsonPath);也兼容 write({value:新值, patch:{op,jsonPath}}) 顶层 value(向后兼容,但优先 patch.value,避免与整体 set 的 value 混淆);② 替换整个对象用 write({value:{整个新对象}})。op:set 设值 / remove 删 / merge 合并对象 / append 追加数组;批量多改动 write({patches:[{op,jsonPath,value},...]});删子路径 write({patch:{jsonPath:\"路径\"}, del:true})。写入自动经 schema 校验(失败不写,按错误提示改值类型/形状后重试)+ 自动存快照(出错可用 restore_data 回退)。"), n.push("修改大对象/数组优先用 write 的 patch 增量(只发改动部分),避免整体重传被 max_tokens 截断致 JSON 不完整。"), n.push("读大数组(read 返回 hasMore=true)用 read({jsonPath,offset,limit}) 分页(offset+=limit 续读,默认 limit=50);一次读多个不相关子路径用 read({jsonPaths:[...]}) 省轮次;复杂 patches 改动先 write({patches,dryRun:true}) 预检(走完整校验不落盘)。"), n.push("read/describe 返回按 schema 投影:仅 schema 声明的字段可见(未声明字段自动隐藏,防误操作);要操作某字段需集成方在 schema 声明,查任意路径完整约束用 schema_data({jsonPath})。"), n.push("查历史快照值(看上一版长啥样 / 冲突诊断 / 用户问\"刚才改了啥\")用 history_data({id?,jsonPath?})(只读不改当前);对比当前与历史快照的差异需切 advanced 用 diff_data(返回结构化 path→from/to)。"), n.push("在大数组里按条件筛选用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素 path/index;定位后用 write patch 改。找名字记不清的元素用 search_data(substring/regex/fuzzy)。批量过滤/映射/聚合/重写大数组用 eval_script(沙箱脚本,mode=query 只读/transform 落地)。")) : (n.push("改主数据前先 get_data({jsonPath}) 读其当前真实值与 hash(返回末尾 hash=xxx),基于真实值改,不要凭记忆。写入(set/edit/delete)时回传 expectedHash=该 hash 启用乐观锁——若主数据在你 get 之后被外部代码/其他 agent/用户手动改过,会触发冲突:集成方若开启人工介入,工具会挂起等用户决定(保留外部/强制覆盖/回退),你应等待工具返回后按结果继续(保留外部→重新 get 再改;强制覆盖→已写入,继续;回退→已回退到历史快照,基于回退值重写);未开启人工介入时返回 VERSION_CONFLICT 不写入,重新 get 拿最新值与 hash 再改。"), n.push("不确定主数据字段结构时用 describe_data 查看说明。"), n.push("修改大对象/数组优先用 edit_data 增量 patch(只发改动部分),避免 set_data 整体重传被 max_tokens 截断导致 JSON 不完整、校验失败。"), n.push("修改主数据出错时可用 restore_data 回退最近一次。"), n.push("在大数组里按条件筛选元素用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素的 path/index;定位后再 edit_data 改。"), n.push("找名字记不清的元素用 search_data(支持 substring/regex/fuzzy 模糊搜索)。"), n.push("需要过滤/映射/聚合/批量重写大数组时用 eval_script(沙箱脚本,入参 data);只读探查用 mode=query,批量重写用 mode=transform(返回值经校验后落地)。"), n.push("读大数组用 read({jsonPath,offset,limit}) 分页(返回 hasMore=true 时 offset+=limit 续读);一次读多个不相关子路径用 read({jsonPaths});复杂改动先 write({...,dryRun:true}) 预检不落盘。"), n.push("对比当前与历史快照(或一段 JSON against)的差异用 diff_data({snapshotId?,against?})(返回结构化 path→from/to,verify 自纠/操作审计/\"刚才改了啥\");只读查历史快照值用 history_data({id?,jsonPath?})。"))), i.subagent && n.push("独立子任务可 spawn_agent 委派(只读工具,过程不占主上下文)。"), i.inspectEnv && n.push("排查页面环境(当前 URL/浏览器/视口/集成方调试变量)用 inspect_env——不传参返回环境摘要(location/navigator/viewport/document),传 key 读特定 window 属性(如 inspect_env({key:\"appConfig\"}) 读 window.appConfig)。改完数据看渲染、定位\"为何没生效\"时用它(只读,不改数据)。"), i.domInspect && n.push("改完数据想确认渲染是否生效(或定位元素/辅助 UI 设计问答)用 get_dom({selector?,depth?}) 读渲染后 DOM(结构化返回 tag/attrs/text/children,depth 控制深度防爆炸,只读)。配合宿主 actions(save_draft/publish 等)形成\"改数据→get_dom 看渲染→触发动作\"闭环。"), i.draftWrite && n.push("生成超大 JSON(如 50+ 组件页面,单次 write 受 max_tokens 限制装不下)用 draft_write 分块构建 → draft_commit 原子提交:draft_write({draftId, chunk, mode}) mode:\"start\" 新建/\"append\" 追加(拼 JSON 片段到 drafts 池);累积完 draft_commit({draftId}) 合并 + schema 校验 + 写主数据(失败草稿保留可修后重试,成功自动清草稿)。小改仍用 write patch,只在大 JSON 从零生成时用 draft。"), i.draftWrite && n.push("⚠️ 大 JSON 分块构建是典型多轮工具调用(draft_write×N + draft_commit + read 确认 + 调研 read/query),默认 maxToolRounds=10 可能触顶被 while 截断导致草稿写不完;目标组件数大时集成方应在 createChatSdk 配 maxToolRounds ≥ 20(或按 N+5 估算)。draft_commit 提交同样走乐观锁(改前 read 拿 hash,bind 被改过会触发冲突介入,不静默覆盖)。"), i.todoDeps && n.push("复杂任务可用 todos 层级依赖:write_todos 时给 todo 传 parentId(父任务 id,表达层级)+ deps(依赖的 todo id 数组,必须先完成)。有依赖的任务,deps 全 completed 后再标 in_progress;完成时 update_todo({id, status:\"completed\", evidence:\"完成证据\"}) 记证据。无依赖关系的任务不传 parentId/deps(扁平)。"), i.focus && !a && (n.push("【上下文聚焦】判断任务范围,用 set_focus/add_focus/remove_focus/clear_focus 自动收敛工作范围:"), n.push(" · 局部任务(只改某一组件/区域,如「调导航栏」「改 components.3 样式」)→ 先 read 定位 jsonPath,再 set_focus({path:\"该子树路径\"}) 聚焦;聚焦后每轮只看该子树结构,写其他位置会被 PATH_DENIED 拒绝。"), n.push(" · 多个相关组件(如「同时改导航栏和页脚」)→ set_focus 聚焦首个后用 add_focus({path}) 追加其余;聚焦后可写任一焦点子树,越界仍被拒;移除单个用 remove_focus({path})。"), n.push(" · 全局任务(多处/整体结构,如「重排所有组件」「换主题」)→ 不要聚焦,保持全量视野直接写。"), n.push(" · 完成局部精修、要转向其他区域或做整体改动 → 调 clear_focus 退出聚焦(清空全部焦点),恢复全部读写权限。"), n.push(" · set_focus/add_focus 的 path 必须在 schema 内(类型校验);不确定路径先 read/describe_data 查。")), r && (n.push("【受保护资源·精确值保护】部分字段被 freeze/verbatim 保护(集成方在 data.resources 声明):"), n.push(" · read 受保护路径返回占位符 ⟦frozen:path⟧(freeze,精确值不入消息流)或 ⟦res:handle⟧(verbatim,原值在资源池),非真值。"), n.push(" · 确需真值用 resource_get({path})(仅受保护路径);freeze 字段完全不可改,撞 FROZEN_FIELD 即放弃该字段改动。"), n.push(" · verbatim 字段改新值:先 resource_update({path,value}) 更新资源池(同步 bind),再 write 写回句柄 ⟦res:handle⟧;直接写新值 → VERBATIM_MISMATCH。"), n.push(" · 撞 RESOURCE_EVICTED(资源被池淘汰)→ 重新 read 该字段懒注册重建句柄;撞 RESOURCE_NOT_FOUND → 重新 read。")), e?.subagents?.length) {
8706
- let t = e.subagents.filter((e) => (e.temperature ?? 0) >= uu || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), r = e.subagents.filter((e) => (e.temperature ?? 0) < uu && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
8733
+ let t = e.subagents.filter((e) => (e.temperature ?? 0) >= du || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), r = e.subagents.filter((e) => (e.temperature ?? 0) < du && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
8707
8734
  n.push("【规划-反思-执行·路由】按任务性质选模式,不要对简单任务过度编排:"), t.length && (n.push(` · 创作/设计/开放性需求(如"设计主题风格""换个感觉")→ 先调 ${t.map((e) => "use_" + e.id).join("/")} 出 2-3 套方案(高温创意),`), n.push(" 不要自己拍板;拿到方案后,若需用户拍板用 request_human_confirmation 弹选项。")), r.length && n.push(` · 严谨/易错/校验类 → 可先调 ${r.map((e) => "use_" + e.id).join("/")} 反思挑刺(低温审查),据反馈修订。`), n.push(a ? " · 方案定稿后,由你(主 agent)用 write 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。" : " · 方案定稿后,由你(主 agent)用 edit_data 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。"), n.push(" · 简单/明确任务(如\"标题改红色\")直接执行,不必走规划-反思。");
8708
8735
  }
8709
8736
  return e?.humanConfirm && (n.push("【人工确认·必读】以下情形必须先调 request_human_confirmation 征询用户、拿到答复后再继续,不要自行拍板:"), n.push(" 1) 用户让你「给方案/列选项/我来选/挑一个」时:把每个方案作为一个 option,调 request_human_confirmation(question=简述, options=[方案A,方案B,...], recommendation=你推荐的)。不要只回文字罗列方案让用户自己回复——要用工具把选项做成可点选按钮。"), n.push(" 2) 需求有歧义/不确定时:调工具问清楚(options 不传则用户答同意或拒绝)。"), n.push(" 3) 即将执行高风险不可逆操作(删除/覆盖/批量改动)前:调工具确认。"), n.push(" 4) 规划出多步方案需用户确认时:把整个方案(或关键分步)作为 option 调 request_human_confirmation,确认后再执行。"), n.push("用户在选项里选了哪个,就按那个方案继续;选「拒绝」则停止并询问如何调整。")), n.length && n.unshift("调用工具务必用标准 function calling(工具调用)格式发起,不要在回复正文里输出伪 XML/标签(如 deepseek 的 tool_calls 标签、invoke、function_call、tool_call 等)或 JSON 文本——那不会被识别为工具调用,会被当普通文字,工具不执行。"), n.length ? "## 能力使用提示\n" + n.join("\n") : void 0;
@@ -8712,7 +8739,7 @@ function du(e, t, n = "simple", r = !1) {
8712
8739
  }
8713
8740
  //#endregion
8714
8741
  //#region src/core/harness/resourcesPin.ts
8715
- function fu(e) {
8742
+ function pu(e) {
8716
8743
  return {
8717
8744
  name: "resourcesPin",
8718
8745
  augmentPrompt: () => {
@@ -8726,78 +8753,78 @@ function fu(e) {
8726
8753
  }
8727
8754
  //#endregion
8728
8755
  //#region src/core/backends/skillStore.ts
8729
- var pu = "v:1::skill-store", mu = "chat-sdk";
8730
- function hu(e, t, n) {
8731
- return `${pu}::${e}::${t}::${n}`;
8756
+ var mu = "v:1::skill-store", hu = "chat-sdk";
8757
+ function gu(e, t, n) {
8758
+ return `${mu}::${e}::${t}::${n}`;
8732
8759
  }
8733
- function gu(e, t) {
8734
- return `${pu}::${e}::${t}::`;
8760
+ function _u(e, t) {
8761
+ return `${mu}::${e}::${t}::`;
8735
8762
  }
8736
- function _u(e = {}) {
8737
- let t = e.dbName ?? mu, n = e.backend ?? "indexed", r = e.id ?? "", i, a, o = new Promise((e) => {
8763
+ function vu(e = {}) {
8764
+ let t = e.dbName ?? hu, n = e.backend ?? "indexed", r = e.id ?? "", i, a, o = new Promise((e) => {
8738
8765
  a = e;
8739
8766
  });
8740
8767
  return (async () => {
8741
8768
  try {
8742
8769
  if (n === "indexed") {
8743
8770
  if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
8744
- i = await Ic(t), a(!0);
8771
+ i = await Lc(t), a(!0);
8745
8772
  } else if (n === "session") {
8746
8773
  if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
8747
- i = Lc(sessionStorage), a(!0);
8774
+ i = Rc(sessionStorage), a(!0);
8748
8775
  } else if (n === "local") {
8749
8776
  if (typeof localStorage > "u") throw Error("localStorage 不可用");
8750
- i = Lc(localStorage), a(!0);
8751
- } else i = Fc(), a(!1);
8777
+ i = Rc(localStorage), a(!0);
8778
+ } else i = Ic(), a(!1);
8752
8779
  } catch {
8753
- i = Fc(), a(!1);
8780
+ i = Ic(), a(!1);
8754
8781
  }
8755
8782
  })(), {
8756
8783
  ready: o,
8757
8784
  async list() {
8758
8785
  let e = [];
8759
- return await i.scan(gu(t, r), (t, n) => {
8786
+ return await i.scan(_u(t, r), (t, n) => {
8760
8787
  e.push(n);
8761
8788
  }), e;
8762
8789
  },
8763
8790
  async get(e) {
8764
- return await i.get(hu(t, r, e));
8791
+ return await i.get(gu(t, r, e));
8765
8792
  },
8766
8793
  async put(e) {
8767
8794
  try {
8768
- await i.set(hu(t, r, e.name), e);
8795
+ await i.set(gu(t, r, e.name), e);
8769
8796
  } catch (e) {
8770
- Dc(e) && (i = Fc());
8797
+ Oc(e) && (i = Ic());
8771
8798
  }
8772
8799
  },
8773
8800
  async remove(e) {
8774
- let n = hu(t, r, e);
8801
+ let n = gu(t, r, e);
8775
8802
  return await i.get(n) == null ? !1 : (await i.del(n), !0);
8776
8803
  },
8777
8804
  async clear() {
8778
- await i.clearPrefix(gu(t, r));
8805
+ await i.clearPrefix(_u(t, r));
8779
8806
  },
8780
8807
  dispose() {}
8781
8808
  };
8782
8809
  }
8783
- var vu = /large_results\/[^\s"'`),]+\.txt/g;
8784
- function yu(e) {
8810
+ var yu = /large_results\/[^\s"'`),]+\.txt/g;
8811
+ function bu(e) {
8785
8812
  let t = /* @__PURE__ */ new Set(), n = (e) => {
8786
8813
  if (typeof e != "string" || !e) return;
8787
8814
  let n;
8788
- for (vu.lastIndex = 0; (n = vu.exec(e)) !== null;) t.add(n[0]);
8815
+ for (yu.lastIndex = 0; (n = yu.exec(e)) !== null;) t.add(n[0]);
8789
8816
  };
8790
8817
  for (let t of e) if (n(t.content), t.steps) for (let e of t.steps) n(e.result);
8791
8818
  return t;
8792
8819
  }
8793
- function bu(e, t) {
8820
+ function xu(e, t) {
8794
8821
  let n = [];
8795
8822
  for (let r of Object.keys(e)) r.startsWith("large_results/") && !t.has(r) && n.push(r);
8796
8823
  return n;
8797
8824
  }
8798
8825
  //#endregion
8799
8826
  //#region src/core/utils/serialRunner.ts
8800
- function xu() {
8827
+ function Su() {
8801
8828
  let e = Promise.resolve();
8802
8829
  return function(t) {
8803
8830
  let n = e.then(t, t);
@@ -8806,16 +8833,16 @@ function xu() {
8806
8833
  }
8807
8834
  //#endregion
8808
8835
  //#region src/core/sdk/createChatSdk.ts
8809
- var Su = 30, Cu = /* @__PURE__ */ new Map();
8810
- function wu(e, t) {
8836
+ var Cu = 30, wu = /* @__PURE__ */ new Map();
8837
+ function Tu(e, t) {
8811
8838
  return e === "set_data" ? "set" : e === "edit_data" ? "edit" : e === "delete_data" ? "delete" : e === "restore_data" ? "restore" : e === "write" ? t?.del ? "delete" : t?.patch ? "edit" : "set" : null;
8812
8839
  }
8813
- function Tu(e, t, n, r) {
8840
+ function Eu(e, t, n, r) {
8814
8841
  let i = 0;
8815
8842
  return {
8816
8843
  name: "sdk-events",
8817
8844
  wrapToolCall: async (t, r) => {
8818
- let i = await r(t), a = wu(t.name, t.args);
8845
+ let i = await r(t), a = Tu(t.name, t.args);
8819
8846
  return a && e({
8820
8847
  type: "data_change",
8821
8848
  operation: a,
@@ -8843,7 +8870,7 @@ function Tu(e, t, n, r) {
8843
8870
  }
8844
8871
  };
8845
8872
  }
8846
- function Eu(e, t, n, r, i) {
8873
+ function Du(e, t, n, r, i) {
8847
8874
  if (!n) return i && console.warn(`[page-agent-sdk][focus] capabilities.focus 关闭,${t} 忽略`), {
8848
8875
  ok: !1,
8849
8876
  error: "capabilities.focus 关闭"
@@ -8861,16 +8888,16 @@ function Eu(e, t, n, r, i) {
8861
8888
  error: "当前无主数据 schema,无法聚焦"
8862
8889
  });
8863
8890
  }
8864
- function Du(e, n) {
8891
+ function Ou(e, n) {
8865
8892
  let i = {
8866
8893
  prompt_tokens: 0,
8867
8894
  completion_tokens: 0,
8868
8895
  total_tokens: 0
8869
- }, a = mc(() => W), o = /* @__PURE__ */ Ot(0), s = Bc(e.storage);
8896
+ }, a = hc(() => W), o = /* @__PURE__ */ Ot(0), s = Vc(e.storage);
8870
8897
  e.debug && s && s.onEvent((e) => console.log("[page-agent-sdk][storage]", e));
8871
- let { modelCaps: c, summaryLlmInvoke: l, titleLlmInvoke: u, compressDecisionInvoke: p } = pc(e), m = c;
8898
+ let { modelCaps: c, summaryLlmInvoke: l, titleLlmInvoke: u, compressDecisionInvoke: p } = mc(e), m = c;
8872
8899
  if (e.debug && console.log("[page-agent-sdk][modelCaps]", m), m.contextWindow < 2e5) throw Error(`[page-agent-sdk] 模型上下文窗口 ${m.contextWindow} 小于最小支持 ${ni}(需 ≥200K 窗口模型,如 GLM-5.2/Claude/Kimi/Qwen-1M/DeepSeek-v4)`);
8873
- let h = qc(e, m.contextWindow), g = h.enableLLMSummary !== !1, _ = (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? Kc[e.contextPreset ?? "auto"], v = new Set(_), y = e.llm;
8900
+ let h = Jc(e, m.contextWindow), g = h.enableLLMSummary !== !1, _ = (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? qc[e.contextPreset ?? "auto"], v = new Set(_), y = e.llm;
8874
8901
  e.debug && !l && console.warn("[page-agent-sdk][summarization] 未构造 llmInvoke(apiKey 缺失?),摘要回退零成本索引摘要");
8875
8902
  let b = /* @__PURE__ */ _t([]), x = zs(e.vfs?.initialFiles, {
8876
8903
  persist: s ? { save: (e) => {
@@ -8892,7 +8919,7 @@ function Du(e, n) {
8892
8919
  getTodos: () => D.current?.getState?.()?.todos ?? [],
8893
8920
  messages: b,
8894
8921
  maxCheckpoints: ne && typeof ne == "object" ? ne.maxCheckpoints : void 0
8895
- }) : null, ie = !ne || typeof ne != "object" || ne.auto !== !1, M = Uc(e.capabilities), N = M.dataOps, ae = M.draftWrite, P = M.tracing, oe = M.automation, se = bs(e), ce = N && O ? zl(O, {
8922
+ }) : null, ie = !ne || typeof ne != "object" || ne.auto !== !1, M = Wc(e.capabilities), N = M.dataOps, ae = M.draftWrite, P = M.tracing, oe = M.automation, se = bs(e), ce = N && O ? Bl(O, {
8896
8923
  onAudit: e.onAudit ?? (e.debug ? (e) => console.log("[page-agent-sdk][data audit]", e) : void 0),
8897
8924
  maxSnapshots: e.maxSnapshots,
8898
8925
  onConflict: a.set,
@@ -8901,11 +8928,11 @@ function Du(e, n) {
8901
8928
  vfsStore: ae || O?.resources?.length ? x : void 0,
8902
8929
  ...te.length ? { pgIdPaths: te } : {},
8903
8930
  ...A.length ? { largeTextPaths: A } : {}
8904
- }) : [], le = N ? Al(ce, e.toolMode) : [], F = N && O ? ce.controller ?? null : null, ue = N && O?.resources?.length && F?.getResourcesSnapshot ? fu({ getResourcesSnapshot: () => F?.getResourcesSnapshot?.() ?? [] }) : void 0, I = () => F?.get() ?? O, L = /* @__PURE__ */ new Map(), R = cu(M, le, Vl, ql, eu);
8931
+ }) : [], le = N ? jl(ce, e.toolMode) : [], F = N && O ? ce.controller ?? null : null, ue = N && O?.resources?.length && F?.getResourcesSnapshot ? pu({ getResourcesSnapshot: () => F?.getResourcesSnapshot?.() ?? [] }) : void 0, I = () => F?.get() ?? O, L = /* @__PURE__ */ new Map(), R = lu(M, le, Hl, Jl, tu);
8905
8932
  R.forEach((e) => L.set(e.name, "builtin"));
8906
8933
  let z = [...e.tools || []];
8907
8934
  z.forEach((e) => L.set(e.name, "user"));
8908
- let de = ru(e.actions ?? {});
8935
+ let de = iu(e.actions ?? {});
8909
8936
  de.forEach((e) => L.set(e.name, "action"));
8910
8937
  let fe = [], B = e.humanConfirm !== !1 && (!e.approval || e.approval.humanConfirmTool !== !1), pe = B ? Za() : null;
8911
8938
  pe && L.set(Ya, "builtin");
@@ -8977,7 +9004,7 @@ function Du(e, n) {
8977
9004
  ye.forEach((e) => L.set(e.name, "builtin"));
8978
9005
  let be = [], xe = /* @__PURE__ */ new Map(), H = Se();
8979
9006
  function Se() {
8980
- let { tools: e, collisions: t } = lu([
9007
+ let { tools: e, collisions: t } = uu([
8981
9008
  {
8982
9009
  label: "builtin",
8983
9010
  tools: R
@@ -9044,7 +9071,7 @@ function Du(e, n) {
9044
9071
  timeoutMs: Ie?.timeoutMs
9045
9072
  }), Ve = e.subagents?.map((e) => {
9046
9073
  if (!e._codeAsset) return e;
9047
- let t = e._codeAsset, n = Qs({
9074
+ let t = e._codeAsset, n = $s({
9048
9075
  writablePaths: t.writablePaths,
9049
9076
  codeVfsPrefix: t.codeVfsPrefix,
9050
9077
  ext: t.ext,
@@ -9086,8 +9113,8 @@ function Du(e, n) {
9086
9113
  } : void 0
9087
9114
  }) : void 0, qe = Fe ? ps({
9088
9115
  contextWindow: m.contextWindow,
9089
- thresholdRatio: qc(e, m.contextWindow).summaryThresholdRatio
9090
- }) : void 0, Je = du({
9116
+ thresholdRatio: Jc(e, m.contextWindow).summaryThresholdRatio
9117
+ }) : void 0, Je = fu({
9091
9118
  ...M,
9092
9119
  humanConfirm: B,
9093
9120
  subagents: e.subagents?.map((e) => ({
@@ -9111,7 +9138,7 @@ function Du(e, n) {
9111
9138
  return;
9112
9139
  }
9113
9140
  }
9114
- } : null, Ze = Wc(e.onEvent), W = Ze.emit, Qe, $e = [], et = (e) => ({
9141
+ } : null, Ze = Gc(e.onEvent), W = Ze.emit, Qe, $e = [], et = (e) => ({
9115
9142
  name: e.name,
9116
9143
  description: e.description,
9117
9144
  content: typeof e.getContent == "function" ? e.getContent() : ""
@@ -9119,7 +9146,7 @@ function Du(e, n) {
9119
9146
  name: e.name,
9120
9147
  description: e.description,
9121
9148
  getContent: () => e.content
9122
- }), nt = e.skillStorage === !1 ? null : _u({
9149
+ }), nt = e.skillStorage === !1 ? null : vu({
9123
9150
  ...typeof e.skillStorage == "object" ? e.skillStorage : {},
9124
9151
  id: e.skillStorage && typeof e.skillStorage == "object" && e.skillStorage.id ? e.skillStorage.id : `agent::${n}`
9125
9152
  }), rt = () => {
@@ -9151,7 +9178,7 @@ function Du(e, n) {
9151
9178
  decideInvoke: p,
9152
9179
  getSnapshot: () => qe?.getSnapshot()
9153
9180
  } : {}
9154
- }) : void 0, ot = Yc([
9181
+ }) : void 0, ot = Xc([
9155
9182
  ...Ye ? [Ye] : [],
9156
9183
  Je,
9157
9184
  ...we ? [C] : [],
@@ -9183,12 +9210,12 @@ function Du(e, n) {
9183
9210
  ...Xe ? [Xe] : [],
9184
9211
  ...qe ? [qe] : [],
9185
9212
  ...e.middleware || [],
9186
- ...oe ? [tu(i, {
9213
+ ...oe ? [nu(i, {
9187
9214
  tokenBudget: e.tokenBudget,
9188
9215
  timeBudgetMs: e.timeBudgetMs
9189
9216
  }, W)] : [],
9190
- Tu(W, b, I, i)
9191
- ]), st = e.maxMemoryRounds ?? Su, ct = e.approval?.timeoutMs, lt = ct === void 0 || ct === 0 ? 3e4 : !Number.isFinite(ct) || ct < 0 ? 0 : ct;
9217
+ Eu(W, b, I, i)
9218
+ ]), st = e.maxMemoryRounds ?? Cu, ct = e.approval?.timeoutMs, lt = ct === void 0 || ct === 0 ? 3e4 : !Number.isFinite(ct) || ct < 0 ? 0 : ct;
9192
9219
  function ut(e) {
9193
9220
  if (lt) return (t) => {
9194
9221
  if (t.type !== "approval_request") return;
@@ -9211,7 +9238,7 @@ function Du(e, n) {
9211
9238
  async function ft() {
9212
9239
  s && (dt.value = (await s.listSessions(n)).sort((e, t) => t.lastAccessed - e.lastAccessed));
9213
9240
  }
9214
- let pt = xu(), mt = /* @__PURE__ */ new Set();
9241
+ let pt = Su(), mt = /* @__PURE__ */ new Set();
9215
9242
  function ht(e) {
9216
9243
  let t = new AbortController();
9217
9244
  return e && (e.aborted ? t.abort() : e.addEventListener("abort", () => t.abort(), { once: !0 })), mt.add(t), {
@@ -9454,7 +9481,7 @@ function Du(e, n) {
9454
9481
  })), e.memory && s.save(n, G.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }), ft(), K = void 0, Ct = !1, r;
9455
9482
  },
9456
9483
  resetSession: () => {
9457
- gt(), a.resolve("keep_external"), G.sessionId = hc(), b.splice(0, b.length), x.clear?.(), S.reset([]), e.memory || E.reset(""), C.reset(), T.reset(), w.reset(), j && j.importStack([]), G.agent && (G.agent.debugLogs.value = []), s && s.createSession(G.agentId, e.session?.title, G.sessionId), W({
9484
+ gt(), a.resolve("keep_external"), G.sessionId = gc(), b.splice(0, b.length), x.clear?.(), S.reset([]), e.memory || E.reset(""), C.reset(), T.reset(), w.reset(), j && j.importStack([]), G.agent && (G.agent.debugLogs.value = []), s && s.createSession(G.agentId, e.session?.title, G.sessionId), W({
9458
9485
  type: "session_restored",
9459
9486
  sessionId: G.sessionId,
9460
9487
  rounds: 0
@@ -9462,7 +9489,7 @@ function Du(e, n) {
9462
9489
  },
9463
9490
  stream: (e, t, n) => {
9464
9491
  if (!G.agent) throw Error("page-agent-sdk: agent 尚未初始化完成,请先 await mount()");
9465
- x?.setProtectedRefs?.(yu(e));
9492
+ x?.setProtectedRefs?.(bu(e));
9466
9493
  let r = (e) => {
9467
9494
  t?.(e), W(e), e.type === "subagent" && (e.kind === "tool_call" || e.kind === "tool_result") && G.infoTick.value++;
9468
9495
  };
@@ -9477,7 +9504,7 @@ function Du(e, n) {
9477
9504
  if (G.refCount--, G.refCount <= 0) {
9478
9505
  gt(), s && (x.flush?.(), s.flush(), s.dispose()), nt && nt.dispose();
9479
9506
  let e = G.mcpClosers.splice(0);
9480
- e.length && Promise.allSettled(e.map((e) => e())), Cu.delete(n);
9507
+ e.length && Promise.allSettled(e.map((e) => e())), wu.delete(n);
9481
9508
  }
9482
9509
  },
9483
9510
  resolveConflict: a.resolve,
@@ -9497,14 +9524,14 @@ function Du(e, n) {
9497
9524
  },
9498
9525
  setLlm(t) {
9499
9526
  let n;
9500
- if (ic(t)) n = t;
9527
+ if (ac(t)) n = t;
9501
9528
  else {
9502
9529
  let e = t;
9503
9530
  if ((e.provider ?? "openai") === "anthropic") throw Error("[page-agent-sdk][setLlm] 切换到 Anthropic 需传 BaseChatModel 实例(动态 import 无法同步);请先 const { ChatAnthropic } = await import(\"@langchain/anthropic\") 构造实例后传入");
9504
9531
  n = d(e);
9505
9532
  }
9506
9533
  typeof n.bindTools != "function" && e.debug && console.warn("[page-agent-sdk][setLlm] 新模型不支持 bindTools(tool calling 会失效)"), y = t;
9507
- let r = ic(t) ? void 0 : t;
9534
+ let r = ac(t) ? void 0 : t;
9508
9535
  if (m = ri({
9509
9536
  model: r?.model ?? t.model ?? t.modelName,
9510
9537
  contextWindow: e.contextWindow ?? r?.contextWindow,
@@ -9547,7 +9574,7 @@ function Du(e, n) {
9547
9574
  return {
9548
9575
  id: n,
9549
9576
  sessionId: G.sessionId,
9550
- model: ic(y) ? y.model ?? y.modelName : y.model,
9577
+ model: ac(y) ? y.model ?? y.modelName : y.model,
9551
9578
  systemPrompt: G.agent?.getEffectiveSystemPrompt?.() ?? se + ys(I(), e.schemaHint),
9552
9579
  tools: (G.agent?.allTools ?? H).map((e) => ({
9553
9580
  name: e.name,
@@ -9584,7 +9611,7 @@ function Du(e, n) {
9584
9611
  spans: G.agent.spans.value,
9585
9612
  metrics: oi(G.agent.spans.value)
9586
9613
  } : void 0,
9587
- actions: iu(e.actions ?? {}),
9614
+ actions: au(e.actions ?? {}),
9588
9615
  subagent: {
9589
9616
  enabled: !!Be,
9590
9617
  maxDepth: e.subagent?.maxDepth ?? 1,
@@ -9633,11 +9660,11 @@ function Du(e, n) {
9633
9660
  return V ? w.getFocuses() : [];
9634
9661
  },
9635
9662
  setFocus(t) {
9636
- let n = Eu(t, "setFocus", V, () => I()?.schema, e.debug);
9663
+ let n = Du(t, "setFocus", V, () => I()?.schema, e.debug);
9637
9664
  return n.ok ? (w.setFocus(t), G.infoTick.value++, { ok: !0 }) : n;
9638
9665
  },
9639
9666
  addFocus(t) {
9640
- let n = Eu(t, "addFocus", V, () => I()?.schema, e.debug);
9667
+ let n = Du(t, "addFocus", V, () => I()?.schema, e.debug);
9641
9668
  return n.ok ? w.getFocuses().length >= 8 ? (e.debug && console.warn("[page-agent-sdk][focus] addFocus 拒绝:焦点数已达上限 8(augmentPrompt 注入每焦点子树 schema,过多致 system prompt 超预算)"), {
9642
9669
  ok: !1,
9643
9670
  error: "焦点数上限 8(避免 system prompt 撑爆)"
@@ -9681,14 +9708,14 @@ function Du(e, n) {
9681
9708
  }
9682
9709
  function bt(e) {
9683
9710
  let t = {};
9684
- for (let n of yu(e)) {
9711
+ for (let n of bu(e)) {
9685
9712
  let e = x.files[n];
9686
9713
  e && (t[n] = e.content);
9687
9714
  }
9688
9715
  return t;
9689
9716
  }
9690
9717
  function xt() {
9691
- let e = bu(x.files, yu(b));
9718
+ let e = xu(x.files, bu(b));
9692
9719
  for (let t of e) delete x.files[t];
9693
9720
  }
9694
9721
  function St() {
@@ -9736,7 +9763,7 @@ function Du(e, n) {
9736
9763
  s.save(n, G.sessionId, { focus: e.length ? e : null });
9737
9764
  }
9738
9765
  oe && j && (s.save(n, G.sessionId, { checkpoints: j.exportStack() }), s.save(n, G.sessionId, { usage: i }));
9739
- let a = rc(b);
9766
+ let a = ic(b);
9740
9767
  a && a !== K && (K = a, s.updateTitle(n, G.sessionId, a)), e.autoTitle !== !1 && u && !Ct && b.some((e) => e.role === "user") && b.some((e) => e.role === "assistant") && (Ct = !0, (async () => {
9741
9768
  let e = await u(b);
9742
9769
  e && (await s.updateTitle(n, G.sessionId, e), await ft());
@@ -9754,7 +9781,7 @@ function Du(e, n) {
9754
9781
  }), t.value.tools.forEach((e) => L.set(e.name, `mcp:${i}`)), fe.push(...t.value.tools)) : console.warn(`[page-agent-sdk][mcp] server ${i} 连接失败:`, t.reason);
9755
9782
  }), H = Se(), e.debug && console.log(`[page-agent-sdk][mcp] 注入 ${fe.length} 个工具,${G.mcpServers.length} 个 server`);
9756
9783
  }
9757
- let t = ic(e.llm) ? e.llm : await f(e.llm);
9784
+ let t = ac(e.llm) ? e.llm : await f(e.llm);
9758
9785
  G.agent = Fi({
9759
9786
  llm: t,
9760
9787
  systemPrompt: se,
@@ -9785,12 +9812,12 @@ function Du(e, n) {
9785
9812
  });
9786
9813
  })(), G;
9787
9814
  }
9788
- function Ou(e, t) {
9789
- let n = e.id ?? hc();
9815
+ function ku(e, t) {
9816
+ let n = e.id ?? gc();
9790
9817
  e.id || console.warn(`[page-agent-sdk] 未传 options.id,已生成随机 id "${n}"。刷新后持久化数据无法恢复,请传稳定 id。`);
9791
- let r = e.streaming ?? !0, i = e.ui ?? "default", a, o = e.shareContext ? Cu.get(n) : void 0;
9792
- o ? a = o : (a = Du(e, n), e.shareContext && Cu.set(n, a)), a.refCount++;
9793
- let s = null, c = Vc(e), l = null, u = null;
9818
+ let r = e.streaming ?? !0, i = e.ui ?? "default", a, o = e.shareContext ? wu.get(n) : void 0;
9819
+ o ? a = o : (a = Ou(e, n), e.shareContext && wu.set(n, a)), a.refCount++;
9820
+ let s = null, c = Hc(e), l = null, u = null;
9794
9821
  async function d(n) {
9795
9822
  if (await a.initDone, s) {
9796
9823
  s.show();
@@ -10006,12 +10033,12 @@ function Ou(e, t) {
10006
10033
  }
10007
10034
  //#endregion
10008
10035
  //#region src/core/sdk/ragSubagent.ts
10009
- var ku = "你是知识检索专家。可用工具:search_docs(语义检索)/ load_doc(按 source 加载)/ vfs_grep+vfs_read(搜预注入文档)/ fetch_document(公网 URL)。\n\n工作方式:\n1. 分析任务,拆出需查证的要点(如:需要哪些组件、各自的 props 约束、UI 规范要求);\n2. 多源检索:先 vfs_grep 搜预注入文档(快、静态)→ 不够用 search_docs 语义检索 → 需特定文档用 load_doc → 公网用 fetch_document;\n3. 检索结果不足时换关键词、扩大 topK、或换源重试;\n4. 综合成结构化、可执行结论(不堆原文,提炼成可直接用于决策/配置的信息);\n5. 标注关键信息来源(文档名/段落),便于溯源;检索不到明确说「未检索到」,不编造。\n\n你是只读检索角色,不要尝试修改任何数据。", Au = "# 知识检索策略(RAG)\n\n## 多源决策树\n- vfs_grep / vfs_read:搜集成方预注入 vfs 的文档(组件文档 / UI 规范)—— 快、静态,先查\n- search_docs:语义检索(retriever 向量库)—— 模糊匹配,关键词不确定 / 语义相似时用\n- load_doc:按 source 精确加载(已知文档 id / URL / key)—— 精确取特定文档\n- fetch_document:公网 URL —— 查公开资料\n\n## 综合规范\n- 多源交叉验证(关键结论优先 ≥2 源印证,或单一权威源)\n- 标注来源(文档名 / URL / 段落),便于溯源\n- 结构化、可执行结论(组件清单 + 各自 props 约束 + 适用场景),不堆原文\n- 未检索到明确说「未检索到」,不编造;建议替代方案(改关键词 / 建议写代码组件等)\n\n## 何时用何源\n- 静态文档(组件库文档 / UI 规范):vfs_grep\n- 语义相似(「瀑布流组件」「倒计时」「拼团」):search_docs\n- 已知文档 id / URL:load_doc\n- 公开 URL(设计规范网站 / 第三方文档):fetch_document", ju = {
10036
+ var Au = "你是知识检索专家。可用工具:search_docs(语义检索)/ load_doc(按 source 加载)/ vfs_grep+vfs_read(搜预注入文档)/ fetch_document(公网 URL)。\n\n工作方式:\n1. 分析任务,拆出需查证的要点(如:需要哪些组件、各自的 props 约束、UI 规范要求);\n2. 多源检索:先 vfs_grep 搜预注入文档(快、静态)→ 不够用 search_docs 语义检索 → 需特定文档用 load_doc → 公网用 fetch_document;\n3. 检索结果不足时换关键词、扩大 topK、或换源重试;\n4. 综合成结构化、可执行结论(不堆原文,提炼成可直接用于决策/配置的信息);\n5. 标注关键信息来源(文档名/段落),便于溯源;检索不到明确说「未检索到」,不编造。\n\n你是只读检索角色,不要尝试修改任何数据。", ju = "# 知识检索策略(RAG)\n\n## 多源决策树\n- vfs_grep / vfs_read:搜集成方预注入 vfs 的文档(组件文档 / UI 规范)—— 快、静态,先查\n- search_docs:语义检索(retriever 向量库)—— 模糊匹配,关键词不确定 / 语义相似时用\n- load_doc:按 source 精确加载(已知文档 id / URL / key)—— 精确取特定文档\n- fetch_document:公网 URL —— 查公开资料\n\n## 综合规范\n- 多源交叉验证(关键结论优先 ≥2 源印证,或单一权威源)\n- 标注来源(文档名 / URL / 段落),便于溯源\n- 结构化、可执行结论(组件清单 + 各自 props 约束 + 适用场景),不堆原文\n- 未检索到明确说「未检索到」,不编造;建议替代方案(改关键词 / 建议写代码组件等)\n\n## 何时用何源\n- 静态文档(组件库文档 / UI 规范):vfs_grep\n- 语义相似(「瀑布流组件」「倒计时」「拼团」):search_docs\n- 已知文档 id / URL:load_doc\n- 公开 URL(设计规范网站 / 第三方文档):fetch_document", Mu = {
10010
10037
  name: "rag-search",
10011
10038
  description: "多源知识检索策略:vfs 预注入文档 → 语义检索 → 指定文档加载 → 公网;综合结构化结论 + 溯源",
10012
- getContent: () => Au
10039
+ getContent: () => ju
10013
10040
  };
10014
- function Mu(e, n, i) {
10041
+ function Nu(e, n, i) {
10015
10042
  return r(async ({ query: e, topK: t }) => {
10016
10043
  try {
10017
10044
  let r = await n(e, { topK: t ?? i });
@@ -10028,7 +10055,7 @@ function Mu(e, n, i) {
10028
10055
  })
10029
10056
  });
10030
10057
  }
10031
- function Nu(e, n) {
10058
+ function Pu(e, n) {
10032
10059
  return r(async ({ source: e }) => {
10033
10060
  try {
10034
10061
  let t = await n(e), r = Array.isArray(t) ? t : [t];
@@ -10042,11 +10069,11 @@ function Nu(e, n) {
10042
10069
  schema: t.object({ source: t.string().describe("文档标识(id/URL/key)") })
10043
10070
  });
10044
10071
  }
10045
- function Pu(e) {
10072
+ function Fu(e) {
10046
10073
  let { retriever: t, loader: n, useVfs: r = !0, id: i = "rag", description: a, topK: o = 5, searchToolName: s = "search_docs", loadToolName: c = "load_doc", maxToolRounds: l = 8, summarization: u, skills: d, extraTools: f } = e;
10047
10074
  if (!t && !n && r === !1) throw Error("[page-agent-sdk][createRagSubagent] 至少配一种知识源:retriever / loader / useVfs(true)");
10048
10075
  let p = [];
10049
- t && p.push(Mu(s, t, o)), n && p.push(Nu(c, n)), f && p.push(...f);
10076
+ t && p.push(Nu(s, t, o)), n && p.push(Pu(c, n)), f && p.push(...f);
10050
10077
  let m = r ? [
10051
10078
  "vfs_grep",
10052
10079
  "vfs_read",
@@ -10055,17 +10082,17 @@ function Pu(e) {
10055
10082
  return {
10056
10083
  id: i,
10057
10084
  description: a ?? "检索知识库(组件文档/UI 规范/业务规则),返回有依据的结构化结论。需要查阅文档才能回答或决定如何配置时委派",
10058
- systemPrompt: ku,
10085
+ systemPrompt: Au,
10059
10086
  tools: p.length ? p : void 0,
10060
10087
  allowedTools: m,
10061
- skills: d ?? [ju],
10088
+ skills: d ?? [Mu],
10062
10089
  maxToolRounds: l,
10063
10090
  ...u === void 0 ? {} : { summarization: u }
10064
10091
  };
10065
10092
  }
10066
10093
  //#endregion
10067
10094
  //#region src/core/tools/htmlValidate.ts
10068
- var Fu = /* @__PURE__ */ new Set([
10095
+ var Iu = /* @__PURE__ */ new Set([
10069
10096
  "area",
10070
10097
  "base",
10071
10098
  "br",
@@ -10080,12 +10107,12 @@ var Fu = /* @__PURE__ */ new Set([
10080
10107
  "source",
10081
10108
  "track",
10082
10109
  "wbr"
10083
- ]), Iu = /* @__PURE__ */ new Set(["script", "style"]), Lu = /* @__PURE__ */ new Set([
10110
+ ]), Lu = /* @__PURE__ */ new Set(["script", "style"]), Ru = /* @__PURE__ */ new Set([
10084
10111
  "html",
10085
10112
  "head",
10086
10113
  "body"
10087
10114
  ]);
10088
- function Ru(e, t = {}) {
10115
+ function zu(e, t = {}) {
10089
10116
  let n = t.sfc === !0, r = [], i = e.length;
10090
10117
  if (!e.trim()) return r;
10091
10118
  let a = [0];
@@ -10166,12 +10193,12 @@ function Ru(e, t = {}) {
10166
10193
  }
10167
10194
  continue;
10168
10195
  }
10169
- if (Lu.has(m) && r.push({
10196
+ if (Ru.has(m) && r.push({
10170
10197
  line: o(t),
10171
10198
  code: "DOC_TAG_IN_FRAGMENT",
10172
10199
  message: `<${m}> 不应出现(v-html 注入场景只输出内容片段,不要 html/head/body 外围)`
10173
- }), !(Fu.has(m) || h)) {
10174
- if (Iu.has(m)) {
10200
+ }), !(Iu.has(m) || h)) {
10201
+ if (Lu.has(m)) {
10175
10202
  m === "script" && !n && r.push({
10176
10203
  line: o(t),
10177
10204
  code: "SCRIPT_IN_FRAGMENT",
@@ -10205,7 +10232,7 @@ function Ru(e, t = {}) {
10205
10232
  }
10206
10233
  //#endregion
10207
10234
  //#region src/core/sdk/htmlSubagent.ts
10208
- function zu(e, t) {
10235
+ function Bu(e, t) {
10209
10236
  let n = t === "html" ? "html" : "vue";
10210
10237
  return `你是纯代码组件生成专家。可用工具:vfs_write / vfs_edit / vfs_rm(写/改/删代码工作副本 vfs ${e}) / vfs_read + vfs_grep(读 vfs) / validate_code(代码格式自检) / write + set(写 data,writablePaths 限定) / read / write_todos + update_todo(规划)。
10211
10238
 
@@ -10218,6 +10245,10 @@ function zu(e, t) {
10218
10245
  - **修改已有组件**(改颜色/文案/布局等):必经 vfs —— vfs_read 看现状 → vfs_edit 增量改目标片段 → validate_code 自检;框架自动回写 data.code。勿直接 write data.code 改已有组件(绕过 vfs/verify,且无增量友好)
10219
10246
  - **新建组件**:write({ patch:{ op:'set', jsonPath:'components.N', value:{ name, code:<正文>, props } } }) —— code 作为字段值直接进 data,框架自动补 __pgId
10220
10247
 
10248
+ 焦点精修(若继承到主 agent 焦点):
10249
+ - 上下文若提示「当前精修目标」(如 components.2(banner)),说明主 agent 聚焦了某组件 → 你**只能改该焦点组件**的代码文件(vfs 文件 ${e}<焦点组件 __pgId>.${n});改其他组件的代码文件会被 PATH_DENIED 硬拦
10250
+ - 直接改焦点组件文件,不要尝试改其他组件(浪费轮次);聚焦模式下也不能新建组件(数据写被拦)—— 若 task 要新建,反馈主 agent 需先取消焦点
10251
+
10221
10252
  代码形态规则:
10222
10253
  ${t === "html" ? `- 输出纯 HTML 片段(.${n}):结构 + 内联 <style>(class 加统一前缀防样式冲突);交互交给宿主(不写 JS)
10223
10254
  - 单根元素包裹(如 <section class="...">…</section>),语义化标签` : `- 输出 Vue SFC(.${n}):<template> + <script setup>(组合式),defineProps 接外部数据
@@ -10235,16 +10266,16 @@ ${t === "html" ? `- 输出纯 HTML 片段(.${n}):结构 + 内联 <style>(class
10235
10266
  5. 生成/修改完成后必须调 validate_code 自检(标签闭合 + 片段契约),报错用 vfs_edit 修正后复查,直到通过;
10236
10267
  6. 最后 read(vfs + data)确认结构正确;只写 writablePaths 内 data + ${e} 下 vfs。`;
10237
10268
  }
10238
- var Bu = "# 纯代码组件生成规范\n\n## 代码资产模型(重要)\n- 代码正文是 data 的 code 字段(资产,随 data json 进服务端 DB);UI 绑 data.code 渲染\n- vfs 是编辑工作副本:框架自动 checkout(data.code→vfs)/ commit(vfs→data.code),你只改 vfs\n- __pgId 框架管(read 看不到、write 写不进),别碰\n\n## 两条工作路径\n- 修改已有组件:必经 vfs(vfs_read → vfs_edit 增量改 → validate_code);勿直接 write data.code\n- 新建组件:write({patch:{op:'set',jsonPath:'components.N',value:{name,code,props}}}) —— code 直接进 data,框架补 __pgId\n\n## 何时写代码组件\n- 组件库无对应类型(高度定制交互 / 一次性特效 / 特殊布局)→ 写 custom 代码组件\n- 组件库已有(按钮 / 卡片 / 列表)→ 用现有组件配置,不重造\n\n## Vue SFC 规范\n- Vue 3 <template> + <script setup>(组合式)\n- props 用 defineProps;事件用 defineEmits\n- 只渲染 UI,不做副作用(不发请求 / 不读写 storage)\n\n## 输出契约(必须)\n- 渲染产物经 v-html 等方式注入宿主:<template> 内不要 <!DOCTYPE> / <html> / <head> / <body> 外围标签,只输出内容片段\n- <template> 内不写 <script>;不引入外部脚本 / CDN\n- 每次生成/修改后调 validate_code 自检,报错修正直到通过\n\n## props 定义\n- 代码组件 defineProps 接受外部 data 传入(集成方渲染时按 data 的 props 字段传)\n\n## 组件库引用\n- 代码内可 import 组件库组件(如 <Button>);所用依赖以集成方渲染层已注入为准,不重复造\n\n## 安全底线(必须)\n- 禁 eval / new Function / Function 构造器\n- 禁访问 window 敏感属性(document.cookie / apiKey / token)\n- 不引入外部脚本 / CDN\n\n## 可访问性 + 语义化\n- 语义化标签(button / nav / section);图片 alt;交互可键盘聚焦\n- 颜色对比达标;不只用颜色传达信息", Vu = "# HTML 片段生成规范\n\n## 代码资产模型(重要)\n- 代码正文是 data 的 code 字段(资产,随 data json 进服务端 DB);UI 绑 data.code 渲染\n- vfs 是编辑工作副本:框架自动 checkout(data.code→vfs)/ commit(vfs→data.code),你只改 vfs\n- __pgId 框架管(read 看不到、write 写不进),别碰\n\n## 两条工作路径\n- 修改已有组件:必经 vfs(vfs_read → vfs_edit 增量改 → validate_code);勿直接 write data.code\n- 新建组件:write({patch:{op:'set',jsonPath:'components.N',value:{name,code,props}}}) —— code 直接进 data,框架补 __pgId\n\n## 输出契约(必须)\n- 输出经 v-html 注入宿主的 HTML 片段:不要 <!DOCTYPE>,不要 <html> / <head> / <body> 外围标签\n- 单根元素包裹(如 <section class=\"hero\">…</section>)\n- 不写 <script>(v-html 注入不执行脚本);交互交宿主页面已有机制\n- 样式用片段内 <style>,class 统一加前缀防冲突(如 .pg-hero-…)\n- 不引入外部脚本 / CDN / 外链样式\n\n## 标签闭合(必须)\n- 非自闭合标签必须成对闭合(<img> / <br> / <input> 等 void 元素除外)\n- 每次生成/修改后调 validate_code 自检,报错用 vfs_edit 修正直到通过\n\n## 何时写代码组件\n- 组件库无对应类型(高度定制布局 / 一次性专题页 / 特殊视觉效果)→ 写 HTML 片段\n- 组件库已有(按钮 / 卡片 / 列表)→ 用现有组件配置,不重造\n\n## 安全底线(必须)\n- 禁 eval / new Function / Function 构造器\n- 禁访问 window 敏感属性(document.cookie / apiKey / token)\n- 不引入外部脚本 / CDN\n\n## 可访问性 + 语义化\n- 语义化标签(button / nav / section);图片 alt;交互可键盘聚焦\n- 颜色对比达标;不只用颜色传达信息", Hu = {
10269
+ var Vu = "# 纯代码组件生成规范\n\n## 代码资产模型(重要)\n- 代码正文是 data 的 code 字段(资产,随 data json 进服务端 DB);UI 绑 data.code 渲染\n- vfs 是编辑工作副本:框架自动 checkout(data.code→vfs)/ commit(vfs→data.code),你只改 vfs\n- __pgId 框架管(read 看不到、write 写不进),别碰\n\n## 两条工作路径\n- 修改已有组件:必经 vfs(vfs_read → vfs_edit 增量改 → validate_code);勿直接 write data.code\n- 新建组件:write({patch:{op:'set',jsonPath:'components.N',value:{name,code,props}}}) —— code 直接进 data,框架补 __pgId\n\n## 焦点精修(继承主 agent 焦点时)\n- 上下文提示「当前精修目标」(如 components.2(banner))→ 只改该焦点组件的代码文件;改其他组件会被 PATH_DENIED 硬拦\n- 聚焦模式不能新建组件(数据写被拦),要新建先反馈主 agent 取消焦点\n\n## 何时写代码组件\n- 组件库无对应类型(高度定制交互 / 一次性特效 / 特殊布局)→ 写 custom 代码组件\n- 组件库已有(按钮 / 卡片 / 列表)→ 用现有组件配置,不重造\n\n## Vue SFC 规范\n- Vue 3 <template> + <script setup>(组合式)\n- props 用 defineProps;事件用 defineEmits\n- 只渲染 UI,不做副作用(不发请求 / 不读写 storage)\n\n## 输出契约(必须)\n- 渲染产物经 v-html 等方式注入宿主:<template> 内不要 <!DOCTYPE> / <html> / <head> / <body> 外围标签,只输出内容片段\n- <template> 内不写 <script>;不引入外部脚本 / CDN\n- 每次生成/修改后调 validate_code 自检,报错修正直到通过\n\n## props 定义\n- 代码组件 defineProps 接受外部 data 传入(集成方渲染时按 data 的 props 字段传)\n\n## 组件库引用\n- 代码内可 import 组件库组件(如 <Button>);所用依赖以集成方渲染层已注入为准,不重复造\n\n## 安全底线(必须)\n- 禁 eval / new Function / Function 构造器\n- 禁访问 window 敏感属性(document.cookie / apiKey / token)\n- 不引入外部脚本 / CDN\n\n## 可访问性 + 语义化\n- 语义化标签(button / nav / section);图片 alt;交互可键盘聚焦\n- 颜色对比达标;不只用颜色传达信息", Hu = "# HTML 片段生成规范\n\n## 代码资产模型(重要)\n- 代码正文是 data 的 code 字段(资产,随 data json 进服务端 DB);UI 绑 data.code 渲染\n- vfs 是编辑工作副本:框架自动 checkout(data.code→vfs)/ commit(vfs→data.code),你只改 vfs\n- __pgId 框架管(read 看不到、write 写不进),别碰\n\n## 两条工作路径\n- 修改已有组件:必经 vfs(vfs_read → vfs_edit 增量改 → validate_code);勿直接 write data.code\n- 新建组件:write({patch:{op:'set',jsonPath:'components.N',value:{name,code,props}}}) —— code 直接进 data,框架补 __pgId\n\n## 焦点精修(继承主 agent 焦点时)\n- 上下文提示「当前精修目标」(如 components.2(banner))→ 只改该焦点组件的代码文件;改其他组件会被 PATH_DENIED 硬拦\n- 聚焦模式不能新建组件(数据写被拦),要新建先反馈主 agent 取消焦点\n\n## 输出契约(必须)\n- 输出经 v-html 注入宿主的 HTML 片段:不要 <!DOCTYPE>,不要 <html> / <head> / <body> 外围标签\n- 单根元素包裹(如 <section class=\"hero\">…</section>)\n- 不写 <script>(v-html 注入不执行脚本);交互交宿主页面已有机制\n- 样式用片段内 <style>,class 统一加前缀防冲突(如 .pg-hero-…)\n- 不引入外部脚本 / CDN / 外链样式\n\n## 标签闭合(必须)\n- 非自闭合标签必须成对闭合(<img> / <br> / <input> 等 void 元素除外)\n- 每次生成/修改后调 validate_code 自检,报错用 vfs_edit 修正直到通过\n\n## 何时写代码组件\n- 组件库无对应类型(高度定制布局 / 一次性专题页 / 特殊视觉效果)→ 写 HTML 片段\n- 组件库已有(按钮 / 卡片 / 列表)→ 用现有组件配置,不重造\n\n## 安全底线(必须)\n- 禁 eval / new Function / Function 构造器\n- 禁访问 window 敏感属性(document.cookie / apiKey / token)\n- 不引入外部脚本 / CDN\n\n## 可访问性 + 语义化\n- 语义化标签(button / nav / section);图片 alt;交互可键盘聚焦\n- 颜色对比达标;不只用颜色传达信息", Uu = {
10239
10270
  name: "html-builder",
10240
10271
  description: "纯代码组件(custom Vue SFC)生成规范:代码作为 data 资产 / vfs 工作副本 / SFC 规范 / 输出契约 / props / 组件库引用 / 可访问性",
10241
- getContent: () => Bu
10242
- }, Uu = {
10272
+ getContent: () => Vu
10273
+ }, Wu = {
10243
10274
  name: "html-fragment",
10244
10275
  description: "纯 HTML 片段(v-html 注入)生成规范:代码作为 data 资产 / vfs 工作副本 / 无外围标签 / 单根元素 / 标签闭合 / validate_code 自检 / 安全底线 / 可访问性",
10245
- getContent: () => Vu
10276
+ getContent: () => Hu
10246
10277
  };
10247
- function Wu(e = {}) {
10278
+ function Gu(e = {}) {
10248
10279
  let t = e.vfsPrefix ?? "html/";
10249
10280
  return ({ state: e }) => {
10250
10281
  let n = e.files;
@@ -10252,7 +10283,7 @@ function Wu(e = {}) {
10252
10283
  let r = [];
10253
10284
  for (let [e, i] of Object.entries(n)) {
10254
10285
  if (!e.startsWith(t)) continue;
10255
- let n = Ru(i.content, { sfc: e.endsWith(".vue") });
10286
+ let n = zu(i.content, { sfc: e.endsWith(".vue") });
10256
10287
  for (let t of n) r.push(`${e} 第 ${t.line} 行:${t.message}(${t.code})`);
10257
10288
  }
10258
10289
  return r.length ? {
@@ -10261,7 +10292,7 @@ function Wu(e = {}) {
10261
10292
  } : { ok: !0 };
10262
10293
  };
10263
10294
  }
10264
- function Gu(e) {
10295
+ function Ku(e) {
10265
10296
  let n;
10266
10297
  return {
10267
10298
  name: "html-validate-tools",
@@ -10290,7 +10321,7 @@ function Gu(e) {
10290
10321
  }
10291
10322
  let a = [];
10292
10323
  for (let e of i) {
10293
- let t = Ru(e.content, { sfc: e.path.endsWith(".vue") });
10324
+ let t = zu(e.content, { sfc: e.path.endsWith(".vue") });
10294
10325
  t.length && a.push(`${e.path}:\n${t.map((e) => ` 第 ${e.line} 行 ${e.message}(${e.code})`).join("\n")}`);
10295
10326
  }
10296
10327
  return a.length ? `❌ 格式校验未通过:\n${a.join("\n")}\n请用 vfs_edit 修正后重新调用 validate_code 复查。` : `✅ 格式校验通过(${i.map((e) => e.path).join(", ")}:标签闭合、片段契约)。`;
@@ -10304,17 +10335,17 @@ function Gu(e) {
10304
10335
  })]
10305
10336
  };
10306
10337
  }
10307
- var Ku = 2;
10308
- function qu(e) {
10338
+ var qu = 2;
10339
+ function Ju(e) {
10309
10340
  let { writablePaths: t, codeVfsPrefix: n = "html/", id: r = "html", description: i, planning: a = !0, summarization: o = !0, maxToolRounds: s = 12, temperature: c = .4, skills: l, extraTools: u, codeKind: d = "sfc", formatCheck: f = !0 } = e;
10310
10341
  if (!t?.length) throw Error("[page-agent-sdk][createHtmlSubagent] writablePaths 必填(代码组件 data 区,如 [\"components\"])");
10311
10342
  let p = d === "html" ? "html" : "vue", m = [];
10312
- a && m.push(ra()), f && (m.push(Gu(n)), m.push(qo({ check: Wu({ vfsPrefix: n }) })));
10343
+ a && m.push(ra()), f && (m.push(Ku(n)), m.push(qo({ check: Gu({ vfsPrefix: n }) })));
10313
10344
  let h = u ?? [];
10314
10345
  return {
10315
10346
  id: r,
10316
10347
  description: i ?? "生成/修改纯代码组件(custom 代码)。代码作为 data 资产(code 字段进 DB),vfs 作工作副本;能规划(write_todos)+ 执行。需写代码组件或灵活定制时委派",
10317
- systemPrompt: zu(n, d),
10348
+ systemPrompt: Bu(n, d),
10318
10349
  writablePaths: t,
10319
10350
  allowedTools: [
10320
10351
  "vfs_write",
@@ -10325,9 +10356,9 @@ function qu(e) {
10325
10356
  ],
10326
10357
  middleware: m.length ? m : void 0,
10327
10358
  summarization: o === !1 ? void 0 : o,
10328
- maxVerifyAttempts: f ? Ku : void 0,
10359
+ maxVerifyAttempts: f ? qu : void 0,
10329
10360
  temperature: c,
10330
- skills: l ?? (d === "html" ? [Uu] : [Hu]),
10361
+ skills: l ?? (d === "html" ? [Wu] : [Uu]),
10331
10362
  maxToolRounds: s,
10332
10363
  tools: h.length ? h : void 0,
10333
10364
  _codeAsset: {
@@ -10339,7 +10370,7 @@ function qu(e) {
10339
10370
  }
10340
10371
  //#endregion
10341
10372
  //#region src/core/utils/clipboard.ts
10342
- async function Ju(e) {
10373
+ async function Yu(e) {
10343
10374
  try {
10344
10375
  let t = globalThis.navigator?.clipboard;
10345
10376
  if (t && typeof t.writeText == "function") return await t.writeText(e), !0;
@@ -10357,7 +10388,7 @@ async function Ju(e) {
10357
10388
  }
10358
10389
  //#endregion
10359
10390
  //#region src/core/composables/useChat.ts
10360
- function Yu(e = {}) {
10391
+ function Xu(e = {}) {
10361
10392
  let { fetchResponse: t, fetchStream: n, onPersist: r, onClear: i, onQueuedCleared: a } = e, o = /* @__PURE__ */ _t({
10362
10393
  messages: e.messages ?? [],
10363
10394
  loading: !1,
@@ -10542,9 +10573,9 @@ function Yu(e = {}) {
10542
10573
  }
10543
10574
  //#endregion
10544
10575
  //#region src/core/composables/chatContext.ts
10545
- var Xu = Symbol("chatContext");
10546
- function Zu(e = {}) {
10547
- let t = Yu({
10576
+ var Zu = Symbol("chatContext");
10577
+ function Qu(e = {}) {
10578
+ let t = Xu({
10548
10579
  fetchResponse: e.fetchResponse,
10549
10580
  fetchStream: e.fetchStream,
10550
10581
  messages: e.messages,
@@ -10564,7 +10595,7 @@ function Zu(e = {}) {
10564
10595
  }, h = /* @__PURE__ */ Ot({}), g = (e) => h.value[e] !== !1, _ = (e) => {
10565
10596
  h.value[e] = !g(e);
10566
10597
  }, v = /* @__PURE__ */ Ot(!1), y = (e) => {
10567
- Ju(e).then((e) => {
10598
+ Yu(e).then((e) => {
10568
10599
  e && (v.value = !0, setTimeout(() => {
10569
10600
  v.value = !1;
10570
10601
  }, 1500));
@@ -10632,15 +10663,15 @@ function Zu(e = {}) {
10632
10663
  }
10633
10664
  };
10634
10665
  }
10635
- function Qu() {
10636
- let e = Fn(Xu);
10666
+ function $u() {
10667
+ let e = Fn(Zu);
10637
10668
  if (!e) throw Error("useChatContext 必须在 provide(chatContextKey) 的组件子树内调用");
10638
10669
  return e;
10639
10670
  }
10640
10671
  //#endregion
10641
10672
  //#region src/core/index.headless.ts
10642
- function $u(e) {
10643
- return Ou(e);
10673
+ function ed(e) {
10674
+ return ku(e);
10644
10675
  }
10645
10676
  //#endregion
10646
- export { Hc as CAPABILITIES, Gc as CONTEXT_PRESETS, nc as CompressDecisionSchema, vs as DEFAULT_SYSTEM_PROMPT, Fu as HTML_VOID_TAGS, Ya as HUMAN_CONFIRM_TOOL_NAME, ni as MIN_CONTEXT_WINDOW, _o as STOP_WORDS, xs as UNSAFE_KEYS, iu as actionsToInspectInfo, ru as actionsToTools, Yr as agentError, fs as analyzeContext, js as applyPatchToClone, Ms as applyPatchToLive, Jr as asAgentError, ys as buildDataPrompt, bs as buildSystemPrompt, Xu as chatContextKey, jl as commitSetToBind, _s as connectMcp, f as constructLlmFromConfig, d as constructOpenLlmSync, Ju as copyText, Fi as createAgent, Ja as createApprovalMiddleware, Zu as createChatContext, $u as createChatSdk, ao as createCheckpointManager, oo as createCheckpointMiddleware, mc as createConflictManager, ps as createContextInspectorMiddleware, zl as createDataOps, Wu as createHtmlFormatCheck, qu as createHtmlSubagent, Qa as createHumanConfirmMiddleware, Za as createHumanConfirmTool, Fc as createMemoryBackend, Va as createMemoryMiddleware, u as createProxyLlm, Pu as createRagSubagent, Ta as createSandboxRunner, Wc as createSdkEvents, xu as createSerialRunner, zc as createSessionStore, _u as createSkillStore, Uo as createSubagentMiddleware, Do as createSubagentTracker, Ko as createSubagentsMiddleware, du as createUsageHintsMiddleware, qo as createVerifyMiddleware, zs as createVfs, Lc as createWebStorageBackend, $o as createWriteBackCheck, Es as deepClone, su as defineDataToolset, Da as defineSkill, $s as defineTool, Ts as deleteByPath, rc as deriveTitle, qi as describeSchemaNode, Ti as detectGarbledToolCall, Fs as diffObjects, Gl as domToStructure, ql as domTools, ou as domToolsStatic, yo as estimateMessageTokens, bo as estimateRoundTokens, X as estimateTokens, m as extractReasoningDelta, pa as extractSchemaHint, ms as extractText, p as extractTextDelta, h as extractUsage, Vl as fetchDocTools, au as fetchTools, Al as filterByToolMode, Ji as formatConstraints, Wr as formatZodIssues, Z as getByPath, Kl as getDomTool, Xl as getEnvSummary, zi as getSchemaAtPath, Ii as getSchemaTopKeys, oi as getTraceMetrics, $ as hashValue, xo as indexSummarize, $l as inspectEnvTool, eu as inspectTools, ic as isChatModel, gi as isContextLengthError, Li as isPathAllowed, Dc as isQuotaError, Ss as isUnsafePath, al as jpEval, Kr as jsonParseError, ks as limitDepth, Ds as maybeParseValue, g as normalizeUsage, ai as offloadPassThroughChars, ii as offloadThresholdChars, ca as presets, Vi as projectBySchema, Bi as projectBySchemaDeep, Os as projectFields, So as recallRounds, Yi as renderSchemaHint, Xi as renderSchemaOverview, $i as renderSchemaShallow, Uc as resolveCapabilities, qc as resolveContextOptions, Vc as resolveDialogConfig, pc as resolveLlm, ri as resolveModelCaps, Bc as resolveStorage, Ps as restoreInPlace, Ns as restoreLive, qr as routeError, Ea as runHostScript, ll as runSandboxedScript, Cs as safeMerge, Yl as safeSerialize, Q as safeStringify, sl as searchJson, cu as selectBuiltinTools, ws as setByPath, Co as shouldTriggerCompression, la as systemPromptHelpers, vo as tokenize, Y as toolError, Ri as unwrapSchema, Yu as useChat, Qu as useChatContext, Ru as validateHtmlFormat, e as z, Gr as zodError };
10677
+ export { Uc as CAPABILITIES, Kc as CONTEXT_PRESETS, rc as CompressDecisionSchema, vs as DEFAULT_SYSTEM_PROMPT, Iu as HTML_VOID_TAGS, Ya as HUMAN_CONFIRM_TOOL_NAME, ni as MIN_CONTEXT_WINDOW, _o as STOP_WORDS, xs as UNSAFE_KEYS, au as actionsToInspectInfo, iu as actionsToTools, Yr as agentError, fs as analyzeContext, js as applyPatchToClone, Ms as applyPatchToLive, Jr as asAgentError, ys as buildDataPrompt, bs as buildSystemPrompt, Zu as chatContextKey, Ml as commitSetToBind, _s as connectMcp, f as constructLlmFromConfig, d as constructOpenLlmSync, Yu as copyText, Fi as createAgent, Ja as createApprovalMiddleware, Qu as createChatContext, ed as createChatSdk, ao as createCheckpointManager, oo as createCheckpointMiddleware, hc as createConflictManager, ps as createContextInspectorMiddleware, Bl as createDataOps, Gu as createHtmlFormatCheck, Ju as createHtmlSubagent, Qa as createHumanConfirmMiddleware, Za as createHumanConfirmTool, Ic as createMemoryBackend, Va as createMemoryMiddleware, u as createProxyLlm, Fu as createRagSubagent, Ta as createSandboxRunner, Gc as createSdkEvents, Su as createSerialRunner, Bc as createSessionStore, vu as createSkillStore, Uo as createSubagentMiddleware, Do as createSubagentTracker, Ko as createSubagentsMiddleware, fu as createUsageHintsMiddleware, qo as createVerifyMiddleware, zs as createVfs, Rc as createWebStorageBackend, $o as createWriteBackCheck, Es as deepClone, cu as defineDataToolset, Da as defineSkill, ec as defineTool, Ts as deleteByPath, ic as deriveTitle, qi as describeSchemaNode, Ti as detectGarbledToolCall, Fs as diffObjects, Kl as domToStructure, Jl as domTools, su as domToolsStatic, yo as estimateMessageTokens, bo as estimateRoundTokens, X as estimateTokens, m as extractReasoningDelta, pa as extractSchemaHint, ms as extractText, p as extractTextDelta, h as extractUsage, Hl as fetchDocTools, ou as fetchTools, jl as filterByToolMode, Ji as formatConstraints, Wr as formatZodIssues, Z as getByPath, ql as getDomTool, Zl as getEnvSummary, zi as getSchemaAtPath, Ii as getSchemaTopKeys, oi as getTraceMetrics, $ as hashValue, xo as indexSummarize, eu as inspectEnvTool, tu as inspectTools, ac as isChatModel, gi as isContextLengthError, Li as isPathAllowed, Oc as isQuotaError, Ss as isUnsafePath, ol as jpEval, Kr as jsonParseError, ks as limitDepth, Ds as maybeParseValue, g as normalizeUsage, ai as offloadPassThroughChars, ii as offloadThresholdChars, ca as presets, Vi as projectBySchema, Bi as projectBySchemaDeep, Os as projectFields, So as recallRounds, Yi as renderSchemaHint, Xi as renderSchemaOverview, $i as renderSchemaShallow, Wc as resolveCapabilities, Jc as resolveContextOptions, Hc as resolveDialogConfig, mc as resolveLlm, ri as resolveModelCaps, Vc as resolveStorage, Ps as restoreInPlace, Ns as restoreLive, qr as routeError, Ea as runHostScript, ul as runSandboxedScript, Cs as safeMerge, Xl as safeSerialize, Q as safeStringify, cl as searchJson, lu as selectBuiltinTools, ws as setByPath, Co as shouldTriggerCompression, la as systemPromptHelpers, vo as tokenize, Y as toolError, Ri as unwrapSchema, Xu as useChat, $u as useChatContext, zu as validateHtmlFormat, e as z, Gr as zodError };