page-agent-sdk 2.36.0 → 2.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -417,61 +417,61 @@ var Ue = {
417
417
  return We(this, "entries", (e) => (e[1] = He(this, e[1]), e));
418
418
  },
419
419
  every(e, t) {
420
- return H(this, "every", e, t, void 0, arguments);
420
+ return Ke(this, "every", e, t, void 0, arguments);
421
421
  },
422
422
  filter(e, t) {
423
- return H(this, "filter", e, t, (e) => e.map((e) => He(this, e)), arguments);
423
+ return Ke(this, "filter", e, t, (e) => e.map((e) => He(this, e)), arguments);
424
424
  },
425
425
  find(e, t) {
426
- return H(this, "find", e, t, (e) => He(this, e), arguments);
426
+ return Ke(this, "find", e, t, (e) => He(this, e), arguments);
427
427
  },
428
428
  findIndex(e, t) {
429
- return H(this, "findIndex", e, t, void 0, arguments);
429
+ return Ke(this, "findIndex", e, t, void 0, arguments);
430
430
  },
431
431
  findLast(e, t) {
432
- return H(this, "findLast", e, t, (e) => He(this, e), arguments);
432
+ return Ke(this, "findLast", e, t, (e) => He(this, e), arguments);
433
433
  },
434
434
  findLastIndex(e, t) {
435
- return H(this, "findLastIndex", e, t, void 0, arguments);
435
+ return Ke(this, "findLastIndex", e, t, void 0, arguments);
436
436
  },
437
437
  forEach(e, t) {
438
- return H(this, "forEach", e, t, void 0, arguments);
438
+ return Ke(this, "forEach", e, t, void 0, arguments);
439
439
  },
440
440
  includes(...e) {
441
- return U(this, "includes", e);
441
+ return qe(this, "includes", e);
442
442
  },
443
443
  indexOf(...e) {
444
- return U(this, "indexOf", e);
444
+ return qe(this, "indexOf", e);
445
445
  },
446
446
  join(e) {
447
447
  return Be(this).join(e);
448
448
  },
449
449
  lastIndexOf(...e) {
450
- return U(this, "lastIndexOf", e);
450
+ return qe(this, "lastIndexOf", e);
451
451
  },
452
452
  map(e, t) {
453
- return H(this, "map", e, t, void 0, arguments);
453
+ return Ke(this, "map", e, t, void 0, arguments);
454
454
  },
455
455
  pop() {
456
- return qe(this, "pop");
456
+ return U(this, "pop");
457
457
  },
458
458
  push(...e) {
459
- return qe(this, "push", e);
459
+ return U(this, "push", e);
460
460
  },
461
461
  reduce(e, ...t) {
462
- return Ke(this, "reduce", e, t);
462
+ return H(this, "reduce", e, t);
463
463
  },
464
464
  reduceRight(e, ...t) {
465
- return Ke(this, "reduceRight", e, t);
465
+ return H(this, "reduceRight", e, t);
466
466
  },
467
467
  shift() {
468
- return qe(this, "shift");
468
+ return U(this, "shift");
469
469
  },
470
470
  some(e, t) {
471
- return H(this, "some", e, t, void 0, arguments);
471
+ return Ke(this, "some", e, t, void 0, arguments);
472
472
  },
473
473
  splice(...e) {
474
- return qe(this, "splice", e);
474
+ return U(this, "splice", e);
475
475
  },
476
476
  toReversed() {
477
477
  return Be(this).toReversed();
@@ -483,7 +483,7 @@ var Ue = {
483
483
  return Be(this).toSpliced(...e);
484
484
  },
485
485
  unshift(...e) {
486
- return qe(this, "unshift", e);
486
+ return U(this, "unshift", e);
487
487
  },
488
488
  values() {
489
489
  return We(this, "values", (e) => He(this, e));
@@ -497,7 +497,7 @@ function We(e, t, n) {
497
497
  }), i;
498
498
  }
499
499
  var Ge = Array.prototype;
500
- function H(e, t, n, r, i, a) {
500
+ function Ke(e, t, n, r, i, a) {
501
501
  let o = Ve(e), s = o !== e && !/* @__PURE__ */ Ct(e), c = o[t];
502
502
  if (c !== Ge[t]) {
503
503
  let t = c.apply(e, a);
@@ -512,7 +512,7 @@ function H(e, t, n, r, i, a) {
512
512
  let u = c.call(o, l, r);
513
513
  return s && i ? i(u) : u;
514
514
  }
515
- function Ke(e, t, n, r) {
515
+ function H(e, t, n, r) {
516
516
  let i = Ve(e), a = i !== e && !/* @__PURE__ */ Ct(e), o = n, s = !1;
517
517
  i !== e && (a ? (s = r.length === 0, o = function(t, r, i) {
518
518
  return s && (s = !1, t = He(e, t)), n.call(this, t, He(e, r), i, e);
@@ -522,13 +522,13 @@ function Ke(e, t, n, r) {
522
522
  let c = i[t](o, ...r);
523
523
  return s ? He(e, c) : c;
524
524
  }
525
- function U(e, t, n) {
525
+ function qe(e, t, n) {
526
526
  let r = /* @__PURE__ */ G(e);
527
527
  V(r, "iterate", Re);
528
528
  let i = r[t](...n);
529
529
  return (i === -1 || i === !1) && /* @__PURE__ */ wt(n[0]) ? (n[0] = /* @__PURE__ */ G(n[0]), r[t](...n)) : i;
530
530
  }
531
- function qe(e, t, n = []) {
531
+ function U(e, t, n = []) {
532
532
  Oe(), ye();
533
533
  let r = (/* @__PURE__ */ G(e))[t].apply(e, n);
534
534
  return B(), ke(), r;
@@ -598,10 +598,10 @@ var Ze = class {
598
598
  deleteProperty(e, t) {
599
599
  return process.env.NODE_ENV !== "production" && de(`Delete operation on key "${String(t)}" failed: target is readonly.`, e), !0;
600
600
  }
601
- }, et = /* @__PURE__ */ new Qe(), tt = /* @__PURE__ */ new $e(), nt = /* @__PURE__ */ new $e(!0), W = (e) => e, rt = (e) => Reflect.getPrototypeOf(e);
601
+ }, et = /* @__PURE__ */ new Qe(), tt = /* @__PURE__ */ new $e(), nt = /* @__PURE__ */ new $e(!0), rt = (e) => e, W = (e) => Reflect.getPrototypeOf(e);
602
602
  function it(e, t, n) {
603
603
  return function(...r) {
604
- let i = this.__v_raw, a = /* @__PURE__ */ G(i), o = E(a), s = e === "entries" || e === Symbol.iterator && o, c = e === "keys" && o, l = i[e](...r), u = n ? W : t ? Dt : Et;
604
+ let i = this.__v_raw, a = /* @__PURE__ */ G(i), o = E(a), s = e === "entries" || e === Symbol.iterator && o, c = e === "keys" && o, l = i[e](...r), u = n ? rt : t ? Dt : Et;
605
605
  return !t && V(a, "iterate", c ? Le : Ie), x(Object.create(l), { next() {
606
606
  let { value: e, done: t } = l.next();
607
607
  return t ? {
@@ -628,7 +628,7 @@ function ot(e, t) {
628
628
  get(n) {
629
629
  let r = this.__v_raw, i = /* @__PURE__ */ G(r), a = /* @__PURE__ */ G(n);
630
630
  e || (ie(n, a) && V(i, "get", n), V(i, "get", a));
631
- let { has: o } = rt(i), s = t ? W : e ? Dt : Et;
631
+ let { has: o } = W(i), s = t ? rt : e ? Dt : Et;
632
632
  if (o.call(i, n)) return s(r.get(n));
633
633
  if (o.call(i, a)) return s(r.get(a));
634
634
  r !== i && r.get(n);
@@ -642,7 +642,7 @@ function ot(e, t) {
642
642
  return e || (ie(t, i) && V(r, "has", t), V(r, "has", i)), t === i ? n.has(t) : n.has(t) || n.has(i);
643
643
  },
644
644
  forEach(n, r) {
645
- let i = this, a = i.__v_raw, o = /* @__PURE__ */ G(a), s = t ? W : e ? Dt : Et;
645
+ let i = this, a = i.__v_raw, o = /* @__PURE__ */ G(a), s = t ? rt : e ? Dt : Et;
646
646
  return !e && V(o, "iterate", Ie), a.forEach((e, t) => n.call(r, s(e), s(t), i));
647
647
  }
648
648
  };
@@ -653,18 +653,18 @@ function ot(e, t) {
653
653
  clear: at("clear")
654
654
  } : {
655
655
  add(e) {
656
- let n = /* @__PURE__ */ G(this), r = rt(n), i = /* @__PURE__ */ G(e), a = !t && !/* @__PURE__ */ Ct(e) && !/* @__PURE__ */ St(e) ? i : e;
656
+ let n = /* @__PURE__ */ G(this), r = W(n), i = /* @__PURE__ */ G(e), a = !t && !/* @__PURE__ */ Ct(e) && !/* @__PURE__ */ St(e) ? i : e;
657
657
  return r.has.call(n, a) || ie(e, a) && r.has.call(n, e) || ie(i, a) && r.has.call(n, i) || (n.add(a), ze(n, "add", a, a)), this;
658
658
  },
659
659
  set(e, n) {
660
660
  !t && !/* @__PURE__ */ Ct(n) && !/* @__PURE__ */ St(n) && (n = /* @__PURE__ */ G(n));
661
- let r = /* @__PURE__ */ G(this), { has: i, get: a } = rt(r), o = i.call(r, e);
661
+ let r = /* @__PURE__ */ G(this), { has: i, get: a } = W(r), o = i.call(r, e);
662
662
  o ? process.env.NODE_ENV !== "production" && dt(r, i, e) : (e = /* @__PURE__ */ G(e), o = i.call(r, e));
663
663
  let s = a.call(r, e);
664
664
  return r.set(e, n), o ? ie(n, s) && ze(r, "set", e, n, s) : ze(r, "add", e, n), this;
665
665
  },
666
666
  delete(e) {
667
- let t = /* @__PURE__ */ G(this), { has: n, get: r } = rt(t), i = n.call(t, e);
667
+ let t = /* @__PURE__ */ G(this), { has: n, get: r } = W(t), i = n.call(t, e);
668
668
  i ? process.env.NODE_ENV !== "production" && dt(t, n, e) : (e = /* @__PURE__ */ G(e), i = n.call(t, e));
669
669
  let a = r ? r.call(t, e) : void 0, o = t.delete(e);
670
670
  return i && ze(t, "delete", e, void 0, a), o;
@@ -3926,66 +3926,352 @@ function $a(e) {
3926
3926
  };
3927
3927
  }
3928
3928
  //#endregion
3929
- //#region src/core/harness/subagent.ts
3929
+ //#region src/core/utils/rounds.ts
3930
3930
  function eo(e) {
3931
+ let t = [], n = null, r = 0;
3932
+ for (let i = 0; i < e.length; i++) {
3933
+ let a = e[i];
3934
+ a.role === "user" ? (n && t.push(n), r++, n = {
3935
+ round: r,
3936
+ userMsg: a,
3937
+ assistantMsgs: [],
3938
+ startIdx: i,
3939
+ endIdx: i
3940
+ }) : n && (n.assistantMsgs.push(a), n.endIdx = i);
3941
+ }
3942
+ return n && t.push(n), t;
3943
+ }
3944
+ function to(e, t) {
3945
+ let n = (e || "").replace(/```[\s\S]*?```/g, "[代码]").replace(/`([^`]+)`/g, "$1").replace(/[#*_>\-]\s?/g, "").replace(/\[(代码)\]/g, "「代码」").replace(/\s+/g, " ").trim();
3946
+ return n.length > t ? n.slice(0, t) + "…" : n;
3947
+ }
3948
+ function no(e) {
3949
+ let t = [];
3950
+ for (let n of e.assistantMsgs) for (let e of n.steps || []) t.push(e.name);
3951
+ return t;
3952
+ }
3953
+ var ro = "【更早对话摘要";
3954
+ function io(e, t) {
3955
+ return !t || !t.body ? e : {
3956
+ body: `${t.body}\n【续】\n${e.body}`,
3957
+ rounds: (t.rounds ?? 0) + (e.rounds ?? 0),
3958
+ cumulative: !0
3959
+ };
3960
+ }
3961
+ function ao(e) {
3962
+ return typeof e != "string" || !e.startsWith("【更早对话摘要") ? null : { body: e.replace(/^【[^】]*】\n?/, "") };
3963
+ }
3964
+ function oo(e) {
3965
+ return `${ro}${e.cumulative ? `(${e.rounds ?? 0} 轮,含累积)` : e.rounds ? `(${e.rounds} 轮)` : ""}】\n${e.body}`;
3966
+ }
3967
+ function so(e, t, n) {
3968
+ return oo(io({
3969
+ body: n,
3970
+ rounds: e.length
3971
+ }, t ?? void 0));
3972
+ }
3973
+ function co(e, t) {
3974
+ if (t <= 0) return { trimmed: !1 };
3975
+ let n = eo(e);
3976
+ if (n.length <= t) return { trimmed: !1 };
3977
+ let r = n[n.length - t].startIdx, i = n.slice(0, n.length - t), a = n[0].startIdx, o = null;
3978
+ for (let t = 0; t < a; t++) {
3979
+ let n = e[t];
3980
+ if (n.role === "system" && (o = ao(n.content), o)) break;
3981
+ }
3982
+ return {
3983
+ trimmed: !0,
3984
+ deleteFrom: 0,
3985
+ deleteCount: r,
3986
+ summary: {
3987
+ role: "system",
3988
+ content: oo(io({
3989
+ body: i.map((e) => {
3990
+ let t = to(e.userMsg.content, 60) || "(空)", n = e.assistantMsgs[0] ? to(e.assistantMsgs[0].content, 80) : "(无回复)";
3991
+ return `- 第${e.round}轮:${t} → ${n}`;
3992
+ }).join("\n"),
3993
+ rounds: i.length
3994
+ }, o ?? void 0)),
3995
+ timestamp: i[0].userMsg.timestamp
3996
+ },
3997
+ older: i,
3998
+ prevSeg: o
3999
+ };
4000
+ }
4001
+ //#endregion
4002
+ //#region src/core/composables/contextIndex.ts
4003
+ var lo = /* @__PURE__ */ new Set(/* @__PURE__ */ "的.了.是.在.我.你.他.她.它.这.那.和.与.及.或.一个.什么.怎么.如何.为什么.可以.能.请.帮.一下.需要.想要.the.a.an.is.are.of.to.in.on".split("."));
4004
+ function uo(e) {
4005
+ return e.toLowerCase().split(/[^a-z0-9一-龥]+/i).map((e) => e.trim()).filter((e) => e.length >= 2 && !lo.has(e));
4006
+ }
4007
+ function fo(e) {
4008
+ let t = typeof e.content == "string" ? e.content : "";
4009
+ if (e.reasoning && (t += e.reasoning), e.steps) for (let n of e.steps) t += " " + (n.name || ""), n.args != null && (t += " " + (typeof n.args == "string" ? n.args : JSON.stringify(n.args))), n.result && (t += " " + n.result);
4010
+ return X(t);
4011
+ }
4012
+ function po(e) {
4013
+ let t = fo(e.userMsg);
4014
+ for (let n of e.assistantMsgs) t += fo(n);
4015
+ return t;
4016
+ }
4017
+ function mo(e, t) {
4018
+ return e.map((e) => {
4019
+ let n = to(e.userMsg.content, 60) || "(空)", r = e.assistantMsgs[0] ? to(e.assistantMsgs[0].content, 80) : "(无回复)", i = e.assistantMsgs.flatMap((e) => (e.steps || []).map((e) => e.name)), a = i.length ? ` [工具: ${i.join(", ")}]` : "", o = "";
4020
+ if (t && t.size) {
4021
+ let n = [];
4022
+ for (let r of e.assistantMsgs) for (let e of r.steps || []) e.name && t.has(e.name) && e.result && n.push(`${e.name}: ${to(e.result, 120)}`);
4023
+ n.length && (o = `\n 字段提示: ${n.join(" | ")}`);
4024
+ }
4025
+ return `- 第${e.round}轮:${n} → ${r}${a}${o}`;
4026
+ }).join("\n");
4027
+ }
4028
+ function ho(e, t, n) {
4029
+ let r = uo(t);
4030
+ return r.length === 0 ? [] : e.map((e) => {
4031
+ let t = (e.userMsg.content + " " + e.assistantMsgs.map((e) => e.content).join(" ") + " " + e.assistantMsgs.flatMap((e) => (e.steps || []).map((e) => to(e.result || "", 120))).join(" ")).toLowerCase(), n = 0;
4032
+ for (let e of r) t.includes(e) && n++;
4033
+ return {
4034
+ r: e,
4035
+ score: n
4036
+ };
4037
+ }).filter((e) => e.score > 0).sort((e, t) => t.score - e.score).slice(0, n).map((e) => e.r);
4038
+ }
4039
+ function go(e, t) {
4040
+ return t.contextWindow && t.contextWindow > 0 ? e.reduce((e, t) => e + po(t), 0) > t.contextWindow * (t.summaryThresholdRatio ?? .5) : e.length > (t.summaryThresholdRounds ?? 8);
4041
+ }
4042
+ //#endregion
4043
+ //#region src/core/composables/useContextManager.ts
4044
+ var _o = {
4045
+ windowRounds: 6,
4046
+ summaryThresholdRounds: 8,
4047
+ toolResultMaxChars: 800,
4048
+ enableRecall: !0,
4049
+ recallTopK: 3,
4050
+ enableLLMSummary: !1
4051
+ };
4052
+ function vo(e = {}) {
4053
+ let t = {
4054
+ ..._o,
4055
+ ...e
4056
+ };
4057
+ async function n(e, n) {
4058
+ let r = eo(e), i = e.length, a = "";
4059
+ if (r.length) {
4060
+ let t = r[0].startIdx;
4061
+ for (let n = 0; n < t; n++) {
4062
+ let t = e[n];
4063
+ if (t.role === "system") {
4064
+ let e = ao(t.content);
4065
+ if (e) {
4066
+ a = e.body;
4067
+ break;
4068
+ }
4069
+ }
4070
+ }
4071
+ }
4072
+ let o = (t) => ({
4073
+ messages: e,
4074
+ stats: {
4075
+ triggered: !1,
4076
+ roundsTotal: r.length,
4077
+ roundsSummarized: 0,
4078
+ roundsRecalled: 0,
4079
+ originalMessages: i,
4080
+ compressedMessages: i,
4081
+ strategy: t
4082
+ }
4083
+ });
4084
+ if (!go(r, t)) return o("none");
4085
+ let s, c, l;
4086
+ if (t.contextWindow && t.contextWindow > 0) {
4087
+ let e = t.contextWindow * (n?.windowRatio ?? t.windowRatio ?? .4), i = 0, a = 0;
4088
+ for (let t = r.length - 1; t >= 0; t--) if (i += po(r[t]), i >= e) {
4089
+ a = t + 1;
4090
+ break;
4091
+ }
4092
+ if (a > r.length - 1 && (a = r.length - 1), a < 0 && (a = 0), s = r.slice(a), c = r.slice(0, a), !c.length) return o("none");
4093
+ l = "token-window+";
4094
+ } else {
4095
+ let e = n?.keepRounds ?? t.windowRounds, i = Math.min(Math.max(1, e), r.length);
4096
+ if (s = r.slice(r.length - i), c = r.slice(0, r.length - i), !c.length) return o("none");
4097
+ l = "window+";
4098
+ }
4099
+ let u = [...e].reverse().find((e) => e.role === "user")?.content || "", d = n?.summarize?.mode ?? (t.enableLLMSummary ? "llm" : "index"), f = /* @__PURE__ */ new Set([...t.preserveLastToolResults ?? [], ...n?.preserveTools ?? []]), p = f.size ? f : void 0, m, h;
4100
+ if (d === "llm" && t.llmInvoke) try {
4101
+ m = await t.llmInvoke(mo(c, p)), h = l + "llm_summary";
4102
+ } catch {
4103
+ m = mo(c, p), h = l + "index_summary(llm_fallback)";
4104
+ }
4105
+ else m = mo(c, p), h = l + "index_summary";
4106
+ let g = n?.recallTopK == null ? t.enableRecall ? t.recallTopK : 0 : n.recallTopK, _ = g > 0 ? ho(c, u, g) : [], v = _.length ? _.map((e) => `- 第${e.round}轮:${to(e.userMsg.content, 60)} → ${e.assistantMsgs[0] ? to(e.assistantMsgs[0].content, 80) : ""}`).join("\n") : "", y = a ? `${m}\n【更早累积摘要】\n${a}` : m, b = [`【对话历史摘要】以下是之前 ${c.length} 轮对话的要点(最新 ${s.length} 轮已完整保留):`, y];
4107
+ if (n) {
4108
+ let e = t.contextWindow && t.contextWindow > 0 ? `windowRatio=${n.windowRatio ?? t.windowRatio}` : `keepRounds=${n.keepRounds ?? t.windowRounds}`;
4109
+ b.push(`\n(压缩决策:${e} · 摘要=${n.summarize.mode} · 召回=${g}${n.reason ? " · " + n.reason : ""})`);
4110
+ }
4111
+ v && b.push("\n【与当前问题可能相关的早期对话】", v);
4112
+ let x = t.getRegisteredData ?? t.getRegisteredSlots;
4113
+ if (x) try {
4114
+ let e = x();
4115
+ if (e.length) {
4116
+ let t = e.map((e) => `- ${e.path ? e.path + ": " : ""}${e.description}`).join("\n");
4117
+ b.push("\n【当前可操作数据(动态增删后的最新状态,操作前以 describe_data / read 为准)】", t);
4118
+ }
4119
+ } catch {}
4120
+ let S = {
4121
+ role: "system",
4122
+ content: b.join("\n"),
4123
+ timestamp: Date.now()
4124
+ }, C = [];
4125
+ for (let e of s) C.push(e.userMsg), C.push(...e.assistantMsgs);
4126
+ let w = [S, ...C], T = w.reduce((e, t) => e + X(typeof t.content == "string" ? t.content : JSON.stringify(t.content)), 0);
4127
+ return t.contextWindow && T > t.contextWindow && console.warn(`[page-agent-sdk] compress 后仍超窗口:${T} > ${t.contextWindow} tokens(单条消息超窗口,compress 无法压)`), {
4128
+ messages: w,
4129
+ stats: {
4130
+ triggered: !0,
4131
+ roundsTotal: r.length,
4132
+ roundsSummarized: c.length,
4133
+ roundsRecalled: _.length,
4134
+ originalMessages: i,
4135
+ compressedMessages: w.length,
4136
+ strategy: h,
4137
+ decision: n
4138
+ }
4139
+ };
4140
+ }
4141
+ return {
4142
+ compress: n,
4143
+ config: t
4144
+ };
4145
+ }
4146
+ //#endregion
4147
+ //#region src/core/harness/summarization.ts
4148
+ function yo(e = {}) {
4149
+ let t = vo(e);
4150
+ return Object.assign({
4151
+ name: "summarization",
4152
+ compressInput: async (n) => {
4153
+ let r;
4154
+ if (e.decideInvoke) {
4155
+ let i = eo(n);
4156
+ if (go(i, t.config)) {
4157
+ let a = t.config.contextWindow && t.config.contextWindow > 0 ? "token" : "rounds", o = a === "token" ? `历史 token 超阈值 ${Math.round((t.config.contextWindow ?? 0) * (t.config.summaryThresholdRatio ?? .5))}` : `轮数 ${i.length} 超阈值 ${t.config.summaryThresholdRounds}`;
4158
+ try {
4159
+ r = await e.decideInvoke({
4160
+ getMessages: () => n,
4161
+ getSnapshot: e.getSnapshot,
4162
+ contextWindow: t.config.contextWindow,
4163
+ thresholdRatio: t.config.summaryThresholdRatio,
4164
+ triggerReason: o,
4165
+ triggerMode: a
4166
+ }) ?? void 0;
4167
+ } catch {
4168
+ r = void 0;
4169
+ }
4170
+ }
4171
+ }
4172
+ let { messages: i, stats: a } = await t.compress(n, r);
4173
+ return {
4174
+ messages: i,
4175
+ stats: a
4176
+ };
4177
+ }
4178
+ }, { setContextWindow(e) {
4179
+ t.config.contextWindow = e;
4180
+ } });
4181
+ }
4182
+ //#endregion
4183
+ //#region src/core/harness/subagent.ts
4184
+ function bo(e = 20) {
4185
+ let t = /* @__PURE__ */ new Map(), n = [];
4186
+ return {
4187
+ start(e, n, r, i) {
4188
+ t.set(e, {
4189
+ taskId: e,
4190
+ task: n,
4191
+ label: r,
4192
+ status: "running",
4193
+ steps: [],
4194
+ startedAt: i
4195
+ });
4196
+ },
4197
+ pushStep(e, n) {
4198
+ let r = t.get(e);
4199
+ r && r.steps.push(n);
4200
+ },
4201
+ finish(r, i, a) {
4202
+ let o = t.get(r);
4203
+ if (o) for (o.status = i, o.durationMs = Date.now() - o.startedAt, o.resultPreview = a.length > 120 ? a.slice(0, 120) + "…" : a, t.delete(r), n.unshift(o); n.length > e;) n.pop();
4204
+ },
4205
+ getActive() {
4206
+ return [...t.values()];
4207
+ },
4208
+ getHistory() {
4209
+ return [...n];
4210
+ }
4211
+ };
4212
+ }
4213
+ function xo(e) {
3931
4214
  return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
3932
4215
  }
3933
- var to = [
4216
+ var So = [
3934
4217
  "describe_data",
3935
4218
  "get_data",
3936
4219
  "read",
3937
4220
  "query_data",
3938
4221
  "search_data",
3939
4222
  "fetch_document"
3940
- ], no = 1, ro = 4, io = 6, ao = ["spawn_agent", "spawn_agents"], oo = [
4223
+ ], Co = 1, wo = 4, To = 6, Eo = ["spawn_agent", "spawn_agents"], Do = [
3941
4224
  "write",
3942
4225
  "set_data",
3943
4226
  "edit_data",
3944
4227
  "delete_data",
3945
4228
  "draft_commit"
3946
4229
  ];
3947
- function so(e) {
4230
+ function Oo(e) {
3948
4231
  let t = [];
3949
4232
  if (typeof e.jsonPath == "string" && e.jsonPath && t.push(e.jsonPath), typeof e.path == "string" && e.path && t.push(e.path), e.patch && typeof e.patch.jsonPath == "string" && t.push(e.patch.jsonPath), Array.isArray(e.patches)) for (let n of e.patches) n && typeof n.jsonPath == "string" && t.push(n.jsonPath);
3950
4233
  return t;
3951
4234
  }
3952
- function co(e, t) {
4235
+ function ko(e, t) {
3953
4236
  return t.some((t) => e === t || e.startsWith(t + ".") || e.startsWith(t + "["));
3954
4237
  }
3955
- function lo(e, t) {
4238
+ function Ao(e, t) {
3956
4239
  let n = e.invoke.bind(e), r = async (e) => {
3957
- let r = so(e);
4240
+ let r = Oo(e);
3958
4241
  if (!r.length) return `PATH_OUT_OF_SCOPE:子 agent 仅可增量 patch(writablePaths: ${t.join(", ")}),不能整体替换(无 jsonPath)。用 write({patch:{jsonPath,...}}) 增量改。`;
3959
- for (let e of r) if (!co(e, t)) return `PATH_OUT_OF_SCOPE:子 agent 写 "${e}" 越界(仅可写 ${t.join(", ")})。`;
4242
+ for (let e of r) if (!ko(e, t)) return `PATH_OUT_OF_SCOPE:子 agent 写 "${e}" 越界(仅可写 ${t.join(", ")})。`;
3960
4243
  return n(e);
3961
4244
  };
3962
4245
  return new Proxy(e, { get(e, t, n) {
3963
4246
  return t === "invoke" ? r : Reflect.get(e, t, n);
3964
4247
  } });
3965
4248
  }
3966
- async function uo(e, t, n, r, i) {
3967
- let a = t.depth ?? 0, o = t.maxDepth ?? no, s = /* @__PURE__ */ new Set([...to, ...t.allowedTools ?? []]), c = () => typeof t.allTools == "function" ? t.allTools() : t.allTools, l = [...c().filter((e) => s.has(e.name) && !ao.includes(e.name)), ...t.extraTools ?? []];
4249
+ async function jo(e, t, n, r, i) {
4250
+ let a = t.depth ?? 0, o = t.maxDepth ?? Co, s = /* @__PURE__ */ new Set([...So, ...t.allowedTools ?? []]), c = () => typeof t.allTools == "function" ? t.allTools() : t.allTools, l = [...c().filter((e) => s.has(e.name) && !Eo.includes(e.name)), ...t.extraTools ?? []];
3968
4251
  if (t.writablePaths?.length) {
3969
- l = l.filter((e) => !oo.includes(e.name));
3970
- let e = c().filter((e) => oo.includes(e.name) && !ao.includes(e.name)).map((e) => lo(e, t.writablePaths));
4252
+ l = l.filter((e) => !Do.includes(e.name));
4253
+ let e = c().filter((e) => Do.includes(e.name) && !Eo.includes(e.name)).map((e) => Ao(e, t.writablePaths));
3971
4254
  l = [...l, ...e];
3972
4255
  }
3973
- let u = a + 1 < o ? [fo({
4256
+ let u = a + 1 < o ? [Mo({
3974
4257
  ...t,
3975
4258
  depth: a + 1
3976
4259
  })] : [], d = t.getFocuses?.() ?? [], f = d.length ? pa({
3977
4260
  getSchema: t.getSchema ?? (() => null),
3978
4261
  initialFocuses: d
3979
4262
  }) : void 0, p = ni({
3980
- model: eo(t.llm) ? t.llm.model ?? t.llm.modelName : e.model ?? t.llm.model,
4263
+ model: xo(t.llm) ? t.llm.model ?? t.llm.modelName : e.model ?? t.llm.model,
3981
4264
  contextWindow: t.llm.contextWindow,
3982
4265
  maxOutputTokens: t.llm.maxOutputTokens
3983
4266
  });
3984
4267
  if (p.contextWindow < 2e5) throw Error(`[page-agent-sdk][subagent] 子 agent 模型上下文窗口 ${p.contextWindow} 小于最小支持 ${ti}(需 ≥200K 窗口模型)`);
3985
- let m = ji({
4268
+ let m = t.summarization === void 0 ? void 0 : yo(typeof t.summarization == "object" ? {
4269
+ contextWindow: p.contextWindow,
4270
+ ...t.summarization
4271
+ } : { contextWindow: p.contextWindow }), h = ji({
3986
4272
  contextWindow: p.contextWindow,
3987
4273
  maxOutputTokens: p.maxOutputTokens,
3988
- ...eo(t.llm) ? { llm: t.llm } : {
4274
+ ...xo(t.llm) ? { llm: t.llm } : {
3989
4275
  apiKey: t.llm.apiKey,
3990
4276
  baseUrl: t.llm.baseUrl,
3991
4277
  model: e.model ?? t.llm.model,
@@ -3996,14 +4282,16 @@ async function uo(e, t, n, r, i) {
3996
4282
  tools: l,
3997
4283
  middleware: [
3998
4284
  ...t.skills?.length ? [Na(t.skills)] : [],
4285
+ ...m ? [m] : [],
3999
4286
  ...u,
4000
- ...f ? [f] : []
4287
+ ...f ? [f] : [],
4288
+ ...t.middleware ?? []
4001
4289
  ],
4002
- maxToolRounds: t.maxToolRounds ?? io,
4290
+ maxToolRounds: t.maxToolRounds ?? To,
4003
4291
  onLog: i,
4004
4292
  debug: t.debug
4005
4293
  });
4006
- return t.debug && console.log(`[subagent] 启动子 agent(depth=${a},工具 ${l.length} 个)`), m.stream([{
4294
+ return t.debug && console.log(`[subagent] 启动子 agent(depth=${a},工具 ${l.length} 个)`), h.stream([{
4007
4295
  role: "user",
4008
4296
  content: e.prompt,
4009
4297
  timestamp: Date.now()
@@ -4011,17 +4299,21 @@ async function uo(e, t, n, r, i) {
4011
4299
  r && (e.type === "tool_call" || e.type === "tool_result") && r(e);
4012
4300
  }, n);
4013
4301
  }
4014
- function fo(e) {
4015
- let n = e.maxParallel ?? ro, i, a, o, s = (e, t) => (n) => {
4016
- a && a({
4302
+ function Mo(e) {
4303
+ let n = e.maxParallel ?? wo, i, a, o, s = (t, n) => (r) => {
4304
+ e.tracker?.pushStep(t, {
4305
+ kind: r.type,
4306
+ name: r.name,
4307
+ ts: Date.now()
4308
+ }), a && a({
4017
4309
  type: "subagent",
4018
- taskId: e,
4019
- label: t,
4020
- kind: n.type,
4021
- name: n.name,
4022
- args: n.type === "tool_call" ? n.args : void 0,
4023
- result: n.type === "tool_result" ? n.result : void 0,
4024
- status: n.type === "tool_result" ? n.status : void 0
4310
+ taskId: t,
4311
+ label: n,
4312
+ kind: r.type,
4313
+ name: r.name,
4314
+ args: r.type === "tool_call" ? r.args : void 0,
4315
+ result: r.type === "tool_result" ? r.result : void 0,
4316
+ status: r.type === "tool_result" ? r.status : void 0
4025
4317
  });
4026
4318
  };
4027
4319
  return {
@@ -4031,15 +4323,21 @@ function fo(e) {
4031
4323
  ...e,
4032
4324
  ...r?.length ? { allowedTools: r } : {},
4033
4325
  ...a?.length ? { writablePaths: a } : {}
4034
- } : e, u = `sub-${Math.random().toString(36).slice(2, 8)}`, d = n?.trim() || "子任务";
4035
- return await uo({
4036
- prompt: t,
4037
- role: n,
4038
- model: c
4039
- }, l, i, s(u, d), (e) => o?.({
4326
+ } : e, u = `sub-${Math.random().toString(36).slice(2, 8)}`, d = n?.trim() || "子任务", f = (e) => o?.({
4040
4327
  ...e,
4041
4328
  source: `子:${d}`
4042
- }));
4329
+ }), p = Date.now();
4330
+ e.tracker?.start(u, t, d, p);
4331
+ try {
4332
+ let r = await jo({
4333
+ prompt: t,
4334
+ role: n,
4335
+ model: c
4336
+ }, l, i, s(u, d), f);
4337
+ return e.tracker?.finish(u, "done", r), r;
4338
+ } catch (t) {
4339
+ throw e.tracker?.finish(u, "error", String(t?.message ?? t)), t;
4340
+ }
4043
4341
  }, {
4044
4342
  name: "spawn_agent",
4045
4343
  description: "委派一个独立子 agent 执行子任务,返回其最终结论(过程隔离,不占主上下文)。用于:分治大任务、专项调研、独立验证。子 agent 默认只读(不改页面)。",
@@ -4051,11 +4349,17 @@ function fo(e) {
4051
4349
  model: t.string().optional().describe("覆盖模型(默认同主)")
4052
4350
  })
4053
4351
  }), r(async ({ tasks: t }) => (await Qr(t, n, async (t, n) => {
4054
- let r = `sub-${n}-${Math.random().toString(36).slice(2, 6)}`, a = t.role?.trim() || `子任务${n + 1}`;
4055
- return uo(t, e, i, s(r, a), (e) => o?.({
4352
+ let r = `sub-${n}-${Math.random().toString(36).slice(2, 6)}`, a = t.role?.trim() || `子任务${n + 1}`, c = (e) => o?.({
4056
4353
  ...e,
4057
4354
  source: `子:${a}`
4058
- }));
4355
+ }), l = Date.now();
4356
+ e.tracker?.start(r, t.prompt, a, l);
4357
+ try {
4358
+ let n = await jo(t, e, i, s(r, a), c);
4359
+ return e.tracker?.finish(r, "done", n ?? "(未完成)"), n;
4360
+ } catch (t) {
4361
+ throw e.tracker?.finish(r, "error", String(t?.message ?? t)), t;
4362
+ }
4059
4363
  }, i)).map((e, t) => `【子任务 ${t + 1}】\n${e ?? "(未完成)"}`).join("\n\n"), {
4060
4364
  name: "spawn_agents",
4061
4365
  description: "并行委派多个独立子 agent,聚合各自结论(子 agent 间互不通信,由你汇总)。适合:多路调研、多视角审查、批量处理。",
@@ -4067,8 +4371,8 @@ function fo(e) {
4067
4371
  wrapToolCall: async (e, t) => (e.signal && (i = e.signal), e.emit && (a = e.emit), e.logSink && (o = e.logSink), t(e))
4068
4372
  };
4069
4373
  }
4070
- var po = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
4071
- function mo(e, t) {
4374
+ var No = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
4375
+ function Po(e, t) {
4072
4376
  let n = e.tools ?? [];
4073
4377
  return {
4074
4378
  llm: e.llm ?? t.llm,
@@ -4081,11 +4385,15 @@ function mo(e, t) {
4081
4385
  maxToolRounds: e.maxToolRounds,
4082
4386
  debug: t.debug,
4083
4387
  ...e.writablePaths?.length ? { writablePaths: e.writablePaths } : {},
4388
+ ...e.allowedTools?.length ? { allowedTools: e.allowedTools } : {},
4389
+ ...e.middleware?.length ? { middleware: e.middleware } : {},
4390
+ ...e.summarization === void 0 ? {} : { summarization: e.summarization },
4084
4391
  ...t.getFocuses ? { getFocuses: t.getFocuses } : {},
4085
- ...t.getSchema ? { getSchema: t.getSchema } : {}
4392
+ ...t.getSchema ? { getSchema: t.getSchema } : {},
4393
+ ...t.tracker ? { tracker: t.tracker } : {}
4086
4394
  };
4087
4395
  }
4088
- function ho(e, n) {
4396
+ function Fo(e, n) {
4089
4397
  let i, a, o, s = (e, t) => (n) => {
4090
4398
  a && a({
4091
4399
  type: "subagent",
@@ -4101,7 +4409,7 @@ function ho(e, n) {
4101
4409
  function d(e) {
4102
4410
  let a = /* @__PURE__ */ new Set(), c = [], l = [];
4103
4411
  for (let u of e) {
4104
- if (!po.test(u.id)) {
4412
+ if (!No.test(u.id)) {
4105
4413
  console.warn(`[subagents] id "${u.id}" 非合法工具名(须 [a-zA-Z_][a-zA-Z0-9_]*),已跳过`);
4106
4414
  continue;
4107
4415
  }
@@ -4111,11 +4419,23 @@ function ho(e, n) {
4111
4419
  continue;
4112
4420
  }
4113
4421
  a.add(e), c.push(u), l.push(r(async ({ task: e }) => {
4114
- let t = mo(u, n);
4115
- return uo({ prompt: e }, t, i, s(`use_${u.id}`, u.id), (e) => o?.({
4422
+ let t = Po(u, n), r = (e) => o?.({
4116
4423
  ...e,
4117
4424
  source: `子:${u.id}`
4118
- }));
4425
+ }), a = n.tracker, c = a ? `use_${u.id}-${Math.random().toString(36).slice(2, 6)}` : `use_${u.id}`, l = s(`use_${u.id}`, u.id), d = a ? (e) => {
4426
+ a.pushStep(c, {
4427
+ kind: e.type,
4428
+ name: e.name,
4429
+ ts: Date.now()
4430
+ }), l(e);
4431
+ } : l, f = Date.now();
4432
+ a?.start(c, e, u.id, f);
4433
+ try {
4434
+ let n = await jo({ prompt: e }, t, i, d, r);
4435
+ return a?.finish(c, "done", n), n;
4436
+ } catch (e) {
4437
+ throw a?.finish(c, "error", String(e?.message ?? e)), e;
4438
+ }
4119
4439
  }, {
4120
4440
  name: `use_${u.id}`,
4121
4441
  description: `委派给「${u.description}」子 agent 执行任务,返回其结论(过程隔离,不占主上下文)。`,
@@ -4156,7 +4476,7 @@ function ho(e, n) {
4156
4476
  augmentPrompt: () => c.length ? [
4157
4477
  "## 可用子 agent(预声明,经专属工具委派)",
4158
4478
  ...c.map((e) => `- use_${e.id}: ${e.description}`),
4159
- "需要某子 agent 时,直接调用对应的 use_<id>({ task }) 委派,任务描述要清晰。"
4479
+ "复杂或专项任务(检索 / 生成 / 调研 / 多步等)优先委派子 agent:过程隔离不占主上下文 + 各子 agent 专项处理更优。需要时直接调 use_<id>({ task }) 委派,任务描述要清晰(含背景 + 用户观点/反馈,转述给子 agent);委派后信任子 agent 自主完成,不微操、不读其代码/中间细节(少占主上下文),只据其结论继续。简单任务(单字段改、直接读)用内置工具更快,不必委派。"
4160
4480
  ].join("\n") : void 0,
4161
4481
  wrapToolCall: async (e, t) => (e.signal && (i = e.signal), e.emit && (a = e.emit), e.logSink && (o = e.logSink), t(e))
4162
4482
  };
@@ -4172,7 +4492,7 @@ function ho(e, n) {
4172
4492
  }
4173
4493
  //#endregion
4174
4494
  //#region src/core/harness/verify.ts
4175
- function go(e) {
4495
+ function Io(e) {
4176
4496
  return {
4177
4497
  name: "verify",
4178
4498
  async beforeReturn({ messages: t, state: n, log: r }) {
@@ -4184,10 +4504,10 @@ function go(e) {
4184
4504
  if (e.adversarial) {
4185
4505
  r?.("middleware", {
4186
4506
  stage: "adversarial_start",
4187
- model: wo(e.adversarial.llm),
4507
+ model: Wo(e.adversarial.llm),
4188
4508
  tools: (e.adversarial.tools ?? []).length
4189
4509
  });
4190
- let n = await Oo(t, e.adversarial.llm, r, e.adversarial.tools);
4510
+ let n = await Jo(t, e.adversarial.llm, r, e.adversarial.tools);
4191
4511
  if (r?.("middleware", {
4192
4512
  stage: "adversarial_done",
4193
4513
  clean: n === null,
@@ -4198,18 +4518,18 @@ function go(e) {
4198
4518
  }
4199
4519
  };
4200
4520
  }
4201
- var _o = /* @__PURE__ */ new Set([
4521
+ var Lo = /* @__PURE__ */ new Set([
4202
4522
  "set_data",
4203
4523
  "edit_data",
4204
4524
  "delete_data",
4205
4525
  "write"
4206
- ]), vo = /校验失败|SCHEMA_INVALID|未注册|不存在|仅支持|必须是|NOT_OBJECT|PATH_UNSAFE|VERSION_CONFLICT|WRITE_INTERCEPT/;
4207
- function yo(e) {
4526
+ ]), Ro = /校验失败|SCHEMA_INVALID|未注册|不存在|仅支持|必须是|NOT_OBJECT|PATH_UNSAFE|VERSION_CONFLICT|WRITE_INTERCEPT/;
4527
+ function zo(e) {
4208
4528
  let t = /* @__PURE__ */ new Map();
4209
4529
  for (let n of e) {
4210
4530
  let e = n?.tool_calls;
4211
4531
  if (Array.isArray(e)) for (let n of e) {
4212
- if (!_o.has(n.name)) continue;
4532
+ if (!Lo.has(n.name)) continue;
4213
4533
  let e = n.id, r = n?.args ?? {};
4214
4534
  if (n.name === "write") if (r.del && r.patch?.jsonPath) t.set(r.patch.jsonPath, {
4215
4535
  path: r.patch.jsonPath,
@@ -4248,7 +4568,7 @@ function yo(e) {
4248
4568
  }
4249
4569
  return [...t.values()];
4250
4570
  }
4251
- function bo(e) {
4571
+ function Bo(e) {
4252
4572
  let t = /* @__PURE__ */ new Map();
4253
4573
  for (let n of e) {
4254
4574
  let e = n?.tool_call_id, r = n?.content;
@@ -4256,7 +4576,7 @@ function bo(e) {
4256
4576
  }
4257
4577
  return t;
4258
4578
  }
4259
- function xo(e, t) {
4579
+ function Vo(e, t) {
4260
4580
  if (t === "") return e;
4261
4581
  if (e == null) return;
4262
4582
  let n = e;
@@ -4266,16 +4586,16 @@ function xo(e, t) {
4266
4586
  }
4267
4587
  return n;
4268
4588
  }
4269
- function So(e = {}) {
4589
+ function Ho(e = {}) {
4270
4590
  let t = typeof e.root == "function" ? e.root : e.root === void 0 ? () => e.window ?? globalThis.window : () => e.root, n = typeof e.schemas == "function" ? e.schemas : () => e.schemas ?? {};
4271
4591
  return async ({ messages: e }) => {
4272
- let r = yo(e);
4592
+ let r = zo(e);
4273
4593
  if (!r.length) return { ok: !0 };
4274
- let i = bo(e), a = n()[""], o = t(), s = [];
4594
+ let i = Bo(e), a = n()[""], o = t(), s = [];
4275
4595
  for (let { path: e, op: t, callId: n } of r) {
4276
4596
  let r = n ? i.get(n) : void 0;
4277
- if (r && vo.test(r)) continue;
4278
- let c = xo(o, e);
4597
+ if (r && Ro.test(r)) continue;
4598
+ let c = Vo(o, e);
4279
4599
  if (t === "delete_data") c !== void 0 && s.push(`${e} 删除后读回仍有值,疑似未生效`);
4280
4600
  else if (c == null) s.push(`写入 ${e} 后读回为空,疑似未生效`);
4281
4601
  else if (a) {
@@ -4289,17 +4609,17 @@ function So(e = {}) {
4289
4609
  } : { ok: !0 };
4290
4610
  };
4291
4611
  }
4292
- function Co(e) {
4612
+ function Uo(e) {
4293
4613
  return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
4294
4614
  }
4295
- function wo(e) {
4296
- return Co(e) ? e.model ?? e.modelName ?? "<实例>" : e.model ?? "<配置>";
4615
+ function Wo(e) {
4616
+ return Uo(e) ? e.model ?? e.modelName ?? "<实例>" : e.model ?? "<配置>";
4297
4617
  }
4298
- var To = /无问题|没有问题|未发现问题|没有发现|没问题|未发现/;
4299
- function Eo(e) {
4300
- return To.test(e);
4618
+ var Go = /无问题|没有问题|未发现问题|没有发现|没问题|未发现/;
4619
+ function Ko(e) {
4620
+ return Go.test(e);
4301
4621
  }
4302
- function Do(e) {
4622
+ function qo(e) {
4303
4623
  let t = "", n = "";
4304
4624
  for (let r of e) r instanceof a ? t = typeof r.content == "string" ? r.content : "" : r instanceof i && !(r.tool_calls?.length > 0) && (n = typeof r.content == "string" ? r.content : "");
4305
4625
  return {
@@ -4307,8 +4627,8 @@ function Do(e) {
4307
4627
  lastReply: n
4308
4628
  };
4309
4629
  }
4310
- async function Oo(e, t, n, r) {
4311
- let { lastUser: i, lastReply: a } = Do(e);
4630
+ async function Jo(e, t, n, r) {
4631
+ let { lastUser: i, lastReply: a } = qo(e);
4312
4632
  if (!a) return null;
4313
4633
  let o = Array.isArray(r) && r.length > 0, s = [
4314
4634
  "你是严格的对抗式审查者,目标是找出以下 AI 助手回复的错误并证明它有问题(事实错误 / 遗漏 / 逻辑矛盾 / 与需求不符)。",
@@ -4319,7 +4639,7 @@ async function Oo(e, t, n, r) {
4319
4639
  ].join("\n"), c = "你是严格的对抗式审查者,只找问题不赞美。目标是反驳,不是改进。", l = n ? (e) => n(e.type, {
4320
4640
  ...e.data,
4321
4641
  source: "adversarial"
4322
- }) : void 0, u = await ji(Co(t) ? {
4642
+ }) : void 0, u = await ji(Uo(t) ? {
4323
4643
  llm: t,
4324
4644
  tools: r,
4325
4645
  maxToolRounds: o ? 4 : 1,
@@ -4344,11 +4664,11 @@ async function Oo(e, t, n, r) {
4344
4664
  stage: "adversarial_verdict",
4345
4665
  verdict: u,
4346
4666
  source: "adversarial"
4347
- }), Eo(u) ? null : u.trim();
4667
+ }), Ko(u) ? null : u.trim();
4348
4668
  }
4349
4669
  //#endregion
4350
4670
  //#region src/core/utils/contextAnalysis.ts
4351
- var ko = [
4671
+ var Yo = [
4352
4672
  {
4353
4673
  prefix: "## 可操作数据",
4354
4674
  key: "dataHint"
@@ -4377,7 +4697,7 @@ var ko = [
4377
4697
  prefix: "【与当前问题可能相关的早期对话】",
4378
4698
  key: "recall"
4379
4699
  }
4380
- ], Ao = [
4700
+ ], Xo = [
4381
4701
  {
4382
4702
  key: "systemPrompt",
4383
4703
  label: "系统提示词(身份/规则)"
@@ -4431,9 +4751,9 @@ var ko = [
4431
4751
  label: "其他"
4432
4752
  }
4433
4753
  ];
4434
- function jo() {
4754
+ function Zo() {
4435
4755
  let e = {};
4436
- for (let t of Ao) e[t.key] = {
4756
+ for (let t of Xo) e[t.key] = {
4437
4757
  key: t.key,
4438
4758
  label: t.label,
4439
4759
  tokens: 0,
@@ -4442,407 +4762,153 @@ function jo() {
4442
4762
  };
4443
4763
  return e;
4444
4764
  }
4445
- function Mo(e, t) {
4765
+ function Qo(e, t) {
4446
4766
  e.tokens += t, e.msgCount += 1;
4447
4767
  }
4448
- function No(e) {
4768
+ function $o(e) {
4449
4769
  let t = e.content;
4450
4770
  return typeof t == "string" ? t : JSON.stringify(t ?? "");
4451
- }
4452
- function Po(e, t) {
4453
- let n = [];
4454
- for (let t of ko) {
4455
- let r = 0;
4456
- for (;;) {
4457
- let i = e.indexOf(t.prefix, r);
4458
- if (i < 0) break;
4459
- n.push({
4460
- idx: i,
4461
- key: t.key
4462
- }), r = i + t.prefix.length;
4463
- }
4464
- }
4465
- if (n.sort((e, t) => e.idx - t.idx), !n.length) {
4466
- let n = e.trim();
4467
- n && Mo(t.systemPrompt, X(n));
4468
- return;
4469
- }
4470
- if (n[0].idx > 0) {
4471
- let r = e.slice(0, n[0].idx).trim();
4472
- r && Mo(t.systemPrompt, X(r));
4473
- }
4474
- for (let r = 0; r < n.length; r++) {
4475
- let i = n[r].idx, a = r + 1 < n.length ? n[r + 1].idx : e.length, o = e.slice(i, a).trim();
4476
- o && Mo(t[n[r].key], X(o));
4477
- }
4478
- }
4479
- function Fo(e, t = {}) {
4480
- let n = jo(), r = -1;
4481
- for (let t = e.length - 1; t >= 0; t--) if (e[t] instanceof a) {
4482
- r = t;
4483
- break;
4484
- }
4485
- for (let t = 0; t < e.length; t++) {
4486
- let c = e[t];
4487
- if (c instanceof o) Po(No(c), n);
4488
- else if (c instanceof a) Mo(n[t === r ? "current" : "history"], X(No(c)));
4489
- else if (c instanceof i) {
4490
- let e = c.tool_calls ?? [];
4491
- if (e.length) {
4492
- let t = e.map((e) => JSON.stringify(e.args ?? {})).join(" ");
4493
- Mo(n.toolResults, X(t));
4494
- } else Mo(n.assistant, X(No(c)));
4495
- } else c instanceof s ? Mo(n.toolResults, X(No(c))) : Mo(n.other, X(No(c)));
4496
- }
4497
- let c = Object.values(n).filter((e) => e.tokens > 0);
4498
- c.sort((e, t) => t.tokens - e.tokens);
4499
- let l = c.reduce((e, t) => e + t.tokens, 0);
4500
- for (let e of c) e.pct = l > 0 ? e.tokens / l : 0;
4501
- let u = t.contextWindow;
4502
- return {
4503
- totalTokens: l,
4504
- contextWindow: u,
4505
- occupancy: u ? l / u : 0,
4506
- thresholdRatio: t.thresholdRatio ?? 0,
4507
- categories: c
4508
- };
4509
- }
4510
- //#endregion
4511
- //#region src/core/harness/contextInspector.ts
4512
- function Io(e = {}) {
4513
- let t, n = e.contextWindow;
4514
- return {
4515
- name: "context-inspector",
4516
- async wrapModelCall(r, i) {
4517
- return t = Fo(r.messages, {
4518
- contextWindow: n,
4519
- thresholdRatio: e.thresholdRatio
4520
- }), i(r);
4521
- },
4522
- getSnapshot: () => t,
4523
- setContextWindow: (e) => {
4524
- n = e;
4525
- }
4526
- };
4527
- }
4528
- //#endregion
4529
- //#region src/core/mcp/client.ts
4530
- function Lo(e) {
4531
- let t = e?.content;
4532
- if (!Array.isArray(t) || !t.length) return "";
4533
- let n = t.map((e) => e.type === "text" && e.text ? e.text : e.type === "image" && e.data ? `[image:${String(e.data).slice(0, 32)}…]` : e.type === "audio" && e.data ? "[audio]" : e.type === "resource" && e.resource ? e.resource.text ?? e.resource.blob ?? "" : "").filter(Boolean).join("\n");
4534
- return e?.isError ? `工具错误:${n}` : n;
4535
- }
4536
- async function Ro(e) {
4537
- let t = new URL(e.url), n = e.requestInit;
4538
- if (e.transport === "http") {
4539
- let { StreamableHTTPClientTransport: e } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
4540
- return new e(t, { requestInit: n });
4541
- }
4542
- if (e.transport === "sse") {
4543
- let { SSEClientTransport: e } = await import("@modelcontextprotocol/sdk/client/sse.js");
4544
- return new e(t, { requestInit: n });
4545
- }
4546
- let { WebSocketClientTransport: r } = await import("@modelcontextprotocol/sdk/client/websocket.js");
4547
- return new r(t);
4548
- }
4549
- function zo(e, t) {
4550
- return r(async (n) => Lo(await t.callTool({
4551
- name: e.name,
4552
- arguments: n
4553
- })), {
4554
- name: e.name,
4555
- description: e.description ?? `MCP tool: ${e.name}`,
4556
- schema: e.inputSchema
4557
- });
4558
- }
4559
- async function Bo(e) {
4560
- let { Client: t } = await import("@modelcontextprotocol/sdk/client"), n = await Ro(e), r = new t({
4561
- name: "page-agent-sdk",
4562
- version: "1.0"
4563
- }, { capabilities: {} });
4564
- await r.connect(n);
4565
- let { tools: i } = await r.listTools();
4566
- return {
4567
- tools: i.map((e) => zo(e, r)),
4568
- close: () => r.close()
4569
- };
4570
- }
4571
- //#endregion
4572
- //#region src/core/utils/rounds.ts
4573
- function Vo(e) {
4574
- let t = [], n = null, r = 0;
4575
- for (let i = 0; i < e.length; i++) {
4576
- let a = e[i];
4577
- a.role === "user" ? (n && t.push(n), r++, n = {
4578
- round: r,
4579
- userMsg: a,
4580
- assistantMsgs: [],
4581
- startIdx: i,
4582
- endIdx: i
4583
- }) : n && (n.assistantMsgs.push(a), n.endIdx = i);
4584
- }
4585
- return n && t.push(n), t;
4586
- }
4587
- function Ho(e, t) {
4588
- let n = (e || "").replace(/```[\s\S]*?```/g, "[代码]").replace(/`([^`]+)`/g, "$1").replace(/[#*_>\-]\s?/g, "").replace(/\[(代码)\]/g, "「代码」").replace(/\s+/g, " ").trim();
4589
- return n.length > t ? n.slice(0, t) + "…" : n;
4590
- }
4591
- function Uo(e) {
4592
- let t = [];
4593
- for (let n of e.assistantMsgs) for (let e of n.steps || []) t.push(e.name);
4594
- return t;
4595
- }
4596
- var Wo = "【更早对话摘要";
4597
- function Go(e, t) {
4598
- return !t || !t.body ? e : {
4599
- body: `${t.body}\n【续】\n${e.body}`,
4600
- rounds: (t.rounds ?? 0) + (e.rounds ?? 0),
4601
- cumulative: !0
4602
- };
4603
- }
4604
- function Ko(e) {
4605
- return typeof e != "string" || !e.startsWith("【更早对话摘要") ? null : { body: e.replace(/^【[^】]*】\n?/, "") };
4606
- }
4607
- function qo(e) {
4608
- return `${Wo}${e.cumulative ? `(${e.rounds ?? 0} 轮,含累积)` : e.rounds ? `(${e.rounds} 轮)` : ""}】\n${e.body}`;
4609
- }
4610
- function Jo(e, t, n) {
4611
- return qo(Go({
4612
- body: n,
4613
- rounds: e.length
4614
- }, t ?? void 0));
4615
- }
4616
- function Yo(e, t) {
4617
- if (t <= 0) return { trimmed: !1 };
4618
- let n = Vo(e);
4619
- if (n.length <= t) return { trimmed: !1 };
4620
- let r = n[n.length - t].startIdx, i = n.slice(0, n.length - t), a = n[0].startIdx, o = null;
4621
- for (let t = 0; t < a; t++) {
4622
- let n = e[t];
4623
- if (n.role === "system" && (o = Ko(n.content), o)) break;
4624
- }
4625
- return {
4626
- trimmed: !0,
4627
- deleteFrom: 0,
4628
- deleteCount: r,
4629
- summary: {
4630
- role: "system",
4631
- content: qo(Go({
4632
- body: i.map((e) => {
4633
- let t = Ho(e.userMsg.content, 60) || "(空)", n = e.assistantMsgs[0] ? Ho(e.assistantMsgs[0].content, 80) : "(无回复)";
4634
- return `- 第${e.round}轮:${t} → ${n}`;
4635
- }).join("\n"),
4636
- rounds: i.length
4637
- }, o ?? void 0)),
4638
- timestamp: i[0].userMsg.timestamp
4639
- },
4640
- older: i,
4641
- prevSeg: o
4642
- };
4643
- }
4644
- //#endregion
4645
- //#region src/core/composables/contextIndex.ts
4646
- var Xo = /* @__PURE__ */ new Set(/* @__PURE__ */ "的.了.是.在.我.你.他.她.它.这.那.和.与.及.或.一个.什么.怎么.如何.为什么.可以.能.请.帮.一下.需要.想要.the.a.an.is.are.of.to.in.on".split("."));
4647
- function Zo(e) {
4648
- return e.toLowerCase().split(/[^a-z0-9一-龥]+/i).map((e) => e.trim()).filter((e) => e.length >= 2 && !Xo.has(e));
4649
- }
4650
- function Qo(e) {
4651
- let t = typeof e.content == "string" ? e.content : "";
4652
- if (e.reasoning && (t += e.reasoning), e.steps) for (let n of e.steps) t += " " + (n.name || ""), n.args != null && (t += " " + (typeof n.args == "string" ? n.args : JSON.stringify(n.args))), n.result && (t += " " + n.result);
4653
- return X(t);
4654
- }
4655
- function $o(e) {
4656
- let t = Qo(e.userMsg);
4657
- for (let n of e.assistantMsgs) t += Qo(n);
4658
- return t;
4659
- }
4660
- function es(e, t) {
4661
- return e.map((e) => {
4662
- let n = Ho(e.userMsg.content, 60) || "(空)", r = e.assistantMsgs[0] ? Ho(e.assistantMsgs[0].content, 80) : "(无回复)", i = e.assistantMsgs.flatMap((e) => (e.steps || []).map((e) => e.name)), a = i.length ? ` [工具: ${i.join(", ")}]` : "", o = "";
4663
- if (t && t.size) {
4664
- let n = [];
4665
- for (let r of e.assistantMsgs) for (let e of r.steps || []) e.name && t.has(e.name) && e.result && n.push(`${e.name}: ${Ho(e.result, 120)}`);
4666
- n.length && (o = `\n 字段提示: ${n.join(" | ")}`);
4667
- }
4668
- return `- 第${e.round}轮:${n} → ${r}${a}${o}`;
4669
- }).join("\n");
4670
- }
4671
- function ts(e, t, n) {
4672
- let r = Zo(t);
4673
- return r.length === 0 ? [] : e.map((e) => {
4674
- let t = (e.userMsg.content + " " + e.assistantMsgs.map((e) => e.content).join(" ") + " " + e.assistantMsgs.flatMap((e) => (e.steps || []).map((e) => Ho(e.result || "", 120))).join(" ")).toLowerCase(), n = 0;
4675
- for (let e of r) t.includes(e) && n++;
4676
- return {
4677
- r: e,
4678
- score: n
4679
- };
4680
- }).filter((e) => e.score > 0).sort((e, t) => t.score - e.score).slice(0, n).map((e) => e.r);
4681
- }
4682
- function ns(e, t) {
4683
- return t.contextWindow && t.contextWindow > 0 ? e.reduce((e, t) => e + $o(t), 0) > t.contextWindow * (t.summaryThresholdRatio ?? .5) : e.length > (t.summaryThresholdRounds ?? 8);
4684
- }
4685
- //#endregion
4686
- //#region src/core/composables/useContextManager.ts
4687
- var rs = {
4688
- windowRounds: 6,
4689
- summaryThresholdRounds: 8,
4690
- toolResultMaxChars: 800,
4691
- enableRecall: !0,
4692
- recallTopK: 3,
4693
- enableLLMSummary: !1
4694
- };
4695
- function is(e = {}) {
4696
- let t = {
4697
- ...rs,
4698
- ...e
4699
- };
4700
- async function n(e, n) {
4701
- let r = Vo(e), i = e.length, a = "";
4702
- if (r.length) {
4703
- let t = r[0].startIdx;
4704
- for (let n = 0; n < t; n++) {
4705
- let t = e[n];
4706
- if (t.role === "system") {
4707
- let e = Ko(t.content);
4708
- if (e) {
4709
- a = e.body;
4710
- break;
4711
- }
4712
- }
4713
- }
4714
- }
4715
- let o = (t) => ({
4716
- messages: e,
4717
- stats: {
4718
- triggered: !1,
4719
- roundsTotal: r.length,
4720
- roundsSummarized: 0,
4721
- roundsRecalled: 0,
4722
- originalMessages: i,
4723
- compressedMessages: i,
4724
- strategy: t
4725
- }
4726
- });
4727
- if (!ns(r, t)) return o("none");
4728
- let s, c, l;
4729
- if (t.contextWindow && t.contextWindow > 0) {
4730
- let e = t.contextWindow * (n?.windowRatio ?? t.windowRatio ?? .4), i = 0, a = 0;
4731
- for (let t = r.length - 1; t >= 0; t--) if (i += $o(r[t]), i >= e) {
4732
- a = t + 1;
4733
- break;
4734
- }
4735
- if (a > r.length - 1 && (a = r.length - 1), a < 0 && (a = 0), s = r.slice(a), c = r.slice(0, a), !c.length) return o("none");
4736
- l = "token-window+";
4737
- } else {
4738
- let e = n?.keepRounds ?? t.windowRounds, i = Math.min(Math.max(1, e), r.length);
4739
- if (s = r.slice(r.length - i), c = r.slice(0, r.length - i), !c.length) return o("none");
4740
- l = "window+";
4741
- }
4742
- let u = [...e].reverse().find((e) => e.role === "user")?.content || "", d = n?.summarize?.mode ?? (t.enableLLMSummary ? "llm" : "index"), f = /* @__PURE__ */ new Set([...t.preserveLastToolResults ?? [], ...n?.preserveTools ?? []]), p = f.size ? f : void 0, m, h;
4743
- if (d === "llm" && t.llmInvoke) try {
4744
- m = await t.llmInvoke(es(c, p)), h = l + "llm_summary";
4745
- } catch {
4746
- m = es(c, p), h = l + "index_summary(llm_fallback)";
4747
- }
4748
- else m = es(c, p), h = l + "index_summary";
4749
- let g = n?.recallTopK == null ? t.enableRecall ? t.recallTopK : 0 : n.recallTopK, _ = g > 0 ? ts(c, u, g) : [], v = _.length ? _.map((e) => `- 第${e.round}轮:${Ho(e.userMsg.content, 60)} → ${e.assistantMsgs[0] ? Ho(e.assistantMsgs[0].content, 80) : ""}`).join("\n") : "", y = a ? `${m}\n【更早累积摘要】\n${a}` : m, b = [`【对话历史摘要】以下是之前 ${c.length} 轮对话的要点(最新 ${s.length} 轮已完整保留):`, y];
4750
- if (n) {
4751
- let e = t.contextWindow && t.contextWindow > 0 ? `windowRatio=${n.windowRatio ?? t.windowRatio}` : `keepRounds=${n.keepRounds ?? t.windowRounds}`;
4752
- b.push(`\n(压缩决策:${e} · 摘要=${n.summarize.mode} · 召回=${g}${n.reason ? " · " + n.reason : ""})`);
4771
+ }
4772
+ function es(e, t) {
4773
+ let n = [];
4774
+ for (let t of Yo) {
4775
+ let r = 0;
4776
+ for (;;) {
4777
+ let i = e.indexOf(t.prefix, r);
4778
+ if (i < 0) break;
4779
+ n.push({
4780
+ idx: i,
4781
+ key: t.key
4782
+ }), r = i + t.prefix.length;
4753
4783
  }
4754
- v && b.push("\n【与当前问题可能相关的早期对话】", v);
4755
- let x = t.getRegisteredData ?? t.getRegisteredSlots;
4756
- if (x) try {
4757
- let e = x();
4784
+ }
4785
+ if (n.sort((e, t) => e.idx - t.idx), !n.length) {
4786
+ let n = e.trim();
4787
+ n && Qo(t.systemPrompt, X(n));
4788
+ return;
4789
+ }
4790
+ if (n[0].idx > 0) {
4791
+ let r = e.slice(0, n[0].idx).trim();
4792
+ r && Qo(t.systemPrompt, X(r));
4793
+ }
4794
+ for (let r = 0; r < n.length; r++) {
4795
+ let i = n[r].idx, a = r + 1 < n.length ? n[r + 1].idx : e.length, o = e.slice(i, a).trim();
4796
+ o && Qo(t[n[r].key], X(o));
4797
+ }
4798
+ }
4799
+ function ts(e, t = {}) {
4800
+ let n = Zo(), r = -1;
4801
+ for (let t = e.length - 1; t >= 0; t--) if (e[t] instanceof a) {
4802
+ r = t;
4803
+ break;
4804
+ }
4805
+ for (let t = 0; t < e.length; t++) {
4806
+ let c = e[t];
4807
+ if (c instanceof o) es($o(c), n);
4808
+ else if (c instanceof a) Qo(n[t === r ? "current" : "history"], X($o(c)));
4809
+ else if (c instanceof i) {
4810
+ let e = c.tool_calls ?? [];
4758
4811
  if (e.length) {
4759
- let t = e.map((e) => `- ${e.path ? e.path + ": " : ""}${e.description}`).join("\n");
4760
- b.push("\n【当前可操作数据(动态增删后的最新状态,操作前以 describe_data / read 为准)】", t);
4761
- }
4762
- } catch {}
4763
- let S = {
4764
- role: "system",
4765
- content: b.join("\n"),
4766
- timestamp: Date.now()
4767
- }, C = [];
4768
- for (let e of s) C.push(e.userMsg), C.push(...e.assistantMsgs);
4769
- let w = [S, ...C], T = w.reduce((e, t) => e + X(typeof t.content == "string" ? t.content : JSON.stringify(t.content)), 0);
4770
- return t.contextWindow && T > t.contextWindow && console.warn(`[page-agent-sdk] compress 后仍超窗口:${T} > ${t.contextWindow} tokens(单条消息超窗口,compress 无法压)`), {
4771
- messages: w,
4772
- stats: {
4773
- triggered: !0,
4774
- roundsTotal: r.length,
4775
- roundsSummarized: c.length,
4776
- roundsRecalled: _.length,
4777
- originalMessages: i,
4778
- compressedMessages: w.length,
4779
- strategy: h,
4780
- decision: n
4781
- }
4782
- };
4812
+ let t = e.map((e) => JSON.stringify(e.args ?? {})).join(" ");
4813
+ Qo(n.toolResults, X(t));
4814
+ } else Qo(n.assistant, X($o(c)));
4815
+ } else c instanceof s ? Qo(n.toolResults, X($o(c))) : Qo(n.other, X($o(c)));
4783
4816
  }
4817
+ let c = Object.values(n).filter((e) => e.tokens > 0);
4818
+ c.sort((e, t) => t.tokens - e.tokens);
4819
+ let l = c.reduce((e, t) => e + t.tokens, 0);
4820
+ for (let e of c) e.pct = l > 0 ? e.tokens / l : 0;
4821
+ let u = t.contextWindow;
4784
4822
  return {
4785
- compress: n,
4786
- config: t
4823
+ totalTokens: l,
4824
+ contextWindow: u,
4825
+ occupancy: u ? l / u : 0,
4826
+ thresholdRatio: t.thresholdRatio ?? 0,
4827
+ categories: c
4787
4828
  };
4788
4829
  }
4789
4830
  //#endregion
4790
- //#region src/core/harness/summarization.ts
4791
- function as(e = {}) {
4792
- let t = is(e);
4793
- return Object.assign({
4794
- name: "summarization",
4795
- compressInput: async (n) => {
4796
- let r;
4797
- if (e.decideInvoke) {
4798
- let i = Vo(n);
4799
- if (ns(i, t.config)) {
4800
- let a = t.config.contextWindow && t.config.contextWindow > 0 ? "token" : "rounds", o = a === "token" ? `历史 token 超阈值 ${Math.round((t.config.contextWindow ?? 0) * (t.config.summaryThresholdRatio ?? .5))}` : `轮数 ${i.length} 超阈值 ${t.config.summaryThresholdRounds}`;
4801
- try {
4802
- r = await e.decideInvoke({
4803
- getMessages: () => n,
4804
- getSnapshot: e.getSnapshot,
4805
- contextWindow: t.config.contextWindow,
4806
- thresholdRatio: t.config.summaryThresholdRatio,
4807
- triggerReason: o,
4808
- triggerMode: a
4809
- }) ?? void 0;
4810
- } catch {
4811
- r = void 0;
4812
- }
4813
- }
4814
- }
4815
- let { messages: i, stats: a } = await t.compress(n, r);
4816
- return {
4817
- messages: i,
4818
- stats: a
4819
- };
4831
+ //#region src/core/harness/contextInspector.ts
4832
+ function ns(e = {}) {
4833
+ let t, n = e.contextWindow;
4834
+ return {
4835
+ name: "context-inspector",
4836
+ async wrapModelCall(r, i) {
4837
+ return t = ts(r.messages, {
4838
+ contextWindow: n,
4839
+ thresholdRatio: e.thresholdRatio
4840
+ }), i(r);
4841
+ },
4842
+ getSnapshot: () => t,
4843
+ setContextWindow: (e) => {
4844
+ n = e;
4820
4845
  }
4821
- }, { setContextWindow(e) {
4822
- t.config.contextWindow = e;
4823
- } });
4846
+ };
4847
+ }
4848
+ //#endregion
4849
+ //#region src/core/mcp/client.ts
4850
+ function rs(e) {
4851
+ let t = e?.content;
4852
+ if (!Array.isArray(t) || !t.length) return "";
4853
+ let n = t.map((e) => e.type === "text" && e.text ? e.text : e.type === "image" && e.data ? `[image:${String(e.data).slice(0, 32)}…]` : e.type === "audio" && e.data ? "[audio]" : e.type === "resource" && e.resource ? e.resource.text ?? e.resource.blob ?? "" : "").filter(Boolean).join("\n");
4854
+ return e?.isError ? `工具错误:${n}` : n;
4855
+ }
4856
+ async function is(e) {
4857
+ let t = new URL(e.url), n = e.requestInit;
4858
+ if (e.transport === "http") {
4859
+ let { StreamableHTTPClientTransport: e } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
4860
+ return new e(t, { requestInit: n });
4861
+ }
4862
+ if (e.transport === "sse") {
4863
+ let { SSEClientTransport: e } = await import("@modelcontextprotocol/sdk/client/sse.js");
4864
+ return new e(t, { requestInit: n });
4865
+ }
4866
+ let { WebSocketClientTransport: r } = await import("@modelcontextprotocol/sdk/client/websocket.js");
4867
+ return new r(t);
4868
+ }
4869
+ function as(e, t) {
4870
+ return r(async (n) => rs(await t.callTool({
4871
+ name: e.name,
4872
+ arguments: n
4873
+ })), {
4874
+ name: e.name,
4875
+ description: e.description ?? `MCP tool: ${e.name}`,
4876
+ schema: e.inputSchema
4877
+ });
4878
+ }
4879
+ async function os(e) {
4880
+ let { Client: t } = await import("@modelcontextprotocol/sdk/client"), n = await is(e), r = new t({
4881
+ name: "page-agent-sdk",
4882
+ version: "1.0"
4883
+ }, { capabilities: {} });
4884
+ await r.connect(n);
4885
+ let { tools: i } = await r.listTools();
4886
+ return {
4887
+ tools: i.map((e) => as(e, r)),
4888
+ close: () => r.close()
4889
+ };
4824
4890
  }
4825
4891
  //#endregion
4826
4892
  //#region src/core/sdk/promptBuilder.ts
4827
- var os = [
4893
+ var ss = [
4828
4894
  "你是一个 JSON 操作助手。集成方声明了一个主数据对象(含 zod schema 校验),你通过专用工具安全地读写它来完成任务。",
4829
4895
  "所有写操作都经范围控制(仅 schema 声明字段内)与 schema 校验(不合法会返回结构化错误而非写入),并自动留快照可回退。",
4830
4896
  "大对象/数组优先用增量 patch(只发改动)而非整体重传,避免输出被截断。",
4831
4897
  "---",
4832
4898
  ia.reliableWriteRules
4833
4899
  ].join("\n\n");
4834
- function ss(e, t) {
4900
+ function cs(e, t) {
4835
4901
  if (!e) return "";
4836
4902
  let n = ca(e.schema, t);
4837
4903
  return `\n\n## 可操作数据(字段以 read 工具返回的实际值为准)\n${e.description ? e.description + "\n" : ""}${n}`;
4838
4904
  }
4839
- function cs(e) {
4905
+ function ls(e) {
4840
4906
  let t = e.appendReliableWriteRules !== !1;
4841
- return e.systemPrompt ? t ? e.systemPrompt + "\n\n---\n\n" + ia.reliableWriteRules : e.systemPrompt : os;
4907
+ return e.systemPrompt ? t ? e.systemPrompt + "\n\n---\n\n" + ia.reliableWriteRules : e.systemPrompt : ss;
4842
4908
  }
4843
4909
  //#endregion
4844
4910
  //#region src/core/sdk/defineTool.ts
4845
- function ls(e) {
4911
+ function us(e) {
4846
4912
  return r(async (t) => {
4847
4913
  let n = await e.handler(t);
4848
4914
  return typeof n == "string" ? n : JSON.stringify(n);
@@ -4854,7 +4920,7 @@ function ls(e) {
4854
4920
  }
4855
4921
  //#endregion
4856
4922
  //#region src/core/sdk/inspectContextTool.ts
4857
- var us = t.object({
4923
+ var ds = t.object({
4858
4924
  path: t.string().optional().describe("分类 key 过滤(如 toolResults/history/systemPrompt/dataHint);不传=全部分类"),
4859
4925
  role: t.enum([
4860
4926
  "user",
@@ -4864,14 +4930,14 @@ var us = t.object({
4864
4930
  ]).optional().describe("聚焦每轮首句的角色(assistant→回复摘要,user→问题摘要);不影响工具列表"),
4865
4931
  limit: t.number().int().min(1).max(50).optional().describe("返回最近 N 轮(默认全部;超 50 自动截最近 50 防返回过大)")
4866
4932
  });
4867
- function ds(e) {
4868
- return ls({
4933
+ function fs(e) {
4934
+ return us({
4869
4935
  name: "inspect_context",
4870
4936
  description: "查看当前对话上下文的构成(供压缩决策)。返回:totalTokens(历史轮次 token 总和,与触发判断同口径)、occupancy(窗口占用比)、contextWindow、categories(分类占用)、rounds(每轮 token/工具/首句)。先调用本工具查看构成,再决定压缩策略。",
4871
- schema: us,
4937
+ schema: ds,
4872
4938
  handler: (t) => {
4873
- let n = Vo(e.getMessages()), r = n.length > 50 ? n.slice(n.length - 50) : n, i = (t.limit && r.length > t.limit ? r.slice(r.length - t.limit) : r).map((e) => {
4874
- let n = $o(e), r = Uo(e), i = t.role === "assistant" ? e.assistantMsgs[0] ?? e.userMsg : e.userMsg, a = Ho(typeof i.content == "string" ? i.content : "", 60);
4939
+ let n = eo(e.getMessages()), r = n.length > 50 ? n.slice(n.length - 50) : n, i = (t.limit && r.length > t.limit ? r.slice(r.length - t.limit) : r).map((e) => {
4940
+ let n = po(e), r = no(e), i = t.role === "assistant" ? e.assistantMsgs[0] ?? e.userMsg : e.userMsg, a = to(typeof i.content == "string" ? i.content : "", 60);
4875
4941
  return {
4876
4942
  round: e.round,
4877
4943
  tokens: n,
@@ -4891,7 +4957,7 @@ function ds(e) {
4891
4957
  }
4892
4958
  //#endregion
4893
4959
  //#region src/core/sdk/compressDecision.ts
4894
- var fs = t.object({
4960
+ var ps = t.object({
4895
4961
  keepRounds: t.number().int().min(0).max(50).optional(),
4896
4962
  windowRatio: t.number().min(0).max(1).optional(),
4897
4963
  summarize: t.object({ mode: t.enum(["index", "llm"]) }),
@@ -4901,23 +4967,23 @@ var fs = t.object({
4901
4967
  }).refine((e) => e.keepRounds !== void 0 || e.windowRatio !== void 0, { message: "keepRounds 与 windowRatio 至少填一个(按当前触发模式)" });
4902
4968
  //#endregion
4903
4969
  //#region src/core/sdk/llmResolver.ts
4904
- function ps(e) {
4970
+ function ms(e) {
4905
4971
  let t = e.find((e) => e.role === "user");
4906
4972
  if (!t) return;
4907
4973
  let n = t.content, r = (typeof n == "string" ? n : Array.isArray(n) ? n.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(n ?? "")).trim().replace(/[\n\r]+/g, " ");
4908
4974
  if (r) return r.length > 30 ? r.slice(0, 30) + "…" : r;
4909
4975
  }
4910
- function ms(e) {
4976
+ function hs(e) {
4911
4977
  return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
4912
4978
  }
4913
- function hs(e) {
4979
+ function gs(e) {
4914
4980
  let t = e.content;
4915
4981
  return typeof t == "string" ? t : Array.isArray(t) ? t.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(t ?? "");
4916
4982
  }
4917
- function gs(e) {
4983
+ function _s(e) {
4918
4984
  let t = e.summaryLlm ?? e.llm;
4919
4985
  if (!t) return;
4920
- let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, i = e.summaryTimeoutMs ?? 15e3, s = ms(t) ? t : null, c = ms(t) ? null : t;
4986
+ let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, i = e.summaryTimeoutMs ?? 15e3, s = hs(t) ? t : null, c = hs(t) ? null : t;
4921
4987
  if (c && !c.apiKey) {
4922
4988
  e.summaryLlm && console.warn("[page-agent-sdk][summarization] summaryLlm 已配置但缺 apiKey,摘要回退主 agent 模型或零成本索引摘要");
4923
4989
  return;
@@ -4929,16 +4995,16 @@ function gs(e) {
4929
4995
  return !l && c && (l = await f(c, {
4930
4996
  temperature: n,
4931
4997
  maxTokens: r
4932
- })), hs(await l.invoke([new o("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new a(e)], { signal: t.signal })).trim();
4998
+ })), gs(await l.invoke([new o("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new a(e)], { signal: t.signal })).trim();
4933
4999
  } finally {
4934
5000
  clearTimeout(s);
4935
5001
  }
4936
5002
  };
4937
5003
  }
4938
- function _s(e) {
5004
+ function vs(e) {
4939
5005
  let t = e.titleLlm ?? e.summaryLlm ?? e.llm;
4940
5006
  if (!t) return;
4941
- let n = ms(t) ? t : null, r = ms(t) ? null : t;
5007
+ let n = hs(t) ? t : null, r = hs(t) ? null : t;
4942
5008
  if (r && !r.apiKey) return;
4943
5009
  let i = n;
4944
5010
  return async (e) => {
@@ -4947,7 +5013,7 @@ function _s(e) {
4947
5013
  return !i && r && (i = await f(r, {
4948
5014
  temperature: 0,
4949
5015
  maxTokens: 30
4950
- })), hs(await i.invoke([new o("根据以下对话的主旨,生成一个简短的中文标题(不超过15个字,不要标点和引号,直接输出标题文字)。"), new a(t)], { signal: n.signal })).trim().replace(/^["'""「『]|["'""」』]$/g, "").split("\n")[0].slice(0, 20);
5016
+ })), gs(await i.invoke([new o("根据以下对话的主旨,生成一个简短的中文标题(不超过15个字,不要标点和引号,直接输出标题文字)。"), new a(t)], { signal: n.signal })).trim().replace(/^["'""「『]|["'""」』]$/g, "").split("\n")[0].slice(0, 20);
4951
5017
  } catch {
4952
5018
  return "";
4953
5019
  } finally {
@@ -4955,10 +5021,10 @@ function _s(e) {
4955
5021
  }
4956
5022
  };
4957
5023
  }
4958
- function vs() {
5024
+ function ys() {
4959
5025
  return `call_dec_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
4960
5026
  }
4961
- function ys(e) {
5027
+ function bs(e) {
4962
5028
  let t = e.match(/```(?:json)?\s*([\s\S]*?)```/), n = t ? t[1] : e, r = n.indexOf("{"), i = n.lastIndexOf("}");
4963
5029
  if (r < 0 || i < 0 || i <= r) return null;
4964
5030
  try {
@@ -4967,21 +5033,21 @@ function ys(e) {
4967
5033
  return null;
4968
5034
  }
4969
5035
  }
4970
- function bs(e) {
5036
+ function xs(e) {
4971
5037
  if (!e) return null;
4972
- let t = ys(e);
5038
+ let t = bs(e);
4973
5039
  if (t == null) return null;
4974
- let n = fs.safeParse(t);
5040
+ let n = ps.safeParse(t);
4975
5041
  return n.success ? n.data : null;
4976
5042
  }
4977
- async function xs(e, t, n, r) {
5043
+ async function Ss(e, t, n, r) {
4978
5044
  let i = [...n];
4979
5045
  for (let n = 0; n < 3; n++) {
4980
5046
  let n = await e.invoke(i, { signal: r }), a = n?.tool_calls ?? [];
4981
- if (!a.length) return hs(n).trim();
5047
+ if (!a.length) return gs(n).trim();
4982
5048
  i = [...i, n];
4983
5049
  for (let e of a) {
4984
- let n = e.id ?? vs();
5050
+ let n = e.id ?? ys();
4985
5051
  try {
4986
5052
  let r = await t.invoke(e.args ?? {}), a = typeof r == "string" ? r : r?.content ?? JSON.stringify(r);
4987
5053
  i = [...i, new s({
@@ -4998,10 +5064,10 @@ async function xs(e, t, n, r) {
4998
5064
  }
4999
5065
  return "";
5000
5066
  }
5001
- function Ss(e) {
5067
+ function Cs(e) {
5002
5068
  let t = e.summaryLlm ?? e.llm;
5003
5069
  if (!t) return;
5004
- let n = ms(t) ? t : null, r = ms(t) ? null : t;
5070
+ let n = hs(t) ? t : null, r = hs(t) ? null : t;
5005
5071
  if (r && !r.apiKey) return;
5006
5072
  let i = e.decisionTimeoutMs ?? 6e3, s = e.decisionMaxTokens ?? 2048, c = n;
5007
5073
  return async (e) => {
@@ -5013,12 +5079,12 @@ function Ss(e) {
5013
5079
  }));
5014
5080
  let n = c;
5015
5081
  if (typeof n.bindTools != "function") return null;
5016
- let i = ds({
5082
+ let i = fs({
5017
5083
  getMessages: e.getMessages,
5018
5084
  getSnapshot: e.getSnapshot,
5019
5085
  contextWindow: e.contextWindow
5020
5086
  }), l = n.bindTools([i]), u = e.triggerMode === "token" ? "token 模式:必填 windowRatio(0~1 保留窗口预算比例,如 0.4);keepRounds 可选" : "轮数模式:必填 keepRounds(保留最近几轮,如 6);windowRatio 可选", d = [new o(`你是对话历史压缩决策助手。当前触发模式 = ${e.triggerMode}(${e.triggerReason})。先调用 inspect_context 查看上下文构成,再输出压缩决策 JSON。${u}。仅输出 JSON,不要多余文字/markdown。schema:{keepRounds?(int 0-50), windowRatio?(0-1), summarize:{mode:"index"|"llm"}, recallTopK?(int 0-10), preserveTools?(string[]≤10), reason?(≤200字)}。keepRounds/windowRatio 至少填一个。`), new a(`触发原因:${e.triggerReason}\n上下文窗口:${e.contextWindow ?? "未知"} tokens\n阈值比例:${e.thresholdRatio ?? "未知"}\n\n请决策压缩策略(先 inspect_context 查看,再输出 JSON)。`)];
5021
- return bs(await xs(l, i, d, t.signal)) || bs(await xs(l, i, [...d, new a("上一次输出无效(JSON 解析失败或 schema 校验不通过)。请只输出符合 schema 的压缩决策 JSON,不要多余文字/markdown 代码块。")], t.signal));
5087
+ return xs(await Ss(l, i, d, t.signal)) || xs(await Ss(l, i, [...d, new a("上一次输出无效(JSON 解析失败或 schema 校验不通过)。请只输出符合 schema 的压缩决策 JSON,不要多余文字/markdown 代码块。")], t.signal));
5022
5088
  } catch {
5023
5089
  return null;
5024
5090
  } finally {
@@ -5026,22 +5092,22 @@ function Ss(e) {
5026
5092
  }
5027
5093
  };
5028
5094
  }
5029
- function Cs(e) {
5030
- let t = e.llm, n = ms(e.llm) ? void 0 : e.llm;
5095
+ function ws(e) {
5096
+ let t = e.llm, n = hs(e.llm) ? void 0 : e.llm;
5031
5097
  return {
5032
5098
  modelCaps: ni({
5033
5099
  model: n?.model ?? t?.model ?? t?.modelName,
5034
5100
  contextWindow: e.contextWindow ?? n?.contextWindow ?? t?.contextWindow,
5035
5101
  maxOutputTokens: e.maxOutputTokens ?? n?.maxOutputTokens ?? t?.maxOutputTokens
5036
5102
  }),
5037
- summaryLlmInvoke: gs(e),
5038
- titleLlmInvoke: _s(e),
5039
- compressDecisionInvoke: Ss(e)
5103
+ summaryLlmInvoke: _s(e),
5104
+ titleLlmInvoke: vs(e),
5105
+ compressDecisionInvoke: Cs(e)
5040
5106
  };
5041
5107
  }
5042
5108
  //#endregion
5043
5109
  //#region src/core/sdk/conflictManager.ts
5044
- function ws(e) {
5110
+ function Ts(e) {
5045
5111
  let t = /* @__PURE__ */ Ot(null), n = 0;
5046
5112
  function r(r) {
5047
5113
  return new Promise((i) => {
@@ -5072,7 +5138,7 @@ function ws(e) {
5072
5138
  }
5073
5139
  //#endregion
5074
5140
  //#region src/core/utils/id.ts
5075
- function Ts() {
5141
+ function Es() {
5076
5142
  try {
5077
5143
  if (typeof crypto < "u" && typeof crypto.randomUUID == "function") return crypto.randomUUID();
5078
5144
  } catch {}
@@ -5080,7 +5146,7 @@ function Ts() {
5080
5146
  }
5081
5147
  //#endregion
5082
5148
  //#region src/core/backends/storage.ts
5083
- var Es = "chat-sdk", Ds = 50 * 1024 * 1024, Os = 4 * 1024 * 1024, ks = 10 * 1024 * 1024, As = .9, js = 500, Ms = 300, Ns = "__meta__", Ps = "v:1", Fs = [
5149
+ var Ds = "chat-sdk", Os = 50 * 1024 * 1024, ks = 4 * 1024 * 1024, As = 10 * 1024 * 1024, js = .9, Ms = 500, Ns = 300, Ps = "__meta__", Fs = "v:1", Is = [
5084
5150
  "messages",
5085
5151
  "vfs",
5086
5152
  "todos",
@@ -5091,51 +5157,51 @@ var Es = "chat-sdk", Ds = 50 * 1024 * 1024, Os = 4 * 1024 * 1024, ks = 10 * 1024
5091
5157
  "workingMemory",
5092
5158
  "focus"
5093
5159
  ];
5094
- function Is(e) {
5095
- return e === "local" || e === "session" ? Os : Ds;
5096
- }
5097
5160
  function Ls(e) {
5161
+ return e === "local" || e === "session" ? ks : Os;
5162
+ }
5163
+ function Rs(e) {
5098
5164
  if (typeof e != "object" || !e) return !1;
5099
5165
  let t = e;
5100
5166
  return t.name === "QuotaExceededError" || t.name === "NS_ERROR_DOM_QUOTA_REACHED" || t.code === 22 || t.code === 1014;
5101
5167
  }
5102
- function Rs(e, t, n, r) {
5168
+ function zs(e, t, n, r) {
5103
5169
  return [
5104
- Ps,
5170
+ Fs,
5105
5171
  e,
5106
5172
  t,
5107
5173
  n,
5108
5174
  r
5109
5175
  ].join("::");
5110
5176
  }
5111
- function zs(e, t, n) {
5177
+ function Bs(e, t, n) {
5112
5178
  return [
5113
- Ps,
5179
+ Fs,
5114
5180
  e,
5115
5181
  t,
5116
5182
  n
5117
5183
  ].join("::") + "::";
5118
5184
  }
5119
- function Bs(e, t) {
5185
+ function Vs(e, t) {
5120
5186
  return [
5121
- Ps,
5187
+ Fs,
5122
5188
  e,
5123
5189
  t
5124
5190
  ].join("::") + "::";
5125
5191
  }
5126
- function Vs(e) {
5127
- return [Ps, e].join("::") + "::";
5192
+ function Hs(e) {
5193
+ return [Fs, e].join("::") + "::";
5128
5194
  }
5129
- var Hs = null;
5130
- function Us(e) {
5131
- Hs ||= new TextEncoder();
5195
+ var Us = null;
5196
+ function Ws(e) {
5197
+ Us ||= new TextEncoder();
5132
5198
  try {
5133
- return Hs.encode(JSON.stringify(e)).length;
5199
+ return Us.encode(JSON.stringify(e)).length;
5134
5200
  } catch {
5135
5201
  return 0;
5136
5202
  }
5137
5203
  }
5138
- function Ws(e, t, n) {
5204
+ function Gs(e, t, n) {
5139
5205
  let r = e.reduce((e, t) => e + t.bytes, 0);
5140
5206
  if (r <= t) return [];
5141
5207
  let i = t * n, a = [...e].sort((e, t) => e.lastAccessed - t.lastAccessed), o = [];
@@ -5145,7 +5211,7 @@ function Ws(e, t, n) {
5145
5211
  }
5146
5212
  return o;
5147
5213
  }
5148
- function Gs() {
5214
+ function Ks() {
5149
5215
  let e = /* @__PURE__ */ new Map();
5150
5216
  return {
5151
5217
  async get(t) {
@@ -5165,7 +5231,7 @@ function Gs() {
5165
5231
  }
5166
5232
  };
5167
5233
  }
5168
- function Ks(e) {
5234
+ function qs(e) {
5169
5235
  return new Promise((t, n) => {
5170
5236
  if (typeof indexedDB > "u") {
5171
5237
  n(/* @__PURE__ */ Error("indexedDB 不可用"));
@@ -5226,7 +5292,7 @@ function Ks(e) {
5226
5292
  }, r.onerror = () => n(r.error);
5227
5293
  });
5228
5294
  }
5229
- function qs(e) {
5295
+ function Js(e) {
5230
5296
  return {
5231
5297
  async get(t) {
5232
5298
  let n = e.getItem(t);
@@ -5260,12 +5326,12 @@ function qs(e) {
5260
5326
  }
5261
5327
  };
5262
5328
  }
5263
- function Js(e, t, n) {
5329
+ function Ys(e, t, n) {
5264
5330
  let r = (e.get(t) ?? Promise.resolve()).then(n, n);
5265
5331
  return e.set(t, r.then(() => void 0, () => void 0)), r;
5266
5332
  }
5267
- function Ys(e = {}) {
5268
- let t = e.dbName ?? Es, n = e.backend ?? "indexed", r = e.maxBytes ?? Is(n), i = e.maxBytesPerSession ?? ks, a = e.evictionWatermark ?? As, o = e.debounceMs ?? js, s = /* @__PURE__ */ new Set();
5333
+ function Xs(e = {}) {
5334
+ let t = e.dbName ?? Ds, n = e.backend ?? "indexed", r = e.maxBytes ?? Ls(n), i = e.maxBytesPerSession ?? As, a = e.evictionWatermark ?? js, o = e.debounceMs ?? Ms, s = /* @__PURE__ */ new Set();
5269
5335
  function c(e) {
5270
5336
  for (let t of s) try {
5271
5337
  t(e);
@@ -5278,16 +5344,16 @@ function Ys(e = {}) {
5278
5344
  try {
5279
5345
  if (n === "indexed") {
5280
5346
  if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
5281
- l = await Ks(t), d(!0);
5347
+ l = await qs(t), d(!0);
5282
5348
  } else if (n === "session") {
5283
5349
  if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
5284
- l = qs(sessionStorage), d(!0);
5350
+ l = Js(sessionStorage), d(!0);
5285
5351
  } else if (n === "local") {
5286
5352
  if (typeof localStorage > "u") throw Error("localStorage 不可用");
5287
- l = qs(localStorage), d(!0);
5288
- } else l = Gs(), d(!1);
5353
+ l = Js(localStorage), d(!0);
5354
+ } else l = Ks(), d(!1);
5289
5355
  } catch (e) {
5290
- l = Gs();
5356
+ l = Ks();
5291
5357
  let t = e instanceof Error ? e.message : String(e);
5292
5358
  d(!1), Promise.resolve().then(() => c({
5293
5359
  type: "degraded",
@@ -5297,10 +5363,10 @@ function Ys(e = {}) {
5297
5363
  })();
5298
5364
  let p = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map();
5299
5365
  function g(e, n, r, a) {
5300
- let o = Rs(t, r, a, Ns);
5301
- return Js(h, o, async () => {
5366
+ let o = zs(t, r, a, Ps);
5367
+ return Ys(h, o, async () => {
5302
5368
  let t = async () => {
5303
- let t = await l.get(o), s = await l.get(e), u = s == null ? 0 : Us(s), d = Us(n), f = (t?.bytes ?? 0) + (d - u);
5369
+ let t = await l.get(o), s = await l.get(e), u = s == null ? 0 : Ws(s), d = Ws(n), f = (t?.bytes ?? 0) + (d - u);
5304
5370
  if (f > i) {
5305
5371
  c({
5306
5372
  type: "quota",
@@ -5322,12 +5388,12 @@ function Ys(e = {}) {
5322
5388
  try {
5323
5389
  await t();
5324
5390
  } catch (e) {
5325
- if (Ls(e) && !u) {
5391
+ if (Rs(e) && !u) {
5326
5392
  u = !0;
5327
5393
  try {
5328
5394
  await b();
5329
5395
  } catch {}
5330
- l = Gs(), Promise.resolve().then(() => c({
5396
+ l = Ks(), Promise.resolve().then(() => c({
5331
5397
  type: "degraded",
5332
5398
  reason: "存储配额超限(QuotaExceededError),已淘汰最旧会话并降级内存"
5333
5399
  }));
@@ -5339,7 +5405,7 @@ function Ys(e = {}) {
5339
5405
  });
5340
5406
  }
5341
5407
  function _(e, n, r, i) {
5342
- let a = Rs(t, e, n, r), s = p.get(a);
5408
+ let a = zs(t, e, n, r), s = p.get(a);
5343
5409
  s && s.resolve();
5344
5410
  let c = m.get(a);
5345
5411
  return c && clearTimeout(c), new Promise((t) => {
@@ -5366,15 +5432,15 @@ function Ys(e = {}) {
5366
5432
  function y() {
5367
5433
  v ||= setTimeout(() => {
5368
5434
  v = null, b();
5369
- }, Ms);
5435
+ }, Ns);
5370
5436
  }
5371
5437
  async function b() {
5372
5438
  let e = [];
5373
- await l.scan(Vs(t), (t, n) => {
5439
+ await l.scan(Hs(t), (t, n) => {
5374
5440
  t.endsWith("::__meta__") && e.push(n);
5375
5441
  });
5376
- let n = Ws(e, r, a);
5377
- for (let e of n) await l.clearPrefix(zs(t, e.agentId, e.sessionId)), c({
5442
+ let n = Gs(e, r, a);
5443
+ for (let e of n) await l.clearPrefix(Bs(t, e.agentId, e.sessionId)), c({
5378
5444
  type: "evicted",
5379
5445
  agentId: e.agentId,
5380
5446
  sessionId: e.sessionId,
@@ -5385,13 +5451,13 @@ function Ys(e = {}) {
5385
5451
  ready: f,
5386
5452
  async listSessions(e) {
5387
5453
  let n = [];
5388
- return await l.scan(Bs(t, e), (e, t) => {
5454
+ return await l.scan(Vs(t, e), (e, t) => {
5389
5455
  e.endsWith("::__meta__") && n.push(t);
5390
5456
  }), n.sort((e, t) => t.lastAccessed - e.lastAccessed);
5391
5457
  },
5392
5458
  async load(e, n) {
5393
- let r = Rs(t, e, n, Ns);
5394
- return await Js(h, r, async () => {
5459
+ let r = zs(t, e, n, Ps);
5460
+ return await Ys(h, r, async () => {
5395
5461
  let i = await l.get(r);
5396
5462
  if (!i) return;
5397
5463
  let a = {
@@ -5400,8 +5466,8 @@ function Ys(e = {}) {
5400
5466
  todos: [],
5401
5467
  memory: ""
5402
5468
  };
5403
- for (let r of Fs) {
5404
- let i = await l.get(Rs(t, e, n, r));
5469
+ for (let r of Is) {
5470
+ let i = await l.get(zs(t, e, n, r));
5405
5471
  i != null && (a[r] = i);
5406
5472
  }
5407
5473
  return i.lastAccessed = Date.now(), await l.set(r, i), a;
@@ -5409,12 +5475,12 @@ function Ys(e = {}) {
5409
5475
  },
5410
5476
  async save(e, t, n) {
5411
5477
  let r = [];
5412
- for (let i of Fs) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
5478
+ for (let i of Is) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
5413
5479
  await Promise.all(r);
5414
5480
  },
5415
5481
  async updateTitle(e, n, r) {
5416
- let i = Rs(t, e, n, Ns);
5417
- return Js(h, i, async () => {
5482
+ let i = zs(t, e, n, Ps);
5483
+ return Ys(h, i, async () => {
5418
5484
  let e = await l.get(i);
5419
5485
  e && (e.title = r, e.lastAccessed = Date.now(), await l.set(i, e));
5420
5486
  });
@@ -5430,10 +5496,10 @@ function Ys(e = {}) {
5430
5496
  })), c({ type: "flush" }), await b();
5431
5497
  },
5432
5498
  async deleteSession(e, n) {
5433
- await l.clearPrefix(zs(t, e, n));
5499
+ await l.clearPrefix(Bs(t, e, n));
5434
5500
  },
5435
5501
  async createSession(e, n, r) {
5436
- let i = r ?? Ts(), a = Date.now(), o = {
5502
+ let i = r ?? Es(), a = Date.now(), o = {
5437
5503
  agentId: e,
5438
5504
  sessionId: i,
5439
5505
  createdAt: a,
@@ -5441,7 +5507,7 @@ function Ys(e = {}) {
5441
5507
  bytes: 0,
5442
5508
  title: n
5443
5509
  };
5444
- return await l.set(Rs(t, e, i, Ns), o), i;
5510
+ return await l.set(zs(t, e, i, Ps), o), i;
5445
5511
  },
5446
5512
  onEvent(e) {
5447
5513
  s.add(e);
@@ -5456,15 +5522,15 @@ function Ys(e = {}) {
5456
5522
  }
5457
5523
  //#endregion
5458
5524
  //#region src/core/sdk/optionsResolver.ts
5459
- function Xs(e) {
5460
- return e === void 0 || e === !1 ? null : typeof e == "string" ? Ys({ backend: e }) : e.enabled === !1 ? null : Ys(e);
5461
- }
5462
5525
  function Zs(e) {
5526
+ return e === void 0 || e === !1 ? null : typeof e == "string" ? Xs({ backend: e }) : e.enabled === !1 ? null : Xs(e);
5527
+ }
5528
+ function Qs(e) {
5463
5529
  return e.dialog ?? {};
5464
5530
  }
5465
5531
  //#endregion
5466
5532
  //#region src/core/capabilities.ts
5467
- var Qs = [
5533
+ var $s = [
5468
5534
  {
5469
5535
  name: "dataOps",
5470
5536
  defaultOn: !0
@@ -5553,13 +5619,13 @@ var Qs = [
5553
5619
  requires: ["summarization"]
5554
5620
  }
5555
5621
  ];
5556
- function $s(e) {
5622
+ function ec(e) {
5557
5623
  let t = {};
5558
- for (let n of Qs) {
5624
+ for (let n of $s) {
5559
5625
  let r = e?.[n.name];
5560
5626
  t[n.name] = n.defaultOn ? r !== !1 : r === !0;
5561
5627
  }
5562
- for (let e of Qs) if (e.requires && t[e.name]) {
5628
+ for (let e of $s) if (e.requires && t[e.name]) {
5563
5629
  for (let n of e.requires) if (!t[n]) {
5564
5630
  t[e.name] = !1;
5565
5631
  break;
@@ -5569,7 +5635,7 @@ function $s(e) {
5569
5635
  }
5570
5636
  //#endregion
5571
5637
  //#region src/core/sdk/events.ts
5572
- function ec(e) {
5638
+ function tc(e) {
5573
5639
  let t = /* @__PURE__ */ new Set(), n = (n) => {
5574
5640
  if (n.type !== "approval_request") {
5575
5641
  if (e) try {
@@ -5595,7 +5661,7 @@ function ec(e) {
5595
5661
  }
5596
5662
  //#endregion
5597
5663
  //#region src/core/sdk/contextPreset.ts
5598
- var tc = {
5664
+ var nc = {
5599
5665
  auto: {
5600
5666
  summaryThresholdRatio: .5,
5601
5667
  windowRatio: .4,
@@ -5623,7 +5689,7 @@ var tc = {
5623
5689
  enableRecall: !0,
5624
5690
  enableLLMSummary: !0
5625
5691
  }
5626
- }, nc = {
5692
+ }, rc = {
5627
5693
  auto: ["describe_data", "read"],
5628
5694
  conservative: ["describe_data"],
5629
5695
  aggressive: ["describe_data", "read"],
@@ -5634,8 +5700,8 @@ var tc = {
5634
5700
  "search_data"
5635
5701
  ]
5636
5702
  };
5637
- function rc(e, t) {
5638
- let n = tc[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
5703
+ function ic(e, t) {
5704
+ let n = nc[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
5639
5705
  return {
5640
5706
  ...n,
5641
5707
  ...r,
@@ -5645,7 +5711,7 @@ function rc(e, t) {
5645
5711
  }
5646
5712
  //#endregion
5647
5713
  //#region src/core/sdk/middlewareStack.ts
5648
- var ic = {
5714
+ var ac = {
5649
5715
  dataHint: 10,
5650
5716
  usageHints: 20,
5651
5717
  todos: 30,
@@ -5662,29 +5728,29 @@ var ic = {
5662
5728
  subagents: 140,
5663
5729
  augmentSystem: 150
5664
5730
  };
5665
- function ac(e) {
5731
+ function oc(e) {
5666
5732
  return e.map((e, t) => ({
5667
5733
  m: e,
5668
5734
  i: t,
5669
- p: ic[e.name] ?? Infinity
5735
+ p: ac[e.name] ?? Infinity
5670
5736
  })).sort((e, t) => e.p - t.p || e.i - t.i).map((e) => e.m);
5671
5737
  }
5672
5738
  //#endregion
5673
5739
  //#region src/core/tools/jsonUtils.ts
5674
- var oc = /* @__PURE__ */ new Set([
5740
+ var sc = /* @__PURE__ */ new Set([
5675
5741
  "__proto__",
5676
5742
  "constructor",
5677
5743
  "prototype"
5678
5744
  ]);
5679
- function sc(e) {
5680
- return e.split(".").some((e) => oc.has(e));
5745
+ function cc(e) {
5746
+ return e.split(".").some((e) => sc.has(e));
5681
5747
  }
5682
- function cc(e, t) {
5683
- if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t)) oc.has(n) || (e[n] = t[n]);
5748
+ function lc(e, t) {
5749
+ if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t)) sc.has(n) || (e[n] = t[n]);
5684
5750
  }
5685
5751
  function Z(e, t) {
5686
5752
  if (!t) return e;
5687
- if (sc(t)) return;
5753
+ if (cc(t)) return;
5688
5754
  let n = t.split("."), r = e;
5689
5755
  for (let e of n) {
5690
5756
  if (r == null) return;
@@ -5692,8 +5758,8 @@ function Z(e, t) {
5692
5758
  }
5693
5759
  return r;
5694
5760
  }
5695
- function lc(e, t, n) {
5696
- if (!t || sc(t)) return;
5761
+ function uc(e, t, n) {
5762
+ if (!t || cc(t)) return;
5697
5763
  let r = t.split("."), i = e;
5698
5764
  for (let e = 0; e < r.length - 1; e++) {
5699
5765
  let t = r[e];
@@ -5701,8 +5767,8 @@ function lc(e, t, n) {
5701
5767
  }
5702
5768
  i[r[r.length - 1]] = n;
5703
5769
  }
5704
- function uc(e, t) {
5705
- if (!t || sc(t)) return !1;
5770
+ function dc(e, t) {
5771
+ if (!t || cc(t)) return !1;
5706
5772
  let n = t.split("."), r = e;
5707
5773
  for (let e = 0; e < n.length - 1; e++) {
5708
5774
  if (r == null) return !1;
@@ -5711,10 +5777,10 @@ function uc(e, t) {
5711
5777
  let i = n[n.length - 1];
5712
5778
  return r == null || !(i in r) ? !1 : (Array.isArray(r) && /^\d+$/.test(i) ? r.splice(Number(i), 1) : delete r[i], !0);
5713
5779
  }
5714
- function dc(e) {
5780
+ function fc(e) {
5715
5781
  return e === void 0 ? void 0 : JSON.parse(JSON.stringify(e));
5716
5782
  }
5717
- function fc(e) {
5783
+ function pc(e) {
5718
5784
  if (typeof e != "string") return { parsed: e };
5719
5785
  let t = e.trim();
5720
5786
  if (!t) return { parsed: e };
@@ -5725,20 +5791,20 @@ function fc(e) {
5725
5791
  return n ? { parseError: t } : { parsed: e };
5726
5792
  }
5727
5793
  }
5728
- function pc(e, t) {
5794
+ function mc(e, t) {
5729
5795
  if (typeof e != "object" || !e) return e;
5730
5796
  let n = new Set(t);
5731
- if (Array.isArray(e)) return e.map((e) => pc(e, t));
5797
+ if (Array.isArray(e)) return e.map((e) => mc(e, t));
5732
5798
  let r = {};
5733
5799
  for (let t of Object.keys(e)) n.has(t) && (r[t] = e[t]);
5734
5800
  return r;
5735
5801
  }
5736
- function mc(e, t) {
5802
+ function hc(e, t) {
5737
5803
  if (typeof e != "object" || !e) return e;
5738
5804
  if (t <= 0) return Array.isArray(e) ? `[...${e.length}]` : "{...}";
5739
- if (Array.isArray(e)) return e.map((e) => mc(e, t - 1));
5805
+ if (Array.isArray(e)) return e.map((e) => hc(e, t - 1));
5740
5806
  let n = {};
5741
- for (let r of Object.keys(e)) n[r] = mc(e[r], t - 1);
5807
+ for (let r of Object.keys(e)) n[r] = hc(e[r], t - 1);
5742
5808
  return n;
5743
5809
  }
5744
5810
  function Q(e, t = Infinity) {
@@ -5760,7 +5826,7 @@ function Q(e, t = Infinity) {
5760
5826
  }
5761
5827
  return r.length > t && (r = r.slice(0, t) + `\n…[已截断,原长度 ${r.length}]`), r;
5762
5828
  }
5763
- function hc(e, t = 0) {
5829
+ function gc(e, t = 0) {
5764
5830
  let n = 3735928559 ^ t, r = 1103547991 ^ t;
5765
5831
  for (let t = 0; t < e.length; t++) {
5766
5832
  let i = e.charCodeAt(t);
@@ -5769,31 +5835,31 @@ function hc(e, t = 0) {
5769
5835
  return n = Math.imul(n ^ n >>> 16, 2246822507) ^ Math.imul(r ^ r >>> 13, 3266489909), r = Math.imul(r ^ r >>> 16, 2246822507) ^ Math.imul(n ^ n >>> 13, 3266489909), 4294967296 * (2097151 & r) + (n >>> 0);
5770
5836
  }
5771
5837
  function $(e) {
5772
- return hc(Q(e)).toString(36);
5838
+ return gc(Q(e)).toString(36);
5773
5839
  }
5774
- function gc(e, t, n, r) {
5775
- if (t === "set") return n ? (lc(e, n, r), null) : "set 操作需要 jsonPath(整体替换请用 set_data)";
5776
- if (t === "remove") return n ? (uc(e, n), null) : "remove 操作需要 jsonPath";
5840
+ function _c(e, t, n, r) {
5841
+ if (t === "set") return n ? (uc(e, n, r), null) : "set 操作需要 jsonPath(整体替换请用 set_data)";
5842
+ if (t === "remove") return n ? (dc(e, n), null) : "remove 操作需要 jsonPath";
5777
5843
  if (t === "merge") {
5778
5844
  let t = n ? Z(e, n) : e;
5779
- return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (cc(t, r), null);
5845
+ return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (lc(t, r), null);
5780
5846
  }
5781
5847
  let i = n ? Z(e, n) : e;
5782
5848
  return Array.isArray(i) ? (Array.isArray(r) ? i.push(...r) : i.push(r), null) : `append 目标${n ? `(${n})` : "(根)"}不是数组`;
5783
5849
  }
5784
- function _c(e, t, n, r) {
5785
- if (t === "set") lc(e, n, r);
5786
- else if (t === "remove") uc(e, n);
5787
- else if (t === "merge") cc(n ? Z(e, n) : e, r);
5850
+ function vc(e, t, n, r) {
5851
+ if (t === "set") uc(e, n, r);
5852
+ else if (t === "remove") dc(e, n);
5853
+ else if (t === "merge") lc(n ? Z(e, n) : e, r);
5788
5854
  else {
5789
5855
  let t = n ? Z(e, n) : e;
5790
5856
  Array.isArray(r) ? t.push(...r) : t.push(r);
5791
5857
  }
5792
5858
  }
5793
- function vc(e, t) {
5794
- typeof e == "object" && e && yc(e, t);
5795
- }
5796
5859
  function yc(e, t) {
5860
+ typeof e == "object" && e && bc(e, t);
5861
+ }
5862
+ function bc(e, t) {
5797
5863
  if (Array.isArray(e)) {
5798
5864
  e.length = 0, Array.isArray(t) && e.push(...t);
5799
5865
  return;
@@ -5802,7 +5868,7 @@ function yc(e, t) {
5802
5868
  for (let t of Object.keys(e)) t in n || delete e[t];
5803
5869
  for (let t of Object.keys(n)) e[t] = n[t];
5804
5870
  }
5805
- function bc(e, t, n = "") {
5871
+ function xc(e, t, n = "") {
5806
5872
  let r = [];
5807
5873
  if (!(typeof e == "object" && e) || !(typeof t == "object" && t) || Array.isArray(e) !== Array.isArray(t)) return e !== t && r.push({
5808
5874
  path: n || "(root)",
@@ -5821,14 +5887,14 @@ function bc(e, t, n = "") {
5821
5887
  path: i,
5822
5888
  from: e[a],
5823
5889
  to: void 0
5824
- }) : r.push(...bc(e[a], t[a], i));
5890
+ }) : r.push(...xc(e[a], t[a], i));
5825
5891
  }
5826
5892
  return r;
5827
5893
  }
5828
5894
  let i = e, a = t, o = /* @__PURE__ */ new Set([...Object.keys(i), ...Object.keys(a)]);
5829
5895
  for (let e of o) {
5830
5896
  let t = n ? `${n}.${e}` : e;
5831
- e in i ? e in a ? r.push(...bc(i[e], a[e], t)) : r.push({
5897
+ e in i ? e in a ? r.push(...xc(i[e], a[e], t)) : r.push({
5832
5898
  path: t,
5833
5899
  from: i[e],
5834
5900
  to: void 0
@@ -5840,48 +5906,48 @@ function bc(e, t, n = "") {
5840
5906
  }
5841
5907
  return r;
5842
5908
  }
5843
- var xc = {
5909
+ var Sc = {
5844
5910
  largeResults: 4 * 1024 * 1024,
5845
5911
  drafts: 2 * 1024 * 1024,
5846
5912
  userFiles: 2 * 1024 * 1024,
5847
5913
  resources: 4 * 1024 * 1024
5848
- }, Sc = [
5914
+ }, Cc = [
5849
5915
  "largeResults",
5850
5916
  "drafts",
5851
5917
  "userFiles",
5852
5918
  "resources"
5853
- ], Cc = .9;
5854
- function wc(e, t = {}) {
5919
+ ], wc = .9;
5920
+ function Tc(e, t = {}) {
5855
5921
  let n = Object.create(null);
5856
- if (e) for (let [t, r] of Object.entries(e)) n[Oc(t)] = {
5922
+ if (e) for (let [t, r] of Object.entries(e)) n[kc(t)] = {
5857
5923
  content: r,
5858
- updatedAt: Ac()
5924
+ updatedAt: jc()
5859
5925
  };
5860
5926
  let { persist: r } = t, i = t.maxBytes ?? 8388608, a = {
5861
- ...xc,
5927
+ ...Sc,
5862
5928
  ...t.poolBytes ?? {}
5863
5929
  };
5864
5930
  function o(e) {
5865
- let t = Oc(e);
5931
+ let t = kc(e);
5866
5932
  return t.startsWith("large_results/") ? "largeResults" : t.startsWith("drafts/") ? "drafts" : t.startsWith("resources/") ? "resources" : "userFiles";
5867
5933
  }
5868
5934
  function s(e) {
5869
5935
  let t = 0;
5870
- for (let [r, i] of Object.entries(n)) o(r) === e && (t += Ec(i.content));
5936
+ for (let [r, i] of Object.entries(n)) o(r) === e && (t += Dc(i.content));
5871
5937
  return t;
5872
5938
  }
5873
5939
  function c() {
5874
- for (let e of Sc) {
5940
+ for (let e of Cc) {
5875
5941
  let t = a[e];
5876
5942
  if (s(e) <= t) continue;
5877
- let r = t * Cc, i = e === "largeResults", c = i && s(e) > t * 1.5;
5943
+ let r = t * wc, i = e === "largeResults", c = i && s(e) > t * 1.5;
5878
5944
  c && console.warn(`[page-agent-sdk] vfs large_results 池 ${s(e)} > ${Math.round(t * 1.5)}(被引用撑爆)→ 无视 protectedRefs 强制删`);
5879
5945
  let l = Object.entries(n).filter(([t]) => o(t) === e).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
5880
5946
  for (let [t] of l) if (!(i && !c && u.has(t)) && (delete n[t], s(e) <= r)) break;
5881
5947
  }
5882
- if (Dc(n) > i) {
5883
- let e = i * Cc, t = Dc(n) > i * 1.5, r = Object.entries(n).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
5884
- for (let [i] of r) if (!(o(i) === "largeResults" && !t && u.has(i)) && (delete n[i], Dc(n) <= e)) break;
5948
+ if (Oc(n) > i) {
5949
+ let e = i * wc, t = Oc(n) > i * 1.5, r = Object.entries(n).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
5950
+ for (let [i] of r) if (!(o(i) === "largeResults" && !t && u.has(i)) && (delete n[i], Oc(n) <= e)) break;
5885
5951
  }
5886
5952
  }
5887
5953
  let l = !0, u = /* @__PURE__ */ new Set(), d = null;
@@ -5917,7 +5983,7 @@ function wc(e, t = {}) {
5917
5983
  }
5918
5984
  };
5919
5985
  return r && (m.hydrate = (e) => {
5920
- for (let [t, r] of Object.entries(e)) n[Oc(t)] = r;
5986
+ for (let [t, r] of Object.entries(e)) n[kc(t)] = r;
5921
5987
  c(), l = !0;
5922
5988
  }, m.flush = () => {
5923
5989
  d &&= (clearTimeout(d), null), f();
@@ -5926,19 +5992,19 @@ function wc(e, t = {}) {
5926
5992
  p(), l = !0;
5927
5993
  }), m;
5928
5994
  }
5929
- var Tc = null;
5930
- function Ec(e) {
5931
- return Tc ||= new TextEncoder(), Tc.encode(e).length;
5932
- }
5995
+ var Ec = null;
5933
5996
  function Dc(e) {
5997
+ return Ec ||= new TextEncoder(), Ec.encode(e).length;
5998
+ }
5999
+ function Oc(e) {
5934
6000
  let t = 0;
5935
- for (let n of Object.values(e)) t += Ec(n.content);
6001
+ for (let n of Object.values(e)) t += Dc(n.content);
5936
6002
  return t;
5937
6003
  }
5938
- function Oc(e) {
6004
+ function kc(e) {
5939
6005
  return e.replace(/^\/+/, "").replace(/\/+/g, "/");
5940
6006
  }
5941
- function kc(e) {
6007
+ function Ac(e) {
5942
6008
  let t = "";
5943
6009
  for (let n = 0; n < e.length; n++) {
5944
6010
  let r = e[n];
@@ -5946,10 +6012,10 @@ function kc(e) {
5946
6012
  }
5947
6013
  return RegExp("^" + t + "$");
5948
6014
  }
5949
- function Ac() {
6015
+ function jc() {
5950
6016
  return Date.now();
5951
6017
  }
5952
- var jc = [
6018
+ var Mc = [
5953
6019
  "vfs_read",
5954
6020
  "vfs_write",
5955
6021
  "vfs_edit",
@@ -5960,10 +6026,10 @@ var jc = [
5960
6026
  "vfs_json_patch",
5961
6027
  "vfs_rm"
5962
6028
  ];
5963
- function Mc(e) {
6029
+ function Nc(e) {
5964
6030
  return [
5965
6031
  r(async ({ path: t, offset: n, limit: r }) => {
5966
- let i = e.files[Oc(t)];
6032
+ let i = e.files[kc(t)];
5967
6033
  if (!i) return Y({
5968
6034
  code: "NOT_FOUND",
5969
6035
  path: t,
@@ -5992,9 +6058,9 @@ function Mc(e) {
5992
6058
  hint: "jsonString=true 要求 content 是合法 JSON;检查引号/逗号/括号配对;或省略 jsonString 写纯文本"
5993
6059
  });
5994
6060
  }
5995
- return e.files[Oc(t)] = {
6061
+ return e.files[kc(t)] = {
5996
6062
  content: n,
5997
- updatedAt: Ac()
6063
+ updatedAt: jc()
5998
6064
  }, `已写入 ${t}(${n.length} 字符)${r ? "(JSON 校验通过)" : ""}`;
5999
6065
  }, {
6000
6066
  name: "vfs_write",
@@ -6006,7 +6072,7 @@ function Mc(e) {
6006
6072
  })
6007
6073
  }),
6008
6074
  r(async ({ path: t, oldString: n, newString: r }) => {
6009
- let i = Oc(t), a = e.files[i];
6075
+ let i = kc(t), a = e.files[i];
6010
6076
  if (!a) return Y({
6011
6077
  code: "NOT_FOUND",
6012
6078
  path: t,
@@ -6036,7 +6102,7 @@ function Mc(e) {
6036
6102
  }
6037
6103
  return e.files[i] = {
6038
6104
  content: a.content.replace(n, r),
6039
- updatedAt: Ac()
6105
+ updatedAt: jc()
6040
6106
  }, `已替换 ${t} 中 1 处。`;
6041
6107
  }, {
6042
6108
  name: "vfs_edit",
@@ -6058,7 +6124,7 @@ function Mc(e) {
6058
6124
  r(async ({ pattern: t }) => {
6059
6125
  let n;
6060
6126
  try {
6061
- n = kc(t);
6127
+ n = Ac(t);
6062
6128
  } catch (e) {
6063
6129
  return Y({
6064
6130
  code: "GLOB_INVALID",
@@ -6087,7 +6153,7 @@ function Mc(e) {
6087
6153
  details: { pattern: t }
6088
6154
  });
6089
6155
  }
6090
- let i = n ? [Oc(n)] : Object.keys(e.files), a = [];
6156
+ let i = n ? [kc(n)] : Object.keys(e.files), a = [];
6091
6157
  for (let t of i) {
6092
6158
  let n = e.files[t];
6093
6159
  n && n.content.split("\n").forEach((e, n) => {
@@ -6104,7 +6170,7 @@ function Mc(e) {
6104
6170
  })
6105
6171
  }),
6106
6172
  r(async ({ path: t, jsonPath: n }) => {
6107
- let r = Oc(t), i = e.files[r];
6173
+ let r = kc(t), i = e.files[r];
6108
6174
  if (!i) return Y({
6109
6175
  code: "NOT_FOUND",
6110
6176
  path: t,
@@ -6141,7 +6207,7 @@ function Mc(e) {
6141
6207
  })
6142
6208
  }),
6143
6209
  r(async ({ path: t, patches: n }) => {
6144
- let r = Oc(t), i = e.files[r];
6210
+ let r = kc(t), i = e.files[r];
6145
6211
  if (!i) return Y({
6146
6212
  code: "NOT_FOUND",
6147
6213
  path: t,
@@ -6159,9 +6225,9 @@ function Mc(e) {
6159
6225
  hint: "vfs_json_patch 要求文件内容是合法 JSON"
6160
6226
  });
6161
6227
  }
6162
- let o = dc(a), s = [];
6228
+ let o = fc(a), s = [];
6163
6229
  for (let e of n) {
6164
- let n = gc(o, e.op, e.jsonPath, e.value);
6230
+ let n = _c(o, e.op, e.jsonPath, e.value);
6165
6231
  if (n) return Y({
6166
6232
  code: "PATCH_FAILED",
6167
6233
  path: t,
@@ -6174,7 +6240,7 @@ function Mc(e) {
6174
6240
  let c = JSON.stringify(o);
6175
6241
  return e.files[r] = {
6176
6242
  content: c,
6177
- updatedAt: Ac()
6243
+ updatedAt: jc()
6178
6244
  }, `已对 ${t} 应用 ${n.length} 个 patch(影响 ${s.length} 处:${s.join(", ")}),文件现 ${c.length} 字符`;
6179
6245
  }, {
6180
6246
  name: "vfs_json_patch",
@@ -6194,7 +6260,7 @@ function Mc(e) {
6194
6260
  })
6195
6261
  }),
6196
6262
  r(async ({ path: t }) => {
6197
- let n = Oc(t);
6263
+ let n = kc(t);
6198
6264
  return e.files[n] ? (delete e.files[n], `已删除 ${t}`) : Y({
6199
6265
  code: "NOT_FOUND",
6200
6266
  path: t,
@@ -6208,17 +6274,17 @@ function Mc(e) {
6208
6274
  })
6209
6275
  ];
6210
6276
  }
6211
- function Nc(e) {
6277
+ function Pc(e) {
6212
6278
  return {
6213
6279
  name: "vfs",
6214
- tools: Mc(e),
6280
+ tools: Nc(e),
6215
6281
  beforeAgent: () => ({ files: e.files })
6216
6282
  };
6217
6283
  }
6218
6284
  //#endregion
6219
6285
  //#region src/core/tools/dataSlotQuery.ts
6220
- var Pc = /[\w$-]/;
6221
- function Fc(e) {
6286
+ var Fc = /[\w$-]/;
6287
+ function Ic(e) {
6222
6288
  let t = [], n = e.trim(), r = +(n[0] === "$");
6223
6289
  for (; r < n.length;) {
6224
6290
  let e = n[r];
@@ -6229,7 +6295,7 @@ function Fc(e) {
6229
6295
  continue;
6230
6296
  }
6231
6297
  let e = "";
6232
- for (; r < n.length && Pc.test(n[r]);) e += n[r++];
6298
+ for (; r < n.length && Fc.test(n[r]);) e += n[r++];
6233
6299
  if (!e) throw Error("JSONPath: .. 后缺属性名");
6234
6300
  t.push({
6235
6301
  type: "descendKey",
@@ -6242,7 +6308,7 @@ function Fc(e) {
6242
6308
  continue;
6243
6309
  }
6244
6310
  let e = "";
6245
- for (; r < n.length && Pc.test(n[r]);) e += n[r++];
6311
+ for (; r < n.length && Fc.test(n[r]);) e += n[r++];
6246
6312
  if (!e) throw Error("JSONPath: . 后缺属性名");
6247
6313
  t.push({
6248
6314
  type: "key",
@@ -6298,7 +6364,7 @@ function Fc(e) {
6298
6364
  }
6299
6365
  return t;
6300
6366
  }
6301
- function Ic(e) {
6367
+ function Lc(e) {
6302
6368
  let t = [], n = 0, r = e.trim();
6303
6369
  for (; n < r.length;) {
6304
6370
  let e = r[n];
@@ -6343,7 +6409,7 @@ function Ic(e) {
6343
6409
  }
6344
6410
  return t;
6345
6411
  }
6346
- var Lc = class {
6412
+ var Rc = class {
6347
6413
  toks;
6348
6414
  item;
6349
6415
  pos = 0;
@@ -6379,12 +6445,12 @@ var Lc = class {
6379
6445
  return this.next(), e;
6380
6446
  }
6381
6447
  let e = this.operand(), t = this.peek();
6382
- return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), Bc(t, e, this.operand())) : Rc(e);
6448
+ return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), Vc(t, e, this.operand())) : zc(e);
6383
6449
  }
6384
6450
  operand() {
6385
6451
  let e = this.next();
6386
6452
  if (e === void 0) throw Error("过滤表达式:缺操作数");
6387
- if (e.startsWith("@")) return zc(e, this.item);
6453
+ if (e.startsWith("@")) return Bc(e, this.item);
6388
6454
  if (e[0] === "'" || e[0] === "\"") return e.slice(1, -1);
6389
6455
  if (e === "true") return !0;
6390
6456
  if (e === "false") return !1;
@@ -6394,10 +6460,10 @@ var Lc = class {
6394
6460
  throw Error(`过滤表达式:未知操作数 '${e}'`);
6395
6461
  }
6396
6462
  };
6397
- function Rc(e) {
6463
+ function zc(e) {
6398
6464
  return !!e && e !== 0 && e !== "" && e !== null;
6399
6465
  }
6400
- function zc(e, t) {
6466
+ function Bc(e, t) {
6401
6467
  let n = e.split(".").filter((e) => e && e !== "@"), r = t;
6402
6468
  for (let e of n) {
6403
6469
  if (typeof r != "object" || !r) return;
@@ -6405,7 +6471,7 @@ function zc(e, t) {
6405
6471
  }
6406
6472
  return r;
6407
6473
  }
6408
- function Bc(e, t, n) {
6474
+ function Vc(e, t, n) {
6409
6475
  switch (e) {
6410
6476
  case "==": return t === n;
6411
6477
  case "!=": return t !== n;
@@ -6416,47 +6482,47 @@ function Bc(e, t, n) {
6416
6482
  default: return !1;
6417
6483
  }
6418
6484
  }
6419
- function Vc(e, t) {
6420
- return new Lc(Ic(e), t).parse();
6421
- }
6422
6485
  function Hc(e, t) {
6423
- return e ? `${e}.${t}` : String(t);
6486
+ return new Rc(Lc(e), t).parse();
6424
6487
  }
6425
6488
  function Uc(e, t) {
6489
+ return e ? `${e}.${t}` : String(t);
6490
+ }
6491
+ function Wc(e, t) {
6426
6492
  let n = [{
6427
6493
  path: "",
6428
6494
  value: e
6429
6495
  }];
6430
- for (let e of Fc(t)) {
6496
+ for (let e of Ic(t)) {
6431
6497
  let t = [];
6432
6498
  if (e.type === "key") for (let r of n) r.value != null && typeof r.value == "object" && e.key in r.value && t.push({
6433
- path: Hc(r.path, e.key),
6499
+ path: Uc(r.path, e.key),
6434
6500
  value: r.value[e.key]
6435
6501
  });
6436
6502
  else if (e.type === "index") {
6437
6503
  for (let r of n) if (Array.isArray(r.value)) {
6438
6504
  let n = r.value[e.index];
6439
6505
  e.index >= 0 && e.index < r.value.length && t.push({
6440
- path: Hc(r.path, e.index),
6506
+ path: Uc(r.path, e.index),
6441
6507
  value: n,
6442
6508
  index: e.index
6443
6509
  });
6444
6510
  }
6445
6511
  } else if (e.type === "wildcard") {
6446
6512
  for (let e of n) if (Array.isArray(e.value)) e.value.forEach((n, r) => t.push({
6447
- path: Hc(e.path, r),
6513
+ path: Uc(e.path, r),
6448
6514
  value: n,
6449
6515
  index: r
6450
6516
  }));
6451
6517
  else if (e.value != null && typeof e.value == "object") for (let n of Object.keys(e.value)) t.push({
6452
- path: Hc(e.path, n),
6518
+ path: Uc(e.path, n),
6453
6519
  value: e.value[n]
6454
6520
  });
6455
6521
  } else if (e.type === "descendKey") {
6456
6522
  let r = e.key, i = (e) => {
6457
6523
  if (!(e.value == null || typeof e.value != "object")) for (let n of Object.keys(e.value)) {
6458
6524
  let a = {
6459
- path: Hc(e.path, n),
6525
+ path: Uc(e.path, n),
6460
6526
  value: e.value[n]
6461
6527
  };
6462
6528
  n === r && t.push(a), i(a);
@@ -6467,7 +6533,7 @@ function Uc(e, t) {
6467
6533
  let e = (n) => {
6468
6534
  if (!(n.value == null || typeof n.value != "object")) for (let r of Object.keys(n.value)) {
6469
6535
  let i = {
6470
- path: Hc(n.path, r),
6536
+ path: Uc(n.path, r),
6471
6537
  value: n.value[r]
6472
6538
  };
6473
6539
  t.push(i), e(i);
@@ -6476,16 +6542,16 @@ function Uc(e, t) {
6476
6542
  for (let t of n) e(t);
6477
6543
  } else if (e.type === "filter") {
6478
6544
  for (let r of n) if (Array.isArray(r.value)) r.value.forEach((n, i) => {
6479
- Vc(e.filter, n) && t.push({
6480
- path: Hc(r.path, i),
6545
+ Hc(e.filter, n) && t.push({
6546
+ path: Uc(r.path, i),
6481
6547
  value: n,
6482
6548
  index: i
6483
6549
  });
6484
6550
  });
6485
6551
  else if (r.value != null && typeof r.value == "object") for (let n of Object.keys(r.value)) {
6486
6552
  let i = r.value[n];
6487
- Vc(e.filter, i) && t.push({
6488
- path: Hc(r.path, n),
6553
+ Hc(e.filter, i) && t.push({
6554
+ path: Uc(r.path, n),
6489
6555
  value: i
6490
6556
  });
6491
6557
  }
@@ -6494,7 +6560,7 @@ function Uc(e, t) {
6494
6560
  }
6495
6561
  return n;
6496
6562
  }
6497
- function Wc(e, t) {
6563
+ function Gc(e, t) {
6498
6564
  let n = e.length, r = t.length;
6499
6565
  if (!n) return r;
6500
6566
  if (!r) return n;
@@ -6510,7 +6576,7 @@ function Wc(e, t) {
6510
6576
  }
6511
6577
  return i[r];
6512
6578
  }
6513
- function Gc(e, t, n = {}) {
6579
+ function Kc(e, t, n = {}) {
6514
6580
  let r = n.mode || "substring", i = n.limit ?? 50, a = n.matchKey !== !1, o = [], s = null;
6515
6581
  if (r === "regex") try {
6516
6582
  s = new RegExp(t, "i");
@@ -6520,11 +6586,11 @@ function Gc(e, t, n = {}) {
6520
6586
  let c = (e, l, u) => {
6521
6587
  if (o.length >= i || e == null) return;
6522
6588
  if (typeof e == "object") {
6523
- if (Array.isArray(e)) e.forEach((e, t) => c(e, Hc(l, t), String(t)));
6524
- else for (let t of Object.keys(e)) c(e[t], Hc(l, t), t);
6589
+ if (Array.isArray(e)) e.forEach((e, t) => c(e, Uc(l, t), String(t)));
6590
+ else for (let t of Object.keys(e)) c(e[t], Uc(l, t), t);
6525
6591
  return;
6526
6592
  }
6527
- let d = String(e), f = Kc(d, t, r, n.fuzzyThreshold ?? 2, s);
6593
+ let d = String(e), f = qc(d, t, r, n.fuzzyThreshold ?? 2, s);
6528
6594
  if (f) {
6529
6595
  o.push({
6530
6596
  path: l,
@@ -6535,7 +6601,7 @@ function Gc(e, t, n = {}) {
6535
6601
  return;
6536
6602
  }
6537
6603
  if (a && u) {
6538
- let e = Kc(u, t, r, n.fuzzyThreshold ?? 2, s);
6604
+ let e = qc(u, t, r, n.fuzzyThreshold ?? 2, s);
6539
6605
  e && o.push({
6540
6606
  path: l,
6541
6607
  key: u,
@@ -6546,51 +6612,51 @@ function Gc(e, t, n = {}) {
6546
6612
  };
6547
6613
  return c(e, ""), o;
6548
6614
  }
6549
- function Kc(e, t, n, r, i) {
6615
+ function qc(e, t, n, r, i) {
6550
6616
  let a = e.toLowerCase(), o = t.toLowerCase();
6551
6617
  if (n === "substring") return a.includes(o) ? 1 : null;
6552
6618
  if (n === "regex") return i && i.test(e) ? 1 : null;
6553
6619
  if (n === "fuzzy") {
6554
6620
  if (a.includes(o)) return 2;
6555
- let e = Wc(a, o);
6621
+ let e = Gc(a, o);
6556
6622
  return e <= r ? r - e + 1 : null;
6557
6623
  }
6558
6624
  return null;
6559
6625
  }
6560
- function qc(e, t, n = 3e3) {
6626
+ function Jc(e, t, n = 3e3) {
6561
6627
  return ba(t, n)(e);
6562
6628
  }
6563
6629
  //#endregion
6564
6630
  //#region src/core/tools/resources.ts
6565
- var Jc = "⟦frozen:", Yc = "⟦res:", Xc = "⟧";
6566
- function Zc(e) {
6567
- return `${Jc}${e}${Xc}`;
6568
- }
6631
+ var Yc = "⟦frozen:", Xc = "⟦res:", Zc = "⟧";
6569
6632
  function Qc(e) {
6570
- return `${Yc}${e}${Xc}`;
6633
+ return `${Yc}${e}${Zc}`;
6571
6634
  }
6572
6635
  function $c(e) {
6573
- return typeof e == "string" ? e.startsWith(Jc) && e.endsWith(Xc) ? {
6636
+ return `${Xc}${e}${Zc}`;
6637
+ }
6638
+ function el(e) {
6639
+ return typeof e == "string" ? e.startsWith(Yc) && e.endsWith(Zc) ? {
6574
6640
  type: "frozen",
6575
6641
  path: e.slice(8, e.length - 1)
6576
- } : e.startsWith(Yc) && e.endsWith(Xc) ? {
6642
+ } : e.startsWith(Xc) && e.endsWith(Zc) ? {
6577
6643
  type: "res",
6578
6644
  handle: e.slice(5, e.length - 1)
6579
6645
  } : null : null;
6580
6646
  }
6581
- function el(e) {
6647
+ function tl(e) {
6582
6648
  return String(e ?? "").trim().replace(/^\.+/, "");
6583
6649
  }
6584
- function tl(e) {
6650
+ function nl(e) {
6585
6651
  let t = 5381;
6586
6652
  for (let n = 0; n < e.length; n++) t = (t * 33 ^ e.charCodeAt(n)) >>> 0;
6587
6653
  return (t >>> 0).toString(16).padStart(8, "0").slice(0, 8);
6588
6654
  }
6589
- function nl(e, t) {
6655
+ function rl(e, t) {
6590
6656
  return e === t ? !0 : e && t && typeof e == "object" && typeof t == "object" ? JSON.stringify(e) === JSON.stringify(t) : !1;
6591
6657
  }
6592
- function rl(e, t) {
6593
- let n = el(e);
6658
+ function il(e, t) {
6659
+ let n = tl(e);
6594
6660
  if (!n) return;
6595
6661
  let r = t.get(n);
6596
6662
  if (r) return {
@@ -6610,7 +6676,7 @@ function rl(e, t) {
6610
6676
  }));
6611
6677
  return i;
6612
6678
  }
6613
- var il = class {
6679
+ var al = class {
6614
6680
  vfs;
6615
6681
  constructor(e) {
6616
6682
  this.vfs = e;
@@ -6619,7 +6685,7 @@ var il = class {
6619
6685
  return `resources/${e}.json`;
6620
6686
  }
6621
6687
  ensure(e, t, n) {
6622
- let r = tl(e), i = {
6688
+ let r = nl(e), i = {
6623
6689
  path: e,
6624
6690
  mode: n,
6625
6691
  value: t,
@@ -6631,7 +6697,7 @@ var il = class {
6631
6697
  }, r;
6632
6698
  }
6633
6699
  get(e) {
6634
- return this.readEntry(this.key(e)) || this.readEntry(this.key(tl(e)));
6700
+ return this.readEntry(this.key(e)) || this.readEntry(this.key(nl(e)));
6635
6701
  }
6636
6702
  readEntry(e) {
6637
6703
  let t = this.vfs.files[e];
@@ -6647,7 +6713,7 @@ var il = class {
6647
6713
  this.ensure(e, t, n?.mode ?? "verbatim");
6648
6714
  }
6649
6715
  delete(e) {
6650
- let t = this.get(e)?.handle ?? tl(e), n = this.key(t), r = !!this.vfs.files[n];
6716
+ let t = this.get(e)?.handle ?? nl(e), n = this.key(t), r = !!this.vfs.files[n];
6651
6717
  return r && delete this.vfs.files[n], r;
6652
6718
  }
6653
6719
  list() {
@@ -6667,7 +6733,7 @@ var il = class {
6667
6733
  for (let e of Object.keys(this.vfs.files)) e.startsWith("resources/") && delete this.vfs.files[e];
6668
6734
  }
6669
6735
  };
6670
- function al(e) {
6736
+ function ol(e) {
6671
6737
  let { jp: t, resolved: n, resourcesByPath: r, resourceStore: i } = e;
6672
6738
  if (!r.size) return n;
6673
6739
  let a = !1;
@@ -6676,19 +6742,19 @@ function al(e) {
6676
6742
  break;
6677
6743
  }
6678
6744
  if (!a) return n;
6679
- let o = dc(n);
6745
+ let o = fc(n);
6680
6746
  for (let [e, n] of r) {
6681
6747
  if (t !== "" && e !== t && !e.startsWith(t + ".")) continue;
6682
6748
  if (e === t) {
6683
6749
  if (o === void 0) continue;
6684
- return n.mode === "freeze" ? Zc(e) : i ? Qc(i.ensure(e, o, "verbatim")) : o;
6750
+ return n.mode === "freeze" ? Qc(e) : i ? $c(i.ensure(e, o, "verbatim")) : o;
6685
6751
  }
6686
6752
  let r = t === "" ? e : e.slice(t.length + 1), a = Z(o, r);
6687
- a !== void 0 && (n.mode === "freeze" ? lc(o, r, Zc(e)) : i && lc(o, r, Qc(i.ensure(e, a, "verbatim"))));
6753
+ a !== void 0 && (n.mode === "freeze" ? uc(o, r, Qc(e)) : i && uc(o, r, $c(i.ensure(e, a, "verbatim"))));
6688
6754
  }
6689
6755
  return o;
6690
6756
  }
6691
- function ol(e, t, n, r) {
6757
+ function sl(e, t, n, r) {
6692
6758
  if (!r) return {
6693
6759
  code: "RESOURCE_NOT_FOUND",
6694
6760
  message: `句柄 "${e}" 无法展开(资源池未启用)`,
@@ -6699,7 +6765,7 @@ function ol(e, t, n, r) {
6699
6765
  code: "RESOURCE_NOT_FOUND",
6700
6766
  message: `字段 "${t}" 在 bind 中已不存在,无法展开句柄 "${e}"`,
6701
6767
  hint: "该字段可能已被删除或 restore 到不含此字段的快照;重新 read 确认当前结构"
6702
- } : nl(i.value, n) ? { value: i.value } : (r.update(t, n), { value: n }) : n === void 0 ? {
6768
+ } : rl(i.value, n) ? { value: i.value } : (r.update(t, n), { value: n }) : n === void 0 ? {
6703
6769
  code: "RESOURCE_NOT_FOUND",
6704
6770
  message: `句柄 "${e}" 不存在(字段 "${t}" 可能未注册或已被删除)`,
6705
6771
  hint: "重新 read 该字段触发懒注册"
@@ -6709,20 +6775,20 @@ function ol(e, t, n, r) {
6709
6775
  hint: "重新 read 该字段触发懒注册重建句柄,再写回新句柄 ⟦res:<handle>⟧"
6710
6776
  };
6711
6777
  }
6712
- function sl(e, t) {
6778
+ function cl(e, t) {
6713
6779
  let n = t.getBind();
6714
6780
  for (let [r, i] of t.resourcesByPath) {
6715
6781
  let a = Z(n, r), o = Z(e, r);
6716
6782
  if (o === void 0) {
6717
- a !== void 0 && lc(e, r, a);
6783
+ a !== void 0 && uc(e, r, a);
6718
6784
  continue;
6719
6785
  }
6720
6786
  if (i.mode === "freeze") {
6721
- if (o === Zc(r)) {
6722
- lc(e, r, a);
6787
+ if (o === Qc(r)) {
6788
+ uc(e, r, a);
6723
6789
  continue;
6724
6790
  }
6725
- if (!nl(o, a)) return {
6791
+ if (!rl(o, a)) return {
6726
6792
  ok: !1,
6727
6793
  code: "FROZEN_FIELD",
6728
6794
  path: r,
@@ -6730,11 +6796,11 @@ function sl(e, t) {
6730
6796
  hint: "该字段由系统/集成方维护,LLM 不得改动。如需展示其值用 resource_get({path}) 取真值"
6731
6797
  };
6732
6798
  } else {
6733
- let n = $c(o);
6799
+ let n = el(o);
6734
6800
  if (n && n.type === "res") {
6735
- let i = ol(n.handle, r, a, t.resourceStore);
6801
+ let i = sl(n.handle, r, a, t.resourceStore);
6736
6802
  if ("value" in i) {
6737
- lc(e, r, i.value);
6803
+ uc(e, r, i.value);
6738
6804
  continue;
6739
6805
  }
6740
6806
  return {
@@ -6745,7 +6811,7 @@ function sl(e, t) {
6745
6811
  hint: i.hint
6746
6812
  };
6747
6813
  }
6748
- if (!nl(o, a)) return {
6814
+ if (!rl(o, a)) return {
6749
6815
  ok: !1,
6750
6816
  code: "VERBATIM_MISMATCH",
6751
6817
  path: r,
@@ -6756,7 +6822,7 @@ function sl(e, t) {
6756
6822
  }
6757
6823
  return { ok: !0 };
6758
6824
  }
6759
- function cl(e, t, n) {
6825
+ function ll(e, t, n) {
6760
6826
  let r = t === void 0 ? e.message : `patches[${t}]${n ? ` @ "${n}"` : ""}: ${e.message}`;
6761
6827
  return Y({
6762
6828
  code: e.code,
@@ -6769,28 +6835,28 @@ function cl(e, t, n) {
6769
6835
  } }
6770
6836
  });
6771
6837
  }
6772
- function ll(e) {
6838
+ function ul(e) {
6773
6839
  let { value: t, ctx: n } = e;
6774
6840
  if (!n || !n.resourcesByPath.size) return {
6775
6841
  ok: !0,
6776
6842
  value: t
6777
6843
  };
6778
- let r = dc(t), i = sl(r, n);
6844
+ let r = fc(t), i = cl(r, n);
6779
6845
  return i.ok ? {
6780
6846
  ok: !0,
6781
6847
  value: r
6782
6848
  } : {
6783
6849
  ok: !1,
6784
- error: cl(i)
6850
+ error: ll(i)
6785
6851
  };
6786
6852
  }
6787
- function ul(e) {
6853
+ function dl(e) {
6788
6854
  let { patches: t, clone: n, ctx: r } = e;
6789
6855
  if (!r || !r.resourcesByPath.size) return { ok: !0 };
6790
6856
  for (let e = 0; e < t.length; e++) {
6791
6857
  let n = t[e];
6792
6858
  if (n.op === "remove") {
6793
- let t = rl(n.jsonPath || "", r.resourcesByPath);
6859
+ let t = il(n.jsonPath || "", r.resourcesByPath);
6794
6860
  if (t) {
6795
6861
  let r = t.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED", i = t.spec.mode === "freeze" ? "冻结字段不可删。如需移除请联系集成方调整 data.resources 配置" : "verbatim 字段不可直接删;先 resource_delete({path}) 释放资源保护后再删";
6796
6862
  return {
@@ -6809,27 +6875,27 @@ function ul(e) {
6809
6875
  }
6810
6876
  }
6811
6877
  }
6812
- let i = sl(n, r);
6878
+ let i = cl(n, r);
6813
6879
  if (!i.ok) {
6814
- let e = dl(i.path, t);
6880
+ let e = fl(i.path, t);
6815
6881
  return {
6816
6882
  ok: !1,
6817
- error: cl(i, e >= 0 ? e : void 0, e >= 0 ? t[e].jsonPath : void 0)
6883
+ error: ll(i, e >= 0 ? e : void 0, e >= 0 ? t[e].jsonPath : void 0)
6818
6884
  };
6819
6885
  }
6820
6886
  return { ok: !0 };
6821
6887
  }
6822
- function dl(e, t) {
6823
- let n = el(e);
6888
+ function fl(e, t) {
6889
+ let n = tl(e);
6824
6890
  for (let e = 0; e < t.length; e++) {
6825
- let r = el(t[e].jsonPath || "");
6891
+ let r = tl(t[e].jsonPath || "");
6826
6892
  if (r && (r === n || n.startsWith(r + ".") || r.startsWith(n + "."))) return e;
6827
6893
  }
6828
6894
  return -1;
6829
6895
  }
6830
6896
  //#endregion
6831
6897
  //#region src/core/tools/dataOps.ts
6832
- var fl = /* @__PURE__ */ new Set([
6898
+ var pl = /* @__PURE__ */ new Set([
6833
6899
  "describe_data",
6834
6900
  "get_data",
6835
6901
  "set_data",
@@ -6843,14 +6909,14 @@ var fl = /* @__PURE__ */ new Set([
6843
6909
  "resource_update",
6844
6910
  "resource_list",
6845
6911
  "resource_delete"
6846
- ]), pl = /* @__PURE__ */ new Set(["read", "write"]);
6847
- function ml(e, t = "simple") {
6848
- return t === "advanced" ? e : t === "minimal" ? e.filter((e) => pl.has(e.name)) : e.filter((e) => !fl.has(e.name));
6912
+ ]), ml = /* @__PURE__ */ new Set(["read", "write"]);
6913
+ function hl(e, t = "simple") {
6914
+ return t === "advanced" ? e : t === "minimal" ? e.filter((e) => ml.has(e.name)) : e.filter((e) => !pl.has(e.name));
6849
6915
  }
6850
- function hl(e) {
6916
+ function gl(e) {
6851
6917
  let { bindRef: t, schema: n, allowKeys: r, snapshots: i, maxSnapshots: a, audit: o, dryRun: s, op: c = "set", protectedCtx: l } = e, u = e.value;
6852
6918
  if (l) {
6853
- let e = ll({
6919
+ let e = ul({
6854
6920
  value: u,
6855
6921
  ctx: l
6856
6922
  });
@@ -6878,14 +6944,14 @@ function hl(e) {
6878
6944
  hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹(如 {value:\"x\"})或集成方通过 sdk.setData 替换 bind"
6879
6945
  })
6880
6946
  };
6881
- let f = dc(t), p = i.length ? i[i.length - 1].id + 1 : 1;
6947
+ let f = fc(t), p = i.length ? i[i.length - 1].id + 1 : 1;
6882
6948
  for (i.push({
6883
6949
  id: p,
6884
6950
  ts: Date.now(),
6885
6951
  op: c,
6886
6952
  value: f
6887
6953
  }); i.length > a;) i.shift();
6888
- return d.data !== null && typeof d.data == "object" && (r ? cc(t, d.data) : yc(t, d.data)), o({
6954
+ return d.data !== null && typeof d.data == "object" && (r ? lc(t, d.data) : bc(t, d.data)), o({
6889
6955
  op: c,
6890
6956
  value: d.data,
6891
6957
  timestamp: Date.now()
@@ -6895,11 +6961,11 @@ function hl(e) {
6895
6961
  data: d.data
6896
6962
  };
6897
6963
  }
6898
- function gl(e) {
6899
- let { bindRef: t, patches: n, schema: r, allowKeys: i, snapshots: a, maxSnapshots: o, markDataDirty: s, schemaErrorMode: c = "zod", snapshotLabel: l, dryRun: u, protectedCtx: d } = e, f = dc(t), p = [];
6964
+ function _l(e) {
6965
+ let { bindRef: t, patches: n, schema: r, allowKeys: i, snapshots: a, maxSnapshots: o, markDataDirty: s, schemaErrorMode: c = "zod", snapshotLabel: l, dryRun: u, protectedCtx: d } = e, f = fc(t), p = [];
6900
6966
  for (let e = 0; e < n.length; e++) {
6901
6967
  let t = n[e], a = t.jsonPath || "";
6902
- if (sc(a)) return {
6968
+ if (cc(a)) return {
6903
6969
  ok: !1,
6904
6970
  error: Y({
6905
6971
  code: "PATH_UNSAFE",
@@ -6925,14 +6991,14 @@ function gl(e) {
6925
6991
  hint: `op 为 ${o} 时 value 必填;删除请用 op:'remove'`
6926
6992
  })
6927
6993
  };
6928
- let n = fc(t.value);
6994
+ let n = pc(t.value);
6929
6995
  if (n.parseError) return {
6930
6996
  ok: !1,
6931
6997
  error: Gr(`patches[${e}]`, t.value, n.parseError)
6932
6998
  };
6933
6999
  s = n.parsed;
6934
7000
  }
6935
- let c = gc(f, o, a, s);
7001
+ let c = _c(f, o, a, s);
6936
7002
  if (c) return {
6937
7003
  ok: !1,
6938
7004
  error: Y({
@@ -6948,7 +7014,7 @@ function gl(e) {
6948
7014
  });
6949
7015
  }
6950
7016
  if (d) {
6951
- let e = ul({
7017
+ let e = dl({
6952
7018
  patches: n,
6953
7019
  clone: f,
6954
7020
  ctx: d
@@ -6978,21 +7044,21 @@ function gl(e) {
6978
7044
  id: h,
6979
7045
  ts: Date.now(),
6980
7046
  op: "edit",
6981
- value: dc(t),
7047
+ value: fc(t),
6982
7048
  ...l ? { label: l } : {}
6983
7049
  }); a.length > o;) a.shift();
6984
- for (let e of p) e.op === "remove" && uc(t, e.jp);
6985
- return m.data !== null && typeof m.data == "object" && (i ? cc(t, m.data) : yc(t, m.data)), s?.(), {
7050
+ for (let e of p) e.op === "remove" && dc(t, e.jp);
7051
+ return m.data !== null && typeof m.data == "object" && (i ? lc(t, m.data) : bc(t, m.data)), s?.(), {
6986
7052
  ok: !0,
6987
7053
  applied: p,
6988
7054
  clone: f
6989
7055
  };
6990
7056
  }
6991
- function _l(e, n = {}) {
6992
- let i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s = Mi(i), c = /* @__PURE__ */ new Map(), l = n.vfsStore ? new il(n.vfsStore) : void 0;
7057
+ function vl(e, n = {}) {
7058
+ let i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s = Mi(i), c = /* @__PURE__ */ new Map(), l = n.vfsStore ? new al(n.vfsStore) : void 0;
6993
7059
  function u(e) {
6994
7060
  if (c.clear(), e) for (let t of e) {
6995
- let e = el(t.path);
7061
+ let e = tl(t.path);
6996
7062
  c.set(e, {
6997
7063
  path: e,
6998
7064
  mode: t.mode
@@ -7044,7 +7110,7 @@ function _l(e, n = {}) {
7044
7110
  return e;
7045
7111
  },
7046
7112
  createResource: l ? (e, t) => {
7047
- let n = el(e), r = c.get(n), i = t === void 0 ? Z(a, n) : t;
7113
+ let n = tl(e), r = c.get(n), i = t === void 0 ? Z(a, n) : t;
7048
7114
  return l.ensure(n, i, r?.mode ?? "verbatim");
7049
7115
  } : void 0,
7050
7116
  getResource: l ? (e) => {
@@ -7057,8 +7123,8 @@ function _l(e, n = {}) {
7057
7123
  } : void 0;
7058
7124
  } : void 0,
7059
7125
  updateResource: l ? (e, t) => {
7060
- let n = el(e);
7061
- l.update(n, t), lc(a, n, t), _();
7126
+ let n = tl(e);
7127
+ l.update(n, t), uc(a, n, t), _();
7062
7128
  } : void 0,
7063
7129
  deleteResource: l ? (e) => l.delete(e) : void 0,
7064
7130
  listResources: l ? () => l.list() : void 0
@@ -7066,7 +7132,7 @@ function _l(e, n = {}) {
7066
7132
  n.onAudit?.(e);
7067
7133
  };
7068
7134
  function b(e, t) {
7069
- let n = dc(a), r = f.length ? f[f.length - 1].id + 1 : 1;
7135
+ let n = fc(a), r = f.length ? f[f.length - 1].id + 1 : 1;
7070
7136
  for (f.push({
7071
7137
  id: r,
7072
7138
  ts: Date.now(),
@@ -7097,7 +7163,7 @@ function _l(e, n = {}) {
7097
7163
  if (o.action === "restore") {
7098
7164
  if (!f.length) return `无历史快照可回退(本次为首次操作)。当前值:${Q(a, 400)} (hash=${i})。请重新 read 再改或选「强制覆盖」。`;
7099
7165
  let e = f[f.length - 1];
7100
- return vc(a, dc(e.value)), _(), `已回退主数据到历史快照 #${e.id}[${e.op}]。当前值:${Q(a, 400)} (hash=${$(a)})。请基于回退后的值重写或停止。`;
7166
+ return yc(a, fc(e.value)), _(), `已回退主数据到历史快照 #${e.id}[${e.op}]。当前值:${Q(a, 400)} (hash=${$(a)})。请基于回退后的值重写或停止。`;
7101
7167
  }
7102
7168
  return null;
7103
7169
  }
@@ -7107,7 +7173,7 @@ function _l(e, n = {}) {
7107
7173
  schema: t.object({})
7108
7174
  }), C = r(async ({ jsonPath: e }) => {
7109
7175
  let t = e || "";
7110
- if (sc(t)) return Y({
7176
+ if (cc(t)) return Y({
7111
7177
  code: "PATH_UNSAFE",
7112
7178
  message: `jsonPath "${t}" 含非法段(__proto__/constructor/prototype)`,
7113
7179
  hint: "使用正常属性路径,如 components.0.text(数组索引用数字)"
@@ -7118,7 +7184,7 @@ function _l(e, n = {}) {
7118
7184
  hint: "主数据仅暴露 schema 声明的字段;若需操作该字段,集成方需在 schema 中声明它"
7119
7185
  });
7120
7186
  let n = t ? Z(a, t) : a;
7121
- t || (n = Li(n, s)), d && (n = al({
7187
+ t || (n = Li(n, s)), d && (n = ol({
7122
7188
  jp: t,
7123
7189
  resolved: n,
7124
7190
  resourcesByPath: d.resourcesByPath,
@@ -7133,9 +7199,9 @@ function _l(e, n = {}) {
7133
7199
  }), w = r(async ({ value: e, expectedHash: t }) => {
7134
7200
  let n = await x("set", t || (h ? m : void 0));
7135
7201
  if (n !== null) return n;
7136
- let r = fc(e);
7202
+ let r = pc(e);
7137
7203
  if (r.parseError) return Gr("", e, r.parseError);
7138
- let o = hl({
7204
+ let o = gl({
7139
7205
  bindRef: a,
7140
7206
  value: r.parsed,
7141
7207
  schema: i,
@@ -7162,7 +7228,7 @@ function _l(e, n = {}) {
7162
7228
  hint: "顶层 op 或 patch.op 至少传一个"
7163
7229
  });
7164
7230
  let c = n || "";
7165
- if (sc(c)) return Y({
7231
+ if (cc(c)) return Y({
7166
7232
  code: "PATH_UNSAFE",
7167
7233
  message: `jsonPath "${c}" 含非法段(__proto__/constructor/prototype)`,
7168
7234
  hint: "使用正常的属性路径,如 components.0.text(数组索引用数字)"
@@ -7179,7 +7245,7 @@ function _l(e, n = {}) {
7179
7245
  message: `edit 仅适用于对象/数组主数据,当前是 ${a === void 0 ? "undefined" : typeof a}`,
7180
7246
  hint: "叶子(原始类型)请用 set_data 整体设置"
7181
7247
  });
7182
- let u = gl({
7248
+ let u = _l({
7183
7249
  bindRef: a,
7184
7250
  patches: [{
7185
7251
  op: t,
@@ -7232,7 +7298,7 @@ function _l(e, n = {}) {
7232
7298
  message: "delete_data 需要 jsonPath 指定要删的子路径(主数据整体不可删,用 set_data 整体替换)",
7233
7299
  hint: "如 jsonPath:\"components.0\" 删数组首项"
7234
7300
  });
7235
- if (sc(e)) return Y({
7301
+ if (cc(e)) return Y({
7236
7302
  code: "PATH_UNSAFE",
7237
7303
  message: `jsonPath "${e}" 含非法段`,
7238
7304
  hint: "使用正常属性路径"
@@ -7243,7 +7309,7 @@ function _l(e, n = {}) {
7243
7309
  hint: "仅 schema 声明的 key 可删"
7244
7310
  });
7245
7311
  if (d) {
7246
- let t = rl(e, d.resourcesByPath);
7312
+ let t = il(e, d.resourcesByPath);
7247
7313
  if (t) return Y({
7248
7314
  code: t.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED",
7249
7315
  message: `delete_data @ "${e}" 命中受保护字段 "${t.protectedPath}"(${t.spec.mode}),不可删除`,
@@ -7253,7 +7319,7 @@ function _l(e, n = {}) {
7253
7319
  let n = await x("delete", t || (h ? m : void 0));
7254
7320
  if (n !== null) return n;
7255
7321
  b("delete");
7256
- let r = uc(a, e);
7322
+ let r = dc(a, e);
7257
7323
  return _(), y({
7258
7324
  op: "delete",
7259
7325
  detail: e,
@@ -7279,7 +7345,7 @@ function _l(e, n = {}) {
7279
7345
  hint: "用 history_data({list:true}) 查看可用快照序号"
7280
7346
  });
7281
7347
  let n = i.safeParse(t.value);
7282
- return n.success ? (vc(a, dc(t.value)), _(), y({
7348
+ return n.success ? (yc(a, fc(t.value)), _(), y({
7283
7349
  op: "restore",
7284
7350
  detail: `#${t.id}`,
7285
7351
  timestamp: Date.now()
@@ -7313,9 +7379,9 @@ function _l(e, n = {}) {
7313
7379
  message: `未找到快照 #${e}`,
7314
7380
  hint: "不传 id 查看最近一次;或 history_data({list:true}) 查看可用序号"
7315
7381
  });
7316
- let a = dc(r.value), o = t || "";
7382
+ let a = fc(r.value), o = t || "";
7317
7383
  if (o) {
7318
- if (sc(o)) return Y({
7384
+ if (cc(o)) return Y({
7319
7385
  code: "PATH_UNSAFE",
7320
7386
  message: `jsonPath "${o}" 含非法段`,
7321
7387
  hint: "使用正常属性路径"
@@ -7346,7 +7412,7 @@ function _l(e, n = {}) {
7346
7412
  });
7347
7413
  let n = s ? Li(a, s) : a, r;
7348
7414
  try {
7349
- r = Uc(n, e);
7415
+ r = Wc(n, e);
7350
7416
  } catch (t) {
7351
7417
  return Y({
7352
7418
  code: "JSONPATH_SYNTAX",
@@ -7370,7 +7436,7 @@ function _l(e, n = {}) {
7370
7436
  message: "主数据为空,无可搜索内容"
7371
7437
  });
7372
7438
  try {
7373
- let o = Gc(s ? Li(a, s) : a, e, {
7439
+ let o = Kc(s ? Li(a, s) : a, e, {
7374
7440
  mode: t,
7375
7441
  fuzzyThreshold: n,
7376
7442
  matchKey: r,
@@ -7420,7 +7486,7 @@ function _l(e, n = {}) {
7420
7486
  e && (o = Ii(o, e));
7421
7487
  }
7422
7488
  } else o = s ? Li(a, s) : a;
7423
- let c = dc(o), l = await qc(c, e, r && JSON.stringify(c).length > 1e5 ? 8e3 : 3e3);
7489
+ let c = fc(o), l = await Jc(c, e, r && JSON.stringify(c).length > 1e5 ? 8e3 : 3e3);
7424
7490
  if (!l.ok) {
7425
7491
  let t = /超时/.test(l.error || "");
7426
7492
  return Y({
@@ -7436,7 +7502,7 @@ function _l(e, n = {}) {
7436
7502
  if (t === "transform") {
7437
7503
  let e = l.result;
7438
7504
  if (r) {
7439
- let t = gl({
7505
+ let t = _l({
7440
7506
  bindRef: a,
7441
7507
  patches: [{
7442
7508
  op: "set",
@@ -7464,7 +7530,7 @@ function _l(e, n = {}) {
7464
7530
  message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),eval transform(patches) 无法就地替换`,
7465
7531
  hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
7466
7532
  });
7467
- let t = gl({
7533
+ let t = _l({
7468
7534
  bindRef: a,
7469
7535
  patches: e.patches,
7470
7536
  schema: i,
@@ -7484,7 +7550,7 @@ function _l(e, n = {}) {
7484
7550
  }
7485
7551
  let t = e;
7486
7552
  if (d) {
7487
- let e = ll({
7553
+ let e = ul({
7488
7554
  value: t,
7489
7555
  ctx: d
7490
7556
  });
@@ -7496,7 +7562,7 @@ function _l(e, n = {}) {
7496
7562
  code: "LEAF_BIND",
7497
7563
  message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),eval transform 无法就地替换外部持有的值引用`,
7498
7564
  hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
7499
- }) : (b("edit", "eval_transform"), n.data !== null && typeof n.data == "object" && (s ? cc(a, n.data) : yc(a, n.data)), _(), y({
7565
+ }) : (b("edit", "eval_transform"), n.data !== null && typeof n.data == "object" && (s ? lc(a, n.data) : bc(a, n.data)), _(), y({
7500
7566
  op: "edit",
7501
7567
  detail: "eval_transform",
7502
7568
  timestamp: Date.now()
@@ -7533,7 +7599,7 @@ function _l(e, n = {}) {
7533
7599
  e && (o = Ii(o, e));
7534
7600
  }
7535
7601
  let l = o;
7536
- if (d && (l = al({
7602
+ if (d && (l = ol({
7537
7603
  jp: t,
7538
7604
  resolved: l,
7539
7605
  resourcesByPath: d.resourcesByPath,
@@ -7543,12 +7609,12 @@ function _l(e, n = {}) {
7543
7609
  } catch (e) {
7544
7610
  return `- ${t}: [READ_INTERCEPT: ${e.message}]`;
7545
7611
  }
7546
- return r && r.length && (l = pc(l, r)), c != null && (l = mc(l, c)), l === void 0 ? `- ${t} = (undefined)` : `- ${t} = ${Q(l)}`;
7612
+ return r && r.length && (l = mc(l, r)), c != null && (l = hc(l, c)), l === void 0 ? `- ${t} = (undefined)` : `- ${t} = ${Q(l)}`;
7547
7613
  });
7548
7614
  return `多路径读取(共 ${t.length} 项,hash=${f}):\n${e.join("\n")}`;
7549
7615
  }
7550
7616
  let p = e || "";
7551
- if (sc(p)) return Y({
7617
+ if (cc(p)) return Y({
7552
7618
  code: "PATH_UNSAFE",
7553
7619
  message: `jsonPath "${p}" 含非法段(__proto__/constructor/prototype)`,
7554
7620
  hint: "使用正常属性路径,如 components.0.text(数组索引数字)"
@@ -7565,7 +7631,7 @@ function _l(e, n = {}) {
7565
7631
  e && (h = Ii(h, e));
7566
7632
  }
7567
7633
  let g = h;
7568
- if (d && (g = al({
7634
+ if (d && (g = ol({
7569
7635
  jp: p,
7570
7636
  resolved: g,
7571
7637
  resourcesByPath: d.resourcesByPath,
@@ -7578,7 +7644,7 @@ function _l(e, n = {}) {
7578
7644
  message: `read 拦截器抛错: ${e.message}`
7579
7645
  });
7580
7646
  }
7581
- r && r.length && (g = pc(g, r)), c != null && (g = mc(g, c));
7647
+ r && r.length && (g = mc(g, r)), c != null && (g = hc(g, c));
7582
7648
  let _ = e ? "" : `主数据说明: ${o}\n格式: 写入值需为 JSON,且通过声明的 schema 校验(校验失败时 write 会返回结构化错误)。字段约束(类型/min/max/enum/必填/默认)见 systemPrompt「可操作数据」段,或用 schema_data({ jsonPath }) 按需查。\n\n`, v = r && r.length ? `(字段裁剪:${r.join(",")})` : "", y = c == null ? "" : `(深度≤${c})`, b = v || y ? ` ${v}${y}` : "";
7583
7649
  if ((l !== void 0 || u !== void 0) && Array.isArray(g)) {
7584
7650
  let e = g.length, t = Math.max(0, l ?? 0), n = Math.min(200, Math.max(1, u ?? 50)), r = g.slice(t, t + n), i = t + n < e;
@@ -7640,7 +7706,7 @@ function _l(e, n = {}) {
7640
7706
  message: "delete 需要 patch.jsonPath 指定要删的子路径(主数据整体不可删,用 write(value) 整体替换)",
7641
7707
  hint: "如 patch:{jsonPath:\"components.0\"}, del:true"
7642
7708
  });
7643
- if (sc(t.jsonPath)) return Y({
7709
+ if (cc(t.jsonPath)) return Y({
7644
7710
  code: "PATH_UNSAFE",
7645
7711
  message: `jsonPath "${t.jsonPath}" 含非法段`,
7646
7712
  hint: "使用正常属性路径"
@@ -7651,7 +7717,7 @@ function _l(e, n = {}) {
7651
7717
  hint: "仅 schema 声明的 key 可删"
7652
7718
  });
7653
7719
  if (d) {
7654
- let e = rl(t.jsonPath, d.resourcesByPath);
7720
+ let e = il(t.jsonPath, d.resourcesByPath);
7655
7721
  if (e) return Y({
7656
7722
  code: e.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED",
7657
7723
  message: `write delete @ "${t.jsonPath}" 命中受保护字段 "${e.protectedPath}"(${e.spec.mode}),不可删除`,
@@ -7661,11 +7727,11 @@ function _l(e, n = {}) {
7661
7727
  let e = await x("delete", v);
7662
7728
  if (e !== null) return e;
7663
7729
  if (c) {
7664
- let e = dc(a);
7665
- return uc(e, t.jsonPath) ? `dryRun(delete): 将删除 @ ${t.jsonPath}。预览剩余:${Q(e, 600)}。未实际写入、未入快照。` : `dryRun(delete): @ ${t.jsonPath} 不存在(无需删除)。未实际写入。`;
7730
+ let e = fc(a);
7731
+ return dc(e, t.jsonPath) ? `dryRun(delete): 将删除 @ ${t.jsonPath}。预览剩余:${Q(e, 600)}。未实际写入、未入快照。` : `dryRun(delete): @ ${t.jsonPath} 不存在(无需删除)。未实际写入。`;
7666
7732
  }
7667
7733
  b("delete");
7668
- let n = uc(a, t.jsonPath);
7734
+ let n = dc(a, t.jsonPath);
7669
7735
  return _(), y({
7670
7736
  op: "delete",
7671
7737
  detail: t.jsonPath,
@@ -7684,7 +7750,7 @@ function _l(e, n = {}) {
7684
7750
  op: t.op ?? "set",
7685
7751
  jsonPath: t.jsonPath || "",
7686
7752
  value: u
7687
- }]), o = gl({
7753
+ }]), o = _l({
7688
7754
  bindRef: a,
7689
7755
  patches: n,
7690
7756
  schema: i,
@@ -7703,11 +7769,11 @@ function _l(e, n = {}) {
7703
7769
  timestamp: Date.now()
7704
7770
  }), m = $(a), `已 write(edit) 主数据(${o.applied.length} 个 patch)。当前值:${Q(a, 600)} (新 hash=${$(a)})`) : o.error;
7705
7771
  }
7706
- let S = fc(u);
7772
+ let S = pc(u);
7707
7773
  if (S.parseError) return Gr("", u, S.parseError);
7708
7774
  let C = await x("set", v);
7709
7775
  if (C !== null) return C;
7710
- let w = hl({
7776
+ let w = gl({
7711
7777
  bindRef: a,
7712
7778
  value: S.parsed,
7713
7779
  schema: i,
@@ -7764,7 +7830,7 @@ function _l(e, n = {}) {
7764
7830
  if (n) {
7765
7831
  let e = t;
7766
7832
  if (typeof e == "string") {
7767
- let t = fc(e);
7833
+ let t = pc(e);
7768
7834
  t.parseError || (e = t.parsed);
7769
7835
  }
7770
7836
  r = e, i = "against";
@@ -7782,7 +7848,7 @@ function _l(e, n = {}) {
7782
7848
  });
7783
7849
  r = t.value, i = `快照 #${t.id}`;
7784
7850
  }
7785
- let o = s ? Li(a, s) : a, c = bc(r, dc(o));
7851
+ let o = s ? Li(a, s) : a, c = xc(r, fc(o));
7786
7852
  return c.length ? `差异(当前 vs ${i},共 ${c.length} 处):\n${c.map((e) => ` ${e.path}: ${Q(e.from)} → ${Q(e.to)}`).join("\n")}` : `无差异:当前主数据与 ${i} 完全相同。`;
7787
7853
  }, {
7788
7854
  name: "diff_data",
@@ -7834,7 +7900,7 @@ function _l(e, n = {}) {
7834
7900
  }
7835
7901
  let u = await x("set", n || (h ? m : void 0));
7836
7902
  if (u !== null) return u;
7837
- let g = hl({
7903
+ let g = gl({
7838
7904
  bindRef: a,
7839
7905
  value: l,
7840
7906
  schema: i,
@@ -7866,7 +7932,7 @@ function _l(e, n = {}) {
7866
7932
  message: "未提供 path 或有效 handle",
7867
7933
  hint: "传 path(受保护字段)或 handle(占位符 ⟦res:handle⟧ 里的句柄)"
7868
7934
  });
7869
- let r = el(n);
7935
+ let r = tl(n);
7870
7936
  if (!c.has(r)) return Y({
7871
7937
  code: "RESOURCE_NOT_FOUND",
7872
7938
  message: `"${n}" 不是受保护字段`,
@@ -7905,7 +7971,7 @@ function _l(e, n = {}) {
7905
7971
  message: "resource_update 需要 path",
7906
7972
  hint: "传要更新的 verbatim 受保护字段路径"
7907
7973
  });
7908
- let n = el(e), r = c.get(n);
7974
+ let n = tl(e), r = c.get(n);
7909
7975
  if (!r) return Y({
7910
7976
  code: "RESOURCE_NOT_FOUND",
7911
7977
  message: `"${e}" 不是受保护字段`,
@@ -7926,7 +7992,7 @@ function _l(e, n = {}) {
7926
7992
  details: Ur(n.error.issues)
7927
7993
  });
7928
7994
  }
7929
- l.update(n, t), lc(a, n, t), m = $(a), _();
7995
+ l.update(n, t), uc(a, n, t), m = $(a), _();
7930
7996
  let s = l.get(n)?.handle;
7931
7997
  return `已更新 verbatim 资源 "${e}" = ${Q(t, 200)}(handle ${s ?? "(未知)"} 不变)。后续 write 该字段写回句柄 ⟦res:${s}⟧ 或新值`;
7932
7998
  }, {
@@ -7987,8 +8053,8 @@ function _l(e, n = {}) {
7987
8053
  }
7988
8054
  //#endregion
7989
8055
  //#region src/core/tools/fetchDoc.ts
7990
- var vl = 3e4, yl = [r(async ({ url: e, as: t }) => {
7991
- let n = new AbortController(), r = setTimeout(() => n.abort(), vl);
8056
+ var yl = 3e4, bl = [r(async ({ url: e, as: t }) => {
8057
+ let n = new AbortController(), r = setTimeout(() => n.abort(), yl);
7992
8058
  try {
7993
8059
  let r = await fetch(e, {
7994
8060
  method: "GET",
@@ -8005,7 +8071,7 @@ var vl = 3e4, yl = [r(async ({ url: e, as: t }) => {
8005
8071
  ].join("\n");
8006
8072
  } catch (t) {
8007
8073
  let r = t?.message || String(t);
8008
- return n.signal.aborted ? `获取失败:请求超时(${vl}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
8074
+ return n.signal.aborted ? `获取失败:请求超时(${yl}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
8009
8075
  } finally {
8010
8076
  clearTimeout(r);
8011
8077
  }
@@ -8016,7 +8082,7 @@ var vl = 3e4, yl = [r(async ({ url: e, as: t }) => {
8016
8082
  url: t.string().describe("要抓取的 URL(同源或已配 CORS)"),
8017
8083
  as: t.enum(["text", "markdown"]).optional().describe("返回格式标签,默认 text")
8018
8084
  })
8019
- })], bl = [
8085
+ })], xl = [
8020
8086
  "id",
8021
8087
  "class",
8022
8088
  "href",
@@ -8028,12 +8094,12 @@ var vl = 3e4, yl = [r(async ({ url: e, as: t }) => {
8028
8094
  "aria-label",
8029
8095
  "name",
8030
8096
  "type"
8031
- ], xl = /^(value|srcdoc|formaction|on\w+)$/i, Sl = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session/i;
8032
- function Cl(e, t) {
8097
+ ], Sl = /^(value|srcdoc|formaction|on\w+)$/i, Cl = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session/i;
8098
+ function wl(e, t) {
8033
8099
  if (!e) return null;
8034
- let { depth: n, attrs: r, includeText: i = !0 } = t, a = r !== void 0, o = r ?? bl, s = (e) => {
8100
+ let { depth: n, attrs: r, includeText: i = !0 } = t, a = r !== void 0, o = r ?? xl, s = (e) => {
8035
8101
  let t = {};
8036
- for (let n of Array.from(e.attributes)) (a ? o.includes(n.name) : o.includes(n.name) || n.name.startsWith("data-")) && (xl.test(n.name) || Sl.test(n.name) || (t[n.name] = n.value));
8102
+ for (let n of Array.from(e.attributes)) (a ? o.includes(n.name) : o.includes(n.name) || n.name.startsWith("data-")) && (Sl.test(n.name) || Cl.test(n.name) || (t[n.name] = n.value));
8037
8103
  return t;
8038
8104
  }, c = (e, t) => {
8039
8105
  let n = {
@@ -8049,10 +8115,10 @@ function Cl(e, t) {
8049
8115
  };
8050
8116
  return c(e, n);
8051
8117
  }
8052
- var wl = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
8118
+ var Tl = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
8053
8119
  let i = e ? document.querySelector(e) : document.body;
8054
8120
  if (!i) return `未找到匹配元素:selector="${e}"`;
8055
- let a = Cl(i, {
8121
+ let a = wl(i, {
8056
8122
  depth: t ?? 3,
8057
8123
  attrs: n,
8058
8124
  includeText: r ?? !0
@@ -8067,14 +8133,14 @@ var wl = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
8067
8133
  attrs: t.array(t.string()).optional().describe("属性白名单(传了 = 严格白名单;不传 = 默认常用 + data-*)"),
8068
8134
  includeText: t.boolean().optional().describe("是否包含直接文本(默认 true)")
8069
8135
  })
8070
- }), Tl = [wl];
8136
+ }), El = [Tl];
8071
8137
  //#endregion
8072
8138
  //#region src/core/tools/envTool.ts
8073
- function El(e) {
8139
+ function Dl(e) {
8074
8140
  let t = e;
8075
8141
  return typeof t.tagName == "string" || typeof t.nodeType == "number" && typeof t.nodeName == "string";
8076
8142
  }
8077
- function Dl(e, t = 3, n = 2e3, r) {
8143
+ function Ol(e, t = 3, n = 2e3, r) {
8078
8144
  if (e == null) return e;
8079
8145
  if (typeof e == "string") return e.length > n ? e.slice(0, n) + "…(已截断)" : e;
8080
8146
  if (typeof e == "number" || typeof e == "boolean") return e;
@@ -8083,14 +8149,14 @@ function Dl(e, t = 3, n = 2e3, r) {
8083
8149
  if (typeof e == "bigint") return `${e.toString()}n`;
8084
8150
  if (typeof e != "object") return String(e);
8085
8151
  let i = e;
8086
- if (El(i)) {
8152
+ if (Dl(i)) {
8087
8153
  let e = i;
8088
8154
  return e.tagName ? `[Element: <${e.tagName.toLowerCase()}>]` : `[Node: ${e.nodeName}]`;
8089
8155
  }
8090
8156
  if (r?.has(i)) return "[Circular]";
8091
8157
  let a = r ?? /* @__PURE__ */ new WeakSet();
8092
8158
  if (a.add(i), Array.isArray(e)) {
8093
- let r = e.slice(0, 100).map((e) => Dl(e, t - 1, n, a));
8159
+ let r = e.slice(0, 100).map((e) => Ol(e, t - 1, n, a));
8094
8160
  return e.length > 100 && r.push(`…(共 ${e.length} 项,已截断)`), r;
8095
8161
  }
8096
8162
  if (t < 0) return "(对象,已截断)";
@@ -8102,14 +8168,14 @@ function Dl(e, t = 3, n = 2e3, r) {
8102
8168
  break;
8103
8169
  }
8104
8170
  try {
8105
- o[r] = Dl(i[r], t - 1, n, a);
8171
+ o[r] = Ol(i[r], t - 1, n, a);
8106
8172
  } catch {
8107
8173
  o[r] = "(getter 抛错)";
8108
8174
  }
8109
8175
  }
8110
8176
  return o;
8111
8177
  }
8112
- function Ol(e) {
8178
+ function kl(e) {
8113
8179
  let t = e ?? (typeof window < "u" ? window : {}), n = t.navigator, r = t.location, i = t.document;
8114
8180
  return {
8115
8181
  location: {
@@ -8142,9 +8208,9 @@ function Ol(e) {
8142
8208
  } : "(无 document)"
8143
8209
  };
8144
8210
  }
8145
- var kl = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|opener|parent|top|self|window|globalThis|closed|history|navigation|trustedTypes|origin|crossOriginIsolated)$/, Al = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session|ticket/i, jl = r(({ key: e }) => {
8211
+ var Al = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|opener|parent|top|self|window|globalThis|closed|history|navigation|trustedTypes|origin|crossOriginIsolated)$/, jl = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session|ticket/i, Ml = r(({ key: e }) => {
8146
8212
  if (e) {
8147
- if (kl.test(e) || Al.test(e)) return JSON.stringify({
8213
+ if (Al.test(e) || jl.test(e)) return JSON.stringify({
8148
8214
  key: e,
8149
8215
  denied: !0,
8150
8216
  reason: "安全:该 key 在 denylist(localStorage/sessionStorage/cookie/document 或敏感命名 token/secret/key/auth),不读取防泄漏"
@@ -8154,18 +8220,18 @@ var kl = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|open
8154
8220
  key: e,
8155
8221
  exists: t !== void 0,
8156
8222
  type: typeof t,
8157
- value: Dl(t)
8223
+ value: Ol(t)
8158
8224
  }, null, 2);
8159
8225
  }
8160
- return JSON.stringify(Ol(), null, 2);
8226
+ return JSON.stringify(kl(), null, 2);
8161
8227
  }, {
8162
8228
  name: "inspect_env",
8163
8229
  description: "读取宿主页面环境信息(排查调试用,默认开启)。不传参 = 返回环境摘要(location 的 URL/origin/path、navigator 的浏览器/语言、viewport 视口尺寸、document 的 title/readyState);传 key = 读取指定 window 属性值(如 inspect_env({key:\"appConfig\"}) 读集成方挂的调试变量 window.appConfig)。用于排查「当前页面在哪/什么浏览器/视口多大/调试变量值是什么」。轻量只读,大结果自动外存 vfs。",
8164
8230
  schema: t.object({ key: t.string().optional().describe("要读取的 window 属性名(如 \"appConfig\"/\"__DEBUG__\");不传 = 返回环境摘要") })
8165
- }), Ml = [jl];
8231
+ }), Nl = [Ml];
8166
8232
  //#endregion
8167
8233
  //#region src/core/harness/budget.ts
8168
- function Nl(e, t, n) {
8234
+ function Pl(e, t, n) {
8169
8235
  let r = 0;
8170
8236
  return {
8171
8237
  name: "budget",
@@ -8190,12 +8256,12 @@ function Nl(e, t, n) {
8190
8256
  }
8191
8257
  //#endregion
8192
8258
  //#region src/core/sdk/actions.ts
8193
- var Pl = /^[a-zA-Z][a-zA-Z0-9_]*$/;
8194
- function Fl(e) {
8259
+ var Fl = /^[a-zA-Z][a-zA-Z0-9_]*$/;
8260
+ function Il(e) {
8195
8261
  let n = [];
8196
8262
  for (let [i, a] of Object.entries(e)) {
8197
- if (!Pl.test(i)) {
8198
- console.warn(`[page-agent-sdk][actions] 动作名 "${i}" 非法(须匹配 ${Pl}),已跳过`);
8263
+ if (!Fl.test(i)) {
8264
+ console.warn(`[page-agent-sdk][actions] 动作名 "${i}" 非法(须匹配 ${Fl}),已跳过`);
8199
8265
  continue;
8200
8266
  }
8201
8267
  let e = a.description || `宿主动作 ${i}`;
@@ -8215,9 +8281,9 @@ function Fl(e) {
8215
8281
  }
8216
8282
  return n;
8217
8283
  }
8218
- function Il(e) {
8284
+ function Ll(e) {
8219
8285
  let t = {};
8220
- for (let [n, r] of Object.entries(e)) Pl.test(n) && (t[n] = {
8286
+ for (let [n, r] of Object.entries(e)) Fl.test(n) && (t[n] = {
8221
8287
  description: r.description,
8222
8288
  hasParams: !!r.params
8223
8289
  });
@@ -8225,12 +8291,12 @@ function Il(e) {
8225
8291
  }
8226
8292
  //#endregion
8227
8293
  //#region src/core/toolsets.ts
8228
- var Ll = yl, Rl = Tl;
8229
- function zl(e, t) {
8230
- return _l(e, t);
8294
+ var Rl = bl, zl = El;
8295
+ function Bl(e, t) {
8296
+ return vl(e, t);
8231
8297
  }
8232
- function Bl(e, t, n, r, i) {
8233
- let a = $s(e);
8298
+ function Vl(e, t, n, r, i) {
8299
+ let a = ec(e);
8234
8300
  return [
8235
8301
  ...a.dataOps ? t : [],
8236
8302
  ...a.fetch ? n : [],
@@ -8240,7 +8306,7 @@ function Bl(e, t, n, r, i) {
8240
8306
  }
8241
8307
  //#endregion
8242
8308
  //#region src/core/sdk/toolRegistry.ts
8243
- function Vl(e) {
8309
+ function Hl(e) {
8244
8310
  let t = /* @__PURE__ */ new Map(), n = [];
8245
8311
  for (let r of e) for (let e of r.tools) {
8246
8312
  let i = t.get(e.name);
@@ -8260,15 +8326,15 @@ function Vl(e) {
8260
8326
  }
8261
8327
  //#endregion
8262
8328
  //#region src/core/harness/usageHints.ts
8263
- var Hl = .7;
8264
- function Ul(e, t, n = "simple", r = !1) {
8265
- let i = $s(e), a = n !== "advanced";
8329
+ var Ul = .7;
8330
+ function Wl(e, t, n = "simple", r = !1) {
8331
+ let i = ec(e), a = n !== "advanced";
8266
8332
  return {
8267
8333
  name: "usageHints",
8268
8334
  augmentPrompt: () => {
8269
8335
  let n = [];
8270
8336
  if (i.planning && (n.push("【自适应规划】按任务复杂度决定是否先规划,不要对简单任务过度编排:"), n.push(" · 简单/明确任务(改单字段、调样式、查值)→ 直接 read/write 执行,不必 write_todos。"), n.push(" · 复杂任务(多步、大改、有歧义、不可逆)→ 先 write_todos 拆解,首个任务标 in_progress,逐项推进。"), n.push(" · 执行中发现步骤要改/补/细分 → 用 update_todo({id, content?, status?}) 按 id 增量改单项,不必重传整个清单。"), n.push(" · 规划出多步方案若需用户拍板 → 先 request_human_confirmation 给方案选项,确认后再执行。"), n.push(" · 规划阶段有轮次预算(maxPlanRevisions,默认 5):勿反复调研/改计划而不执行,规划充分后即开始 write 落地。")), t && (a ? (n.push("读写主数据用 read/write(高层入口,自动乐观锁 + 自动快照)。read({jsonPath}) 读子路径当前值(返回含 hash,write 时自动比对,无需手动传);read() 不传读整个主数据 + 说明。write 改值两姿势:① 改单个字段/子路径用 write({patch:{op:\"set\", jsonPath:\"路径.字段\", value:新值}})——patch.value 就是该字段的新值(类型匹配:string 直传字符串、number 传数字、对象传对象),不要包成 {字段:值} 对象(字段名已在 jsonPath);也兼容 write({value:新值, patch:{op,jsonPath}}) 顶层 value(向后兼容,但优先 patch.value,避免与整体 set 的 value 混淆);② 替换整个对象用 write({value:{整个新对象}})。op:set 设值 / remove 删 / merge 合并对象 / append 追加数组;批量多改动 write({patches:[{op,jsonPath,value},...]});删子路径 write({patch:{jsonPath:\"路径\"}, del:true})。写入自动经 schema 校验(失败不写,按错误提示改值类型/形状后重试)+ 自动存快照(出错可用 restore_data 回退)。"), n.push("修改大对象/数组优先用 write 的 patch 增量(只发改动部分),避免整体重传被 max_tokens 截断致 JSON 不完整。"), n.push("读大数组(read 返回 hasMore=true)用 read({jsonPath,offset,limit}) 分页(offset+=limit 续读,默认 limit=50);一次读多个不相关子路径用 read({jsonPaths:[...]}) 省轮次;复杂 patches 改动先 write({patches,dryRun:true}) 预检(走完整校验不落盘)。"), n.push("read/describe 返回按 schema 投影:仅 schema 声明的字段可见(未声明字段自动隐藏,防误操作);要操作某字段需集成方在 schema 声明,查任意路径完整约束用 schema_data({jsonPath})。"), n.push("查历史快照值(看上一版长啥样 / 冲突诊断 / 用户问\"刚才改了啥\")用 history_data({id?,jsonPath?})(只读不改当前);对比当前与历史快照的差异需切 advanced 用 diff_data(返回结构化 path→from/to)。"), n.push("在大数组里按条件筛选用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素 path/index;定位后用 write patch 改。找名字记不清的元素用 search_data(substring/regex/fuzzy)。批量过滤/映射/聚合/重写大数组用 eval_script(沙箱脚本,mode=query 只读/transform 落地)。")) : (n.push("改主数据前先 get_data({jsonPath}) 读其当前真实值与 hash(返回末尾 hash=xxx),基于真实值改,不要凭记忆。写入(set/edit/delete)时回传 expectedHash=该 hash 启用乐观锁——若主数据在你 get 之后被外部代码/其他 agent/用户手动改过,会触发冲突:集成方若开启人工介入,工具会挂起等用户决定(保留外部/强制覆盖/回退),你应等待工具返回后按结果继续(保留外部→重新 get 再改;强制覆盖→已写入,继续;回退→已回退到历史快照,基于回退值重写);未开启人工介入时返回 VERSION_CONFLICT 不写入,重新 get 拿最新值与 hash 再改。"), n.push("不确定主数据字段结构时用 describe_data 查看说明。"), n.push("修改大对象/数组优先用 edit_data 增量 patch(只发改动部分),避免 set_data 整体重传被 max_tokens 截断导致 JSON 不完整、校验失败。"), n.push("修改主数据出错时可用 restore_data 回退最近一次。"), n.push("在大数组里按条件筛选元素用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素的 path/index;定位后再 edit_data 改。"), n.push("找名字记不清的元素用 search_data(支持 substring/regex/fuzzy 模糊搜索)。"), n.push("需要过滤/映射/聚合/批量重写大数组时用 eval_script(沙箱脚本,入参 data);只读探查用 mode=query,批量重写用 mode=transform(返回值经校验后落地)。"), n.push("读大数组用 read({jsonPath,offset,limit}) 分页(返回 hasMore=true 时 offset+=limit 续读);一次读多个不相关子路径用 read({jsonPaths});复杂改动先 write({...,dryRun:true}) 预检不落盘。"), n.push("对比当前与历史快照(或一段 JSON against)的差异用 diff_data({snapshotId?,against?})(返回结构化 path→from/to,verify 自纠/操作审计/\"刚才改了啥\");只读查历史快照值用 history_data({id?,jsonPath?})。"))), i.subagent && n.push("独立子任务可 spawn_agent 委派(只读工具,过程不占主上下文)。"), i.inspectEnv && n.push("排查页面环境(当前 URL/浏览器/视口/集成方调试变量)用 inspect_env——不传参返回环境摘要(location/navigator/viewport/document),传 key 读特定 window 属性(如 inspect_env({key:\"appConfig\"}) 读 window.appConfig)。改完数据看渲染、定位\"为何没生效\"时用它(只读,不改数据)。"), i.domInspect && n.push("改完数据想确认渲染是否生效(或定位元素/辅助 UI 设计问答)用 get_dom({selector?,depth?}) 读渲染后 DOM(结构化返回 tag/attrs/text/children,depth 控制深度防爆炸,只读)。配合宿主 actions(save_draft/publish 等)形成\"改数据→get_dom 看渲染→触发动作\"闭环。"), i.draftWrite && n.push("生成超大 JSON(如 50+ 组件页面,单次 write 受 max_tokens 限制装不下)用 draft_write 分块构建 → draft_commit 原子提交:draft_write({draftId, chunk, mode}) mode:\"start\" 新建/\"append\" 追加(拼 JSON 片段到 drafts 池);累积完 draft_commit({draftId}) 合并 + schema 校验 + 写主数据(失败草稿保留可修后重试,成功自动清草稿)。小改仍用 write patch,只在大 JSON 从零生成时用 draft。"), i.draftWrite && n.push("⚠️ 大 JSON 分块构建是典型多轮工具调用(draft_write×N + draft_commit + read 确认 + 调研 read/query),默认 maxToolRounds=10 可能触顶被 while 截断导致草稿写不完;目标组件数大时集成方应在 createChatSdk 配 maxToolRounds ≥ 20(或按 N+5 估算)。draft_commit 提交同样走乐观锁(改前 read 拿 hash,bind 被改过会触发冲突介入,不静默覆盖)。"), i.todoDeps && n.push("复杂任务可用 todos 层级依赖:write_todos 时给 todo 传 parentId(父任务 id,表达层级)+ deps(依赖的 todo id 数组,必须先完成)。有依赖的任务,deps 全 completed 后再标 in_progress;完成时 update_todo({id, status:\"completed\", evidence:\"完成证据\"}) 记证据。无依赖关系的任务不传 parentId/deps(扁平)。"), i.focus && !a && (n.push("【上下文聚焦】判断任务范围,用 set_focus/add_focus/remove_focus/clear_focus 自动收敛工作范围:"), n.push(" · 局部任务(只改某一组件/区域,如「调导航栏」「改 components.3 样式」)→ 先 read 定位 jsonPath,再 set_focus({path:\"该子树路径\"}) 聚焦;聚焦后每轮只看该子树结构,写其他位置会被 PATH_DENIED 拒绝。"), n.push(" · 多个相关组件(如「同时改导航栏和页脚」)→ set_focus 聚焦首个后用 add_focus({path}) 追加其余;聚焦后可写任一焦点子树,越界仍被拒;移除单个用 remove_focus({path})。"), n.push(" · 全局任务(多处/整体结构,如「重排所有组件」「换主题」)→ 不要聚焦,保持全量视野直接写。"), n.push(" · 完成局部精修、要转向其他区域或做整体改动 → 调 clear_focus 退出聚焦(清空全部焦点),恢复全部读写权限。"), n.push(" · set_focus/add_focus 的 path 必须在 schema 内(类型校验);不确定路径先 read/describe_data 查。")), r && (n.push("【受保护资源·精确值保护】部分字段被 freeze/verbatim 保护(集成方在 data.resources 声明):"), n.push(" · read 受保护路径返回占位符 ⟦frozen:path⟧(freeze,精确值不入消息流)或 ⟦res:handle⟧(verbatim,原值在资源池),非真值。"), n.push(" · 确需真值用 resource_get({path})(仅受保护路径);freeze 字段完全不可改,撞 FROZEN_FIELD 即放弃该字段改动。"), n.push(" · verbatim 字段改新值:先 resource_update({path,value}) 更新资源池(同步 bind),再 write 写回句柄 ⟦res:handle⟧;直接写新值 → VERBATIM_MISMATCH。"), n.push(" · 撞 RESOURCE_EVICTED(资源被池淘汰)→ 重新 read 该字段懒注册重建句柄;撞 RESOURCE_NOT_FOUND → 重新 read。")), e?.subagents?.length) {
8271
- let t = e.subagents.filter((e) => (e.temperature ?? 0) >= Hl || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), r = e.subagents.filter((e) => (e.temperature ?? 0) < Hl && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
8337
+ let t = e.subagents.filter((e) => (e.temperature ?? 0) >= Ul || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), r = e.subagents.filter((e) => (e.temperature ?? 0) < Ul && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
8272
8338
  n.push("【规划-反思-执行·路由】按任务性质选模式,不要对简单任务过度编排:"), t.length && (n.push(` · 创作/设计/开放性需求(如"设计主题风格""换个感觉")→ 先调 ${t.map((e) => "use_" + e.id).join("/")} 出 2-3 套方案(高温创意),`), n.push(" 不要自己拍板;拿到方案后,若需用户拍板用 request_human_confirmation 弹选项。")), r.length && n.push(` · 严谨/易错/校验类 → 可先调 ${r.map((e) => "use_" + e.id).join("/")} 反思挑刺(低温审查),据反馈修订。`), n.push(a ? " · 方案定稿后,由你(主 agent)用 write 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。" : " · 方案定稿后,由你(主 agent)用 edit_data 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。"), n.push(" · 简单/明确任务(如\"标题改红色\")直接执行,不必走规划-反思。");
8273
8339
  }
8274
8340
  return e?.humanConfirm && (n.push("【人工确认·必读】以下情形必须先调 request_human_confirmation 征询用户、拿到答复后再继续,不要自行拍板:"), n.push(" 1) 用户让你「给方案/列选项/我来选/挑一个」时:把每个方案作为一个 option,调 request_human_confirmation(question=简述, options=[方案A,方案B,...], recommendation=你推荐的)。不要只回文字罗列方案让用户自己回复——要用工具把选项做成可点选按钮。"), n.push(" 2) 需求有歧义/不确定时:调工具问清楚(options 不传则用户答同意或拒绝)。"), n.push(" 3) 即将执行高风险不可逆操作(删除/覆盖/批量改动)前:调工具确认。"), n.push(" 4) 规划出多步方案需用户确认时:把整个方案(或关键分步)作为 option 调 request_human_confirmation,确认后再执行。"), n.push("用户在选项里选了哪个,就按那个方案继续;选「拒绝」则停止并询问如何调整。")), n.length && n.unshift("调用工具务必用标准 function calling(工具调用)格式发起,不要在回复正文里输出伪 XML/标签(如 deepseek 的 tool_calls 标签、invoke、function_call、tool_call 等)或 JSON 文本——那不会被识别为工具调用,会被当普通文字,工具不执行。"), n.length ? "## 能力使用提示\n" + n.join("\n") : void 0;
@@ -8277,7 +8343,7 @@ function Ul(e, t, n = "simple", r = !1) {
8277
8343
  }
8278
8344
  //#endregion
8279
8345
  //#region src/core/harness/resourcesPin.ts
8280
- function Wl(e) {
8346
+ function Gl(e) {
8281
8347
  return {
8282
8348
  name: "resourcesPin",
8283
8349
  augmentPrompt: () => {
@@ -8291,78 +8357,78 @@ function Wl(e) {
8291
8357
  }
8292
8358
  //#endregion
8293
8359
  //#region src/core/backends/skillStore.ts
8294
- var Gl = "v:1::skill-store", Kl = "chat-sdk";
8295
- function ql(e, t, n) {
8296
- return `${Gl}::${e}::${t}::${n}`;
8360
+ var Kl = "v:1::skill-store", ql = "chat-sdk";
8361
+ function Jl(e, t, n) {
8362
+ return `${Kl}::${e}::${t}::${n}`;
8297
8363
  }
8298
- function Jl(e, t) {
8299
- return `${Gl}::${e}::${t}::`;
8364
+ function Yl(e, t) {
8365
+ return `${Kl}::${e}::${t}::`;
8300
8366
  }
8301
- function Yl(e = {}) {
8302
- let t = e.dbName ?? Kl, n = e.backend ?? "indexed", r = e.id ?? "", i, a, o = new Promise((e) => {
8367
+ function Xl(e = {}) {
8368
+ let t = e.dbName ?? ql, n = e.backend ?? "indexed", r = e.id ?? "", i, a, o = new Promise((e) => {
8303
8369
  a = e;
8304
8370
  });
8305
8371
  return (async () => {
8306
8372
  try {
8307
8373
  if (n === "indexed") {
8308
8374
  if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
8309
- i = await Ks(t), a(!0);
8375
+ i = await qs(t), a(!0);
8310
8376
  } else if (n === "session") {
8311
8377
  if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
8312
- i = qs(sessionStorage), a(!0);
8378
+ i = Js(sessionStorage), a(!0);
8313
8379
  } else if (n === "local") {
8314
8380
  if (typeof localStorage > "u") throw Error("localStorage 不可用");
8315
- i = qs(localStorage), a(!0);
8316
- } else i = Gs(), a(!1);
8381
+ i = Js(localStorage), a(!0);
8382
+ } else i = Ks(), a(!1);
8317
8383
  } catch {
8318
- i = Gs(), a(!1);
8384
+ i = Ks(), a(!1);
8319
8385
  }
8320
8386
  })(), {
8321
8387
  ready: o,
8322
8388
  async list() {
8323
8389
  let e = [];
8324
- return await i.scan(Jl(t, r), (t, n) => {
8390
+ return await i.scan(Yl(t, r), (t, n) => {
8325
8391
  e.push(n);
8326
8392
  }), e;
8327
8393
  },
8328
8394
  async get(e) {
8329
- return await i.get(ql(t, r, e));
8395
+ return await i.get(Jl(t, r, e));
8330
8396
  },
8331
8397
  async put(e) {
8332
8398
  try {
8333
- await i.set(ql(t, r, e.name), e);
8399
+ await i.set(Jl(t, r, e.name), e);
8334
8400
  } catch (e) {
8335
- Ls(e) && (i = Gs());
8401
+ Rs(e) && (i = Ks());
8336
8402
  }
8337
8403
  },
8338
8404
  async remove(e) {
8339
- let n = ql(t, r, e);
8405
+ let n = Jl(t, r, e);
8340
8406
  return await i.get(n) == null ? !1 : (await i.del(n), !0);
8341
8407
  },
8342
8408
  async clear() {
8343
- await i.clearPrefix(Jl(t, r));
8409
+ await i.clearPrefix(Yl(t, r));
8344
8410
  },
8345
8411
  dispose() {}
8346
8412
  };
8347
8413
  }
8348
- var Xl = /large_results\/[^\s"'`),]+\.txt/g;
8349
- function Zl(e) {
8414
+ var Zl = /large_results\/[^\s"'`),]+\.txt/g;
8415
+ function Ql(e) {
8350
8416
  let t = /* @__PURE__ */ new Set(), n = (e) => {
8351
8417
  if (typeof e != "string" || !e) return;
8352
8418
  let n;
8353
- for (Xl.lastIndex = 0; (n = Xl.exec(e)) !== null;) t.add(n[0]);
8419
+ for (Zl.lastIndex = 0; (n = Zl.exec(e)) !== null;) t.add(n[0]);
8354
8420
  };
8355
8421
  for (let t of e) if (n(t.content), t.steps) for (let e of t.steps) n(e.result);
8356
8422
  return t;
8357
8423
  }
8358
- function Ql(e, t) {
8424
+ function $l(e, t) {
8359
8425
  let n = [];
8360
8426
  for (let r of Object.keys(e)) r.startsWith("large_results/") && !t.has(r) && n.push(r);
8361
8427
  return n;
8362
8428
  }
8363
8429
  //#endregion
8364
8430
  //#region src/core/utils/serialRunner.ts
8365
- function $l() {
8431
+ function eu() {
8366
8432
  let e = Promise.resolve();
8367
8433
  return function(t) {
8368
8434
  let n = e.then(t, t);
@@ -8371,16 +8437,16 @@ function $l() {
8371
8437
  }
8372
8438
  //#endregion
8373
8439
  //#region src/core/sdk/createChatSdk.ts
8374
- var eu = 30, tu = /* @__PURE__ */ new Map();
8375
- function nu(e, t) {
8440
+ var tu = 30, nu = /* @__PURE__ */ new Map();
8441
+ function ru(e, t) {
8376
8442
  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;
8377
8443
  }
8378
- function ru(e, t, n, r) {
8444
+ function iu(e, t, n, r) {
8379
8445
  let i = 0;
8380
8446
  return {
8381
8447
  name: "sdk-events",
8382
8448
  wrapToolCall: async (t, r) => {
8383
- let i = await r(t), a = nu(t.name, t.args);
8449
+ let i = await r(t), a = ru(t.name, t.args);
8384
8450
  return a && e({
8385
8451
  type: "data_change",
8386
8452
  operation: a,
@@ -8415,7 +8481,7 @@ function ru(e, t, n, r) {
8415
8481
  }
8416
8482
  };
8417
8483
  }
8418
- function iu(e, t, n, r, i) {
8484
+ function au(e, t, n, r, i) {
8419
8485
  if (!n) return i && console.warn(`[page-agent-sdk][focus] capabilities.focus 关闭,${t} 忽略`), {
8420
8486
  ok: !1,
8421
8487
  error: "capabilities.focus 关闭"
@@ -8433,18 +8499,18 @@ function iu(e, t, n, r, i) {
8433
8499
  error: "当前无主数据 schema,无法聚焦"
8434
8500
  });
8435
8501
  }
8436
- function au(e, n) {
8502
+ function ou(e, n) {
8437
8503
  let i = {
8438
8504
  prompt_tokens: 0,
8439
8505
  completion_tokens: 0,
8440
8506
  total_tokens: 0
8441
- }, a = ws(() => H), o = /* @__PURE__ */ Ot(0), s = Xs(e.storage);
8507
+ }, a = Ts(() => H), o = /* @__PURE__ */ Ot(0), s = Zs(e.storage);
8442
8508
  e.debug && s && s.onEvent((e) => console.log("[page-agent-sdk][storage]", e));
8443
- let { modelCaps: c, summaryLlmInvoke: l, titleLlmInvoke: u, compressDecisionInvoke: p } = Cs(e), m = c;
8509
+ let { modelCaps: c, summaryLlmInvoke: l, titleLlmInvoke: u, compressDecisionInvoke: p } = ws(e), m = c;
8444
8510
  if (e.debug && console.log("[page-agent-sdk][modelCaps]", m), m.contextWindow < 2e5) throw Error(`[page-agent-sdk] 模型上下文窗口 ${m.contextWindow} 小于最小支持 ${ti}(需 ≥200K 窗口模型,如 GLM-5.2/Claude/Kimi/Qwen-1M/DeepSeek-v4)`);
8445
- let h = rc(e, m.contextWindow), g = h.enableLLMSummary !== !1, _ = (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? nc[e.contextPreset ?? "auto"], v = new Set(_), y = e.llm;
8511
+ let h = ic(e, m.contextWindow), g = h.enableLLMSummary !== !1, _ = (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? rc[e.contextPreset ?? "auto"], v = new Set(_), y = e.llm;
8446
8512
  e.debug && !l && console.warn("[page-agent-sdk][summarization] 未构造 llmInvoke(apiKey 缺失?),摘要回退零成本索引摘要");
8447
- let b = /* @__PURE__ */ _t([]), x = wc(e.vfs?.initialFiles, {
8513
+ let b = /* @__PURE__ */ _t([]), x = Tc(e.vfs?.initialFiles, {
8448
8514
  persist: s ? { save: (e) => {
8449
8515
  W.sessionId && s && s.save(n, W.sessionId, { vfs: e });
8450
8516
  } } : void 0,
@@ -8464,18 +8530,18 @@ function au(e, n) {
8464
8530
  getTodos: () => ee.current?.getState?.()?.todos ?? [],
8465
8531
  messages: b,
8466
8532
  maxCheckpoints: O && typeof O == "object" ? O.maxCheckpoints : void 0
8467
- }) : null, te = !O || typeof O != "object" || O.auto !== !1, j = $s(e.capabilities), ne = j.dataOps, M = j.draftWrite, N = j.tracing, re = j.automation, P = cs(e), ie = ne && D ? _l(D, {
8533
+ }) : null, te = !O || typeof O != "object" || O.auto !== !1, j = ec(e.capabilities), ne = j.dataOps, M = j.draftWrite, N = j.tracing, re = j.automation, P = ls(e), ie = ne && D ? vl(D, {
8468
8534
  onAudit: e.onAudit ?? (e.debug ? (e) => console.log("[page-agent-sdk][data audit]", e) : void 0),
8469
8535
  maxSnapshots: e.maxSnapshots,
8470
8536
  onConflict: a.set,
8471
8537
  autoLock: e.autoLock,
8472
8538
  interceptors: e.interceptors,
8473
8539
  vfsStore: M || D?.resources?.length ? x : void 0
8474
- }) : [], ae = ne ? ml(ie, e.toolMode) : [], oe = ne && D ? ie.controller ?? null : null, se = ne && D?.resources?.length && oe?.getResourcesSnapshot ? Wl({ getResourcesSnapshot: () => oe?.getResourcesSnapshot?.() ?? [] }) : void 0, F = () => oe?.get() ?? D, I = /* @__PURE__ */ new Map(), ce = Bl(j, ae, yl, Tl, Ml);
8540
+ }) : [], ae = ne ? hl(ie, e.toolMode) : [], oe = ne && D ? ie.controller ?? null : null, se = ne && D?.resources?.length && oe?.getResourcesSnapshot ? Gl({ getResourcesSnapshot: () => oe?.getResourcesSnapshot?.() ?? [] }) : void 0, F = () => oe?.get() ?? D, I = /* @__PURE__ */ new Map(), ce = Vl(j, ae, bl, El, Nl);
8475
8541
  ce.forEach((e) => I.set(e.name, "builtin"));
8476
8542
  let le = [...e.tools || []];
8477
8543
  le.forEach((e) => I.set(e.name, "user"));
8478
- let L = Fl(e.actions ?? {});
8544
+ let L = Il(e.actions ?? {});
8479
8545
  L.forEach((e) => I.set(e.name, "action"));
8480
8546
  let ue = [], de = e.humanConfirm !== !1 && (!e.approval || e.approval.humanConfirmTool !== !1), fe = de ? Wa() : null;
8481
8547
  fe && I.set(Ha, "builtin");
@@ -8547,7 +8613,7 @@ function au(e, n) {
8547
8613
  ve.forEach((e) => I.set(e.name, "builtin"));
8548
8614
  let z = [], ye = /* @__PURE__ */ new Map(), B = be();
8549
8615
  function be() {
8550
- let { tools: e, collisions: t } = Vl([
8616
+ let { tools: e, collisions: t } = Hl([
8551
8617
  {
8552
8618
  label: "builtin",
8553
8619
  tools: ce
@@ -8584,49 +8650,51 @@ function au(e, n) {
8584
8650
  return t.length && console.warn("[page-agent-sdk] 工具重名,后注册覆盖先注册:", t.map((e) => `${e.name}(${e.loser}→${e.winner})`).join(", ")), e;
8585
8651
  }
8586
8652
  let xe = j.planning, Se = j.missionAnchor, Ce = j.workingMemory, we = j.skills, Te = j.vfs;
8587
- if (Te) for (let e of jc) I.set(e, "builtin");
8653
+ if (Te) for (let e of Mc) I.set(e, "builtin");
8588
8654
  if (xe) for (let e of S.tools ?? []) I.set(e.name, "builtin");
8589
8655
  let Ee = j.summarization, De = j.agentCompression && !!p;
8590
8656
  e.debug && j.agentCompression && !p && console.warn("[page-agent-sdk][agentCompression] agentCompression 开启但 summaryLlm 不可用(或缺 apiKey / 模型不支持工具),压缩决策不启用,回退静态压缩");
8591
- let Oe = j.memory, ke = j.subagent, Ae = e.verify?.maxAttempts ?? 2, je = j.verify && e.verify?.enabled !== !1 && Ae > 0, Me = j.contextInspector;
8657
+ let Oe = j.memory, ke = j.subagent, Ae = ke ? bo() : void 0, je = e.verify?.maxAttempts ?? 2, Me = j.verify && e.verify?.enabled !== !1 && je > 0, Ne = j.contextInspector;
8592
8658
  e.verify?.check && !j.verify && console.warn("[page-agent-sdk][verify] 检测到 verify.check 但 capabilities.verify 未开启,verify 未装载");
8593
- let Ne = e.subagent, Pe = Ne?.allowedTools ?? [], Fe = !ke || Ne?.enabled === !1 ? void 0 : fo({
8594
- llm: Ne?.llm ?? e.llm,
8659
+ let Pe = e.subagent, Fe = Pe?.allowedTools ?? [], Ie = !ke || Pe?.enabled === !1 ? void 0 : Mo({
8660
+ llm: Pe?.llm ?? e.llm,
8595
8661
  allTools: () => B,
8596
- allowedTools: Pe.length ? Pe : void 0,
8597
- systemPrompt: Ne?.systemPrompt,
8598
- temperature: Ne?.temperature,
8599
- maxTokens: Ne?.maxTokens,
8600
- skills: Ne?.skills,
8601
- maxDepth: Ne?.maxDepth,
8602
- maxParallel: Ne?.maxParallel,
8662
+ allowedTools: Fe.length ? Fe : void 0,
8663
+ systemPrompt: Pe?.systemPrompt,
8664
+ temperature: Pe?.temperature,
8665
+ maxTokens: Pe?.maxTokens,
8666
+ skills: Pe?.skills,
8667
+ maxDepth: Pe?.maxDepth,
8668
+ maxParallel: Pe?.maxParallel,
8603
8669
  debug: e.debug,
8604
8670
  getFocuses: () => w.getFocuses(),
8605
- getSchema: () => F()?.schema ?? null
8606
- }), Ie = ke && e.subagents !== void 0 ? ho(e.subagents, {
8671
+ getSchema: () => F()?.schema ?? null,
8672
+ tracker: Ae
8673
+ }), Le = ke && e.subagents !== void 0 ? Fo(e.subagents, {
8607
8674
  llm: e.llm,
8608
8675
  allTools: () => B,
8609
8676
  debug: e.debug,
8610
8677
  getFocuses: () => w.getFocuses(),
8611
- getSchema: () => F()?.schema ?? null
8612
- }) : void 0, Le = Ie ? Ie.controller : null, Re = [
8678
+ getSchema: () => F()?.schema ?? null,
8679
+ tracker: Ae
8680
+ }) : void 0, Re = Le ? Le.controller : null, V = [
8613
8681
  "get_data",
8614
8682
  "describe_data",
8615
8683
  "read",
8616
8684
  "fetch_document"
8617
- ], V = B.filter((e) => Re.includes(e.name)), ze = je ? go({
8618
- check: e.verify.check ?? So({
8685
+ ], ze = B.filter((e) => V.includes(e.name)), Be = Me ? Io({
8686
+ check: e.verify.check ?? Ho({
8619
8687
  schemas: () => F() ? { "": F().schema } : {},
8620
8688
  root: () => F()?.bind
8621
8689
  }),
8622
8690
  adversarial: e.verify?.adversarial ? {
8623
8691
  llm: e.llm,
8624
- tools: V
8692
+ tools: ze
8625
8693
  } : void 0
8626
- }) : void 0, Be = Me ? Io({
8694
+ }) : void 0, Ve = Ne ? ns({
8627
8695
  contextWindow: m.contextWindow,
8628
- thresholdRatio: rc(e, m.contextWindow).summaryThresholdRatio
8629
- }) : void 0, Ve = Ul({
8696
+ thresholdRatio: ic(e, m.contextWindow).summaryThresholdRatio
8697
+ }) : void 0, He = Wl({
8630
8698
  ...j,
8631
8699
  humanConfirm: de,
8632
8700
  subagents: e.subagents?.map((e) => ({
@@ -8634,10 +8702,10 @@ function au(e, n) {
8634
8702
  description: e.description,
8635
8703
  temperature: e.temperature
8636
8704
  }))
8637
- }, ne && !!D, e.toolMode, !!D?.resources?.length), He = D ? {
8705
+ }, ne && !!D, e.toolMode, !!D?.resources?.length), Ue = D ? {
8638
8706
  name: "dataHint",
8639
- augmentPrompt: () => ss(F(), e.schemaHint) || void 0
8640
- } : null, Ue = e.augmentSystem ? {
8707
+ augmentPrompt: () => cs(F(), e.schemaHint) || void 0
8708
+ } : null, We = e.augmentSystem ? {
8641
8709
  name: "augmentSystem",
8642
8710
  augmentPrompt: (t) => {
8643
8711
  try {
@@ -8650,30 +8718,30 @@ function au(e, n) {
8650
8718
  return;
8651
8719
  }
8652
8720
  }
8653
- } : null, We = e.onEvent, Ge = ec(e.onEvent), H = Ge.emit, Ke, U = [], qe = (e) => ({
8721
+ } : null, Ge = e.onEvent, Ke = tc(e.onEvent), H = Ke.emit, qe, U = [], Je = (e) => ({
8654
8722
  name: e.name,
8655
8723
  description: e.description,
8656
8724
  content: typeof e.getContent == "function" ? e.getContent() : ""
8657
- }), Je = (e) => ({
8725
+ }), Ye = (e) => ({
8658
8726
  name: e.name,
8659
8727
  description: e.description,
8660
8728
  getContent: () => e.content
8661
- }), Ye = e.skillStorage === !1 ? null : Yl({
8729
+ }), Xe = e.skillStorage === !1 ? null : Xl({
8662
8730
  ...typeof e.skillStorage == "object" ? e.skillStorage : {},
8663
8731
  id: e.skillStorage && typeof e.skillStorage == "object" && e.skillStorage.id ? e.skillStorage.id : `agent::${n}`
8664
- }), Xe = () => {
8665
- let t = Ke ? Ke.controller : null;
8732
+ }), Ze = () => {
8733
+ let t = qe ? qe.controller : null;
8666
8734
  if (t) {
8667
8735
  let n = (e.skills || []).filter((e) => !U.some((t) => t.name === e.name));
8668
8736
  t.set([...n, ...U]);
8669
8737
  }
8670
8738
  W.infoTick.value++;
8671
- }, Ze = async () => {
8672
- if (Ye) try {
8673
- let t = await Ye.list();
8739
+ }, Qe = async () => {
8740
+ if (Xe) try {
8741
+ let t = await Xe.list();
8674
8742
  if (t.length) {
8675
- U = t.map(Je);
8676
- let n = Ke ? Ke.controller : null;
8743
+ U = t.map(Ye);
8744
+ let n = qe ? qe.controller : null;
8677
8745
  if (n) {
8678
8746
  let t = (e.skills || []).filter((e) => !U.some((t) => t.name === e.name));
8679
8747
  n.set([...t, ...U]);
@@ -8681,21 +8749,21 @@ function au(e, n) {
8681
8749
  W.infoTick.value++;
8682
8750
  }
8683
8751
  } catch {}
8684
- }, Qe = Ee ? as({
8752
+ }, $e = Ee ? yo({
8685
8753
  ...h,
8686
8754
  llmInvoke: l,
8687
8755
  getRegisteredData: () => F() ? [{ description: F().description ?? "主数据对象" }] : [],
8688
8756
  preserveLastToolResults: _,
8689
8757
  ...De ? {
8690
8758
  decideInvoke: p,
8691
- getSnapshot: () => Be?.getSnapshot()
8759
+ getSnapshot: () => Ve?.getSnapshot()
8692
8760
  } : {}
8693
- }) : void 0, $e = ac([
8694
- ...He ? [He] : [],
8695
- Ve,
8761
+ }) : void 0, et = oc([
8762
+ ...Ue ? [Ue] : [],
8763
+ He,
8696
8764
  ...Se ? [C] : [],
8697
8765
  ...xe ? [S] : [],
8698
- ...we ? [Ke = Na(e.skills || [], {
8766
+ ...we ? [qe = Na(e.skills || [], {
8699
8767
  readVfs: Te ? (e) => x.files[e]?.content : void 0,
8700
8768
  hostScriptEnabled: j.skillHostScript,
8701
8769
  onToolsReady: (e, t) => {
@@ -8706,8 +8774,8 @@ function au(e, n) {
8706
8774
  B = be(), W.agent && W.agent.setTools(B), W.infoTick.value++;
8707
8775
  }
8708
8776
  })] : [],
8709
- ...Te ? [Nc(x)] : [],
8710
- ...Qe ? [Qe] : [],
8777
+ ...Te ? [Pc(x)] : [],
8778
+ ...$e ? [$e] : [],
8711
8779
  ...Ce ? [T] : [],
8712
8780
  ...R ? [w] : [],
8713
8781
  ...se ? [se] : [],
@@ -8716,27 +8784,27 @@ function au(e, n) {
8716
8784
  ...k && te && A ? [$a(A)] : [],
8717
8785
  ...de ? [Ga()] : [],
8718
8786
  ...e.approval && (e.approval.tools !== void 0 || e.approval.confirm) ? [Va(e.approval)] : [],
8719
- ...ze ? [ze] : [],
8720
- ...Fe ? [Fe] : [],
8721
- ...Ie ? [Ie] : [],
8722
- ...Ue ? [Ue] : [],
8723
8787
  ...Be ? [Be] : [],
8788
+ ...Ie ? [Ie] : [],
8789
+ ...Le ? [Le] : [],
8790
+ ...We ? [We] : [],
8791
+ ...Ve ? [Ve] : [],
8724
8792
  ...e.middleware || [],
8725
- ...re ? [Nl(i, {
8793
+ ...re ? [Pl(i, {
8726
8794
  tokenBudget: e.tokenBudget,
8727
8795
  timeBudgetMs: e.timeBudgetMs
8728
8796
  }, H)] : [],
8729
- ru(H, b, F, i)
8730
- ]), et = e.maxMemoryRounds ?? eu, tt = /* @__PURE__ */ Ot([]);
8731
- async function nt() {
8732
- s && (tt.value = (await s.listSessions(n)).sort((e, t) => t.lastAccessed - e.lastAccessed));
8797
+ iu(H, b, F, i)
8798
+ ]), tt = e.maxMemoryRounds ?? tu, nt = /* @__PURE__ */ Ot([]);
8799
+ async function rt() {
8800
+ s && (nt.value = (await s.listSessions(n)).sort((e, t) => t.lastAccessed - e.lastAccessed));
8733
8801
  }
8734
8802
  let W = {
8735
8803
  agentId: n,
8736
8804
  store: s,
8737
8805
  messages: b,
8738
8806
  vfsStore: x,
8739
- listeners: Ge.listeners,
8807
+ listeners: Ke.listeners,
8740
8808
  todosMw: S,
8741
8809
  memoryMw: E,
8742
8810
  missionMw: C,
@@ -8750,11 +8818,11 @@ function au(e, n) {
8750
8818
  mcpServers: [],
8751
8819
  checkpoint: A,
8752
8820
  dataOpsController: oe,
8753
- skillsController: Ke ? Ke.controller : null,
8821
+ skillsController: qe ? qe.controller : null,
8754
8822
  infoTick: o,
8755
8823
  pendingConflict: a.pendingConflict,
8756
- sessions: tt,
8757
- refreshSessions: nt,
8824
+ sessions: nt,
8825
+ refreshSessions: rt,
8758
8826
  liveData: F,
8759
8827
  usage: i,
8760
8828
  emit: H,
@@ -8780,15 +8848,15 @@ function au(e, n) {
8780
8848
  }
8781
8849
  }
8782
8850
  }
8783
- ot();
8851
+ st();
8784
8852
  },
8785
8853
  addSkill(e) {
8786
8854
  let t = U.findIndex((t) => t.name === e.name);
8787
- t >= 0 ? U[t] = e : U.push(e), Xe(), Ye && Ye.put(qe(e));
8855
+ t >= 0 ? U[t] = e : U.push(e), Ze(), Xe && Xe.put(Je(e));
8788
8856
  },
8789
8857
  removeSkill(e) {
8790
8858
  let t = U.findIndex((t) => t.name === e);
8791
- return t < 0 ? !1 : (U.splice(t, 1), Xe(), Ye && Ye.remove(e), !0);
8859
+ return t < 0 ? !1 : (U.splice(t, 1), Ze(), Xe && Xe.remove(e), !0);
8792
8860
  },
8793
8861
  listUserSkills() {
8794
8862
  return U.map((e) => e.name);
@@ -8802,7 +8870,7 @@ function au(e, n) {
8802
8870
  };
8803
8871
  },
8804
8872
  afterRound() {
8805
- st(), ut();
8873
+ ct(), dt();
8806
8874
  },
8807
8875
  async send(e, t) {
8808
8876
  await W.initDone, t ??= {}, t?.mission && Se && C.setMission(t.mission);
@@ -8932,19 +9000,19 @@ function au(e, n) {
8932
9000
  type: "session_restored",
8933
9001
  sessionId: r,
8934
9002
  rounds: i.messages?.length ?? 0
8935
- })), e.memory && s.save(n, W.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }), nt(), ct = void 0, lt = !1, r;
9003
+ })), e.memory && s.save(n, W.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }), rt(), lt = void 0, ut = !1, r;
8936
9004
  },
8937
9005
  resetSession: () => {
8938
- s && (W.sessionId = Ts(), x.clear?.(), S.reset([]), e.memory || E.reset(""), C.reset(), T.reset(), w.reset(), A && A.importStack([]), W.agent && (W.agent.debugLogs.value = []), s.createSession(W.agentId, e.session?.title, W.sessionId), H({
9006
+ s && (W.sessionId = Es(), x.clear?.(), S.reset([]), e.memory || E.reset(""), C.reset(), T.reset(), w.reset(), A && A.importStack([]), W.agent && (W.agent.debugLogs.value = []), s.createSession(W.agentId, e.session?.title, W.sessionId), H({
8939
9007
  type: "session_restored",
8940
9008
  sessionId: W.sessionId,
8941
9009
  rounds: 0
8942
- }), nt(), ct = void 0, lt = !1);
9010
+ }), rt(), lt = void 0, ut = !1);
8943
9011
  },
8944
9012
  stream: (e, t, n) => {
8945
9013
  if (!W.agent) throw Error("page-agent-sdk: agent 尚未初始化完成,请先 await mount()");
8946
- x?.setProtectedRefs?.(Zl(e));
8947
- let r = We ? (e) => {
9014
+ x?.setProtectedRefs?.(Ql(e));
9015
+ let r = Ge ? (e) => {
8948
9016
  t?.(e), H(e);
8949
9017
  } : t;
8950
9018
  if (n) {
@@ -8955,9 +9023,9 @@ function au(e, n) {
8955
9023
  },
8956
9024
  release() {
8957
9025
  if (W.refCount--, W.refCount <= 0) {
8958
- s && (x.flush?.(), s.flush(), s.dispose()), Ye && Ye.dispose();
9026
+ s && (x.flush?.(), s.flush(), s.dispose()), Xe && Xe.dispose();
8959
9027
  let e = W.mcpClosers.splice(0);
8960
- e.length && Promise.allSettled(e.map((e) => e())), tu.delete(n);
9028
+ e.length && Promise.allSettled(e.map((e) => e())), nu.delete(n);
8961
9029
  }
8962
9030
  },
8963
9031
  resolveConflict: a.resolve,
@@ -8977,20 +9045,20 @@ function au(e, n) {
8977
9045
  },
8978
9046
  setLlm(t) {
8979
9047
  let n;
8980
- if (ms(t)) n = t;
9048
+ if (hs(t)) n = t;
8981
9049
  else {
8982
9050
  let e = t;
8983
9051
  if ((e.provider ?? "openai") === "anthropic") throw Error("[page-agent-sdk][setLlm] 切换到 Anthropic 需传 BaseChatModel 实例(动态 import 无法同步);请先 const { ChatAnthropic } = await import(\"@langchain/anthropic\") 构造实例后传入");
8984
9052
  n = d(e);
8985
9053
  }
8986
9054
  typeof n.bindTools != "function" && e.debug && console.warn("[page-agent-sdk][setLlm] 新模型不支持 bindTools(tool calling 会失效)"), y = t;
8987
- let r = ms(t) ? void 0 : t;
9055
+ let r = hs(t) ? void 0 : t;
8988
9056
  if (m = ni({
8989
9057
  model: r?.model ?? t.model ?? t.modelName,
8990
9058
  contextWindow: e.contextWindow ?? r?.contextWindow,
8991
9059
  maxOutputTokens: e.maxOutputTokens ?? r?.maxOutputTokens
8992
9060
  }), m.contextWindow < 2e5) throw Error(`[page-agent-sdk][setLlm] 新模型上下文窗口 ${m.contextWindow} 小于最小支持 ${ti}(需 ≥200K 窗口模型)`);
8993
- W.agent && (W.agent.setLlm(n), W.agent.setModelCaps?.(m)), Qe?.setContextWindow?.(m.contextWindow), Be?.setContextWindow?.(m.contextWindow), W.infoTick.value++, e.debug && console.log("[page-agent-sdk][setLlm] 重解析 modelCaps + 回灌:", m);
9061
+ W.agent && (W.agent.setLlm(n), W.agent.setModelCaps?.(m)), $e?.setContextWindow?.(m.contextWindow), Ve?.setContextWindow?.(m.contextWindow), W.infoTick.value++, e.debug && console.log("[page-agent-sdk][setLlm] 重解析 modelCaps + 回灌:", m);
8994
9062
  },
8995
9063
  setMemory(e) {
8996
9064
  E.reset(e), typeof e == "function" && E.refresh(), W.infoTick.value++;
@@ -8999,37 +9067,43 @@ function au(e, n) {
8999
9067
  return E.refresh();
9000
9068
  },
9001
9069
  setSubagents(t) {
9002
- if (!Le) {
9070
+ if (!Re) {
9003
9071
  e.debug && console.warn("[page-agent-sdk][setSubagents] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略");
9004
9072
  return;
9005
9073
  }
9006
- Le.set(t), W.infoTick.value++;
9074
+ Re.set(t), W.infoTick.value++;
9007
9075
  },
9008
9076
  addSubagent(t) {
9009
- if (!Le) {
9077
+ if (!Re) {
9010
9078
  e.debug && console.warn("[page-agent-sdk][addSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略");
9011
9079
  return;
9012
9080
  }
9013
- Le.add(t), W.infoTick.value++;
9081
+ Re.add(t), W.infoTick.value++;
9014
9082
  },
9015
9083
  removeSubagent(t) {
9016
- if (!Le) return e.debug && console.warn("[page-agent-sdk][removeSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略"), !1;
9017
- let n = Le.remove(t);
9084
+ if (!Re) return e.debug && console.warn("[page-agent-sdk][removeSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略"), !1;
9085
+ let n = Re.remove(t);
9018
9086
  return n && W.infoTick.value++, n;
9019
9087
  },
9088
+ getActiveSubagents() {
9089
+ return Ae?.getActive() ?? [];
9090
+ },
9091
+ get subagentHistory() {
9092
+ return Ae?.getHistory() ?? [];
9093
+ },
9020
9094
  getInfo() {
9021
9095
  return {
9022
9096
  id: n,
9023
9097
  sessionId: W.sessionId,
9024
- model: ms(y) ? y.model ?? y.modelName : y.model,
9025
- systemPrompt: W.agent?.getEffectiveSystemPrompt?.() ?? P + ss(F(), e.schemaHint),
9098
+ model: hs(y) ? y.model ?? y.modelName : y.model,
9099
+ systemPrompt: W.agent?.getEffectiveSystemPrompt?.() ?? P + cs(F(), e.schemaHint),
9026
9100
  tools: (W.agent?.allTools ?? B).map((e) => ({
9027
9101
  name: e.name,
9028
9102
  description: e.description,
9029
9103
  schema: e.schema,
9030
9104
  source: I.get(e.name) || "user"
9031
9105
  })),
9032
- skills: (Ke ? Ke.controller.get() : e.skills ?? []).map((e) => ({
9106
+ skills: (qe ? qe.controller.get() : e.skills ?? []).map((e) => ({
9033
9107
  name: e.name,
9034
9108
  description: e.description
9035
9109
  })),
@@ -9039,7 +9113,7 @@ function au(e, n) {
9039
9113
  } : void 0,
9040
9114
  contextPreset: e.contextPreset ?? "auto",
9041
9115
  memory: E.get(),
9042
- middleware: $e.map((e) => e.name),
9116
+ middleware: et.map((e) => e.name),
9043
9117
  todos: (W.agent?.getState?.()?.todos ?? []).map((e) => ({
9044
9118
  id: e.id,
9045
9119
  content: e.content,
@@ -9058,21 +9132,23 @@ function au(e, n) {
9058
9132
  spans: W.agent.spans.value,
9059
9133
  metrics: ai(W.agent.spans.value)
9060
9134
  } : void 0,
9061
- actions: Il(e.actions ?? {}),
9135
+ actions: Ll(e.actions ?? {}),
9062
9136
  subagent: {
9063
- enabled: !!Fe,
9137
+ enabled: !!Ie,
9064
9138
  maxDepth: e.subagent?.maxDepth ?? 1,
9065
9139
  maxParallel: e.subagent?.maxParallel ?? 4,
9066
9140
  allowedTools: e.subagent?.allowedTools ?? [],
9067
- subagents: Le?.get() ?? []
9141
+ subagents: Re?.get() ?? [],
9142
+ active: Ae?.getActive() ?? [],
9143
+ history: Ae?.getHistory() ?? []
9068
9144
  },
9069
9145
  verify: {
9070
- enabled: !!ze,
9071
- maxAttempts: je ? Ae : 0,
9072
- adversarial: je && !!e.verify?.adversarial
9146
+ enabled: !!Be,
9147
+ maxAttempts: Me ? je : 0,
9148
+ adversarial: Me && !!e.verify?.adversarial
9073
9149
  },
9074
9150
  context: (() => {
9075
- let e = Be?.getSnapshot();
9151
+ let e = Ve?.getSnapshot();
9076
9152
  if (e) {
9077
9153
  let t = W.agent?.getState?.()?.lastCompression;
9078
9154
  t && (e.compression = t);
@@ -9105,11 +9181,11 @@ function au(e, n) {
9105
9181
  return R ? w.getFocuses() : [];
9106
9182
  },
9107
9183
  setFocus(t) {
9108
- let n = iu(t, "setFocus", R, () => F()?.schema, e.debug);
9184
+ let n = au(t, "setFocus", R, () => F()?.schema, e.debug);
9109
9185
  return n.ok ? (w.setFocus(t), W.infoTick.value++, { ok: !0 }) : n;
9110
9186
  },
9111
9187
  addFocus(t) {
9112
- let n = iu(t, "addFocus", R, () => F()?.schema, e.debug);
9188
+ let n = au(t, "addFocus", R, () => F()?.schema, e.debug);
9113
9189
  return n.ok ? w.getFocuses().length >= 8 ? (e.debug && console.warn("[page-agent-sdk][focus] addFocus 拒绝:焦点数已达上限 8(augmentPrompt 注入每焦点子树 schema,过多致 system prompt 超预算)"), {
9114
9190
  ok: !1,
9115
9191
  error: "焦点数上限 8(避免 system prompt 撑爆)"
@@ -9122,7 +9198,7 @@ function au(e, n) {
9122
9198
  R && (w.clearFocus(), W.infoTick.value++);
9123
9199
  }
9124
9200
  };
9125
- async function rt() {
9201
+ async function it() {
9126
9202
  if (!s) return;
9127
9203
  await s.ready;
9128
9204
  let t = e.session || {};
@@ -9146,25 +9222,25 @@ function au(e, n) {
9146
9222
  }), e.debug && console.log("[page-agent-sdk][restore] 恢复会话", W.sessionId, `${t.messages?.length ?? 0} msgs`)) : e.debug && console.log("[page-agent-sdk][restore] 会话 meta 存在但快照为空", W.sessionId);
9147
9223
  } else W.sessionId = await s.createSession(n, t.title), e.debug && console.log("[page-agent-sdk][restore] 新建会话(无历史)", W.sessionId);
9148
9224
  } else W.sessionId = await s.createSession(n, t.title);
9149
- e.memory && s.save(n, W.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }), nt();
9225
+ e.memory && s.save(n, W.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }), rt();
9150
9226
  }
9151
- async function it() {
9152
- await Ze();
9227
+ async function at() {
9228
+ await Qe();
9153
9229
  }
9154
- function at(e) {
9230
+ function ot(e) {
9155
9231
  let t = {};
9156
- for (let n of Zl(e)) {
9232
+ for (let n of Ql(e)) {
9157
9233
  let e = x.files[n];
9158
9234
  e && (t[n] = e.content);
9159
9235
  }
9160
9236
  return t;
9161
9237
  }
9162
- function ot() {
9163
- let e = Ql(x.files, Zl(b));
9238
+ function st() {
9239
+ let e = $l(x.files, Ql(b));
9164
9240
  for (let t of e) delete x.files[t];
9165
9241
  }
9166
- function st() {
9167
- let e = Yo(b, et);
9242
+ function ct() {
9243
+ let e = co(b, tt);
9168
9244
  if (!e.trimmed) return;
9169
9245
  let { older: t, summary: n } = e;
9170
9246
  if (H({
@@ -9175,22 +9251,22 @@ function au(e, n) {
9175
9251
  assistant: e.assistantMsgs.map((e) => e.content),
9176
9252
  steps: e.assistantMsgs.flatMap((e) => e.steps ?? [])
9177
9253
  })),
9178
- vfsResults: at(t.flatMap((e) => [e.userMsg, ...e.assistantMsgs])),
9254
+ vfsResults: ot(t.flatMap((e) => [e.userMsg, ...e.assistantMsgs])),
9179
9255
  summary: n.content,
9180
9256
  reason: "max_memory_rounds"
9181
- }), b.splice(e.deleteFrom, e.deleteCount, n), ot(), g && l) {
9257
+ }), b.splice(e.deleteFrom, e.deleteCount, n), st(), g && l) {
9182
9258
  let n = e.summary, { prevSeg: r } = e;
9183
9259
  (async () => {
9184
9260
  try {
9185
- let e = await l(es(t, v)), i = b.indexOf(n);
9261
+ let e = await l(mo(t, v)), i = b.indexOf(n);
9186
9262
  if (i < 0) return;
9187
- b[i].content = Jo(t, r, e), ut();
9263
+ b[i].content = so(t, r, e), dt();
9188
9264
  } catch {}
9189
9265
  })();
9190
9266
  }
9191
9267
  }
9192
- let ct, lt = !1;
9193
- function ut() {
9268
+ let lt, ut = !1;
9269
+ function dt() {
9194
9270
  if (!W.sessionId || !s) return;
9195
9271
  let t = JSON.parse(JSON.stringify(b));
9196
9272
  s.save(n, W.sessionId, { messages: t });
@@ -9208,15 +9284,15 @@ function au(e, n) {
9208
9284
  s.save(n, W.sessionId, { focus: e.length ? e : null });
9209
9285
  }
9210
9286
  re && A && (s.save(n, W.sessionId, { checkpoints: A.exportStack() }), s.save(n, W.sessionId, { usage: i }));
9211
- let a = ps(b);
9212
- a && a !== ct && (ct = a, s.updateTitle(n, W.sessionId, a)), e.autoTitle !== !1 && u && !lt && b.some((e) => e.role === "user") && b.some((e) => e.role === "assistant") && (lt = !0, (async () => {
9287
+ let a = ms(b);
9288
+ a && a !== lt && (lt = a, s.updateTitle(n, W.sessionId, a)), e.autoTitle !== !1 && u && !ut && b.some((e) => e.role === "user") && b.some((e) => e.role === "assistant") && (ut = !0, (async () => {
9213
9289
  let e = await u(b);
9214
- e && (await s.updateTitle(n, W.sessionId, e), await nt());
9290
+ e && (await s.updateTitle(n, W.sessionId, e), await rt());
9215
9291
  })()), e.debug && console.log("[page-agent-sdk][persist] save", W.sessionId, `${b.length} msgs`);
9216
9292
  }
9217
9293
  return W.initDone = (async () => {
9218
- if (await rt(), await it(), e.mcp?.length) {
9219
- let t = await Promise.allSettled(e.mcp.map((e) => Bo(e)));
9294
+ if (await it(), await at(), e.mcp?.length) {
9295
+ let t = await Promise.allSettled(e.mcp.map((e) => os(e)));
9220
9296
  W.mcpClosers = t.flatMap((e) => e.status === "fulfilled" ? [e.value.close] : []), W.mcpServers = [], t.forEach((t, n) => {
9221
9297
  let r = e.mcp[n], i = r.name ?? r.url;
9222
9298
  t.status === "fulfilled" ? (W.mcpServers.push({
@@ -9226,18 +9302,18 @@ function au(e, n) {
9226
9302
  }), t.value.tools.forEach((e) => I.set(e.name, `mcp:${i}`)), ue.push(...t.value.tools)) : console.warn(`[page-agent-sdk][mcp] server ${i} 连接失败:`, t.reason);
9227
9303
  }), B = be(), e.debug && console.log(`[page-agent-sdk][mcp] 注入 ${ue.length} 个工具,${W.mcpServers.length} 个 server`);
9228
9304
  }
9229
- let t = ms(e.llm) ? e.llm : await f(e.llm);
9305
+ let t = hs(e.llm) ? e.llm : await f(e.llm);
9230
9306
  W.agent = ji({
9231
9307
  llm: t,
9232
9308
  systemPrompt: P,
9233
9309
  tools: B,
9234
- middleware: $e,
9310
+ middleware: et,
9235
9311
  maxToolRounds: e.maxToolRounds,
9236
9312
  maxRetries: e.maxRetries,
9237
9313
  maxParallelTools: e.maxParallelTools,
9238
9314
  contextWindow: m.contextWindow,
9239
9315
  maxOutputTokens: m.maxOutputTokens,
9240
- maxVerifyAttempts: je ? Ae : 0,
9316
+ maxVerifyAttempts: Me ? je : 0,
9241
9317
  onLlmChange: (e) => {
9242
9318
  y = e;
9243
9319
  },
@@ -9251,17 +9327,17 @@ function au(e, n) {
9251
9327
  } catch {}
9252
9328
  } : void 0,
9253
9329
  debug: e.debug
9254
- }), ee.current = W.agent, Ie && Ie.setReconfigureHook && Ie.setReconfigureHook(() => {
9330
+ }), ee.current = W.agent, Le && Le.setReconfigureHook && Le.setReconfigureHook(() => {
9255
9331
  W.agent && W.agent.setTools(be());
9256
9332
  });
9257
9333
  })(), W;
9258
9334
  }
9259
- function ou(e, t) {
9260
- let n = e.id ?? Ts();
9335
+ function su(e, t) {
9336
+ let n = e.id ?? Es();
9261
9337
  e.id || console.warn(`[page-agent-sdk] 未传 options.id,已生成随机 id "${n}"。刷新后持久化数据无法恢复,请传稳定 id。`);
9262
- let r = e.streaming ?? !0, i = e.ui ?? "default", a, o = e.shareContext ? tu.get(n) : void 0;
9263
- o ? a = o : (a = au(e, n), e.shareContext && tu.set(n, a)), a.refCount++;
9264
- let s = null, c = Zs(e), l = null, u = null;
9338
+ let r = e.streaming ?? !0, i = e.ui ?? "default", a, o = e.shareContext ? nu.get(n) : void 0;
9339
+ o ? a = o : (a = ou(e, n), e.shareContext && nu.set(n, a)), a.refCount++;
9340
+ let s = null, c = Qs(e), l = null, u = null;
9265
9341
  async function d(n) {
9266
9342
  if (await a.initDone, s) {
9267
9343
  s.show();
@@ -9303,7 +9379,7 @@ function ou(e, t) {
9303
9379
  function m() {
9304
9380
  s?.show();
9305
9381
  }
9306
- let h = $l();
9382
+ let h = eu();
9307
9383
  return {
9308
9384
  mount: d,
9309
9385
  unmount: f,
@@ -9414,6 +9490,13 @@ function ou(e, t) {
9414
9490
  value: r
9415
9491
  }), { ok: !0 };
9416
9492
  },
9493
+ vfsWrite: (e, t) => {
9494
+ let n = typeof t == "string" ? t : JSON.stringify(t);
9495
+ a.vfsStore.files[kc(e)] = {
9496
+ content: n,
9497
+ updatedAt: Date.now()
9498
+ };
9499
+ },
9417
9500
  createResource: (e, t) => {
9418
9501
  let n = a.dataOpsController;
9419
9502
  if (!n?.createResource) throw Error("[page-agent-sdk] createResource 不可用:需配 data.resources + vfsStore(capabilities.vfs 默认开)");
@@ -9443,12 +9526,122 @@ function ou(e, t) {
9443
9526
  refreshMemory: () => a.refreshMemory(),
9444
9527
  setSubagents: (e) => a.setSubagents(e),
9445
9528
  addSubagent: (e) => a.addSubagent(e),
9446
- removeSubagent: (e) => a.removeSubagent(e)
9529
+ removeSubagent: (e) => a.removeSubagent(e),
9530
+ getActiveSubagents: () => a.getActiveSubagents(),
9531
+ get subagentHistory() {
9532
+ return a.subagentHistory;
9533
+ }
9534
+ };
9535
+ }
9536
+ //#endregion
9537
+ //#region src/core/sdk/ragSubagent.ts
9538
+ var cu = "你是知识检索专家。可用工具:search_docs(语义检索)/ load_doc(按 source 加载)/ vfs_grep+vfs_read(搜预注入文档)/ fetch_document(公网 URL)。\n\n工作方式:\n1. 分析任务,拆出需查证的要点(如:需要哪些组件、各自的 props 约束、UI 规范要求);\n2. 多源检索:先 vfs_grep 搜预注入文档(快、静态)→ 不够用 search_docs 语义检索 → 需特定文档用 load_doc → 公网用 fetch_document;\n3. 检索结果不足时换关键词、扩大 topK、或换源重试;\n4. 综合成结构化、可执行结论(不堆原文,提炼成可直接用于决策/配置的信息);\n5. 标注关键信息来源(文档名/段落),便于溯源;检索不到明确说「未检索到」,不编造。\n\n你是只读检索角色,不要尝试修改任何数据。", lu = "# 知识检索策略(RAG)\n\n## 多源决策树\n- vfs_grep / vfs_read:搜集成方预注入 vfs 的文档(组件文档 / UI 规范)—— 快、静态,先查\n- search_docs:语义检索(retriever 向量库)—— 模糊匹配,关键词不确定 / 语义相似时用\n- load_doc:按 source 精确加载(已知文档 id / URL / key)—— 精确取特定文档\n- fetch_document:公网 URL —— 查公开资料\n\n## 综合规范\n- 多源交叉验证(关键结论优先 ≥2 源印证,或单一权威源)\n- 标注来源(文档名 / URL / 段落),便于溯源\n- 结构化、可执行结论(组件清单 + 各自 props 约束 + 适用场景),不堆原文\n- 未检索到明确说「未检索到」,不编造;建议替代方案(改关键词 / 建议写代码组件等)\n\n## 何时用何源\n- 静态文档(组件库文档 / UI 规范):vfs_grep\n- 语义相似(「瀑布流组件」「倒计时」「拼团」):search_docs\n- 已知文档 id / URL:load_doc\n- 公开 URL(设计规范网站 / 第三方文档):fetch_document", uu = {
9539
+ name: "rag-search",
9540
+ description: "多源知识检索策略:vfs 预注入文档 → 语义检索 → 指定文档加载 → 公网;综合结构化结论 + 溯源",
9541
+ getContent: () => lu
9542
+ };
9543
+ function du(e, n, i) {
9544
+ return r(async ({ query: e, topK: t }) => {
9545
+ try {
9546
+ let r = await n(e, { topK: t ?? i });
9547
+ return r?.length ? r.map((e, t) => `【${t + 1}】${e.source ? `来源:${e.source}\n` : ""}${e.content}`).join("\n\n") : `未检索到与「${e}」相关的内容。可换关键词或扩大 topK 重试。`;
9548
+ } catch (e) {
9549
+ return `检索出错:${e.message}。可换关键词重试。`;
9550
+ }
9551
+ }, {
9552
+ name: e,
9553
+ description: "语义检索知识库(组件文档/UI 规范/业务规则等),返回相关片段。需要查阅文档才能回答或配置时用;可多次调用不同关键词。",
9554
+ schema: t.object({
9555
+ query: t.string().describe("检索关键词或自然语言问题"),
9556
+ topK: t.number().int().positive().optional().describe("期望召回数量(默认使用系统配置)")
9557
+ })
9558
+ });
9559
+ }
9560
+ function fu(e, n) {
9561
+ return r(async ({ source: e }) => {
9562
+ try {
9563
+ let t = await n(e), r = Array.isArray(t) ? t : [t];
9564
+ return r.length ? r.map((e, t) => `【${t + 1}】${e.source ? `来源:${e.source}\n` : ""}${e.content}`).join("\n\n") : `未加载到「${e}」。检查 source 是否正确。`;
9565
+ } catch (e) {
9566
+ return `加载出错:${e.message}。`;
9567
+ }
9568
+ }, {
9569
+ name: e,
9570
+ description: "按 source 加载指定文档(文档 id/URL/key);已知要查的具体文档用此工具精确加载。",
9571
+ schema: t.object({ source: t.string().describe("文档标识(id/URL/key)") })
9572
+ });
9573
+ }
9574
+ function pu(e) {
9575
+ let { retriever: t, loader: n, useVfs: r = !0, id: i = "rag", description: a, topK: o = 5, searchToolName: s = "search_docs", loadToolName: c = "load_doc", maxToolRounds: l = 8, summarization: u, skills: d, extraTools: f } = e;
9576
+ if (!t && !n && r === !1) throw Error("[page-agent-sdk][createRagSubagent] 至少配一种知识源:retriever / loader / useVfs(true)");
9577
+ let p = [];
9578
+ t && p.push(du(s, t, o)), n && p.push(fu(c, n)), f && p.push(...f);
9579
+ let m = r ? [
9580
+ "vfs_grep",
9581
+ "vfs_read",
9582
+ "vfs_json_read"
9583
+ ] : void 0;
9584
+ return {
9585
+ id: i,
9586
+ description: a ?? "检索知识库(组件文档/UI 规范/业务规则),返回有依据的结构化结论。需要查阅文档才能回答或决定如何配置时委派",
9587
+ systemPrompt: cu,
9588
+ tools: p.length ? p : void 0,
9589
+ allowedTools: m,
9590
+ skills: d ?? [uu],
9591
+ maxToolRounds: l,
9592
+ ...u === void 0 ? {} : { summarization: u }
9593
+ };
9594
+ }
9595
+ //#endregion
9596
+ //#region src/core/sdk/htmlSubagent.ts
9597
+ function mu(e) {
9598
+ return `你是纯代码组件生成专家。可用工具:vfs_write / vfs_edit / vfs_rm(写/改/删代码到 vfs ${e}) / vfs_grep + vfs_read(读 vfs) / write + set(写 data 引用,writablePaths 限定) / read / write_todos + update_todo(规划)。
9599
+
9600
+ 代码存储约定(重要):
9601
+ - 代码正文写 vfs:${e}<name>.vue(如 ${e}hero.vue)
9602
+ - data 存引用:write({ patch:{ op:'set', jsonPath:'components.N', value:{ type:'custom', codeRef:'vfs://${e}<name>.vue', name, props } } })
9603
+ - 改代码:先 vfs_edit 改 vfs 文件(data 的 codeRef 引用不变,无需改 data)
9604
+
9605
+ 工作方式:
9606
+ 1. 中等任务(多组件 / 大段代码)先 write_todos 拆解:读现有结构 → 规划各组件 → 逐个生成 → read 确认;
9607
+ 2. 遵循 html-builder skill 规范(SFC 规范 / 安全底线 / 可访问性 / props 定义 / 组件库引用);
9608
+ 3. 小段代码 vfs_write 整体写;大段用 vfs_edit 增量拼(避免单次输出超限);
9609
+ 4. 生成后 read(vfs 文件 + data 引用)确认结构正确;只写 writablePaths 内 data + ${e} 下 vfs。`;
9610
+ }
9611
+ var hu = "# 纯代码组件生成规范\n\n## 代码存储约定(重要)\n- 代码正文写 vfs:html/<name>.vue(如 html/hero.vue)\n- data 存引用:{ type:'custom', codeRef:'vfs://html/<name>.vue', name, props }\n- 改代码:vfs_edit 改 vfs 文件(data 的 codeRef 引用不变)\n\n## 何时写代码组件\n- 组件库无对应类型(高度定制交互 / 一次性特效 / 特殊布局)→ 写 custom 代码组件\n- 组件库已有(按钮 / 卡片 / 列表)→ 用现有组件配置,不重造\n\n## Vue SFC 规范\n- Vue 3 <template> + <script setup>(组合式)\n- props 用 defineProps;事件用 defineEmits\n- 只渲染 UI,不做副作用(不发请求 / 不读写 storage)\n\n## props 定义\n- 代码组件 defineProps 接受外部 data 传入(集成方渲染时按 data 的 props 字段传)\n\n## 组件库引用\n- 代码内可 import 组件库组件(如 <Button>);所用依赖以集成方渲染层已注入为准,不重复造\n\n## 安全底线(必须)\n- 禁 eval / new Function / Function 构造器\n- 禁访问 window 敏感属性(document.cookie / apiKey / token)\n- 不引入外部脚本 / CDN\n\n## 可访问性 + 语义化\n- 语义化标签(button / nav / section);图片 alt;交互可键盘聚焦\n- 颜色对比达标;不只用颜色传达信息", gu = {
9612
+ name: "html-builder",
9613
+ description: "纯代码组件(custom Vue SFC)生成规范:代码存 vfs+data 引用 / SFC 规范 / 安全底线 / props / 组件库引用 / 可访问性",
9614
+ getContent: () => hu
9615
+ };
9616
+ function _u(e) {
9617
+ let { writablePaths: t, codeVfsPrefix: n = "html/", id: r = "html", description: i, planning: a = !0, summarization: o = !0, maxToolRounds: s = 12, temperature: c = .4, skills: l, extraTools: u } = e;
9618
+ if (!t?.length) throw Error("[page-agent-sdk][createHtmlSubagent] writablePaths 必填(代码组件 data 区,如 [\"components\"])");
9619
+ let d = [];
9620
+ a && d.push(Qi());
9621
+ let f = u ?? [];
9622
+ return {
9623
+ id: r,
9624
+ description: i ?? "生成/修改纯代码组件(custom Vue SFC)。代码写 vfs,data 存引用;能规划(write_todos)+ 执行。需写代码组件或灵活定制时委派",
9625
+ systemPrompt: mu(n),
9626
+ writablePaths: t,
9627
+ allowedTools: [
9628
+ "vfs_write",
9629
+ "vfs_edit",
9630
+ "vfs_rm",
9631
+ "vfs_grep",
9632
+ "vfs_read"
9633
+ ],
9634
+ middleware: d.length ? d : void 0,
9635
+ summarization: o === !1 ? void 0 : o,
9636
+ temperature: c,
9637
+ skills: l ?? [gu],
9638
+ maxToolRounds: s,
9639
+ tools: f.length ? f : void 0
9447
9640
  };
9448
9641
  }
9449
9642
  //#endregion
9450
9643
  //#region src/core/utils/clipboard.ts
9451
- async function su(e) {
9644
+ async function vu(e) {
9452
9645
  try {
9453
9646
  let t = globalThis.navigator?.clipboard;
9454
9647
  if (t && typeof t.writeText == "function") return await t.writeText(e), !0;
@@ -9466,7 +9659,7 @@ async function su(e) {
9466
9659
  }
9467
9660
  //#endregion
9468
9661
  //#region src/core/composables/useChat.ts
9469
- function cu(e = {}) {
9662
+ function yu(e = {}) {
9470
9663
  let { fetchResponse: t, fetchStream: n, onPersist: r, onClear: i } = e, a = /* @__PURE__ */ _t({
9471
9664
  messages: e.messages ?? [],
9472
9665
  loading: !1,
@@ -9645,9 +9838,9 @@ function cu(e = {}) {
9645
9838
  }
9646
9839
  //#endregion
9647
9840
  //#region src/core/composables/chatContext.ts
9648
- var lu = Symbol("chatContext");
9649
- function uu(e = {}) {
9650
- let t = cu({
9841
+ var bu = Symbol("chatContext");
9842
+ function xu(e = {}) {
9843
+ let t = yu({
9651
9844
  fetchResponse: e.fetchResponse,
9652
9845
  fetchStream: e.fetchStream,
9653
9846
  messages: e.messages,
@@ -9666,7 +9859,7 @@ function uu(e = {}) {
9666
9859
  }, h = /* @__PURE__ */ Ot({}), g = (e) => h.value[e] !== !1, _ = (e) => {
9667
9860
  h.value[e] = !g(e);
9668
9861
  }, v = /* @__PURE__ */ Ot(!1), y = (e) => {
9669
- su(e).then((e) => {
9862
+ vu(e).then((e) => {
9670
9863
  e && (v.value = !0, setTimeout(() => {
9671
9864
  v.value = !1;
9672
9865
  }, 1500));
@@ -9734,15 +9927,15 @@ function uu(e = {}) {
9734
9927
  }
9735
9928
  };
9736
9929
  }
9737
- function du() {
9738
- let e = Fn(lu);
9930
+ function Su() {
9931
+ let e = Fn(bu);
9739
9932
  if (!e) throw Error("useChatContext 必须在 provide(chatContextKey) 的组件子树内调用");
9740
9933
  return e;
9741
9934
  }
9742
9935
  //#endregion
9743
9936
  //#region src/core/index.headless.ts
9744
- function fu(e) {
9745
- return ou(e);
9937
+ function Cu(e) {
9938
+ return su(e);
9746
9939
  }
9747
9940
  //#endregion
9748
- export { Qs as CAPABILITIES, tc as CONTEXT_PRESETS, fs as CompressDecisionSchema, os as DEFAULT_SYSTEM_PROMPT, Ha as HUMAN_CONFIRM_TOOL_NAME, ti as MIN_CONTEXT_WINDOW, Xo as STOP_WORDS, oc as UNSAFE_KEYS, Il as actionsToInspectInfo, Fl as actionsToTools, Jr as agentError, Fo as analyzeContext, gc as applyPatchToClone, _c as applyPatchToLive, qr as asAgentError, ss as buildDataPrompt, cs as buildSystemPrompt, lu as chatContextKey, hl as commitSetToBind, Bo as connectMcp, f as constructLlmFromConfig, d as constructOpenLlmSync, su as copyText, ji as createAgent, Va as createApprovalMiddleware, uu as createChatContext, fu as createChatSdk, Qa as createCheckpointManager, $a as createCheckpointMiddleware, ws as createConflictManager, Io as createContextInspectorMiddleware, _l as createDataOps, Ga as createHumanConfirmMiddleware, Wa as createHumanConfirmTool, Gs as createMemoryBackend, Pa as createMemoryMiddleware, u as createProxyLlm, ba as createSandboxRunner, ec as createSdkEvents, $l as createSerialRunner, Ys as createSessionStore, Yl as createSkillStore, fo as createSubagentMiddleware, ho as createSubagentsMiddleware, Ul as createUsageHintsMiddleware, go as createVerifyMiddleware, wc as createVfs, qs as createWebStorageBackend, So as createWriteBackCheck, dc as deepClone, zl as defineDataToolset, Sa as defineSkill, ls as defineTool, uc as deleteByPath, ps as deriveTitle, Ui as describeSchemaNode, xi as detectGarbledToolCall, bc as diffObjects, Cl as domToStructure, Tl as domTools, Rl as domToolsStatic, Qo as estimateMessageTokens, $o as estimateRoundTokens, X as estimateTokens, m as extractReasoningDelta, ca as extractSchemaHint, Lo as extractText, p as extractTextDelta, h as extractUsage, yl as fetchDocTools, Ll as fetchTools, ml as filterByToolMode, Wi as formatConstraints, Ur as formatZodIssues, Z as getByPath, wl as getDomTool, Ol as getEnvSummary, Fi as getSchemaAtPath, Mi as getSchemaTopKeys, ai as getTraceMetrics, $ as hashValue, es as indexSummarize, jl as inspectEnvTool, Ml as inspectTools, ms as isChatModel, fi as isContextLengthError, Ni as isPathAllowed, Ls as isQuotaError, sc as isUnsafePath, Uc as jpEval, Gr as jsonParseError, mc as limitDepth, fc as maybeParseValue, ii as offloadPassThroughChars, ri as offloadThresholdChars, ra as presets, Li as projectBySchema, Ii as projectBySchemaDeep, pc as projectFields, ts as recallRounds, Gi as renderSchemaHint, Ki as renderSchemaOverview, Ji as renderSchemaShallow, $s as resolveCapabilities, rc as resolveContextOptions, Zs as resolveDialogConfig, Cs as resolveLlm, ni as resolveModelCaps, Xs as resolveStorage, yc as restoreInPlace, vc as restoreLive, Kr as routeError, xa as runHostScript, qc as runSandboxedScript, cc as safeMerge, Dl as safeSerialize, Q as safeStringify, Gc as searchJson, Bl as selectBuiltinTools, lc as setByPath, ns as shouldTriggerCompression, ia as systemPromptHelpers, Zo as tokenize, Y as toolError, Pi as unwrapSchema, cu as useChat, du as useChatContext, e as z, Wr as zodError };
9941
+ export { $s as CAPABILITIES, nc as CONTEXT_PRESETS, ps as CompressDecisionSchema, ss as DEFAULT_SYSTEM_PROMPT, Ha as HUMAN_CONFIRM_TOOL_NAME, ti as MIN_CONTEXT_WINDOW, lo as STOP_WORDS, sc as UNSAFE_KEYS, Ll as actionsToInspectInfo, Il as actionsToTools, Jr as agentError, ts as analyzeContext, _c as applyPatchToClone, vc as applyPatchToLive, qr as asAgentError, cs as buildDataPrompt, ls as buildSystemPrompt, bu as chatContextKey, gl as commitSetToBind, os as connectMcp, f as constructLlmFromConfig, d as constructOpenLlmSync, vu as copyText, ji as createAgent, Va as createApprovalMiddleware, xu as createChatContext, Cu as createChatSdk, Qa as createCheckpointManager, $a as createCheckpointMiddleware, Ts as createConflictManager, ns as createContextInspectorMiddleware, vl as createDataOps, _u as createHtmlSubagent, Ga as createHumanConfirmMiddleware, Wa as createHumanConfirmTool, Ks as createMemoryBackend, Pa as createMemoryMiddleware, u as createProxyLlm, pu as createRagSubagent, ba as createSandboxRunner, tc as createSdkEvents, eu as createSerialRunner, Xs as createSessionStore, Xl as createSkillStore, Mo as createSubagentMiddleware, bo as createSubagentTracker, Fo as createSubagentsMiddleware, Wl as createUsageHintsMiddleware, Io as createVerifyMiddleware, Tc as createVfs, Js as createWebStorageBackend, Ho as createWriteBackCheck, fc as deepClone, Bl as defineDataToolset, Sa as defineSkill, us as defineTool, dc as deleteByPath, ms as deriveTitle, Ui as describeSchemaNode, xi as detectGarbledToolCall, xc as diffObjects, wl as domToStructure, El as domTools, zl as domToolsStatic, fo as estimateMessageTokens, po as estimateRoundTokens, X as estimateTokens, m as extractReasoningDelta, ca as extractSchemaHint, rs as extractText, p as extractTextDelta, h as extractUsage, bl as fetchDocTools, Rl as fetchTools, hl as filterByToolMode, Wi as formatConstraints, Ur as formatZodIssues, Z as getByPath, Tl as getDomTool, kl as getEnvSummary, Fi as getSchemaAtPath, Mi as getSchemaTopKeys, ai as getTraceMetrics, $ as hashValue, mo as indexSummarize, Ml as inspectEnvTool, Nl as inspectTools, hs as isChatModel, fi as isContextLengthError, Ni as isPathAllowed, Rs as isQuotaError, cc as isUnsafePath, Wc as jpEval, Gr as jsonParseError, hc as limitDepth, pc as maybeParseValue, ii as offloadPassThroughChars, ri as offloadThresholdChars, ra as presets, Li as projectBySchema, Ii as projectBySchemaDeep, mc as projectFields, ho as recallRounds, Gi as renderSchemaHint, Ki as renderSchemaOverview, Ji as renderSchemaShallow, ec as resolveCapabilities, ic as resolveContextOptions, Qs as resolveDialogConfig, ws as resolveLlm, ni as resolveModelCaps, Zs as resolveStorage, bc as restoreInPlace, yc as restoreLive, Kr as routeError, xa as runHostScript, Jc as runSandboxedScript, lc as safeMerge, Ol as safeSerialize, Q as safeStringify, Kc as searchJson, Vl as selectBuiltinTools, uc as setByPath, go as shouldTriggerCompression, ia as systemPromptHelpers, uo as tokenize, Y as toolError, Pi as unwrapSchema, yu as useChat, Su as useChatContext, e as z, Wr as zodError };