page-agent-sdk 2.1.0 → 2.4.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.
@@ -36,13 +36,13 @@ var v = process.env.NODE_ENV === "production" ? {} : Object.freeze({}), y = proc
36
36
  writable: r,
37
37
  value: n
38
38
  });
39
- }, B = (e) => {
39
+ }, me = (e) => {
40
40
  let t = parseFloat(e);
41
41
  return isNaN(t) ? e : t;
42
- }, me = (e) => {
42
+ }, he = (e) => {
43
43
  let t = N(e) ? Number(e) : NaN;
44
44
  return isNaN(t) ? e : t;
45
- }, he, ge = () => he ||= typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : typeof window < "u" ? window : typeof global < "u" ? global : {};
45
+ }, ge, B = () => ge ||= typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : typeof window < "u" ? window : typeof global < "u" ? global : {};
46
46
  function _e(e) {
47
47
  if (O(e)) {
48
48
  let t = {};
@@ -1179,7 +1179,7 @@ var or = !1, sr = (e) => {
1179
1179
  or = e;
1180
1180
  }
1181
1181
  }, cr = /* @__PURE__ */ new Map();
1182
- process.env.NODE_ENV !== "production" && (ge().__VUE_HMR_RUNTIME__ = {
1182
+ process.env.NODE_ENV !== "production" && (B().__VUE_HMR_RUNTIME__ = {
1183
1183
  createRecord: _r(fr),
1184
1184
  rerender: _r(mr),
1185
1185
  reload: _r(hr)
@@ -1736,7 +1736,7 @@ function Ai(e) {
1736
1736
  let t = Oi.get(e);
1737
1737
  t && (t.flags |= 8, Oi.delete(e));
1738
1738
  }
1739
- ge().requestIdleCallback, ge().cancelIdleCallback;
1739
+ B().requestIdleCallback, B().cancelIdleCallback;
1740
1740
  var ji = (e) => !!e.type.__asyncLoader, Mi = (e) => e.type.__isKeepAlive;
1741
1741
  function Ni(e, t) {
1742
1742
  Fi(e, "a", t);
@@ -2182,7 +2182,7 @@ function Da(e, t, ...n) {
2182
2182
  }
2183
2183
  }
2184
2184
  let i = n, a = t.startsWith("update:"), o = a && Ea(r, t.slice(7));
2185
- if (o && (o.trim && (i = n.map((e) => N(e) ? e.trim() : e)), o.number && (i = n.map(B))), process.env.NODE_ENV !== "production" && Nr(e, t, i), process.env.NODE_ENV !== "production") {
2185
+ if (o && (o.trim && (i = n.map((e) => N(e) ? e.trim() : e)), o.number && (i = n.map(me))), process.env.NODE_ENV !== "production" && Nr(e, t, i), process.env.NODE_ENV !== "production") {
2186
2186
  let n = t.toLowerCase();
2187
2187
  n !== t && r[ue(n)] && G(`Event "${n}" is emitted in component ${Ls(e, e.type)} but the handler is registered for "${t}". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "${ce(t)}" instead of "${t}".`);
2188
2188
  }
@@ -2573,7 +2573,7 @@ function To(e) {
2573
2573
  }
2574
2574
  function Eo(e, t) {
2575
2575
  Co();
2576
- let n = ge();
2576
+ let n = B();
2577
2577
  n.__VUE__ = !0, process.env.NODE_ENV !== "production" && Sr(n.__VUE_DEVTOOLS_GLOBAL_HOOK__, n);
2578
2578
  let { insert: r, remove: i, patchProp: a, createElement: o, createText: s, createComment: c, setText: l, setElementText: u, parentNode: d, nextSibling: f, setScopeId: p = b, insertStaticContent: m } = e, h = (e, t, n, r = null, i = null, a = null, o = void 0, s = null, c = process.env.NODE_ENV !== "production" && or ? !1 : !!t.dynamicChildren) => {
2579
2579
  if (e === t) return;
@@ -2741,9 +2741,9 @@ function Eo(e, t) {
2741
2741
  e.subTree = p, process.env.NODE_ENV !== "production" && bo(e, "patch"), h(m, p, d(m.el), ce(m), e, i, a), process.env.NODE_ENV !== "production" && xo(e, "patch"), t.el = p.el, u === null && Ha(e, p.el), r && wo(r, i), (f = t.props && t.props.onVnodeUpdated) && wo(() => ls(f, s, t, c), i), process.env.NODE_ENV !== "production" && Er(e), process.env.NODE_ENV !== "production" && kn();
2742
2742
  } else {
2743
2743
  let o, { el: s, props: c } = t, { bm: l, m: u, parent: d, root: f, type: p } = e, m = ji(t);
2744
- if (Oo(e, !1), l && fe(l), !m && (o = c && c.onVnodeBeforeMount) && ls(o, d, t), Oo(e, !0), s && me) {
2744
+ if (Oo(e, !1), l && fe(l), !m && (o = c && c.onVnodeBeforeMount) && ls(o, d, t), Oo(e, !0), s && he) {
2745
2745
  let t = () => {
2746
- process.env.NODE_ENV !== "production" && bo(e, "render"), e.subTree = Na(e), process.env.NODE_ENV !== "production" && xo(e, "render"), process.env.NODE_ENV !== "production" && bo(e, "hydrate"), me(s, e.subTree, e, i, null), process.env.NODE_ENV !== "production" && xo(e, "hydrate");
2746
+ process.env.NODE_ENV !== "production" && bo(e, "render"), e.subTree = Na(e), process.env.NODE_ENV !== "production" && xo(e, "render"), process.env.NODE_ENV !== "production" && bo(e, "hydrate"), he(s, e.subTree, e, i, null), process.env.NODE_ENV !== "production" && xo(e, "hydrate");
2747
2747
  };
2748
2748
  m && p.__asyncHydrate ? p.__asyncHydrate(s, e, t) : t();
2749
2749
  } else {
@@ -2941,11 +2941,11 @@ function Eo(e, t) {
2941
2941
  pbc: A,
2942
2942
  n: ce,
2943
2943
  o: e
2944
- }, B, me;
2945
- return t && ([B, me] = t(de)), {
2944
+ }, me, he;
2945
+ return t && ([me, he] = t(de)), {
2946
2946
  render: ue,
2947
- hydrate: B,
2948
- createApp: wa(ue, B)
2947
+ hydrate: me,
2948
+ createApp: wa(ue, me)
2949
2949
  };
2950
2950
  }
2951
2951
  function Do({ type: e, props: t }, n) {
@@ -3242,7 +3242,7 @@ function fs(e, t, n) {
3242
3242
  }
3243
3243
  var ps = null, ms = () => ps || Pr, hs, gs;
3244
3244
  {
3245
- let e = ge(), t = (t, n) => {
3245
+ let e = B(), t = (t, n) => {
3246
3246
  let r;
3247
3247
  return (r = e[t]) || (r = e[t] = []), r.push(n), (e) => {
3248
3248
  r.length > 1 ? r.forEach((t) => t(e)) : r[0](e);
@@ -3692,7 +3692,7 @@ function sc(e) {
3692
3692
  }
3693
3693
  }
3694
3694
  function cc(e) {
3695
- let t = me(e);
3695
+ let t = he(e);
3696
3696
  return process.env.NODE_ENV !== "production" && In(t, "<transition> explicit duration"), t;
3697
3697
  }
3698
3698
  function lc(e, t) {
@@ -3925,7 +3925,7 @@ function el(e) {
3925
3925
  }
3926
3926
  var tl = /* @__PURE__ */ Symbol("_assign");
3927
3927
  function nl(e, t, n) {
3928
- return t && (e = e.trim()), n && (e = B(e)), e;
3928
+ return t && (e = e.trim()), n && (e = me(e)), e;
3929
3929
  }
3930
3930
  var rl = {
3931
3931
  created(e, { modifiers: { lazy: t, trim: n, number: r } }, i) {
@@ -3942,7 +3942,7 @@ var rl = {
3942
3942
  },
3943
3943
  beforeUpdate(e, { value: t, oldValue: n, modifiers: { lazy: r, trim: i, number: a } }, o) {
3944
3944
  if (e[tl] = Qc(o), e.composing) return;
3945
- let s = (a || e.type === "number") && !/^0\d/.test(e.value) ? B(e.value) : e.value, c = t ?? "";
3945
+ let s = (a || e.type === "number") && !/^0\d/.test(e.value) ? me(e.value) : e.value, c = t ?? "";
3946
3946
  if (s === c) return;
3947
3947
  let l = e.getRootNode();
3948
3948
  (l instanceof Document || l instanceof ShadowRoot) && l.activeElement === e && e.type !== "range" && (r && t === n || i && e.value.trim() === c) || (e.value = c);
@@ -6048,13 +6048,13 @@ var td = /* @__PURE__ */ m(((e, t) => {
6048
6048
  function fe(e) {
6049
6049
  return ce.includes(e.toLowerCase());
6050
6050
  }
6051
- var pe = {}, B = (e) => {
6051
+ var pe = {}, me = (e) => {
6052
6052
  console.error(e);
6053
- }, me = (e, ...t) => {
6053
+ }, he = (e, ...t) => {
6054
6054
  console.log(`WARN: ${e}`, ...t);
6055
- }, he = (e, t) => {
6055
+ }, ge = (e, t) => {
6056
6056
  pe[`${e}/${t}`] || (console.log(`Deprecated as of ${e}. ${t}`), pe[`${e}/${t}`] = !0);
6057
- }, ge = /* @__PURE__ */ Error();
6057
+ }, B = /* @__PURE__ */ Error();
6058
6058
  function _e(e, t, { key: n }) {
6059
6059
  let r = 0, i = e[n], a = {}, o = {};
6060
6060
  for (let e = 1; e <= t.length; e++) o[e + r] = i[e], a[e + r] = !0, r += b(t[e - 1]);
@@ -6062,15 +6062,15 @@ var td = /* @__PURE__ */ m(((e, t) => {
6062
6062
  }
6063
6063
  function ve(e) {
6064
6064
  if (Array.isArray(e.begin)) {
6065
- if (e.skip || e.excludeBegin || e.returnBegin) throw B("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), ge;
6066
- if (typeof e.beginScope != "object" || e.beginScope === null) throw B("beginScope must be object"), ge;
6065
+ if (e.skip || e.excludeBegin || e.returnBegin) throw me("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), B;
6066
+ if (typeof e.beginScope != "object" || e.beginScope === null) throw me("beginScope must be object"), B;
6067
6067
  _e(e, e.begin, { key: "beginScope" }), e.begin = C(e.begin, { joinWith: "" });
6068
6068
  }
6069
6069
  }
6070
6070
  function ye(e) {
6071
6071
  if (Array.isArray(e.end)) {
6072
- if (e.skip || e.excludeEnd || e.returnEnd) throw B("skip, excludeEnd, returnEnd not compatible with endScope: {}"), ge;
6073
- if (typeof e.endScope != "object" || e.endScope === null) throw B("endScope must be object"), ge;
6072
+ if (e.skip || e.excludeEnd || e.returnEnd) throw me("skip, excludeEnd, returnEnd not compatible with endScope: {}"), B;
6073
+ if (typeof e.endScope != "object" || e.endScope === null) throw me("endScope must be object"), B;
6074
6074
  _e(e, e.end, { key: "endScope" }), e.end = C(e.end, { joinWith: "" });
6075
6075
  }
6076
6076
  }
@@ -6199,13 +6199,13 @@ var td = /* @__PURE__ */ m(((e, t) => {
6199
6199
  let n = l.languageDetectRe.exec(t);
6200
6200
  if (n) {
6201
6201
  let t = N(n[1]);
6202
- return t || (me(s.replace("{}", n[1])), me("Falling back to no-highlight mode for this block.", e)), t ? n[1] : "no-highlight";
6202
+ return t || (he(s.replace("{}", n[1])), he("Falling back to no-highlight mode for this block.", e)), t ? n[1] : "no-highlight";
6203
6203
  }
6204
6204
  return t.split(/\s+/).find((e) => u(e) || N(e));
6205
6205
  }
6206
6206
  function p(e, t, n) {
6207
6207
  let r = "", i = "";
6208
- typeof t == "object" ? (r = e, n = t.ignoreIllegals, i = t.language) : (he("10.7.0", "highlight(lang, code, ...args) has been deprecated."), he("10.7.0", "Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), i = e, r = t), n === void 0 && (n = !0);
6208
+ typeof t == "object" ? (r = e, n = t.ignoreIllegals, i = t.language) : (ge("10.7.0", "highlight(lang, code, ...args) has been deprecated."), ge("10.7.0", "Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), i = e, r = t), n === void 0 && (n = !0);
6209
6209
  let a = {
6210
6210
  code: r,
6211
6211
  language: i
@@ -6335,7 +6335,7 @@ var td = /* @__PURE__ */ m(((e, t) => {
6335
6335
  return P += a, a.length;
6336
6336
  }
6337
6337
  let D = N(e);
6338
- if (!D) throw B(s.replace("{}", e)), Error("Unknown language: \"" + e + "\"");
6338
+ if (!D) throw me(s.replace("{}", e)), Error("Unknown language: \"" + e + "\"");
6339
6339
  let O = Se(D), k = "", A = a || O, j = {}, M = new l.__emitter(l);
6340
6340
  w();
6341
6341
  let P = "", F = 0, I = 0, L = 0, ee = !1;
@@ -6447,10 +6447,10 @@ var td = /* @__PURE__ */ m(((e, t) => {
6447
6447
  l = Oe(l, e);
6448
6448
  }
6449
6449
  let E = () => {
6450
- k(), he("10.6.0", "initHighlighting() deprecated. Use highlightAll() now.");
6450
+ k(), ge("10.6.0", "initHighlighting() deprecated. Use highlightAll() now.");
6451
6451
  };
6452
6452
  function D() {
6453
- k(), he("10.6.0", "initHighlightingOnLoad() deprecated. Use highlightAll() now.");
6453
+ k(), ge("10.6.0", "initHighlightingOnLoad() deprecated. Use highlightAll() now.");
6454
6454
  }
6455
6455
  let O = !1;
6456
6456
  function k() {
@@ -6468,7 +6468,7 @@ var td = /* @__PURE__ */ m(((e, t) => {
6468
6468
  try {
6469
6469
  i = r(e);
6470
6470
  } catch (e) {
6471
- if (B("Language definition for '{}' could not be registered.".replace("{}", n)), o) B(e);
6471
+ if (me("Language definition for '{}' could not be registered.".replace("{}", n)), o) me(e);
6472
6472
  else throw e;
6473
6473
  i = c;
6474
6474
  }
@@ -6514,7 +6514,7 @@ var td = /* @__PURE__ */ m(((e, t) => {
6514
6514
  });
6515
6515
  }
6516
6516
  function te(e) {
6517
- return he("10.7.0", "highlightBlock will be removed entirely in v12.0"), he("10.7.0", "Please use highlightElement now."), w(e);
6517
+ return ge("10.7.0", "highlightBlock will be removed entirely in v12.0"), ge("10.7.0", "Please use highlightElement now."), w(e);
6518
6518
  }
6519
6519
  Object.assign(e, {
6520
6520
  highlight: p,
@@ -11517,7 +11517,7 @@ var td = /* @__PURE__ */ m(((e, t) => {
11517
11517
  t
11518
11518
  ],
11519
11519
  illegal: [/\[/, /%/]
11520
- }, B = {
11520
+ }, me = {
11521
11521
  match: [/\b(?:subscript|init[?!]?)/, /\s*(?=[<(])/],
11522
11522
  className: { 1: "keyword" },
11523
11523
  contains: [
@@ -11526,7 +11526,7 @@ var td = /* @__PURE__ */ m(((e, t) => {
11526
11526
  t
11527
11527
  ],
11528
11528
  illegal: /\[|%/
11529
- }, me = {
11529
+ }, he = {
11530
11530
  match: [
11531
11531
  /operator/,
11532
11532
  /\s+/,
@@ -11536,7 +11536,7 @@ var td = /* @__PURE__ */ m(((e, t) => {
11536
11536
  1: "keyword",
11537
11537
  3: "title"
11538
11538
  }
11539
- }, he = {
11539
+ }, ge = {
11540
11540
  begin: [
11541
11541
  /precedencegroup/,
11542
11542
  /\s+/,
@@ -11549,7 +11549,7 @@ var td = /* @__PURE__ */ m(((e, t) => {
11549
11549
  contains: [ce],
11550
11550
  keywords: [...p, ...f],
11551
11551
  end: /}/
11552
- }, ge = {
11552
+ }, B = {
11553
11553
  match: [
11554
11554
  /class\b/,
11555
11555
  /\s+/,
@@ -11622,12 +11622,12 @@ var td = /* @__PURE__ */ m(((e, t) => {
11622
11622
  contains: [
11623
11623
  ...a,
11624
11624
  pe,
11625
+ me,
11625
11626
  B,
11626
- ge,
11627
11627
  _e,
11628
11628
  ve,
11629
- me,
11630
11629
  he,
11630
+ ge,
11631
11631
  {
11632
11632
  beginKeywords: "import",
11633
11633
  end: /$/,
@@ -12736,7 +12736,7 @@ app.mount('#app');
12736
12736
  }, Wp = { class: "info-title" }, Gp = { class: "info-name" }, Kp = { class: "info-desc" }, qp = {
12737
12737
  key: 1,
12738
12738
  class: "info-section"
12739
- }, Jp = { class: "info-title" }, Yp = { class: "info-name" }, Xp = { class: "info-desc" }, Zp = { class: "info-section" }, Qp = { class: "kv-grid" }, $p = { class: "kv" }, em = { class: "v" }, tm = { class: "kv" }, nm = { class: "v" }, rm = { class: "kv" }, im = { class: "v" }, am = { class: "kv" }, om = {
12739
+ }, Jp = { class: "info-item" }, Yp = { class: "info-name" }, Xp = { class: "info-desc" }, Zp = { class: "info-section" }, Qp = { class: "kv-grid" }, $p = { class: "kv" }, em = { class: "v" }, tm = { class: "kv" }, nm = { class: "v" }, rm = { class: "kv" }, im = { class: "v" }, am = { class: "kv" }, om = {
12740
12740
  class: "v",
12741
12741
  style: { "font-size": "11px" }
12742
12742
  }, sm = {
@@ -13082,25 +13082,22 @@ app.mount('#app');
13082
13082
  key: e.name,
13083
13083
  class: "info-item"
13084
13084
  }, [Y("div", Gp, V(e.name), 1), Y("div", Kp, V(e.description), 1)]))), 128))])) : X("", !0),
13085
- b.value.dataSlots.length ? (q(), J("div", qp, [Y("div", Jp, "🪟 可操作属性 (" + V(b.value.dataSlots.length) + ")", 1), (q(!0), J(K, null, Xi(b.value.dataSlots, (e) => (q(), J("div", {
13086
- key: e.path,
13087
- class: "info-item"
13088
- }, [Y("div", Yp, V(e.path), 1), Y("div", Xp, V(e.description), 1)]))), 128))])) : X("", !0),
13089
- Y("div", Zp, [n[21] ||= Y("div", { class: "info-title" }, "🧬 子 Agent", -1), Y("div", Qp, [
13090
- Y("div", $p, [n[17] ||= Y("span", { class: "k" }, "启用", -1), Y("span", em, V(b.value.subagent.enabled ? "" : ""), 1)]),
13091
- Y("div", tm, [n[18] ||= Y("span", { class: "k" }, "最大递归", -1), Y("span", nm, V(b.value.subagent.maxDepth), 1)]),
13092
- Y("div", rm, [n[19] ||= Y("span", { class: "k" }, "并行上限", -1), Y("span", im, V(b.value.subagent.maxParallel), 1)]),
13093
- Y("div", am, [n[20] ||= Y("span", { class: "k" }, "额外工具", -1), Y("span", om, V(b.value.subagent.allowedTools.length ? b.value.subagent.allowedTools.join(", ") : "默认只读"), 1)])
13085
+ b.value.data ? (q(), J("div", qp, [n[17] ||= Y("div", { class: "info-title" }, "📊 可操作数据", -1), Y("div", Jp, [Y("div", Yp, V(b.value.data.description || "主数据对象"), 1), Y("div", Xp, "schema: " + V(b.value.data.schema ? "已声明" : "未声明"), 1)])])) : X("", !0),
13086
+ Y("div", Zp, [n[22] ||= Y("div", { class: "info-title" }, "🧬 子 Agent", -1), Y("div", Qp, [
13087
+ Y("div", $p, [n[18] ||= Y("span", { class: "k" }, "启用", -1), Y("span", em, V(b.value.subagent.enabled ? "是" : "否"), 1)]),
13088
+ Y("div", tm, [n[19] ||= Y("span", { class: "k" }, "最大递归", -1), Y("span", nm, V(b.value.subagent.maxDepth), 1)]),
13089
+ Y("div", rm, [n[20] ||= Y("span", { class: "k" }, "并行上限", -1), Y("span", im, V(b.value.subagent.maxParallel), 1)]),
13090
+ Y("div", am, [n[21] ||= Y("span", { class: "k" }, "额外工具", -1), Y("span", om, V(b.value.subagent.allowedTools.length ? b.value.subagent.allowedTools.join(", ") : "默认只读"), 1)])
13094
13091
  ])]),
13095
13092
  b.value.mcp?.servers?.length ? (q(), J("div", sm, [Y("div", cm, "🔌 MCP (" + V(b.value.mcp.servers.length) + ")", 1), (q(!0), J(K, null, Xi(b.value.mcp.servers, (e) => (q(), J("div", {
13096
13093
  key: e.name,
13097
13094
  class: "info-item"
13098
13095
  }, [Y("div", lm, [is(V(e.name) + " ", 1), Y("span", um, V(e.toolCount) + " 工具", 1)]), Y("div", dm, V(e.url), 1)]))), 128))])) : X("", !0),
13099
- b.value.verify ? (q(), J("div", fm, [n[26] ||= Y("div", { class: "info-title" }, "✅ Verify 自检", -1), Y("div", pm, [
13100
- Y("div", mm, [n[22] ||= Y("span", { class: "k" }, "启用", -1), Y("span", hm, V(b.value.verify.enabled ? "是" : "否"), 1)]),
13101
- Y("div", gm, [n[23] ||= Y("span", { class: "k" }, "自纠上限", -1), Y("span", _m, V(b.value.verify.maxAttempts), 1)]),
13102
- Y("div", vm, [n[24] ||= Y("span", { class: "k" }, "对抗验证", -1), Y("span", ym, V(b.value.verify.adversarial ? "开启" : "关闭"), 1)]),
13103
- b.value.verify.adversarial ? (q(), J("div", bm, [n[25] ||= Y("span", { class: "k" }, "对抗模型", -1), Y("span", xm, V(b.value.model || "-") + "(同主)", 1)])) : X("", !0)
13096
+ b.value.verify ? (q(), J("div", fm, [n[27] ||= Y("div", { class: "info-title" }, "✅ Verify 自检", -1), Y("div", pm, [
13097
+ Y("div", mm, [n[23] ||= Y("span", { class: "k" }, "启用", -1), Y("span", hm, V(b.value.verify.enabled ? "是" : "否"), 1)]),
13098
+ Y("div", gm, [n[24] ||= Y("span", { class: "k" }, "自纠上限", -1), Y("span", _m, V(b.value.verify.maxAttempts), 1)]),
13099
+ Y("div", vm, [n[25] ||= Y("span", { class: "k" }, "对抗验证", -1), Y("span", ym, V(b.value.verify.adversarial ? "开启" : "关闭"), 1)]),
13100
+ b.value.verify.adversarial ? (q(), J("div", bm, [n[26] ||= Y("span", { class: "k" }, "对抗模型", -1), Y("span", xm, V(b.value.model || "-") + "(同主)", 1)])) : X("", !0)
13104
13101
  ])])) : X("", !0),
13105
13102
  b.value.todos.length ? (q(), J("div", Sm, [Y("div", Cm, "📋 任务清单 (" + V(b.value.todos.length) + ")", 1), (q(!0), J(K, null, Xi(b.value.todos, (e, t) => (q(), J("div", {
13106
13103
  key: t,
@@ -13109,13 +13106,13 @@ app.mount('#app');
13109
13106
  class: "todo-tag",
13110
13107
  style: _e({ background: S[e.status] && S[e.status].color || "#9ca3af" })
13111
13108
  }, V(C(e.status)), 5), Y("span", null, V(e.content), 1)]))), 128))])) : X("", !0),
13112
- b.value.memory ? (q(), J("div", wm, [n[27] ||= Y("div", { class: "info-title" }, "📝 持久指令 (memory)", -1), Y("pre", Tm, V(b.value.memory), 1)])) : X("", !0),
13113
- b.value.lastCompression ? (q(), J("div", Em, [n[33] ||= Y("div", { class: "info-title" }, "🗜️ 上轮压缩", -1), Y("div", Dm, [
13114
- Y("div", Om, [n[28] ||= Y("span", { class: "k" }, "触发", -1), Y("span", km, V(b.value.lastCompression.triggered ? "✓" : "✗(未达阈值)"), 1)]),
13115
- Y("div", Am, [n[29] ||= Y("span", { class: "k" }, "摘要轮次", -1), Y("span", jm, V(b.value.lastCompression.roundsSummarized) + " / " + V(b.value.lastCompression.roundsTotal), 1)]),
13116
- Y("div", Mm, [n[30] ||= Y("span", { class: "k" }, "召回", -1), Y("span", Nm, V(b.value.lastCompression.roundsRecalled) + " 条", 1)]),
13117
- Y("div", Pm, [n[31] ||= Y("span", { class: "k" }, "消息数", -1), Y("span", Fm, V(b.value.lastCompression.originalMessages) + " → " + V(b.value.lastCompression.compressedMessages), 1)]),
13118
- Y("div", Im, [n[32] ||= Y("span", { class: "k" }, "策略", -1), Y("span", Lm, V(b.value.lastCompression.strategy), 1)])
13109
+ b.value.memory ? (q(), J("div", wm, [n[28] ||= Y("div", { class: "info-title" }, "📝 持久指令 (memory)", -1), Y("pre", Tm, V(b.value.memory), 1)])) : X("", !0),
13110
+ b.value.lastCompression ? (q(), J("div", Em, [n[34] ||= Y("div", { class: "info-title" }, "🗜️ 上轮压缩", -1), Y("div", Dm, [
13111
+ Y("div", Om, [n[29] ||= Y("span", { class: "k" }, "触发", -1), Y("span", km, V(b.value.lastCompression.triggered ? "✓" : "✗(未达阈值)"), 1)]),
13112
+ Y("div", Am, [n[30] ||= Y("span", { class: "k" }, "摘要轮次", -1), Y("span", jm, V(b.value.lastCompression.roundsSummarized) + " / " + V(b.value.lastCompression.roundsTotal), 1)]),
13113
+ Y("div", Mm, [n[31] ||= Y("span", { class: "k" }, "召回", -1), Y("span", Nm, V(b.value.lastCompression.roundsRecalled) + " 条", 1)]),
13114
+ Y("div", Pm, [n[32] ||= Y("span", { class: "k" }, "消息数", -1), Y("span", Fm, V(b.value.lastCompression.originalMessages) + " → " + V(b.value.lastCompression.compressedMessages), 1)]),
13115
+ Y("div", Im, [n[33] ||= Y("span", { class: "k" }, "策略", -1), Y("span", Lm, V(b.value.lastCompression.strategy), 1)])
13119
13116
  ])])) : X("", !0)
13120
13117
  ], 64)) : (q(), J("div", Ep, "暂无信息"))]))])
13121
13118
  ]), Y("div", {
@@ -13125,7 +13122,7 @@ app.mount('#app');
13125
13122
  _: 1
13126
13123
  })]));
13127
13124
  }
13128
- }), [["__scopeId", "data-v-2a895152"]]), zm = { class: "chat-header" }, Bm = { class: "header-left" }, Vm = { class: "header-title" }, Hm = {
13125
+ }), [["__scopeId", "data-v-cc5d7052"]]), zm = { class: "chat-header" }, Bm = { class: "header-left" }, Vm = { class: "header-title" }, Hm = {
13129
13126
  key: 0,
13130
13127
  class: "status-dot pulse"
13131
13128
  }, Um = { class: "header-actions" }, Wm = {
@@ -13591,7 +13588,7 @@ app.mount('#app');
13591
13588
  ])
13592
13589
  ], 2));
13593
13590
  }
13594
- }), [["__scopeId", "data-v-5bd12eb9"]]);
13591
+ }), [["__scopeId", "data-v-6f6e6133"]]);
13595
13592
  function Zh(e) {
13596
13593
  return e.replace(/^\/+/, "").replace(/\/+/g, "/");
13597
13594
  }
@@ -14357,14 +14354,18 @@ function Ag(e = "") {
14357
14354
  //#endregion
14358
14355
  //#region src/core/harness/permissions.ts
14359
14356
  var jg = /* @__PURE__ */ new Set([
14360
- "set_data_slot",
14361
- "delete_data_slot",
14357
+ "set_data",
14358
+ "edit_data",
14359
+ "delete_data",
14360
+ "write",
14362
14361
  "vfs_write",
14363
14362
  "vfs_edit"
14364
14363
  ]), Mg = /* @__PURE__ */ new Set([
14365
- "get_data_slot",
14366
- "describe_data_slot",
14367
- "list_data_slots",
14364
+ "get_data",
14365
+ "describe_data",
14366
+ "read",
14367
+ "query_data",
14368
+ "search_data",
14368
14369
  "vfs_read",
14369
14370
  "vfs_ls",
14370
14371
  "vfs_glob",
@@ -14386,7 +14387,7 @@ function Fg(e) {
14386
14387
  return {
14387
14388
  name: "permissions",
14388
14389
  wrapToolCall: async (t, n) => {
14389
- let r = jg.has(t.name) ? "write" : Mg.has(t.name) ? "read" : null, i = t.args?.path || "";
14390
+ let r = jg.has(t.name) ? "write" : Mg.has(t.name) ? "read" : null, i = t.args?.jsonPath || t.args?.path || "";
14390
14391
  return r && i && Pg(e, r, i) === "deny" ? {
14391
14392
  content: `权限拒绝:${r} 操作 "${i}" 被 permissions 规则禁止。`,
14392
14393
  status: "error"
@@ -14584,10 +14585,11 @@ function Yg(e) {
14584
14585
  return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
14585
14586
  }
14586
14587
  var Xg = [
14587
- "get_data_slot",
14588
- "get_slot_paths",
14589
- "list_data_slots",
14590
- "describe_data_slot",
14588
+ "describe_data",
14589
+ "get_data",
14590
+ "read",
14591
+ "query_data",
14592
+ "search_data",
14591
14593
  "fetch_document"
14592
14594
  ], Zg = 1, Qg = 4, $g = 6, e_ = ["spawn_agent", "spawn_agents"];
14593
14595
  async function t_(e, t, n, r, i) {
@@ -14753,19 +14755,25 @@ function o_(e) {
14753
14755
  };
14754
14756
  }
14755
14757
  var s_ = /* @__PURE__ */ new Set([
14756
- "set_data_slot",
14757
- "edit_data_slot",
14758
- "delete_data_slot"
14759
- ]), c_ = /校验失败|未在注册表中声明|未注册|不存在|仅支持|必须是/;
14758
+ "set_data",
14759
+ "edit_data",
14760
+ "delete_data",
14761
+ "write"
14762
+ ]), c_ = /校验失败|SCHEMA_INVALID|未注册|不存在|仅支持|必须是|NOT_OBJECT|PATH_UNSAFE|VERSION_CONFLICT|WRITE_INTERCEPT/;
14760
14763
  function l_(e) {
14761
14764
  let t = /* @__PURE__ */ new Map();
14762
14765
  for (let n of e) {
14763
14766
  let e = n?.tool_calls;
14764
- if (Array.isArray(e)) for (let n of e) s_.has(n.name) && typeof n?.args?.path == "string" && t.set(n.args.path, {
14765
- path: n.args.path,
14766
- op: n.name,
14767
- callId: n.id
14768
- });
14767
+ if (Array.isArray(e)) {
14768
+ for (let n of e) if (s_.has(n.name)) {
14769
+ let e = typeof n?.args?.jsonPath == "string" ? n.args.jsonPath : "";
14770
+ t.set(e, {
14771
+ path: e,
14772
+ op: n.name,
14773
+ callId: n.id
14774
+ });
14775
+ }
14776
+ }
14769
14777
  }
14770
14778
  return [...t.values()];
14771
14779
  }
@@ -14778,6 +14786,7 @@ function u_(e) {
14778
14786
  return t;
14779
14787
  }
14780
14788
  function d_(e, t) {
14789
+ if (t === "") return e;
14781
14790
  if (e == null) return;
14782
14791
  let n = e;
14783
14792
  for (let e of t.split(".")) {
@@ -14791,16 +14800,16 @@ function f_(e = {}) {
14791
14800
  return async ({ messages: e }) => {
14792
14801
  let r = l_(e);
14793
14802
  if (!r.length) return { ok: !0 };
14794
- let i = u_(e), a = n(), o = [];
14803
+ let i = u_(e), a = n()[""], o = [];
14795
14804
  for (let { path: e, op: n, callId: s } of r) {
14796
14805
  let r = s ? i.get(s) : void 0;
14797
14806
  if (r && c_.test(r)) continue;
14798
14807
  let c = d_(t, e);
14799
- if (n === "delete_data_slot") c !== void 0 && o.push(`${e} 删除后读回仍有值,疑似未生效`);
14808
+ if (n === "delete_data") c !== void 0 && o.push(`${e} 删除后读回仍有值,疑似未生效`);
14800
14809
  else if (c == null) o.push(`写入 ${e} 后读回为空,疑似未生效`);
14801
- else if (a[e]) {
14802
- let t = a[e].safeParse(c);
14803
- t.success || o.push(`${e} 读回值不符合 schema:${t.error.issues?.[0]?.message ?? "校验失败"}`);
14810
+ else if (a) {
14811
+ let n = a.safeParse(t);
14812
+ n.success || o.push(`${e} 读回值不符合 schema:${n.error.issues?.[0]?.message ?? "校验失败"}`);
14804
14813
  }
14805
14814
  }
14806
14815
  return o.length ? {
@@ -14834,7 +14843,7 @@ async function v_(e, t, n, r) {
14834
14843
  "你是严格的对抗式审查者,目标是找出以下 AI 助手回复的错误并证明它有问题(事实错误 / 遗漏 / 逻辑矛盾 / 与需求不符)。",
14835
14844
  `用户需求:${i || "(未明确)"}`,
14836
14845
  `助手回复:${a}`,
14837
- o ? "重点检查 window 修改:① 属性路径是否正确(是否误写未注册路径);② 值类型是否符合该属性 schema;③ 语义是否符合属性 description。可用只读工具(get_data_slot / list_data_slots 等)读回实际值实证。" : "只报告具体、可验证的问题。",
14846
+ o ? "重点检查主数据修改:① jsonPath 是否正确(是否误写不存在的子路径);② 值类型是否符合主数据 schema;③ 语义是否符合字段 description。可用只读工具(read / get_data / describe_data 等)读回实际值实证。" : "只报告具体、可验证的问题。",
14838
14847
  "若确实无问题,只回复\"无问题\"。"
14839
14848
  ].join("\n"), c = "你是严格的对抗式审查者,只找问题不赞美。目标是反驳,不是改进。", l = n ? (e) => n(e.type, {
14840
14849
  ...e.data,
@@ -15045,8 +15054,8 @@ function P_(e = {}) {
15045
15054
  if (p && m.push("\n【与当前问题可能相关的早期对话】", p), t.getRegisteredSlots) try {
15046
15055
  let e = t.getRegisteredSlots();
15047
15056
  if (e.length) {
15048
- let t = e.map((e) => `- ${e.path}: ${e.description}`).join("\n");
15049
- m.push("\n【当前可操作数据槽 属性(动态增删后的最新状态,操作前以 list_data_slots 为准)】", t);
15057
+ let t = e.map((e) => `- ${e.path ? e.path + ": " : ""}${e.description}`).join("\n");
15058
+ m.push("\n【当前可操作数据(动态增删后的最新状态,操作前以 describe_data / read 为准)】", t);
15050
15059
  }
15051
15060
  } catch {}
15052
15061
  let h = {
@@ -15110,7 +15119,7 @@ function I_(e = {}) {
15110
15119
  //#endregion
15111
15120
  //#region src/core/presets.ts
15112
15121
  var L_ = {
15113
- pageBuilder: { systemPrompt: "你是页面构建助手。流程:get_data_slot 读取当前页面结构 set_data_slot / edit_data_slot 修改属性 → 页面实时更新。多步任务先用 write_todos 拆解,逐步推进。" },
15122
+ pageBuilder: { systemPrompt: "你是页面构建助手。按用户意图读写主数据(经 data 声明 + schema 校验),改完页面实时更新。" },
15114
15123
  researcher: {
15115
15124
  systemPrompt: "你是调研助手。多路调研用 spawn_agents 并行委派子 agent(各负责一个方向);单份资料用 fetch_document 抓取;最后结构化汇总,给出结论与依据。",
15116
15125
  subagent: { maxParallel: 4 }
@@ -15125,12 +15134,26 @@ var L_ = {
15125
15134
  } }
15126
15135
  }, R_ = { reliableWriteRules: [
15127
15136
  "【可靠写入规则】",
15128
- "1. 改任何属性前,先用 get_data_slot 读其当前真实值,基于真实值改,不要凭记忆;",
15129
- "2. 若不确定可操作哪些属性,先 list_data_slots 查看当前注册项(动态组件场景下注册表会增删,以工具返回为准,勿凭旧记忆);",
15130
- "3. 不确定某属性字段结构时,先 describe_data_slot 看其说明,字段以 describe 返回为准;",
15137
+ "1. 改任何属性前,先用 read({ path }) 读其当前真实值,基于真实值改,不要凭记忆;",
15138
+ "2. 若不确定可操作哪些属性,先 read() 不传 path 查看当前注册项(动态组件场景下注册表会增删,以工具返回为准,勿凭旧记忆);",
15139
+ "3. 不确定某属性字段结构时,read({ path }) 返回含格式说明,字段以返回为准;",
15131
15140
  "4. 写入若被 schema 校验拒绝(返回结构化错误含字段名与期望类型),按错误修正后重试,不要放弃;",
15132
- "5. 优先用 edit_data_slot 增量 patch(只发改动),避免 set 整体重传大 JSON 被截断。"
15133
- ].join("\n") }, z_ = {
15141
+ "5. 优先用 write patch 增量改(只发改动,如 write({ path, value, patch:{ op, jsonPath } })),避免整体重传大 JSON 被截断。"
15142
+ ].join("\n") };
15143
+ function z_(e) {
15144
+ if (!e) return "";
15145
+ try {
15146
+ let t = e.shape ?? (e._def?.shape ? typeof e._def.shape == "function" ? e._def.shape() : e._def.shape : null);
15147
+ if (t && typeof t == "object") return Object.entries(t).map(([e, t]) => {
15148
+ let n = t?.description || "", r = t?._def?.typeName || "";
15149
+ return `- ${e}${n ? `: ${n}` : r ? ` (${r})` : ""}`;
15150
+ }).join("\n");
15151
+ } catch {}
15152
+ return e?.description || "(用 read 查看实际形状)";
15153
+ }
15154
+ //#endregion
15155
+ //#region src/core/sdk/contextPreset.ts
15156
+ var B_ = {
15134
15157
  auto: {
15135
15158
  summaryThresholdRatio: .5,
15136
15159
  windowRatio: .4,
@@ -15152,8 +15175,8 @@ var L_ = {
15152
15175
  enableLLMSummary: !0
15153
15176
  }
15154
15177
  };
15155
- function B_(e, t) {
15156
- let n = z_[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
15178
+ function V_(e, t) {
15179
+ let n = B_[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
15157
15180
  return {
15158
15181
  ...n,
15159
15182
  ...r,
@@ -15170,7 +15193,7 @@ function $(e) {
15170
15193
  };
15171
15194
  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)}`;
15172
15195
  }
15173
- function V_(e) {
15196
+ function H_(e) {
15174
15197
  return e.slice(0, 10).map((e) => {
15175
15198
  let t = e, n = {
15176
15199
  path: (Array.isArray(t.path) ? t.path.join(".") : String(t.path ?? "")) || "(root)",
@@ -15179,16 +15202,16 @@ function V_(e) {
15179
15202
  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;
15180
15203
  });
15181
15204
  }
15182
- function H_(e, t) {
15205
+ function U_(e, t) {
15183
15206
  return $({
15184
15207
  code: "SCHEMA_INVALID",
15185
15208
  path: e,
15186
15209
  message: `值不符合 "${e}" 的 schema(${t.length} 处问题)`,
15187
- hint: `按 describe_data_slot("${e}") 查看格式,修正后重试;改大对象优先用 edit_data_slot 增量 patch(只发改动部分)`,
15188
- details: V_(t)
15210
+ hint: `用 read({jsonPath:"${e}"}) 查看当前值,按 describe_data() 查看主数据 schema,修正后重试;改大对象优先用 write 的 patch 增量(只发改动部分)`,
15211
+ details: H_(t)
15189
15212
  });
15190
15213
  }
15191
- function U_(e, t, n) {
15214
+ function W_(e, t, n) {
15192
15215
  let r = n?.message || String(n);
15193
15216
  return $({
15194
15217
  code: "JSON_PARSE",
@@ -15197,18 +15220,18 @@ function U_(e, t, n) {
15197
15220
  hint: `检查引号/逗号/括号是否闭合;字符串值需双引号包裹(如 '"dark"' 表示字符串 dark,数字直接写如 5);预览前 80 字符:${t.slice(0, 80)}`
15198
15221
  });
15199
15222
  }
15200
- var W_ = .9;
15201
- function G_(e, t = {}) {
15223
+ var G_ = .9;
15224
+ function K_(e, t = {}) {
15202
15225
  let n = Object.create(null);
15203
- if (e) for (let [t, r] of Object.entries(e)) n[J_(t)] = {
15226
+ if (e) for (let [t, r] of Object.entries(e)) n[Y_(t)] = {
15204
15227
  content: r,
15205
- updatedAt: X_()
15228
+ updatedAt: Z_()
15206
15229
  };
15207
15230
  let { persist: r } = t, i = t.maxBytes ?? 4194304;
15208
15231
  function a() {
15209
- if (q_(n) <= i) return;
15210
- let e = i * W_, t = Object.entries(n).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
15211
- for (let [r] of t) if (delete n[r], q_(n) <= e) break;
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;
15212
15235
  }
15213
15236
  let o = null;
15214
15237
  function s() {
@@ -15233,7 +15256,7 @@ function G_(e, t = {}) {
15233
15256
  }
15234
15257
  }) };
15235
15258
  return r && (l.hydrate = (e) => {
15236
- for (let [t, r] of Object.entries(e)) n[J_(t)] = r;
15259
+ for (let [t, r] of Object.entries(e)) n[Y_(t)] = r;
15237
15260
  a();
15238
15261
  }, l.flush = () => {
15239
15262
  o &&= (clearTimeout(o), null), s();
@@ -15242,17 +15265,17 @@ function G_(e, t = {}) {
15242
15265
  c();
15243
15266
  }), l;
15244
15267
  }
15245
- var K_ = null;
15246
- function q_(e) {
15247
- K_ ||= new TextEncoder();
15268
+ var q_ = null;
15269
+ function J_(e) {
15270
+ q_ ||= new TextEncoder();
15248
15271
  let t = 0;
15249
- for (let n of Object.values(e)) t += K_.encode(n.content).length;
15272
+ for (let n of Object.values(e)) t += q_.encode(n.content).length;
15250
15273
  return t;
15251
15274
  }
15252
- function J_(e) {
15275
+ function Y_(e) {
15253
15276
  return e.replace(/^\/+/, "").replace(/\/+/g, "/");
15254
15277
  }
15255
- function Y_(e) {
15278
+ function X_(e) {
15256
15279
  let t = "";
15257
15280
  for (let n = 0; n < e.length; n++) {
15258
15281
  let r = e[n];
@@ -15260,13 +15283,13 @@ function Y_(e) {
15260
15283
  }
15261
15284
  return RegExp("^" + t + "$");
15262
15285
  }
15263
- function X_() {
15286
+ function Z_() {
15264
15287
  return Date.now();
15265
15288
  }
15266
- function Z_(e) {
15289
+ function Q_(e) {
15267
15290
  return [
15268
15291
  n(async ({ path: t, offset: n, limit: r }) => {
15269
- let i = e.files[J_(t)];
15292
+ let i = e.files[Y_(t)];
15270
15293
  if (!i) return $({
15271
15294
  code: "NOT_FOUND",
15272
15295
  path: t,
@@ -15284,9 +15307,9 @@ function Z_(e) {
15284
15307
  limit: t.number().int().min(1).default(2e3).describe("读取行数")
15285
15308
  })
15286
15309
  }),
15287
- n(async ({ path: t, content: n }) => (e.files[J_(t)] = {
15310
+ n(async ({ path: t, content: n }) => (e.files[Y_(t)] = {
15288
15311
  content: n,
15289
- updatedAt: X_()
15312
+ updatedAt: Z_()
15290
15313
  }, `已写入 ${t}(${n.length} 字符)`), {
15291
15314
  name: "vfs_write",
15292
15315
  description: "写入/覆盖虚拟工作区文件,作为中间工作记忆。",
@@ -15296,7 +15319,7 @@ function Z_(e) {
15296
15319
  })
15297
15320
  }),
15298
15321
  n(async ({ path: t, oldString: n, newString: r }) => {
15299
- let i = J_(t), a = e.files[i];
15322
+ let i = Y_(t), a = e.files[i];
15300
15323
  if (!a) return $({
15301
15324
  code: "NOT_FOUND",
15302
15325
  path: t,
@@ -15326,7 +15349,7 @@ function Z_(e) {
15326
15349
  }
15327
15350
  return e.files[i] = {
15328
15351
  content: a.content.replace(n, r),
15329
- updatedAt: X_()
15352
+ updatedAt: Z_()
15330
15353
  }, `已替换 ${t} 中 1 处。`;
15331
15354
  }, {
15332
15355
  name: "vfs_edit",
@@ -15348,7 +15371,7 @@ function Z_(e) {
15348
15371
  n(async ({ pattern: t }) => {
15349
15372
  let n;
15350
15373
  try {
15351
- n = Y_(t);
15374
+ n = X_(t);
15352
15375
  } catch (e) {
15353
15376
  return $({
15354
15377
  code: "GLOB_INVALID",
@@ -15377,7 +15400,7 @@ function Z_(e) {
15377
15400
  details: { pattern: t }
15378
15401
  });
15379
15402
  }
15380
- let i = n ? [J_(n)] : Object.keys(e.files), a = [];
15403
+ let i = n ? [Y_(n)] : Object.keys(e.files), a = [];
15381
15404
  for (let t of i) {
15382
15405
  let n = e.files[t];
15383
15406
  n && n.content.split("\n").forEach((e, n) => {
@@ -15395,17 +15418,17 @@ function Z_(e) {
15395
15418
  })
15396
15419
  ];
15397
15420
  }
15398
- function Q_(e) {
15421
+ function $_(e) {
15399
15422
  return {
15400
15423
  name: "vfs",
15401
- tools: Z_(e),
15424
+ tools: Q_(e),
15402
15425
  beforeAgent: () => ({ files: e.files })
15403
15426
  };
15404
15427
  }
15405
15428
  //#endregion
15406
15429
  //#region src/core/tools/dataSlotQuery.ts
15407
- var $_ = /[\w$-]/;
15408
- function ev(e) {
15430
+ var ev = /[\w$-]/;
15431
+ function tv(e) {
15409
15432
  let t = [], n = e.trim(), r = +(n[0] === "$");
15410
15433
  for (; r < n.length;) {
15411
15434
  let e = n[r];
@@ -15416,7 +15439,7 @@ function ev(e) {
15416
15439
  continue;
15417
15440
  }
15418
15441
  let e = "";
15419
- for (; r < n.length && $_.test(n[r]);) e += n[r++];
15442
+ for (; r < n.length && ev.test(n[r]);) e += n[r++];
15420
15443
  if (!e) throw Error("JSONPath: .. 后缺属性名");
15421
15444
  t.push({
15422
15445
  type: "descendKey",
@@ -15429,7 +15452,7 @@ function ev(e) {
15429
15452
  continue;
15430
15453
  }
15431
15454
  let e = "";
15432
- for (; r < n.length && $_.test(n[r]);) e += n[r++];
15455
+ for (; r < n.length && ev.test(n[r]);) e += n[r++];
15433
15456
  if (!e) throw Error("JSONPath: . 后缺属性名");
15434
15457
  t.push({
15435
15458
  type: "key",
@@ -15485,7 +15508,7 @@ function ev(e) {
15485
15508
  }
15486
15509
  return t;
15487
15510
  }
15488
- function tv(e) {
15511
+ function nv(e) {
15489
15512
  let t = [], n = 0, r = e.trim();
15490
15513
  for (; n < r.length;) {
15491
15514
  let e = r[n];
@@ -15530,7 +15553,7 @@ function tv(e) {
15530
15553
  }
15531
15554
  return t;
15532
15555
  }
15533
- var nv = class {
15556
+ var rv = class {
15534
15557
  toks;
15535
15558
  item;
15536
15559
  pos = 0;
@@ -15566,12 +15589,12 @@ var nv = class {
15566
15589
  return this.next(), e;
15567
15590
  }
15568
15591
  let e = this.operand(), t = this.peek();
15569
- return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), av(t, e, this.operand())) : rv(e);
15592
+ return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), ov(t, e, this.operand())) : iv(e);
15570
15593
  }
15571
15594
  operand() {
15572
15595
  let e = this.next();
15573
15596
  if (e === void 0) throw Error("过滤表达式:缺操作数");
15574
- if (e.startsWith("@")) return iv(e, this.item);
15597
+ if (e.startsWith("@")) return av(e, this.item);
15575
15598
  if (e[0] === "'" || e[0] === "\"") return e.slice(1, -1);
15576
15599
  if (e === "true") return !0;
15577
15600
  if (e === "false") return !1;
@@ -15581,10 +15604,10 @@ var nv = class {
15581
15604
  throw Error(`过滤表达式:未知操作数 '${e}'`);
15582
15605
  }
15583
15606
  };
15584
- function rv(e) {
15607
+ function iv(e) {
15585
15608
  return !!e && e !== 0 && e !== "" && e !== null;
15586
15609
  }
15587
- function iv(e, t) {
15610
+ function av(e, t) {
15588
15611
  let n = e.split(".").filter((e) => e && e !== "@"), r = t;
15589
15612
  for (let e of n) {
15590
15613
  if (typeof r != "object" || !r) return;
@@ -15592,7 +15615,7 @@ function iv(e, t) {
15592
15615
  }
15593
15616
  return r;
15594
15617
  }
15595
- function av(e, t, n) {
15618
+ function ov(e, t, n) {
15596
15619
  switch (e) {
15597
15620
  case "==": return t === n;
15598
15621
  case "!=": return t !== n;
@@ -15603,47 +15626,47 @@ function av(e, t, n) {
15603
15626
  default: return !1;
15604
15627
  }
15605
15628
  }
15606
- function ov(e, t) {
15607
- return new nv(tv(e), t).parse();
15608
- }
15609
15629
  function sv(e, t) {
15610
- return e ? `${e}.${t}` : String(t);
15630
+ return new rv(nv(e), t).parse();
15611
15631
  }
15612
15632
  function cv(e, t) {
15633
+ return e ? `${e}.${t}` : String(t);
15634
+ }
15635
+ function lv(e, t) {
15613
15636
  let n = [{
15614
15637
  path: "",
15615
15638
  value: e
15616
15639
  }];
15617
- for (let e of ev(t)) {
15640
+ for (let e of tv(t)) {
15618
15641
  let t = [];
15619
15642
  if (e.type === "key") for (let r of n) r.value != null && typeof r.value == "object" && e.key in r.value && t.push({
15620
- path: sv(r.path, e.key),
15643
+ path: cv(r.path, e.key),
15621
15644
  value: r.value[e.key]
15622
15645
  });
15623
15646
  else if (e.type === "index") {
15624
15647
  for (let r of n) if (Array.isArray(r.value)) {
15625
15648
  let n = r.value[e.index];
15626
15649
  e.index >= 0 && e.index < r.value.length && t.push({
15627
- path: sv(r.path, e.index),
15650
+ path: cv(r.path, e.index),
15628
15651
  value: n,
15629
15652
  index: e.index
15630
15653
  });
15631
15654
  }
15632
15655
  } else if (e.type === "wildcard") {
15633
15656
  for (let e of n) if (Array.isArray(e.value)) e.value.forEach((n, r) => t.push({
15634
- path: sv(e.path, r),
15657
+ path: cv(e.path, r),
15635
15658
  value: n,
15636
15659
  index: r
15637
15660
  }));
15638
15661
  else if (e.value != null && typeof e.value == "object") for (let n of Object.keys(e.value)) t.push({
15639
- path: sv(e.path, n),
15662
+ path: cv(e.path, n),
15640
15663
  value: e.value[n]
15641
15664
  });
15642
15665
  } else if (e.type === "descendKey") {
15643
15666
  let r = e.key, i = (e) => {
15644
15667
  if (!(e.value == null || typeof e.value != "object")) for (let n of Object.keys(e.value)) {
15645
15668
  let a = {
15646
- path: sv(e.path, n),
15669
+ path: cv(e.path, n),
15647
15670
  value: e.value[n]
15648
15671
  };
15649
15672
  n === r && t.push(a), i(a);
@@ -15654,7 +15677,7 @@ function cv(e, t) {
15654
15677
  let e = (n) => {
15655
15678
  if (!(n.value == null || typeof n.value != "object")) for (let r of Object.keys(n.value)) {
15656
15679
  let i = {
15657
- path: sv(n.path, r),
15680
+ path: cv(n.path, r),
15658
15681
  value: n.value[r]
15659
15682
  };
15660
15683
  t.push(i), e(i);
@@ -15663,16 +15686,16 @@ function cv(e, t) {
15663
15686
  for (let t of n) e(t);
15664
15687
  } else if (e.type === "filter") {
15665
15688
  for (let r of n) if (Array.isArray(r.value)) r.value.forEach((n, i) => {
15666
- ov(e.filter, n) && t.push({
15667
- path: sv(r.path, i),
15689
+ sv(e.filter, n) && t.push({
15690
+ path: cv(r.path, i),
15668
15691
  value: n,
15669
15692
  index: i
15670
15693
  });
15671
15694
  });
15672
15695
  else if (r.value != null && typeof r.value == "object") for (let n of Object.keys(r.value)) {
15673
15696
  let i = r.value[n];
15674
- ov(e.filter, i) && t.push({
15675
- path: sv(r.path, n),
15697
+ sv(e.filter, i) && t.push({
15698
+ path: cv(r.path, n),
15676
15699
  value: i
15677
15700
  });
15678
15701
  }
@@ -15681,7 +15704,7 @@ function cv(e, t) {
15681
15704
  }
15682
15705
  return n;
15683
15706
  }
15684
- function lv(e, t) {
15707
+ function uv(e, t) {
15685
15708
  let n = e.length, r = t.length;
15686
15709
  if (!n) return r;
15687
15710
  if (!r) return n;
@@ -15697,7 +15720,7 @@ function lv(e, t) {
15697
15720
  }
15698
15721
  return i[r];
15699
15722
  }
15700
- function uv(e, t, n = {}) {
15723
+ function dv(e, t, n = {}) {
15701
15724
  let r = n.mode || "substring", i = n.limit ?? 50, a = n.matchKey !== !1, o = [], s = null;
15702
15725
  if (r === "regex") try {
15703
15726
  s = new RegExp(t, "i");
@@ -15707,11 +15730,11 @@ function uv(e, t, n = {}) {
15707
15730
  let c = (e, l, u) => {
15708
15731
  if (o.length >= i || e == null) return;
15709
15732
  if (typeof e == "object") {
15710
- if (Array.isArray(e)) e.forEach((e, t) => c(e, sv(l, t), String(t)));
15711
- else for (let t of Object.keys(e)) c(e[t], sv(l, t), t);
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);
15712
15735
  return;
15713
15736
  }
15714
- let d = String(e), f = dv(d, t, r, n.fuzzyThreshold ?? 2, s);
15737
+ let d = String(e), f = fv(d, t, r, n.fuzzyThreshold ?? 2, s);
15715
15738
  if (f) {
15716
15739
  o.push({
15717
15740
  path: l,
@@ -15722,7 +15745,7 @@ function uv(e, t, n = {}) {
15722
15745
  return;
15723
15746
  }
15724
15747
  if (a && u) {
15725
- let e = dv(u, t, r, n.fuzzyThreshold ?? 2, s);
15748
+ let e = fv(u, t, r, n.fuzzyThreshold ?? 2, s);
15726
15749
  e && o.push({
15727
15750
  path: l,
15728
15751
  key: u,
@@ -15733,18 +15756,18 @@ function uv(e, t, n = {}) {
15733
15756
  };
15734
15757
  return c(e, ""), o;
15735
15758
  }
15736
- function dv(e, t, n, r, i) {
15759
+ function fv(e, t, n, r, i) {
15737
15760
  let a = e.toLowerCase(), o = t.toLowerCase();
15738
15761
  if (n === "substring") return a.includes(o) ? 1 : null;
15739
15762
  if (n === "regex") return i && i.test(e) ? 1 : null;
15740
15763
  if (n === "fuzzy") {
15741
15764
  if (a.includes(o)) return 2;
15742
- let e = lv(a, o);
15765
+ let e = uv(a, o);
15743
15766
  return e <= r ? r - e + 1 : null;
15744
15767
  }
15745
15768
  return null;
15746
15769
  }
15747
- var fv = [
15770
+ var pv = [
15748
15771
  "self.fetch = () => { throw new Error('fetch 已被沙箱禁用') }",
15749
15772
  "self.XMLHttpRequest = function(){ throw new Error('XMLHttpRequest 已被沙箱禁用') }",
15750
15773
  "self.importScripts = () => { throw new Error('importScripts 已被沙箱禁用') }",
@@ -15757,7 +15780,7 @@ var fv = [
15757
15780
  "try { self.BroadcastChannel = undefined } catch {}",
15758
15781
  "if (self.navigator && self.navigator.sendBeacon) self.navigator.sendBeacon = () => { throw new Error('sendBeacon 已被沙箱禁用') }"
15759
15782
  ].join("\n");
15760
- function pv(e, t, n = 3e3) {
15783
+ function mv(e, t, n = 3e3) {
15761
15784
  return new Promise((r) => {
15762
15785
  let i = Date.now(), a = !1, o = (e) => {
15763
15786
  if (!a) {
@@ -15770,7 +15793,7 @@ function pv(e, t, n = 3e3) {
15770
15793
  elapsedMs: Date.now() - i
15771
15794
  });
15772
15795
  }
15773
- }, 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;
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;
15774
15797
  try {
15775
15798
  let e = new Blob([s], { type: "application/javascript" });
15776
15799
  c = URL.createObjectURL(e), l = new Worker(c);
@@ -15804,20 +15827,21 @@ function pv(e, t, n = 3e3) {
15804
15827
  });
15805
15828
  }
15806
15829
  //#endregion
15807
- //#region src/core/tools/dataSlotOps.ts
15808
- var mv = /* @__PURE__ */ new Set([
15830
+ //#region src/core/tools/dataOps.ts
15831
+ var hv = /* @__PURE__ */ new Set([
15809
15832
  "__proto__",
15810
15833
  "constructor",
15811
15834
  "prototype"
15812
15835
  ]);
15813
- function hv(e) {
15814
- return e.split(".").some((e) => mv.has(e));
15815
- }
15816
- function gv(e, t) {
15817
- if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t)) mv.has(n) || (e[n] = t[n]);
15836
+ function gv(e) {
15837
+ return e.split(".").some((e) => hv.has(e));
15818
15838
  }
15819
15839
  function _v(e, t) {
15820
- if (hv(t)) return;
15840
+ if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t)) hv.has(n) || (e[n] = t[n]);
15841
+ }
15842
+ function vv(e, t) {
15843
+ if (!t) return e;
15844
+ if (gv(t)) return;
15821
15845
  let n = t.split("."), r = e;
15822
15846
  for (let e of n) {
15823
15847
  if (r == null) return;
@@ -15825,8 +15849,8 @@ function _v(e, t) {
15825
15849
  }
15826
15850
  return r;
15827
15851
  }
15828
- function vv(e, t, n) {
15829
- if (hv(t)) return;
15852
+ function yv(e, t, n) {
15853
+ if (!t || gv(t)) return;
15830
15854
  let r = t.split("."), i = e;
15831
15855
  for (let e = 0; e < r.length - 1; e++) {
15832
15856
  let t = r[e];
@@ -15834,8 +15858,8 @@ function vv(e, t, n) {
15834
15858
  }
15835
15859
  i[r[r.length - 1]] = n;
15836
15860
  }
15837
- function yv(e, t) {
15838
- if (hv(t)) return !1;
15861
+ function bv(e, t) {
15862
+ if (!t || gv(t)) return !1;
15839
15863
  let n = t.split("."), r = e;
15840
15864
  for (let e = 0; e < n.length - 1; e++) {
15841
15865
  if (r == null) return !1;
@@ -15844,10 +15868,10 @@ function yv(e, t) {
15844
15868
  let i = n[n.length - 1];
15845
15869
  return r == null || !(i in r) ? !1 : (delete r[i], !0);
15846
15870
  }
15847
- function bv(e) {
15871
+ function xv(e) {
15848
15872
  return e === void 0 ? void 0 : JSON.parse(JSON.stringify(e));
15849
15873
  }
15850
- function xv(e, t = Infinity) {
15874
+ function Sv(e, t = Infinity) {
15851
15875
  let n = /* @__PURE__ */ new WeakSet(), r;
15852
15876
  try {
15853
15877
  r = JSON.stringify(e, (e, t) => {
@@ -15866,35 +15890,34 @@ function xv(e, t = Infinity) {
15866
15890
  }
15867
15891
  return r.length > t && (r = r.slice(0, t) + `\n…[已截断,原长度 ${r.length}]`), r;
15868
15892
  }
15869
- function Sv(e) {
15870
- let t = xv(e), n = 5381;
15893
+ function Cv(e) {
15894
+ let t = Sv(e), n = 5381;
15871
15895
  for (let e = 0; e < t.length; e++) n = (n << 5) + n + t.charCodeAt(e) >>> 0;
15872
15896
  return n.toString(36);
15873
15897
  }
15874
- function Cv(e, t, n, r) {
15875
- if (t === "set") return n ? (vv(e, n, r), null) : "set 操作需要 jsonPath(整体替换请用 set_data_slot)";
15876
- if (t === "remove") return n ? (yv(e, n), null) : "remove 操作需要 jsonPath";
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";
15877
15901
  if (t === "merge") {
15878
- let t = n ? _v(e, n) : e;
15879
- return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (gv(t, r), null);
15902
+ let t = n ? vv(e, n) : e;
15903
+ return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (_v(t, r), null);
15880
15904
  }
15881
- let i = n ? _v(e, n) : e;
15905
+ let i = n ? vv(e, n) : e;
15882
15906
  return Array.isArray(i) ? (Array.isArray(r) ? i.push(...r) : i.push(r), null) : `append 目标${n ? `(${n})` : "(根)"}不是数组`;
15883
15907
  }
15884
- function wv(e, t, n, r) {
15885
- if (t === "set") vv(window, `${e}.${n}`, r);
15886
- else if (t === "remove") yv(window, `${e}.${n}`);
15887
- else if (t === "merge") gv(n ? _v(window, `${e}.${n}`) : _v(window, e), r);
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);
15888
15912
  else {
15889
- let t = n ? _v(window, `${e}.${n}`) : _v(window, e);
15913
+ let t = n ? vv(e, n) : e;
15890
15914
  Array.isArray(r) ? t.push(...r) : t.push(r);
15891
15915
  }
15892
15916
  }
15893
- function Tv(e, t) {
15894
- let n = _v(window, e);
15895
- typeof n == "object" && n ? Ev(n, t) : vv(window, e, t);
15896
- }
15897
15917
  function Ev(e, t) {
15918
+ typeof e == "object" && e && Dv(e, t);
15919
+ }
15920
+ function Dv(e, t) {
15898
15921
  if (Array.isArray(e)) {
15899
15922
  e.length = 0, Array.isArray(t) && e.push(...t);
15900
15923
  return;
@@ -15903,424 +15926,290 @@ function Ev(e, t) {
15903
15926
  for (let t of Object.keys(e)) t in n || delete e[t];
15904
15927
  for (let t of Object.keys(n)) e[t] = n[t];
15905
15928
  }
15906
- function Dv(e, r = {}) {
15907
- let i = /* @__PURE__ */ new Map();
15908
- for (let t of e) i.set(t.path, t);
15909
- let a = /* @__PURE__ */ new Map(), o = r.maxSnapshots ?? 20, s = /* @__PURE__ */ new Map(), c = r.autoLock !== !1, l = {
15910
- add: (e) => {
15911
- i.set(e.path, e);
15912
- },
15913
- remove: (e) => {
15914
- let t = i.delete(e);
15915
- return t && a.delete(e), t;
15929
+ var Ov = /* @__PURE__ */ new Set([
15930
+ "describe_data",
15931
+ "get_data",
15932
+ "set_data",
15933
+ "edit_data",
15934
+ "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));
15938
+ }
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 = {
15941
+ get: () => ({
15942
+ schema: i,
15943
+ bind: a,
15944
+ description: o
15945
+ }),
15946
+ set: (e) => {
15947
+ i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s.length = 0, l = void 0;
15916
15948
  },
15917
- list: () => [...i.values()],
15918
- has: (e) => i.has(e)
15919
- }, u = (e) => {
15949
+ update: (e) => {
15950
+ a = e, s.length = 0, l = void 0;
15951
+ }
15952
+ }, f = (e) => {
15920
15953
  r.onAudit?.(e);
15921
15954
  };
15922
- function d() {
15923
- let e = [...i.keys()];
15924
- if (!e.length) return "";
15925
- let t = e.join(", ");
15926
- return e.length > 8 || t.length > 240 ? `\n(当前可操作属性共 ${e.length} 项,用 list_data_slots 查看)` : `\n(当前可操作 path: ${t})`;
15927
- }
15928
- let f = (r.whitelist ?? !0) === !1;
15929
- function p(e) {
15930
- return r.allowRawRead ? !0 : [...i.keys()].some((t) => e === t || e.startsWith(t + ".") || f && t.startsWith(e + "."));
15931
- }
15932
- function m(e, t, n) {
15933
- let r = bv(_v(window, e)), i = a.get(e) || [], s = i.length ? i[i.length - 1].id + 1 : 1;
15934
- for (i.push({
15935
- id: s,
15955
+ function p(e, t) {
15956
+ let n = xv(a), r = s.length ? s[s.length - 1].id + 1 : 1;
15957
+ for (s.push({
15958
+ id: r,
15936
15959
  ts: Date.now(),
15937
- op: t,
15938
- label: n,
15939
- value: r
15940
- }); i.length > o;) i.shift();
15941
- return a.set(e, i), s;
15942
- }
15943
- async function h(e, t, n, i) {
15944
- if (!n || n === "") return null;
15945
- let o = _v(window, e), s = Sv(o);
15946
- if (s === n) return null;
15960
+ op: e,
15961
+ label: t,
15962
+ value: n
15963
+ }); s.length > c;) s.shift();
15964
+ return r;
15965
+ }
15966
+ async function m(e, t, n) {
15967
+ if (!t || t === "") return null;
15968
+ let i = Cv(a);
15969
+ if (i === t) return null;
15947
15970
  if (!r.onConflict) return $({
15948
15971
  code: "VERSION_CONFLICT",
15949
- path: e,
15950
- message: `乐观锁冲突:expectedHash=${n} 但当前 hash=${s}。属性 "${e}" 在你 get 之后已被修改(外部代码/其他 agent/用户手动改)。`,
15951
- hint: `重新 get_data_slot("${e}") 拿最新值与 hash,基于最新值修改后再写入(传新的 expectedHash)。当前值:${xv(o, 400)}`
15972
+ message: `乐观锁冲突:expectedHash=${t} 但当前 hash=${i}。主数据在你 read 之后已被修改(外部代码/其他 agent/用户手动改)。`,
15973
+ hint: `重新 read 拿最新值与 hash,基于最新值修改后再写入(传新的 expectedHash)。当前值:${Sv(a, 400)}`
15952
15974
  });
15953
- let c = await r.onConflict({
15954
- path: e,
15955
- op: t,
15956
- agentValue: i,
15957
- currentValue: o,
15958
- currentHash: s,
15959
- expectedHash: n,
15975
+ let o = await r.onConflict({
15976
+ op: e,
15977
+ agentValue: n,
15978
+ currentValue: a,
15979
+ currentHash: i,
15980
+ expectedHash: t,
15960
15981
  snapshotId: 0
15961
15982
  });
15962
- if (c.action === "keep_external") return `已保留外部修改(未写入)。当前值:${xv(o, 400)} (hash=${s})。请重新 get_data_slot("${e}") 拿最新值与 hash 再改。`;
15963
- if (c.action === "restore") {
15964
- let t = a.get(e) || [];
15965
- if (!t.length) return `无历史快照可回退(本次为首次操作)。当前值:${xv(o, 400)} (hash=${s})。请重新 get 再改或选「强制覆盖」。`;
15966
- let n = t[t.length - 1];
15967
- Tv(e, bv(n.value));
15968
- let r = _v(window, e);
15969
- return `已回退 ${e} 到历史快照 #${n.id}[${n.op}]。当前值:${xv(r, 400)} (hash=${Sv(r)})。请基于回退后的值重写或停止。`;
15983
+ if (o.action === "keep_external") return `已保留外部修改(未写入)。当前值:${Sv(a, 400)} (hash=${i})。请重新 read 拿最新值与 hash 再改。`;
15984
+ 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)})。请基于回退后的值重写或停止。`;
15970
15988
  }
15971
15989
  return null;
15972
15990
  }
15973
- let g = n(async () => {
15974
- if (!i.size) return "当前没有已注册的可操作 数据槽。";
15975
- let e = [...i.values()].map((e) => `- ${e.path}: ${e.description}`);
15976
- return `可操作的 数据槽(共 ${i.size} 项):\n${e.join("\n")}`;
15977
- }, {
15978
- name: "list_data_slots",
15979
- description: "列出所有已注册、可操作的 数据槽(path + 说明)。操作数据槽前先调用此工具了解可用范围。",
15980
- schema: t.object({})
15981
- }), _ = n(async ({ path: e }) => {
15982
- let t = i.get(e);
15983
- return t ? [
15984
- `路径: ${t.path}`,
15985
- `说明: ${t.description}`,
15986
- "格式: 写入值需为 JSON,且通过注册时声明的 schema 校验(校验失败时 set_data_slot/edit_data_slot 会返回结构化错误,含具体字段与期望类型)。"
15987
- ].join("\n") : $({
15988
- code: "NOT_REGISTERED",
15989
- path: e,
15990
- message: `属性 "${e}" 未注册`,
15991
- hint: " list_data_slots 查看可用属性"
15992
- });
15993
- }, {
15994
- name: "describe_data_slot",
15995
- description: "获取单个已注册 数据槽的说明与格式要求。",
15996
- schema: t.object({ path: t.string().describe("属性路径,如 app.theme") })
15997
- }), v = n(async ({ path: e }) => {
15998
- if (!p(e)) return $({
15999
- code: "NOT_REGISTERED",
16000
- path: e,
16001
- message: `属性 "${e}" 不可读取(未注册,且非已注册路径的后代)`,
16002
- hint: "用 list_data_slots 查看可操作字段;字段白名单读模式下未注册的祖先(整体大 JSON)不暴露,需读其声明子路径"
16003
- });
16004
- let t = _v(window, e);
16005
- if (t === void 0) return `${e} = (undefined)`;
16006
- let n = Sv(t);
16007
- return s.set(e, n), `${e} = ${xv(t)} (hash=${n})`;
16008
- }, {
16009
- name: "get_data_slot",
16010
- description: "读取一个已注册 数据槽的当前值(安全序列化:函数/DOM/循环引用做摘要;大结果由系统自动外存,提示用 vfs_read 回读)。返回含 hash(乐观锁):改属性前先 get 拿 hash,写入时(set/edit/delete)传 expectedHash 回传,系统对比当前 hash 防\"基于过期值覆盖\"(外部代码/其他 agent/用户手动改过会 CONFLICT,需重新 get 再改)。字段白名单读模式(默认)下仅可读注册 path 自身/后代;未注册祖先(整体大 JSON)不可读,避免大 JSON 拉进上下文。",
16011
- schema: t.object({ path: t.string().describe("已注册的属性路径或其后代") })
16012
- }), y = n(async ({ path: e, value: t, expectedHash: n }) => {
16013
- let r = i.get(e);
16014
- if (!r) return $({
16015
- code: "NOT_REGISTERED",
16016
- path: e,
16017
- message: `属性 "${e}" 未在注册表中声明,不可写`,
16018
- hint: "用 list_data_slots 查看可用属性;集成方需先在 dataSlots 声明该 path"
16019
- });
16020
- let a = await h(e, "set", n || (c ? s.get(e) : void 0));
16021
- if (a !== null) return a;
16022
- let o;
16023
- if (typeof t == "string") try {
16024
- o = JSON.parse(t);
16025
- } catch (n) {
16026
- return U_(e, t, n);
16027
- }
16028
- else o = t;
16029
- let l = r.schema.safeParse(o);
16030
- if (!l.success) return H_(e, l.error.issues);
16031
- m(e, "set");
16032
- let f = _v(window, e);
16033
- return typeof f == "object" && f && l.data !== null && typeof l.data == "object" ? Ev(f, l.data) : vv(window, e, l.data), u({
16034
- op: "set",
16035
- path: e,
16036
- value: l.data,
16037
- timestamp: Date.now()
16038
- }), `已设置 ${e} = ${xv(l.data, 600)} (新 hash=${Sv(_v(window, e))})${d()}`;
16039
- }, {
16040
- name: "set_data_slot",
16041
- description: "设置一个已注册 数据槽的值(整体替换)。仅能操作注册表内声明的属性;value 为 JSON 对象(或 JSON 字符串),需通过该属性声明的 schema 校验。校验失败会返回错误而非写入。expectedHash(可选):改前 get_data_slot 返回的 hash,传入则启用乐观锁;不传时系统自动用你最后一次 get 读到的 hash 比对(autoLock,默认开)——若属性已被改过(外部代码/其他 agent/用户手动)则返回 VERSION_CONFLICT 不写入,需重新 get 再改,防\"基于过期值覆盖\"。大对象/数组强烈建议改用 edit_data_slot 增量 patch。",
16042
- schema: t.object({
16043
- path: t.string().describe("已注册的属性路径"),
16044
- value: t.unknown().describe("JSON 对象(推荐直传,如 {title:\"x\"}),或 JSON 字符串;需符合该属性 schema"),
16045
- expectedHash: t.string().optional().describe("乐观锁:改前 get_data_slot 返回的 hash;传入则校验,不一致拒绝写入防覆盖。不传则自动用你最后 get 到的 hash(autoLock)")
16046
- })
16047
- }), b = n(async ({ path: e, op: t, jsonPath: n, value: r, expectedHash: a }) => {
16048
- let o = i.get(e);
16049
- if (!o) return $({
16050
- code: "NOT_REGISTERED",
16051
- path: e,
16052
- message: `属性 "${e}" 未在注册表中声明,不可写`,
16053
- hint: "用 list_data_slots 查看可用属性"
16054
- });
16055
- let l = n || "";
16056
- if (hv(l)) return $({
16057
- code: "PATH_UNSAFE",
16058
- path: e,
16059
- message: `jsonPath "${l}" 含非法段(__proto__/constructor/prototype)`,
16060
- hint: "使用正常的属性路径,如 components.0.text(数组索引用数字)"
16061
- });
16062
- let f = _v(window, e), p = await h(e, "edit", a || (c ? s.get(e) : void 0));
16063
- if (p !== null) return p;
16064
- if (typeof f != "object" || !f) return $({
16065
- code: "NOT_OBJECT",
16066
- path: e,
16067
- message: `edit 仅适用于对象/数组属性,"${e}" 当前是 ${f === void 0 ? "undefined" : typeof f}`,
16068
- hint: "叶子属性(原始类型)请用 set_data_slot 整体设置"
16069
- });
16070
- let g;
16071
- if (t !== "remove") {
16072
- if (r === void 0 || r === "") return $({
16073
- code: "MISSING_VALUE",
16074
- path: e,
16075
- message: `${t} 操作需要 value(JSON 对象或字符串)`,
16076
- hint: `op 为 ${t} 时 value 必填;若想删除请用 op:'remove'`
16077
- });
16078
- if (typeof r == "string") try {
16079
- g = JSON.parse(r);
15991
+ let h = [
15992
+ n(async () => [`说明: ${o}`, "格式: 写入值需为 JSON,且通过声明的 schema 校验(校验失败时 set_data/edit_data 会返回结构化错误,含具体字段与期望类型)。"].join("\n"), {
15993
+ name: "describe_data",
15994
+ description: "获取主数据的说明与格式要求。",
15995
+ schema: t.object({})
15996
+ }),
15997
+ 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})`;
16000
+ }, {
16001
+ name: "get_data",
16002
+ description: "读取主数据的当前值(安全序列化:函数/DOM/循环引用做摘要;大结果由系统自动外存,提示用 vfs_read 回读)。返回含 hash(乐观锁):改前先 read/get 拿 hash,写入时传 expectedHash 回传,系统对比当前 hash 防\"基于过期值覆盖\"。jsonPath 可选:读整个主数据不传,读子路径传(如 components.0.text)。",
16003
+ schema: t.object({ jsonPath: t.string().optional().describe("相对主数据根的点号路径(如 components.0.text);不传则读整个主数据") })
16004
+ }),
16005
+ n(async ({ value: e, expectedHash: t }) => {
16006
+ let n = await m("set", t || (u ? l : void 0));
16007
+ if (n !== null) return n;
16008
+ let r;
16009
+ if (typeof e == "string") try {
16010
+ r = JSON.parse(e);
16080
16011
  } catch (t) {
16081
- return U_(e, r, t);
16082
- }
16083
- else g = r;
16084
- }
16085
- let _ = bv(f), v = Cv(_, t, l, g);
16086
- if (v) return $({
16087
- code: "PATCH_FAILED",
16088
- path: e,
16089
- message: v,
16090
- hint: "检查 op 与目标类型:merge 需目标为对象,append 需目标为数组;jsonPath 指向需存在"
16091
- });
16092
- let y = o.schema.safeParse(_);
16093
- return y.success ? (m(e, "edit"), wv(e, t, l, g), u({
16094
- op: "edit",
16095
- path: e,
16096
- detail: `${t}${l ? "@" + l : ""}`,
16097
- value: g,
16098
- timestamp: Date.now()
16099
- }), `已 edit ${e}(${t}${l ? " @ " + l : ""})。当前值:${xv(_v(window, e), 600)} (新 hash=${Sv(_v(window, e))})${d()}`) : H_(e, y.error.issues);
16100
- }, {
16101
- name: "edit_data_slot",
16102
- description: "增量编辑一个已注册的「对象/数组」数据槽,只发改动的 patch,无需重传整个大对象。op:set(在 jsonPath 设值)、remove(删 jsonPath)、merge(把 value 合并到 jsonPath 指向的对象,默认根)、append(把 value 追加到 jsonPath 指向的数组,默认根)。jsonPath 为相对属性根的点号路径(数组索引用数字,如 components.0.text);value 为 JSON 对象(推荐直传)或 JSON 字符串。整体仍经 schema 校验,失败不写入。expectedHash(可选):改前 get_data_slot 返回的 hash;不传时自动用你最后 get 到的 hash(autoLock,默认开)防\"基于过期值覆盖\"。",
16103
- schema: t.object({
16104
- path: t.string().describe("已注册的对象/数组属性路径"),
16105
- op: t.enum([
16106
- "set",
16107
- "remove",
16108
- "merge",
16109
- "append"
16110
- ]),
16111
- jsonPath: t.string().optional().describe("相对属性根的点号路径(数组索引用数字,如 components.0.text)。set/remove 必填;merge/append 不填则作用于根"),
16112
- value: t.unknown().optional().describe("JSON 对象(推荐直传,如 {text:\"x\"})或 JSON 字符串(set/merge/append 必填)"),
16113
- expectedHash: t.string().optional().describe("乐观锁:改前 get_data_slot 返回的 hash;传入则校验,不一致拒绝写入防覆盖。不传则自动用你最后 get 到的 hash(autoLock)")
16114
- })
16115
- }), x = n(async ({ path: e, expectedHash: t }) => {
16116
- if (!i.has(e)) return $({
16117
- code: "NOT_REGISTERED",
16118
- path: e,
16119
- message: `属性 "${e}" 未在注册表中声明,不可删除`,
16120
- hint: "用 list_data_slots 查看可用属性"
16121
- });
16122
- let n = await h(e, "delete", t || (c ? s.get(e) : void 0));
16123
- if (n !== null) return n;
16124
- m(e, "delete");
16125
- let r = yv(window, e);
16126
- return u({
16127
- op: "delete",
16128
- path: e,
16129
- timestamp: Date.now()
16130
- }), r ? `已删除 ${e}${d()}` : `${e} 不存在(无需删除)${d()}`;
16131
- }, {
16132
- name: "delete_data_slot",
16133
- description: "删除一个已注册 数据槽。expectedHash(可选):改前 get_data_slot 返回的 hash;不传时自动用你最后 get 到的 hash(autoLock,默认开)防\"基于过期值删除\"。",
16134
- schema: t.object({
16135
- path: t.string().describe("已注册的属性路径"),
16136
- expectedHash: t.string().optional().describe("乐观锁:改前 get_data_slot 返回的 hash;传入则校验,不一致拒绝删除防覆盖。不传则自动用你最后 get 到的 hash(autoLock)")
16137
- })
16138
- }), S = n(async ({ path: e, label: t }) => i.has(e) ? `已为 ${e} 创建快照 #${m(e, "manual", t)}${t ? `(${t})` : ""}。可用 list_data_snapshots 查看、restore_data_snapshot 回退。` : $({
16139
- code: "NOT_REGISTERED",
16140
- path: e,
16141
- message: `属性 "${e}" 未注册,无法打快照`,
16142
- hint: "用 list_data_slots 查看可用属性"
16143
- }), {
16144
- name: "snapshot_data_slot",
16145
- description: "为已注册 数据槽手动创建一个命名快照(检查点)。set/edit/delete 也会自动存快照。",
16146
- schema: t.object({
16147
- path: t.string().describe("已注册的属性路径"),
16148
- label: t.string().optional().describe("可选的快照标签,便于识别")
16149
- })
16150
- }), C = n(async ({ path: e }) => {
16151
- let t = e ? [e] : [...i.keys()];
16152
- if (e && !i.has(e)) return $({
16153
- code: "NOT_REGISTERED",
16154
- path: e,
16155
- message: `属性 "${e}" 未注册`,
16156
- hint: "用 list_data_slots 查看可用属性"
16157
- });
16158
- let n = [];
16159
- for (let r of t) {
16160
- let t = a.get(r) || [];
16161
- if (!t.length) {
16162
- e && n.push(`${r}: 无快照`);
16163
- continue;
16164
- }
16165
- n.push(`${r}(共 ${t.length} 条):`);
16166
- for (let e of t) {
16167
- let t = JSON.stringify(e.value ?? "").length, r = new Date(e.ts).toLocaleTimeString("zh-CN", { hour12: !1 });
16168
- n.push(` #${e.id} [${e.op}]${e.label ? ` "${e.label}"` : ""} ${r} 修改前≈${t}字符`);
16012
+ return W_("", e, t);
16169
16013
  }
16170
- }
16171
- return n.join("\n") || "无快照。set/edit/delete 会自动存快照,也可用 snapshot_data_slot 手动创建检查点。";
16172
- }, {
16173
- name: "list_data_snapshots",
16174
- description: "列出 数据槽的快照时间线(序号、操作类型、标签、大小)。不传 path 列出所有属性。",
16175
- schema: t.object({ path: t.string().optional().describe("限定单个属性,不传则列出全部") })
16176
- }), w = n(async ({ path: e, id: t }) => {
16177
- let n = i.get(e);
16178
- if (!n) return $({
16179
- code: "NOT_REGISTERED",
16180
- path: e,
16181
- message: `属性 "${e}" 未注册`,
16182
- hint: " list_data_slots 查看可用属性"
16183
- });
16184
- let r = a.get(e) || [];
16185
- if (!r.length) return $({
16186
- code: "NO_SNAPSHOT",
16187
- path: e,
16188
- message: `"${e}" 无快照可回退`,
16189
- hint: "set/edit/delete 会自动存快照;也可先 snapshot_data_slot 手动创建检查点"
16190
- });
16191
- let o = t === void 0 ? r[r.length - 1] : r.find((e) => e.id === t);
16192
- if (!o) return $({
16193
- code: "SNAPSHOT_NOT_FOUND",
16194
- path: e,
16195
- message: `未找到快照 #${t}`,
16196
- hint: " list_data_snapshots 查看可用快照序号"
16197
- });
16198
- let s = n.schema.safeParse(o.value);
16199
- return s.success ? (Tv(e, bv(o.value)), u({
16200
- op: "restore",
16201
- path: e,
16202
- detail: `#${o.id}`,
16203
- timestamp: Date.now()
16204
- }), `已回退 ${e} 到快照 #${o.id}[${o.op}]${o.label ? `(${o.label})` : ""}。`) : $({
16205
- code: "SNAPSHOT_SCHEMA_INVALID",
16206
- path: e,
16207
- message: `快照 #${o.id} 的值不符合当前 schema,无法回退`,
16208
- hint: "schema 可能已变更;该快照已过期,选其他快照或重新设置",
16209
- details: V_(s.error.issues)
16210
- });
16211
- }, {
16212
- name: "restore_data_snapshot",
16213
- description: "把已注册 数据槽回退到某个快照(就地还原,保留响应式)。不传 id 则回退最近一次(快速回退)。可用 list_data_snapshots 查看快照列表。",
16214
- schema: t.object({
16215
- path: t.string().describe("已注册的属性路径"),
16216
- id: t.number().int().optional().describe("指定快照序号;不传则回退最近一次")
16217
- })
16218
- }), T = [
16219
- g,
16220
- _,
16221
- v,
16222
- n(async ({ paths: e }) => {
16223
- let t = [];
16224
- for (let n of e) {
16225
- if (!p(n)) {
16226
- t.push(`- ${n} = ERROR: ${$({
16227
- code: "NOT_REGISTERED",
16228
- path: n,
16229
- message: "不可读取(未注册,且非已注册路径的后代)",
16230
- hint: "用 list_data_slots 查看可操作字段"
16231
- })}`);
16232
- continue;
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({
16017
+ op: "set",
16018
+ value: o.data,
16019
+ timestamp: Date.now()
16020
+ }), l = Cv(a), `已设置主数据 = ${Sv(o.data, 600)} (新 hash=${Cv(a)})`) : U_("", o.error.issues);
16021
+ }, {
16022
+ name: "set_data",
16023
+ description: "设置主数据的值(整体替换)。value 为 JSON 对象(或 JSON 字符串),需通过 schema 校验。校验失败会返回错误而非写入。expectedHash(可选):改前 read/get 返回的 hash,传入则启用乐观锁;不传时系统自动用你最后一次读到的 hash 比对(autoLock,默认开)。大对象/数组强烈建议改用 edit_data 增量 patch。",
16024
+ schema: t.object({
16025
+ value: t.unknown().describe("JSON 对象(推荐直传,如 {title:\"x\"}),或 JSON 字符串;需符合 schema"),
16026
+ expectedHash: t.string().optional().describe("乐观锁:改前 read/get 返回的 hash;传入则校验,不一致拒绝写入防覆盖。不传则自动用你最后读到的 hash(autoLock)")
16027
+ })
16028
+ }),
16029
+ n(async ({ op: e, jsonPath: t, value: n, expectedHash: r }) => {
16030
+ let o = t || "";
16031
+ if (gv(o)) return $({
16032
+ code: "PATH_UNSAFE",
16033
+ message: `jsonPath "${o}" 含非法段(__proto__/constructor/prototype)`,
16034
+ hint: "使用正常的属性路径,如 components.0.text(数组索引用数字)"
16035
+ });
16036
+ let s = await m("edit", r || (u ? l : void 0));
16037
+ if (s !== null) return s;
16038
+ if (typeof a != "object" || !a) return $({
16039
+ code: "NOT_OBJECT",
16040
+ message: `edit 仅适用于对象/数组主数据,当前是 ${a === void 0 ? "undefined" : typeof a}`,
16041
+ hint: "叶子(原始类型)请用 set_data 整体设置"
16042
+ });
16043
+ let c;
16044
+ if (e !== "remove") {
16045
+ if (n === void 0 || n === "") return $({
16046
+ code: "MISSING_VALUE",
16047
+ message: `${e} 操作需要 value`,
16048
+ hint: `op ${e} value 必填;删除请用 op:'remove'`
16049
+ });
16050
+ if (typeof n == "string") try {
16051
+ c = JSON.parse(n);
16052
+ } catch (e) {
16053
+ return W_("", n, e);
16233
16054
  }
16234
- let e = _v(window, n);
16235
- t.push(`- ${n} = ${e === void 0 ? "(undefined)" : xv(e)}`);
16055
+ else c = n;
16236
16056
  }
16237
- return t.join("\n");
16057
+ let d = xv(a), h = wv(d, e, o, c);
16058
+ if (h) return $({
16059
+ code: "PATCH_FAILED",
16060
+ message: h,
16061
+ hint: "检查 op 与目标类型:merge 需对象,append 需数组;jsonPath 指向需存在"
16062
+ });
16063
+ let g = i.safeParse(d);
16064
+ return g.success ? (p("edit"), Tv(a, e, o, c), f({
16065
+ op: "edit",
16066
+ detail: `${e}${o ? "@" + o : ""}`,
16067
+ value: c,
16068
+ timestamp: Date.now()
16069
+ }), l = Cv(a), `已 edit 主数据(${e}${o ? " @ " + o : ""})。当前值:${Sv(a, 600)} (新 hash=${Cv(a)})`) : U_("", g.error.issues);
16238
16070
  }, {
16239
- name: "get_slot_paths",
16240
- description: "批量按路径读取 数据槽的局部或多个字段(避免对大 JSON 整体读取)。paths 支持注册属性的任意后代路径( page.components.0.text)、自身。字段白名单读模式(默认)下未注册祖先不可读。逐行返回 path = value;单个值过大仍由系统自动外存 vfs。",
16241
- schema: t.object({ paths: t.array(t.string().describe("路径,如 page.components.0.text")).min(1).max(20) })
16071
+ name: "edit_data",
16072
+ 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,默认开)防\"基于过期值覆盖\"。",
16073
+ schema: t.object({
16074
+ op: t.enum([
16075
+ "set",
16076
+ "remove",
16077
+ "merge",
16078
+ "append"
16079
+ ]),
16080
+ jsonPath: t.string().optional().describe("相对主数据根的点号路径(如 components.0.text)。set/remove 必填;merge/append 不填则作用于根"),
16081
+ value: t.unknown().optional().describe("JSON 对象(推荐直传,如 {text:\"x\"})或 JSON 字符串(set/merge/append 必填)"),
16082
+ expectedHash: t.string().optional().describe("乐观锁:改前 read/get 返回的 hash;传入则校验,不一致拒绝写入防覆盖。不传则自动用你最后读到的 hash(autoLock)")
16083
+ })
16242
16084
  }),
16243
- y,
16244
- b,
16245
- x,
16246
- S,
16247
- C,
16248
- w,
16249
- n(async ({ path: e, expr: t, limit: n }) => {
16250
- if (!i.get(e)) return $({
16251
- code: "NOT_REGISTERED",
16252
- path: e,
16253
- message: `属性 "${e}" 未注册`,
16254
- hint: " list_data_slots 查看可用属性"
16085
+ n(async ({ jsonPath: e, expectedHash: t }) => {
16086
+ if (!e) return $({
16087
+ code: "MISSING_VALUE",
16088
+ message: "delete_data 需要 jsonPath 指定要删的子路径(主数据整体不可删,用 set_data 整体替换)",
16089
+ hint: "如 jsonPath:\"components.0\" 删数组首项"
16090
+ });
16091
+ if (gv(e)) return $({
16092
+ code: "PATH_UNSAFE",
16093
+ message: `jsonPath "${e}" 含非法段`,
16094
+ hint: "使用正常属性路径"
16095
+ });
16096
+ let n = await m("delete", t || (u ? l : void 0));
16097
+ if (n !== null) return n;
16098
+ p("delete");
16099
+ let r = bv(a, e);
16100
+ return f({
16101
+ op: "delete",
16102
+ detail: e,
16103
+ timestamp: Date.now()
16104
+ }), l = Cv(a), r ? `已删除主数据 @ ${e}` : `主数据 @ ${e} 不存在(无需删除)`;
16105
+ }, {
16106
+ name: "delete_data",
16107
+ description: "删除主数据的某个子路径(jsonPath)。主数据整体不可删(用 set_data 整体替换)。expectedHash(可选):改前 read/get 返回的 hash;不传时自动用你最后读到的 hash(autoLock,默认开)防\"基于过期值删除\"。",
16108
+ schema: t.object({
16109
+ jsonPath: t.string().describe("要删除的子路径(相对主数据根,如 components.0)"),
16110
+ expectedHash: t.string().optional().describe("乐观锁:改前 read/get 返回的 hash;传入则校验,不一致拒绝删除防覆盖")
16111
+ })
16112
+ }),
16113
+ n(async ({ label: e }) => `已为主数据创建快照 #${p("manual", e)}${e ? `(${e})` : ""}。可用 list_data_snapshots 查看、restore_data 回退。`, {
16114
+ name: "snapshot_data",
16115
+ description: "为主数据手动创建一个命名快照(检查点)。set/edit/delete 也会自动存快照。",
16116
+ schema: t.object({ label: t.string().optional().describe("可选的快照标签,便于识别") })
16117
+ }),
16118
+ n(async () => {
16119
+ if (!s.length) return "无快照。set/edit/delete 会自动存快照,也可用 snapshot_data 手动创建检查点。";
16120
+ let e = s.map((e) => {
16121
+ let t = JSON.stringify(e.value ?? "").length, n = new Date(e.ts).toLocaleTimeString("zh-CN", { hour12: !1 });
16122
+ return ` #${e.id} [${e.op}]${e.label ? ` "${e.label}"` : ""} ${n} 修改前≈${t}字符`;
16123
+ });
16124
+ return `主数据快照(共 ${s.length} 条):\n${e.join("\n")}`;
16125
+ }, {
16126
+ name: "list_data_snapshots",
16127
+ description: "列出主数据的快照时间线(序号、操作类型、标签、大小)。",
16128
+ schema: t.object({})
16129
+ }),
16130
+ n(async ({ id: e }) => {
16131
+ if (!s.length) return $({
16132
+ code: "NO_SNAPSHOT",
16133
+ message: "无快照可回退",
16134
+ hint: "set/edit/delete 会自动存快照;也可先 snapshot_data 手动创建检查点"
16135
+ });
16136
+ let t = e === void 0 ? s[s.length - 1] : s.find((t) => t.id === e);
16137
+ if (!t) return $({
16138
+ code: "SNAPSHOT_NOT_FOUND",
16139
+ message: `未找到快照 #${e}`,
16140
+ hint: "用 list_data_snapshots 查看可用快照序号"
16141
+ });
16142
+ let n = i.safeParse(t.value);
16143
+ return n.success ? (Ev(a, xv(t.value)), f({
16144
+ op: "restore",
16145
+ detail: `#${t.id}`,
16146
+ timestamp: Date.now()
16147
+ }), l = Cv(a), `已回退主数据到快照 #${t.id}[${t.op}]${t.label ? `(${t.label})` : ""}。`) : $({
16148
+ code: "SNAPSHOT_SCHEMA_INVALID",
16149
+ message: `快照 #${t.id} 的值不符合当前 schema,无法回退`,
16150
+ hint: "schema 可能已变更;该快照已过期,选其他快照或重新设置",
16151
+ details: H_(n.error.issues)
16255
16152
  });
16256
- let r = _v(window, e);
16257
- if (typeof r != "object" || !r) return $({
16153
+ }, {
16154
+ name: "restore_data",
16155
+ description: "把主数据回退到某个快照(就地还原,保留响应式)。不传 id 则回退最近一次(快速回退)。可用 list_data_snapshots 查看快照列表。",
16156
+ schema: t.object({ id: t.number().int().optional().describe("指定快照序号;不传则回退最近一次") })
16157
+ }),
16158
+ n(async ({ expr: e, limit: t }) => {
16159
+ if (typeof a != "object" || !a) return $({
16258
16160
  code: "NOT_OBJECT",
16259
- path: e,
16260
- message: `"${e}" 不是对象/数组,无法查询(当前为 ${r === void 0 ? "undefined" : typeof r})`,
16261
- hint: "query 仅适用于对象/数组;叶子属性用 get_data_slot 读"
16161
+ message: `主数据不是对象/数组,无法查询(当前为 ${a === void 0 ? "undefined" : typeof a})`,
16162
+ hint: "query 仅适用于对象/数组;叶子用 get_data "
16262
16163
  });
16263
- let a;
16164
+ let n;
16264
16165
  try {
16265
- a = cv(r, t);
16266
- } catch (n) {
16166
+ n = lv(a, e);
16167
+ } catch (t) {
16267
16168
  return $({
16268
16169
  code: "JSONPATH_SYNTAX",
16269
- path: e,
16270
- message: `JSONPath 解析错误: ${n.message}`,
16170
+ message: `JSONPath 解析错误: ${t.message}`,
16271
16171
  hint: "语法子集:$ .key [n] [\"key\"] [*] [?(filter)] ..key ..*;filter:@.field op literal,&&/||/();对象根需先点出数组字段再过滤,如 $.components[?(@.x>1)]",
16272
- details: { expr: t }
16172
+ details: { expr: e }
16273
16173
  });
16274
16174
  }
16275
- let o = n ?? 50, s = a.slice(0, o), c = s.map((e) => `{"path":${JSON.stringify(e.path)},"index":${e.index === void 0 ? "null" : e.index},"value":${xv(e.value)}}`);
16276
- return `{"matched":${a.length},"returned":${s.length},"truncated":${a.length > o},"results":[${c.join(",")}]}`;
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(",")}]}`;
16277
16177
  }, {
16278
- name: "query_data_slot",
16279
- description: "用 JSONPath 表达式对一个已注册的对象/数组属性做结构化查询(只读,无副作用)。语法子集:$ 根、.key、[n]、[\"key\"]、[*] 通配、[?(filter)] 过滤、..key 递归找后代、..* 全后代。过滤表达式:@.field op literal(op:==/!=/</<=/>/>=),&&/||/() 连接;@ 指当前元素。注意过滤作用于\"当前节点的子元素数组\",若注册属性是对象需先点出数组字段再过滤,如 $.components[?(@.type==\"card\" && @.price<100)]。返回匹配元素的 path(相对属性根,数组索引可作后续 edit_data_slot 的 jsonPath)+ index(若父为数组)+ value。适合在大数组里按条件筛选元素,定位后再用 edit_data_slot 增量改。",
16178
+ name: "query_data",
16179
+ description: "用 JSONPath 表达式对主数据做结构化查询(只读,无副作用)。语法子集:$ 根、.key、[n]、[\"key\"]、[*] 通配、[?(filter)] 过滤、..key 递归找后代、..* 全后代。过滤表达式:@.field op literal(op:==/!=/</<=/>/>=),&&/||/() 连接;@ 指当前元素。注意过滤作用于\"当前节点的子元素数组\",若主数据是对象需先点出数组字段再过滤,如 $.components[?(@.type==\"card\" && @.price<100)]。返回匹配元素的 path(相对主数据根,数组索引可作后续 edit_data 的 jsonPath)+ index(若父为数组)+ value。适合在大数组里按条件筛选元素,定位后再用 edit_data 增量改。",
16280
16180
  schema: t.object({
16281
- path: t.string().describe("已注册的对象/数组属性路径"),
16282
- expr: t.string().describe("JSONPath 表达式,如 $[?(@.type==\"card\" && @.price<100)] 或 $..title(递归找所有 title)"),
16181
+ expr: t.string().describe("JSONPath 表达式,如 $.components[?(@.type==\"card\" && @.price<100)] 或 $..title(递归找所有 title)"),
16283
16182
  limit: t.number().int().min(1).max(200).optional().describe("返回结果上限,默认 50")
16284
16183
  })
16285
16184
  }),
16286
- n(async ({ path: e, query: t, mode: n, fuzzyThreshold: r, matchKey: a, limit: o }) => {
16287
- if (!i.get(e)) return $({
16288
- code: "NOT_REGISTERED",
16289
- path: e,
16290
- message: `属性 "${e}" 未注册`,
16291
- hint: "用 list_data_slots 查看可用属性"
16292
- });
16293
- let s = _v(window, e);
16294
- if (s == null) return $({
16185
+ n(async ({ query: e, mode: t, fuzzyThreshold: n, matchKey: r, limit: i }) => {
16186
+ if (a == null) return $({
16295
16187
  code: "EMPTY",
16296
- path: e,
16297
- message: `"${e}" 为空,无可搜索内容`
16188
+ message: "主数据为空,无可搜索内容"
16298
16189
  });
16299
16190
  try {
16300
- let e = uv(s, t, {
16301
- mode: n,
16302
- fuzzyThreshold: r,
16303
- matchKey: a,
16304
- limit: o ?? 50
16191
+ let o = dv(a, e, {
16192
+ mode: t,
16193
+ fuzzyThreshold: n,
16194
+ matchKey: r,
16195
+ limit: i ?? 50
16305
16196
  });
16306
- return xv({
16307
- matched: e.length,
16308
- results: e
16197
+ return Sv({
16198
+ matched: o.length,
16199
+ results: o
16309
16200
  });
16310
- } catch (n) {
16201
+ } catch (t) {
16311
16202
  return $({
16312
16203
  code: "REGEX_INVALID",
16313
- path: e,
16314
- message: `搜索错误: ${n.message}`,
16204
+ message: `搜索错误: ${t.message}`,
16315
16205
  hint: "regex 模式下 query 须为合法正则;改 mode 为 substring/fuzzy 可避免正则语法问题",
16316
- details: { query: t }
16206
+ details: { query: e }
16317
16207
  });
16318
16208
  }
16319
16209
  }, {
16320
- name: "search_data_slot",
16321
- description: "在一个已注册 数据槽内做文本搜索(只读,无副作用)。mode:substring(子串,默认,大小写不敏感)、regex(正则,i 标志)、fuzzy(模糊:子串命中或 Levenshtein 距离 ≤ fuzzyThreshold)。递归遍历所有叶子值(及可选 key),返回命中元素的 path + value(超 200 字符截断)。适合在大 JSON 里找名字近似、记不清的元素,定位 path 后用 edit_data_slot 改。",
16210
+ name: "search_data",
16211
+ description: "在主数据内做文本搜索(只读,无副作用)。mode:substring(子串,默认,大小写不敏感)、regex(正则,i 标志)、fuzzy(模糊:子串命中或 Levenshtein 距离 ≤ fuzzyThreshold)。递归遍历所有叶子值(及可选 key),返回命中元素的 path + value(超 200 字符截断)。适合在大 JSON 里找名字近似、记不清的元素,定位 path 后用 edit_data 改。",
16322
16212
  schema: t.object({
16323
- path: t.string().describe("已注册的属性路径(在它的子树内搜索)"),
16324
16213
  query: t.string().describe("搜索词(substring/regex/fuzzy 共用)"),
16325
16214
  mode: t.enum([
16326
16215
  "substring",
@@ -16332,78 +16221,187 @@ function Dv(e, r = {}) {
16332
16221
  limit: t.number().int().min(1).max(200).optional().describe("返回上限,默认 50")
16333
16222
  })
16334
16223
  }),
16335
- n(async ({ path: e, script: t, mode: n }) => {
16336
- let r = i.get(e);
16337
- if (!r) return $({
16338
- code: "NOT_REGISTERED",
16339
- path: e,
16340
- message: `属性 "${e}" 未注册`,
16341
- hint: "用 list_data_slots 查看可用属性"
16342
- });
16343
- if (t.length > 8e3) return $({
16224
+ n(async ({ script: e, mode: t }) => {
16225
+ if (e.length > 8e3) return $({
16344
16226
  code: "SCRIPT_TOO_LARGE",
16345
- path: e,
16346
- message: `脚本过长(${t.length} 字符,上限 8000)`,
16227
+ message: `脚本过长(${e.length} 字符,上限 8000)`,
16347
16228
  hint: "精简脚本;复杂逻辑可分步(先 query 探查再 transform 改),或拆成多次 eval"
16348
16229
  });
16349
- let a = await pv(bv(_v(window, e)), t, 3e3);
16350
- if (!a.ok) {
16351
- let n = /超时/.test(a.error || "");
16230
+ let n = await mv(xv(a), e, 3e3);
16231
+ if (!n.ok) {
16232
+ let t = /超时/.test(n.error || "");
16352
16233
  return $({
16353
- code: n ? "SCRIPT_TIMEOUT" : "SCRIPT_ERROR",
16354
- path: e,
16355
- message: `脚本执行失败: ${a.error}`,
16356
- hint: n ? "脚本可能有死循环或过重计算;加边界检查/分批;transform 返回完整新值勿返回巨大中间结果" : "检查脚本语法与运行时错误;入参为 data(属性深拷贝),沙箱内禁用 fetch/XHR/WebSocket",
16234
+ code: t ? "SCRIPT_TIMEOUT" : "SCRIPT_ERROR",
16235
+ message: `脚本执行失败: ${n.error}`,
16236
+ hint: t ? "脚本可能有死循环或过重计算;加边界检查/分批;transform 返回完整新值勿返回巨大中间结果" : "检查脚本语法与运行时错误;入参为 data(主数据深拷贝),沙箱内禁用 fetch/XHR/WebSocket",
16357
16237
  details: {
16358
- elapsedMs: a.elapsedMs,
16359
- scriptLen: t.length
16238
+ elapsedMs: n.elapsedMs,
16239
+ scriptLen: e.length
16360
16240
  }
16361
16241
  });
16362
16242
  }
16363
- if (n === "transform") {
16364
- let t = r.schema.safeParse(a.result);
16365
- if (!t.success) return $({
16366
- code: "SCHEMA_INVALID",
16367
- path: e,
16368
- message: "脚本返回值校验失败,未写入(transform 模式要求返回该属性的完整新值且符合 schema)",
16369
- hint: `确认脚本 return 了完整新值(非部分);按 describe_data_slot("${e}") 查看格式`,
16370
- details: V_(t.error.issues)
16371
- });
16372
- m(e, "edit", "eval_transform");
16373
- let n = _v(window, e);
16374
- return typeof n == "object" && n && t.data !== null && typeof t.data == "object" ? Ev(n, t.data) : vv(window, e, t.data), u({
16243
+ 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({
16375
16246
  op: "edit",
16376
- path: e,
16377
16247
  detail: "eval_transform",
16378
16248
  timestamp: Date.now()
16379
- }), `已通过脚本 transform 更新 ${e}(耗时 ${a.elapsedMs}ms)。当前值: ${xv(_v(window, e), 600)}`;
16249
+ }), l = Cv(a), `已通过脚本 transform 更新主数据(耗时 ${n.elapsedMs}ms)。当前值: ${Sv(a, 600)}`) : $({
16250
+ code: "SCHEMA_INVALID",
16251
+ message: "脚本返回值校验失败,未写入(transform 模式要求返回主数据的完整新值且符合 schema)",
16252
+ hint: "确认脚本 return 了完整新值(非部分);按 describe_data() 查看格式",
16253
+ details: H_(e.error.issues)
16254
+ });
16380
16255
  }
16381
- return xv({
16256
+ return Sv({
16382
16257
  ok: !0,
16383
- result: a.result,
16384
- elapsedMs: a.elapsedMs
16258
+ result: n.result,
16259
+ elapsedMs: n.elapsedMs
16385
16260
  });
16386
16261
  }, {
16387
16262
  name: "eval_script",
16388
- description: "在隔离的 Web Worker 沙箱里对一个已注册 数据槽跑自定义 JS 脚本(无 window/document 访问,fetch/XHR/WebSocket/importScripts 已禁用,超时 3s 可终止)。脚本以 `data` 为入参(该属性的深拷贝),返回值即结果。mode:query(默认,只读,把返回值回给 LLM,适合过滤/映射/聚合/统计大数组)、transform(把返回值作为该属性的新整体值,经 schema 校验后就地落地,适合批量重写)。注意:transform 需返回完整新值;query 不改 window。脚本内可用标准 JS(Array/Object/JSON/Math 等)与 async/await。",
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。",
16389
16264
  schema: t.object({
16390
- path: t.string().describe("已注册的属性路径,其深拷贝作为脚本的 data 入参"),
16391
16265
  script: t.string().describe("JS 脚本体,如 data.filter(c=>c.stock>0).map(c=>c.id);入参名 data;末尾表达式或 return 即返回值"),
16392
16266
  mode: t.enum(["query", "transform"]).optional().describe("query=只读返回结果(默认),transform=校验后落地为新值")
16393
16267
  })
16268
+ }),
16269
+ n(async ({ jsonPath: e }) => {
16270
+ let t = e ? vv(a, e) : a;
16271
+ if (r.interceptors?.read) try {
16272
+ t = r.interceptors.read(t);
16273
+ } catch (e) {
16274
+ return $({
16275
+ code: "READ_INTERCEPT",
16276
+ message: `read 拦截器抛错: ${e.message}`
16277
+ });
16278
+ }
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})`;
16283
+ }, {
16284
+ 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);不传则读整个主数据并返回说明") })
16287
+ }),
16288
+ n(async ({ value: e, patch: t, del: n }) => {
16289
+ let o = "set";
16290
+ n ? o = "delete" : t && (o = "edit");
16291
+ let s = e;
16292
+ if (r.interceptors?.write) try {
16293
+ let n = r.interceptors.write(t ?? e, a);
16294
+ if (n && typeof n == "object" && "error" in n) return $({
16295
+ code: "WRITE_INTERCEPT",
16296
+ message: `write 拦截器拒绝: ${n.error}`
16297
+ });
16298
+ o === "edit" ? t = n : s = n;
16299
+ } catch (e) {
16300
+ return $({
16301
+ code: "WRITE_INTERCEPT",
16302
+ message: `write 拦截器抛错: ${e.message}`
16303
+ });
16304
+ }
16305
+ let c = u ? l : void 0;
16306
+ if (o === "delete") {
16307
+ if (!t?.jsonPath) return $({
16308
+ code: "MISSING_VALUE",
16309
+ message: "delete 需要 patch.jsonPath 指定要删的子路径(主数据整体不可删,用 write(value) 整体替换)",
16310
+ hint: "如 patch:{jsonPath:\"components.0\"}, del:true"
16311
+ });
16312
+ if (gv(t.jsonPath)) return $({
16313
+ code: "PATH_UNSAFE",
16314
+ message: `jsonPath "${t.jsonPath}" 含非法段`,
16315
+ hint: "使用正常属性路径"
16316
+ });
16317
+ let e = await m("delete", c);
16318
+ if (e !== null) return e;
16319
+ p("delete");
16320
+ let n = bv(a, t.jsonPath);
16321
+ return f({
16322
+ op: "delete",
16323
+ detail: t.jsonPath,
16324
+ 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;
16332
+ }
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
+ });
16341
+ if (typeof a != "object" || !a) return $({
16342
+ code: "NOT_OBJECT",
16343
+ message: `edit 仅适用于对象/数组主数据,当前是 ${a === void 0 ? "undefined" : typeof a}`,
16344
+ hint: "叶子用 write(value) 整体设置"
16345
+ });
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({
16362
+ op: "edit",
16363
+ detail: `${r}${e ? "@" + e : ""}`,
16364
+ value: d,
16365
+ timestamp: Date.now()
16366
+ }), l = Cv(a), `已 write(edit) 主数据(${r}${e ? " @ " + e : ""})。当前值:${Sv(a, 600)} (新 hash=${Cv(a)})`) : U_("", u.error.issues);
16367
+ }
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({
16372
+ op: "set",
16373
+ value: g.data,
16374
+ timestamp: Date.now()
16375
+ }), l = Cv(a), `已 write(set) 主数据 = ${Sv(g.data, 600)} (新 hash=${Cv(a)})`) : U_("", g.error.issues);
16376
+ }, {
16377
+ 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 拦截器校验/转换/拒绝。",
16379
+ schema: t.object({
16380
+ value: t.unknown().optional().describe("JSON 对象(推荐,如 {title:\"x\"})或 JSON 字符串;set/patch 的 set/merge/append 必填"),
16381
+ patch: t.object({
16382
+ op: t.enum([
16383
+ "set",
16384
+ "remove",
16385
+ "merge",
16386
+ "append"
16387
+ ]),
16388
+ jsonPath: t.string().optional().describe("相对主数据根的点号路径(如 components.0.text);set/remove 必填,merge/append 不填则作用于根")
16389
+ }).optional().describe("增量编辑;传 patch 则走 edit 语义,否则整体 set;删除用 del:true 且 patch.jsonPath 指定子路径"),
16390
+ del: t.boolean().optional().describe("true 则删除 patch.jsonPath 指定的子路径(等价 delete_data)")
16391
+ })
16394
16392
  })
16395
16393
  ];
16396
- return Object.defineProperty(T, "controller", {
16397
- value: l,
16394
+ return Object.defineProperty(h, "controller", {
16395
+ value: d,
16398
16396
  enumerable: !1,
16399
16397
  configurable: !1,
16400
16398
  writable: !1
16401
- }), T;
16399
+ }), h;
16402
16400
  }
16403
16401
  //#endregion
16404
16402
  //#region src/core/tools/fetchDoc.ts
16405
- var Ov = 3e4, kv = [n(async ({ url: e, as: t }) => {
16406
- let n = new AbortController(), r = setTimeout(() => n.abort(), Ov);
16403
+ var Mv = 3e4, Nv = [n(async ({ url: e, as: t }) => {
16404
+ let n = new AbortController(), r = setTimeout(() => n.abort(), Mv);
16407
16405
  try {
16408
16406
  let r = await fetch(e, {
16409
16407
  method: "GET",
@@ -16420,7 +16418,7 @@ var Ov = 3e4, kv = [n(async ({ url: e, as: t }) => {
16420
16418
  ].join("\n");
16421
16419
  } catch (t) {
16422
16420
  let r = t?.message || String(t);
16423
- return n.signal.aborted ? `获取失败:请求超时(${Ov}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
16421
+ return n.signal.aborted ? `获取失败:请求超时(${Mv}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
16424
16422
  } finally {
16425
16423
  clearTimeout(r);
16426
16424
  }
@@ -16431,25 +16429,26 @@ var Ov = 3e4, kv = [n(async ({ url: e, as: t }) => {
16431
16429
  url: t.string().describe("要抓取的 URL(同源或已配 CORS)"),
16432
16430
  as: t.enum(["text", "markdown"]).optional().describe("返回格式标签,默认 text")
16433
16431
  })
16434
- })], Av = kv;
16435
- function jv(e, t) {
16436
- return Dv(e, t);
16432
+ })], Pv = Nv;
16433
+ function Fv(e, t) {
16434
+ return jv(e, t);
16437
16435
  }
16438
- function Mv(e, t, n) {
16439
- let r = e?.dataSlotOps !== !1, i = e?.fetch !== !1;
16436
+ function Iv(e, t, n) {
16437
+ let r = e?.dataOps !== !1, i = e?.fetch !== !1;
16440
16438
  return [...r ? t : [], ...i ? n : []];
16441
16439
  }
16442
16440
  //#endregion
16443
16441
  //#region src/core/harness/usageHints.ts
16444
- var Nv = .7;
16445
- function Pv(e, t) {
16442
+ var Lv = .7;
16443
+ function Rv(e, t, n = "simple") {
16444
+ let r = n !== "advanced";
16446
16445
  return {
16447
16446
  name: "usageHints",
16448
16447
  augmentPrompt: () => {
16449
16448
  let n = [];
16450
- if (e?.planning !== !1 && n.push("多步任务建议先 write_todos 拆解为步骤并逐步推进。"), t && (n.push("改属性前先 get_data_slot(path) 读其当前真实值与 hash(返回末尾 hash=xxx),基于真实值改,不要凭记忆。写入(set/edit/delete)时回传 expectedHash=该 hash 启用乐观锁——若属性在你 get 之后被外部代码/其他 agent/用户手动改过,会触发冲突:集成方若开启人工介入,工具会挂起等用户决定(保留外部/强制覆盖/回退),你应等待工具返回后按结果继续(保留外部→重新 get 再改;强制覆盖→已写入,继续;回退→已回退到历史快照,基于回退值重写);未开启人工介入时返回 VERSION_CONFLICT 不写入,重新 get 拿最新值与 hash 再改。"), n.push("不确定可操作哪些属性时用 list_data_slots 查看(动态组件场景下注册表会增删,以工具返回为准,勿凭旧记忆);不确定某属性字段结构时用 describe_data_slot。"), n.push("修改大对象/数组属性优先用 edit_data_slot 增量 patch(只发改动部分),避免 set 整体重传被 max_tokens 截断导致 JSON 不完整、校验失败。"), n.push("修改属性出错时可用 restore_data_snapshot(path) 回退最近一次。"), n.push("在大数组里按条件筛选元素用 query_data_slot(JSONPath,如 $[?(@.type==\"card\" && @.price<100)]),返回匹配元素的 path/index;定位后再 edit_data_slot 改。"), n.push("找名字记不清的元素用 search_data_slot(支持 substring/regex/fuzzy 模糊搜索)。"), n.push("需要过滤/映射/聚合/批量重写大数组时用 eval_script(沙箱脚本,入参 data);只读探查用 mode=query,批量重写用 mode=transform(返回值经校验后落地)。")), e?.subagent !== !1 && n.push("独立子任务可 spawn_agent 委派(只读工具,过程不占主上下文)。"), e?.subagents?.length) {
16451
- let t = e.subagents.filter((e) => (e.temperature ?? 0) >= Nv || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), r = e.subagents.filter((e) => (e.temperature ?? 0) < Nv && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
16452
- n.push("【规划-反思-执行·路由】按任务性质选模式,不要对简单任务过度编排:"), t.length && (n.push(` · 创作/设计/开放性需求(如"设计主题风格""换个感觉")→ 先调 ${t.map((e) => "use_" + e.id).join("/")} 出 2-3 套方案(高温创意),`), n.push(" 不要自己拍板;拿到方案后,若需用户拍板用 request_human_confirmation 弹选项。")), r.length && n.push(` · 严谨/易错/校验类 → 可先调 ${r.map((e) => "use_" + e.id).join("/")} 反思挑刺(低温审查),据反馈修订。`), n.push(" · 方案定稿后,由你(主 agent)用 edit_data_slot 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。"), n.push(" · 简单/明确任务(如\"标题改红色\")直接执行,不必走规划-反思。");
16449
+ 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));
16451
+ 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(" · 简单/明确任务(如\"标题改红色\")直接执行,不必走规划-反思。");
16453
16452
  }
16454
16453
  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;
16455
16454
  }
@@ -16457,7 +16456,7 @@ function Pv(e, t) {
16457
16456
  }
16458
16457
  //#endregion
16459
16458
  //#region src/core/utils/id.ts
16460
- function Fv() {
16459
+ function zv() {
16461
16460
  try {
16462
16461
  if (typeof crypto < "u" && typeof crypto.randomUUID == "function") return crypto.randomUUID();
16463
16462
  } catch {}
@@ -16465,57 +16464,57 @@ function Fv() {
16465
16464
  }
16466
16465
  //#endregion
16467
16466
  //#region src/core/backends/storage.ts
16468
- var Iv = "chat-sdk", Lv = 50 * 1024 * 1024, Rv = 4 * 1024 * 1024, zv = 10 * 1024 * 1024, Bv = .9, Vv = 500, Hv = 300, Uv = "__meta__", Wv = "v:1", Gv = [
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 = [
16469
16468
  "messages",
16470
16469
  "vfs",
16471
16470
  "todos",
16472
16471
  "memory"
16473
16472
  ];
16474
- function Kv(e) {
16475
- return e === "local" || e === "session" ? Rv : Lv;
16473
+ function Xv(e) {
16474
+ return e === "local" || e === "session" ? Hv : Vv;
16476
16475
  }
16477
- function qv(e) {
16476
+ function Zv(e) {
16478
16477
  if (typeof e != "object" || !e) return !1;
16479
16478
  let t = e;
16480
16479
  return t.name === "QuotaExceededError" || t.name === "NS_ERROR_DOM_QUOTA_REACHED" || t.code === 22 || t.code === 1014;
16481
16480
  }
16482
- function Jv(e, t, n, r) {
16481
+ function Qv(e, t, n, r) {
16483
16482
  return [
16484
- Wv,
16483
+ Jv,
16485
16484
  e,
16486
16485
  t,
16487
16486
  n,
16488
16487
  r
16489
16488
  ].join("::");
16490
16489
  }
16491
- function Yv(e, t, n) {
16490
+ function $v(e, t, n) {
16492
16491
  return [
16493
- Wv,
16492
+ Jv,
16494
16493
  e,
16495
16494
  t,
16496
16495
  n
16497
16496
  ].join("::") + "::";
16498
16497
  }
16499
- function Xv(e, t) {
16498
+ function ey(e, t) {
16500
16499
  return [
16501
- Wv,
16500
+ Jv,
16502
16501
  e,
16503
16502
  t
16504
16503
  ].join("::") + "::";
16505
16504
  }
16506
- function Zv(e) {
16507
- return [Wv, e].join("::") + "::";
16505
+ function ty(e) {
16506
+ return [Jv, e].join("::") + "::";
16508
16507
  }
16509
- var Qv = null;
16510
- function $v(e) {
16511
- Qv ||= new TextEncoder();
16508
+ var ny = null;
16509
+ function ry(e) {
16510
+ ny ||= new TextEncoder();
16512
16511
  try {
16513
- return Qv.encode(JSON.stringify(e)).length;
16512
+ return ny.encode(JSON.stringify(e)).length;
16514
16513
  } catch {
16515
16514
  return 0;
16516
16515
  }
16517
16516
  }
16518
- function ey(e, t, n) {
16517
+ function iy(e, t, n) {
16519
16518
  let r = e.reduce((e, t) => e + t.bytes, 0);
16520
16519
  if (r <= t) return [];
16521
16520
  let i = t * n, a = [...e].sort((e, t) => e.lastAccessed - t.lastAccessed), o = [];
@@ -16525,7 +16524,7 @@ function ey(e, t, n) {
16525
16524
  }
16526
16525
  return o;
16527
16526
  }
16528
- function ty() {
16527
+ function ay() {
16529
16528
  let e = /* @__PURE__ */ new Map();
16530
16529
  return {
16531
16530
  async get(t) {
@@ -16545,7 +16544,7 @@ function ty() {
16545
16544
  }
16546
16545
  };
16547
16546
  }
16548
- function ny(e) {
16547
+ function oy(e) {
16549
16548
  return new Promise((t, n) => {
16550
16549
  if (typeof indexedDB > "u") {
16551
16550
  n(/* @__PURE__ */ Error("indexedDB 不可用"));
@@ -16606,7 +16605,7 @@ function ny(e) {
16606
16605
  }, r.onerror = () => n(r.error);
16607
16606
  });
16608
16607
  }
16609
- function ry(e) {
16608
+ function sy(e) {
16610
16609
  return {
16611
16610
  async get(t) {
16612
16611
  let n = e.getItem(t);
@@ -16640,12 +16639,12 @@ function ry(e) {
16640
16639
  }
16641
16640
  };
16642
16641
  }
16643
- function iy(e, t, n) {
16642
+ function cy(e, t, n) {
16644
16643
  let r = (e.get(t) ?? Promise.resolve()).then(n, n);
16645
16644
  return e.set(t, r.then(() => void 0, () => void 0)), r;
16646
16645
  }
16647
- function ay(e = {}) {
16648
- let t = e.dbName ?? Iv, n = e.backend ?? "indexed", r = e.maxBytes ?? Kv(n), i = e.maxBytesPerSession ?? zv, a = e.evictionWatermark ?? Bv, o = e.debounceMs ?? Vv, s = /* @__PURE__ */ new Set();
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();
16649
16648
  function c(e) {
16650
16649
  for (let t of s) try {
16651
16650
  t(e);
@@ -16658,16 +16657,16 @@ function ay(e = {}) {
16658
16657
  try {
16659
16658
  if (n === "indexed") {
16660
16659
  if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
16661
- l = await ny(t), d(!0);
16660
+ l = await oy(t), d(!0);
16662
16661
  } else if (n === "session") {
16663
16662
  if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
16664
- l = ry(sessionStorage), d(!0);
16663
+ l = sy(sessionStorage), d(!0);
16665
16664
  } else if (n === "local") {
16666
16665
  if (typeof localStorage > "u") throw Error("localStorage 不可用");
16667
- l = ry(localStorage), d(!0);
16668
- } else l = ty(), d(!1);
16666
+ l = sy(localStorage), d(!0);
16667
+ } else l = ay(), d(!1);
16669
16668
  } catch (e) {
16670
- l = ty();
16669
+ l = ay();
16671
16670
  let t = e instanceof Error ? e.message : String(e);
16672
16671
  d(!1), Promise.resolve().then(() => c({
16673
16672
  type: "degraded",
@@ -16677,10 +16676,10 @@ function ay(e = {}) {
16677
16676
  })();
16678
16677
  let p = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map();
16679
16678
  function g(e, n, r, a) {
16680
- let o = Jv(t, r, a, Uv);
16681
- return iy(h, o, async () => {
16679
+ let o = Qv(t, r, a, qv);
16680
+ return cy(h, o, async () => {
16682
16681
  let t = async () => {
16683
- let t = await l.get(o), s = await l.get(e), u = s == null ? 0 : $v(s), d = $v(n), f = (t?.bytes ?? 0) + (d - u);
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);
16684
16683
  if (f > i) {
16685
16684
  c({
16686
16685
  type: "quota",
@@ -16702,12 +16701,12 @@ function ay(e = {}) {
16702
16701
  try {
16703
16702
  await t();
16704
16703
  } catch (e) {
16705
- if (qv(e) && !u) {
16704
+ if (Zv(e) && !u) {
16706
16705
  u = !0;
16707
16706
  try {
16708
16707
  await b();
16709
16708
  } catch {}
16710
- l = ty(), Promise.resolve().then(() => c({
16709
+ l = ay(), Promise.resolve().then(() => c({
16711
16710
  type: "degraded",
16712
16711
  reason: "存储配额超限(QuotaExceededError),已淘汰最旧会话并降级内存"
16713
16712
  }));
@@ -16719,7 +16718,7 @@ function ay(e = {}) {
16719
16718
  });
16720
16719
  }
16721
16720
  function _(e, n, r, i) {
16722
- let a = Jv(t, e, n, r), s = p.get(a);
16721
+ let a = Qv(t, e, n, r), s = p.get(a);
16723
16722
  s && s.resolve();
16724
16723
  let c = m.get(a);
16725
16724
  return c && clearTimeout(c), new Promise((t) => {
@@ -16746,15 +16745,15 @@ function ay(e = {}) {
16746
16745
  function y() {
16747
16746
  v ||= setTimeout(() => {
16748
16747
  v = null, b();
16749
- }, Hv);
16748
+ }, Kv);
16750
16749
  }
16751
16750
  async function b() {
16752
16751
  let e = [];
16753
- await l.scan(Zv(t), (t, n) => {
16752
+ await l.scan(ty(t), (t, n) => {
16754
16753
  t.endsWith("::__meta__") && e.push(n);
16755
16754
  });
16756
- let n = ey(e, r, a);
16757
- for (let e of n) await l.clearPrefix(Yv(t, e.agentId, e.sessionId)), c({
16755
+ let n = iy(e, r, a);
16756
+ for (let e of n) await l.clearPrefix($v(t, e.agentId, e.sessionId)), c({
16758
16757
  type: "evicted",
16759
16758
  agentId: e.agentId,
16760
16759
  sessionId: e.sessionId,
@@ -16765,13 +16764,13 @@ function ay(e = {}) {
16765
16764
  ready: f,
16766
16765
  async listSessions(e) {
16767
16766
  let n = [];
16768
- return await l.scan(Xv(t, e), (e, t) => {
16767
+ return await l.scan(ey(t, e), (e, t) => {
16769
16768
  e.endsWith("::__meta__") && n.push(t);
16770
16769
  }), n.sort((e, t) => t.lastAccessed - e.lastAccessed);
16771
16770
  },
16772
16771
  async load(e, n) {
16773
- let r = Jv(t, e, n, Uv);
16774
- return await iy(h, r, async () => {
16772
+ let r = Qv(t, e, n, qv);
16773
+ return await cy(h, r, async () => {
16775
16774
  let i = await l.get(r);
16776
16775
  if (!i) return;
16777
16776
  let a = {
@@ -16780,8 +16779,8 @@ function ay(e = {}) {
16780
16779
  todos: [],
16781
16780
  memory: ""
16782
16781
  };
16783
- for (let r of Gv) {
16784
- let i = await l.get(Jv(t, e, n, r));
16782
+ for (let r of Yv) {
16783
+ let i = await l.get(Qv(t, e, n, r));
16785
16784
  i != null && (a[r] = i);
16786
16785
  }
16787
16786
  return i.lastAccessed = Date.now(), await l.set(r, i), a;
@@ -16789,7 +16788,7 @@ function ay(e = {}) {
16789
16788
  },
16790
16789
  async save(e, t, n) {
16791
16790
  let r = [];
16792
- for (let i of Gv) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
16791
+ for (let i of Yv) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
16793
16792
  await Promise.all(r);
16794
16793
  },
16795
16794
  async flush() {
@@ -16803,10 +16802,10 @@ function ay(e = {}) {
16803
16802
  })), c({ type: "flush" }), await b();
16804
16803
  },
16805
16804
  async deleteSession(e, n) {
16806
- await l.clearPrefix(Yv(t, e, n));
16805
+ await l.clearPrefix($v(t, e, n));
16807
16806
  },
16808
16807
  async createSession(e, n, r) {
16809
- let i = r ?? Fv(), a = Date.now(), o = {
16808
+ let i = r ?? zv(), a = Date.now(), o = {
16810
16809
  agentId: e,
16811
16810
  sessionId: i,
16812
16811
  createdAt: a,
@@ -16814,7 +16813,7 @@ function ay(e = {}) {
16814
16813
  bytes: 0,
16815
16814
  title: n
16816
16815
  };
16817
- return await l.set(Jv(t, e, i, Uv), o), i;
16816
+ return await l.set(Qv(t, e, i, qv), o), i;
16818
16817
  },
16819
16818
  onEvent(e) {
16820
16819
  s.add(e);
@@ -16829,28 +16828,34 @@ function ay(e = {}) {
16829
16828
  }
16830
16829
  //#endregion
16831
16830
  //#region src/core/sdk/createChatSdk.ts
16832
- var oy = [
16831
+ var uy = [
16833
16832
  "你是一个页面操作助手。宿主页面在 window 对象上注册了可操作的属性,你通过专用工具安全地读写这些属性来操作页面。",
16834
16833
  "所有写操作都经范围控制(仅注册表内)与 schema 校验(不合法会返回结构化错误而非写入),并自动留快照可回退。",
16835
16834
  "大对象/数组优先用增量 patch(只发改动)而非整体重传,避免输出被截断。",
16836
16835
  R_.reliableWriteRules
16837
- ].join("\n\n"), sy = 50;
16838
- function cy(e) {
16839
- return e === void 0 || e === !1 ? null : typeof e == "string" ? ay({ backend: e }) : e.enabled === !1 ? null : ay(e);
16836
+ ].join("\n\n");
16837
+ function dy(e) {
16838
+ if (!e) return "";
16839
+ let t = z_(e.schema);
16840
+ return `\n\n## 可操作数据(字段以 read 工具返回的实际值为准)\n${e.description ? e.description + "\n" : ""}${t}`;
16841
+ }
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);
16840
16845
  }
16841
- function ly(e) {
16846
+ function my(e) {
16842
16847
  return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
16843
16848
  }
16844
- var uy = /* @__PURE__ */ new Map();
16845
- function dy(e) {
16849
+ var hy = /* @__PURE__ */ new Map();
16850
+ function gy(e) {
16846
16851
  let t = e.content;
16847
16852
  return typeof t == "string" ? t : Array.isArray(t) ? t.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(t ?? "");
16848
16853
  }
16849
- function fy(e) {
16854
+ function _y(e) {
16850
16855
  let t = e.summaryLlm ?? e.llm;
16851
16856
  if (!t) return;
16852
16857
  let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, o = e.summaryTimeoutMs ?? 15e3, c;
16853
- if (ly(t)) c = t;
16858
+ if (my(t)) c = t;
16854
16859
  else {
16855
16860
  let i = t;
16856
16861
  if (!i.apiKey) {
@@ -16868,38 +16873,25 @@ function fy(e) {
16868
16873
  return async (e) => {
16869
16874
  let t = new AbortController(), n = setTimeout(() => t.abort(), o);
16870
16875
  try {
16871
- return dy(await c.invoke([new a("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new i(e)], { signal: t.signal })).trim();
16876
+ return gy(await c.invoke([new a("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new i(e)], { signal: t.signal })).trim();
16872
16877
  } finally {
16873
16878
  clearTimeout(n);
16874
16879
  }
16875
16880
  };
16876
16881
  }
16877
- function py(e) {
16878
- return e === "set_data_slot" ? "set" : e === "edit_data_slot" ? "edit" : e === "delete_data_slot" ? "delete" : e === "restore_data_snapshot" ? "restore" : null;
16879
- }
16880
- function my(e) {
16881
- let t = e.split("."), n = globalThis.window;
16882
- for (let e of t) {
16883
- if (n == null) return;
16884
- n = n[e];
16885
- }
16886
- return n;
16882
+ function vy(e, t) {
16883
+ 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;
16887
16884
  }
16888
- function hy(e, t) {
16885
+ function yy(e, t, n) {
16889
16886
  return {
16890
16887
  name: "sdk-events",
16891
- wrapToolCall: async (t, n) => {
16892
- let r = await n(t), i = py(t.name);
16893
- if (i) {
16894
- let n = String(t.args?.path ?? "");
16895
- e({
16896
- type: "data_slot_change",
16897
- path: n,
16898
- operation: i,
16899
- value: n ? my(n) : void 0
16900
- });
16901
- }
16902
- return r;
16888
+ wrapToolCall: async (t, r) => {
16889
+ let i = await r(t), a = vy(t.name, t.args);
16890
+ return a && e({
16891
+ type: "data_change",
16892
+ operation: a,
16893
+ value: n()?.bind
16894
+ }), i;
16903
16895
  },
16904
16896
  afterAgent: async () => {
16905
16897
  e({
@@ -16909,7 +16901,7 @@ function hy(e, t) {
16909
16901
  }
16910
16902
  };
16911
16903
  }
16912
- function gy(e, r) {
16904
+ function by(e, r) {
16913
16905
  let i = /* @__PURE__ */ fn(null), a = 0;
16914
16906
  function o(e) {
16915
16907
  return new Promise((t) => {
@@ -16920,7 +16912,7 @@ function gy(e, r) {
16920
16912
  id: ++a,
16921
16913
  resolve: t
16922
16914
  };
16923
- i.value = r, de({
16915
+ i.value = r, me({
16924
16916
  type: "conflict",
16925
16917
  conflict: r
16926
16918
  });
@@ -16930,136 +16922,139 @@ function gy(e, r) {
16930
16922
  let t = i.value;
16931
16923
  t && (i.value = null, t.resolve({ action: e }));
16932
16924
  }
16933
- let c = cy(e.storage);
16925
+ let c = py(e.storage);
16934
16926
  e.debug && c && c.onEvent((e) => console.log("[page-agent-sdk][storage]", e));
16935
- let l = ly(e.llm) ? void 0 : e.llm, u = ng({
16927
+ let l = my(e.llm) ? void 0 : e.llm, u = ng({
16936
16928
  model: l?.model,
16937
16929
  contextWindow: e.contextWindow ?? l?.contextWindow,
16938
16930
  maxOutputTokens: e.maxOutputTokens ?? l?.maxOutputTokens
16939
16931
  });
16940
16932
  e.debug && console.log("[page-agent-sdk][modelCaps]", u);
16941
- let d = fy(e);
16933
+ let d = _y(e);
16942
16934
  e.debug && !d && console.warn("[page-agent-sdk][summarization] 未构造 llmInvoke(apiKey 缺失?),摘要回退零成本索引摘要");
16943
- let f = /* @__PURE__ */ Qt([]), p = G_(e.vfs?.initialFiles, {
16935
+ let f = /* @__PURE__ */ Qt([]), p = K_(e.vfs?.initialFiles, {
16944
16936
  persist: c ? { save: (e) => {
16945
16937
  B.sessionId && c && c.save(r, B.sessionId, { vfs: e });
16946
16938
  } } : void 0,
16947
16939
  maxBytes: e.vfs?.maxBytes
16948
- }), m = Sg(), h = Ag(e.memory || ""), g = { current: null }, _ = e.checkpoint, v = _ !== void 0 && _ !== !1, y = v ? qg({
16949
- slotPaths: (e.dataSlots ?? []).map((e) => e.path),
16940
+ }), m = Sg(), h = Ag(e.memory || ""), g = { current: null }, _ = e.data ? {
16941
+ ...e.data,
16942
+ description: e.data.description ?? "主数据对象"
16943
+ } : void 0, v = e.checkpoint, y = v !== void 0 && v !== !1, b = y ? qg({
16944
+ slotPaths: _ ? [""] : [],
16950
16945
  vfsStore: p,
16951
16946
  todosMw: m,
16952
16947
  getTodos: () => g.current?.getState?.()?.todos ?? [],
16953
16948
  messages: f,
16954
- maxCheckpoints: _ && typeof _ == "object" ? _.maxCheckpoints : void 0
16955
- }) : null, b = !_ || typeof _ != "object" || _.auto !== !1, x = e.capabilities, S = x?.dataSlotOps !== !1, C = S ? Dv(e.dataSlots || [], {
16956
- onAudit: e.debug ? (e) => console.log("[page-agent-sdk][window audit]", e) : void 0,
16949
+ 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(_, {
16951
+ onAudit: e.debug ? (e) => console.log("[page-agent-sdk][data audit]", e) : void 0,
16957
16952
  maxSnapshots: e.maxSnapshots,
16958
16953
  onConflict: o,
16959
- autoLock: e.autoLock
16960
- }) : [], w = S ? C.controller ?? null : null, T = () => w?.list() ?? e.dataSlots ?? [], E = /* @__PURE__ */ new Map(), D = Mv(x, C, kv);
16961
- D.forEach((e) => E.set(e.name, "builtin"));
16962
- let O = [...e.tools || []];
16963
- O.forEach((e) => E.set(e.name, "user"));
16964
- let k = e.humanConfirm !== !1 && (!e.approval || e.approval.humanConfirmTool !== !1), A = k ? zg() : null;
16965
- A && E.set(Lg, "builtin");
16966
- let j = v && y ? [n(async () => {
16967
- let e = y.list();
16968
- return e.length ? y.restore() ? `已回退到最近一次正常状态(checkpoint #${e[e.length - 1].id})。对话历史、数据槽注册项、vfs、todos 已整体还原。请基于回退后的状态重新判断并继续。` : "回退失败:无可用 checkpoint。" : "无可用 checkpoint,无法回退。";
16954
+ autoLock: e.autoLock,
16955
+ 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);
16957
+ A.forEach((e) => k.set(e.name, "builtin"));
16958
+ let j = [...e.tools || []];
16959
+ j.forEach((e) => k.set(e.name, "user"));
16960
+ let M = e.humanConfirm !== !1 && (!e.approval || e.approval.humanConfirmTool !== !1), N = M ? zg() : null;
16961
+ N && k.set(Lg, "builtin");
16962
+ let P = y && b ? [n(async () => {
16963
+ let e = b.list();
16964
+ return e.length ? b.restore() ? `已回退到最近一次正常状态(checkpoint #${e[e.length - 1].id})。对话历史、数据槽注册项、vfs、todos 已整体还原。请基于回退后的状态重新判断并继续。` : "回退失败:无可用 checkpoint。" : "无可用 checkpoint,无法回退。";
16969
16965
  }, {
16970
16966
  name: "restore_last_checkpoint",
16971
16967
  description: "回退到最近一次正常状态(整体还原对话历史 + 数据槽注册项 + vfs + todos)。当本轮操作出错、页面被改坏、或走偏时调用,回到本轮起点重新来过。不传参数即回退最近一次。",
16972
16968
  schema: t.object({}).optional()
16973
16969
  }), n(async () => {
16974
- let e = y.list();
16970
+ let e = b.list();
16975
16971
  return e.length ? "可用 checkpoint:\n" + e.map((e) => `#${e.id} [${e.label ?? "auto"}] 消息数=${e.messageCount} 时间=${new Date(e.timestamp).toLocaleTimeString()}`).join("\n") : "无可用 checkpoint。";
16976
16972
  }, {
16977
16973
  name: "list_checkpoints",
16978
16974
  description: "列出可用会话 checkpoint(回退点)。",
16979
16975
  schema: t.object({}).optional()
16980
16976
  })] : [];
16981
- j.forEach((e) => E.set(e.name, "builtin"));
16982
- let M = [
16983
- ...D,
16984
- ...O,
16985
- ...A ? [A] : [],
16986
- ...j
16987
- ], N = x?.planning !== !1, P = x?.skills !== !1, F = x?.vfs !== !1, I = x?.summarization !== !1, L = x?.memory !== !1, ee = x?.subagent !== !1, R = e.verify?.maxAttempts ?? 2, z = x?.verify === !0 && e.verify?.enabled !== !1 && R > 0;
16988
- e.verify?.check && x?.verify !== !0 && console.warn("[page-agent-sdk][verify] 检测到 verify.check 但 capabilities.verify 未开启,verify 未装载");
16989
- let te = e.subagent, ne = te?.allowedTools ?? [], re = !ee || te?.enabled === !1 ? void 0 : n_({
16990
- llm: te?.llm ?? e.llm,
16991
- allTools: M,
16992
- allowedTools: ne.length ? ne : void 0,
16993
- systemPrompt: te?.systemPrompt,
16994
- temperature: te?.temperature,
16995
- maxTokens: te?.maxTokens,
16996
- skills: te?.skills,
16997
- maxDepth: te?.maxDepth,
16998
- maxParallel: te?.maxParallel,
16977
+ P.forEach((e) => k.set(e.name, "builtin"));
16978
+ let F = [
16979
+ ...A,
16980
+ ...j,
16981
+ ...N ? [N] : [],
16982
+ ...P
16983
+ ], I = S?.planning !== !1, L = S?.skills !== !1, ee = S?.vfs !== !1, R = S?.summarization !== !1, z = S?.memory !== !1, te = S?.subagent !== !1, ne = e.verify?.maxAttempts ?? 2, re = S?.verify === !0 && e.verify?.enabled !== !1 && ne > 0;
16984
+ e.verify?.check && S?.verify !== !0 && console.warn("[page-agent-sdk][verify] 检测到 verify.check 但 capabilities.verify 未开启,verify 未装载");
16985
+ let ie = e.subagent, ae = ie?.allowedTools ?? [], oe = !te || ie?.enabled === !1 ? void 0 : n_({
16986
+ llm: ie?.llm ?? e.llm,
16987
+ allTools: F,
16988
+ allowedTools: ae.length ? ae : void 0,
16989
+ systemPrompt: ie?.systemPrompt,
16990
+ temperature: ie?.temperature,
16991
+ maxTokens: ie?.maxTokens,
16992
+ skills: ie?.skills,
16993
+ maxDepth: ie?.maxDepth,
16994
+ maxParallel: ie?.maxParallel,
16999
16995
  debug: e.debug
17000
- }), ie = e.subagents?.length ? a_(e.subagents, {
16996
+ }), se = e.subagents?.length ? a_(e.subagents, {
17001
16997
  llm: e.llm,
17002
- allTools: M,
16998
+ allTools: F,
17003
16999
  debug: e.debug
17004
- }) : void 0, ae = [
17005
- "get_data_slot",
17006
- "get_slot_paths",
17007
- "list_data_slots",
17008
- "describe_data_slot",
17000
+ }) : void 0, ce = [
17001
+ "get_data",
17002
+ "describe_data",
17003
+ "read",
17009
17004
  "fetch_document"
17010
- ], oe = M.filter((e) => ae.includes(e.name)), se = z ? o_({
17011
- check: e.verify.check ?? f_({ schemas: () => Object.fromEntries(T().map((e) => [e.path, e.schema])) }),
17005
+ ], le = F.filter((e) => ce.includes(e.name)), ue = re ? o_({
17006
+ check: e.verify.check ?? f_({ schemas: () => O() ? { "": O().schema } : {} }),
17012
17007
  adversarial: e.verify?.adversarial ? {
17013
17008
  llm: e.llm,
17014
- tools: oe
17009
+ tools: le
17015
17010
  } : void 0
17016
- }) : void 0, ce = Pv({
17017
- ...x,
17018
- humanConfirm: k,
17011
+ }) : void 0, de = Rv({
17012
+ ...S,
17013
+ humanConfirm: M,
17019
17014
  subagents: e.subagents?.map((e) => ({
17020
17015
  id: e.id,
17021
17016
  description: e.description,
17022
17017
  temperature: e.temperature
17023
17018
  }))
17024
- }, S && !!e.dataSlots?.length), le = e.onEvent, ue = /* @__PURE__ */ new Set(), de = (e) => {
17019
+ }, C && !!_, e.toolMode), fe = e.onEvent, pe = /* @__PURE__ */ new Set(), me = (e) => {
17025
17020
  if (e.type !== "approval_request") {
17026
- if (le) try {
17027
- le(e);
17021
+ if (fe) try {
17022
+ fe(e);
17028
17023
  } catch {}
17029
- for (let t of ue) try {
17024
+ for (let t of pe) try {
17030
17025
  t(e);
17031
17026
  } catch {}
17032
17027
  }
17033
- }, fe = [
17034
- ce,
17035
- ...N ? [m] : [],
17036
- ...P ? [kg(e.skills || [], { readVfs: F ? (e) => p.files[e]?.content : void 0 })] : [],
17037
- ...F ? [Q_(p)] : [],
17038
- ...I ? [I_({
17039
- ...B_(e, u.contextWindow),
17028
+ }, he = [
17029
+ de,
17030
+ ...I ? [m] : [],
17031
+ ...L ? [kg(e.skills || [], { readVfs: ee ? (e) => p.files[e]?.content : void 0 })] : [],
17032
+ ...ee ? [$_(p)] : [],
17033
+ ...R ? [I_({
17034
+ ...V_(e, u.contextWindow),
17040
17035
  llmInvoke: d,
17041
- getRegisteredSlots: () => T().map((e) => ({
17042
- path: e.path,
17043
- description: e.description
17044
- })),
17045
- preserveLastToolResults: (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? ["describe_data_slot", "list_data_slots"]
17036
+ getRegisteredSlots: () => O() ? [{
17037
+ path: "",
17038
+ description: O().description ?? "主数据对象"
17039
+ }] : [],
17040
+ preserveLastToolResults: (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? ["describe_data", "read"]
17046
17041
  })] : [],
17047
- ...L ? [h] : [],
17042
+ ...z ? [h] : [],
17048
17043
  ...e.permissions?.length ? [Fg(e.permissions)] : [],
17049
- ...v && b && y ? [Jg(y)] : [],
17050
- ...k ? [Bg()] : [],
17044
+ ...y && x && b ? [Jg(b)] : [],
17045
+ ...M ? [Bg()] : [],
17051
17046
  ...e.approval && (e.approval.tools !== void 0 || e.approval.confirm) ? [Ig(e.approval)] : [],
17047
+ ...ue ? [ue] : [],
17048
+ ...oe ? [oe] : [],
17052
17049
  ...se ? [se] : [],
17053
- ...re ? [re] : [],
17054
- ...ie ? [ie] : [],
17055
17050
  ...e.middleware || [],
17056
- hy(de, f)
17057
- ], pe = e.maxMemoryRounds ?? sy, B = {
17051
+ yy(me, f, O)
17052
+ ], ge = e.maxMemoryRounds ?? fy, B = {
17058
17053
  agentId: r,
17059
17054
  store: c,
17060
17055
  messages: f,
17061
17056
  vfsStore: p,
17062
- listeners: ue,
17057
+ listeners: pe,
17063
17058
  todosMw: m,
17064
17059
  memoryMw: h,
17065
17060
  agent: null,
@@ -17068,31 +17063,41 @@ function gy(e, r) {
17068
17063
  refCount: 0,
17069
17064
  mcpClosers: [],
17070
17065
  mcpServers: [],
17071
- checkpoint: y,
17072
- dataSlotOpsController: w,
17066
+ checkpoint: b,
17067
+ dataOpsController: D,
17073
17068
  pendingConflict: i,
17074
- liveDataSlots: T,
17069
+ liveData: O,
17075
17070
  applySnapshot(t) {
17076
17071
  t.messages?.length && f.push(...t.messages), t.vfs && p.hydrate && p.hydrate(t.vfs), t.todos?.length && m.reset(t.todos), t.memory && !e.memory && h.reset(t.memory);
17077
17072
  },
17078
17073
  afterRound() {
17079
- he(), ge();
17074
+ ve(), ye();
17080
17075
  },
17081
- async send(e) {
17082
- await B.initDone, f.push({
17076
+ async send(t) {
17077
+ await B.initDone;
17078
+ let n = t;
17079
+ if (e.interceptors?.input) try {
17080
+ let r = e.interceptors.input(t);
17081
+ typeof r == "string" && (n = r);
17082
+ } catch {}
17083
+ f.push({
17083
17084
  role: "user",
17084
- content: e,
17085
+ content: n,
17085
17086
  timestamp: Date.now()
17086
17087
  });
17087
17088
  try {
17088
- let e = await B.agent.invoke(f);
17089
+ let t = await B.agent.invoke(f);
17090
+ if (e.interceptors?.output) try {
17091
+ let n = e.interceptors.output(t);
17092
+ typeof n == "string" && (t = n);
17093
+ } catch {}
17089
17094
  return f.push({
17090
17095
  role: "assistant",
17091
- content: e,
17096
+ content: t,
17092
17097
  timestamp: Date.now()
17093
- }), B.afterRound(), c && await c.flush(), e;
17098
+ }), B.afterRound(), c && await c.flush(), t;
17094
17099
  } catch (e) {
17095
- throw de({
17100
+ throw me({
17096
17101
  type: "error",
17097
17102
  message: e?.message || String(e)
17098
17103
  }), e;
@@ -17106,8 +17111,8 @@ function gy(e, r) {
17106
17111
  },
17107
17112
  stream: (e, t, n) => {
17108
17113
  if (!B.agent) throw Error("page-agent-sdk: agent 尚未初始化完成,请先 await mount()");
17109
- let r = le ? (e) => {
17110
- t?.(e), de(e);
17114
+ let r = fe ? (e) => {
17115
+ t?.(e), me(e);
17111
17116
  } : t;
17112
17117
  if (n) {
17113
17118
  let e = () => s("keep_external");
@@ -17119,58 +17124,57 @@ function gy(e, r) {
17119
17124
  if (B.refCount--, B.refCount <= 0) {
17120
17125
  c && (p.flush?.(), c.flush(), c.dispose());
17121
17126
  let e = B.mcpClosers.splice(0);
17122
- e.length && Promise.allSettled(e.map((e) => e())), uy.delete(r);
17127
+ e.length && Promise.allSettled(e.map((e) => e())), hy.delete(r);
17123
17128
  }
17124
17129
  },
17125
17130
  resolveConflict: s,
17126
17131
  getInfo() {
17127
17132
  return {
17128
17133
  id: r,
17129
- model: ly(e.llm) ? e.llm.model ?? e.llm.modelName : e.llm.model,
17130
- systemPrompt: e.systemPrompt ?? oy,
17131
- tools: M.map((e) => ({
17134
+ model: my(e.llm) ? e.llm.model ?? e.llm.modelName : e.llm.model,
17135
+ systemPrompt: w,
17136
+ tools: F.map((e) => ({
17132
17137
  name: e.name,
17133
17138
  description: e.description,
17134
17139
  schema: e.schema,
17135
- source: E.get(e.name) || "user"
17140
+ source: k.get(e.name) || "user"
17136
17141
  })),
17137
17142
  skills: (e.skills ?? []).map((e) => ({
17138
17143
  name: e.name,
17139
17144
  description: e.description
17140
17145
  })),
17141
- dataSlots: T().map((e) => ({
17142
- path: e.path,
17143
- description: e.description,
17144
- schema: e.schema
17145
- })),
17146
+ data: O() ? {
17147
+ description: O().description,
17148
+ schema: O().schema
17149
+ } : void 0,
17146
17150
  memory: e.memory ?? "",
17147
- middleware: fe.map((e) => e.name),
17151
+ middleware: he.map((e) => e.name),
17148
17152
  todos: (B.agent?.getState?.()?.todos ?? []).map((e) => ({
17149
17153
  content: e.content,
17150
17154
  status: e.status
17151
17155
  })),
17152
17156
  subagent: {
17153
- enabled: !!re,
17157
+ enabled: !!oe,
17154
17158
  maxDepth: e.subagent?.maxDepth ?? 1,
17155
17159
  maxParallel: e.subagent?.maxParallel ?? 4,
17156
17160
  allowedTools: e.subagent?.allowedTools ?? []
17157
17161
  },
17158
17162
  verify: {
17159
- enabled: !!se,
17160
- maxAttempts: z ? R : 0,
17161
- adversarial: z && !!e.verify?.adversarial
17163
+ enabled: !!ue,
17164
+ maxAttempts: re ? ne : 0,
17165
+ adversarial: re && !!e.verify?.adversarial
17162
17166
  },
17163
17167
  mcp: { servers: B.mcpServers },
17164
17168
  lastCompression: B.agent?.getState?.()?.lastCompression,
17165
- checkpoints: y ? {
17169
+ checkpoints: b ? {
17166
17170
  enabled: !0,
17167
- auto: b,
17168
- list: y.list()
17171
+ auto: x,
17172
+ list: b.list()
17169
17173
  } : void 0
17170
17174
  };
17171
17175
  }
17172
17176
  };
17173
- async function me() {
17177
+ async function _e() {
17174
17178
  if (!c) return;
17175
17179
  await c.ready;
17176
17180
  let t = e.session || {};
@@ -17188,11 +17192,11 @@ function gy(e, r) {
17188
17192
  } else B.sessionId = await c.createSession(r, t.title);
17189
17193
  e.memory && c.save(r, B.sessionId, { memory: e.memory });
17190
17194
  }
17191
- function he() {
17192
- let e = E_(f, pe);
17195
+ function ve() {
17196
+ let e = E_(f, ge);
17193
17197
  e.trimmed && f.splice(e.deleteFrom, e.deleteCount, e.summary);
17194
17198
  }
17195
- function ge() {
17199
+ function ye() {
17196
17200
  if (!B.sessionId || !c) return;
17197
17201
  let t = JSON.parse(JSON.stringify(f));
17198
17202
  c.save(r, B.sessionId, { messages: t });
@@ -17200,7 +17204,7 @@ function gy(e, r) {
17200
17204
  c.save(r, B.sessionId, { todos: n }), e.debug && console.log("[page-agent-sdk][persist] save", B.sessionId, `${f.length} msgs`);
17201
17205
  }
17202
17206
  return B.initDone = (async () => {
17203
- if (await me(), e.mcp?.length) {
17207
+ if (await _e(), e.mcp?.length) {
17204
17208
  let t = await Promise.allSettled(e.mcp.map((e) => S_(e)));
17205
17209
  B.mcpClosers = t.flatMap((e) => e.status === "fulfilled" ? [e.value.close] : []), B.mcpServers = [];
17206
17210
  let n = [];
@@ -17210,35 +17214,35 @@ function gy(e, r) {
17210
17214
  name: a,
17211
17215
  url: i.url,
17212
17216
  toolCount: t.value.tools.length
17213
- }), t.value.tools.forEach((e) => E.set(e.name, `mcp:${a}`)), n.push(...t.value.tools)) : console.warn(`[page-agent-sdk][mcp] server ${a} 连接失败:`, t.reason);
17214
- }), M.push(...n), e.debug && console.log(`[page-agent-sdk][mcp] 注入 ${n.length} 个工具,${B.mcpServers.length} 个 server`);
17217
+ }), t.value.tools.forEach((e) => k.set(e.name, `mcp:${a}`)), n.push(...t.value.tools)) : console.warn(`[page-agent-sdk][mcp] server ${a} 连接失败:`, t.reason);
17218
+ }), F.push(...n), e.debug && console.log(`[page-agent-sdk][mcp] 注入 ${n.length} 个工具,${B.mcpServers.length} 个 server`);
17215
17219
  }
17216
17220
  B.agent = bg({
17217
- ...ly(e.llm) ? { llm: e.llm } : {
17221
+ ...my(e.llm) ? { llm: e.llm } : {
17218
17222
  apiKey: e.llm.apiKey,
17219
17223
  baseUrl: e.llm.baseUrl,
17220
17224
  model: e.llm.model,
17221
17225
  temperature: e.llm.temperature,
17222
17226
  maxTokens: e.llm.maxTokens
17223
17227
  },
17224
- systemPrompt: e.systemPrompt ?? oy,
17225
- tools: M,
17226
- middleware: fe,
17228
+ systemPrompt: w,
17229
+ tools: F,
17230
+ middleware: he,
17227
17231
  maxToolRounds: e.maxToolRounds,
17228
17232
  maxRetries: e.maxRetries,
17229
17233
  maxParallelTools: e.maxParallelTools,
17230
17234
  contextWindow: u.contextWindow,
17231
17235
  maxOutputTokens: u.maxOutputTokens,
17232
- maxVerifyAttempts: z ? R : 0,
17236
+ maxVerifyAttempts: re ? ne : 0,
17233
17237
  debug: e.debug
17234
17238
  }), g.current = B.agent;
17235
17239
  })(), B;
17236
17240
  }
17237
- function _y(e) {
17238
- let t = e.id ?? Fv();
17241
+ function xy(e) {
17242
+ let t = e.id ?? zv();
17239
17243
  e.id || console.warn(`[page-agent-sdk] 未传 options.id,已生成随机 id "${t}"。刷新后持久化数据无法恢复,请传稳定 id。`);
17240
- let n = e.streaming ?? !0, r = e.ui ?? "default", i, a = e.shareContext ? uy.get(t) : void 0;
17241
- a ? i = a : (i = gy(e, t), e.shareContext && uy.set(t, i)), i.refCount++;
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++;
17242
17246
  let o = null, s = null, c = null;
17243
17247
  async function l() {
17244
17248
  if (await i.initDone, r === !1) {
@@ -17273,7 +17277,7 @@ function _y(e) {
17273
17277
  i.afterRound(), i.store && await i.store.flush();
17274
17278
  },
17275
17279
  onClear: () => {
17276
- i.store && (i.sessionId = Fv(), 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));
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));
17277
17281
  },
17278
17282
  pendingConflict: i.pendingConflict.value,
17279
17283
  onResolveConflict: (e) => i.resolveConflict(e)
@@ -17298,22 +17302,21 @@ function _y(e) {
17298
17302
  restoreLastCheckpoint: () => i.checkpoint?.restore() ?? !1,
17299
17303
  listCheckpoints: () => i.checkpoint?.list() ?? [],
17300
17304
  hook: (e) => (i.listeners.add(e), () => i.listeners.delete(e)),
17301
- addDataSlot: (e) => {
17302
- if (!i.dataSlotOpsController) {
17303
- console.warn("[page-agent-sdk] addDataSlot 忽略:dataSlotOps 已关闭(capabilities.dataSlotOps:false)");
17305
+ setData: (e) => {
17306
+ if (!i.dataOpsController) {
17307
+ console.warn("[page-agent-sdk] setData 忽略:dataOps 已关闭(capabilities.dataOps:false)");
17304
17308
  return;
17305
17309
  }
17306
- i.dataSlotOpsController.add(e);
17310
+ i.dataOpsController.set(e);
17307
17311
  },
17308
- removeDataSlot: (e) => i.dataSlotOpsController ? i.dataSlotOpsController.remove(e) : !1,
17309
- listDataSlots: () => i.liveDataSlots(),
17312
+ getData: () => i.liveData(),
17310
17313
  pendingConflict: i.pendingConflict,
17311
17314
  resolveConflict: (e) => i.resolveConflict(e)
17312
17315
  };
17313
17316
  }
17314
17317
  //#endregion
17315
17318
  //#region src/core/sdk/defineTool.ts
17316
- function vy(e) {
17319
+ function Sy(e) {
17317
17320
  return n(async (t) => {
17318
17321
  let n = await e.handler(t);
17319
17322
  return typeof n == "string" ? n : JSON.stringify(n);
@@ -17324,4 +17327,4 @@ function vy(e) {
17324
17327
  });
17325
17328
  }
17326
17329
  //#endregion
17327
- 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, _y as createChatSdk, qg as createCheckpointManager, Jg as createCheckpointMiddleware, Dv as createDataSlotOps, Bg as createHumanConfirmMiddleware, zg as createHumanConfirmTool, ty as createMemoryBackend, ay as createSessionStore, n_ as createSubagentMiddleware, a_ as createSubagentsMiddleware, Pv as createUsageHintsMiddleware, o_ as createVerifyMiddleware, G_ as createVfs, ry as createWebStorageBackend, f_ as createWriteBackCheck, jv as defineDataSlotToolset, Cg as defineSkill, vy as defineTool, hg as detectGarbledToolCall, rg as estimateTokens, y_ as extractText, kv as fetchDocTools, Av as fetchTools, V_ as formatZodIssues, qv as isQuotaError, cv as jpEval, U_ as jsonParseError, ag as offloadPassThroughChars, ig as offloadThresholdChars, L_ as presets, B_ as resolveContextOptions, ng as resolveModelCaps, pv as runSandboxedScript, uv as searchJson, Mv as selectBuiltinTools, R_ as systemPromptHelpers, $ as toolError, xl as useChat, e as z, H_ as zodError };
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 };