page-agent-sdk 2.4.1 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14531,7 +14531,8 @@ function qg(e) {
14531
14531
  return {
14532
14532
  save(i) {
14533
14533
  let a = Kg(e.messages), o = {};
14534
- for (let t of e.slotPaths) o[t] = Vg(Hg(window, t));
14534
+ if (e.getData) o[""] = Vg(e.getData());
14535
+ else for (let t of e.slotPaths ?? []) o[t] = Vg(Hg(window, t));
14535
14536
  let s = {
14536
14537
  id: r++,
14537
14538
  label: i,
@@ -14559,8 +14560,13 @@ function qg(e) {
14559
14560
  restore(n) {
14560
14561
  let r = n == null ? t[t.length - 1] : t.find((e) => e.id === n);
14561
14562
  if (!r) return !1;
14562
- e.messages.splice(0, e.messages.length, ...Vg(r.messages));
14563
- for (let [e, t] of Object.entries(r.windowVals)) Gg(e, Vg(t));
14563
+ if (e.messages.splice(0, e.messages.length, ...Vg(r.messages)), e.getData) {
14564
+ let t = r.windowVals[""];
14565
+ if (t !== void 0) {
14566
+ let n = e.getData();
14567
+ typeof n == "object" && n && Wg(n, Vg(t));
14568
+ }
14569
+ } else for (let [e, t] of Object.entries(r.windowVals)) Gg(e, Vg(t));
14564
14570
  let i = e.vfsStore.files;
14565
14571
  for (let e of Object.keys(i)) delete i[e];
14566
14572
  return Object.assign(i, Vg(r.vfs)), e.todosMw.reset(Vg(r.todos)), !0;
@@ -14604,7 +14610,7 @@ async function t_(e, t, n, r, i) {
14604
14610
  temperature: t.temperature ?? t.llm.temperature,
14605
14611
  maxTokens: t.maxTokens ?? t.llm.maxTokens
14606
14612
  },
14607
- systemPrompt: e.role?.trim() || t.systemPrompt || "你是一个专注的子任务执行者。你只有只读工具( window / 抓文档),用它们完成给定任务,给出简洁结论,不要展开多余解释。",
14613
+ systemPrompt: e.role?.trim() || t.systemPrompt || "你是一个专注的子任务执行者。你只有只读工具(读主数据 / 抓文档),用它们完成给定任务,给出简洁结论,不要展开多余解释。",
14608
14614
  tools: c,
14609
14615
  middleware: [...t.skills?.length ? [kg(t.skills)] : [], ...l],
14610
14616
  maxToolRounds: t.maxToolRounds ?? $g,
@@ -14653,7 +14659,7 @@ function n_(e) {
14653
14659
  schema: t.object({
14654
14660
  prompt: t.string().describe("子任务描述(子 agent 的唯一输入)"),
14655
14661
  role: t.string().optional().describe("子 agent 身份(如\"你是代码审查专家\")"),
14656
- tools: t.array(t.string()).optional().describe("子 agent 可用工具名白名单(默认只读 window + fetch)"),
14662
+ tools: t.array(t.string()).optional().describe("子 agent 可用工具名白名单(默认只读主数据 + fetch)"),
14657
14663
  model: t.string().optional().describe("覆盖模型(默认同主)")
14658
14664
  })
14659
14665
  }), n(async ({ tasks: t }) => (await $h(t, r, async (t, n) => {
@@ -14796,25 +14802,25 @@ function d_(e, t) {
14796
14802
  return n;
14797
14803
  }
14798
14804
  function f_(e = {}) {
14799
- let t = e.window ?? globalThis.window, n = typeof e.schemas == "function" ? e.schemas : () => e.schemas ?? {};
14805
+ let t = typeof e.root == "function" ? e.root : e.root === void 0 ? () => e.window ?? globalThis.window : () => e.root, n = typeof e.schemas == "function" ? e.schemas : () => e.schemas ?? {};
14800
14806
  return async ({ messages: e }) => {
14801
14807
  let r = l_(e);
14802
14808
  if (!r.length) return { ok: !0 };
14803
- let i = u_(e), a = n()[""], o = [];
14804
- for (let { path: e, op: n, callId: s } of r) {
14805
- let r = s ? i.get(s) : void 0;
14809
+ let i = u_(e), a = n()[""], o = t(), s = [];
14810
+ for (let { path: e, op: t, callId: n } of r) {
14811
+ let r = n ? i.get(n) : void 0;
14806
14812
  if (r && c_.test(r)) continue;
14807
- let c = d_(t, e);
14808
- if (n === "delete_data") c !== void 0 && o.push(`${e} 删除后读回仍有值,疑似未生效`);
14809
- else if (c == null) o.push(`写入 ${e} 后读回为空,疑似未生效`);
14813
+ let c = d_(o, e);
14814
+ if (t === "delete_data") c !== void 0 && s.push(`${e} 删除后读回仍有值,疑似未生效`);
14815
+ else if (c == null) s.push(`写入 ${e} 后读回为空,疑似未生效`);
14810
14816
  else if (a) {
14811
- let n = a.safeParse(t);
14812
- n.success || o.push(`${e} 读回值不符合 schema:${n.error.issues?.[0]?.message ?? "校验失败"}`);
14817
+ let t = a.safeParse(o);
14818
+ t.success || s.push(`${e} 读回值不符合 schema:${t.error.issues?.[0]?.message ?? "校验失败"}`);
14813
14819
  }
14814
14820
  }
14815
- return o.length ? {
14821
+ return s.length ? {
14816
14822
  ok: !1,
14817
- feedback: o.join(";\n")
14823
+ feedback: s.join(";\n")
14818
14824
  } : { ok: !0 };
14819
14825
  };
14820
14826
  }
@@ -15017,7 +15023,18 @@ function P_(e = {}) {
15017
15023
  ...e
15018
15024
  };
15019
15025
  async function n(e) {
15020
- let n = C_(e), r = e.length, i = (t) => ({
15026
+ let n = C_(e), r = e.length, i = "";
15027
+ if (n.length) {
15028
+ let t = n[0].startIdx;
15029
+ for (let n = 0; n < t; n++) {
15030
+ let t = e[n];
15031
+ if (t.role === "system" && typeof t.content == "string" && t.content.startsWith("【更早对话摘要")) {
15032
+ i = t.content.replace(/^【[^】]*】\n?/, "");
15033
+ break;
15034
+ }
15035
+ }
15036
+ }
15037
+ let a = (t) => ({
15021
15038
  messages: e,
15022
15039
  stats: {
15023
15040
  triggered: !1,
@@ -15028,82 +15045,66 @@ function P_(e = {}) {
15028
15045
  compressedMessages: r,
15029
15046
  strategy: t
15030
15047
  }
15031
- }), a, o, s;
15048
+ }), o, s, c;
15032
15049
  if (t.contextWindow && t.contextWindow > 0) {
15033
- if (n.reduce((e, t) => e + j_(t), 0) <= t.contextWindow * (t.summaryThresholdRatio ?? .5)) return i("none");
15034
- let e = t.contextWindow * (t.windowRatio ?? .4), r = 0, c = 0;
15050
+ if (n.reduce((e, t) => e + j_(t), 0) <= t.contextWindow * (t.summaryThresholdRatio ?? .5)) return a("none");
15051
+ let e = t.contextWindow * (t.windowRatio ?? .4), r = 0, i = 0;
15035
15052
  for (let t = n.length - 1; t >= 0; t--) if (r += j_(n[t]), r >= e) {
15036
- c = t + 1;
15053
+ i = t + 1;
15037
15054
  break;
15038
15055
  }
15039
- if (c > n.length - 1 && (c = n.length - 1), c < 0 && (c = 0), a = n.slice(c), o = n.slice(0, c), !o.length) return i("none");
15040
- s = "token-window+";
15056
+ if (i > n.length - 1 && (i = n.length - 1), i < 0 && (i = 0), o = n.slice(i), s = n.slice(0, i), !s.length) return a("none");
15057
+ c = "token-window+";
15041
15058
  } else {
15042
- if (n.length <= t.summaryThresholdRounds) return i("none");
15059
+ if (n.length <= t.summaryThresholdRounds) return a("none");
15043
15060
  let e = Math.min(t.windowRounds, n.length);
15044
- a = n.slice(n.length - e), o = n.slice(0, n.length - e), s = "window+";
15061
+ o = n.slice(n.length - e), s = n.slice(0, n.length - e), c = "window+";
15045
15062
  }
15046
- let c = [...e].reverse().find((e) => e.role === "user")?.content || "", l = t.preserveLastToolResults?.length ? new Set(t.preserveLastToolResults) : void 0, u, d;
15063
+ let l = [...e].reverse().find((e) => e.role === "user")?.content || "", u = t.preserveLastToolResults?.length ? new Set(t.preserveLastToolResults) : void 0, d, f;
15047
15064
  if (t.enableLLMSummary && t.llmInvoke) try {
15048
- u = await t.llmInvoke(M_(o, l)), d = s + "llm_summary";
15065
+ d = await t.llmInvoke(M_(s, u)), f = c + "llm_summary";
15049
15066
  } catch {
15050
- u = M_(o, l), d = s + "index_summary(llm_fallback)";
15051
- }
15052
- else u = M_(o, l), d = s + "index_summary";
15053
- let f = t.enableRecall ? N_(o, c, t.recallTopK) : [], p = f.length ? f.map((e) => `- 第${e.round}轮:${w_(e.userMsg.content, 60)} → ${e.assistantMsgs[0] ? w_(e.assistantMsgs[0].content, 80) : ""}`).join("\n") : "", m = [`【对话历史摘要】以下是之前 ${o.length} 轮对话的要点(最新 ${a.length} 轮已完整保留):`, u];
15054
- if (p && m.push("\n【与当前问题可能相关的早期对话】", p), t.getRegisteredSlots) try {
15055
- let e = t.getRegisteredSlots();
15067
+ d = M_(s, u), f = c + "index_summary(llm_fallback)";
15068
+ }
15069
+ else d = M_(s, u), f = c + "index_summary";
15070
+ let p = t.enableRecall ? N_(s, l, t.recallTopK) : [], m = p.length ? p.map((e) => `- 第${e.round}轮:${w_(e.userMsg.content, 60)} → ${e.assistantMsgs[0] ? w_(e.assistantMsgs[0].content, 80) : ""}`).join("\n") : "", h = i ? `${d}\n【更早累积摘要】\n${i}` : d, g = [`【对话历史摘要】以下是之前 ${s.length} 轮对话的要点(最新 ${o.length} 轮已完整保留):`, h];
15071
+ m && g.push("\n【与当前问题可能相关的早期对话】", m);
15072
+ let _ = t.getRegisteredData ?? t.getRegisteredSlots;
15073
+ if (_) try {
15074
+ let e = _();
15056
15075
  if (e.length) {
15057
15076
  let t = e.map((e) => `- ${e.path ? e.path + ": " : ""}${e.description}`).join("\n");
15058
- m.push("\n【当前可操作数据(动态增删后的最新状态,操作前以 describe_data / read 为准)】", t);
15077
+ g.push("\n【当前可操作数据(动态增删后的最新状态,操作前以 describe_data / read 为准)】", t);
15059
15078
  }
15060
15079
  } catch {}
15061
- let h = {
15080
+ let v = {
15062
15081
  role: "system",
15063
- content: m.join("\n"),
15082
+ content: g.join("\n"),
15064
15083
  timestamp: Date.now()
15065
- }, g = [];
15066
- for (let e of a) g.push(e.userMsg), g.push(...e.assistantMsgs);
15067
- let _ = [h, ...g];
15084
+ }, y = [];
15085
+ for (let e of o) y.push(e.userMsg), y.push(...e.assistantMsgs);
15086
+ let b = [v, ...y];
15068
15087
  return {
15069
- messages: _,
15088
+ messages: b,
15070
15089
  stats: {
15071
15090
  triggered: !0,
15072
15091
  roundsTotal: n.length,
15073
- roundsSummarized: o.length,
15074
- roundsRecalled: f.length,
15092
+ roundsSummarized: s.length,
15093
+ roundsRecalled: p.length,
15075
15094
  originalMessages: r,
15076
- compressedMessages: _.length,
15077
- strategy: d
15095
+ compressedMessages: b.length,
15096
+ strategy: f
15078
15097
  }
15079
15098
  };
15080
15099
  }
15081
15100
  return {
15082
15101
  compress: n,
15083
- config: t,
15084
- trimToolResults: F_
15102
+ config: t
15085
15103
  };
15086
15104
  }
15087
- function F_(e, t) {
15088
- let n = [];
15089
- if (e.forEach((e, t) => {
15090
- e instanceof o && n.push(t);
15091
- }), n.length <= 2) return e;
15092
- let r = new Set(n.slice(-2));
15093
- return e.map((e, n) => {
15094
- if (!(e instanceof o) || r.has(n)) return e;
15095
- let i = typeof e.content == "string" ? e.content : JSON.stringify(e.content);
15096
- if (i.length <= t) return e;
15097
- let a = i.slice(0, t) + `\n…[已截断,原长度 ${i.length}]`;
15098
- return new o({
15099
- tool_call_id: e.tool_call_id || e.lc_id || "trimmed",
15100
- content: a
15101
- });
15102
- });
15103
- }
15104
15105
  //#endregion
15105
15106
  //#region src/core/harness/summarization.ts
15106
- function I_(e = {}) {
15107
+ function F_(e = {}) {
15107
15108
  let t = P_(e);
15108
15109
  return {
15109
15110
  name: "summarization",
@@ -15118,7 +15119,7 @@ function I_(e = {}) {
15118
15119
  }
15119
15120
  //#endregion
15120
15121
  //#region src/core/presets.ts
15121
- var L_ = {
15122
+ var I_ = {
15122
15123
  pageBuilder: { systemPrompt: "你是页面构建助手。按用户意图读写主数据(经 data 声明 + schema 校验),改完页面实时更新。" },
15123
15124
  researcher: {
15124
15125
  systemPrompt: "你是调研助手。多路调研用 spawn_agents 并行委派子 agent(各负责一个方向);单份资料用 fetch_document 抓取;最后结构化汇总,给出结论与依据。",
@@ -15132,15 +15133,15 @@ var L_ = {
15132
15133
  memory: !1,
15133
15134
  subagent: !1
15134
15135
  } }
15135
- }, R_ = { reliableWriteRules: [
15136
+ }, L_ = { reliableWriteRules: [
15136
15137
  "【可靠写入规则】",
15137
- "1. 改任何属性前,先用 read({ path }) 读其当前真实值,基于真实值改,不要凭记忆;",
15138
- "2. 若不确定可操作哪些属性,先 read() 不传 path 查看当前注册项(动态组件场景下注册表会增删,以工具返回为准,勿凭旧记忆);",
15139
- "3. 不确定某属性字段结构时,read({ path }) 返回含格式说明,字段以返回为准;",
15138
+ "1. 改任何字段前,先用 read({ jsonPath }) 读其当前真实值,基于真实值改,不要凭记忆;",
15139
+ "2. 若不确定可操作哪些字段,先 read() 不传 jsonPath 查看主数据说明 + schema 声明字段(集成方可经 sdk.setData 运行时替换 schema,以工具返回为准,勿凭旧记忆);",
15140
+ "3. 不确定某字段结构时,read({ jsonPath }) 返回含格式说明,字段以返回为准;",
15140
15141
  "4. 写入若被 schema 校验拒绝(返回结构化错误含字段名与期望类型),按错误修正后重试,不要放弃;",
15141
- "5. 优先用 write 的 patch 增量改(只发改动,如 write({ path, value, patch:{ op, jsonPath } })),避免整体重传大 JSON 被截断。"
15142
+ "5. 优先用 write 的 patch 增量改(只发改动,如 write({ value, patch:{ op, jsonPath } })),避免整体重传大 JSON 被截断。"
15142
15143
  ].join("\n") };
15143
- function z_(e) {
15144
+ function R_(e) {
15144
15145
  if (!e) return "";
15145
15146
  try {
15146
15147
  let t = e.shape ?? (e._def?.shape ? typeof e._def.shape == "function" ? e._def.shape() : e._def.shape : null);
@@ -15153,7 +15154,7 @@ function z_(e) {
15153
15154
  }
15154
15155
  //#endregion
15155
15156
  //#region src/core/sdk/contextPreset.ts
15156
- var B_ = {
15157
+ var z_ = {
15157
15158
  auto: {
15158
15159
  summaryThresholdRatio: .5,
15159
15160
  windowRatio: .4,
@@ -15175,8 +15176,8 @@ var B_ = {
15175
15176
  enableLLMSummary: !0
15176
15177
  }
15177
15178
  };
15178
- function V_(e, t) {
15179
- let n = B_[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
15179
+ function B_(e, t) {
15180
+ let n = z_[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
15180
15181
  return {
15181
15182
  ...n,
15182
15183
  ...r,
@@ -15193,7 +15194,7 @@ function $(e) {
15193
15194
  };
15194
15195
  return e.path !== void 0 && (t.path = e.path), e.hint && (t.hint = e.hint), e.details !== void 0 && (t.details = e.details), `ERROR: ${JSON.stringify(t)}`;
15195
15196
  }
15196
- function H_(e) {
15197
+ function V_(e) {
15197
15198
  return e.slice(0, 10).map((e) => {
15198
15199
  let t = e, n = {
15199
15200
  path: (Array.isArray(t.path) ? t.path.join(".") : String(t.path ?? "")) || "(root)",
@@ -15202,16 +15203,16 @@ function H_(e) {
15202
15203
  return t.expected !== void 0 && (n.expected = t.expected), t.received !== void 0 && (n.received = t.received), t.code !== void 0 && (n.code = t.code), n;
15203
15204
  });
15204
15205
  }
15205
- function U_(e, t) {
15206
+ function H_(e, t) {
15206
15207
  return $({
15207
15208
  code: "SCHEMA_INVALID",
15208
15209
  path: e,
15209
15210
  message: `值不符合 "${e}" 的 schema(${t.length} 处问题)`,
15210
15211
  hint: `用 read({jsonPath:"${e}"}) 查看当前值,按 describe_data() 查看主数据 schema,修正后重试;改大对象优先用 write 的 patch 增量(只发改动部分)`,
15211
- details: H_(t)
15212
+ details: V_(t)
15212
15213
  });
15213
15214
  }
15214
- function W_(e, t, n) {
15215
+ function U_(e, t, n) {
15215
15216
  let r = n?.message || String(n);
15216
15217
  return $({
15217
15218
  code: "JSON_PARSE",
@@ -15220,18 +15221,18 @@ function W_(e, t, n) {
15220
15221
  hint: `检查引号/逗号/括号是否闭合;字符串值需双引号包裹(如 '"dark"' 表示字符串 dark,数字直接写如 5);预览前 80 字符:${t.slice(0, 80)}`
15221
15222
  });
15222
15223
  }
15223
- var G_ = .9;
15224
- function K_(e, t = {}) {
15224
+ var W_ = .9;
15225
+ function G_(e, t = {}) {
15225
15226
  let n = Object.create(null);
15226
- if (e) for (let [t, r] of Object.entries(e)) n[Y_(t)] = {
15227
+ if (e) for (let [t, r] of Object.entries(e)) n[J_(t)] = {
15227
15228
  content: r,
15228
- updatedAt: Z_()
15229
+ updatedAt: X_()
15229
15230
  };
15230
15231
  let { persist: r } = t, i = t.maxBytes ?? 4194304;
15231
15232
  function a() {
15232
- if (J_(n) <= i) return;
15233
- let e = i * G_, t = Object.entries(n).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
15234
- for (let [r] of t) if (delete n[r], J_(n) <= e) break;
15233
+ if (q_(n) <= i) return;
15234
+ let e = i * W_, t = Object.entries(n).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
15235
+ for (let [r] of t) if (delete n[r], q_(n) <= e) break;
15235
15236
  }
15236
15237
  let o = null;
15237
15238
  function s() {
@@ -15256,7 +15257,7 @@ function K_(e, t = {}) {
15256
15257
  }
15257
15258
  }) };
15258
15259
  return r && (l.hydrate = (e) => {
15259
- for (let [t, r] of Object.entries(e)) n[Y_(t)] = r;
15260
+ for (let [t, r] of Object.entries(e)) n[J_(t)] = r;
15260
15261
  a();
15261
15262
  }, l.flush = () => {
15262
15263
  o &&= (clearTimeout(o), null), s();
@@ -15265,17 +15266,17 @@ function K_(e, t = {}) {
15265
15266
  c();
15266
15267
  }), l;
15267
15268
  }
15268
- var q_ = null;
15269
- function J_(e) {
15270
- q_ ||= new TextEncoder();
15269
+ var K_ = null;
15270
+ function q_(e) {
15271
+ K_ ||= new TextEncoder();
15271
15272
  let t = 0;
15272
- for (let n of Object.values(e)) t += q_.encode(n.content).length;
15273
+ for (let n of Object.values(e)) t += K_.encode(n.content).length;
15273
15274
  return t;
15274
15275
  }
15275
- function Y_(e) {
15276
+ function J_(e) {
15276
15277
  return e.replace(/^\/+/, "").replace(/\/+/g, "/");
15277
15278
  }
15278
- function X_(e) {
15279
+ function Y_(e) {
15279
15280
  let t = "";
15280
15281
  for (let n = 0; n < e.length; n++) {
15281
15282
  let r = e[n];
@@ -15283,13 +15284,13 @@ function X_(e) {
15283
15284
  }
15284
15285
  return RegExp("^" + t + "$");
15285
15286
  }
15286
- function Z_() {
15287
+ function X_() {
15287
15288
  return Date.now();
15288
15289
  }
15289
- function Q_(e) {
15290
+ function Z_(e) {
15290
15291
  return [
15291
15292
  n(async ({ path: t, offset: n, limit: r }) => {
15292
- let i = e.files[Y_(t)];
15293
+ let i = e.files[J_(t)];
15293
15294
  if (!i) return $({
15294
15295
  code: "NOT_FOUND",
15295
15296
  path: t,
@@ -15307,9 +15308,9 @@ function Q_(e) {
15307
15308
  limit: t.number().int().min(1).default(2e3).describe("读取行数")
15308
15309
  })
15309
15310
  }),
15310
- n(async ({ path: t, content: n }) => (e.files[Y_(t)] = {
15311
+ n(async ({ path: t, content: n }) => (e.files[J_(t)] = {
15311
15312
  content: n,
15312
- updatedAt: Z_()
15313
+ updatedAt: X_()
15313
15314
  }, `已写入 ${t}(${n.length} 字符)`), {
15314
15315
  name: "vfs_write",
15315
15316
  description: "写入/覆盖虚拟工作区文件,作为中间工作记忆。",
@@ -15319,7 +15320,7 @@ function Q_(e) {
15319
15320
  })
15320
15321
  }),
15321
15322
  n(async ({ path: t, oldString: n, newString: r }) => {
15322
- let i = Y_(t), a = e.files[i];
15323
+ let i = J_(t), a = e.files[i];
15323
15324
  if (!a) return $({
15324
15325
  code: "NOT_FOUND",
15325
15326
  path: t,
@@ -15349,7 +15350,7 @@ function Q_(e) {
15349
15350
  }
15350
15351
  return e.files[i] = {
15351
15352
  content: a.content.replace(n, r),
15352
- updatedAt: Z_()
15353
+ updatedAt: X_()
15353
15354
  }, `已替换 ${t} 中 1 处。`;
15354
15355
  }, {
15355
15356
  name: "vfs_edit",
@@ -15371,7 +15372,7 @@ function Q_(e) {
15371
15372
  n(async ({ pattern: t }) => {
15372
15373
  let n;
15373
15374
  try {
15374
- n = X_(t);
15375
+ n = Y_(t);
15375
15376
  } catch (e) {
15376
15377
  return $({
15377
15378
  code: "GLOB_INVALID",
@@ -15400,7 +15401,7 @@ function Q_(e) {
15400
15401
  details: { pattern: t }
15401
15402
  });
15402
15403
  }
15403
- let i = n ? [Y_(n)] : Object.keys(e.files), a = [];
15404
+ let i = n ? [J_(n)] : Object.keys(e.files), a = [];
15404
15405
  for (let t of i) {
15405
15406
  let n = e.files[t];
15406
15407
  n && n.content.split("\n").forEach((e, n) => {
@@ -15418,17 +15419,17 @@ function Q_(e) {
15418
15419
  })
15419
15420
  ];
15420
15421
  }
15421
- function $_(e) {
15422
+ function Q_(e) {
15422
15423
  return {
15423
15424
  name: "vfs",
15424
- tools: Q_(e),
15425
+ tools: Z_(e),
15425
15426
  beforeAgent: () => ({ files: e.files })
15426
15427
  };
15427
15428
  }
15428
15429
  //#endregion
15429
15430
  //#region src/core/tools/dataSlotQuery.ts
15430
- var ev = /[\w$-]/;
15431
- function tv(e) {
15431
+ var $_ = /[\w$-]/;
15432
+ function ev(e) {
15432
15433
  let t = [], n = e.trim(), r = +(n[0] === "$");
15433
15434
  for (; r < n.length;) {
15434
15435
  let e = n[r];
@@ -15439,7 +15440,7 @@ function tv(e) {
15439
15440
  continue;
15440
15441
  }
15441
15442
  let e = "";
15442
- for (; r < n.length && ev.test(n[r]);) e += n[r++];
15443
+ for (; r < n.length && $_.test(n[r]);) e += n[r++];
15443
15444
  if (!e) throw Error("JSONPath: .. 后缺属性名");
15444
15445
  t.push({
15445
15446
  type: "descendKey",
@@ -15452,7 +15453,7 @@ function tv(e) {
15452
15453
  continue;
15453
15454
  }
15454
15455
  let e = "";
15455
- for (; r < n.length && ev.test(n[r]);) e += n[r++];
15456
+ for (; r < n.length && $_.test(n[r]);) e += n[r++];
15456
15457
  if (!e) throw Error("JSONPath: . 后缺属性名");
15457
15458
  t.push({
15458
15459
  type: "key",
@@ -15508,7 +15509,7 @@ function tv(e) {
15508
15509
  }
15509
15510
  return t;
15510
15511
  }
15511
- function nv(e) {
15512
+ function tv(e) {
15512
15513
  let t = [], n = 0, r = e.trim();
15513
15514
  for (; n < r.length;) {
15514
15515
  let e = r[n];
@@ -15553,7 +15554,7 @@ function nv(e) {
15553
15554
  }
15554
15555
  return t;
15555
15556
  }
15556
- var rv = class {
15557
+ var nv = class {
15557
15558
  toks;
15558
15559
  item;
15559
15560
  pos = 0;
@@ -15589,12 +15590,12 @@ var rv = class {
15589
15590
  return this.next(), e;
15590
15591
  }
15591
15592
  let e = this.operand(), t = this.peek();
15592
- return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), ov(t, e, this.operand())) : iv(e);
15593
+ return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), av(t, e, this.operand())) : rv(e);
15593
15594
  }
15594
15595
  operand() {
15595
15596
  let e = this.next();
15596
15597
  if (e === void 0) throw Error("过滤表达式:缺操作数");
15597
- if (e.startsWith("@")) return av(e, this.item);
15598
+ if (e.startsWith("@")) return iv(e, this.item);
15598
15599
  if (e[0] === "'" || e[0] === "\"") return e.slice(1, -1);
15599
15600
  if (e === "true") return !0;
15600
15601
  if (e === "false") return !1;
@@ -15604,10 +15605,10 @@ var rv = class {
15604
15605
  throw Error(`过滤表达式:未知操作数 '${e}'`);
15605
15606
  }
15606
15607
  };
15607
- function iv(e) {
15608
+ function rv(e) {
15608
15609
  return !!e && e !== 0 && e !== "" && e !== null;
15609
15610
  }
15610
- function av(e, t) {
15611
+ function iv(e, t) {
15611
15612
  let n = e.split(".").filter((e) => e && e !== "@"), r = t;
15612
15613
  for (let e of n) {
15613
15614
  if (typeof r != "object" || !r) return;
@@ -15615,7 +15616,7 @@ function av(e, t) {
15615
15616
  }
15616
15617
  return r;
15617
15618
  }
15618
- function ov(e, t, n) {
15619
+ function av(e, t, n) {
15619
15620
  switch (e) {
15620
15621
  case "==": return t === n;
15621
15622
  case "!=": return t !== n;
@@ -15626,47 +15627,47 @@ function ov(e, t, n) {
15626
15627
  default: return !1;
15627
15628
  }
15628
15629
  }
15629
- function sv(e, t) {
15630
- return new rv(nv(e), t).parse();
15630
+ function ov(e, t) {
15631
+ return new nv(tv(e), t).parse();
15631
15632
  }
15632
- function cv(e, t) {
15633
+ function sv(e, t) {
15633
15634
  return e ? `${e}.${t}` : String(t);
15634
15635
  }
15635
- function lv(e, t) {
15636
+ function cv(e, t) {
15636
15637
  let n = [{
15637
15638
  path: "",
15638
15639
  value: e
15639
15640
  }];
15640
- for (let e of tv(t)) {
15641
+ for (let e of ev(t)) {
15641
15642
  let t = [];
15642
15643
  if (e.type === "key") for (let r of n) r.value != null && typeof r.value == "object" && e.key in r.value && t.push({
15643
- path: cv(r.path, e.key),
15644
+ path: sv(r.path, e.key),
15644
15645
  value: r.value[e.key]
15645
15646
  });
15646
15647
  else if (e.type === "index") {
15647
15648
  for (let r of n) if (Array.isArray(r.value)) {
15648
15649
  let n = r.value[e.index];
15649
15650
  e.index >= 0 && e.index < r.value.length && t.push({
15650
- path: cv(r.path, e.index),
15651
+ path: sv(r.path, e.index),
15651
15652
  value: n,
15652
15653
  index: e.index
15653
15654
  });
15654
15655
  }
15655
15656
  } else if (e.type === "wildcard") {
15656
15657
  for (let e of n) if (Array.isArray(e.value)) e.value.forEach((n, r) => t.push({
15657
- path: cv(e.path, r),
15658
+ path: sv(e.path, r),
15658
15659
  value: n,
15659
15660
  index: r
15660
15661
  }));
15661
15662
  else if (e.value != null && typeof e.value == "object") for (let n of Object.keys(e.value)) t.push({
15662
- path: cv(e.path, n),
15663
+ path: sv(e.path, n),
15663
15664
  value: e.value[n]
15664
15665
  });
15665
15666
  } else if (e.type === "descendKey") {
15666
15667
  let r = e.key, i = (e) => {
15667
15668
  if (!(e.value == null || typeof e.value != "object")) for (let n of Object.keys(e.value)) {
15668
15669
  let a = {
15669
- path: cv(e.path, n),
15670
+ path: sv(e.path, n),
15670
15671
  value: e.value[n]
15671
15672
  };
15672
15673
  n === r && t.push(a), i(a);
@@ -15677,7 +15678,7 @@ function lv(e, t) {
15677
15678
  let e = (n) => {
15678
15679
  if (!(n.value == null || typeof n.value != "object")) for (let r of Object.keys(n.value)) {
15679
15680
  let i = {
15680
- path: cv(n.path, r),
15681
+ path: sv(n.path, r),
15681
15682
  value: n.value[r]
15682
15683
  };
15683
15684
  t.push(i), e(i);
@@ -15686,16 +15687,16 @@ function lv(e, t) {
15686
15687
  for (let t of n) e(t);
15687
15688
  } else if (e.type === "filter") {
15688
15689
  for (let r of n) if (Array.isArray(r.value)) r.value.forEach((n, i) => {
15689
- sv(e.filter, n) && t.push({
15690
- path: cv(r.path, i),
15690
+ ov(e.filter, n) && t.push({
15691
+ path: sv(r.path, i),
15691
15692
  value: n,
15692
15693
  index: i
15693
15694
  });
15694
15695
  });
15695
15696
  else if (r.value != null && typeof r.value == "object") for (let n of Object.keys(r.value)) {
15696
15697
  let i = r.value[n];
15697
- sv(e.filter, i) && t.push({
15698
- path: cv(r.path, n),
15698
+ ov(e.filter, i) && t.push({
15699
+ path: sv(r.path, n),
15699
15700
  value: i
15700
15701
  });
15701
15702
  }
@@ -15704,7 +15705,7 @@ function lv(e, t) {
15704
15705
  }
15705
15706
  return n;
15706
15707
  }
15707
- function uv(e, t) {
15708
+ function lv(e, t) {
15708
15709
  let n = e.length, r = t.length;
15709
15710
  if (!n) return r;
15710
15711
  if (!r) return n;
@@ -15720,7 +15721,7 @@ function uv(e, t) {
15720
15721
  }
15721
15722
  return i[r];
15722
15723
  }
15723
- function dv(e, t, n = {}) {
15724
+ function uv(e, t, n = {}) {
15724
15725
  let r = n.mode || "substring", i = n.limit ?? 50, a = n.matchKey !== !1, o = [], s = null;
15725
15726
  if (r === "regex") try {
15726
15727
  s = new RegExp(t, "i");
@@ -15730,11 +15731,11 @@ function dv(e, t, n = {}) {
15730
15731
  let c = (e, l, u) => {
15731
15732
  if (o.length >= i || e == null) return;
15732
15733
  if (typeof e == "object") {
15733
- if (Array.isArray(e)) e.forEach((e, t) => c(e, cv(l, t), String(t)));
15734
- else for (let t of Object.keys(e)) c(e[t], cv(l, t), t);
15734
+ if (Array.isArray(e)) e.forEach((e, t) => c(e, sv(l, t), String(t)));
15735
+ else for (let t of Object.keys(e)) c(e[t], sv(l, t), t);
15735
15736
  return;
15736
15737
  }
15737
- let d = String(e), f = fv(d, t, r, n.fuzzyThreshold ?? 2, s);
15738
+ let d = String(e), f = dv(d, t, r, n.fuzzyThreshold ?? 2, s);
15738
15739
  if (f) {
15739
15740
  o.push({
15740
15741
  path: l,
@@ -15745,7 +15746,7 @@ function dv(e, t, n = {}) {
15745
15746
  return;
15746
15747
  }
15747
15748
  if (a && u) {
15748
- let e = fv(u, t, r, n.fuzzyThreshold ?? 2, s);
15749
+ let e = dv(u, t, r, n.fuzzyThreshold ?? 2, s);
15749
15750
  e && o.push({
15750
15751
  path: l,
15751
15752
  key: u,
@@ -15756,18 +15757,18 @@ function dv(e, t, n = {}) {
15756
15757
  };
15757
15758
  return c(e, ""), o;
15758
15759
  }
15759
- function fv(e, t, n, r, i) {
15760
+ function dv(e, t, n, r, i) {
15760
15761
  let a = e.toLowerCase(), o = t.toLowerCase();
15761
15762
  if (n === "substring") return a.includes(o) ? 1 : null;
15762
15763
  if (n === "regex") return i && i.test(e) ? 1 : null;
15763
15764
  if (n === "fuzzy") {
15764
15765
  if (a.includes(o)) return 2;
15765
- let e = uv(a, o);
15766
+ let e = lv(a, o);
15766
15767
  return e <= r ? r - e + 1 : null;
15767
15768
  }
15768
15769
  return null;
15769
15770
  }
15770
- var pv = [
15771
+ var fv = [
15771
15772
  "self.fetch = () => { throw new Error('fetch 已被沙箱禁用') }",
15772
15773
  "self.XMLHttpRequest = function(){ throw new Error('XMLHttpRequest 已被沙箱禁用') }",
15773
15774
  "self.importScripts = () => { throw new Error('importScripts 已被沙箱禁用') }",
@@ -15780,7 +15781,7 @@ var pv = [
15780
15781
  "try { self.BroadcastChannel = undefined } catch {}",
15781
15782
  "if (self.navigator && self.navigator.sendBeacon) self.navigator.sendBeacon = () => { throw new Error('sendBeacon 已被沙箱禁用') }"
15782
15783
  ].join("\n");
15783
- function mv(e, t, n = 3e3) {
15784
+ function pv(e, t, n = 3e3) {
15784
15785
  return new Promise((r) => {
15785
15786
  let i = Date.now(), a = !1, o = (e) => {
15786
15787
  if (!a) {
@@ -15793,7 +15794,7 @@ function mv(e, t, n = 3e3) {
15793
15794
  elapsedMs: Date.now() - i
15794
15795
  });
15795
15796
  }
15796
- }, s = pv + "\nself.onmessage = async (e) => {\n try {\n const fn = new Function(\"data\", e.data.script);\n let result = fn(e.data.data);\n if (result && typeof result.then === \"function\") result = await result;\n self.postMessage({ ok: true, result });\n } catch (err) {\n self.postMessage({ ok: false, error: String((err && err.message) || err) });\n }\n};", c, l;
15797
+ }, s = fv + "\nself.onmessage = async (e) => {\n try {\n const fn = new Function(\"data\", e.data.script);\n let result = fn(e.data.data);\n if (result && typeof result.then === \"function\") result = await result;\n self.postMessage({ ok: true, result });\n } catch (err) {\n self.postMessage({ ok: false, error: String((err && err.message) || err) });\n }\n};", c, l;
15797
15798
  try {
15798
15799
  let e = new Blob([s], { type: "application/javascript" });
15799
15800
  c = URL.createObjectURL(e), l = new Worker(c);
@@ -15828,20 +15829,20 @@ function mv(e, t, n = 3e3) {
15828
15829
  }
15829
15830
  //#endregion
15830
15831
  //#region src/core/tools/dataOps.ts
15831
- var hv = /* @__PURE__ */ new Set([
15832
+ var mv = /* @__PURE__ */ new Set([
15832
15833
  "__proto__",
15833
15834
  "constructor",
15834
15835
  "prototype"
15835
15836
  ]);
15836
- function gv(e) {
15837
- return e.split(".").some((e) => hv.has(e));
15837
+ function hv(e) {
15838
+ return e.split(".").some((e) => mv.has(e));
15838
15839
  }
15839
- function _v(e, t) {
15840
- if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t)) hv.has(n) || (e[n] = t[n]);
15840
+ function gv(e, t) {
15841
+ if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t)) mv.has(n) || (e[n] = t[n]);
15841
15842
  }
15842
- function vv(e, t) {
15843
+ function _v(e, t) {
15843
15844
  if (!t) return e;
15844
- if (gv(t)) return;
15845
+ if (hv(t)) return;
15845
15846
  let n = t.split("."), r = e;
15846
15847
  for (let e of n) {
15847
15848
  if (r == null) return;
@@ -15849,8 +15850,8 @@ function vv(e, t) {
15849
15850
  }
15850
15851
  return r;
15851
15852
  }
15852
- function yv(e, t, n) {
15853
- if (!t || gv(t)) return;
15853
+ function vv(e, t, n) {
15854
+ if (!t || hv(t)) return;
15854
15855
  let r = t.split("."), i = e;
15855
15856
  for (let e = 0; e < r.length - 1; e++) {
15856
15857
  let t = r[e];
@@ -15858,8 +15859,8 @@ function yv(e, t, n) {
15858
15859
  }
15859
15860
  i[r[r.length - 1]] = n;
15860
15861
  }
15861
- function bv(e, t) {
15862
- if (!t || gv(t)) return !1;
15862
+ function yv(e, t) {
15863
+ if (!t || hv(t)) return !1;
15863
15864
  let n = t.split("."), r = e;
15864
15865
  for (let e = 0; e < n.length - 1; e++) {
15865
15866
  if (r == null) return !1;
@@ -15868,10 +15869,37 @@ function bv(e, t) {
15868
15869
  let i = n[n.length - 1];
15869
15870
  return r == null || !(i in r) ? !1 : (delete r[i], !0);
15870
15871
  }
15871
- function xv(e) {
15872
+ function bv(e) {
15872
15873
  return e === void 0 ? void 0 : JSON.parse(JSON.stringify(e));
15873
15874
  }
15874
- function Sv(e, t = Infinity) {
15875
+ function xv(e) {
15876
+ if (typeof e != "string") return { parsed: e };
15877
+ let t = e.trim();
15878
+ if (!t) return { parsed: e };
15879
+ let n = t[0] === "{" || t[0] === "[";
15880
+ try {
15881
+ return { parsed: JSON.parse(t) };
15882
+ } catch (t) {
15883
+ return n ? { parseError: t } : { parsed: e };
15884
+ }
15885
+ }
15886
+ function Sv(e, t) {
15887
+ if (typeof e != "object" || !e) return e;
15888
+ let n = new Set(t);
15889
+ if (Array.isArray(e)) return e.map((e) => Sv(e, t));
15890
+ let r = {};
15891
+ for (let t of Object.keys(e)) n.has(t) && (r[t] = e[t]);
15892
+ return r;
15893
+ }
15894
+ function Cv(e, t) {
15895
+ if (typeof e != "object" || !e) return e;
15896
+ if (t <= 0) return Array.isArray(e) ? `[...${e.length}]` : "{...}";
15897
+ if (Array.isArray(e)) return e.map((e) => Cv(e, t - 1));
15898
+ let n = {};
15899
+ for (let r of Object.keys(e)) n[r] = Cv(e[r], t - 1);
15900
+ return n;
15901
+ }
15902
+ function wv(e, t = Infinity) {
15875
15903
  let n = /* @__PURE__ */ new WeakSet(), r;
15876
15904
  try {
15877
15905
  r = JSON.stringify(e, (e, t) => {
@@ -15890,34 +15918,62 @@ function Sv(e, t = Infinity) {
15890
15918
  }
15891
15919
  return r.length > t && (r = r.slice(0, t) + `\n…[已截断,原长度 ${r.length}]`), r;
15892
15920
  }
15893
- function Cv(e) {
15894
- let t = Sv(e), n = 5381;
15921
+ function Tv(e) {
15922
+ let t = wv(e), n = 5381;
15895
15923
  for (let e = 0; e < t.length; e++) n = (n << 5) + n + t.charCodeAt(e) >>> 0;
15896
15924
  return n.toString(36);
15897
15925
  }
15898
- function wv(e, t, n, r) {
15899
- if (t === "set") return n ? (yv(e, n, r), null) : "set 操作需要 jsonPath(整体替换请用 set_data)";
15900
- if (t === "remove") return n ? (bv(e, n), null) : "remove 操作需要 jsonPath";
15926
+ function Ev(e) {
15927
+ let t = e;
15928
+ for (let e = 0; e < 5 && t && t._def; e++) {
15929
+ if (t._def.innerType) {
15930
+ t = t._def.innerType;
15931
+ continue;
15932
+ }
15933
+ break;
15934
+ }
15935
+ if (!t || !t.shape || typeof t.shape != "object") return null;
15936
+ try {
15937
+ let e = typeof t.shape == "function" ? t.shape() : t.shape;
15938
+ return Object.keys(e);
15939
+ } catch {
15940
+ return null;
15941
+ }
15942
+ }
15943
+ function Dv(e, t) {
15944
+ if (!t || !e) return !0;
15945
+ let n = e.split(".")[0];
15946
+ return t.includes(n);
15947
+ }
15948
+ function Ov(e, t) {
15949
+ if (!t || typeof e != "object" || !e || Array.isArray(e)) return e;
15950
+ let n = new Set(t), r = {};
15951
+ for (let t of Object.keys(e)) n.has(t) && (r[t] = e[t]);
15952
+ return r;
15953
+ }
15954
+ function kv(e, t, n, r) {
15955
+ if (t === "set") return n ? (vv(e, n, r), null) : "set 操作需要 jsonPath(整体替换请用 set_data)";
15956
+ if (t === "remove") return n ? (yv(e, n), null) : "remove 操作需要 jsonPath";
15901
15957
  if (t === "merge") {
15902
- let t = n ? vv(e, n) : e;
15903
- return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (_v(t, r), null);
15958
+ let t = n ? _v(e, n) : e;
15959
+ return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (gv(t, r), null);
15904
15960
  }
15905
- let i = n ? vv(e, n) : e;
15961
+ let i = n ? _v(e, n) : e;
15906
15962
  return Array.isArray(i) ? (Array.isArray(r) ? i.push(...r) : i.push(r), null) : `append 目标${n ? `(${n})` : "(根)"}不是数组`;
15907
15963
  }
15908
- function Tv(e, t, n, r) {
15909
- if (t === "set") yv(e, n, r);
15910
- else if (t === "remove") bv(e, n);
15911
- else if (t === "merge") _v(n ? vv(e, n) : e, r);
15964
+ function Av(e, t, n, r) {
15965
+ if (t === "set") vv(e, n, r);
15966
+ else if (t === "remove") yv(e, n);
15967
+ else if (t === "merge") gv(n ? _v(e, n) : e, r);
15912
15968
  else {
15913
- let t = n ? vv(e, n) : e;
15969
+ let t = n ? _v(e, n) : e;
15914
15970
  Array.isArray(r) ? t.push(...r) : t.push(r);
15915
15971
  }
15916
15972
  }
15917
- function Ev(e, t) {
15918
- typeof e == "object" && e && Dv(e, t);
15973
+ function jv(e, t) {
15974
+ typeof e == "object" && e && Mv(e, t);
15919
15975
  }
15920
- function Dv(e, t) {
15976
+ function Mv(e, t) {
15921
15977
  if (Array.isArray(e)) {
15922
15978
  e.length = 0, Array.isArray(t) && e.push(...t);
15923
15979
  return;
@@ -15926,51 +15982,51 @@ function Dv(e, t) {
15926
15982
  for (let t of Object.keys(e)) t in n || delete e[t];
15927
15983
  for (let t of Object.keys(n)) e[t] = n[t];
15928
15984
  }
15929
- var Ov = /* @__PURE__ */ new Set([
15985
+ var Nv = /* @__PURE__ */ new Set([
15930
15986
  "describe_data",
15931
15987
  "get_data",
15932
15988
  "set_data",
15933
15989
  "edit_data",
15934
15990
  "delete_data"
15935
- ]), kv = /* @__PURE__ */ new Set(["read", "write"]);
15936
- function Av(e, t = "simple") {
15937
- return t === "advanced" ? e : t === "minimal" ? e.filter((e) => kv.has(e.name)) : e.filter((e) => !Ov.has(e.name));
15991
+ ]), Pv = /* @__PURE__ */ new Set(["read", "write"]);
15992
+ function Fv(e, t = "simple") {
15993
+ return t === "advanced" ? e : t === "minimal" ? e.filter((e) => Pv.has(e.name)) : e.filter((e) => !Nv.has(e.name));
15938
15994
  }
15939
- function jv(e, r = {}) {
15940
- let i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s = [], c = r.maxSnapshots ?? 20, l, u = r.autoLock !== !1, d = {
15995
+ function Iv(e, r = {}) {
15996
+ let i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s = Ev(i), c = [], l = r.maxSnapshots ?? 20, u, d = r.autoLock !== !1, f = {
15941
15997
  get: () => ({
15942
15998
  schema: i,
15943
15999
  bind: a,
15944
16000
  description: o
15945
16001
  }),
15946
16002
  set: (e) => {
15947
- i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s.length = 0, l = void 0;
16003
+ i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s = Ev(i), c.length = 0, u = void 0;
15948
16004
  },
15949
16005
  update: (e) => {
15950
- a = e, s.length = 0, l = void 0;
16006
+ a = e, c.length = 0, u = void 0;
15951
16007
  }
15952
- }, f = (e) => {
16008
+ }, p = (e) => {
15953
16009
  r.onAudit?.(e);
15954
16010
  };
15955
- function p(e, t) {
15956
- let n = xv(a), r = s.length ? s[s.length - 1].id + 1 : 1;
15957
- for (s.push({
16011
+ function m(e, t) {
16012
+ let n = bv(a), r = c.length ? c[c.length - 1].id + 1 : 1;
16013
+ for (c.push({
15958
16014
  id: r,
15959
16015
  ts: Date.now(),
15960
16016
  op: e,
15961
16017
  label: t,
15962
16018
  value: n
15963
- }); s.length > c;) s.shift();
16019
+ }); c.length > l;) c.shift();
15964
16020
  return r;
15965
16021
  }
15966
- async function m(e, t, n) {
16022
+ async function h(e, t, n) {
15967
16023
  if (!t || t === "") return null;
15968
- let i = Cv(a);
16024
+ let i = Tv(a);
15969
16025
  if (i === t) return null;
15970
16026
  if (!r.onConflict) return $({
15971
16027
  code: "VERSION_CONFLICT",
15972
16028
  message: `乐观锁冲突:expectedHash=${t} 但当前 hash=${i}。主数据在你 read 之后已被修改(外部代码/其他 agent/用户手动改)。`,
15973
- hint: `重新 read 拿最新值与 hash,基于最新值修改后再写入(传新的 expectedHash)。当前值:${Sv(a, 400)}`
16029
+ hint: `重新 read 拿最新值与 hash,基于最新值修改后再写入(传新的 expectedHash)。当前值:${wv(a, 400)}`
15974
16030
  });
15975
16031
  let o = await r.onConflict({
15976
16032
  op: e,
@@ -15980,44 +16036,52 @@ function jv(e, r = {}) {
15980
16036
  expectedHash: t,
15981
16037
  snapshotId: 0
15982
16038
  });
15983
- if (o.action === "keep_external") return `已保留外部修改(未写入)。当前值:${Sv(a, 400)} (hash=${i})。请重新 read 拿最新值与 hash 再改。`;
16039
+ if (o.action === "keep_external") return `已保留外部修改(未写入)。当前值:${wv(a, 400)} (hash=${i})。请重新 read 拿最新值与 hash 再改。`;
15984
16040
  if (o.action === "restore") {
15985
- if (!s.length) return `无历史快照可回退(本次为首次操作)。当前值:${Sv(a, 400)} (hash=${i})。请重新 read 再改或选「强制覆盖」。`;
15986
- let e = s[s.length - 1];
15987
- return Ev(a, xv(e.value)), `已回退主数据到历史快照 #${e.id}[${e.op}]。当前值:${Sv(a, 400)} (hash=${Cv(a)})。请基于回退后的值重写或停止。`;
16041
+ if (!c.length) return `无历史快照可回退(本次为首次操作)。当前值:${wv(a, 400)} (hash=${i})。请重新 read 再改或选「强制覆盖」。`;
16042
+ let e = c[c.length - 1];
16043
+ return jv(a, bv(e.value)), `已回退主数据到历史快照 #${e.id}[${e.op}]。当前值:${wv(a, 400)} (hash=${Tv(a)})。请基于回退后的值重写或停止。`;
15988
16044
  }
15989
16045
  return null;
15990
16046
  }
15991
- let h = [
16047
+ let g = [
15992
16048
  n(async () => [`说明: ${o}`, "格式: 写入值需为 JSON,且通过声明的 schema 校验(校验失败时 set_data/edit_data 会返回结构化错误,含具体字段与期望类型)。"].join("\n"), {
15993
16049
  name: "describe_data",
15994
16050
  description: "获取主数据的说明与格式要求。",
15995
16051
  schema: t.object({})
15996
16052
  }),
15997
16053
  n(async ({ jsonPath: e }) => {
15998
- let t = vv(a, e || ""), n = Cv(a);
15999
- return l = n, t === void 0 ? `主数据${e ? ` @ ${e}` : ""} = (undefined) (hash=${n})` : `主数据${e ? ` @ ${e}` : ""} = ${Sv(t)} (hash=${n})`;
16054
+ let t = e || "";
16055
+ if (!Dv(t, s)) return $({
16056
+ code: "PATH_DENIED",
16057
+ message: `get_data @ "${t}" 不在 schema 声明字段内(仅 schema 声明的 key 可读)`,
16058
+ hint: "主数据仅暴露 schema 声明的字段;若需操作该字段,集成方需在 schema 中声明它"
16059
+ });
16060
+ let n = t ? _v(a, t) : a;
16061
+ t || (n = Ov(n, s));
16062
+ let r = Tv(a);
16063
+ return u = r, n === void 0 ? `主数据${t ? ` @ ${t}` : ""} = (undefined) (hash=${r})` : `主数据${t ? ` @ ${t}` : ""} = ${wv(n)} (hash=${r})`;
16000
16064
  }, {
16001
16065
  name: "get_data",
16002
16066
  description: "读取主数据的当前值(安全序列化:函数/DOM/循环引用做摘要;大结果由系统自动外存,提示用 vfs_read 回读)。返回含 hash(乐观锁):改前先 read/get 拿 hash,写入时传 expectedHash 回传,系统对比当前 hash 防\"基于过期值覆盖\"。jsonPath 可选:读整个主数据不传,读子路径传(如 components.0.text)。",
16003
16067
  schema: t.object({ jsonPath: t.string().optional().describe("相对主数据根的点号路径(如 components.0.text);不传则读整个主数据") })
16004
16068
  }),
16005
16069
  n(async ({ value: e, expectedHash: t }) => {
16006
- let n = await m("set", t || (u ? l : void 0));
16070
+ let n = await h("set", t || (d ? u : void 0));
16007
16071
  if (n !== null) return n;
16008
- let r;
16009
- if (typeof e == "string") try {
16010
- r = JSON.parse(e);
16011
- } catch (t) {
16012
- return W_("", e, t);
16013
- }
16014
- else r = e;
16015
- let o = i.safeParse(r);
16016
- return o.success ? (p("set"), typeof a == "object" && a && o.data !== null && typeof o.data == "object" && Dv(a, o.data), f({
16072
+ let r, o = xv(e);
16073
+ if (o.parseError) return U_("", e, o.parseError);
16074
+ r = o.parsed;
16075
+ let c = i.safeParse(r);
16076
+ return c.success ? typeof a != "object" || !a ? $({
16077
+ code: "LEAF_BIND",
16078
+ message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),set_data 无法就地替换外部持有的值引用`,
16079
+ hint: "主数据 bind 必须为对象/数组(低代码主 JSON 本就是);叶子值请用对象包裹(如 {value:\"x\"})或集成方通过 sdk.setData 替换 bind"
16080
+ }) : (m("set"), c.data !== null && typeof c.data == "object" && (s ? gv(a, c.data) : Mv(a, c.data)), p({
16017
16081
  op: "set",
16018
- value: o.data,
16082
+ value: c.data,
16019
16083
  timestamp: Date.now()
16020
- }), l = Cv(a), `已设置主数据 = ${Sv(o.data, 600)} (新 hash=${Cv(a)})`) : U_("", o.error.issues);
16084
+ }), u = Tv(a), `已设置主数据 = ${wv(c.data, 600)} (新 hash=${Tv(a)})${s ? "(白名单模式:仅更新 schema 声明字段,未声明字段保留)" : ""}`) : H_("", c.error.issues);
16021
16085
  }, {
16022
16086
  name: "set_data",
16023
16087
  description: "设置主数据的值(整体替换)。value 为 JSON 对象(或 JSON 字符串),需通过 schema 校验。校验失败会返回错误而非写入。expectedHash(可选):改前 read/get 返回的 hash,传入则启用乐观锁;不传时系统自动用你最后一次读到的 hash 比对(autoLock,默认开)。大对象/数组强烈建议改用 edit_data 增量 patch。",
@@ -16028,45 +16092,47 @@ function jv(e, r = {}) {
16028
16092
  }),
16029
16093
  n(async ({ op: e, jsonPath: t, value: n, expectedHash: r }) => {
16030
16094
  let o = t || "";
16031
- if (gv(o)) return $({
16095
+ if (hv(o)) return $({
16032
16096
  code: "PATH_UNSAFE",
16033
16097
  message: `jsonPath "${o}" 含非法段(__proto__/constructor/prototype)`,
16034
16098
  hint: "使用正常的属性路径,如 components.0.text(数组索引用数字)"
16035
16099
  });
16036
- let s = await m("edit", r || (u ? l : void 0));
16037
- if (s !== null) return s;
16100
+ if (!Dv(o, s)) return $({
16101
+ code: "PATH_DENIED",
16102
+ message: `edit_data @ "${o}" 不在 schema 声明字段内`,
16103
+ hint: "仅 schema 声明的 key 可写;若需操作该字段,集成方需在 schema 中声明它"
16104
+ });
16105
+ let c = await h("edit", r || (d ? u : void 0));
16106
+ if (c !== null) return c;
16038
16107
  if (typeof a != "object" || !a) return $({
16039
16108
  code: "NOT_OBJECT",
16040
16109
  message: `edit 仅适用于对象/数组主数据,当前是 ${a === void 0 ? "undefined" : typeof a}`,
16041
16110
  hint: "叶子(原始类型)请用 set_data 整体设置"
16042
16111
  });
16043
- let c;
16112
+ let l;
16044
16113
  if (e !== "remove") {
16045
16114
  if (n === void 0 || n === "") return $({
16046
16115
  code: "MISSING_VALUE",
16047
16116
  message: `${e} 操作需要 value`,
16048
16117
  hint: `op 为 ${e} 时 value 必填;删除请用 op:'remove'`
16049
16118
  });
16050
- if (typeof n == "string") try {
16051
- c = JSON.parse(n);
16052
- } catch (e) {
16053
- return W_("", n, e);
16054
- }
16055
- else c = n;
16119
+ let t = xv(n);
16120
+ if (t.parseError) return U_("", n, t.parseError);
16121
+ l = t.parsed;
16056
16122
  }
16057
- let d = xv(a), h = wv(d, e, o, c);
16058
- if (h) return $({
16123
+ let f = bv(a), g = kv(f, e, o, l);
16124
+ if (g) return $({
16059
16125
  code: "PATCH_FAILED",
16060
- message: h,
16126
+ message: g,
16061
16127
  hint: "检查 op 与目标类型:merge 需对象,append 需数组;jsonPath 指向需存在"
16062
16128
  });
16063
- let g = i.safeParse(d);
16064
- return g.success ? (p("edit"), Tv(a, e, o, c), f({
16129
+ let _ = i.safeParse(f);
16130
+ return _.success ? (m("edit"), Av(a, e, o, l), p({
16065
16131
  op: "edit",
16066
16132
  detail: `${e}${o ? "@" + o : ""}`,
16067
- value: c,
16133
+ value: l,
16068
16134
  timestamp: Date.now()
16069
- }), l = Cv(a), `已 edit 主数据(${e}${o ? " @ " + o : ""})。当前值:${Sv(a, 600)} (新 hash=${Cv(a)})`) : U_("", g.error.issues);
16135
+ }), u = Tv(a), `已 edit 主数据(${e}${o ? " @ " + o : ""})。当前值:${wv(a, 600)} (新 hash=${Tv(a)})`) : H_("", _.error.issues);
16070
16136
  }, {
16071
16137
  name: "edit_data",
16072
16138
  description: "增量编辑主数据(对象/数组),只发改动的 patch,无需重传整个大对象。op:set(在 jsonPath 设值)、remove(删 jsonPath)、merge(把 value 合并到 jsonPath 指向的对象,默认根)、append(把 value 追加到 jsonPath 指向的数组,默认根)。jsonPath 为相对主数据根的点号路径(数组索引用数字,如 components.0.text);value 为 JSON 对象(推荐直传)或 JSON 字符串。整体仍经 schema 校验,失败不写入。expectedHash(可选):改前 read/get 返回的 hash;不传时自动用你最后读到的 hash(autoLock,默认开)防\"基于过期值覆盖\"。",
@@ -16088,20 +16154,25 @@ function jv(e, r = {}) {
16088
16154
  message: "delete_data 需要 jsonPath 指定要删的子路径(主数据整体不可删,用 set_data 整体替换)",
16089
16155
  hint: "如 jsonPath:\"components.0\" 删数组首项"
16090
16156
  });
16091
- if (gv(e)) return $({
16157
+ if (hv(e)) return $({
16092
16158
  code: "PATH_UNSAFE",
16093
16159
  message: `jsonPath "${e}" 含非法段`,
16094
16160
  hint: "使用正常属性路径"
16095
16161
  });
16096
- let n = await m("delete", t || (u ? l : void 0));
16162
+ if (!Dv(e, s)) return $({
16163
+ code: "PATH_DENIED",
16164
+ message: `delete_data @ "${e}" 不在 schema 声明字段内`,
16165
+ hint: "仅 schema 声明的 key 可删"
16166
+ });
16167
+ let n = await h("delete", t || (d ? u : void 0));
16097
16168
  if (n !== null) return n;
16098
- p("delete");
16099
- let r = bv(a, e);
16100
- return f({
16169
+ m("delete");
16170
+ let r = yv(a, e);
16171
+ return p({
16101
16172
  op: "delete",
16102
16173
  detail: e,
16103
16174
  timestamp: Date.now()
16104
- }), l = Cv(a), r ? `已删除主数据 @ ${e}` : `主数据 @ ${e} 不存在(无需删除)`;
16175
+ }), u = Tv(a), r ? `已删除主数据 @ ${e}` : `主数据 @ ${e} 不存在(无需删除)`;
16105
16176
  }, {
16106
16177
  name: "delete_data",
16107
16178
  description: "删除主数据的某个子路径(jsonPath)。主数据整体不可删(用 set_data 整体替换)。expectedHash(可选):改前 read/get 返回的 hash;不传时自动用你最后读到的 hash(autoLock,默认开)防\"基于过期值删除\"。",
@@ -16110,45 +16181,45 @@ function jv(e, r = {}) {
16110
16181
  expectedHash: t.string().optional().describe("乐观锁:改前 read/get 返回的 hash;传入则校验,不一致拒绝删除防覆盖")
16111
16182
  })
16112
16183
  }),
16113
- n(async ({ label: e }) => `已为主数据创建快照 #${p("manual", e)}${e ? `(${e})` : ""}。可用 list_data_snapshots 查看、restore_data 回退。`, {
16184
+ n(async ({ label: e }) => `已为主数据创建快照 #${m("manual", e)}${e ? `(${e})` : ""}。可用 list_data_snapshots 查看、restore_data 回退。`, {
16114
16185
  name: "snapshot_data",
16115
16186
  description: "为主数据手动创建一个命名快照(检查点)。set/edit/delete 也会自动存快照。",
16116
16187
  schema: t.object({ label: t.string().optional().describe("可选的快照标签,便于识别") })
16117
16188
  }),
16118
16189
  n(async () => {
16119
- if (!s.length) return "无快照。set/edit/delete 会自动存快照,也可用 snapshot_data 手动创建检查点。";
16120
- let e = s.map((e) => {
16190
+ if (!c.length) return "无快照。set/edit/delete 会自动存快照,也可用 snapshot_data 手动创建检查点。";
16191
+ let e = c.map((e) => {
16121
16192
  let t = JSON.stringify(e.value ?? "").length, n = new Date(e.ts).toLocaleTimeString("zh-CN", { hour12: !1 });
16122
16193
  return ` #${e.id} [${e.op}]${e.label ? ` "${e.label}"` : ""} ${n} 修改前≈${t}字符`;
16123
16194
  });
16124
- return `主数据快照(共 ${s.length} 条):\n${e.join("\n")}`;
16195
+ return `主数据快照(共 ${c.length} 条):\n${e.join("\n")}`;
16125
16196
  }, {
16126
16197
  name: "list_data_snapshots",
16127
16198
  description: "列出主数据的快照时间线(序号、操作类型、标签、大小)。",
16128
16199
  schema: t.object({})
16129
16200
  }),
16130
16201
  n(async ({ id: e }) => {
16131
- if (!s.length) return $({
16202
+ if (!c.length) return $({
16132
16203
  code: "NO_SNAPSHOT",
16133
16204
  message: "无快照可回退",
16134
16205
  hint: "set/edit/delete 会自动存快照;也可先 snapshot_data 手动创建检查点"
16135
16206
  });
16136
- let t = e === void 0 ? s[s.length - 1] : s.find((t) => t.id === e);
16207
+ let t = e === void 0 ? c[c.length - 1] : c.find((t) => t.id === e);
16137
16208
  if (!t) return $({
16138
16209
  code: "SNAPSHOT_NOT_FOUND",
16139
16210
  message: `未找到快照 #${e}`,
16140
16211
  hint: "用 list_data_snapshots 查看可用快照序号"
16141
16212
  });
16142
16213
  let n = i.safeParse(t.value);
16143
- return n.success ? (Ev(a, xv(t.value)), f({
16214
+ return n.success ? (jv(a, bv(t.value)), p({
16144
16215
  op: "restore",
16145
16216
  detail: `#${t.id}`,
16146
16217
  timestamp: Date.now()
16147
- }), l = Cv(a), `已回退主数据到快照 #${t.id}[${t.op}]${t.label ? `(${t.label})` : ""}。`) : $({
16218
+ }), u = Tv(a), `已回退主数据到快照 #${t.id}[${t.op}]${t.label ? `(${t.label})` : ""}。`) : $({
16148
16219
  code: "SNAPSHOT_SCHEMA_INVALID",
16149
16220
  message: `快照 #${t.id} 的值不符合当前 schema,无法回退`,
16150
16221
  hint: "schema 可能已变更;该快照已过期,选其他快照或重新设置",
16151
- details: H_(n.error.issues)
16222
+ details: V_(n.error.issues)
16152
16223
  });
16153
16224
  }, {
16154
16225
  name: "restore_data",
@@ -16161,9 +16232,9 @@ function jv(e, r = {}) {
16161
16232
  message: `主数据不是对象/数组,无法查询(当前为 ${a === void 0 ? "undefined" : typeof a})`,
16162
16233
  hint: "query 仅适用于对象/数组;叶子用 get_data 读"
16163
16234
  });
16164
- let n;
16235
+ let n = s ? Ov(a, s) : a, r;
16165
16236
  try {
16166
- n = lv(a, e);
16237
+ r = cv(n, e);
16167
16238
  } catch (t) {
16168
16239
  return $({
16169
16240
  code: "JSONPATH_SYNTAX",
@@ -16172,8 +16243,8 @@ function jv(e, r = {}) {
16172
16243
  details: { expr: e }
16173
16244
  });
16174
16245
  }
16175
- let r = t ?? 50, i = n.slice(0, r), o = i.map((e) => `{"path":${JSON.stringify(e.path)},"index":${e.index === void 0 ? "null" : e.index},"value":${Sv(e.value)}}`);
16176
- return `{"matched":${n.length},"returned":${i.length},"truncated":${n.length > r},"results":[${o.join(",")}]}`;
16246
+ let i = t ?? 50, o = r.slice(0, i), c = o.map((e) => `{"path":${JSON.stringify(e.path)},"index":${e.index === void 0 ? "null" : e.index},"value":${wv(e.value)}}`);
16247
+ return `{"matched":${r.length},"returned":${o.length},"truncated":${r.length > i},"results":[${c.join(",")}]}`;
16177
16248
  }, {
16178
16249
  name: "query_data",
16179
16250
  description: "用 JSONPath 表达式对主数据做结构化查询(只读,无副作用)。语法子集:$ 根、.key、[n]、[\"key\"]、[*] 通配、[?(filter)] 过滤、..key 递归找后代、..* 全后代。过滤表达式:@.field op literal(op:==/!=/</<=/>/>=),&&/||/() 连接;@ 指当前元素。注意过滤作用于\"当前节点的子元素数组\",若主数据是对象需先点出数组字段再过滤,如 $.components[?(@.type==\"card\" && @.price<100)]。返回匹配元素的 path(相对主数据根,数组索引可作后续 edit_data 的 jsonPath)+ index(若父为数组)+ value。适合在大数组里按条件筛选元素,定位后再用 edit_data 增量改。",
@@ -16188,13 +16259,13 @@ function jv(e, r = {}) {
16188
16259
  message: "主数据为空,无可搜索内容"
16189
16260
  });
16190
16261
  try {
16191
- let o = dv(a, e, {
16262
+ let o = uv(s ? Ov(a, s) : a, e, {
16192
16263
  mode: t,
16193
16264
  fuzzyThreshold: n,
16194
16265
  matchKey: r,
16195
16266
  limit: i ?? 50
16196
16267
  });
16197
- return Sv({
16268
+ return wv({
16198
16269
  matched: o.length,
16199
16270
  results: o
16200
16271
  });
@@ -16227,7 +16298,7 @@ function jv(e, r = {}) {
16227
16298
  message: `脚本过长(${e.length} 字符,上限 8000)`,
16228
16299
  hint: "精简脚本;复杂逻辑可分步(先 query 探查再 transform 改),或拆成多次 eval"
16229
16300
  });
16230
- let n = await mv(xv(a), e, 3e3);
16301
+ let n = await pv(bv(s ? Ov(a, s) : a), e, 3e3);
16231
16302
  if (!n.ok) {
16232
16303
  let t = /超时/.test(n.error || "");
16233
16304
  return $({
@@ -16241,143 +16312,255 @@ function jv(e, r = {}) {
16241
16312
  });
16242
16313
  }
16243
16314
  if (t === "transform") {
16244
- let e = i.safeParse(n.result);
16245
- return e.success ? (p("edit", "eval_transform"), typeof a == "object" && a && e.data !== null && typeof e.data == "object" && Dv(a, e.data), f({
16315
+ let e = n.result;
16316
+ if (e && typeof e == "object" && !Array.isArray(e) && "patches" in e && Array.isArray(e.patches)) {
16317
+ if (typeof a != "object" || !a) return $({
16318
+ code: "LEAF_BIND",
16319
+ message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),eval transform(patches) 无法就地替换`,
16320
+ hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
16321
+ });
16322
+ let t = e.patches, r = bv(a), o = [];
16323
+ for (let e = 0; e < t.length; e++) {
16324
+ let n = t[e], i = n.jsonPath || "";
16325
+ if (hv(i)) return $({
16326
+ code: "PATH_UNSAFE",
16327
+ message: `patches[${e}] jsonPath "${i}" 含非法段`,
16328
+ hint: "使用正常属性路径"
16329
+ });
16330
+ if (!Dv(i, s)) return $({
16331
+ code: "PATH_DENIED",
16332
+ message: `patches[${e}] @ "${i}" 不在 schema 声明字段内`,
16333
+ hint: "仅 schema 声明的 key 可写"
16334
+ });
16335
+ let a = n.op, c;
16336
+ if (a !== "remove") {
16337
+ if (n.value === void 0 || n.value === "") return $({
16338
+ code: "MISSING_VALUE",
16339
+ message: `patches[${e}] ${a} 操作需要 value`,
16340
+ hint: `op 为 ${a} 时 value 必填`
16341
+ });
16342
+ let t = xv(n.value);
16343
+ if (t.parseError) return U_(`patches[${e}]`, n.value, t.parseError);
16344
+ c = t.parsed;
16345
+ }
16346
+ let l = kv(r, a, i, c);
16347
+ if (l) return $({
16348
+ code: "PATCH_FAILED",
16349
+ message: `patches[${e}]: ${l}`,
16350
+ hint: "检查 op 与目标类型:merge 需对象,append 需数组"
16351
+ });
16352
+ o.push({
16353
+ op: a,
16354
+ jp: i,
16355
+ value: c
16356
+ });
16357
+ }
16358
+ let c = i.safeParse(r);
16359
+ if (!c.success) return $({
16360
+ code: "SCHEMA_INVALID",
16361
+ message: "脚本 patches 应用后整体校验失败,未写入",
16362
+ hint: "确认 patches 合并后整体仍符合 schema",
16363
+ details: V_(c.error.issues)
16364
+ });
16365
+ m("edit", "eval_transform");
16366
+ for (let e of o) Av(a, e.op, e.jp, e.value);
16367
+ return p({
16368
+ op: "edit",
16369
+ detail: `eval_transform(${o.length} patches)`,
16370
+ timestamp: Date.now()
16371
+ }), u = Tv(a), `已通过脚本 transform(patches) 更新主数据(${o.length} 个 patch,耗时 ${n.elapsedMs}ms)。当前值: ${wv(a, 600)}`;
16372
+ }
16373
+ let t = i.safeParse(e);
16374
+ return t.success ? typeof a != "object" || !a ? $({
16375
+ code: "LEAF_BIND",
16376
+ message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),eval transform 无法就地替换外部持有的值引用`,
16377
+ hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
16378
+ }) : (m("edit", "eval_transform"), t.data !== null && typeof t.data == "object" && (s ? gv(a, t.data) : Mv(a, t.data)), p({
16246
16379
  op: "edit",
16247
16380
  detail: "eval_transform",
16248
16381
  timestamp: Date.now()
16249
- }), l = Cv(a), `已通过脚本 transform 更新主数据(耗时 ${n.elapsedMs}ms)。当前值: ${Sv(a, 600)}`) : $({
16382
+ }), u = Tv(a), `已通过脚本 transform 更新主数据(耗时 ${n.elapsedMs}ms)。当前值: ${wv(a, 600)}`) : $({
16250
16383
  code: "SCHEMA_INVALID",
16251
16384
  message: "脚本返回值校验失败,未写入(transform 模式要求返回主数据的完整新值且符合 schema)",
16252
- hint: "确认脚本 return 了完整新值(非部分);按 describe_data() 查看格式",
16253
- details: H_(e.error.issues)
16385
+ hint: "确认脚本 return 了完整新值(非部分);或返回 {patches:[...]} 走增量模式;按 describe_data() 查看格式",
16386
+ details: V_(t.error.issues)
16254
16387
  });
16255
16388
  }
16256
- return Sv({
16389
+ return wv({
16257
16390
  ok: !0,
16258
16391
  result: n.result,
16259
16392
  elapsedMs: n.elapsedMs
16260
16393
  });
16261
16394
  }, {
16262
16395
  name: "eval_script",
16263
- description: "在隔离的 Web Worker 沙箱里对主数据跑自定义 JS 脚本(无 window/document 访问,fetch/XHR/WebSocket/importScripts 已禁用,超时 3s 可终止)。脚本以 `data` 为入参(主数据的深拷贝),返回值即结果。mode:query(默认,只读,把返回值回给 LLM,适合过滤/映射/聚合/统计大数组)、transform(把返回值作为主数据的新整体值,经 schema 校验后就地落地,适合批量重写)。注意:transform 需返回完整新值;query 不改主数据。脚本内可用标准 JS(Array/Object/JSON/Math 等)与 async/await。",
16396
+ description: "在隔离的 Web Worker 沙箱里对主数据跑自定义 JS 脚本(无 window/document 访问,fetch/XHR/WebSocket/importScripts 已禁用,超时 3s 可终止)。脚本以 `data` 为入参(主数据的深拷贝),返回值即结果。mode:query(默认,只读,把返回值回给 LLM,适合过滤/映射/聚合/统计大数组)、transform(把返回值作为主数据的新整体值,经 schema 校验后就地落地,适合批量重写)transform 支持两种返回形式:① 完整新值(整体替换);② {patches:[{op,jsonPath,value},...]} 增量 patch(按 patch 应用,避免大对象整体重传,任一 patch 失败或整体 schema 校验失败则不写入)。query 不改主数据。脚本内可用标准 JS(Array/Object/JSON/Math 等)与 async/await。",
16264
16397
  schema: t.object({
16265
16398
  script: t.string().describe("JS 脚本体,如 data.filter(c=>c.stock>0).map(c=>c.id);入参名 data;末尾表达式或 return 即返回值"),
16266
16399
  mode: t.enum(["query", "transform"]).optional().describe("query=只读返回结果(默认),transform=校验后落地为新值")
16267
16400
  })
16268
16401
  }),
16269
- n(async ({ jsonPath: e }) => {
16270
- let t = e ? vv(a, e) : a;
16402
+ n(async ({ jsonPath: e, fields: t, depth: n }) => {
16403
+ let i = e || "";
16404
+ if (!Dv(i, s)) return $({
16405
+ code: "PATH_DENIED",
16406
+ message: `read @ "${i}" 不在 schema 声明字段内`,
16407
+ hint: "主数据仅暴露 schema 声明的字段;若需操作该字段,集成方需在 schema 中声明它"
16408
+ });
16409
+ let c = i ? _v(a, i) : a;
16410
+ i || (c = Ov(c, s));
16411
+ let l = c;
16271
16412
  if (r.interceptors?.read) try {
16272
- t = r.interceptors.read(t);
16413
+ l = r.interceptors.read(l);
16273
16414
  } catch (e) {
16274
16415
  return $({
16275
16416
  code: "READ_INTERCEPT",
16276
16417
  message: `read 拦截器抛错: ${e.message}`
16277
16418
  });
16278
16419
  }
16279
- let n = Cv(a);
16280
- l = n;
16281
- let i = e ? "" : `主数据说明: ${o}\n格式: 写入值需为 JSON,且通过声明的 schema 校验(校验失败时 write 会返回结构化错误)。\n\n`;
16282
- return t === void 0 ? `${i}主数据${e ? ` @ ${e}` : ""} = (undefined) (hash=${n})` : `${i}主数据${e ? ` @ ${e}` : ""} = ${Sv(t)} (hash=${n})`;
16420
+ t && t.length && (l = Sv(l, t)), n != null && (l = Cv(l, n));
16421
+ let d = Tv(a);
16422
+ u = d;
16423
+ let f = t && t.length ? `(字段裁剪:${t.join(",")})` : "", p = n == null ? "" : `(深度≤${n})`, m = f || p ? ` ${f}${p}` : "", h = e ? "" : `主数据说明: ${o}\n格式: 写入值需为 JSON,且通过声明的 schema 校验(校验失败时 write 会返回结构化错误)。\n\n`;
16424
+ return l === void 0 ? `${h}主数据${e ? ` @ ${e}` : ""}${m} = (undefined) (hash=${d})` : `${h}主数据${e ? ` @ ${e}` : ""}${m} = ${wv(l)} (hash=${d})`;
16283
16425
  }, {
16284
16426
  name: "read",
16285
- description: "读取主数据(高层入口,合并 describe/get)。不传 jsonPath → 返回主数据说明 + 格式提示;传 jsonPath → 返回该子路径当前值 + hash。hash 用于乐观锁(默认 autoLock,write 时自动比对,无需手动传)。集成方可能经 read 拦截器对返回值脱敏/派生。",
16286
- schema: t.object({ jsonPath: t.string().optional().describe("要读的子路径(相对主数据根,如 components.0.text);不传则读整个主数据并返回说明") })
16427
+ description: "读取主数据(高层入口,合并 describe/get)。不传 jsonPath → 返回主数据说明 + 格式提示;传 jsonPath → 返回该子路径当前值 + hash。hash 用于乐观锁(默认 autoLock,write 时自动比对,无需手动传)。fields(可选):字段裁剪,只返回对象(及数组元素)的指定字段,减少大对象返回体积;depth(可选):嵌套深度限制(0=只根占位,1=根+子,递归截断深层),减少深层结构返回体积。两者可组合,先裁字段再截深度。集成方可能经 read 拦截器对返回值脱敏/派生。",
16428
+ schema: t.object({
16429
+ jsonPath: t.string().optional().describe("要读的子路径(相对主数据根,如 components.0.text);不传则读整个主数据并返回说明"),
16430
+ fields: t.array(t.string()).optional().describe("字段裁剪:只返回指定字段(对对象/数组元素投影),减少返回体积,如 [\"id\",\"title\"]"),
16431
+ depth: t.number().int().min(0).optional().describe("嵌套深度限制:0=只根占位,1=根+子,递归到 depth 层后用 {...}/[...] 占位截断,减少深层返回体积")
16432
+ })
16287
16433
  }),
16288
- n(async ({ value: e, patch: t, del: n }) => {
16289
- let o = "set";
16290
- n ? o = "delete" : t && (o = "edit");
16291
- let s = e;
16434
+ n(async ({ value: e, patch: t, patches: n, del: o }) => {
16435
+ let c = "set";
16436
+ o ? c = "delete" : (n && n.length || t) && (c = "edit");
16437
+ let l = e, f;
16292
16438
  if (r.interceptors?.write) try {
16293
- let n = r.interceptors.write(t ?? e, a);
16294
- if (n && typeof n == "object" && "error" in n) return $({
16439
+ let i = c === "delete" ? {
16440
+ del: !0,
16441
+ jsonPath: t?.jsonPath
16442
+ } : c === "edit" && n && n.length ? { patches: n } : c === "edit" ? {
16443
+ op: t.op,
16444
+ jsonPath: t.jsonPath || "",
16445
+ value: e
16446
+ } : e, o = r.interceptors.write(i, a);
16447
+ if (o && typeof o == "object" && "error" in o) return $({
16295
16448
  code: "WRITE_INTERCEPT",
16296
- message: `write 拦截器拒绝: ${n.error}`
16449
+ message: `write 拦截器拒绝: ${o.error}`
16297
16450
  });
16298
- o === "edit" ? t = n : s = n;
16451
+ c === "delete" || (c === "edit" && n && n.length ? f = o && Array.isArray(o) ? o : n : l = o);
16299
16452
  } catch (e) {
16300
16453
  return $({
16301
16454
  code: "WRITE_INTERCEPT",
16302
16455
  message: `write 拦截器抛错: ${e.message}`
16303
16456
  });
16304
16457
  }
16305
- let c = u ? l : void 0;
16306
- if (o === "delete") {
16458
+ let g = d ? u : void 0;
16459
+ if (c === "delete") {
16307
16460
  if (!t?.jsonPath) return $({
16308
16461
  code: "MISSING_VALUE",
16309
16462
  message: "delete 需要 patch.jsonPath 指定要删的子路径(主数据整体不可删,用 write(value) 整体替换)",
16310
16463
  hint: "如 patch:{jsonPath:\"components.0\"}, del:true"
16311
16464
  });
16312
- if (gv(t.jsonPath)) return $({
16465
+ if (hv(t.jsonPath)) return $({
16313
16466
  code: "PATH_UNSAFE",
16314
16467
  message: `jsonPath "${t.jsonPath}" 含非法段`,
16315
16468
  hint: "使用正常属性路径"
16316
16469
  });
16317
- let e = await m("delete", c);
16470
+ if (!Dv(t.jsonPath, s)) return $({
16471
+ code: "PATH_DENIED",
16472
+ message: `write delete @ "${t.jsonPath}" 不在 schema 声明字段内`,
16473
+ hint: "仅 schema 声明的 key 可删"
16474
+ });
16475
+ let e = await h("delete", g);
16318
16476
  if (e !== null) return e;
16319
- p("delete");
16320
- let n = bv(a, t.jsonPath);
16321
- return f({
16477
+ m("delete");
16478
+ let n = yv(a, t.jsonPath);
16479
+ return p({
16322
16480
  op: "delete",
16323
16481
  detail: t.jsonPath,
16324
16482
  timestamp: Date.now()
16325
- }), l = Cv(a), n ? `已删除主数据 @ ${t.jsonPath}` : `主数据 @ ${t.jsonPath} 不存在(无需删除)`;
16326
- }
16327
- let d;
16328
- if (typeof s == "string") try {
16329
- d = JSON.parse(s);
16330
- } catch {
16331
- d = s;
16483
+ }), u = Tv(a), n ? `已删除主数据 @ ${t.jsonPath}` : `主数据 @ ${t.jsonPath} 不存在(无需删除)`;
16332
16484
  }
16333
- else d = s;
16334
- if (o === "edit") {
16335
- let e = t.jsonPath || "";
16336
- if (gv(e)) return $({
16337
- code: "PATH_UNSAFE",
16338
- message: `jsonPath "${e}" 含非法段`,
16339
- hint: "使用正常属性路径,如 components.0.text"
16340
- });
16485
+ if (c === "edit") {
16341
16486
  if (typeof a != "object" || !a) return $({
16342
16487
  code: "NOT_OBJECT",
16343
16488
  message: `edit 仅适用于对象/数组主数据,当前是 ${a === void 0 ? "undefined" : typeof a}`,
16344
16489
  hint: "叶子用 write(value) 整体设置"
16345
16490
  });
16346
- let n = await m("edit", c);
16347
- if (n !== null) return n;
16348
- let r = t.op;
16349
- if (r !== "remove" && (d === void 0 || d === "")) return $({
16350
- code: "MISSING_VALUE",
16351
- message: `${r} 操作需要 value`,
16352
- hint: `op ${r} value 必填;删除请用 del:true`
16353
- });
16354
- let o = xv(a), s = wv(o, r, e, d);
16355
- if (s) return $({
16356
- code: "PATCH_FAILED",
16357
- message: s,
16358
- hint: "检查 op 与目标类型:merge 需对象,append 需数组"
16359
- });
16360
- let u = i.safeParse(o);
16361
- return u.success ? (p("edit"), Tv(a, r, e, d), f({
16491
+ let e = await h("edit", g);
16492
+ if (e !== null) return e;
16493
+ let r = f || (n && n.length ? n : [{
16494
+ op: t.op,
16495
+ jsonPath: t.jsonPath || "",
16496
+ value: l
16497
+ }]), o = bv(a), c = [];
16498
+ for (let e = 0; e < r.length; e++) {
16499
+ let t = r[e], n = t.jsonPath || "";
16500
+ if (hv(n)) return $({
16501
+ code: "PATH_UNSAFE",
16502
+ message: `patches[${e}] jsonPath "${n}" 含非法段`,
16503
+ hint: "使用正常属性路径,如 components.0.text"
16504
+ });
16505
+ if (!Dv(n, s)) return $({
16506
+ code: "PATH_DENIED",
16507
+ message: `patches[${e}] @ "${n}" 不在 schema 声明字段内`,
16508
+ hint: "仅 schema 声明的 key 可写"
16509
+ });
16510
+ let i = t.op, a;
16511
+ if (i !== "remove") {
16512
+ if (t.value === void 0 || t.value === "") return $({
16513
+ code: "MISSING_VALUE",
16514
+ message: `patches[${e}] ${i} 操作需要 value`,
16515
+ hint: `op 为 ${i} 时 value 必填;删除请用 op:'remove'`
16516
+ });
16517
+ let n = xv(t.value);
16518
+ if (n.parseError) return U_(`patches[${e}]`, t.value, n.parseError);
16519
+ a = n.parsed;
16520
+ }
16521
+ let l = kv(o, i, n, a);
16522
+ if (l) return $({
16523
+ code: "PATCH_FAILED",
16524
+ message: `patches[${e}]: ${l}`,
16525
+ hint: "检查 op 与目标类型:merge 需对象,append 需数组"
16526
+ });
16527
+ c.push({
16528
+ op: i,
16529
+ jp: n,
16530
+ value: a
16531
+ });
16532
+ }
16533
+ let d = i.safeParse(o);
16534
+ if (!d.success) return H_("", d.error.issues);
16535
+ m("edit");
16536
+ for (let e of c) Av(a, e.op, e.jp, e.value);
16537
+ return p({
16362
16538
  op: "edit",
16363
- detail: `${r}${e ? "@" + e : ""}`,
16364
- value: d,
16539
+ detail: `${c.length} 个 patch${c.length > 1 ? "(批量)" : ""}`,
16540
+ value: c.map((e) => `${e.op}@${e.jp}`),
16365
16541
  timestamp: Date.now()
16366
- }), l = Cv(a), `已 write(edit) 主数据(${r}${e ? " @ " + e : ""})。当前值:${Sv(a, 600)} (新 hash=${Cv(a)})`) : U_("", u.error.issues);
16542
+ }), u = Tv(a), `已 write(edit) 主数据(${c.length} patch)。当前值:${wv(a, 600)} (新 hash=${Tv(a)})`;
16367
16543
  }
16368
- let h = await m("set", c);
16369
- if (h !== null) return h;
16370
- let g = i.safeParse(d);
16371
- return g.success ? (p("set"), typeof a == "object" && a && g.data !== null && typeof g.data == "object" && Dv(a, g.data), f({
16544
+ let _, v = xv(l);
16545
+ if (v.parseError) return U_("", l, v.parseError);
16546
+ _ = v.parsed;
16547
+ let y = await h("set", g);
16548
+ if (y !== null) return y;
16549
+ let b = i.safeParse(_);
16550
+ return b.success ? typeof a != "object" || !a ? $({
16551
+ code: "LEAF_BIND",
16552
+ message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),write(set) 无法就地替换外部持有的值引用`,
16553
+ hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹(如 {value:\"x\"})或集成方通过 sdk.setData 替换 bind"
16554
+ }) : (m("set"), b.data !== null && typeof b.data == "object" && (s ? gv(a, b.data) : Mv(a, b.data)), p({
16372
16555
  op: "set",
16373
- value: g.data,
16556
+ value: b.data,
16374
16557
  timestamp: Date.now()
16375
- }), l = Cv(a), `已 write(set) 主数据 = ${Sv(g.data, 600)} (新 hash=${Cv(a)})`) : U_("", g.error.issues);
16558
+ }), u = Tv(a), `已 write(set) 主数据 = ${wv(b.data, 600)} (新 hash=${Tv(a)})${s ? "(白名单模式:仅更新 schema 声明字段,未声明字段保留)" : ""}`) : H_("", b.error.issues);
16376
16559
  }, {
16377
16560
  name: "write",
16378
- description: "写入主数据(高层入口,合并 set/edit/delete + 自动乐观锁 + 自动快照)。三种意图:① 整体替换 write({ value }) value 为 JSON 对象(推荐)或字符串;② 增量 patch write({ value, patch:{op,jsonPath} }) op=set/remove/merge/append,jsonPath 相对主数据根(如 components.0.text);③ 删除 write({ patch:{jsonPath}, del:true })。写入自动经 schema 校验(失败不写)+ 自动存快照(可 restore_data 回退)+ 自动乐观锁(autoLock,用你最后 read 到的 hash 比对,冲突则 VERSION_CONFLICT)。集成方可能经 write 拦截器校验/转换/拒绝。",
16561
+ description: "写入主数据(高层入口,合并 set/edit/delete + 自动乐观锁 + 自动快照)。四种意图:① 整体替换 write({ value }) value 为 JSON 对象(推荐)或字符串;② 单个增量 patch write({ value, patch:{op,jsonPath} }) op=set/remove/merge/append,jsonPath 相对主数据根(如 components.0.text),value 作为该 patch 的值;③ 批量增量 write({ patches:[{op,jsonPath,value},...] }) 一次原子应用多个 patch(任一失败整体不写入,适合一次改多处);④ 删除 write({ patch:{jsonPath}, del:true })。写入自动经 schema 校验(失败不写)+ 自动存快照(可 restore_data 回退)+ 自动乐观锁(autoLock,用你最后 read 到的 hash 比对,冲突则 VERSION_CONFLICT)。集成方可能经 write 拦截器校验/转换/拒绝(批量模式拦截器收到 {patches},返回新 patches 数组或 {error})。",
16379
16562
  schema: t.object({
16380
- value: t.unknown().optional().describe("JSON 对象(推荐,如 {title:\"x\"})或 JSON 字符串;set/patch 的 set/merge/append 必填"),
16563
+ value: t.unknown().optional().describe("JSON 对象(推荐,如 {title:\"x\"})或 JSON 字符串;set 整体或单个 patch 的 set/merge/append 必填"),
16381
16564
  patch: t.object({
16382
16565
  op: t.enum([
16383
16566
  "set",
@@ -16386,22 +16569,32 @@ function jv(e, r = {}) {
16386
16569
  "append"
16387
16570
  ]),
16388
16571
  jsonPath: t.string().optional().describe("相对主数据根的点号路径(如 components.0.text);set/remove 必填,merge/append 不填则作用于根")
16389
- }).optional().describe("增量编辑;传 patch 则走 edit 语义,否则整体 set;删除用 del:true patch.jsonPath 指定子路径"),
16572
+ }).optional().describe("单个增量编辑;传 patch(无 patches)走单 patch edit 语义,value 作为该 patch value"),
16573
+ patches: t.array(t.object({
16574
+ op: t.enum([
16575
+ "set",
16576
+ "remove",
16577
+ "merge",
16578
+ "append"
16579
+ ]),
16580
+ jsonPath: t.string().optional().describe("相对主数据根的点号路径;set/remove 必填,merge/append 不填则作用于根"),
16581
+ value: t.unknown().optional().describe("JSON 值(推荐直传)或 JSON 字符串;set/merge/append 必填,remove 不需")
16582
+ })).optional().describe("批量增量编辑:一次原子应用多个 patch(任一失败则整体不写入,clone 试跑全部 + schema 校验通过才落 live)。适合一次改多处,减少多轮往返"),
16390
16583
  del: t.boolean().optional().describe("true 则删除 patch.jsonPath 指定的子路径(等价 delete_data)")
16391
16584
  })
16392
16585
  })
16393
16586
  ];
16394
- return Object.defineProperty(h, "controller", {
16395
- value: d,
16587
+ return Object.defineProperty(g, "controller", {
16588
+ value: f,
16396
16589
  enumerable: !1,
16397
16590
  configurable: !1,
16398
16591
  writable: !1
16399
- }), h;
16592
+ }), g;
16400
16593
  }
16401
16594
  //#endregion
16402
16595
  //#region src/core/tools/fetchDoc.ts
16403
- var Mv = 3e4, Nv = [n(async ({ url: e, as: t }) => {
16404
- let n = new AbortController(), r = setTimeout(() => n.abort(), Mv);
16596
+ var Lv = 3e4, Rv = [n(async ({ url: e, as: t }) => {
16597
+ let n = new AbortController(), r = setTimeout(() => n.abort(), Lv);
16405
16598
  try {
16406
16599
  let r = await fetch(e, {
16407
16600
  method: "GET",
@@ -16418,7 +16611,7 @@ var Mv = 3e4, Nv = [n(async ({ url: e, as: t }) => {
16418
16611
  ].join("\n");
16419
16612
  } catch (t) {
16420
16613
  let r = t?.message || String(t);
16421
- return n.signal.aborted ? `获取失败:请求超时(${Mv}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
16614
+ return n.signal.aborted ? `获取失败:请求超时(${Lv}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
16422
16615
  } finally {
16423
16616
  clearTimeout(r);
16424
16617
  }
@@ -16429,25 +16622,25 @@ var Mv = 3e4, Nv = [n(async ({ url: e, as: t }) => {
16429
16622
  url: t.string().describe("要抓取的 URL(同源或已配 CORS)"),
16430
16623
  as: t.enum(["text", "markdown"]).optional().describe("返回格式标签,默认 text")
16431
16624
  })
16432
- })], Pv = Nv;
16433
- function Fv(e, t) {
16434
- return jv(e, t);
16625
+ })], zv = Rv;
16626
+ function Bv(e, t) {
16627
+ return Iv(e, t);
16435
16628
  }
16436
- function Iv(e, t, n) {
16629
+ function Vv(e, t, n) {
16437
16630
  let r = e?.dataOps !== !1, i = e?.fetch !== !1;
16438
16631
  return [...r ? t : [], ...i ? n : []];
16439
16632
  }
16440
16633
  //#endregion
16441
16634
  //#region src/core/harness/usageHints.ts
16442
- var Lv = .7;
16443
- function Rv(e, t, n = "simple") {
16635
+ var Hv = .7;
16636
+ function Uv(e, t, n = "simple") {
16444
16637
  let r = n !== "advanced";
16445
16638
  return {
16446
16639
  name: "usageHints",
16447
16640
  augmentPrompt: () => {
16448
16641
  let n = [];
16449
16642
  if (e?.planning !== !1 && n.push("多步任务建议先 write_todos 拆解为步骤并逐步推进。"), t && (r ? (n.push("读写主数据用 read/write(高层入口,自动乐观锁 + 自动快照)。read({jsonPath}) 读子路径当前值(返回含 hash,write 时自动比对,无需手动传);read() 不传读整个主数据 + 说明。write({value}) 整体替换(value 直传 JSON 对象,如 {title:\"x\"},无需 stringify);write({value, patch:{op,jsonPath}}) 增量 patch(op=set/remove/merge/append);write({patch:{jsonPath}, del:true}) 删除子路径。写入自动经 schema 校验(失败不写)+ 自动存快照(出错可用 restore_data 回退)。"), n.push("修改大对象/数组优先用 write 的 patch 增量(只发改动部分),避免整体重传被 max_tokens 截断致 JSON 不完整。"), 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(返回值经校验后落地)。"))), e?.subagent !== !1 && n.push("独立子任务可 spawn_agent 委派(只读工具,过程不占主上下文)。"), e?.subagents?.length) {
16450
- let t = e.subagents.filter((e) => (e.temperature ?? 0) >= Lv || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), i = e.subagents.filter((e) => (e.temperature ?? 0) < Lv && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
16643
+ let t = e.subagents.filter((e) => (e.temperature ?? 0) >= Hv || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), i = e.subagents.filter((e) => (e.temperature ?? 0) < Hv && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
16451
16644
  n.push("【规划-反思-执行·路由】按任务性质选模式,不要对简单任务过度编排:"), t.length && (n.push(` · 创作/设计/开放性需求(如"设计主题风格""换个感觉")→ 先调 ${t.map((e) => "use_" + e.id).join("/")} 出 2-3 套方案(高温创意),`), n.push(" 不要自己拍板;拿到方案后,若需用户拍板用 request_human_confirmation 弹选项。")), i.length && n.push(` · 严谨/易错/校验类 → 可先调 ${i.map((e) => "use_" + e.id).join("/")} 反思挑刺(低温审查),据反馈修订。`), n.push(r ? " · 方案定稿后,由你(主 agent)用 write 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。" : " · 方案定稿后,由你(主 agent)用 edit_data 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。"), n.push(" · 简单/明确任务(如\"标题改红色\")直接执行,不必走规划-反思。");
16452
16645
  }
16453
16646
  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("用户在选项里选了哪个,就按那个方案继续;选「拒绝」则停止并询问如何调整。")), n.length && n.unshift("调用工具务必用标准 function calling(工具调用)格式发起,不要在回复正文里输出伪 XML/标签(如 deepseek 的 tool_calls 标签、invoke、function_call、tool_call 等)或 JSON 文本——那不会被识别为工具调用,会被当普通文字,工具不执行。"), n.length ? "## 能力使用提示\n" + n.join("\n") : void 0;
@@ -16456,7 +16649,7 @@ function Rv(e, t, n = "simple") {
16456
16649
  }
16457
16650
  //#endregion
16458
16651
  //#region src/core/utils/id.ts
16459
- function zv() {
16652
+ function Wv() {
16460
16653
  try {
16461
16654
  if (typeof crypto < "u" && typeof crypto.randomUUID == "function") return crypto.randomUUID();
16462
16655
  } catch {}
@@ -16464,57 +16657,57 @@ function zv() {
16464
16657
  }
16465
16658
  //#endregion
16466
16659
  //#region src/core/backends/storage.ts
16467
- var Bv = "chat-sdk", Vv = 50 * 1024 * 1024, Hv = 4 * 1024 * 1024, Uv = 10 * 1024 * 1024, Wv = .9, Gv = 500, Kv = 300, qv = "__meta__", Jv = "v:1", Yv = [
16660
+ var Gv = "chat-sdk", Kv = 50 * 1024 * 1024, qv = 4 * 1024 * 1024, Jv = 10 * 1024 * 1024, Yv = .9, Xv = 500, Zv = 300, Qv = "__meta__", $v = "v:1", ey = [
16468
16661
  "messages",
16469
16662
  "vfs",
16470
16663
  "todos",
16471
16664
  "memory"
16472
16665
  ];
16473
- function Xv(e) {
16474
- return e === "local" || e === "session" ? Hv : Vv;
16666
+ function ty(e) {
16667
+ return e === "local" || e === "session" ? qv : Kv;
16475
16668
  }
16476
- function Zv(e) {
16669
+ function ny(e) {
16477
16670
  if (typeof e != "object" || !e) return !1;
16478
16671
  let t = e;
16479
16672
  return t.name === "QuotaExceededError" || t.name === "NS_ERROR_DOM_QUOTA_REACHED" || t.code === 22 || t.code === 1014;
16480
16673
  }
16481
- function Qv(e, t, n, r) {
16674
+ function ry(e, t, n, r) {
16482
16675
  return [
16483
- Jv,
16676
+ $v,
16484
16677
  e,
16485
16678
  t,
16486
16679
  n,
16487
16680
  r
16488
16681
  ].join("::");
16489
16682
  }
16490
- function $v(e, t, n) {
16683
+ function iy(e, t, n) {
16491
16684
  return [
16492
- Jv,
16685
+ $v,
16493
16686
  e,
16494
16687
  t,
16495
16688
  n
16496
16689
  ].join("::") + "::";
16497
16690
  }
16498
- function ey(e, t) {
16691
+ function ay(e, t) {
16499
16692
  return [
16500
- Jv,
16693
+ $v,
16501
16694
  e,
16502
16695
  t
16503
16696
  ].join("::") + "::";
16504
16697
  }
16505
- function ty(e) {
16506
- return [Jv, e].join("::") + "::";
16698
+ function oy(e) {
16699
+ return [$v, e].join("::") + "::";
16507
16700
  }
16508
- var ny = null;
16509
- function ry(e) {
16510
- ny ||= new TextEncoder();
16701
+ var sy = null;
16702
+ function cy(e) {
16703
+ sy ||= new TextEncoder();
16511
16704
  try {
16512
- return ny.encode(JSON.stringify(e)).length;
16705
+ return sy.encode(JSON.stringify(e)).length;
16513
16706
  } catch {
16514
16707
  return 0;
16515
16708
  }
16516
16709
  }
16517
- function iy(e, t, n) {
16710
+ function ly(e, t, n) {
16518
16711
  let r = e.reduce((e, t) => e + t.bytes, 0);
16519
16712
  if (r <= t) return [];
16520
16713
  let i = t * n, a = [...e].sort((e, t) => e.lastAccessed - t.lastAccessed), o = [];
@@ -16524,7 +16717,7 @@ function iy(e, t, n) {
16524
16717
  }
16525
16718
  return o;
16526
16719
  }
16527
- function ay() {
16720
+ function uy() {
16528
16721
  let e = /* @__PURE__ */ new Map();
16529
16722
  return {
16530
16723
  async get(t) {
@@ -16544,7 +16737,7 @@ function ay() {
16544
16737
  }
16545
16738
  };
16546
16739
  }
16547
- function oy(e) {
16740
+ function dy(e) {
16548
16741
  return new Promise((t, n) => {
16549
16742
  if (typeof indexedDB > "u") {
16550
16743
  n(/* @__PURE__ */ Error("indexedDB 不可用"));
@@ -16605,7 +16798,7 @@ function oy(e) {
16605
16798
  }, r.onerror = () => n(r.error);
16606
16799
  });
16607
16800
  }
16608
- function sy(e) {
16801
+ function fy(e) {
16609
16802
  return {
16610
16803
  async get(t) {
16611
16804
  let n = e.getItem(t);
@@ -16639,12 +16832,12 @@ function sy(e) {
16639
16832
  }
16640
16833
  };
16641
16834
  }
16642
- function cy(e, t, n) {
16835
+ function py(e, t, n) {
16643
16836
  let r = (e.get(t) ?? Promise.resolve()).then(n, n);
16644
16837
  return e.set(t, r.then(() => void 0, () => void 0)), r;
16645
16838
  }
16646
- function ly(e = {}) {
16647
- let t = e.dbName ?? Bv, n = e.backend ?? "indexed", r = e.maxBytes ?? Xv(n), i = e.maxBytesPerSession ?? Uv, a = e.evictionWatermark ?? Wv, o = e.debounceMs ?? Gv, s = /* @__PURE__ */ new Set();
16839
+ function my(e = {}) {
16840
+ let t = e.dbName ?? Gv, n = e.backend ?? "indexed", r = e.maxBytes ?? ty(n), i = e.maxBytesPerSession ?? Jv, a = e.evictionWatermark ?? Yv, o = e.debounceMs ?? Xv, s = /* @__PURE__ */ new Set();
16648
16841
  function c(e) {
16649
16842
  for (let t of s) try {
16650
16843
  t(e);
@@ -16657,16 +16850,16 @@ function ly(e = {}) {
16657
16850
  try {
16658
16851
  if (n === "indexed") {
16659
16852
  if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
16660
- l = await oy(t), d(!0);
16853
+ l = await dy(t), d(!0);
16661
16854
  } else if (n === "session") {
16662
16855
  if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
16663
- l = sy(sessionStorage), d(!0);
16856
+ l = fy(sessionStorage), d(!0);
16664
16857
  } else if (n === "local") {
16665
16858
  if (typeof localStorage > "u") throw Error("localStorage 不可用");
16666
- l = sy(localStorage), d(!0);
16667
- } else l = ay(), d(!1);
16859
+ l = fy(localStorage), d(!0);
16860
+ } else l = uy(), d(!1);
16668
16861
  } catch (e) {
16669
- l = ay();
16862
+ l = uy();
16670
16863
  let t = e instanceof Error ? e.message : String(e);
16671
16864
  d(!1), Promise.resolve().then(() => c({
16672
16865
  type: "degraded",
@@ -16676,10 +16869,10 @@ function ly(e = {}) {
16676
16869
  })();
16677
16870
  let p = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map();
16678
16871
  function g(e, n, r, a) {
16679
- let o = Qv(t, r, a, qv);
16680
- return cy(h, o, async () => {
16872
+ let o = ry(t, r, a, Qv);
16873
+ return py(h, o, async () => {
16681
16874
  let t = async () => {
16682
- let t = await l.get(o), s = await l.get(e), u = s == null ? 0 : ry(s), d = ry(n), f = (t?.bytes ?? 0) + (d - u);
16875
+ let t = await l.get(o), s = await l.get(e), u = s == null ? 0 : cy(s), d = cy(n), f = (t?.bytes ?? 0) + (d - u);
16683
16876
  if (f > i) {
16684
16877
  c({
16685
16878
  type: "quota",
@@ -16701,12 +16894,12 @@ function ly(e = {}) {
16701
16894
  try {
16702
16895
  await t();
16703
16896
  } catch (e) {
16704
- if (Zv(e) && !u) {
16897
+ if (ny(e) && !u) {
16705
16898
  u = !0;
16706
16899
  try {
16707
16900
  await b();
16708
16901
  } catch {}
16709
- l = ay(), Promise.resolve().then(() => c({
16902
+ l = uy(), Promise.resolve().then(() => c({
16710
16903
  type: "degraded",
16711
16904
  reason: "存储配额超限(QuotaExceededError),已淘汰最旧会话并降级内存"
16712
16905
  }));
@@ -16718,7 +16911,7 @@ function ly(e = {}) {
16718
16911
  });
16719
16912
  }
16720
16913
  function _(e, n, r, i) {
16721
- let a = Qv(t, e, n, r), s = p.get(a);
16914
+ let a = ry(t, e, n, r), s = p.get(a);
16722
16915
  s && s.resolve();
16723
16916
  let c = m.get(a);
16724
16917
  return c && clearTimeout(c), new Promise((t) => {
@@ -16745,15 +16938,15 @@ function ly(e = {}) {
16745
16938
  function y() {
16746
16939
  v ||= setTimeout(() => {
16747
16940
  v = null, b();
16748
- }, Kv);
16941
+ }, Zv);
16749
16942
  }
16750
16943
  async function b() {
16751
16944
  let e = [];
16752
- await l.scan(ty(t), (t, n) => {
16945
+ await l.scan(oy(t), (t, n) => {
16753
16946
  t.endsWith("::__meta__") && e.push(n);
16754
16947
  });
16755
- let n = iy(e, r, a);
16756
- for (let e of n) await l.clearPrefix($v(t, e.agentId, e.sessionId)), c({
16948
+ let n = ly(e, r, a);
16949
+ for (let e of n) await l.clearPrefix(iy(t, e.agentId, e.sessionId)), c({
16757
16950
  type: "evicted",
16758
16951
  agentId: e.agentId,
16759
16952
  sessionId: e.sessionId,
@@ -16764,13 +16957,13 @@ function ly(e = {}) {
16764
16957
  ready: f,
16765
16958
  async listSessions(e) {
16766
16959
  let n = [];
16767
- return await l.scan(ey(t, e), (e, t) => {
16960
+ return await l.scan(ay(t, e), (e, t) => {
16768
16961
  e.endsWith("::__meta__") && n.push(t);
16769
16962
  }), n.sort((e, t) => t.lastAccessed - e.lastAccessed);
16770
16963
  },
16771
16964
  async load(e, n) {
16772
- let r = Qv(t, e, n, qv);
16773
- return await cy(h, r, async () => {
16965
+ let r = ry(t, e, n, Qv);
16966
+ return await py(h, r, async () => {
16774
16967
  let i = await l.get(r);
16775
16968
  if (!i) return;
16776
16969
  let a = {
@@ -16779,8 +16972,8 @@ function ly(e = {}) {
16779
16972
  todos: [],
16780
16973
  memory: ""
16781
16974
  };
16782
- for (let r of Yv) {
16783
- let i = await l.get(Qv(t, e, n, r));
16975
+ for (let r of ey) {
16976
+ let i = await l.get(ry(t, e, n, r));
16784
16977
  i != null && (a[r] = i);
16785
16978
  }
16786
16979
  return i.lastAccessed = Date.now(), await l.set(r, i), a;
@@ -16788,7 +16981,7 @@ function ly(e = {}) {
16788
16981
  },
16789
16982
  async save(e, t, n) {
16790
16983
  let r = [];
16791
- for (let i of Yv) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
16984
+ for (let i of ey) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
16792
16985
  await Promise.all(r);
16793
16986
  },
16794
16987
  async flush() {
@@ -16802,10 +16995,10 @@ function ly(e = {}) {
16802
16995
  })), c({ type: "flush" }), await b();
16803
16996
  },
16804
16997
  async deleteSession(e, n) {
16805
- await l.clearPrefix($v(t, e, n));
16998
+ await l.clearPrefix(iy(t, e, n));
16806
16999
  },
16807
17000
  async createSession(e, n, r) {
16808
- let i = r ?? zv(), a = Date.now(), o = {
17001
+ let i = r ?? Wv(), a = Date.now(), o = {
16809
17002
  agentId: e,
16810
17003
  sessionId: i,
16811
17004
  createdAt: a,
@@ -16813,7 +17006,7 @@ function ly(e = {}) {
16813
17006
  bytes: 0,
16814
17007
  title: n
16815
17008
  };
16816
- return await l.set(Qv(t, e, i, qv), o), i;
17009
+ return await l.set(ry(t, e, i, Qv), o), i;
16817
17010
  },
16818
17011
  onEvent(e) {
16819
17012
  s.add(e);
@@ -16828,34 +17021,34 @@ function ly(e = {}) {
16828
17021
  }
16829
17022
  //#endregion
16830
17023
  //#region src/core/sdk/createChatSdk.ts
16831
- var uy = [
16832
- "你是一个页面操作助手。宿主页面在 window 对象上注册了可操作的属性,你通过专用工具安全地读写这些属性来操作页面。",
16833
- "所有写操作都经范围控制(仅注册表内)与 schema 校验(不合法会返回结构化错误而非写入),并自动留快照可回退。",
17024
+ var hy = [
17025
+ "你是一个 JSON 操作助手。集成方声明了一个主数据对象(含 zod schema 校验),你通过专用工具安全地读写它来完成任务。",
17026
+ "所有写操作都经范围控制(仅 schema 声明字段内)与 schema 校验(不合法会返回结构化错误而非写入),并自动留快照可回退。",
16834
17027
  "大对象/数组优先用增量 patch(只发改动)而非整体重传,避免输出被截断。",
16835
- R_.reliableWriteRules
17028
+ L_.reliableWriteRules
16836
17029
  ].join("\n\n");
16837
- function dy(e) {
17030
+ function gy(e) {
16838
17031
  if (!e) return "";
16839
- let t = z_(e.schema);
17032
+ let t = R_(e.schema);
16840
17033
  return `\n\n## 可操作数据(字段以 read 工具返回的实际值为准)\n${e.description ? e.description + "\n" : ""}${t}`;
16841
17034
  }
16842
- var fy = 50;
16843
- function py(e) {
16844
- return e === void 0 || e === !1 ? null : typeof e == "string" ? ly({ backend: e }) : e.enabled === !1 ? null : ly(e);
17035
+ var _y = 50;
17036
+ function vy(e) {
17037
+ return e === void 0 || e === !1 ? null : typeof e == "string" ? my({ backend: e }) : e.enabled === !1 ? null : my(e);
16845
17038
  }
16846
- function my(e) {
17039
+ function yy(e) {
16847
17040
  return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
16848
17041
  }
16849
- var hy = /* @__PURE__ */ new Map();
16850
- function gy(e) {
17042
+ var by = /* @__PURE__ */ new Map();
17043
+ function xy(e) {
16851
17044
  let t = e.content;
16852
17045
  return typeof t == "string" ? t : Array.isArray(t) ? t.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(t ?? "");
16853
17046
  }
16854
- function _y(e) {
17047
+ function Sy(e) {
16855
17048
  let t = e.summaryLlm ?? e.llm;
16856
17049
  if (!t) return;
16857
17050
  let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, o = e.summaryTimeoutMs ?? 15e3, c;
16858
- if (my(t)) c = t;
17051
+ if (yy(t)) c = t;
16859
17052
  else {
16860
17053
  let i = t;
16861
17054
  if (!i.apiKey) {
@@ -16873,20 +17066,20 @@ function _y(e) {
16873
17066
  return async (e) => {
16874
17067
  let t = new AbortController(), n = setTimeout(() => t.abort(), o);
16875
17068
  try {
16876
- return gy(await c.invoke([new a("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new i(e)], { signal: t.signal })).trim();
17069
+ return xy(await c.invoke([new a("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new i(e)], { signal: t.signal })).trim();
16877
17070
  } finally {
16878
17071
  clearTimeout(n);
16879
17072
  }
16880
17073
  };
16881
17074
  }
16882
- function vy(e, t) {
17075
+ function Cy(e, t) {
16883
17076
  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;
16884
17077
  }
16885
- function yy(e, t, n) {
17078
+ function wy(e, t, n) {
16886
17079
  return {
16887
17080
  name: "sdk-events",
16888
17081
  wrapToolCall: async (t, r) => {
16889
- let i = await r(t), a = vy(t.name, t.args);
17082
+ let i = await r(t), a = Cy(t.name, t.args);
16890
17083
  return a && e({
16891
17084
  type: "data_change",
16892
17085
  operation: a,
@@ -16901,7 +17094,7 @@ function yy(e, t, n) {
16901
17094
  }
16902
17095
  };
16903
17096
  }
16904
- function by(e, r) {
17097
+ function Ty(e, r) {
16905
17098
  let i = /* @__PURE__ */ fn(null), a = 0;
16906
17099
  function o(e) {
16907
17100
  return new Promise((t) => {
@@ -16922,17 +17115,17 @@ function by(e, r) {
16922
17115
  let t = i.value;
16923
17116
  t && (i.value = null, t.resolve({ action: e }));
16924
17117
  }
16925
- let c = py(e.storage);
17118
+ let c = vy(e.storage);
16926
17119
  e.debug && c && c.onEvent((e) => console.log("[page-agent-sdk][storage]", e));
16927
- let l = my(e.llm) ? void 0 : e.llm, u = ng({
17120
+ let l = yy(e.llm) ? void 0 : e.llm, u = ng({
16928
17121
  model: l?.model,
16929
17122
  contextWindow: e.contextWindow ?? l?.contextWindow,
16930
17123
  maxOutputTokens: e.maxOutputTokens ?? l?.maxOutputTokens
16931
17124
  });
16932
17125
  e.debug && console.log("[page-agent-sdk][modelCaps]", u);
16933
- let d = _y(e);
17126
+ let d = Sy(e);
16934
17127
  e.debug && !d && console.warn("[page-agent-sdk][summarization] 未构造 llmInvoke(apiKey 缺失?),摘要回退零成本索引摘要");
16935
- let f = /* @__PURE__ */ Qt([]), p = K_(e.vfs?.initialFiles, {
17128
+ let f = /* @__PURE__ */ Qt([]), p = G_(e.vfs?.initialFiles, {
16936
17129
  persist: c ? { save: (e) => {
16937
17130
  B.sessionId && c && c.save(r, B.sessionId, { vfs: e });
16938
17131
  } } : void 0,
@@ -16941,19 +17134,20 @@ function by(e, r) {
16941
17134
  ...e.data,
16942
17135
  description: e.data.description ?? "主数据对象"
16943
17136
  } : void 0, v = e.checkpoint, y = v !== void 0 && v !== !1, b = y ? qg({
17137
+ getData: () => O()?.bind,
16944
17138
  slotPaths: _ ? [""] : [],
16945
17139
  vfsStore: p,
16946
17140
  todosMw: m,
16947
17141
  getTodos: () => g.current?.getState?.()?.todos ?? [],
16948
17142
  messages: f,
16949
17143
  maxCheckpoints: v && typeof v == "object" ? v.maxCheckpoints : void 0
16950
- }) : null, x = !v || typeof v != "object" || v.auto !== !1, S = e.capabilities, C = S?.dataOps !== !1, w = (e.systemPrompt ?? uy) + dy(_), T = C && _ ? jv(_, {
17144
+ }) : null, x = !v || typeof v != "object" || v.auto !== !1, S = e.capabilities, C = S?.dataOps !== !1, w = (e.systemPrompt ?? hy) + gy(_), T = C && _ ? Iv(_, {
16951
17145
  onAudit: e.debug ? (e) => console.log("[page-agent-sdk][data audit]", e) : void 0,
16952
17146
  maxSnapshots: e.maxSnapshots,
16953
17147
  onConflict: o,
16954
17148
  autoLock: e.autoLock,
16955
17149
  interceptors: e.interceptors
16956
- }) : [], E = C ? Av(T, e.toolMode) : [], D = C && _ ? T.controller ?? null : null, O = () => D?.get() ?? _, k = /* @__PURE__ */ new Map(), A = Iv(S, E, Nv);
17150
+ }) : [], E = C ? Fv(T, e.toolMode) : [], D = C && _ ? T.controller ?? null : null, O = () => D?.get() ?? _, k = /* @__PURE__ */ new Map(), A = Vv(S, E, Rv);
16957
17151
  A.forEach((e) => k.set(e.name, "builtin"));
16958
17152
  let j = [...e.tools || []];
16959
17153
  j.forEach((e) => k.set(e.name, "user"));
@@ -16961,10 +17155,10 @@ function by(e, r) {
16961
17155
  N && k.set(Lg, "builtin");
16962
17156
  let P = y && b ? [n(async () => {
16963
17157
  let e = b.list();
16964
- return e.length ? b.restore() ? `已回退到最近一次正常状态(checkpoint #${e[e.length - 1].id})。对话历史、数据槽注册项、vfs、todos 已整体还原。请基于回退后的状态重新判断并继续。` : "回退失败:无可用 checkpoint。" : "无可用 checkpoint,无法回退。";
17158
+ return e.length ? b.restore() ? `已回退到最近一次正常状态(checkpoint #${e[e.length - 1].id})。对话历史、主数据、vfs、todos 已整体还原。请基于回退后的状态重新判断并继续。` : "回退失败:无可用 checkpoint。" : "无可用 checkpoint,无法回退。";
16965
17159
  }, {
16966
17160
  name: "restore_last_checkpoint",
16967
- description: "回退到最近一次正常状态(整体还原对话历史 + 数据槽注册项 + vfs + todos)。当本轮操作出错、页面被改坏、或走偏时调用,回到本轮起点重新来过。不传参数即回退最近一次。",
17161
+ description: "回退到最近一次正常状态(整体还原对话历史 + 主数据 + vfs + todos)。当本轮操作出错、页面被改坏、或走偏时调用,回到本轮起点重新来过。不传参数即回退最近一次。",
16968
17162
  schema: t.object({}).optional()
16969
17163
  }), n(async () => {
16970
17164
  let e = b.list();
@@ -17003,12 +17197,15 @@ function by(e, r) {
17003
17197
  "read",
17004
17198
  "fetch_document"
17005
17199
  ], le = F.filter((e) => ce.includes(e.name)), ue = re ? o_({
17006
- check: e.verify.check ?? f_({ schemas: () => O() ? { "": O().schema } : {} }),
17200
+ check: e.verify.check ?? f_({
17201
+ schemas: () => O() ? { "": O().schema } : {},
17202
+ root: () => O()?.bind
17203
+ }),
17007
17204
  adversarial: e.verify?.adversarial ? {
17008
17205
  llm: e.llm,
17009
17206
  tools: le
17010
17207
  } : void 0
17011
- }) : void 0, de = Rv({
17208
+ }) : void 0, de = Uv({
17012
17209
  ...S,
17013
17210
  humanConfirm: M,
17014
17211
  subagents: e.subagents?.map((e) => ({
@@ -17029,14 +17226,11 @@ function by(e, r) {
17029
17226
  de,
17030
17227
  ...I ? [m] : [],
17031
17228
  ...L ? [kg(e.skills || [], { readVfs: ee ? (e) => p.files[e]?.content : void 0 })] : [],
17032
- ...ee ? [$_(p)] : [],
17033
- ...R ? [I_({
17034
- ...V_(e, u.contextWindow),
17229
+ ...ee ? [Q_(p)] : [],
17230
+ ...R ? [F_({
17231
+ ...B_(e, u.contextWindow),
17035
17232
  llmInvoke: d,
17036
- getRegisteredSlots: () => O() ? [{
17037
- path: "",
17038
- description: O().description ?? "主数据对象"
17039
- }] : [],
17233
+ getRegisteredData: () => O() ? [{ description: O().description ?? "主数据对象" }] : [],
17040
17234
  preserveLastToolResults: (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? ["describe_data", "read"]
17041
17235
  })] : [],
17042
17236
  ...z ? [h] : [],
@@ -17048,8 +17242,8 @@ function by(e, r) {
17048
17242
  ...oe ? [oe] : [],
17049
17243
  ...se ? [se] : [],
17050
17244
  ...e.middleware || [],
17051
- yy(me, f, O)
17052
- ], ge = e.maxMemoryRounds ?? fy, B = {
17245
+ wy(me, f, O)
17246
+ ], ge = e.maxMemoryRounds ?? _y, B = {
17053
17247
  agentId: r,
17054
17248
  store: c,
17055
17249
  messages: f,
@@ -17124,14 +17318,14 @@ function by(e, r) {
17124
17318
  if (B.refCount--, B.refCount <= 0) {
17125
17319
  c && (p.flush?.(), c.flush(), c.dispose());
17126
17320
  let e = B.mcpClosers.splice(0);
17127
- e.length && Promise.allSettled(e.map((e) => e())), hy.delete(r);
17321
+ e.length && Promise.allSettled(e.map((e) => e())), by.delete(r);
17128
17322
  }
17129
17323
  },
17130
17324
  resolveConflict: s,
17131
17325
  getInfo() {
17132
17326
  return {
17133
17327
  id: r,
17134
- model: my(e.llm) ? e.llm.model ?? e.llm.modelName : e.llm.model,
17328
+ model: yy(e.llm) ? e.llm.model ?? e.llm.modelName : e.llm.model,
17135
17329
  systemPrompt: w,
17136
17330
  tools: F.map((e) => ({
17137
17331
  name: e.name,
@@ -17218,7 +17412,7 @@ function by(e, r) {
17218
17412
  }), F.push(...n), e.debug && console.log(`[page-agent-sdk][mcp] 注入 ${n.length} 个工具,${B.mcpServers.length} 个 server`);
17219
17413
  }
17220
17414
  B.agent = bg({
17221
- ...my(e.llm) ? { llm: e.llm } : {
17415
+ ...yy(e.llm) ? { llm: e.llm } : {
17222
17416
  apiKey: e.llm.apiKey,
17223
17417
  baseUrl: e.llm.baseUrl,
17224
17418
  model: e.llm.model,
@@ -17238,11 +17432,11 @@ function by(e, r) {
17238
17432
  }), g.current = B.agent;
17239
17433
  })(), B;
17240
17434
  }
17241
- function xy(e) {
17242
- let t = e.id ?? zv();
17435
+ function Ey(e) {
17436
+ let t = e.id ?? Wv();
17243
17437
  e.id || console.warn(`[page-agent-sdk] 未传 options.id,已生成随机 id "${t}"。刷新后持久化数据无法恢复,请传稳定 id。`);
17244
- let n = e.streaming ?? !0, r = e.ui ?? "default", i, a = e.shareContext ? hy.get(t) : void 0;
17245
- a ? i = a : (i = by(e, t), e.shareContext && hy.set(t, i)), i.refCount++;
17438
+ let n = e.streaming ?? !0, r = e.ui ?? "default", i, a = e.shareContext ? by.get(t) : void 0;
17439
+ a ? i = a : (i = Ty(e, t), e.shareContext && by.set(t, i)), i.refCount++;
17246
17440
  let o = null, s = null, c = null;
17247
17441
  async function l() {
17248
17442
  if (await i.initDone, r === !1) {
@@ -17277,7 +17471,7 @@ function xy(e) {
17277
17471
  i.afterRound(), i.store && await i.store.flush();
17278
17472
  },
17279
17473
  onClear: () => {
17280
- i.store && (i.sessionId = zv(), i.vfsStore.clear?.(), i.todosMw.reset([]), e.memory || i.memoryMw.reset(""), i.agent.debugLogs.value = [], i.store.createSession(i.agentId, e.session?.title, i.sessionId));
17474
+ i.store && (i.sessionId = Wv(), i.vfsStore.clear?.(), i.todosMw.reset([]), e.memory || i.memoryMw.reset(""), i.agent.debugLogs.value = [], i.store.createSession(i.agentId, e.session?.title, i.sessionId));
17281
17475
  },
17282
17476
  pendingConflict: i.pendingConflict.value,
17283
17477
  onResolveConflict: (e) => i.resolveConflict(e)
@@ -17316,7 +17510,7 @@ function xy(e) {
17316
17510
  }
17317
17511
  //#endregion
17318
17512
  //#region src/core/sdk/defineTool.ts
17319
- function Sy(e) {
17513
+ function Dy(e) {
17320
17514
  return n(async (t) => {
17321
17515
  let n = await e.handler(t);
17322
17516
  return typeof n == "string" ? n : JSON.stringify(n);
@@ -17327,4 +17521,4 @@ function Sy(e) {
17327
17521
  });
17328
17522
  }
17329
17523
  //#endregion
17330
- export { B_ as CONTEXT_PRESETS, Xh as ChatDialog, ef as CodePreview, Lg as HUMAN_CONFIRM_TOOL_NAME, nf as MessageContent, S_ as connectMcp, Sl as copyText, bg as createAgent, Ig as createApprovalMiddleware, xy as createChatSdk, qg as createCheckpointManager, Jg as createCheckpointMiddleware, jv as createDataOps, Bg as createHumanConfirmMiddleware, zg as createHumanConfirmTool, ay as createMemoryBackend, ly as createSessionStore, n_ as createSubagentMiddleware, a_ as createSubagentsMiddleware, Rv as createUsageHintsMiddleware, o_ as createVerifyMiddleware, K_ as createVfs, sy as createWebStorageBackend, f_ as createWriteBackCheck, Fv as defineDataToolset, Cg as defineSkill, Sy as defineTool, hg as detectGarbledToolCall, rg as estimateTokens, z_ as extractSchemaHint, y_ as extractText, Nv as fetchDocTools, Pv as fetchTools, Av as filterByToolMode, H_ as formatZodIssues, Zv as isQuotaError, lv as jpEval, W_ as jsonParseError, ag as offloadPassThroughChars, ig as offloadThresholdChars, L_ as presets, V_ as resolveContextOptions, ng as resolveModelCaps, mv as runSandboxedScript, dv as searchJson, Iv as selectBuiltinTools, R_ as systemPromptHelpers, $ as toolError, xl as useChat, e as z, U_ as zodError };
17524
+ export { z_ as CONTEXT_PRESETS, Xh as ChatDialog, ef as CodePreview, Lg as HUMAN_CONFIRM_TOOL_NAME, nf as MessageContent, S_ as connectMcp, Sl as copyText, bg as createAgent, Ig as createApprovalMiddleware, Ey as createChatSdk, qg as createCheckpointManager, Jg as createCheckpointMiddleware, Iv as createDataOps, Bg as createHumanConfirmMiddleware, zg as createHumanConfirmTool, uy as createMemoryBackend, my as createSessionStore, n_ as createSubagentMiddleware, a_ as createSubagentsMiddleware, Uv as createUsageHintsMiddleware, o_ as createVerifyMiddleware, G_ as createVfs, fy as createWebStorageBackend, f_ as createWriteBackCheck, Bv as defineDataToolset, Cg as defineSkill, Dy as defineTool, hg as detectGarbledToolCall, rg as estimateTokens, R_ as extractSchemaHint, y_ as extractText, Rv as fetchDocTools, zv as fetchTools, Fv as filterByToolMode, V_ as formatZodIssues, ny as isQuotaError, cv as jpEval, U_ as jsonParseError, ag as offloadPassThroughChars, ig as offloadThresholdChars, I_ as presets, B_ as resolveContextOptions, ng as resolveModelCaps, pv as runSandboxedScript, uv as searchJson, Vv as selectBuiltinTools, L_ as systemPromptHelpers, $ as toolError, xl as useChat, e as z, H_ as zodError };