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.
- package/README.md +3 -1
- package/README.zh-CN.md +2 -0
- package/dist/page-agent-sdk.headless.js +1193 -1000
- package/dist/page-agent-sdk.iife.js +181 -110
- package/dist/page-agent-sdk.js +2375 -2095
- package/dist/page-agent-sdk.umd.cjs +132 -61
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/skills/html-builder/SKILL.md +51 -0
- package/skills/rag-search/SKILL.md +35 -0
- package/types/headless.d.ts +72 -0
- package/types/index.d.ts +75 -0
|
@@ -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
|
|
420
|
+
return Ke(this, "every", e, t, void 0, arguments);
|
|
421
421
|
},
|
|
422
422
|
filter(e, t) {
|
|
423
|
-
return
|
|
423
|
+
return Ke(this, "filter", e, t, (e) => e.map((e) => He(this, e)), arguments);
|
|
424
424
|
},
|
|
425
425
|
find(e, t) {
|
|
426
|
-
return
|
|
426
|
+
return Ke(this, "find", e, t, (e) => He(this, e), arguments);
|
|
427
427
|
},
|
|
428
428
|
findIndex(e, t) {
|
|
429
|
-
return
|
|
429
|
+
return Ke(this, "findIndex", e, t, void 0, arguments);
|
|
430
430
|
},
|
|
431
431
|
findLast(e, t) {
|
|
432
|
-
return
|
|
432
|
+
return Ke(this, "findLast", e, t, (e) => He(this, e), arguments);
|
|
433
433
|
},
|
|
434
434
|
findLastIndex(e, t) {
|
|
435
|
-
return
|
|
435
|
+
return Ke(this, "findLastIndex", e, t, void 0, arguments);
|
|
436
436
|
},
|
|
437
437
|
forEach(e, t) {
|
|
438
|
-
return
|
|
438
|
+
return Ke(this, "forEach", e, t, void 0, arguments);
|
|
439
439
|
},
|
|
440
440
|
includes(...e) {
|
|
441
|
-
return
|
|
441
|
+
return qe(this, "includes", e);
|
|
442
442
|
},
|
|
443
443
|
indexOf(...e) {
|
|
444
|
-
return
|
|
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
|
|
450
|
+
return qe(this, "lastIndexOf", e);
|
|
451
451
|
},
|
|
452
452
|
map(e, t) {
|
|
453
|
-
return
|
|
453
|
+
return Ke(this, "map", e, t, void 0, arguments);
|
|
454
454
|
},
|
|
455
455
|
pop() {
|
|
456
|
-
return
|
|
456
|
+
return U(this, "pop");
|
|
457
457
|
},
|
|
458
458
|
push(...e) {
|
|
459
|
-
return
|
|
459
|
+
return U(this, "push", e);
|
|
460
460
|
},
|
|
461
461
|
reduce(e, ...t) {
|
|
462
|
-
return
|
|
462
|
+
return H(this, "reduce", e, t);
|
|
463
463
|
},
|
|
464
464
|
reduceRight(e, ...t) {
|
|
465
|
-
return
|
|
465
|
+
return H(this, "reduceRight", e, t);
|
|
466
466
|
},
|
|
467
467
|
shift() {
|
|
468
|
-
return
|
|
468
|
+
return U(this, "shift");
|
|
469
469
|
},
|
|
470
470
|
some(e, t) {
|
|
471
|
-
return
|
|
471
|
+
return Ke(this, "some", e, t, void 0, arguments);
|
|
472
472
|
},
|
|
473
473
|
splice(...e) {
|
|
474
|
-
return
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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),
|
|
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 ?
|
|
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 } =
|
|
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 ?
|
|
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 =
|
|
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 } =
|
|
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 } =
|
|
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/
|
|
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
|
|
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
|
-
],
|
|
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
|
|
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
|
|
4235
|
+
function ko(e, t) {
|
|
3953
4236
|
return t.some((t) => e === t || e.startsWith(t + ".") || e.startsWith(t + "["));
|
|
3954
4237
|
}
|
|
3955
|
-
function
|
|
4238
|
+
function Ao(e, t) {
|
|
3956
4239
|
let n = e.invoke.bind(e), r = async (e) => {
|
|
3957
|
-
let r =
|
|
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 (!
|
|
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
|
|
3967
|
-
let a = t.depth ?? 0, o = t.maxDepth ??
|
|
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) => !
|
|
3970
|
-
let e = c().filter((e) =>
|
|
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 ? [
|
|
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:
|
|
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 =
|
|
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
|
-
...
|
|
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 ??
|
|
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} 个)`),
|
|
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
|
|
4015
|
-
let n = e.maxParallel ??
|
|
4016
|
-
|
|
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:
|
|
4019
|
-
label:
|
|
4020
|
-
kind:
|
|
4021
|
-
name:
|
|
4022
|
-
args:
|
|
4023
|
-
result:
|
|
4024
|
-
status:
|
|
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
|
|
4071
|
-
function
|
|
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
|
|
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 (!
|
|
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 =
|
|
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
|
-
"
|
|
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
|
|
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:
|
|
4507
|
+
model: Wo(e.adversarial.llm),
|
|
4188
4508
|
tools: (e.adversarial.tools ?? []).length
|
|
4189
4509
|
});
|
|
4190
|
-
let n = await
|
|
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
|
|
4521
|
+
var Lo = /* @__PURE__ */ new Set([
|
|
4202
4522
|
"set_data",
|
|
4203
4523
|
"edit_data",
|
|
4204
4524
|
"delete_data",
|
|
4205
4525
|
"write"
|
|
4206
|
-
]),
|
|
4207
|
-
function
|
|
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 (!
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
4592
|
+
let r = zo(e);
|
|
4273
4593
|
if (!r.length) return { ok: !0 };
|
|
4274
|
-
let i =
|
|
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 &&
|
|
4278
|
-
let c =
|
|
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
|
|
4612
|
+
function Uo(e) {
|
|
4293
4613
|
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
4294
4614
|
}
|
|
4295
|
-
function
|
|
4296
|
-
return
|
|
4615
|
+
function Wo(e) {
|
|
4616
|
+
return Uo(e) ? e.model ?? e.modelName ?? "<实例>" : e.model ?? "<配置>";
|
|
4297
4617
|
}
|
|
4298
|
-
var
|
|
4299
|
-
function
|
|
4300
|
-
return
|
|
4618
|
+
var Go = /无问题|没有问题|未发现问题|没有发现|没问题|未发现/;
|
|
4619
|
+
function Ko(e) {
|
|
4620
|
+
return Go.test(e);
|
|
4301
4621
|
}
|
|
4302
|
-
function
|
|
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
|
|
4311
|
-
let { lastUser: i, lastReply: a } =
|
|
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(
|
|
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
|
-
}),
|
|
4667
|
+
}), Ko(u) ? null : u.trim();
|
|
4348
4668
|
}
|
|
4349
4669
|
//#endregion
|
|
4350
4670
|
//#region src/core/utils/contextAnalysis.ts
|
|
4351
|
-
var
|
|
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
|
-
],
|
|
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
|
|
4754
|
+
function Zo() {
|
|
4435
4755
|
let e = {};
|
|
4436
|
-
for (let t of
|
|
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
|
|
4765
|
+
function Qo(e, t) {
|
|
4446
4766
|
e.tokens += t, e.msgCount += 1;
|
|
4447
4767
|
}
|
|
4448
|
-
function
|
|
4768
|
+
function $o(e) {
|
|
4449
4769
|
let t = e.content;
|
|
4450
4770
|
return typeof t == "string" ? t : JSON.stringify(t ?? "");
|
|
4451
|
-
}
|
|
4452
|
-
function
|
|
4453
|
-
let n = [];
|
|
4454
|
-
for (let t of
|
|
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
|
-
|
|
4755
|
-
|
|
4756
|
-
|
|
4757
|
-
|
|
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) =>
|
|
4760
|
-
|
|
4761
|
-
}
|
|
4762
|
-
}
|
|
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
|
-
|
|
4786
|
-
|
|
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/
|
|
4791
|
-
function
|
|
4792
|
-
let t =
|
|
4793
|
-
return
|
|
4794
|
-
name: "
|
|
4795
|
-
|
|
4796
|
-
|
|
4797
|
-
|
|
4798
|
-
|
|
4799
|
-
|
|
4800
|
-
|
|
4801
|
-
|
|
4802
|
-
|
|
4803
|
-
|
|
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
|
-
}
|
|
4822
|
-
|
|
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
|
|
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
|
|
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
|
|
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 :
|
|
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
|
|
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
|
|
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
|
|
4868
|
-
return
|
|
4933
|
+
function fs(e) {
|
|
4934
|
+
return us({
|
|
4869
4935
|
name: "inspect_context",
|
|
4870
4936
|
description: "查看当前对话上下文的构成(供压缩决策)。返回:totalTokens(历史轮次 token 总和,与触发判断同口径)、occupancy(窗口占用比)、contextWindow、categories(分类占用)、rounds(每轮 token/工具/首句)。先调用本工具查看构成,再决定压缩策略。",
|
|
4871
|
-
schema:
|
|
4937
|
+
schema: ds,
|
|
4872
4938
|
handler: (t) => {
|
|
4873
|
-
let n =
|
|
4874
|
-
let n =
|
|
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
|
|
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
|
|
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
|
|
4976
|
+
function hs(e) {
|
|
4911
4977
|
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
4912
4978
|
}
|
|
4913
|
-
function
|
|
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
|
|
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 =
|
|
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
|
-
})),
|
|
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
|
|
5004
|
+
function vs(e) {
|
|
4939
5005
|
let t = e.titleLlm ?? e.summaryLlm ?? e.llm;
|
|
4940
5006
|
if (!t) return;
|
|
4941
|
-
let n =
|
|
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
|
-
})),
|
|
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
|
|
5024
|
+
function ys() {
|
|
4959
5025
|
return `call_dec_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
4960
5026
|
}
|
|
4961
|
-
function
|
|
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
|
|
5036
|
+
function xs(e) {
|
|
4971
5037
|
if (!e) return null;
|
|
4972
|
-
let t =
|
|
5038
|
+
let t = bs(e);
|
|
4973
5039
|
if (t == null) return null;
|
|
4974
|
-
let n =
|
|
5040
|
+
let n = ps.safeParse(t);
|
|
4975
5041
|
return n.success ? n.data : null;
|
|
4976
5042
|
}
|
|
4977
|
-
async function
|
|
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
|
|
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 ??
|
|
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
|
|
5067
|
+
function Cs(e) {
|
|
5002
5068
|
let t = e.summaryLlm ?? e.llm;
|
|
5003
5069
|
if (!t) return;
|
|
5004
|
-
let n =
|
|
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 =
|
|
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
|
|
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
|
|
5030
|
-
let t = e.llm, n =
|
|
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:
|
|
5038
|
-
titleLlmInvoke:
|
|
5039
|
-
compressDecisionInvoke:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
5168
|
+
function zs(e, t, n, r) {
|
|
5103
5169
|
return [
|
|
5104
|
-
|
|
5170
|
+
Fs,
|
|
5105
5171
|
e,
|
|
5106
5172
|
t,
|
|
5107
5173
|
n,
|
|
5108
5174
|
r
|
|
5109
5175
|
].join("::");
|
|
5110
5176
|
}
|
|
5111
|
-
function
|
|
5177
|
+
function Bs(e, t, n) {
|
|
5112
5178
|
return [
|
|
5113
|
-
|
|
5179
|
+
Fs,
|
|
5114
5180
|
e,
|
|
5115
5181
|
t,
|
|
5116
5182
|
n
|
|
5117
5183
|
].join("::") + "::";
|
|
5118
5184
|
}
|
|
5119
|
-
function
|
|
5185
|
+
function Vs(e, t) {
|
|
5120
5186
|
return [
|
|
5121
|
-
|
|
5187
|
+
Fs,
|
|
5122
5188
|
e,
|
|
5123
5189
|
t
|
|
5124
5190
|
].join("::") + "::";
|
|
5125
5191
|
}
|
|
5126
|
-
function
|
|
5127
|
-
return [
|
|
5192
|
+
function Hs(e) {
|
|
5193
|
+
return [Fs, e].join("::") + "::";
|
|
5128
5194
|
}
|
|
5129
|
-
var
|
|
5130
|
-
function
|
|
5131
|
-
|
|
5195
|
+
var Us = null;
|
|
5196
|
+
function Ws(e) {
|
|
5197
|
+
Us ||= new TextEncoder();
|
|
5132
5198
|
try {
|
|
5133
|
-
return
|
|
5199
|
+
return Us.encode(JSON.stringify(e)).length;
|
|
5134
5200
|
} catch {
|
|
5135
5201
|
return 0;
|
|
5136
5202
|
}
|
|
5137
5203
|
}
|
|
5138
|
-
function
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
5268
|
-
let t = e.dbName ??
|
|
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
|
|
5347
|
+
l = await qs(t), d(!0);
|
|
5282
5348
|
} else if (n === "session") {
|
|
5283
5349
|
if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
|
|
5284
|
-
l =
|
|
5350
|
+
l = Js(sessionStorage), d(!0);
|
|
5285
5351
|
} else if (n === "local") {
|
|
5286
5352
|
if (typeof localStorage > "u") throw Error("localStorage 不可用");
|
|
5287
|
-
l =
|
|
5288
|
-
} else l =
|
|
5353
|
+
l = Js(localStorage), d(!0);
|
|
5354
|
+
} else l = Ks(), d(!1);
|
|
5289
5355
|
} catch (e) {
|
|
5290
|
-
l =
|
|
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 =
|
|
5301
|
-
return
|
|
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 :
|
|
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 (
|
|
5391
|
+
if (Rs(e) && !u) {
|
|
5326
5392
|
u = !0;
|
|
5327
5393
|
try {
|
|
5328
5394
|
await b();
|
|
5329
5395
|
} catch {}
|
|
5330
|
-
l =
|
|
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 =
|
|
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
|
-
},
|
|
5435
|
+
}, Ns);
|
|
5370
5436
|
}
|
|
5371
5437
|
async function b() {
|
|
5372
5438
|
let e = [];
|
|
5373
|
-
await l.scan(
|
|
5439
|
+
await l.scan(Hs(t), (t, n) => {
|
|
5374
5440
|
t.endsWith("::__meta__") && e.push(n);
|
|
5375
5441
|
});
|
|
5376
|
-
let n =
|
|
5377
|
-
for (let e of n) await l.clearPrefix(
|
|
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(
|
|
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 =
|
|
5394
|
-
return await
|
|
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
|
|
5404
|
-
let i = await l.get(
|
|
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
|
|
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 =
|
|
5417
|
-
return
|
|
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(
|
|
5499
|
+
await l.clearPrefix(Bs(t, e, n));
|
|
5434
5500
|
},
|
|
5435
5501
|
async createSession(e, n, r) {
|
|
5436
|
-
let i = r ??
|
|
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(
|
|
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
|
|
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
|
|
5622
|
+
function ec(e) {
|
|
5557
5623
|
let t = {};
|
|
5558
|
-
for (let n of
|
|
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
|
|
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
|
|
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
|
|
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
|
-
},
|
|
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
|
|
5638
|
-
let n =
|
|
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
|
|
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
|
|
5731
|
+
function oc(e) {
|
|
5666
5732
|
return e.map((e, t) => ({
|
|
5667
5733
|
m: e,
|
|
5668
5734
|
i: t,
|
|
5669
|
-
p:
|
|
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
|
|
5740
|
+
var sc = /* @__PURE__ */ new Set([
|
|
5675
5741
|
"__proto__",
|
|
5676
5742
|
"constructor",
|
|
5677
5743
|
"prototype"
|
|
5678
5744
|
]);
|
|
5679
|
-
function
|
|
5680
|
-
return e.split(".").some((e) =>
|
|
5745
|
+
function cc(e) {
|
|
5746
|
+
return e.split(".").some((e) => sc.has(e));
|
|
5681
5747
|
}
|
|
5682
|
-
function
|
|
5683
|
-
if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t))
|
|
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 (
|
|
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
|
|
5696
|
-
if (!t ||
|
|
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
|
|
5705
|
-
if (!t ||
|
|
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
|
|
5780
|
+
function fc(e) {
|
|
5715
5781
|
return e === void 0 ? void 0 : JSON.parse(JSON.stringify(e));
|
|
5716
5782
|
}
|
|
5717
|
-
function
|
|
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
|
|
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) =>
|
|
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
|
|
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) =>
|
|
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] =
|
|
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
|
|
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
|
|
5838
|
+
return gc(Q(e)).toString(36);
|
|
5773
5839
|
}
|
|
5774
|
-
function
|
|
5775
|
-
if (t === "set") return n ? (
|
|
5776
|
-
if (t === "remove") return n ? (
|
|
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})` : "(根)"}不是对象` : (
|
|
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
|
|
5785
|
-
if (t === "set")
|
|
5786
|
-
else if (t === "remove")
|
|
5787
|
-
else if (t === "merge")
|
|
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
|
|
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(...
|
|
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(...
|
|
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
|
|
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
|
-
},
|
|
5914
|
+
}, Cc = [
|
|
5849
5915
|
"largeResults",
|
|
5850
5916
|
"drafts",
|
|
5851
5917
|
"userFiles",
|
|
5852
5918
|
"resources"
|
|
5853
|
-
],
|
|
5854
|
-
function
|
|
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[
|
|
5922
|
+
if (e) for (let [t, r] of Object.entries(e)) n[kc(t)] = {
|
|
5857
5923
|
content: r,
|
|
5858
|
-
updatedAt:
|
|
5924
|
+
updatedAt: jc()
|
|
5859
5925
|
};
|
|
5860
5926
|
let { persist: r } = t, i = t.maxBytes ?? 8388608, a = {
|
|
5861
|
-
...
|
|
5927
|
+
...Sc,
|
|
5862
5928
|
...t.poolBytes ?? {}
|
|
5863
5929
|
};
|
|
5864
5930
|
function o(e) {
|
|
5865
|
-
let t =
|
|
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 +=
|
|
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
|
|
5940
|
+
for (let e of Cc) {
|
|
5875
5941
|
let t = a[e];
|
|
5876
5942
|
if (s(e) <= t) continue;
|
|
5877
|
-
let r = t *
|
|
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 (
|
|
5883
|
-
let e = i *
|
|
5884
|
-
for (let [i] of r) if (!(o(i) === "largeResults" && !t && u.has(i)) && (delete n[i],
|
|
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[
|
|
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
|
|
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 +=
|
|
6001
|
+
for (let n of Object.values(e)) t += Dc(n.content);
|
|
5936
6002
|
return t;
|
|
5937
6003
|
}
|
|
5938
|
-
function
|
|
6004
|
+
function kc(e) {
|
|
5939
6005
|
return e.replace(/^\/+/, "").replace(/\/+/g, "/");
|
|
5940
6006
|
}
|
|
5941
|
-
function
|
|
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
|
|
6015
|
+
function jc() {
|
|
5950
6016
|
return Date.now();
|
|
5951
6017
|
}
|
|
5952
|
-
var
|
|
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
|
|
6029
|
+
function Nc(e) {
|
|
5964
6030
|
return [
|
|
5965
6031
|
r(async ({ path: t, offset: n, limit: r }) => {
|
|
5966
|
-
let i = e.files[
|
|
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[
|
|
6061
|
+
return e.files[kc(t)] = {
|
|
5996
6062
|
content: n,
|
|
5997
|
-
updatedAt:
|
|
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 =
|
|
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:
|
|
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 =
|
|
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 ? [
|
|
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 =
|
|
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 =
|
|
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 =
|
|
6228
|
+
let o = fc(a), s = [];
|
|
6163
6229
|
for (let e of n) {
|
|
6164
|
-
let n =
|
|
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:
|
|
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 =
|
|
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
|
|
6277
|
+
function Pc(e) {
|
|
6212
6278
|
return {
|
|
6213
6279
|
name: "vfs",
|
|
6214
|
-
tools:
|
|
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
|
|
6221
|
-
function
|
|
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 &&
|
|
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 &&
|
|
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
|
|
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
|
|
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(),
|
|
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
|
|
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
|
|
6463
|
+
function zc(e) {
|
|
6398
6464
|
return !!e && e !== 0 && e !== "" && e !== null;
|
|
6399
6465
|
}
|
|
6400
|
-
function
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
6480
|
-
path:
|
|
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
|
-
|
|
6488
|
-
path:
|
|
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
|
|
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
|
|
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,
|
|
6524
|
-
else for (let t of Object.keys(e)) c(e[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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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}${
|
|
6633
|
+
return `${Yc}${e}${Zc}`;
|
|
6571
6634
|
}
|
|
6572
6635
|
function $c(e) {
|
|
6573
|
-
return
|
|
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(
|
|
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
|
|
6647
|
+
function tl(e) {
|
|
6582
6648
|
return String(e ?? "").trim().replace(/^\.+/, "");
|
|
6583
6649
|
}
|
|
6584
|
-
function
|
|
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
|
|
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
|
|
6593
|
-
let n =
|
|
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
|
|
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 =
|
|
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(
|
|
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 ??
|
|
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
|
|
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 =
|
|
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" ?
|
|
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" ?
|
|
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
|
|
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
|
-
} :
|
|
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
|
|
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 &&
|
|
6783
|
+
a !== void 0 && uc(e, r, a);
|
|
6718
6784
|
continue;
|
|
6719
6785
|
}
|
|
6720
6786
|
if (i.mode === "freeze") {
|
|
6721
|
-
if (o ===
|
|
6722
|
-
|
|
6787
|
+
if (o === Qc(r)) {
|
|
6788
|
+
uc(e, r, a);
|
|
6723
6789
|
continue;
|
|
6724
6790
|
}
|
|
6725
|
-
if (!
|
|
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 =
|
|
6799
|
+
let n = el(o);
|
|
6734
6800
|
if (n && n.type === "res") {
|
|
6735
|
-
let i =
|
|
6801
|
+
let i = sl(n.handle, r, a, t.resourceStore);
|
|
6736
6802
|
if ("value" in i) {
|
|
6737
|
-
|
|
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 (!
|
|
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
|
|
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
|
|
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 =
|
|
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:
|
|
6850
|
+
error: ll(i)
|
|
6785
6851
|
};
|
|
6786
6852
|
}
|
|
6787
|
-
function
|
|
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 =
|
|
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 =
|
|
6878
|
+
let i = cl(n, r);
|
|
6813
6879
|
if (!i.ok) {
|
|
6814
|
-
let e =
|
|
6880
|
+
let e = fl(i.path, t);
|
|
6815
6881
|
return {
|
|
6816
6882
|
ok: !1,
|
|
6817
|
-
error:
|
|
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
|
|
6823
|
-
let n =
|
|
6888
|
+
function fl(e, t) {
|
|
6889
|
+
let n = tl(e);
|
|
6824
6890
|
for (let e = 0; e < t.length; e++) {
|
|
6825
|
-
let r =
|
|
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
|
|
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
|
-
]),
|
|
6847
|
-
function
|
|
6848
|
-
return t === "advanced" ? e : t === "minimal" ? e.filter((e) =>
|
|
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
|
|
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 =
|
|
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 =
|
|
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 ?
|
|
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
|
|
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 =
|
|
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 (
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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:
|
|
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" &&
|
|
6985
|
-
return m.data !== null && typeof m.data == "object" && (i ?
|
|
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
|
|
6992
|
-
let i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s = Mi(i), c = /* @__PURE__ */ new Map(), l = n.vfsStore ? new
|
|
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 =
|
|
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 =
|
|
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 =
|
|
7061
|
-
l.update(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 =
|
|
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
|
|
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 (
|
|
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 =
|
|
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 =
|
|
7202
|
+
let r = pc(e);
|
|
7137
7203
|
if (r.parseError) return Gr("", e, r.parseError);
|
|
7138
|
-
let o =
|
|
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 (
|
|
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 =
|
|
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 (
|
|
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 =
|
|
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 =
|
|
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 ? (
|
|
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 =
|
|
7382
|
+
let a = fc(r.value), o = t || "";
|
|
7317
7383
|
if (o) {
|
|
7318
|
-
if (
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 ?
|
|
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 =
|
|
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 =
|
|
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 (
|
|
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 =
|
|
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 =
|
|
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 (
|
|
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 =
|
|
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 =
|
|
7665
|
-
return
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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),
|
|
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
|
|
7991
|
-
let n = new AbortController(), r = setTimeout(() => n.abort(),
|
|
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 ? `获取失败:请求超时(${
|
|
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
|
-
})],
|
|
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
|
-
],
|
|
8032
|
-
function
|
|
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 ??
|
|
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-")) && (
|
|
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
|
|
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 =
|
|
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
|
-
}),
|
|
8136
|
+
}), El = [Tl];
|
|
8071
8137
|
//#endregion
|
|
8072
8138
|
//#region src/core/tools/envTool.ts
|
|
8073
|
-
function
|
|
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
|
|
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 (
|
|
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) =>
|
|
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] =
|
|
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
|
|
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
|
|
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 (
|
|
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:
|
|
8223
|
+
value: Ol(t)
|
|
8158
8224
|
}, null, 2);
|
|
8159
8225
|
}
|
|
8160
|
-
return JSON.stringify(
|
|
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
|
-
}),
|
|
8231
|
+
}), Nl = [Ml];
|
|
8166
8232
|
//#endregion
|
|
8167
8233
|
//#region src/core/harness/budget.ts
|
|
8168
|
-
function
|
|
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
|
|
8194
|
-
function
|
|
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 (!
|
|
8198
|
-
console.warn(`[page-agent-sdk][actions] 动作名 "${i}" 非法(须匹配 ${
|
|
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
|
|
8284
|
+
function Ll(e) {
|
|
8219
8285
|
let t = {};
|
|
8220
|
-
for (let [n, r] of Object.entries(e))
|
|
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
|
|
8229
|
-
function
|
|
8230
|
-
return
|
|
8294
|
+
var Rl = bl, zl = El;
|
|
8295
|
+
function Bl(e, t) {
|
|
8296
|
+
return vl(e, t);
|
|
8231
8297
|
}
|
|
8232
|
-
function
|
|
8233
|
-
let a =
|
|
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
|
|
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
|
|
8264
|
-
function
|
|
8265
|
-
let i =
|
|
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) >=
|
|
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
|
|
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
|
|
8295
|
-
function
|
|
8296
|
-
return `${
|
|
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
|
|
8299
|
-
return `${
|
|
8364
|
+
function Yl(e, t) {
|
|
8365
|
+
return `${Kl}::${e}::${t}::`;
|
|
8300
8366
|
}
|
|
8301
|
-
function
|
|
8302
|
-
let t = e.dbName ??
|
|
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
|
|
8375
|
+
i = await qs(t), a(!0);
|
|
8310
8376
|
} else if (n === "session") {
|
|
8311
8377
|
if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
|
|
8312
|
-
i =
|
|
8378
|
+
i = Js(sessionStorage), a(!0);
|
|
8313
8379
|
} else if (n === "local") {
|
|
8314
8380
|
if (typeof localStorage > "u") throw Error("localStorage 不可用");
|
|
8315
|
-
i =
|
|
8316
|
-
} else i =
|
|
8381
|
+
i = Js(localStorage), a(!0);
|
|
8382
|
+
} else i = Ks(), a(!1);
|
|
8317
8383
|
} catch {
|
|
8318
|
-
i =
|
|
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(
|
|
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(
|
|
8395
|
+
return await i.get(Jl(t, r, e));
|
|
8330
8396
|
},
|
|
8331
8397
|
async put(e) {
|
|
8332
8398
|
try {
|
|
8333
|
-
await i.set(
|
|
8399
|
+
await i.set(Jl(t, r, e.name), e);
|
|
8334
8400
|
} catch (e) {
|
|
8335
|
-
|
|
8401
|
+
Rs(e) && (i = Ks());
|
|
8336
8402
|
}
|
|
8337
8403
|
},
|
|
8338
8404
|
async remove(e) {
|
|
8339
|
-
let n =
|
|
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(
|
|
8409
|
+
await i.clearPrefix(Yl(t, r));
|
|
8344
8410
|
},
|
|
8345
8411
|
dispose() {}
|
|
8346
8412
|
};
|
|
8347
8413
|
}
|
|
8348
|
-
var
|
|
8349
|
-
function
|
|
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 (
|
|
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
|
|
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
|
|
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
|
|
8375
|
-
function
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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 } =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 ?
|
|
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 =
|
|
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 } =
|
|
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
|
|
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,
|
|
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
|
|
8594
|
-
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:
|
|
8597
|
-
systemPrompt:
|
|
8598
|
-
temperature:
|
|
8599
|
-
maxTokens:
|
|
8600
|
-
skills:
|
|
8601
|
-
maxDepth:
|
|
8602
|
-
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
|
-
|
|
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
|
-
|
|
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
|
-
],
|
|
8618
|
-
check: e.verify.check ??
|
|
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:
|
|
8692
|
+
tools: ze
|
|
8625
8693
|
} : void 0
|
|
8626
|
-
}) : void 0,
|
|
8694
|
+
}) : void 0, Ve = Ne ? ns({
|
|
8627
8695
|
contextWindow: m.contextWindow,
|
|
8628
|
-
thresholdRatio:
|
|
8629
|
-
}) : void 0,
|
|
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),
|
|
8705
|
+
}, ne && !!D, e.toolMode, !!D?.resources?.length), Ue = D ? {
|
|
8638
8706
|
name: "dataHint",
|
|
8639
|
-
augmentPrompt: () =>
|
|
8640
|
-
} : null,
|
|
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,
|
|
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
|
-
}),
|
|
8725
|
+
}), Ye = (e) => ({
|
|
8658
8726
|
name: e.name,
|
|
8659
8727
|
description: e.description,
|
|
8660
8728
|
getContent: () => e.content
|
|
8661
|
-
}),
|
|
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
|
-
}),
|
|
8665
|
-
let t =
|
|
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
|
-
},
|
|
8672
|
-
if (
|
|
8673
|
-
let t = await
|
|
8739
|
+
}, Qe = async () => {
|
|
8740
|
+
if (Xe) try {
|
|
8741
|
+
let t = await Xe.list();
|
|
8674
8742
|
if (t.length) {
|
|
8675
|
-
U = t.map(
|
|
8676
|
-
let n =
|
|
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
|
-
},
|
|
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: () =>
|
|
8759
|
+
getSnapshot: () => Ve?.getSnapshot()
|
|
8692
8760
|
} : {}
|
|
8693
|
-
}) : void 0,
|
|
8694
|
-
...
|
|
8695
|
-
|
|
8761
|
+
}) : void 0, et = oc([
|
|
8762
|
+
...Ue ? [Ue] : [],
|
|
8763
|
+
He,
|
|
8696
8764
|
...Se ? [C] : [],
|
|
8697
8765
|
...xe ? [S] : [],
|
|
8698
|
-
...we ? [
|
|
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 ? [
|
|
8710
|
-
|
|
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 ? [
|
|
8793
|
+
...re ? [Pl(i, {
|
|
8726
8794
|
tokenBudget: e.tokenBudget,
|
|
8727
8795
|
timeBudgetMs: e.timeBudgetMs
|
|
8728
8796
|
}, H)] : [],
|
|
8729
|
-
|
|
8730
|
-
]),
|
|
8731
|
-
async function
|
|
8732
|
-
s && (
|
|
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:
|
|
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:
|
|
8821
|
+
skillsController: qe ? qe.controller : null,
|
|
8754
8822
|
infoTick: o,
|
|
8755
8823
|
pendingConflict: a.pendingConflict,
|
|
8756
|
-
sessions:
|
|
8757
|
-
refreshSessions:
|
|
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
|
-
|
|
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),
|
|
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),
|
|
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
|
-
|
|
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 : "") }),
|
|
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 =
|
|
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
|
-
}),
|
|
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?.(
|
|
8947
|
-
let r =
|
|
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()),
|
|
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())),
|
|
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 (
|
|
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 =
|
|
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)),
|
|
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 (!
|
|
9070
|
+
if (!Re) {
|
|
9003
9071
|
e.debug && console.warn("[page-agent-sdk][setSubagents] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略");
|
|
9004
9072
|
return;
|
|
9005
9073
|
}
|
|
9006
|
-
|
|
9074
|
+
Re.set(t), W.infoTick.value++;
|
|
9007
9075
|
},
|
|
9008
9076
|
addSubagent(t) {
|
|
9009
|
-
if (!
|
|
9077
|
+
if (!Re) {
|
|
9010
9078
|
e.debug && console.warn("[page-agent-sdk][addSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略");
|
|
9011
9079
|
return;
|
|
9012
9080
|
}
|
|
9013
|
-
|
|
9081
|
+
Re.add(t), W.infoTick.value++;
|
|
9014
9082
|
},
|
|
9015
9083
|
removeSubagent(t) {
|
|
9016
|
-
if (!
|
|
9017
|
-
let n =
|
|
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:
|
|
9025
|
-
systemPrompt: W.agent?.getEffectiveSystemPrompt?.() ?? P +
|
|
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: (
|
|
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:
|
|
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:
|
|
9135
|
+
actions: Ll(e.actions ?? {}),
|
|
9062
9136
|
subagent: {
|
|
9063
|
-
enabled: !!
|
|
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:
|
|
9141
|
+
subagents: Re?.get() ?? [],
|
|
9142
|
+
active: Ae?.getActive() ?? [],
|
|
9143
|
+
history: Ae?.getHistory() ?? []
|
|
9068
9144
|
},
|
|
9069
9145
|
verify: {
|
|
9070
|
-
enabled: !!
|
|
9071
|
-
maxAttempts:
|
|
9072
|
-
adversarial:
|
|
9146
|
+
enabled: !!Be,
|
|
9147
|
+
maxAttempts: Me ? je : 0,
|
|
9148
|
+
adversarial: Me && !!e.verify?.adversarial
|
|
9073
9149
|
},
|
|
9074
9150
|
context: (() => {
|
|
9075
|
-
let e =
|
|
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 =
|
|
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 =
|
|
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
|
|
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 : "") }),
|
|
9225
|
+
e.memory && s.save(n, W.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }), rt();
|
|
9150
9226
|
}
|
|
9151
|
-
async function
|
|
9152
|
-
await
|
|
9227
|
+
async function at() {
|
|
9228
|
+
await Qe();
|
|
9153
9229
|
}
|
|
9154
|
-
function
|
|
9230
|
+
function ot(e) {
|
|
9155
9231
|
let t = {};
|
|
9156
|
-
for (let n of
|
|
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
|
|
9163
|
-
let e =
|
|
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
|
|
9167
|
-
let e =
|
|
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:
|
|
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),
|
|
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(
|
|
9261
|
+
let e = await l(mo(t, v)), i = b.indexOf(n);
|
|
9186
9262
|
if (i < 0) return;
|
|
9187
|
-
b[i].content =
|
|
9263
|
+
b[i].content = so(t, r, e), dt();
|
|
9188
9264
|
} catch {}
|
|
9189
9265
|
})();
|
|
9190
9266
|
}
|
|
9191
9267
|
}
|
|
9192
|
-
let
|
|
9193
|
-
function
|
|
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 =
|
|
9212
|
-
a && a !==
|
|
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
|
|
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
|
|
9219
|
-
let t = await Promise.allSettled(e.mcp.map((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 =
|
|
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:
|
|
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:
|
|
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,
|
|
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
|
|
9260
|
-
let n = e.id ??
|
|
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 ?
|
|
9263
|
-
o ? a = o : (a =
|
|
9264
|
-
let s = null, c =
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
9649
|
-
function
|
|
9650
|
-
let t =
|
|
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
|
-
|
|
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
|
|
9738
|
-
let e = Fn(
|
|
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
|
|
9745
|
-
return
|
|
9937
|
+
function Cu(e) {
|
|
9938
|
+
return su(e);
|
|
9746
9939
|
}
|
|
9747
9940
|
//#endregion
|
|
9748
|
-
export {
|
|
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 };
|