page-agent-sdk 3.11.1 → 3.12.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 +2 -2
- package/README.zh-CN.md +2 -2
- package/dist/page-agent-sdk.headless.js +768 -713
- package/dist/page-agent-sdk.iife.js +109 -109
- package/dist/page-agent-sdk.js +1624 -1507
- package/dist/page-agent-sdk.umd.cjs +75 -75
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/types/headless.d.ts +2 -0
- package/types/index.d.ts +2 -0
|
@@ -2976,14 +2976,17 @@ function Ki(e) {
|
|
|
2976
2976
|
function qi(e, t) {
|
|
2977
2977
|
if (!t) return e;
|
|
2978
2978
|
let n = Ki(e), r = t.split(".");
|
|
2979
|
-
for (let e
|
|
2979
|
+
for (let e = 0; e < r.length; e++) {
|
|
2980
|
+
let t = r[e];
|
|
2980
2981
|
if (!n) return null;
|
|
2981
|
-
if (n = Ki(n), n && n.shape && typeof n.shape == "object") n = (typeof n.shape == "function" ? n.shape() : n.shape)[
|
|
2982
|
+
if (n = Ki(n), n && n.shape && typeof n.shape == "object") n = (typeof n.shape == "function" ? n.shape() : n.shape)[t];
|
|
2982
2983
|
else if (n && (n._def?.type === "array" || n.constructor?.name === "ZodArray")) {
|
|
2983
|
-
if (!/^\d+$/.test(
|
|
2984
|
+
if (!/^\d+$/.test(t)) return null;
|
|
2984
2985
|
n = n.element;
|
|
2985
|
-
} else if (n && (n._def?.type === "union" || n._def?.type === "discriminatedUnion" || Array.isArray(n.options)))
|
|
2986
|
-
|
|
2986
|
+
} else if (n && (n._def?.type === "union" || n._def?.type === "discriminatedUnion" || Array.isArray(n.options))) {
|
|
2987
|
+
let t = r.slice(e).join("."), i = (n.options ?? []).map((e) => qi(e, t)).filter((e) => e != null);
|
|
2988
|
+
return i.length ? i[0] : null;
|
|
2989
|
+
} else return null;
|
|
2987
2990
|
}
|
|
2988
2991
|
return n ?? null;
|
|
2989
2992
|
}
|
|
@@ -3034,6 +3037,13 @@ function $i(e, t) {
|
|
|
3034
3037
|
let t = n.element ?? n._def?.type;
|
|
3035
3038
|
return e.map((e) => $i(e, t));
|
|
3036
3039
|
}
|
|
3040
|
+
if (!Array.isArray(e)) {
|
|
3041
|
+
let t = e, n = Object.keys(t);
|
|
3042
|
+
if (!n.some((e) => e.startsWith("__pg"))) return e;
|
|
3043
|
+
let r = {};
|
|
3044
|
+
for (let e of n) e.startsWith("__pg") || (r[e] = t[e]);
|
|
3045
|
+
return r;
|
|
3046
|
+
}
|
|
3037
3047
|
return e;
|
|
3038
3048
|
}
|
|
3039
3049
|
let r = typeof n.shape == "function" ? n.shape() : n.shape, i = {};
|
|
@@ -3570,7 +3580,7 @@ function $(e) {
|
|
|
3570
3580
|
}
|
|
3571
3581
|
function za(e, t, n, r) {
|
|
3572
3582
|
if (t === "set") return n ? (Ma(e, n, r), null) : "set 操作需要 jsonPath(整体替换请用 set_data)";
|
|
3573
|
-
if (t === "remove") return n ?
|
|
3583
|
+
if (t === "remove") return n ? Na(e, n) ? null : `remove 路径不存在: ${n}(数组索引越界或字段缺失;请先 read 最新结构确认索引)` : "remove 操作需要 jsonPath";
|
|
3574
3584
|
if (t === "merge") {
|
|
3575
3585
|
let t = n ? Z(e, n) : e;
|
|
3576
3586
|
return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (ja(t, r), null);
|
|
@@ -3632,7 +3642,23 @@ function Wa(e, t) {
|
|
|
3632
3642
|
for (let t of Object.keys(e)) t in n || delete e[t];
|
|
3633
3643
|
for (let t of Object.keys(n)) e[t] = n[t];
|
|
3634
3644
|
}
|
|
3635
|
-
function Ga(e, t, n = "") {
|
|
3645
|
+
function Ga(e, t, n, r = "") {
|
|
3646
|
+
let i = [], a = (e) => typeof e == "object" && !!e;
|
|
3647
|
+
if (!a(t)) return i;
|
|
3648
|
+
if (Array.isArray(t)) {
|
|
3649
|
+
let a = Array.isArray(e) ? e : [], o = Array.isArray(n) ? n : [], s = new Set(a.map((e) => JSON.stringify(e)));
|
|
3650
|
+
return t.forEach((e, t) => {
|
|
3651
|
+
s.has(JSON.stringify(e)) || i.push(...Ga(a[t], e, o[t], r ? `${r}.${t}` : String(t)));
|
|
3652
|
+
}), i;
|
|
3653
|
+
}
|
|
3654
|
+
let o = t, s = a(n) && !Array.isArray(n) ? n : null, c = a(e) && !Array.isArray(e) ? e : null;
|
|
3655
|
+
for (let e of Object.keys(o)) {
|
|
3656
|
+
let t = r ? `${r}.${e}` : e;
|
|
3657
|
+
e.startsWith("__pg") || (s && !(e in s) ? (!c || !(e in c)) && i.push(t) : s && e in s && i.push(...Ga(c?.[e], o[e], s[e], t)));
|
|
3658
|
+
}
|
|
3659
|
+
return i;
|
|
3660
|
+
}
|
|
3661
|
+
function Ka(e, t, n = "") {
|
|
3636
3662
|
let r = [];
|
|
3637
3663
|
if (!(typeof e == "object" && e) || !(typeof t == "object" && t) || Array.isArray(e) !== Array.isArray(t)) return e !== t && r.push({
|
|
3638
3664
|
path: n || "(root)",
|
|
@@ -3651,14 +3677,14 @@ function Ga(e, t, n = "") {
|
|
|
3651
3677
|
path: i,
|
|
3652
3678
|
from: e[a],
|
|
3653
3679
|
to: void 0
|
|
3654
|
-
}) : r.push(...
|
|
3680
|
+
}) : r.push(...Ka(e[a], t[a], i));
|
|
3655
3681
|
}
|
|
3656
3682
|
return r;
|
|
3657
3683
|
}
|
|
3658
3684
|
let i = e, a = t, o = /* @__PURE__ */ new Set([...Object.keys(i), ...Object.keys(a)]);
|
|
3659
3685
|
for (let e of o) {
|
|
3660
3686
|
let t = n ? `${n}.${e}` : e;
|
|
3661
|
-
e in i ? e in a ? r.push(...
|
|
3687
|
+
e in i ? e in a ? r.push(...Ka(i[e], a[e], t)) : r.push({
|
|
3662
3688
|
path: t,
|
|
3663
3689
|
from: i[e],
|
|
3664
3690
|
to: void 0
|
|
@@ -3672,22 +3698,22 @@ function Ga(e, t, n = "") {
|
|
|
3672
3698
|
}
|
|
3673
3699
|
//#endregion
|
|
3674
3700
|
//#region src/core/harness/focus.ts
|
|
3675
|
-
var
|
|
3701
|
+
var qa = /* @__PURE__ */ new Set([
|
|
3676
3702
|
"set_data",
|
|
3677
3703
|
"edit_data",
|
|
3678
3704
|
"delete_data",
|
|
3679
3705
|
"write",
|
|
3680
3706
|
"draft_commit"
|
|
3681
3707
|
]);
|
|
3682
|
-
function
|
|
3708
|
+
function Ja(e) {
|
|
3683
3709
|
let t = e ?? {}, n = /* @__PURE__ */ new Set();
|
|
3684
3710
|
if (typeof t.jsonPath == "string" && t.jsonPath && n.add(t.jsonPath), typeof t.path == "string" && t.path && n.add(t.path), t.patch && typeof t.patch.jsonPath == "string" && t.patch.jsonPath && n.add(t.patch.jsonPath), Array.isArray(t.patches)) for (let e of t.patches) e && typeof e.jsonPath == "string" && e.jsonPath && n.add(e.jsonPath);
|
|
3685
3711
|
return [...n];
|
|
3686
3712
|
}
|
|
3687
|
-
function
|
|
3713
|
+
function Ya(e, t) {
|
|
3688
3714
|
return e === t || e.startsWith(t + ".");
|
|
3689
3715
|
}
|
|
3690
|
-
function
|
|
3716
|
+
function Xa(e, t) {
|
|
3691
3717
|
if (!t || typeof t != "object") return !1;
|
|
3692
3718
|
let n = e.lastIndexOf(".");
|
|
3693
3719
|
if (n < 0) return !1;
|
|
@@ -3696,7 +3722,7 @@ function Ya(e, t) {
|
|
|
3696
3722
|
let a = Z(t, r);
|
|
3697
3723
|
return Array.isArray(a) && Number(i) >= a.length;
|
|
3698
3724
|
}
|
|
3699
|
-
function
|
|
3725
|
+
function Za(e) {
|
|
3700
3726
|
let t = e.initialFocuses ? [...e.initialFocuses] : [], n = () => e.onChange?.([...t]), r = e.unfocusGuidance ?? "tool", i = r === "tool" ? "需改其他组件请先 remove_focus / clear_focus 或换焦点。" : r === "ask-user" ? "焦点由用户在输入框设定与移除(聚焦 chip ✕);用户要求改其他组件时,提示用户移除聚焦后重试,勿尝试写焦点外(会被拒)。" : "需改其他组件时,在收口回复中说明需先取消焦点(焦点由主会话管理),勿尝试越界写。", a = r === "tool" ? "请先 remove_focus / clear_focus 或换焦点后重试。" : r === "ask-user" ? "焦点由用户在输入框管理,请提示用户移除输入框中的聚焦 chip 后重试(当前模式无 focus 工具)。" : "请只改焦点子树;需改其他组件时,在收口回复中说明需先取消焦点。";
|
|
3701
3727
|
return {
|
|
3702
3728
|
name: "focus",
|
|
@@ -3728,15 +3754,15 @@ function Xa(e) {
|
|
|
3728
3754
|
});
|
|
3729
3755
|
if (n.name === "eval_script") {
|
|
3730
3756
|
if (n.args?.mode !== "transform") return r(n);
|
|
3731
|
-
let i =
|
|
3757
|
+
let i = Ja(n.args);
|
|
3732
3758
|
if (!i.length) return o("(整体数据)");
|
|
3733
|
-
for (let n of i) if (!t.some((e) =>
|
|
3759
|
+
for (let n of i) if (!t.some((e) => Ya(n, e.path)) && !Xa(n, e.getBind?.())) return o(n);
|
|
3734
3760
|
return r(n);
|
|
3735
3761
|
}
|
|
3736
|
-
if (
|
|
3737
|
-
let r =
|
|
3762
|
+
if (qa.has(n.name)) {
|
|
3763
|
+
let r = Ja(n.args);
|
|
3738
3764
|
if (!r.length) return o("(整体数据)");
|
|
3739
|
-
for (let n of r) if (!t.some((e) =>
|
|
3765
|
+
for (let n of r) if (!t.some((e) => Ya(n, e.path)) && !Xa(n, e.getBind?.())) return o(n);
|
|
3740
3766
|
}
|
|
3741
3767
|
}
|
|
3742
3768
|
return r(n);
|
|
@@ -3763,12 +3789,12 @@ function Xa(e) {
|
|
|
3763
3789
|
}
|
|
3764
3790
|
//#endregion
|
|
3765
3791
|
//#region src/core/harness/workingMemory.ts
|
|
3766
|
-
var
|
|
3792
|
+
var Qa = 10, $a = /* @__PURE__ */ new Set([
|
|
3767
3793
|
"read",
|
|
3768
3794
|
"query_data",
|
|
3769
3795
|
"search_data"
|
|
3770
3796
|
]);
|
|
3771
|
-
function
|
|
3797
|
+
function eo() {
|
|
3772
3798
|
let e = [], t = {}, n = () => e.length === 0 && Object.keys(t).length === 0, r = () => ({
|
|
3773
3799
|
locatedPaths: [...e],
|
|
3774
3800
|
lastHashes: { ...t }
|
|
@@ -3776,13 +3802,13 @@ function $a() {
|
|
|
3776
3802
|
function i(t) {
|
|
3777
3803
|
if (!t) return;
|
|
3778
3804
|
let n = e.indexOf(t);
|
|
3779
|
-
for (n >= 0 && e.splice(n, 1), e.unshift(t); e.length >
|
|
3805
|
+
for (n >= 0 && e.splice(n, 1), e.unshift(t); e.length > Qa;) e.pop();
|
|
3780
3806
|
}
|
|
3781
3807
|
function a(e, n) {
|
|
3782
3808
|
if (t[e] === n) return;
|
|
3783
3809
|
delete t[e], t[e] = n;
|
|
3784
3810
|
let r = Object.keys(t);
|
|
3785
|
-
for (; r.length >
|
|
3811
|
+
for (; r.length > Qa;) {
|
|
3786
3812
|
let e = r.shift();
|
|
3787
3813
|
delete t[e];
|
|
3788
3814
|
}
|
|
@@ -3793,7 +3819,7 @@ function $a() {
|
|
|
3793
3819
|
beforeModel: () => n() ? void 0 : { workingMemory: r() },
|
|
3794
3820
|
wrapToolCall: async (e, t) => {
|
|
3795
3821
|
let n = await t(e);
|
|
3796
|
-
if (n.status === "done" &&
|
|
3822
|
+
if (n.status === "done" && $a.has(e.name)) {
|
|
3797
3823
|
let t = typeof n.content == "string" ? n.content : "";
|
|
3798
3824
|
if (e.name === "read") {
|
|
3799
3825
|
let n = e.args?.jsonPath || "(root)";
|
|
@@ -3821,7 +3847,7 @@ function $a() {
|
|
|
3821
3847
|
for (let e of Object.keys(t)) delete t[e];
|
|
3822
3848
|
},
|
|
3823
3849
|
restore: (n) => {
|
|
3824
|
-
e.length = 0, Array.isArray(n?.locatedPaths) && e.push(...n.locatedPaths.slice(0,
|
|
3850
|
+
e.length = 0, Array.isArray(n?.locatedPaths) && e.push(...n.locatedPaths.slice(0, Qa));
|
|
3825
3851
|
for (let e of Object.keys(t)) delete t[e];
|
|
3826
3852
|
n?.lastHashes && typeof n.lastHashes == "object" && Object.assign(t, n.lastHashes);
|
|
3827
3853
|
}
|
|
@@ -3829,7 +3855,7 @@ function $a() {
|
|
|
3829
3855
|
}
|
|
3830
3856
|
//#endregion
|
|
3831
3857
|
//#region src/core/tools/sandbox.ts
|
|
3832
|
-
function
|
|
3858
|
+
function to(e) {
|
|
3833
3859
|
let t = (t, n) => {
|
|
3834
3860
|
try {
|
|
3835
3861
|
Object.defineProperty(e, t, {
|
|
@@ -3857,7 +3883,7 @@ function eo(e) {
|
|
|
3857
3883
|
});
|
|
3858
3884
|
} catch {}
|
|
3859
3885
|
}
|
|
3860
|
-
var
|
|
3886
|
+
var no = `(${to.toString()})(self);`, ro = [
|
|
3861
3887
|
{
|
|
3862
3888
|
re: /\bimport\s*\(/,
|
|
3863
3889
|
msg: "动态 import() 拉外网模块"
|
|
@@ -3883,9 +3909,9 @@ var to = `(${eo.toString()})(self);`, no = [
|
|
|
3883
3909
|
msg: "require() 拉模块"
|
|
3884
3910
|
}
|
|
3885
3911
|
];
|
|
3886
|
-
function
|
|
3912
|
+
function io(e, t = 3e3) {
|
|
3887
3913
|
return async (n) => {
|
|
3888
|
-
for (let { re: t, msg: n } of
|
|
3914
|
+
for (let { re: t, msg: n } of ro) if (t.test(e)) return {
|
|
3889
3915
|
ok: !1,
|
|
3890
3916
|
error: `沙箱拒绝执行:脚本含禁用模式(${n})`,
|
|
3891
3917
|
elapsedMs: 0
|
|
@@ -3902,7 +3928,7 @@ function ro(e, t = 3e3) {
|
|
|
3902
3928
|
elapsedMs: Date.now() - i
|
|
3903
3929
|
});
|
|
3904
3930
|
}
|
|
3905
|
-
}, s =
|
|
3931
|
+
}, s = no + "\nself.onmessage = async (e) => {\n try {\n const fn = new Function(\"data\", e.data.script);\n try { self.eval = undefined; self.Function = undefined; } catch {}\n let result = fn(e.data.data);\n if (result && typeof result.then === \"function\") result = await result;\n self.postMessage({ ok: true, result });\n } catch (err) {\n self.postMessage({ ok: false, error: String((err && err.message) || err) });\n }\n};", c = "", l;
|
|
3906
3932
|
try {
|
|
3907
3933
|
let e = new Blob([s], { type: "application/javascript" });
|
|
3908
3934
|
c = URL.createObjectURL(e), l = new Worker(c);
|
|
@@ -3938,7 +3964,7 @@ function ro(e, t = 3e3) {
|
|
|
3938
3964
|
}
|
|
3939
3965
|
//#endregion
|
|
3940
3966
|
//#region src/core/tools/hostScript.ts
|
|
3941
|
-
async function
|
|
3967
|
+
async function ao(e, t = 3e3) {
|
|
3942
3968
|
let n = Date.now(), r;
|
|
3943
3969
|
try {
|
|
3944
3970
|
let i = Object.getPrototypeOf(async function() {}).constructor, a = new i(e), o = Promise.resolve(a());
|
|
@@ -3961,28 +3987,28 @@ async function io(e, t = 3e3) {
|
|
|
3961
3987
|
}
|
|
3962
3988
|
//#endregion
|
|
3963
3989
|
//#region src/core/harness/skills.ts
|
|
3964
|
-
function
|
|
3990
|
+
function oo(e) {
|
|
3965
3991
|
return e;
|
|
3966
3992
|
}
|
|
3967
|
-
var
|
|
3968
|
-
function so(e) {
|
|
3969
|
-
return oo.test(e) || e.startsWith("//") ? "http" : "vfs";
|
|
3970
|
-
}
|
|
3993
|
+
var so = /^https?:\/\//i;
|
|
3971
3994
|
function co(e) {
|
|
3995
|
+
return so.test(e) || e.startsWith("//") ? "http" : "vfs";
|
|
3996
|
+
}
|
|
3997
|
+
function lo(e) {
|
|
3972
3998
|
return e.replace(/^vfs:\/\//, "").replace(/^\/+/, "").replace(/\/+/g, "/");
|
|
3973
3999
|
}
|
|
3974
|
-
var
|
|
3975
|
-
async function
|
|
3976
|
-
let t = new AbortController(), n = setTimeout(() => t.abort(),
|
|
4000
|
+
var uo = 3e4;
|
|
4001
|
+
async function fo(e) {
|
|
4002
|
+
let t = new AbortController(), n = setTimeout(() => t.abort(), uo);
|
|
3977
4003
|
try {
|
|
3978
4004
|
return await fetch(e, { signal: t.signal });
|
|
3979
4005
|
} finally {
|
|
3980
4006
|
clearTimeout(n);
|
|
3981
4007
|
}
|
|
3982
4008
|
}
|
|
3983
|
-
async function
|
|
3984
|
-
if (
|
|
3985
|
-
let t = await
|
|
4009
|
+
async function po(e, t) {
|
|
4010
|
+
if (co(e) === "http") try {
|
|
4011
|
+
let t = await fo(e);
|
|
3986
4012
|
return t.ok ? {
|
|
3987
4013
|
ok: !0,
|
|
3988
4014
|
content: await t.text()
|
|
@@ -3993,7 +4019,7 @@ async function fo(e, t) {
|
|
|
3993
4019
|
} catch (t) {
|
|
3994
4020
|
if (t?.name === "AbortError") return {
|
|
3995
4021
|
ok: !1,
|
|
3996
|
-
error: `读取超时(${
|
|
4022
|
+
error: `读取超时(${uo / 1e3}s):${e}`
|
|
3997
4023
|
};
|
|
3998
4024
|
let n = t?.message || String(t);
|
|
3999
4025
|
return /Failed to fetch|NetworkError|CORS|blocked/i.test(n) ? {
|
|
@@ -4008,7 +4034,7 @@ async function fo(e, t) {
|
|
|
4008
4034
|
ok: !1,
|
|
4009
4035
|
error: `skill 文档 ${e} 是 vfs 路径,但 vfs 未启用`
|
|
4010
4036
|
};
|
|
4011
|
-
let n = t(
|
|
4037
|
+
let n = t(lo(e));
|
|
4012
4038
|
return n == null ? {
|
|
4013
4039
|
ok: !1,
|
|
4014
4040
|
error: `未找到 vfs 文档 ${e}(可用 vfs_ls 查看)`
|
|
@@ -4017,14 +4043,14 @@ async function fo(e, t) {
|
|
|
4017
4043
|
content: n
|
|
4018
4044
|
};
|
|
4019
4045
|
}
|
|
4020
|
-
function
|
|
4046
|
+
function mo(e) {
|
|
4021
4047
|
if (e.length) return [
|
|
4022
4048
|
"## 可用 Skills(渐进式披露)",
|
|
4023
4049
|
e.map((e) => `- ${e.name}: ${e.description}`).join("\n"),
|
|
4024
4050
|
"当某 skill 适用时,先调用 load_skill(name) 加载其完整指令,再按指令执行。不要凭记忆猜测 skill 内容。"
|
|
4025
4051
|
].join("\n");
|
|
4026
4052
|
}
|
|
4027
|
-
function
|
|
4053
|
+
function ho(e) {
|
|
4028
4054
|
if (typeof e == "string") return e;
|
|
4029
4055
|
if (e == null) return "";
|
|
4030
4056
|
try {
|
|
@@ -4033,15 +4059,15 @@ function mo(e) {
|
|
|
4033
4059
|
return String(e);
|
|
4034
4060
|
}
|
|
4035
4061
|
}
|
|
4036
|
-
async function
|
|
4062
|
+
async function go(e) {
|
|
4037
4063
|
try {
|
|
4038
|
-
let t = await
|
|
4064
|
+
let t = await fo(e);
|
|
4039
4065
|
return t.ok ? await t.text() : null;
|
|
4040
4066
|
} catch {
|
|
4041
4067
|
return null;
|
|
4042
4068
|
}
|
|
4043
4069
|
}
|
|
4044
|
-
async function
|
|
4070
|
+
async function _o(e, t) {
|
|
4045
4071
|
let n = e.context ?? "sandbox", r = !!e.code, i = !!e.url;
|
|
4046
4072
|
if (!r && !i) return {
|
|
4047
4073
|
ok: !1,
|
|
@@ -4060,10 +4086,10 @@ async function go(e, t) {
|
|
|
4060
4086
|
ok: !1,
|
|
4061
4087
|
error: "skill 含宿主权限脚本(context:\"host\"),需 capabilities.skillHostScript:true 开启"
|
|
4062
4088
|
};
|
|
4063
|
-
let n = await
|
|
4089
|
+
let n = await ao(e.code);
|
|
4064
4090
|
return n.ok ? {
|
|
4065
4091
|
ok: !0,
|
|
4066
|
-
text:
|
|
4092
|
+
text: ho(n.result)
|
|
4067
4093
|
} : {
|
|
4068
4094
|
ok: !1,
|
|
4069
4095
|
error: n.error || "宿主脚本执行失败"
|
|
@@ -4071,31 +4097,31 @@ async function go(e, t) {
|
|
|
4071
4097
|
}
|
|
4072
4098
|
let a;
|
|
4073
4099
|
if (i) {
|
|
4074
|
-
let t = await
|
|
4100
|
+
let t = await go(e.url);
|
|
4075
4101
|
if (t == null) return {
|
|
4076
4102
|
ok: !1,
|
|
4077
4103
|
error: `远程脚本拉取失败(${e.url};CORS/网络错误)`
|
|
4078
4104
|
};
|
|
4079
4105
|
a = t;
|
|
4080
4106
|
} else a = e.code;
|
|
4081
|
-
let o = await
|
|
4107
|
+
let o = await io(a)(void 0);
|
|
4082
4108
|
return o.ok ? {
|
|
4083
4109
|
ok: !0,
|
|
4084
|
-
text:
|
|
4110
|
+
text: ho(o.result)
|
|
4085
4111
|
} : {
|
|
4086
4112
|
ok: !1,
|
|
4087
4113
|
error: o.error || "沙箱脚本执行失败"
|
|
4088
4114
|
};
|
|
4089
4115
|
}
|
|
4090
|
-
async function
|
|
4116
|
+
async function vo(e, t) {
|
|
4091
4117
|
let n = null;
|
|
4092
4118
|
if (e.doc) {
|
|
4093
|
-
let r = await
|
|
4119
|
+
let r = await po(e.doc, t?.readVfs);
|
|
4094
4120
|
r.ok && (n = r.content);
|
|
4095
4121
|
} else e.getContent && (n = await e.getContent());
|
|
4096
4122
|
let r = n ?? "", i = !0;
|
|
4097
4123
|
if (e.exec) {
|
|
4098
|
-
let n = await
|
|
4124
|
+
let n = await _o(e.exec, t?.hostScriptEnabled);
|
|
4099
4125
|
n.ok && n.text ? r = e.exec.inject === "prepend" ? n.text + "\n\n" + r : (r ? r + "\n\n" : "") + n.text : (n.ok || (r = (r ? r + "\n\n" : "") + `(skill 脚本执行失败:${n.error})`), i = !1);
|
|
4100
4126
|
}
|
|
4101
4127
|
return {
|
|
@@ -4103,7 +4129,7 @@ async function _o(e, t) {
|
|
|
4103
4129
|
cacheable: i
|
|
4104
4130
|
};
|
|
4105
4131
|
}
|
|
4106
|
-
async function
|
|
4132
|
+
async function yo(e) {
|
|
4107
4133
|
if (!e.tools?.length) return [];
|
|
4108
4134
|
let t = [];
|
|
4109
4135
|
for (let n of e.tools) try {
|
|
@@ -4114,7 +4140,7 @@ async function vo(e) {
|
|
|
4114
4140
|
}
|
|
4115
4141
|
return t;
|
|
4116
4142
|
}
|
|
4117
|
-
function
|
|
4143
|
+
function bo(e, n) {
|
|
4118
4144
|
let i = [...e], a = new Map(i.map((e) => [e.name, e])), o = /* @__PURE__ */ new Set(), s = /* @__PURE__ */ new Map(), c = {
|
|
4119
4145
|
set(e) {
|
|
4120
4146
|
i = [...e], a = new Map(i.map((e) => [e.name, e])), s.clear(), o.clear();
|
|
@@ -4130,7 +4156,7 @@ function yo(e, n) {
|
|
|
4130
4156
|
if (!t) return null;
|
|
4131
4157
|
let r = s.get(e);
|
|
4132
4158
|
if (r != null) return r;
|
|
4133
|
-
let i = await
|
|
4159
|
+
let i = await vo(t, n);
|
|
4134
4160
|
return r = i.content, i.cacheable && s.set(e, r), r;
|
|
4135
4161
|
}
|
|
4136
4162
|
}, l = {
|
|
@@ -4141,12 +4167,12 @@ function yo(e, n) {
|
|
|
4141
4167
|
if (o.has(e)) return `skill "${e}" 已在本轮加载,无需重复。`;
|
|
4142
4168
|
let r = s.get(e);
|
|
4143
4169
|
if (r == null) {
|
|
4144
|
-
let i = await
|
|
4170
|
+
let i = await vo(t, n);
|
|
4145
4171
|
if (r = i.content, !r) return `skill "${e}" 未配置内容(doc / getContent / exec 任选其一)。`;
|
|
4146
4172
|
i.cacheable && s.set(e, r);
|
|
4147
4173
|
}
|
|
4148
4174
|
if (o.add(e), t.tools?.length && n?.onToolsReady && a.get(e) === t) try {
|
|
4149
|
-
let e = await
|
|
4175
|
+
let e = await yo(t);
|
|
4150
4176
|
e.length && n.onToolsReady(t.name, e);
|
|
4151
4177
|
} catch (t) {
|
|
4152
4178
|
console.warn(`skill "${e}" 工具加载失败:`, t);
|
|
@@ -4164,7 +4190,7 @@ function yo(e, n) {
|
|
|
4164
4190
|
})),
|
|
4165
4191
|
skillsLoaded: []
|
|
4166
4192
|
}),
|
|
4167
|
-
augmentPrompt: () =>
|
|
4193
|
+
augmentPrompt: () => mo(i),
|
|
4168
4194
|
afterModel: () => ({ skillsLoaded: [...o] })
|
|
4169
4195
|
};
|
|
4170
4196
|
return Object.defineProperty(l, "controller", {
|
|
@@ -4176,7 +4202,7 @@ function yo(e, n) {
|
|
|
4176
4202
|
}
|
|
4177
4203
|
//#endregion
|
|
4178
4204
|
//#region src/core/harness/memory.ts
|
|
4179
|
-
function
|
|
4205
|
+
function xo(e = "") {
|
|
4180
4206
|
let t = e, n = typeof e == "string" ? e : void 0;
|
|
4181
4207
|
async function r() {
|
|
4182
4208
|
if (typeof t == "string") return n = t, t;
|
|
@@ -4200,7 +4226,7 @@ function bo(e = "") {
|
|
|
4200
4226
|
}
|
|
4201
4227
|
//#endregion
|
|
4202
4228
|
//#region src/core/harness/permissions.ts
|
|
4203
|
-
var
|
|
4229
|
+
var So = /* @__PURE__ */ new Set([
|
|
4204
4230
|
"set_data",
|
|
4205
4231
|
"edit_data",
|
|
4206
4232
|
"delete_data",
|
|
@@ -4209,7 +4235,7 @@ var xo = /* @__PURE__ */ new Set([
|
|
|
4209
4235
|
"vfs_edit",
|
|
4210
4236
|
"draft_commit",
|
|
4211
4237
|
"eval_script"
|
|
4212
|
-
]),
|
|
4238
|
+
]), Co = /* @__PURE__ */ new Set([
|
|
4213
4239
|
"get_data",
|
|
4214
4240
|
"describe_data",
|
|
4215
4241
|
"read",
|
|
@@ -4220,7 +4246,7 @@ var xo = /* @__PURE__ */ new Set([
|
|
|
4220
4246
|
"vfs_glob",
|
|
4221
4247
|
"vfs_grep"
|
|
4222
4248
|
]);
|
|
4223
|
-
function
|
|
4249
|
+
function wo(e) {
|
|
4224
4250
|
let t = "";
|
|
4225
4251
|
for (let n = 0; n < e.length; n++) {
|
|
4226
4252
|
let r = e[n];
|
|
@@ -4228,24 +4254,24 @@ function Co(e) {
|
|
|
4228
4254
|
}
|
|
4229
4255
|
return RegExp("^" + t + "$");
|
|
4230
4256
|
}
|
|
4231
|
-
function
|
|
4232
|
-
for (let r of e) if (r.operations.includes(t) && r.scopes.some((e) =>
|
|
4257
|
+
function To(e, t, n) {
|
|
4258
|
+
for (let r of e) if (r.operations.includes(t) && r.scopes.some((e) => wo(e).test(n))) return r.mode;
|
|
4233
4259
|
return "allow";
|
|
4234
4260
|
}
|
|
4235
|
-
function
|
|
4261
|
+
function Eo(e) {
|
|
4236
4262
|
let t = e ?? {}, n = /* @__PURE__ */ new Set();
|
|
4237
4263
|
if (typeof t.jsonPath == "string" && t.jsonPath && n.add(t.jsonPath), typeof t.path == "string" && t.path && n.add(t.path), t.patch && typeof t.patch.jsonPath == "string" && t.patch.jsonPath && n.add(t.patch.jsonPath), Array.isArray(t.patches)) for (let e of t.patches) e && typeof e.jsonPath == "string" && e.jsonPath && n.add(e.jsonPath);
|
|
4238
4264
|
return [...n];
|
|
4239
4265
|
}
|
|
4240
|
-
function
|
|
4266
|
+
function Do(e) {
|
|
4241
4267
|
return {
|
|
4242
4268
|
name: "permissions",
|
|
4243
4269
|
wrapToolCall: async (t, n) => {
|
|
4244
|
-
let r =
|
|
4270
|
+
let r = So.has(t.name) ? "write" : Co.has(t.name) ? "read" : null;
|
|
4245
4271
|
t.name === "eval_script" && t.args?.mode !== "transform" && (r = null);
|
|
4246
|
-
let i =
|
|
4272
|
+
let i = Eo(t.args);
|
|
4247
4273
|
if (r === "write" && !i.length && (i = [""]), r && i.length) {
|
|
4248
|
-
for (let t of i) if (
|
|
4274
|
+
for (let t of i) if (To(e, r, t) === "deny") return {
|
|
4249
4275
|
content: `权限拒绝:${r} 操作 "${t}" 被 permissions 规则禁止。`,
|
|
4250
4276
|
status: "error"
|
|
4251
4277
|
};
|
|
@@ -4256,7 +4282,7 @@ function Eo(e) {
|
|
|
4256
4282
|
}
|
|
4257
4283
|
//#endregion
|
|
4258
4284
|
//#region src/core/harness/approval.ts
|
|
4259
|
-
function
|
|
4285
|
+
function Oo(e = {}) {
|
|
4260
4286
|
let t = (t, n) => e.confirm ? !!e.confirm(t, n) : e.tools === void 0 || e.tools.includes(t);
|
|
4261
4287
|
return {
|
|
4262
4288
|
name: "approval",
|
|
@@ -4293,15 +4319,15 @@ function Do(e = {}) {
|
|
|
4293
4319
|
}
|
|
4294
4320
|
//#endregion
|
|
4295
4321
|
//#region src/core/harness/humanConfirm.ts
|
|
4296
|
-
var
|
|
4322
|
+
var ko = "request_human_confirmation", Ao = t.object({
|
|
4297
4323
|
question: t.string().describe("要征询用户的问题/方案描述。清晰具体:说明当前情况、为什么需要确认、确认什么。"),
|
|
4298
4324
|
options: t.array(t.string()).optional().describe("可选方案列表(2-4 个)。用户从中选一个。不传则用户只回答允许/拒绝。"),
|
|
4299
4325
|
recommendation: t.string().optional().describe("你推荐的方案(优先在 options 中选一个)及推荐理由,帮用户快速决策。"),
|
|
4300
4326
|
context: t.string().optional().describe("补充上下文:已做了什么、约束、影响范围等,帮用户判断。")
|
|
4301
4327
|
});
|
|
4302
|
-
function
|
|
4328
|
+
function jo() {
|
|
4303
4329
|
return r(async () => "人工确认中间件未装载,无法征询用户。请直接向用户说明情况并等待回复。", {
|
|
4304
|
-
name:
|
|
4330
|
+
name: ko,
|
|
4305
4331
|
description: [
|
|
4306
4332
|
"当遇到以下情况时,主动调用本工具征询用户确认后再继续(不要默默猜测后直接执行高风险动作):",
|
|
4307
4333
|
"1) 不确定用户意图、需求有歧义;",
|
|
@@ -4311,10 +4337,10 @@ function Ao() {
|
|
|
4311
4337
|
"入参:question=问题/方案描述;options=可选方案列表(多方案时给);recommendation=你推荐的方案及理由。",
|
|
4312
4338
|
"用户选择后,据其回答继续;若用户拒绝,停止当前操作并询问如何调整。"
|
|
4313
4339
|
].join(""),
|
|
4314
|
-
schema:
|
|
4340
|
+
schema: Ao
|
|
4315
4341
|
});
|
|
4316
4342
|
}
|
|
4317
|
-
function
|
|
4343
|
+
function Mo() {
|
|
4318
4344
|
return {
|
|
4319
4345
|
name: "humanConfirm",
|
|
4320
4346
|
wrapToolCall: async (e, t) => e.name === "request_human_confirmation" ? new Promise((t) => {
|
|
@@ -4346,14 +4372,14 @@ function jo() {
|
|
|
4346
4372
|
}
|
|
4347
4373
|
//#endregion
|
|
4348
4374
|
//#region src/core/harness/checkpoint.ts
|
|
4349
|
-
function
|
|
4375
|
+
function No(e) {
|
|
4350
4376
|
if (typeof e != "object" || !e) return e;
|
|
4351
4377
|
if (typeof structuredClone == "function") try {
|
|
4352
4378
|
return structuredClone(e);
|
|
4353
4379
|
} catch {}
|
|
4354
4380
|
return JSON.parse(JSON.stringify(e));
|
|
4355
4381
|
}
|
|
4356
|
-
function
|
|
4382
|
+
function Po(e, t) {
|
|
4357
4383
|
let n = t.split("."), r = e;
|
|
4358
4384
|
for (let e of n) {
|
|
4359
4385
|
if (r == null) return;
|
|
@@ -4361,12 +4387,12 @@ function No(e, t) {
|
|
|
4361
4387
|
}
|
|
4362
4388
|
return r;
|
|
4363
4389
|
}
|
|
4364
|
-
function
|
|
4390
|
+
function Fo(e, t, n) {
|
|
4365
4391
|
let r = t.split("."), i = e;
|
|
4366
4392
|
for (let e = 0; e < r.length - 1; e++) i[r[e]] ?? (i[r[e]] = {}), i = i[r[e]];
|
|
4367
4393
|
i[r[r.length - 1]] = n;
|
|
4368
4394
|
}
|
|
4369
|
-
function
|
|
4395
|
+
function Io(e, t) {
|
|
4370
4396
|
if (Array.isArray(e)) {
|
|
4371
4397
|
e.length = 0, Array.isArray(t) && e.push(...t);
|
|
4372
4398
|
return;
|
|
@@ -4375,11 +4401,11 @@ function Fo(e, t) {
|
|
|
4375
4401
|
for (let t of Object.keys(e)) t in n || delete e[t];
|
|
4376
4402
|
for (let t of Object.keys(n)) e[t] = n[t];
|
|
4377
4403
|
}
|
|
4378
|
-
function
|
|
4379
|
-
let n =
|
|
4380
|
-
typeof n == "object" && n ?
|
|
4404
|
+
function Lo(e, t) {
|
|
4405
|
+
let n = Po(window, e);
|
|
4406
|
+
typeof n == "object" && n ? Io(n, t) : Fo(window, e, t);
|
|
4381
4407
|
}
|
|
4382
|
-
function
|
|
4408
|
+
function Ro(e) {
|
|
4383
4409
|
let t = e.slice();
|
|
4384
4410
|
for (; t.length;) {
|
|
4385
4411
|
let e = t[t.length - 1];
|
|
@@ -4388,22 +4414,22 @@ function Lo(e) {
|
|
|
4388
4414
|
}
|
|
4389
4415
|
return t;
|
|
4390
4416
|
}
|
|
4391
|
-
function
|
|
4417
|
+
function zo(e) {
|
|
4392
4418
|
let t = [], n = e.maxCheckpoints ?? 5, r = 1, i, a;
|
|
4393
4419
|
return {
|
|
4394
4420
|
save(o) {
|
|
4395
|
-
let s =
|
|
4396
|
-
if (e.getData) ((e.consumeDataDirty?.() ?? !0) || a === void 0) && (a =
|
|
4397
|
-
else for (let t of e.slotPaths ?? []) c[t] =
|
|
4398
|
-
((e.vfsStore.consumeDirty?.() ?? !0) || i === void 0) && (i =
|
|
4421
|
+
let s = Ro(e.messages), c = {};
|
|
4422
|
+
if (e.getData) ((e.consumeDataDirty?.() ?? !0) || a === void 0) && (a = No(e.getData())), c[""] = a;
|
|
4423
|
+
else for (let t of e.slotPaths ?? []) c[t] = No(Po(window, t));
|
|
4424
|
+
((e.vfsStore.consumeDirty?.() ?? !0) || i === void 0) && (i = No(e.vfsStore.files));
|
|
4399
4425
|
let l = {
|
|
4400
4426
|
id: r++,
|
|
4401
4427
|
label: o,
|
|
4402
4428
|
timestamp: Date.now(),
|
|
4403
|
-
messages:
|
|
4429
|
+
messages: No(s),
|
|
4404
4430
|
windowVals: c,
|
|
4405
4431
|
vfs: i,
|
|
4406
|
-
todos:
|
|
4432
|
+
todos: No(e.getTodos()),
|
|
4407
4433
|
messageCount: s.length
|
|
4408
4434
|
};
|
|
4409
4435
|
for (t.push(l); t.length > n;) t.shift();
|
|
@@ -4423,19 +4449,19 @@ function Ro(e) {
|
|
|
4423
4449
|
restore(n) {
|
|
4424
4450
|
let r = n == null ? t[t.length - 1] : t.find((e) => e.id === n);
|
|
4425
4451
|
if (!r) return !1;
|
|
4426
|
-
if (e.messages.splice(0, e.messages.length, ...
|
|
4452
|
+
if (e.messages.splice(0, e.messages.length, ...No(r.messages)), e.getData) {
|
|
4427
4453
|
let t = r.windowVals[""];
|
|
4428
4454
|
if (t !== void 0) {
|
|
4429
4455
|
let n = e.getData();
|
|
4430
|
-
typeof n == "object" && n &&
|
|
4456
|
+
typeof n == "object" && n && Io(n, No(t));
|
|
4431
4457
|
}
|
|
4432
|
-
} else for (let [e, t] of Object.entries(r.windowVals))
|
|
4458
|
+
} else for (let [e, t] of Object.entries(r.windowVals)) Lo(e, No(t));
|
|
4433
4459
|
let o = e.vfsStore.files;
|
|
4434
4460
|
for (let e of Object.keys(o)) delete o[e];
|
|
4435
|
-
return Object.assign(o,
|
|
4461
|
+
return Object.assign(o, No(r.vfs)), e.todosMw.reset(No(r.todos)), a = void 0, i = void 0, !0;
|
|
4436
4462
|
},
|
|
4437
4463
|
exportStack() {
|
|
4438
|
-
return
|
|
4464
|
+
return No(t);
|
|
4439
4465
|
},
|
|
4440
4466
|
importStack(e) {
|
|
4441
4467
|
t.length = 0, i = void 0, a = void 0;
|
|
@@ -4445,7 +4471,7 @@ function Ro(e) {
|
|
|
4445
4471
|
}
|
|
4446
4472
|
};
|
|
4447
4473
|
}
|
|
4448
|
-
function
|
|
4474
|
+
function Bo(e) {
|
|
4449
4475
|
let t = !1;
|
|
4450
4476
|
return {
|
|
4451
4477
|
name: "checkpoint",
|
|
@@ -4459,7 +4485,7 @@ function zo(e) {
|
|
|
4459
4485
|
}
|
|
4460
4486
|
//#endregion
|
|
4461
4487
|
//#region src/core/utils/rounds.ts
|
|
4462
|
-
function
|
|
4488
|
+
function Vo(e) {
|
|
4463
4489
|
let t = [], n = null, r = 0;
|
|
4464
4490
|
for (let i = 0; i < e.length; i++) {
|
|
4465
4491
|
let a = e[i];
|
|
@@ -4473,43 +4499,43 @@ function Bo(e) {
|
|
|
4473
4499
|
}
|
|
4474
4500
|
return n && t.push(n), t;
|
|
4475
4501
|
}
|
|
4476
|
-
function
|
|
4502
|
+
function Ho(e, t) {
|
|
4477
4503
|
let n = (e || "").replace(/```[\s\S]*?```/g, "[代码]").replace(/`([^`]+)`/g, "$1").replace(/[#*_>\-]\s?/g, "").replace(/\[(代码)\]/g, "「代码」").replace(/\s+/g, " ").trim();
|
|
4478
4504
|
return n.length > t ? n.slice(0, t) + "…" : n;
|
|
4479
4505
|
}
|
|
4480
|
-
function
|
|
4506
|
+
function Uo(e) {
|
|
4481
4507
|
let t = [];
|
|
4482
4508
|
for (let n of e.assistantMsgs) for (let e of n.steps || []) t.push(e.name);
|
|
4483
4509
|
return t;
|
|
4484
4510
|
}
|
|
4485
|
-
var
|
|
4486
|
-
function
|
|
4511
|
+
var Wo = "【更早对话摘要";
|
|
4512
|
+
function Go(e, t) {
|
|
4487
4513
|
return !t || !t.body ? e : {
|
|
4488
4514
|
body: `${t.body}\n【续】\n${e.body}`,
|
|
4489
4515
|
rounds: (t.rounds ?? 0) + (e.rounds ?? 0),
|
|
4490
4516
|
cumulative: !0
|
|
4491
4517
|
};
|
|
4492
4518
|
}
|
|
4493
|
-
function
|
|
4519
|
+
function Ko(e) {
|
|
4494
4520
|
return typeof e != "string" || !e.startsWith("【更早对话摘要") ? null : { body: e.replace(/^【[^】]*】\n?/, "") };
|
|
4495
4521
|
}
|
|
4496
|
-
function
|
|
4497
|
-
return `${
|
|
4522
|
+
function qo(e) {
|
|
4523
|
+
return `${Wo}${e.cumulative ? `(${e.rounds ?? 0} 轮,含累积)` : e.rounds ? `(${e.rounds} 轮)` : ""}】\n${e.body}`;
|
|
4498
4524
|
}
|
|
4499
|
-
function
|
|
4500
|
-
return
|
|
4525
|
+
function Jo(e, t, n) {
|
|
4526
|
+
return qo(Go({
|
|
4501
4527
|
body: n,
|
|
4502
4528
|
rounds: e.length
|
|
4503
4529
|
}, t ?? void 0));
|
|
4504
4530
|
}
|
|
4505
|
-
function
|
|
4531
|
+
function Yo(e, t) {
|
|
4506
4532
|
if (t <= 0) return { trimmed: !1 };
|
|
4507
|
-
let n =
|
|
4533
|
+
let n = Vo(e);
|
|
4508
4534
|
if (n.length <= t) return { trimmed: !1 };
|
|
4509
4535
|
let r = n[n.length - t].startIdx, i = n.slice(0, n.length - t), a = n[0].startIdx, o = null;
|
|
4510
4536
|
for (let t = 0; t < a; t++) {
|
|
4511
4537
|
let n = e[t];
|
|
4512
|
-
if (n.role === "system" && (o =
|
|
4538
|
+
if (n.role === "system" && (o = Ko(n.content), o)) break;
|
|
4513
4539
|
}
|
|
4514
4540
|
return {
|
|
4515
4541
|
trimmed: !0,
|
|
@@ -4517,9 +4543,9 @@ function Jo(e, t) {
|
|
|
4517
4543
|
deleteCount: r,
|
|
4518
4544
|
summary: {
|
|
4519
4545
|
role: "system",
|
|
4520
|
-
content:
|
|
4546
|
+
content: qo(Go({
|
|
4521
4547
|
body: i.map((e) => {
|
|
4522
|
-
let t =
|
|
4548
|
+
let t = Ho(e.userMsg.content, 60) || "(空)", n = e.assistantMsgs[0] ? Ho(e.assistantMsgs[0].content, 80) : "(无回复)";
|
|
4523
4549
|
return `- 第${e.round}轮:${t} → ${n}`;
|
|
4524
4550
|
}).join("\n"),
|
|
4525
4551
|
rounds: i.length
|
|
@@ -4532,35 +4558,35 @@ function Jo(e, t) {
|
|
|
4532
4558
|
}
|
|
4533
4559
|
//#endregion
|
|
4534
4560
|
//#region src/core/composables/contextIndex.ts
|
|
4535
|
-
var
|
|
4536
|
-
function Xo(e) {
|
|
4537
|
-
return e.toLowerCase().split(/[^a-z0-9一-龥]+/i).map((e) => e.trim()).filter((e) => e.length >= 2 && !Yo.has(e));
|
|
4538
|
-
}
|
|
4561
|
+
var Xo = /* @__PURE__ */ new Set(/* @__PURE__ */ "的.了.是.在.我.你.他.她.它.这.那.和.与.及.或.一个.什么.怎么.如何.为什么.可以.能.请.帮.一下.需要.想要.the.a.an.is.are.of.to.in.on".split("."));
|
|
4539
4562
|
function Zo(e) {
|
|
4563
|
+
return e.toLowerCase().split(/[^a-z0-9一-龥]+/i).map((e) => e.trim()).filter((e) => e.length >= 2 && !Xo.has(e));
|
|
4564
|
+
}
|
|
4565
|
+
function Qo(e) {
|
|
4540
4566
|
let t = typeof e.content == "string" ? e.content : "";
|
|
4541
4567
|
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);
|
|
4542
4568
|
return X(t);
|
|
4543
4569
|
}
|
|
4544
|
-
function
|
|
4545
|
-
let t =
|
|
4546
|
-
for (let n of e.assistantMsgs) t +=
|
|
4570
|
+
function $o(e) {
|
|
4571
|
+
let t = Qo(e.userMsg);
|
|
4572
|
+
for (let n of e.assistantMsgs) t += Qo(n);
|
|
4547
4573
|
return t;
|
|
4548
4574
|
}
|
|
4549
|
-
function
|
|
4575
|
+
function es(e, t) {
|
|
4550
4576
|
return e.map((e) => {
|
|
4551
|
-
let n =
|
|
4577
|
+
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 = "";
|
|
4552
4578
|
if (t && t.size) {
|
|
4553
4579
|
let n = [];
|
|
4554
|
-
for (let r of e.assistantMsgs) for (let e of r.steps || []) e.name && t.has(e.name) && e.result && n.push(`${e.name}: ${
|
|
4580
|
+
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)}`);
|
|
4555
4581
|
n.length && (o = `\n 字段提示: ${n.join(" | ")}`);
|
|
4556
4582
|
}
|
|
4557
4583
|
return `- 第${e.round}轮:${n} → ${r}${a}${o}`;
|
|
4558
4584
|
}).join("\n");
|
|
4559
4585
|
}
|
|
4560
|
-
function
|
|
4561
|
-
let r =
|
|
4586
|
+
function ts(e, t, n) {
|
|
4587
|
+
let r = Zo(t);
|
|
4562
4588
|
return r.length === 0 ? [] : e.map((e) => {
|
|
4563
|
-
let t = (e.userMsg.content + " " + e.assistantMsgs.map((e) => e.content).join(" ") + " " + e.assistantMsgs.flatMap((e) => (e.steps || []).map((e) =>
|
|
4589
|
+
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;
|
|
4564
4590
|
for (let e of r) t.includes(e) && n++;
|
|
4565
4591
|
return {
|
|
4566
4592
|
r: e,
|
|
@@ -4568,16 +4594,16 @@ function es(e, t, n) {
|
|
|
4568
4594
|
};
|
|
4569
4595
|
}).filter((e) => e.score > 0).sort((e, t) => t.score - e.score).slice(0, n).map((e) => e.r);
|
|
4570
4596
|
}
|
|
4571
|
-
var
|
|
4572
|
-
function rs(e, t) {
|
|
4573
|
-
return t == null ? e && e >= 32e4 ? ns : Infinity : t > 0 ? t : Infinity;
|
|
4574
|
-
}
|
|
4597
|
+
var ns = 32e4, rs = 16e4;
|
|
4575
4598
|
function is(e, t) {
|
|
4576
|
-
return t
|
|
4599
|
+
return t == null ? e && e >= 32e4 ? rs : Infinity : t > 0 ? t : Infinity;
|
|
4600
|
+
}
|
|
4601
|
+
function as(e, t) {
|
|
4602
|
+
return t.contextWindow && t.contextWindow > 0 ? e.reduce((e, t) => e + $o(t), 0) > Math.min(t.contextWindow * (t.summaryThresholdRatio ?? .5), is(t.contextWindow, t.promptSoftCapTokens)) : e.length > (t.summaryThresholdRounds ?? 8);
|
|
4577
4603
|
}
|
|
4578
4604
|
//#endregion
|
|
4579
4605
|
//#region src/core/composables/useContextManager.ts
|
|
4580
|
-
var
|
|
4606
|
+
var os = {
|
|
4581
4607
|
windowRounds: 6,
|
|
4582
4608
|
summaryThresholdRounds: 8,
|
|
4583
4609
|
toolResultMaxChars: 800,
|
|
@@ -4585,9 +4611,9 @@ var as = {
|
|
|
4585
4611
|
recallTopK: 3,
|
|
4586
4612
|
enableLLMSummary: !1
|
|
4587
4613
|
};
|
|
4588
|
-
function
|
|
4614
|
+
function ss(e = {}) {
|
|
4589
4615
|
let t = {
|
|
4590
|
-
...
|
|
4616
|
+
...os,
|
|
4591
4617
|
...e
|
|
4592
4618
|
}, n = null, r = !1;
|
|
4593
4619
|
function i(e, i) {
|
|
@@ -4601,13 +4627,13 @@ function os(e = {}) {
|
|
|
4601
4627
|
}));
|
|
4602
4628
|
}
|
|
4603
4629
|
async function a(e, r) {
|
|
4604
|
-
let a =
|
|
4630
|
+
let a = Vo(e), o = e.length, s = "";
|
|
4605
4631
|
if (a.length) {
|
|
4606
4632
|
let t = a[0].startIdx;
|
|
4607
4633
|
for (let n = 0; n < t; n++) {
|
|
4608
4634
|
let t = e[n];
|
|
4609
4635
|
if (t.role === "system") {
|
|
4610
|
-
let e =
|
|
4636
|
+
let e = Ko(t.content);
|
|
4611
4637
|
if (e) {
|
|
4612
4638
|
s = e.body;
|
|
4613
4639
|
break;
|
|
@@ -4627,11 +4653,11 @@ function os(e = {}) {
|
|
|
4627
4653
|
strategy: t
|
|
4628
4654
|
}
|
|
4629
4655
|
});
|
|
4630
|
-
if (!
|
|
4656
|
+
if (!as(a, t)) return c("none");
|
|
4631
4657
|
let l, u, d;
|
|
4632
4658
|
if (t.contextWindow && t.contextWindow > 0) {
|
|
4633
4659
|
let e = t.contextWindow * (r?.windowRatio ?? t.windowRatio ?? .4), n = 0, i = 0;
|
|
4634
|
-
for (let t = a.length - 1; t >= 0; t--) if (n +=
|
|
4660
|
+
for (let t = a.length - 1; t >= 0; t--) if (n += $o(a[t]), n >= e) {
|
|
4635
4661
|
i = t + 1;
|
|
4636
4662
|
break;
|
|
4637
4663
|
}
|
|
@@ -4644,10 +4670,10 @@ function os(e = {}) {
|
|
|
4644
4670
|
}
|
|
4645
4671
|
let f = [...e].reverse().find((e) => e.role === "user")?.content || "", p = r?.summarize?.mode ?? (t.enableLLMSummary ? "llm" : "index"), m = /* @__PURE__ */ new Set([...t.preserveLastToolResults ?? [], ...r?.preserveTools ?? []]), h = m.size ? m : void 0, g, _;
|
|
4646
4672
|
if (p === "llm" && t.llmInvoke) {
|
|
4647
|
-
let e =
|
|
4648
|
-
n && n.coveredCount >= t ? (g = n.text, _ = d + "llm_summary(cached)") : n && n.coveredCount > 0 ? (g = n.text + "\n" +
|
|
4649
|
-
} else g =
|
|
4650
|
-
let v = r?.recallTopK == null ? t.enableRecall ? t.recallTopK : 0 : r.recallTopK, y = v > 0 ?
|
|
4673
|
+
let e = es(u, h), t = u.length;
|
|
4674
|
+
n && n.coveredCount >= t ? (g = n.text, _ = d + "llm_summary(cached)") : n && n.coveredCount > 0 ? (g = n.text + "\n" + es(u.slice(n.coveredCount), h), _ = d + "llm_summary(prefix)+index_tail", i(t, e)) : (g = e, _ = d + "index_summary(llm_background)", i(t, e));
|
|
4675
|
+
} else g = es(u, h), _ = d + "index_summary";
|
|
4676
|
+
let v = r?.recallTopK == null ? t.enableRecall ? t.recallTopK : 0 : r.recallTopK, y = v > 0 ? ts(u, f, v) : [], b = y.length ? y.map((e) => `- 第${e.round}轮:${Ho(e.userMsg.content, 60)} → ${e.assistantMsgs[0] ? Ho(e.assistantMsgs[0].content, 80) : ""}`).join("\n") : "", x = s ? `${g}\n【更早累积摘要】\n${s}` : g, S = [`【对话历史摘要】以下是之前 ${u.length} 轮对话的要点(最新 ${l.length} 轮已完整保留):`, x];
|
|
4651
4677
|
if (r) {
|
|
4652
4678
|
let e = t.contextWindow && t.contextWindow > 0 ? `windowRatio=${r.windowRatio ?? t.windowRatio}` : `keepRounds=${r.keepRounds ?? t.windowRounds}`;
|
|
4653
4679
|
S.push(`\n(压缩决策:${e} · 摘要=${r.summarize.mode} · 召回=${v}${r.reason ? " · " + r.reason : ""})`);
|
|
@@ -4689,16 +4715,16 @@ function os(e = {}) {
|
|
|
4689
4715
|
}
|
|
4690
4716
|
//#endregion
|
|
4691
4717
|
//#region src/core/harness/summarization.ts
|
|
4692
|
-
function
|
|
4693
|
-
let t =
|
|
4718
|
+
function cs(e = {}) {
|
|
4719
|
+
let t = ss(e);
|
|
4694
4720
|
return Object.assign({
|
|
4695
4721
|
name: "summarization",
|
|
4696
4722
|
compressInput: async (n) => {
|
|
4697
4723
|
let r;
|
|
4698
4724
|
if (e.decideInvoke) {
|
|
4699
|
-
let i =
|
|
4700
|
-
if (
|
|
4701
|
-
let a = t.config.contextWindow && t.config.contextWindow > 0 ? "token" : "rounds", o = a === "token" ? `历史 token 超阈值 ${Math.round(Math.min((t.config.contextWindow ?? 0) * (t.config.summaryThresholdRatio ?? .5),
|
|
4725
|
+
let i = Vo(n);
|
|
4726
|
+
if (as(i, t.config)) {
|
|
4727
|
+
let a = t.config.contextWindow && t.config.contextWindow > 0 ? "token" : "rounds", o = a === "token" ? `历史 token 超阈值 ${Math.round(Math.min((t.config.contextWindow ?? 0) * (t.config.summaryThresholdRatio ?? .5), is(t.config.contextWindow, t.config.promptSoftCapTokens)))}` : `轮数 ${i.length} 超阈值 ${t.config.summaryThresholdRounds}`;
|
|
4702
4728
|
try {
|
|
4703
4729
|
r = await e.decideInvoke({
|
|
4704
4730
|
getMessages: () => n,
|
|
@@ -4725,7 +4751,7 @@ function ss(e = {}) {
|
|
|
4725
4751
|
}
|
|
4726
4752
|
//#endregion
|
|
4727
4753
|
//#region src/core/harness/subagent.ts
|
|
4728
|
-
function
|
|
4754
|
+
function ls(e = 20) {
|
|
4729
4755
|
let t = /* @__PURE__ */ new Map(), n = [];
|
|
4730
4756
|
return {
|
|
4731
4757
|
start(e, n, r, i) {
|
|
@@ -4754,17 +4780,17 @@ function cs(e = 20) {
|
|
|
4754
4780
|
}
|
|
4755
4781
|
};
|
|
4756
4782
|
}
|
|
4757
|
-
function
|
|
4783
|
+
function us(e) {
|
|
4758
4784
|
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
4759
4785
|
}
|
|
4760
|
-
var
|
|
4786
|
+
var ds = [
|
|
4761
4787
|
"describe_data",
|
|
4762
4788
|
"get_data",
|
|
4763
4789
|
"read",
|
|
4764
4790
|
"query_data",
|
|
4765
4791
|
"search_data",
|
|
4766
4792
|
"fetch_document"
|
|
4767
|
-
],
|
|
4793
|
+
], fs = 1, ps = 4, ms = 6, hs = ["spawn_agent", "spawn_agents"], gs = [
|
|
4768
4794
|
"load_skill",
|
|
4769
4795
|
"write_todos",
|
|
4770
4796
|
"update_todo",
|
|
@@ -4775,40 +4801,40 @@ var us = [
|
|
|
4775
4801
|
"remove_focus",
|
|
4776
4802
|
"clear_focus"
|
|
4777
4803
|
];
|
|
4778
|
-
function
|
|
4779
|
-
return
|
|
4804
|
+
function _s(e) {
|
|
4805
|
+
return hs.includes(e) || gs.includes(e) || e.startsWith("use_");
|
|
4780
4806
|
}
|
|
4781
|
-
function
|
|
4782
|
-
return [...e.filter((e) => t.has(e.name) && !
|
|
4807
|
+
function vs(e, t, n = []) {
|
|
4808
|
+
return [...e.filter((e) => t.has(e.name) && !_s(e.name)), ...n];
|
|
4783
4809
|
}
|
|
4784
|
-
var
|
|
4810
|
+
var ys = [
|
|
4785
4811
|
"write",
|
|
4786
4812
|
"set_data",
|
|
4787
4813
|
"edit_data",
|
|
4788
4814
|
"delete_data",
|
|
4789
4815
|
"draft_commit"
|
|
4790
4816
|
];
|
|
4791
|
-
function
|
|
4817
|
+
function bs(e) {
|
|
4792
4818
|
let t = [];
|
|
4793
4819
|
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);
|
|
4794
4820
|
return t;
|
|
4795
4821
|
}
|
|
4796
|
-
function
|
|
4822
|
+
function xs(e, t) {
|
|
4797
4823
|
return t.some((t) => e === t || e.startsWith(t + ".") || e.startsWith(t + "["));
|
|
4798
4824
|
}
|
|
4799
|
-
function
|
|
4825
|
+
function Ss(e, t) {
|
|
4800
4826
|
let n = e.invoke.bind(e), r = async (e) => {
|
|
4801
4827
|
if (Array.isArray(e?.patches) && e.patches.some((e) => !e || typeof e.jsonPath != "string" || !e.jsonPath)) return `PATH_OUT_OF_SCOPE:patches 含无 jsonPath 项(作用于根),子 agent 仅可写 ${t.join(", ")} 范围内子路径。请为每个 patch 指定 jsonPath。`;
|
|
4802
|
-
let r =
|
|
4828
|
+
let r = bs(e);
|
|
4803
4829
|
if (!r.length) return `PATH_OUT_OF_SCOPE:子 agent 仅可增量 patch(writablePaths: ${t.join(", ")}),不能整体替换(无 jsonPath)。用 write({patch:{jsonPath,...}}) 增量改。`;
|
|
4804
|
-
for (let e of r) if (!
|
|
4830
|
+
for (let e of r) if (!xs(e, t)) return `PATH_OUT_OF_SCOPE:子 agent 写 "${e}" 越界(仅可写 ${t.join(", ")})。`;
|
|
4805
4831
|
return n(e);
|
|
4806
4832
|
};
|
|
4807
4833
|
return new Proxy(e, { get(e, t, n) {
|
|
4808
4834
|
return t === "invoke" ? r : Reflect.get(e, t, n);
|
|
4809
4835
|
} });
|
|
4810
4836
|
}
|
|
4811
|
-
function
|
|
4837
|
+
function Cs(e, t, n) {
|
|
4812
4838
|
return new Proxy(e, { get(e, r, i) {
|
|
4813
4839
|
return r === "invoke" ? async (r, i) => {
|
|
4814
4840
|
let a = n(t);
|
|
@@ -4826,19 +4852,19 @@ function Ss(e, t, n) {
|
|
|
4826
4852
|
} : Reflect.get(e, r, i);
|
|
4827
4853
|
} });
|
|
4828
4854
|
}
|
|
4829
|
-
async function
|
|
4830
|
-
let o = t.depth ?? 0, s = t.maxDepth ??
|
|
4855
|
+
async function ws(e, t, n, r, i, a) {
|
|
4856
|
+
let o = t.depth ?? 0, s = t.maxDepth ?? fs, c = /* @__PURE__ */ new Set([...ds, ...t.allowedTools ?? []]), l = () => typeof t.allTools == "function" ? t.allTools() : t.allTools, u = vs(l(), c, t.extraTools ?? []);
|
|
4831
4857
|
if (t.writablePaths?.length) {
|
|
4832
|
-
u = u.filter((e) => !
|
|
4833
|
-
let e = l().filter((e) =>
|
|
4858
|
+
u = u.filter((e) => !ys.includes(e.name));
|
|
4859
|
+
let e = l().filter((e) => ys.includes(e.name) && !_s(e.name)).map((e) => Ss(e, t.writablePaths));
|
|
4834
4860
|
u = [...u, ...e];
|
|
4835
4861
|
}
|
|
4836
4862
|
let d = `sub-${o}-${Math.random().toString(36).slice(2, 10)}`;
|
|
4837
|
-
t.enterDataScope && (u = u.map((e) => e.__dataOpsScoped ?
|
|
4838
|
-
let f = o + 1 < s ? [
|
|
4863
|
+
t.enterDataScope && (u = u.map((e) => e.__dataOpsScoped ? Cs(e, d, t.enterDataScope) : e));
|
|
4864
|
+
let f = o + 1 < s ? [Ts({
|
|
4839
4865
|
...t,
|
|
4840
4866
|
depth: o + 1
|
|
4841
|
-
})] : [], p = t.getFocuses?.() ?? [], m = p.length ?
|
|
4867
|
+
})] : [], p = t.getFocuses?.() ?? [], m = p.length ? Za({
|
|
4842
4868
|
getSchema: t.getSchema ?? (() => null),
|
|
4843
4869
|
getBind: t.getBind,
|
|
4844
4870
|
initialFocuses: p,
|
|
@@ -4847,12 +4873,12 @@ async function Cs(e, t, n, r, i, a) {
|
|
|
4847
4873
|
name: "vfs-bridge",
|
|
4848
4874
|
beforeAgent: () => ({ files: t.getVfsFiles() })
|
|
4849
4875
|
} : void 0, g = ai({
|
|
4850
|
-
model:
|
|
4876
|
+
model: us(t.llm) ? t.llm.model ?? t.llm.modelName : e.model ?? t.llm.model,
|
|
4851
4877
|
contextWindow: t.llm.contextWindow,
|
|
4852
4878
|
maxOutputTokens: t.llm.maxOutputTokens
|
|
4853
4879
|
});
|
|
4854
4880
|
if (g.contextWindow < 2e5) throw Error(`[page-agent-sdk][subagent] 子 agent 模型上下文窗口 ${g.contextWindow} 小于最小支持 ${ii}(需 ≥200K 窗口模型)`);
|
|
4855
|
-
let _ = t.summarization === void 0 ? void 0 :
|
|
4881
|
+
let _ = t.summarization === void 0 ? void 0 : cs(typeof t.summarization == "object" ? {
|
|
4856
4882
|
contextWindow: g.contextWindow,
|
|
4857
4883
|
...t.summarization
|
|
4858
4884
|
} : { contextWindow: g.contextWindow }), y = t.onUsage ? {
|
|
@@ -4864,7 +4890,7 @@ async function Cs(e, t, n, r, i, a) {
|
|
|
4864
4890
|
} : void 0, b = Ui({
|
|
4865
4891
|
contextWindow: g.contextWindow,
|
|
4866
4892
|
maxOutputTokens: g.maxOutputTokens,
|
|
4867
|
-
...
|
|
4893
|
+
...us(t.llm) ? { llm: t.llm } : {
|
|
4868
4894
|
apiKey: t.llm.apiKey,
|
|
4869
4895
|
baseUrl: t.llm.baseUrl,
|
|
4870
4896
|
model: e.model ?? t.llm.model,
|
|
@@ -4876,7 +4902,7 @@ async function Cs(e, t, n, r, i, a) {
|
|
|
4876
4902
|
systemPrompt: e.role?.trim() || t.systemPrompt || "你是一个专注的子任务执行者。你只有只读工具(读主数据 / 抓文档),用它们完成给定任务,给出简洁结论,不要展开多余解释。",
|
|
4877
4903
|
tools: u,
|
|
4878
4904
|
middleware: [
|
|
4879
|
-
...t.skills?.length ? [
|
|
4905
|
+
...t.skills?.length ? [bo(t.skills)] : [],
|
|
4880
4906
|
..._ ? [_] : [],
|
|
4881
4907
|
...h ? [h] : [],
|
|
4882
4908
|
...f,
|
|
@@ -4885,7 +4911,7 @@ async function Cs(e, t, n, r, i, a) {
|
|
|
4885
4911
|
...t.guardMiddleware ?? [],
|
|
4886
4912
|
...t.middleware ?? []
|
|
4887
4913
|
],
|
|
4888
|
-
maxToolRounds: t.maxToolRounds ??
|
|
4914
|
+
maxToolRounds: t.maxToolRounds ?? ms,
|
|
4889
4915
|
maxVerifyAttempts: t.maxVerifyAttempts ?? 0,
|
|
4890
4916
|
onLog: i,
|
|
4891
4917
|
debug: t.debug
|
|
@@ -4923,8 +4949,8 @@ async function Cs(e, t, n, r, i, a) {
|
|
|
4923
4949
|
clearTimeout(T), C();
|
|
4924
4950
|
}
|
|
4925
4951
|
}
|
|
4926
|
-
function
|
|
4927
|
-
let n = e.maxParallel ??
|
|
4952
|
+
function Ts(e) {
|
|
4953
|
+
let n = e.maxParallel ?? ps, i, a, o, s = (e) => e?.configurable?.__pgSubagentCall ?? {
|
|
4928
4954
|
signal: i,
|
|
4929
4955
|
emit: a,
|
|
4930
4956
|
logSink: o
|
|
@@ -4958,7 +4984,7 @@ function ws(e) {
|
|
|
4958
4984
|
return {
|
|
4959
4985
|
name: "subagent",
|
|
4960
4986
|
tools: [r(async ({ prompt: t, role: n, tools: r, writablePaths: i, model: a }, o) => {
|
|
4961
|
-
let l = s(o), u = (r ?? []).filter((e) => !
|
|
4987
|
+
let l = s(o), u = (r ?? []).filter((e) => !ys.includes(e)), d = u.length || i?.length ? {
|
|
4962
4988
|
...e,
|
|
4963
4989
|
...u.length ? { allowedTools: u } : {},
|
|
4964
4990
|
...i?.length ? { writablePaths: i } : {}
|
|
@@ -4968,7 +4994,7 @@ function ws(e) {
|
|
|
4968
4994
|
}), h = Date.now();
|
|
4969
4995
|
e.tracker?.start(f, t, p, h);
|
|
4970
4996
|
try {
|
|
4971
|
-
let r = await
|
|
4997
|
+
let r = await ws({
|
|
4972
4998
|
prompt: t,
|
|
4973
4999
|
role: n,
|
|
4974
5000
|
model: a
|
|
@@ -4996,7 +5022,7 @@ function ws(e) {
|
|
|
4996
5022
|
}), s = Date.now();
|
|
4997
5023
|
e.tracker?.start(r, t.prompt, a, s);
|
|
4998
5024
|
try {
|
|
4999
|
-
let n = await
|
|
5025
|
+
let n = await ws(t, e, i.signal, c(r, a, i.emit), o, i.emit);
|
|
5000
5026
|
return e.tracker?.finish(r, "done", n ?? "(未完成)"), {
|
|
5001
5027
|
ok: !0,
|
|
5002
5028
|
text: n ?? "(未完成)"
|
|
@@ -5027,8 +5053,8 @@ function ws(e) {
|
|
|
5027
5053
|
}, t(e))
|
|
5028
5054
|
};
|
|
5029
5055
|
}
|
|
5030
|
-
var
|
|
5031
|
-
function
|
|
5056
|
+
var Es = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
5057
|
+
function Ds(e, t) {
|
|
5032
5058
|
let n = e.tools ?? [];
|
|
5033
5059
|
return {
|
|
5034
5060
|
llm: e.llm ?? t.llm,
|
|
@@ -5056,7 +5082,7 @@ function Es(e, t) {
|
|
|
5056
5082
|
...t.timeoutMs === void 0 ? {} : { timeoutMs: t.timeoutMs }
|
|
5057
5083
|
};
|
|
5058
5084
|
}
|
|
5059
|
-
function
|
|
5085
|
+
function Os(e, n) {
|
|
5060
5086
|
let i, a, o, s = (e) => e?.configurable?.__pgSubagentCall ?? {
|
|
5061
5087
|
signal: i,
|
|
5062
5088
|
emit: a,
|
|
@@ -5087,7 +5113,7 @@ function Ds(e, n) {
|
|
|
5087
5113
|
function f(e) {
|
|
5088
5114
|
let i = /* @__PURE__ */ new Set(), a = [], o = [];
|
|
5089
5115
|
for (let l of e) {
|
|
5090
|
-
if (!
|
|
5116
|
+
if (!Es.test(l.id)) {
|
|
5091
5117
|
console.warn(`[subagents] id "${l.id}" 非合法工具名(须 [a-zA-Z_][a-zA-Z0-9_]*),已跳过`);
|
|
5092
5118
|
continue;
|
|
5093
5119
|
}
|
|
@@ -5097,7 +5123,7 @@ function Ds(e, n) {
|
|
|
5097
5123
|
continue;
|
|
5098
5124
|
}
|
|
5099
5125
|
i.add(e), a.push(l), o.push(r(async ({ task: e }, t) => {
|
|
5100
|
-
let r = s(t), i =
|
|
5126
|
+
let r = s(t), i = Ds(l, n), a = (e) => r.logSink?.({
|
|
5101
5127
|
...e,
|
|
5102
5128
|
source: `子:${l.id}`
|
|
5103
5129
|
}), o = n.tracker, u = o ? `use_${l.id}-${Math.random().toString(36).slice(2, 6)}` : `use_${l.id}`, d = c(`use_${l.id}`, l.id, r.emit), f = o ? (e) => {
|
|
@@ -5109,7 +5135,7 @@ function Ds(e, n) {
|
|
|
5109
5135
|
} : d, p = Date.now();
|
|
5110
5136
|
o?.start(u, e, l.id, p);
|
|
5111
5137
|
try {
|
|
5112
|
-
let t = await
|
|
5138
|
+
let t = await ws({ prompt: e }, i, r.signal, f, a, r.emit);
|
|
5113
5139
|
return o?.finish(u, "done", t), t;
|
|
5114
5140
|
} catch (e) {
|
|
5115
5141
|
throw o?.finish(u, "error", String(e?.message ?? e)), e;
|
|
@@ -5177,7 +5203,7 @@ function Ds(e, n) {
|
|
|
5177
5203
|
}
|
|
5178
5204
|
//#endregion
|
|
5179
5205
|
//#region src/core/harness/verify.ts
|
|
5180
|
-
function
|
|
5206
|
+
function ks(e) {
|
|
5181
5207
|
return {
|
|
5182
5208
|
name: "verify",
|
|
5183
5209
|
async beforeReturn({ messages: t, state: n, log: r }) {
|
|
@@ -5189,10 +5215,10 @@ function Os(e) {
|
|
|
5189
5215
|
if (e.adversarial) {
|
|
5190
5216
|
r?.("middleware", {
|
|
5191
5217
|
stage: "adversarial_start",
|
|
5192
|
-
model:
|
|
5218
|
+
model: Ls(e.adversarial.llm),
|
|
5193
5219
|
tools: (e.adversarial.tools ?? []).length
|
|
5194
5220
|
});
|
|
5195
|
-
let n = await
|
|
5221
|
+
let n = await Vs(t, e.adversarial.llm, r, e.adversarial.tools);
|
|
5196
5222
|
if (r?.("middleware", {
|
|
5197
5223
|
stage: "adversarial_done",
|
|
5198
5224
|
clean: n === null,
|
|
@@ -5203,18 +5229,18 @@ function Os(e) {
|
|
|
5203
5229
|
}
|
|
5204
5230
|
};
|
|
5205
5231
|
}
|
|
5206
|
-
var
|
|
5232
|
+
var As = /* @__PURE__ */ new Set([
|
|
5207
5233
|
"set_data",
|
|
5208
5234
|
"edit_data",
|
|
5209
5235
|
"delete_data",
|
|
5210
5236
|
"write"
|
|
5211
|
-
]),
|
|
5212
|
-
function
|
|
5237
|
+
]), js = /校验失败|SCHEMA_INVALID|未注册|不存在|仅支持|必须是|NOT_OBJECT|PATH_UNSAFE|VERSION_CONFLICT|WRITE_INTERCEPT/;
|
|
5238
|
+
function Ms(e) {
|
|
5213
5239
|
let t = /* @__PURE__ */ new Map();
|
|
5214
5240
|
for (let n of e) {
|
|
5215
5241
|
let e = n?.tool_calls;
|
|
5216
5242
|
if (Array.isArray(e)) for (let n of e) {
|
|
5217
|
-
if (!
|
|
5243
|
+
if (!As.has(n.name)) continue;
|
|
5218
5244
|
let e = n.id, r = n?.args ?? {};
|
|
5219
5245
|
if (n.name === "write") if (r.del && r.patch?.jsonPath) t.set(r.patch.jsonPath, {
|
|
5220
5246
|
path: r.patch.jsonPath,
|
|
@@ -5253,7 +5279,7 @@ function js(e) {
|
|
|
5253
5279
|
}
|
|
5254
5280
|
return [...t.values()];
|
|
5255
5281
|
}
|
|
5256
|
-
function
|
|
5282
|
+
function Ns(e) {
|
|
5257
5283
|
let t = /* @__PURE__ */ new Map();
|
|
5258
5284
|
for (let n of e) {
|
|
5259
5285
|
let e = n?.tool_call_id, r = n?.content;
|
|
@@ -5261,7 +5287,7 @@ function Ms(e) {
|
|
|
5261
5287
|
}
|
|
5262
5288
|
return t;
|
|
5263
5289
|
}
|
|
5264
|
-
function
|
|
5290
|
+
function Ps(e, t) {
|
|
5265
5291
|
if (t === "") return e;
|
|
5266
5292
|
if (e == null) return;
|
|
5267
5293
|
let n = e;
|
|
@@ -5271,16 +5297,16 @@ function Ns(e, t) {
|
|
|
5271
5297
|
}
|
|
5272
5298
|
return n;
|
|
5273
5299
|
}
|
|
5274
|
-
function
|
|
5300
|
+
function Fs(e = {}) {
|
|
5275
5301
|
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 ?? {};
|
|
5276
5302
|
return async ({ messages: e }) => {
|
|
5277
|
-
let r =
|
|
5303
|
+
let r = Ms(e);
|
|
5278
5304
|
if (!r.length) return { ok: !0 };
|
|
5279
|
-
let i =
|
|
5305
|
+
let i = Ns(e), a = n()[""], o = t(), s = [];
|
|
5280
5306
|
for (let { path: e, op: t, callId: n } of r) {
|
|
5281
5307
|
let r = n ? i.get(n) : void 0;
|
|
5282
|
-
if (r &&
|
|
5283
|
-
let c =
|
|
5308
|
+
if (r && js.test(r)) continue;
|
|
5309
|
+
let c = Ps(o, e);
|
|
5284
5310
|
if (t === "delete_data") c !== void 0 && s.push(`${e} 删除后读回仍有值,疑似未生效`);
|
|
5285
5311
|
else if (c == null) s.push(`写入 ${e} 后读回为空,疑似未生效`);
|
|
5286
5312
|
else if (a) {
|
|
@@ -5294,17 +5320,17 @@ function Ps(e = {}) {
|
|
|
5294
5320
|
} : { ok: !0 };
|
|
5295
5321
|
};
|
|
5296
5322
|
}
|
|
5297
|
-
function Fs(e) {
|
|
5298
|
-
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
5299
|
-
}
|
|
5300
5323
|
function Is(e) {
|
|
5301
|
-
return
|
|
5324
|
+
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
5302
5325
|
}
|
|
5303
|
-
|
|
5304
|
-
|
|
5305
|
-
return Ls.test(e);
|
|
5326
|
+
function Ls(e) {
|
|
5327
|
+
return Is(e) ? e.model ?? e.modelName ?? "<实例>" : e.model ?? "<配置>";
|
|
5306
5328
|
}
|
|
5329
|
+
var Rs = /无问题|没有问题|未发现问题|没有发现|没问题|未发现/;
|
|
5307
5330
|
function zs(e) {
|
|
5331
|
+
return Rs.test(e);
|
|
5332
|
+
}
|
|
5333
|
+
function Bs(e) {
|
|
5308
5334
|
let t = "", n = "";
|
|
5309
5335
|
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 : "");
|
|
5310
5336
|
return {
|
|
@@ -5312,8 +5338,8 @@ function zs(e) {
|
|
|
5312
5338
|
lastReply: n
|
|
5313
5339
|
};
|
|
5314
5340
|
}
|
|
5315
|
-
async function
|
|
5316
|
-
let { lastUser: i, lastReply: a } =
|
|
5341
|
+
async function Vs(e, t, n, r) {
|
|
5342
|
+
let { lastUser: i, lastReply: a } = Bs(e);
|
|
5317
5343
|
if (!a) return null;
|
|
5318
5344
|
let o = Array.isArray(r) && r.length > 0, s = [
|
|
5319
5345
|
"你是严格的对抗式审查者,目标是找出以下 AI 助手回复的错误并证明它有问题(事实错误 / 遗漏 / 逻辑矛盾 / 与需求不符)。",
|
|
@@ -5324,7 +5350,7 @@ async function Bs(e, t, n, r) {
|
|
|
5324
5350
|
].join("\n"), c = "你是严格的对抗式审查者,只找问题不赞美。目标是反驳,不是改进。", l = n ? (e) => n(e.type, {
|
|
5325
5351
|
...e.data,
|
|
5326
5352
|
source: "adversarial"
|
|
5327
|
-
}) : void 0, u = await Ui(
|
|
5353
|
+
}) : void 0, u = await Ui(Is(t) ? {
|
|
5328
5354
|
llm: t,
|
|
5329
5355
|
tools: r,
|
|
5330
5356
|
maxToolRounds: o ? 4 : 1,
|
|
@@ -5349,11 +5375,11 @@ async function Bs(e, t, n, r) {
|
|
|
5349
5375
|
stage: "adversarial_verdict",
|
|
5350
5376
|
verdict: u,
|
|
5351
5377
|
source: "adversarial"
|
|
5352
|
-
}),
|
|
5378
|
+
}), zs(u) ? null : u.trim();
|
|
5353
5379
|
}
|
|
5354
5380
|
//#endregion
|
|
5355
5381
|
//#region src/core/utils/contextAnalysis.ts
|
|
5356
|
-
var
|
|
5382
|
+
var Hs = [
|
|
5357
5383
|
{
|
|
5358
5384
|
prefix: "## 可操作数据",
|
|
5359
5385
|
key: "dataHint"
|
|
@@ -5382,7 +5408,7 @@ var Vs = [
|
|
|
5382
5408
|
prefix: "【与当前问题可能相关的早期对话】",
|
|
5383
5409
|
key: "recall"
|
|
5384
5410
|
}
|
|
5385
|
-
],
|
|
5411
|
+
], Us = [
|
|
5386
5412
|
{
|
|
5387
5413
|
key: "systemPrompt",
|
|
5388
5414
|
label: "系统提示词(身份/规则)"
|
|
@@ -5436,9 +5462,9 @@ var Vs = [
|
|
|
5436
5462
|
label: "其他"
|
|
5437
5463
|
}
|
|
5438
5464
|
];
|
|
5439
|
-
function
|
|
5465
|
+
function Ws() {
|
|
5440
5466
|
let e = {};
|
|
5441
|
-
for (let t of
|
|
5467
|
+
for (let t of Us) e[t.key] = {
|
|
5442
5468
|
key: t.key,
|
|
5443
5469
|
label: t.label,
|
|
5444
5470
|
tokens: 0,
|
|
@@ -5447,16 +5473,16 @@ function Us() {
|
|
|
5447
5473
|
};
|
|
5448
5474
|
return e;
|
|
5449
5475
|
}
|
|
5450
|
-
function
|
|
5476
|
+
function Gs(e, t) {
|
|
5451
5477
|
e.tokens += t, e.msgCount += 1;
|
|
5452
5478
|
}
|
|
5453
|
-
function
|
|
5479
|
+
function Ks(e) {
|
|
5454
5480
|
let t = e.content;
|
|
5455
5481
|
return typeof t == "string" ? t : JSON.stringify(t ?? "");
|
|
5456
5482
|
}
|
|
5457
|
-
function
|
|
5483
|
+
function qs(e, t) {
|
|
5458
5484
|
let n = [];
|
|
5459
|
-
for (let t of
|
|
5485
|
+
for (let t of Hs) {
|
|
5460
5486
|
let r = 0;
|
|
5461
5487
|
for (;;) {
|
|
5462
5488
|
let i = e.indexOf(t.prefix, r);
|
|
@@ -5469,35 +5495,35 @@ function Ks(e, t) {
|
|
|
5469
5495
|
}
|
|
5470
5496
|
if (n.sort((e, t) => e.idx - t.idx), !n.length) {
|
|
5471
5497
|
let n = e.trim();
|
|
5472
|
-
n &&
|
|
5498
|
+
n && Gs(t.systemPrompt, X(n));
|
|
5473
5499
|
return;
|
|
5474
5500
|
}
|
|
5475
5501
|
if (n[0].idx > 0) {
|
|
5476
5502
|
let r = e.slice(0, n[0].idx).trim();
|
|
5477
|
-
r &&
|
|
5503
|
+
r && Gs(t.systemPrompt, X(r));
|
|
5478
5504
|
}
|
|
5479
5505
|
for (let r = 0; r < n.length; r++) {
|
|
5480
5506
|
let i = n[r].idx, a = r + 1 < n.length ? n[r + 1].idx : e.length, o = e.slice(i, a).trim();
|
|
5481
|
-
o &&
|
|
5507
|
+
o && Gs(t[n[r].key], X(o));
|
|
5482
5508
|
}
|
|
5483
5509
|
}
|
|
5484
|
-
function
|
|
5485
|
-
let n =
|
|
5510
|
+
function Js(e, t = {}) {
|
|
5511
|
+
let n = Ws(), r = -1;
|
|
5486
5512
|
for (let t = e.length - 1; t >= 0; t--) if (e[t] instanceof a) {
|
|
5487
5513
|
r = t;
|
|
5488
5514
|
break;
|
|
5489
5515
|
}
|
|
5490
5516
|
for (let t = 0; t < e.length; t++) {
|
|
5491
5517
|
let c = e[t];
|
|
5492
|
-
if (c instanceof o) Ks(
|
|
5493
|
-
else if (c instanceof a)
|
|
5518
|
+
if (c instanceof o) qs(Ks(c), n);
|
|
5519
|
+
else if (c instanceof a) Gs(n[t === r ? "current" : "history"], X(Ks(c)));
|
|
5494
5520
|
else if (c instanceof i) {
|
|
5495
5521
|
let e = c.tool_calls ?? [];
|
|
5496
5522
|
if (e.length) {
|
|
5497
5523
|
let t = e.map((e) => JSON.stringify(e.args ?? {})).join(" ");
|
|
5498
|
-
|
|
5499
|
-
} else
|
|
5500
|
-
} else c instanceof s ?
|
|
5524
|
+
Gs(n.toolResults, X(t));
|
|
5525
|
+
} else Gs(n.assistant, X(Ks(c)));
|
|
5526
|
+
} else c instanceof s ? Gs(n.toolResults, X(Ks(c))) : Gs(n.other, X(Ks(c)));
|
|
5501
5527
|
}
|
|
5502
5528
|
let c = Object.values(n).filter((e) => e.tokens > 0);
|
|
5503
5529
|
c.sort((e, t) => t.tokens - e.tokens);
|
|
@@ -5514,12 +5540,12 @@ function qs(e, t = {}) {
|
|
|
5514
5540
|
}
|
|
5515
5541
|
//#endregion
|
|
5516
5542
|
//#region src/core/harness/contextInspector.ts
|
|
5517
|
-
function
|
|
5543
|
+
function Ys(e = {}) {
|
|
5518
5544
|
let t, n = e.contextWindow;
|
|
5519
5545
|
return {
|
|
5520
5546
|
name: "context-inspector",
|
|
5521
5547
|
async wrapModelCall(r, i) {
|
|
5522
|
-
return t =
|
|
5548
|
+
return t = Js(r.messages, {
|
|
5523
5549
|
contextWindow: n,
|
|
5524
5550
|
thresholdRatio: e.thresholdRatio
|
|
5525
5551
|
}), i(r);
|
|
@@ -5530,13 +5556,13 @@ function Js(e = {}) {
|
|
|
5530
5556
|
}
|
|
5531
5557
|
};
|
|
5532
5558
|
}
|
|
5533
|
-
function
|
|
5559
|
+
function Xs(e) {
|
|
5534
5560
|
let t = e?.content;
|
|
5535
5561
|
if (!Array.isArray(t) || !t.length) return "";
|
|
5536
5562
|
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");
|
|
5537
5563
|
return e?.isError ? `工具错误:${n}` : n;
|
|
5538
5564
|
}
|
|
5539
|
-
async function
|
|
5565
|
+
async function Zs(e) {
|
|
5540
5566
|
let t = new URL(e.url), n = e.requestInit;
|
|
5541
5567
|
if (e.transport === "http") {
|
|
5542
5568
|
let { StreamableHTTPClientTransport: e } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
|
|
@@ -5549,7 +5575,7 @@ async function Xs(e) {
|
|
|
5549
5575
|
let { WebSocketClientTransport: r } = await import("@modelcontextprotocol/sdk/client/websocket.js");
|
|
5550
5576
|
return new r(t);
|
|
5551
5577
|
}
|
|
5552
|
-
async function
|
|
5578
|
+
async function Qs(e, t, n) {
|
|
5553
5579
|
let r;
|
|
5554
5580
|
try {
|
|
5555
5581
|
return await Promise.race([e, new Promise((e, i) => {
|
|
@@ -5559,8 +5585,8 @@ async function Zs(e, t, n) {
|
|
|
5559
5585
|
clearTimeout(r);
|
|
5560
5586
|
}
|
|
5561
5587
|
}
|
|
5562
|
-
function
|
|
5563
|
-
return r(async (r) =>
|
|
5588
|
+
function $s(e, t, n) {
|
|
5589
|
+
return r(async (r) => Xs(await Qs(t.callTool({
|
|
5564
5590
|
name: e.name,
|
|
5565
5591
|
arguments: r
|
|
5566
5592
|
}), e.name, n)), {
|
|
@@ -5569,8 +5595,8 @@ function Qs(e, t, n) {
|
|
|
5569
5595
|
schema: e.inputSchema
|
|
5570
5596
|
});
|
|
5571
5597
|
}
|
|
5572
|
-
async function
|
|
5573
|
-
let { Client: t } = await import("@modelcontextprotocol/sdk/client"), n = await
|
|
5598
|
+
async function ec(e) {
|
|
5599
|
+
let { Client: t } = await import("@modelcontextprotocol/sdk/client"), n = await Zs(e), r = new t({
|
|
5574
5600
|
name: "page-agent-sdk",
|
|
5575
5601
|
version: "1.0"
|
|
5576
5602
|
}, { capabilities: {} }), i = e.timeoutMs ?? 15e3, a;
|
|
@@ -5588,70 +5614,70 @@ async function $s(e) {
|
|
|
5588
5614
|
}
|
|
5589
5615
|
let { tools: o } = await r.listTools();
|
|
5590
5616
|
return {
|
|
5591
|
-
tools: o.map((t) =>
|
|
5617
|
+
tools: o.map((t) => $s(t, r, e.callTimeoutMs ?? 6e4)),
|
|
5592
5618
|
close: () => r.close()
|
|
5593
5619
|
};
|
|
5594
5620
|
}
|
|
5595
5621
|
//#endregion
|
|
5596
5622
|
//#region src/core/sdk/promptBuilder.ts
|
|
5597
|
-
var
|
|
5623
|
+
var tc = [
|
|
5598
5624
|
"你是一个 JSON 操作助手。集成方声明了一个主数据对象(含 zod schema 校验),你通过专用工具安全地读写它来完成任务。",
|
|
5599
5625
|
"所有写操作都经范围控制(仅 schema 声明字段内)与 schema 校验(不合法会返回结构化错误而非写入),并自动留快照可回退。",
|
|
5600
5626
|
"大对象/数组优先用增量 patch(只发改动)而非整体重传,避免输出被截断。",
|
|
5601
5627
|
"---",
|
|
5602
5628
|
ha.reliableWriteRules
|
|
5603
5629
|
].join("\n\n");
|
|
5604
|
-
function
|
|
5630
|
+
function nc(e, t) {
|
|
5605
5631
|
if (!e) return "";
|
|
5606
5632
|
let n = ya(e.schema, t);
|
|
5607
5633
|
return `\n\n## 可操作数据(字段以 read 工具返回的实际值为准)\n${e.description ? e.description + "\n" : ""}${n}`;
|
|
5608
5634
|
}
|
|
5609
|
-
function
|
|
5635
|
+
function rc(e) {
|
|
5610
5636
|
let t = e.appendReliableWriteRules !== !1;
|
|
5611
|
-
return e.systemPrompt ? t ? e.systemPrompt + "\n\n---\n\n" + ha.reliableWriteRules : e.systemPrompt :
|
|
5637
|
+
return e.systemPrompt ? t ? e.systemPrompt + "\n\n---\n\n" + ha.reliableWriteRules : e.systemPrompt : tc;
|
|
5612
5638
|
}
|
|
5613
|
-
var
|
|
5639
|
+
var ic = {
|
|
5614
5640
|
largeResults: 4 * 1024 * 1024,
|
|
5615
5641
|
drafts: 2 * 1024 * 1024,
|
|
5616
5642
|
userFiles: 2 * 1024 * 1024,
|
|
5617
5643
|
resources: 4 * 1024 * 1024
|
|
5618
|
-
},
|
|
5644
|
+
}, ac = [
|
|
5619
5645
|
"largeResults",
|
|
5620
5646
|
"drafts",
|
|
5621
5647
|
"userFiles",
|
|
5622
5648
|
"resources"
|
|
5623
|
-
],
|
|
5624
|
-
function
|
|
5649
|
+
], oc = .9;
|
|
5650
|
+
function sc(e, t = {}) {
|
|
5625
5651
|
let n = Object.create(null);
|
|
5626
|
-
if (e) for (let [t, r] of Object.entries(e)) n[
|
|
5652
|
+
if (e) for (let [t, r] of Object.entries(e)) n[dc(t)] = {
|
|
5627
5653
|
content: r,
|
|
5628
|
-
updatedAt:
|
|
5654
|
+
updatedAt: pc()
|
|
5629
5655
|
};
|
|
5630
5656
|
let { persist: r } = t, i = t.maxBytes ?? 8388608, a = {
|
|
5631
|
-
...
|
|
5657
|
+
...ic,
|
|
5632
5658
|
...t.poolBytes ?? {}
|
|
5633
5659
|
};
|
|
5634
5660
|
function o(e) {
|
|
5635
|
-
let t =
|
|
5661
|
+
let t = dc(e);
|
|
5636
5662
|
return t.startsWith("large_results/") ? "largeResults" : t.startsWith("drafts/") ? "drafts" : t.startsWith("resources/") ? "resources" : "userFiles";
|
|
5637
5663
|
}
|
|
5638
5664
|
function s(e) {
|
|
5639
5665
|
let t = 0;
|
|
5640
|
-
for (let [r, i] of Object.entries(n)) o(r) === e && (t +=
|
|
5666
|
+
for (let [r, i] of Object.entries(n)) o(r) === e && (t += lc(i.content));
|
|
5641
5667
|
return t;
|
|
5642
5668
|
}
|
|
5643
5669
|
function c() {
|
|
5644
|
-
for (let e of
|
|
5670
|
+
for (let e of ac) {
|
|
5645
5671
|
let t = a[e];
|
|
5646
5672
|
if (s(e) <= t) continue;
|
|
5647
|
-
let r = t *
|
|
5673
|
+
let r = t * oc, i = e === "largeResults", c = i && s(e) > t * 1.5;
|
|
5648
5674
|
c && console.warn(`[page-agent-sdk] vfs large_results 池 ${s(e)} > ${Math.round(t * 1.5)}(被引用撑爆)→ 无视 protectedRefs 强制删`);
|
|
5649
5675
|
let l = Object.entries(n).filter(([t]) => o(t) === e).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
|
|
5650
5676
|
for (let [t] of l) if (!(i && !c && u.has(t)) && (delete n[t], s(e) <= r)) break;
|
|
5651
5677
|
}
|
|
5652
|
-
if (
|
|
5653
|
-
let e = i *
|
|
5654
|
-
for (let [i] of r) if (!(o(i) === "largeResults" && !t && u.has(i)) && (delete n[i],
|
|
5678
|
+
if (uc(n) > i) {
|
|
5679
|
+
let e = i * oc, t = uc(n) > i * 1.5, r = Object.entries(n).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
|
|
5680
|
+
for (let [i] of r) if (!(o(i) === "largeResults" && !t && u.has(i)) && (delete n[i], uc(n) <= e)) break;
|
|
5655
5681
|
}
|
|
5656
5682
|
}
|
|
5657
5683
|
let l = !0, u = /* @__PURE__ */ new Set(), d = null;
|
|
@@ -5687,7 +5713,7 @@ function oc(e, t = {}) {
|
|
|
5687
5713
|
}
|
|
5688
5714
|
};
|
|
5689
5715
|
return r && (m.hydrate = (e) => {
|
|
5690
|
-
for (let [t, r] of Object.entries(e)) n[
|
|
5716
|
+
for (let [t, r] of Object.entries(e)) n[dc(t)] = r;
|
|
5691
5717
|
c(), l = !0;
|
|
5692
5718
|
}, m.flush = () => {
|
|
5693
5719
|
d &&= (clearTimeout(d), null), f();
|
|
@@ -5696,19 +5722,19 @@ function oc(e, t = {}) {
|
|
|
5696
5722
|
p(), l = !0;
|
|
5697
5723
|
}), m;
|
|
5698
5724
|
}
|
|
5699
|
-
var
|
|
5700
|
-
function cc(e) {
|
|
5701
|
-
return sc ||= new TextEncoder(), sc.encode(e).length;
|
|
5702
|
-
}
|
|
5725
|
+
var cc = null;
|
|
5703
5726
|
function lc(e) {
|
|
5727
|
+
return cc ||= new TextEncoder(), cc.encode(e).length;
|
|
5728
|
+
}
|
|
5729
|
+
function uc(e) {
|
|
5704
5730
|
let t = 0;
|
|
5705
|
-
for (let n of Object.values(e)) t +=
|
|
5731
|
+
for (let n of Object.values(e)) t += lc(n.content);
|
|
5706
5732
|
return t;
|
|
5707
5733
|
}
|
|
5708
|
-
function
|
|
5734
|
+
function dc(e) {
|
|
5709
5735
|
return e.replace(/^\/+/, "").replace(/\/+/g, "/");
|
|
5710
5736
|
}
|
|
5711
|
-
function
|
|
5737
|
+
function fc(e) {
|
|
5712
5738
|
let t = "";
|
|
5713
5739
|
for (let n = 0; n < e.length; n++) {
|
|
5714
5740
|
let r = e[n];
|
|
@@ -5716,10 +5742,10 @@ function dc(e) {
|
|
|
5716
5742
|
}
|
|
5717
5743
|
return RegExp("^" + t + "$");
|
|
5718
5744
|
}
|
|
5719
|
-
function
|
|
5745
|
+
function pc() {
|
|
5720
5746
|
return Date.now();
|
|
5721
5747
|
}
|
|
5722
|
-
var
|
|
5748
|
+
var mc = [
|
|
5723
5749
|
"vfs_read",
|
|
5724
5750
|
"vfs_write",
|
|
5725
5751
|
"vfs_edit",
|
|
@@ -5730,10 +5756,10 @@ var pc = [
|
|
|
5730
5756
|
"vfs_json_patch",
|
|
5731
5757
|
"vfs_rm"
|
|
5732
5758
|
];
|
|
5733
|
-
function
|
|
5759
|
+
function hc(e) {
|
|
5734
5760
|
return [
|
|
5735
5761
|
r(async ({ path: t, offset: n, limit: r }) => {
|
|
5736
|
-
let i = e.files[
|
|
5762
|
+
let i = e.files[dc(t)];
|
|
5737
5763
|
if (!i) return Y({
|
|
5738
5764
|
code: "NOT_FOUND",
|
|
5739
5765
|
path: t,
|
|
@@ -5762,9 +5788,9 @@ function mc(e) {
|
|
|
5762
5788
|
hint: "jsonString=true 要求 content 是合法 JSON;检查引号/逗号/括号配对;或省略 jsonString 写纯文本"
|
|
5763
5789
|
});
|
|
5764
5790
|
}
|
|
5765
|
-
return e.files[
|
|
5791
|
+
return e.files[dc(t)] = {
|
|
5766
5792
|
content: n,
|
|
5767
|
-
updatedAt:
|
|
5793
|
+
updatedAt: pc()
|
|
5768
5794
|
}, `已写入 ${t}(${n.length} 字符)${r ? "(JSON 校验通过)" : ""}`;
|
|
5769
5795
|
}, {
|
|
5770
5796
|
name: "vfs_write",
|
|
@@ -5776,7 +5802,7 @@ function mc(e) {
|
|
|
5776
5802
|
})
|
|
5777
5803
|
}),
|
|
5778
5804
|
r(async ({ path: t, oldString: n, newString: r }) => {
|
|
5779
|
-
let i =
|
|
5805
|
+
let i = dc(t), a = e.files[i];
|
|
5780
5806
|
if (!a) return Y({
|
|
5781
5807
|
code: "NOT_FOUND",
|
|
5782
5808
|
path: t,
|
|
@@ -5806,7 +5832,7 @@ function mc(e) {
|
|
|
5806
5832
|
}
|
|
5807
5833
|
return e.files[i] = {
|
|
5808
5834
|
content: a.content.replace(n, r),
|
|
5809
|
-
updatedAt:
|
|
5835
|
+
updatedAt: pc()
|
|
5810
5836
|
}, `已替换 ${t} 中 1 处。`;
|
|
5811
5837
|
}, {
|
|
5812
5838
|
name: "vfs_edit",
|
|
@@ -5828,7 +5854,7 @@ function mc(e) {
|
|
|
5828
5854
|
r(async ({ pattern: t }) => {
|
|
5829
5855
|
let n;
|
|
5830
5856
|
try {
|
|
5831
|
-
n =
|
|
5857
|
+
n = fc(t);
|
|
5832
5858
|
} catch (e) {
|
|
5833
5859
|
return Y({
|
|
5834
5860
|
code: "GLOB_INVALID",
|
|
@@ -5857,7 +5883,7 @@ function mc(e) {
|
|
|
5857
5883
|
details: { pattern: t }
|
|
5858
5884
|
});
|
|
5859
5885
|
}
|
|
5860
|
-
let i = n ? [
|
|
5886
|
+
let i = n ? [dc(n)] : Object.keys(e.files), a = [];
|
|
5861
5887
|
for (let t of i) {
|
|
5862
5888
|
let n = e.files[t];
|
|
5863
5889
|
n && n.content.split("\n").forEach((e, n) => {
|
|
@@ -5874,7 +5900,7 @@ function mc(e) {
|
|
|
5874
5900
|
})
|
|
5875
5901
|
}),
|
|
5876
5902
|
r(async ({ path: t, jsonPath: n }) => {
|
|
5877
|
-
let r =
|
|
5903
|
+
let r = dc(t), i = e.files[r];
|
|
5878
5904
|
if (!i) return Y({
|
|
5879
5905
|
code: "NOT_FOUND",
|
|
5880
5906
|
path: t,
|
|
@@ -5911,7 +5937,7 @@ function mc(e) {
|
|
|
5911
5937
|
})
|
|
5912
5938
|
}),
|
|
5913
5939
|
r(async ({ path: t, patches: n }) => {
|
|
5914
|
-
let r =
|
|
5940
|
+
let r = dc(t), i = e.files[r];
|
|
5915
5941
|
if (!i) return Y({
|
|
5916
5942
|
code: "NOT_FOUND",
|
|
5917
5943
|
path: t,
|
|
@@ -5944,7 +5970,7 @@ function mc(e) {
|
|
|
5944
5970
|
let c = JSON.stringify(o);
|
|
5945
5971
|
return e.files[r] = {
|
|
5946
5972
|
content: c,
|
|
5947
|
-
updatedAt:
|
|
5973
|
+
updatedAt: pc()
|
|
5948
5974
|
}, `已对 ${t} 应用 ${n.length} 个 patch(影响 ${s.length} 处:${s.join(", ")}),文件现 ${c.length} 字符`;
|
|
5949
5975
|
}, {
|
|
5950
5976
|
name: "vfs_json_patch",
|
|
@@ -5964,7 +5990,7 @@ function mc(e) {
|
|
|
5964
5990
|
})
|
|
5965
5991
|
}),
|
|
5966
5992
|
r(async ({ path: t }) => {
|
|
5967
|
-
let n =
|
|
5993
|
+
let n = dc(t);
|
|
5968
5994
|
return e.files[n] ? (delete e.files[n], `已删除 ${t}`) : Y({
|
|
5969
5995
|
code: "NOT_FOUND",
|
|
5970
5996
|
path: t,
|
|
@@ -5978,16 +6004,16 @@ function mc(e) {
|
|
|
5978
6004
|
})
|
|
5979
6005
|
];
|
|
5980
6006
|
}
|
|
5981
|
-
function
|
|
6007
|
+
function gc(e) {
|
|
5982
6008
|
return {
|
|
5983
6009
|
name: "vfs",
|
|
5984
|
-
tools:
|
|
6010
|
+
tools: hc(e),
|
|
5985
6011
|
beforeAgent: () => ({ files: e.files })
|
|
5986
6012
|
};
|
|
5987
6013
|
}
|
|
5988
6014
|
//#endregion
|
|
5989
6015
|
//#region src/core/tools/htmlValidate.ts
|
|
5990
|
-
var
|
|
6016
|
+
var _c = /* @__PURE__ */ new Set([
|
|
5991
6017
|
"area",
|
|
5992
6018
|
"base",
|
|
5993
6019
|
"br",
|
|
@@ -6002,8 +6028,8 @@ var gc = /* @__PURE__ */ new Set([
|
|
|
6002
6028
|
"source",
|
|
6003
6029
|
"track",
|
|
6004
6030
|
"wbr"
|
|
6005
|
-
]),
|
|
6006
|
-
function
|
|
6031
|
+
]), vc = /* @__PURE__ */ new Set(["script", "style"]);
|
|
6032
|
+
function yc(e) {
|
|
6007
6033
|
let t = [], n = e.length;
|
|
6008
6034
|
if (!e.trim()) return t;
|
|
6009
6035
|
let r = [0];
|
|
@@ -6080,8 +6106,8 @@ function vc(e) {
|
|
|
6080
6106
|
}
|
|
6081
6107
|
continue;
|
|
6082
6108
|
}
|
|
6083
|
-
if (!(
|
|
6084
|
-
if (
|
|
6109
|
+
if (!(_c.has(p) || m)) {
|
|
6110
|
+
if (vc.has(p)) {
|
|
6085
6111
|
let n = RegExp(`</${p}\\s*>`, "i").exec(e.slice(o));
|
|
6086
6112
|
if (!n) {
|
|
6087
6113
|
t.push({
|
|
@@ -6110,8 +6136,8 @@ function vc(e) {
|
|
|
6110
6136
|
}
|
|
6111
6137
|
//#endregion
|
|
6112
6138
|
//#region src/core/sdk/codeAssetMiddleware.ts
|
|
6113
|
-
var
|
|
6114
|
-
function
|
|
6139
|
+
var bc = "__pgTouched", xc = "__pgFinalText", Sc = "__pgNotes", Cc = 200;
|
|
6140
|
+
function wc(e) {
|
|
6115
6141
|
let t = [];
|
|
6116
6142
|
for (let n of e.split("\n")) {
|
|
6117
6143
|
let e = n.match(/^\s*[-*]?\s*\[note\]\s*(.*)$/i);
|
|
@@ -6119,16 +6145,16 @@ function Cc(e) {
|
|
|
6119
6145
|
}
|
|
6120
6146
|
return [...new Set(t)];
|
|
6121
6147
|
}
|
|
6122
|
-
function wc(e, t) {
|
|
6123
|
-
let n = Array.isArray(e[xc]) ? e[xc].filter((e) => typeof e == "string") : [];
|
|
6124
|
-
e[xc] = [.../* @__PURE__ */ new Set([...n, ...t])].map((e) => e.length > Sc ? e.slice(0, Sc) + "…" : e).slice(-5);
|
|
6125
|
-
}
|
|
6126
6148
|
function Tc(e, t) {
|
|
6149
|
+
let n = Array.isArray(e[Sc]) ? e[Sc].filter((e) => typeof e == "string") : [];
|
|
6150
|
+
e[Sc] = [.../* @__PURE__ */ new Set([...n, ...t])].map((e) => e.length > Cc ? e.slice(0, Cc) + "…" : e).slice(-5);
|
|
6151
|
+
}
|
|
6152
|
+
function Ec(e, t) {
|
|
6127
6153
|
if (!e.startsWith(t)) return null;
|
|
6128
6154
|
let n = e.slice(t.length), r = n.lastIndexOf(".");
|
|
6129
6155
|
return (r > 0 ? n.slice(0, r) : r === 0 ? "" : n) || null;
|
|
6130
6156
|
}
|
|
6131
|
-
function
|
|
6157
|
+
function Dc(e, t, n) {
|
|
6132
6158
|
if (!(!e || typeof e != "object")) for (let r of t) {
|
|
6133
6159
|
let t = Z(e, r);
|
|
6134
6160
|
if (Array.isArray(t)) for (let e = 0; e < t.length; e++) {
|
|
@@ -6137,7 +6163,7 @@ function Ec(e, t, n) {
|
|
|
6137
6163
|
}
|
|
6138
6164
|
}
|
|
6139
6165
|
}
|
|
6140
|
-
function
|
|
6166
|
+
function Oc(e, t, n) {
|
|
6141
6167
|
let r = /* @__PURE__ */ new Set();
|
|
6142
6168
|
if (!e || typeof e != "object") return r;
|
|
6143
6169
|
for (let i of t) {
|
|
@@ -6156,13 +6182,13 @@ function Dc(e, t, n) {
|
|
|
6156
6182
|
}
|
|
6157
6183
|
return r;
|
|
6158
6184
|
}
|
|
6159
|
-
function
|
|
6185
|
+
function kc(e) {
|
|
6160
6186
|
let { writablePaths: t, codeVfsPrefix: n, ext: r, codeField: i = "code", onWarning: a, getController: o, vfsStore: s, craftNotes: c = !0 } = e;
|
|
6161
6187
|
return {
|
|
6162
6188
|
name: "code-asset-checkout-commit",
|
|
6163
6189
|
beforeAgent: (e) => {
|
|
6164
6190
|
let c = o()?.get?.().bind, l = 0, u = 0;
|
|
6165
|
-
if (
|
|
6191
|
+
if (Dc(c, t, (e) => {
|
|
6166
6192
|
l++;
|
|
6167
6193
|
let t = Z(e, i);
|
|
6168
6194
|
if (typeof t == "string") {
|
|
@@ -6186,21 +6212,21 @@ function Oc(e) {
|
|
|
6186
6212
|
}
|
|
6187
6213
|
return {
|
|
6188
6214
|
files: s.files,
|
|
6189
|
-
[
|
|
6190
|
-
[
|
|
6215
|
+
[bc]: /* @__PURE__ */ new Set(),
|
|
6216
|
+
[xc]: { text: "" }
|
|
6191
6217
|
};
|
|
6192
6218
|
},
|
|
6193
6219
|
wrapModelCall: async (e, t) => {
|
|
6194
|
-
let n = await t(e), r = e.state[
|
|
6220
|
+
let n = await t(e), r = e.state[xc];
|
|
6195
6221
|
return r && !(n.toolCalls && n.toolCalls.length) && typeof n.content == "string" && n.content && (r.text = n.content), n;
|
|
6196
6222
|
},
|
|
6197
6223
|
augmentPrompt: () => {
|
|
6198
6224
|
let e = o()?.get?.().bind, i = [], a = 0;
|
|
6199
|
-
if (
|
|
6225
|
+
if (Dc(e, t, (e, t, o) => {
|
|
6200
6226
|
a++;
|
|
6201
6227
|
let l = typeof e.name == "string" && e.name ? e.name : "", u = l ? `${l} [${o}]` : `(未命名 [${o}])`, d = `${n}${e.__pgId}.${r}`, f = !!s.files[d];
|
|
6202
6228
|
if (i.push(`- ${u} → ${d}${f ? "" : "(尚未检出,先 vfs_write 创建)"}`), c) {
|
|
6203
|
-
let t = Array.isArray(e[
|
|
6229
|
+
let t = Array.isArray(e[Sc]) ? e[Sc].filter((e) => typeof e == "string") : [];
|
|
6204
6230
|
if (t.length) {
|
|
6205
6231
|
let e = t[t.length - 1];
|
|
6206
6232
|
i.push(` 📝 笔记×${t.length}(最近):${e.length > 120 ? e.slice(0, 120) + "…" : e}`);
|
|
@@ -6218,13 +6244,13 @@ function Oc(e) {
|
|
|
6218
6244
|
return `## 组件代码文件地图(改组件时按 name 直接改对应 vfs 文件;框架自动 checkout/commit)${c ? "\n📝 笔记 = 前任维护者交接(设计决策/用户反馈/踩坑),改该组件时遵循;收口回复末行必须附一行 [note] 交接笔记(本组件本次的实现要点),框架存进组件转交下任" : ""}\n${i.join("\n")}${l}`;
|
|
6219
6245
|
},
|
|
6220
6246
|
wrapToolCall: async (e, i) => {
|
|
6221
|
-
let a = e.name === "vfs_write" || e.name === "vfs_edit" || e.name === "vfs_rm" ? e.args?.path : void 0, s = typeof a == "string" ?
|
|
6247
|
+
let a = e.name === "vfs_write" || e.name === "vfs_edit" || e.name === "vfs_rm" ? e.args?.path : void 0, s = typeof a == "string" ? dc(a) : void 0, c = typeof s == "string" && s.startsWith(n);
|
|
6222
6248
|
if (c) {
|
|
6223
6249
|
let i = e.state.focuses;
|
|
6224
6250
|
if (i && i.length) {
|
|
6225
|
-
let e =
|
|
6251
|
+
let e = Oc(o()?.get?.().bind, t, i);
|
|
6226
6252
|
if (e.size) {
|
|
6227
|
-
let t =
|
|
6253
|
+
let t = Ec(s, n);
|
|
6228
6254
|
if (t && !e.has(t)) return {
|
|
6229
6255
|
content: `PATH_DENIED · vfs 越界:当前聚焦代码文件 [${[...e].map((e) => `${n}${e}.${r}`).join(", ")}],你要改的 "${s}" 不在其中。请只改焦点组件的代码文件;如需改其他组件,请在收口回复中说明需先取消聚焦(焦点由主会话/用户管理,你无 focus 工具)后重试。`,
|
|
6230
6256
|
status: "error"
|
|
@@ -6234,7 +6260,7 @@ function Oc(e) {
|
|
|
6234
6260
|
}
|
|
6235
6261
|
let l = await i(e);
|
|
6236
6262
|
if (c) {
|
|
6237
|
-
let t = e.state[
|
|
6263
|
+
let t = e.state[bc];
|
|
6238
6264
|
t && t.add(s);
|
|
6239
6265
|
}
|
|
6240
6266
|
return l;
|
|
@@ -6242,17 +6268,17 @@ function Oc(e) {
|
|
|
6242
6268
|
afterAgent: (e) => {
|
|
6243
6269
|
let a = o(), l = a?.get?.().bind;
|
|
6244
6270
|
if (!l) return;
|
|
6245
|
-
let u = e[
|
|
6271
|
+
let u = e[bc] ?? /* @__PURE__ */ new Set();
|
|
6246
6272
|
if (u.size) {
|
|
6247
6273
|
let e = /* @__PURE__ */ new Set();
|
|
6248
|
-
|
|
6274
|
+
Dc(l, t, (t) => {
|
|
6249
6275
|
let a = t.__pgId;
|
|
6250
6276
|
e.add(a);
|
|
6251
6277
|
let o = `${n}${a}.${r}`;
|
|
6252
6278
|
if (u.has(o)) {
|
|
6253
6279
|
let e = s.files[o];
|
|
6254
6280
|
if (e && typeof e.content == "string") {
|
|
6255
|
-
let n =
|
|
6281
|
+
let n = yc(e.content);
|
|
6256
6282
|
if (n.length) {
|
|
6257
6283
|
console.warn(`[page-agent-sdk][code-asset] 跳过 commit 未通过校验的半成品(可能 abort/timeout 未跑完 verify):${o} - ${n[0].message}(${n[0].code})`);
|
|
6258
6284
|
return;
|
|
@@ -6262,22 +6288,22 @@ function Oc(e) {
|
|
|
6262
6288
|
}
|
|
6263
6289
|
});
|
|
6264
6290
|
for (let t of u) {
|
|
6265
|
-
let r =
|
|
6291
|
+
let r = Ec(t, n);
|
|
6266
6292
|
r && !e.has(r) && delete s.files[t];
|
|
6267
6293
|
}
|
|
6268
6294
|
a?.markDataDirty?.(), a?.recomputeBaseline?.();
|
|
6269
6295
|
}
|
|
6270
6296
|
if (!c) return;
|
|
6271
|
-
let d =
|
|
6297
|
+
let d = wc(e[xc]?.text ?? "");
|
|
6272
6298
|
if (!d.length) return;
|
|
6273
6299
|
let f = [];
|
|
6274
|
-
if (
|
|
6300
|
+
if (Dc(l, t, (e) => {
|
|
6275
6301
|
(u.size === 0 || u.has(`${n}${e.__pgId}.${r}`)) && f.push(e);
|
|
6276
6302
|
}), !f.length) return;
|
|
6277
6303
|
let p = !1;
|
|
6278
6304
|
for (let e of d) {
|
|
6279
6305
|
let t = f.length === 1 ? f[0] : f.find((t) => typeof t.name == "string" && !!t.name && e.includes(t.name));
|
|
6280
|
-
t && (
|
|
6306
|
+
t && (Tc(t, [e]), p = !0);
|
|
6281
6307
|
}
|
|
6282
6308
|
p && a?.markDataDirty?.();
|
|
6283
6309
|
}
|
|
@@ -6285,7 +6311,7 @@ function Oc(e) {
|
|
|
6285
6311
|
}
|
|
6286
6312
|
//#endregion
|
|
6287
6313
|
//#region src/core/sdk/htmlSubagent.ts
|
|
6288
|
-
function
|
|
6314
|
+
function Ac(e, t, n) {
|
|
6289
6315
|
let r = "html";
|
|
6290
6316
|
return `你是纯代码组件生成专家。可用工具:vfs_write / vfs_edit / vfs_rm(写/改/删代码工作副本 vfs ${e}) / vfs_read + vfs_grep(读 vfs) / validate_code(代码格式自检) / write(写 data,writablePaths 限定;set/patch 增量或整体) / read / write_todos + update_todo(规划)。
|
|
6291
6317
|
|
|
@@ -6337,7 +6363,7 @@ ${`- 输出形态:完整、自包含的 HTML 页面(.${r},可独立成页)`}
|
|
|
6337
6363
|
- 一次想清楚 → 动手 → 验证 → 收口。**思考是手段不是目的,产出代码才是**。
|
|
6338
6364
|
8. **收口格式(必守,最后一行)**:收口回复 = 简短结果总结 + **末行交接笔记** \`[note] <一句话实现要点>\` —— 关键设计决策 / 用户偏好 / 踩坑(如「[note] 液面用 height keyframes 4.2s 循环;装饰仅灯串+光斑 2 类」)。框架只识别末尾 [note] 行存进组件、自动转交下次维护该组件的子 agent;**漏写 = 下任失去交接**(真 LLM 实测漏写率 3/4,务必末行带上)。一行内,只写可复用结论。`;
|
|
6339
6365
|
}
|
|
6340
|
-
function
|
|
6366
|
+
function jc(e, t) {
|
|
6341
6367
|
return `# HTML 完整页面生成规范
|
|
6342
6368
|
|
|
6343
6369
|
## 代码资产模型(重要)
|
|
@@ -6375,14 +6401,14 @@ function Ac(e, t) {
|
|
|
6375
6401
|
- 语义化标签(button / nav / section);图片 alt;交互可键盘聚焦
|
|
6376
6402
|
- 颜色对比达标;不只用颜色传达信息`;
|
|
6377
6403
|
}
|
|
6378
|
-
function
|
|
6404
|
+
function Mc(e = "components", t = "code") {
|
|
6379
6405
|
return {
|
|
6380
6406
|
name: "html-fragment",
|
|
6381
6407
|
description: "完整 HTML 页面生成规范:代码作为 data 资产 / vfs 工作副本 / 完整自包含可独立成页 / script+CSS 集中放置 / 可引外部 JS/CSS / validate_code 自检 / 安全底线 / 可访问性",
|
|
6382
|
-
getContent: () =>
|
|
6408
|
+
getContent: () => jc(e, t)
|
|
6383
6409
|
};
|
|
6384
6410
|
}
|
|
6385
|
-
function
|
|
6411
|
+
function Nc(e = {}) {
|
|
6386
6412
|
let t = e.vfsPrefix ?? "html/";
|
|
6387
6413
|
return ({ state: e }) => {
|
|
6388
6414
|
let n = e.files;
|
|
@@ -6390,7 +6416,7 @@ function Mc(e = {}) {
|
|
|
6390
6416
|
let r = [];
|
|
6391
6417
|
for (let [e, i] of Object.entries(n)) {
|
|
6392
6418
|
if (!e.startsWith(t)) continue;
|
|
6393
|
-
let n =
|
|
6419
|
+
let n = yc(i.content);
|
|
6394
6420
|
for (let t of n) r.push(`${e} 第 ${t.line} 行:${t.message}(${t.code})`);
|
|
6395
6421
|
}
|
|
6396
6422
|
return r.length ? {
|
|
@@ -6399,7 +6425,7 @@ function Mc(e = {}) {
|
|
|
6399
6425
|
} : { ok: !0 };
|
|
6400
6426
|
};
|
|
6401
6427
|
}
|
|
6402
|
-
function
|
|
6428
|
+
function Pc(e) {
|
|
6403
6429
|
let n, i, a = {
|
|
6404
6430
|
name: "html-validate-tools",
|
|
6405
6431
|
beforeAgent: (e) => {
|
|
@@ -6434,7 +6460,7 @@ function Nc(e) {
|
|
|
6434
6460
|
}
|
|
6435
6461
|
let s = [];
|
|
6436
6462
|
for (let e of o) {
|
|
6437
|
-
let t =
|
|
6463
|
+
let t = yc(e.content);
|
|
6438
6464
|
t.length && s.push(`${e.path}:\n${t.map((e) => ` 第 ${e.line} 行 ${e.message}(${e.code})`).join("\n")}`);
|
|
6439
6465
|
}
|
|
6440
6466
|
return s.length ? `❌ 格式校验未通过:\n${s.join("\n")}\n请用 vfs_edit 修正后重新调用 validate_code 复查。` : `✅ 格式校验通过(${o.map((e) => e.path).join(", ")}:标签闭合等结构合法)。`;
|
|
@@ -6452,16 +6478,16 @@ function Nc(e) {
|
|
|
6452
6478
|
i = e;
|
|
6453
6479
|
}, a;
|
|
6454
6480
|
}
|
|
6455
|
-
var
|
|
6456
|
-
function
|
|
6481
|
+
var Fc = 2;
|
|
6482
|
+
function Ic(e = {}) {
|
|
6457
6483
|
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, formatCheck: d = !0, codeField: f = "code", orchestratorPrompt: p = !0, craftNotes: m = !0 } = e;
|
|
6458
6484
|
if (t !== void 0 && !Array.isArray(t)) throw Error("[page-agent-sdk][createHtmlSubagent] writablePaths 须为字符串数组(代码组件 data 区,如 [\"components\"])/ 省略以从 schema 自动推断");
|
|
6459
6485
|
let h = [];
|
|
6460
|
-
a && h.push(wa()), d && (h.push(
|
|
6486
|
+
a && h.push(wa()), d && (h.push(Pc(n)), h.push(ks({ check: Nc({ vfsPrefix: n }) })));
|
|
6461
6487
|
let g = u ?? [], _ = t?.[0] ?? "components", v = l === void 0, y = {
|
|
6462
6488
|
id: r,
|
|
6463
6489
|
description: i ?? `生成/修改纯代码组件(代码作为 data 资产,代码字段 ${f} 随 data 持久化;vfs 作工作副本;能规划(write_todos)+ 执行)。需写代码组件或灵活定制时委派`,
|
|
6464
|
-
systemPrompt:
|
|
6490
|
+
systemPrompt: Ac(n, f, _),
|
|
6465
6491
|
writablePaths: t ?? [],
|
|
6466
6492
|
allowedTools: [
|
|
6467
6493
|
"vfs_write",
|
|
@@ -6472,9 +6498,9 @@ function Fc(e = {}) {
|
|
|
6472
6498
|
],
|
|
6473
6499
|
middleware: h.length ? h : void 0,
|
|
6474
6500
|
summarization: o === !1 ? void 0 : o,
|
|
6475
|
-
maxVerifyAttempts: d ?
|
|
6501
|
+
maxVerifyAttempts: d ? Fc : void 0,
|
|
6476
6502
|
temperature: c,
|
|
6477
|
-
skills: v ? [
|
|
6503
|
+
skills: v ? [Mc(_, f)] : l,
|
|
6478
6504
|
maxToolRounds: s,
|
|
6479
6505
|
tools: g.length ? g : void 0,
|
|
6480
6506
|
_codeAsset: {
|
|
@@ -6487,12 +6513,12 @@ function Fc(e = {}) {
|
|
|
6487
6513
|
}
|
|
6488
6514
|
};
|
|
6489
6515
|
return y._rebuildCodeAssetPaths = (e) => {
|
|
6490
|
-
y.systemPrompt =
|
|
6516
|
+
y.systemPrompt = Ac(n, f, e), v && (y.skills = [Mc(e, f)]);
|
|
6491
6517
|
}, y;
|
|
6492
6518
|
}
|
|
6493
6519
|
//#endregion
|
|
6494
6520
|
//#region src/core/sdk/defineTool.ts
|
|
6495
|
-
function
|
|
6521
|
+
function Lc(e) {
|
|
6496
6522
|
return r(async (t) => {
|
|
6497
6523
|
let n = await e.handler(t);
|
|
6498
6524
|
return typeof n == "string" ? n : JSON.stringify(n);
|
|
@@ -6504,7 +6530,7 @@ function Ic(e) {
|
|
|
6504
6530
|
}
|
|
6505
6531
|
//#endregion
|
|
6506
6532
|
//#region src/core/sdk/inspectContextTool.ts
|
|
6507
|
-
var
|
|
6533
|
+
var Rc = t.object({
|
|
6508
6534
|
path: t.string().optional().describe("分类 key 过滤(如 toolResults/history/systemPrompt/dataHint);不传=全部分类"),
|
|
6509
6535
|
role: t.enum([
|
|
6510
6536
|
"user",
|
|
@@ -6514,14 +6540,14 @@ var Lc = t.object({
|
|
|
6514
6540
|
]).optional().describe("聚焦每轮首句的角色(assistant→回复摘要,user→问题摘要);不影响工具列表"),
|
|
6515
6541
|
limit: t.number().int().min(1).max(50).optional().describe("返回最近 N 轮(默认全部;超 50 自动截最近 50 防返回过大)")
|
|
6516
6542
|
});
|
|
6517
|
-
function
|
|
6518
|
-
return
|
|
6543
|
+
function zc(e) {
|
|
6544
|
+
return Lc({
|
|
6519
6545
|
name: "inspect_context",
|
|
6520
6546
|
description: "查看当前对话上下文的构成(供压缩决策)。返回:totalTokens(历史轮次 token 总和,与触发判断同口径)、occupancy(窗口占用比)、contextWindow、categories(分类占用)、rounds(每轮 token/工具/首句)。先调用本工具查看构成,再决定压缩策略。",
|
|
6521
|
-
schema:
|
|
6547
|
+
schema: Rc,
|
|
6522
6548
|
handler: (t) => {
|
|
6523
|
-
let n =
|
|
6524
|
-
let n =
|
|
6549
|
+
let n = Vo(e.getMessages()), r = n.length > 50 ? n.slice(n.length - 50) : n, i = (t.limit && r.length > t.limit ? r.slice(r.length - t.limit) : r).map((e) => {
|
|
6550
|
+
let n = $o(e), r = Uo(e), i = t.role === "assistant" ? e.assistantMsgs[0] ?? e.userMsg : e.userMsg, a = Ho(typeof i.content == "string" ? i.content : "", 60);
|
|
6525
6551
|
return {
|
|
6526
6552
|
round: e.round,
|
|
6527
6553
|
tokens: n,
|
|
@@ -6541,7 +6567,7 @@ function Rc(e) {
|
|
|
6541
6567
|
}
|
|
6542
6568
|
//#endregion
|
|
6543
6569
|
//#region src/core/sdk/compressDecision.ts
|
|
6544
|
-
var
|
|
6570
|
+
var Bc = t.object({
|
|
6545
6571
|
keepRounds: t.number().int().min(0).max(50).optional(),
|
|
6546
6572
|
windowRatio: t.number().min(0).max(1).optional(),
|
|
6547
6573
|
summarize: t.object({ mode: t.enum(["index", "llm"]) }),
|
|
@@ -6551,23 +6577,23 @@ var zc = t.object({
|
|
|
6551
6577
|
}).refine((e) => e.keepRounds !== void 0 || e.windowRatio !== void 0, { message: "keepRounds 与 windowRatio 至少填一个(按当前触发模式)" });
|
|
6552
6578
|
//#endregion
|
|
6553
6579
|
//#region src/core/sdk/llmResolver.ts
|
|
6554
|
-
function
|
|
6580
|
+
function Vc(e) {
|
|
6555
6581
|
let t = e.find((e) => e.role === "user");
|
|
6556
6582
|
if (!t) return;
|
|
6557
6583
|
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, " ");
|
|
6558
6584
|
if (r) return r.length > 30 ? r.slice(0, 30) + "…" : r;
|
|
6559
6585
|
}
|
|
6560
|
-
function
|
|
6586
|
+
function Hc(e) {
|
|
6561
6587
|
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
6562
6588
|
}
|
|
6563
|
-
function
|
|
6589
|
+
function Uc(e) {
|
|
6564
6590
|
let t = e.content;
|
|
6565
6591
|
return typeof t == "string" ? t : Array.isArray(t) ? t.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(t ?? "");
|
|
6566
6592
|
}
|
|
6567
|
-
function
|
|
6593
|
+
function Wc(e) {
|
|
6568
6594
|
let t = e.summaryLlm ?? e.llm;
|
|
6569
6595
|
if (!t) return;
|
|
6570
|
-
let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, i = e.summaryTimeoutMs ?? 15e3, s =
|
|
6596
|
+
let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, i = e.summaryTimeoutMs ?? 15e3, s = Hc(t) ? t : null, c = Hc(t) ? null : t;
|
|
6571
6597
|
if (c && !c.apiKey) {
|
|
6572
6598
|
e.summaryLlm && console.warn("[page-agent-sdk][summarization] summaryLlm 已配置但缺 apiKey,摘要回退主 agent 模型或零成本索引摘要");
|
|
6573
6599
|
return;
|
|
@@ -6579,16 +6605,16 @@ function Uc(e) {
|
|
|
6579
6605
|
return !l && c && (l = await m(c, {
|
|
6580
6606
|
temperature: n,
|
|
6581
6607
|
maxTokens: r
|
|
6582
|
-
})),
|
|
6608
|
+
})), Uc(await l.invoke([new o("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new a(e)], { signal: t.signal })).trim();
|
|
6583
6609
|
} finally {
|
|
6584
6610
|
clearTimeout(s);
|
|
6585
6611
|
}
|
|
6586
6612
|
};
|
|
6587
6613
|
}
|
|
6588
|
-
function
|
|
6614
|
+
function Gc(e) {
|
|
6589
6615
|
let t = e.titleLlm ?? e.summaryLlm ?? e.llm;
|
|
6590
6616
|
if (!t) return;
|
|
6591
|
-
let n =
|
|
6617
|
+
let n = Hc(t) ? t : null, r = Hc(t) ? null : t;
|
|
6592
6618
|
if (r && !r.apiKey) return;
|
|
6593
6619
|
let i = n;
|
|
6594
6620
|
return async (e) => {
|
|
@@ -6597,7 +6623,7 @@ function Wc(e) {
|
|
|
6597
6623
|
return !i && r && (i = await m(r, {
|
|
6598
6624
|
temperature: 0,
|
|
6599
6625
|
maxTokens: 30
|
|
6600
|
-
})),
|
|
6626
|
+
})), Uc(await i.invoke([new o("根据以下对话的主旨,生成一个简短的中文标题(不超过15个字,不要标点和引号,直接输出标题文字)。"), new a(t)], { signal: n.signal })).trim().replace(/^["'""「『]|["'""」』]$/g, "").split("\n")[0].slice(0, 20);
|
|
6601
6627
|
} catch {
|
|
6602
6628
|
return "";
|
|
6603
6629
|
} finally {
|
|
@@ -6605,10 +6631,10 @@ function Wc(e) {
|
|
|
6605
6631
|
}
|
|
6606
6632
|
};
|
|
6607
6633
|
}
|
|
6608
|
-
function
|
|
6634
|
+
function Kc() {
|
|
6609
6635
|
return `call_dec_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
6610
6636
|
}
|
|
6611
|
-
function
|
|
6637
|
+
function qc(e) {
|
|
6612
6638
|
let t = e.match(/```(?:json)?\s*([\s\S]*?)```/), n = t ? t[1] : e, r = n.indexOf("{"), i = n.lastIndexOf("}");
|
|
6613
6639
|
if (r < 0 || i < 0 || i <= r) return null;
|
|
6614
6640
|
try {
|
|
@@ -6617,21 +6643,21 @@ function Kc(e) {
|
|
|
6617
6643
|
return null;
|
|
6618
6644
|
}
|
|
6619
6645
|
}
|
|
6620
|
-
function
|
|
6646
|
+
function Jc(e) {
|
|
6621
6647
|
if (!e) return null;
|
|
6622
|
-
let t =
|
|
6648
|
+
let t = qc(e);
|
|
6623
6649
|
if (t == null) return null;
|
|
6624
|
-
let n =
|
|
6650
|
+
let n = Bc.safeParse(t);
|
|
6625
6651
|
return n.success ? n.data : null;
|
|
6626
6652
|
}
|
|
6627
|
-
async function
|
|
6653
|
+
async function Yc(e, t, n, r) {
|
|
6628
6654
|
let i = [...n];
|
|
6629
6655
|
for (let n = 0; n < 3; n++) {
|
|
6630
6656
|
let n = await e.invoke(i, { signal: r }), a = n?.tool_calls ?? [];
|
|
6631
|
-
if (!a.length) return
|
|
6657
|
+
if (!a.length) return Uc(n).trim();
|
|
6632
6658
|
i = [...i, n];
|
|
6633
6659
|
for (let e of a) {
|
|
6634
|
-
let n = e.id ??
|
|
6660
|
+
let n = e.id ?? Kc();
|
|
6635
6661
|
try {
|
|
6636
6662
|
let r = await t.invoke(e.args ?? {}), a = typeof r == "string" ? r : r?.content ?? JSON.stringify(r);
|
|
6637
6663
|
i = [...i, new s({
|
|
@@ -6648,10 +6674,10 @@ async function Jc(e, t, n, r) {
|
|
|
6648
6674
|
}
|
|
6649
6675
|
return "";
|
|
6650
6676
|
}
|
|
6651
|
-
function
|
|
6677
|
+
function Xc(e) {
|
|
6652
6678
|
let t = e.summaryLlm ?? e.llm;
|
|
6653
6679
|
if (!t) return;
|
|
6654
|
-
let n =
|
|
6680
|
+
let n = Hc(t) ? t : null, r = Hc(t) ? null : t;
|
|
6655
6681
|
if (r && !r.apiKey) return;
|
|
6656
6682
|
let i = e.decisionTimeoutMs ?? 6e3, s = e.decisionMaxTokens ?? 2048, c = n;
|
|
6657
6683
|
return async (e) => {
|
|
@@ -6663,12 +6689,12 @@ function Yc(e) {
|
|
|
6663
6689
|
}));
|
|
6664
6690
|
let n = c;
|
|
6665
6691
|
if (typeof n.bindTools != "function") return null;
|
|
6666
|
-
let i =
|
|
6692
|
+
let i = zc({
|
|
6667
6693
|
getMessages: e.getMessages,
|
|
6668
6694
|
getSnapshot: e.getSnapshot,
|
|
6669
6695
|
contextWindow: e.contextWindow
|
|
6670
6696
|
}), 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)。`)];
|
|
6671
|
-
return
|
|
6697
|
+
return Jc(await Yc(l, i, d, t.signal)) || Jc(await Yc(l, i, [...d, new a("上一次输出无效(JSON 解析失败或 schema 校验不通过)。请只输出符合 schema 的压缩决策 JSON,不要多余文字/markdown 代码块。")], t.signal));
|
|
6672
6698
|
} catch {
|
|
6673
6699
|
return null;
|
|
6674
6700
|
} finally {
|
|
@@ -6676,22 +6702,22 @@ function Yc(e) {
|
|
|
6676
6702
|
}
|
|
6677
6703
|
};
|
|
6678
6704
|
}
|
|
6679
|
-
function
|
|
6680
|
-
let t = e.llm, n =
|
|
6705
|
+
function Zc(e) {
|
|
6706
|
+
let t = e.llm, n = Hc(e.llm) ? void 0 : e.llm;
|
|
6681
6707
|
return {
|
|
6682
6708
|
modelCaps: ai({
|
|
6683
6709
|
model: n?.model ?? t?.model ?? t?.modelName,
|
|
6684
6710
|
contextWindow: e.contextWindow ?? n?.contextWindow ?? t?.contextWindow,
|
|
6685
6711
|
maxOutputTokens: e.maxOutputTokens ?? n?.maxOutputTokens ?? t?.maxOutputTokens
|
|
6686
6712
|
}),
|
|
6687
|
-
summaryLlmInvoke:
|
|
6688
|
-
titleLlmInvoke:
|
|
6689
|
-
compressDecisionInvoke:
|
|
6713
|
+
summaryLlmInvoke: Wc(e),
|
|
6714
|
+
titleLlmInvoke: Gc(e),
|
|
6715
|
+
compressDecisionInvoke: Xc(e)
|
|
6690
6716
|
};
|
|
6691
6717
|
}
|
|
6692
6718
|
//#endregion
|
|
6693
6719
|
//#region src/core/sdk/conflictManager.ts
|
|
6694
|
-
function
|
|
6720
|
+
function Qc(e) {
|
|
6695
6721
|
let t = /* @__PURE__ */ At(null), n = 0;
|
|
6696
6722
|
function r(r) {
|
|
6697
6723
|
return new Promise((i) => {
|
|
@@ -6722,7 +6748,7 @@ function Zc(e) {
|
|
|
6722
6748
|
}
|
|
6723
6749
|
//#endregion
|
|
6724
6750
|
//#region src/core/utils/id.ts
|
|
6725
|
-
function
|
|
6751
|
+
function $c() {
|
|
6726
6752
|
try {
|
|
6727
6753
|
if (typeof crypto < "u" && typeof crypto.randomUUID == "function") return crypto.randomUUID();
|
|
6728
6754
|
} catch {}
|
|
@@ -6730,7 +6756,7 @@ function Qc() {
|
|
|
6730
6756
|
}
|
|
6731
6757
|
//#endregion
|
|
6732
6758
|
//#region src/core/backends/storage.ts
|
|
6733
|
-
var
|
|
6759
|
+
var el = "chat-sdk", tl = 50 * 1024 * 1024, nl = 4 * 1024 * 1024, rl = 10 * 1024 * 1024, il = .9, al = 500, ol = 300, sl = "__meta__", cl = "v:1", ll = [
|
|
6734
6760
|
"messages",
|
|
6735
6761
|
"vfs",
|
|
6736
6762
|
"todos",
|
|
@@ -6741,51 +6767,51 @@ var $c = "chat-sdk", el = 50 * 1024 * 1024, tl = 4 * 1024 * 1024, nl = 10 * 1024
|
|
|
6741
6767
|
"workingMemory",
|
|
6742
6768
|
"focus"
|
|
6743
6769
|
];
|
|
6744
|
-
function ll(e) {
|
|
6745
|
-
return e === "local" || e === "session" ? tl : el;
|
|
6746
|
-
}
|
|
6747
6770
|
function ul(e) {
|
|
6771
|
+
return e === "local" || e === "session" ? nl : tl;
|
|
6772
|
+
}
|
|
6773
|
+
function dl(e) {
|
|
6748
6774
|
if (typeof e != "object" || !e) return !1;
|
|
6749
6775
|
let t = e;
|
|
6750
6776
|
return t.name === "QuotaExceededError" || t.name === "NS_ERROR_DOM_QUOTA_REACHED" || t.code === 22 || t.code === 1014;
|
|
6751
6777
|
}
|
|
6752
|
-
function
|
|
6778
|
+
function fl(e, t, n, r) {
|
|
6753
6779
|
return [
|
|
6754
|
-
|
|
6780
|
+
cl,
|
|
6755
6781
|
e,
|
|
6756
6782
|
t,
|
|
6757
6783
|
n,
|
|
6758
6784
|
r
|
|
6759
6785
|
].join("::");
|
|
6760
6786
|
}
|
|
6761
|
-
function
|
|
6787
|
+
function pl(e, t, n) {
|
|
6762
6788
|
return [
|
|
6763
|
-
|
|
6789
|
+
cl,
|
|
6764
6790
|
e,
|
|
6765
6791
|
t,
|
|
6766
6792
|
n
|
|
6767
6793
|
].join("::") + "::";
|
|
6768
6794
|
}
|
|
6769
|
-
function
|
|
6795
|
+
function ml(e, t) {
|
|
6770
6796
|
return [
|
|
6771
|
-
|
|
6797
|
+
cl,
|
|
6772
6798
|
e,
|
|
6773
6799
|
t
|
|
6774
6800
|
].join("::") + "::";
|
|
6775
6801
|
}
|
|
6776
|
-
function
|
|
6777
|
-
return [
|
|
6802
|
+
function hl(e) {
|
|
6803
|
+
return [cl, e].join("::") + "::";
|
|
6778
6804
|
}
|
|
6779
|
-
var
|
|
6780
|
-
function
|
|
6781
|
-
|
|
6805
|
+
var gl = null;
|
|
6806
|
+
function _l(e) {
|
|
6807
|
+
gl ||= new TextEncoder();
|
|
6782
6808
|
try {
|
|
6783
|
-
return
|
|
6809
|
+
return gl.encode(JSON.stringify(e)).length;
|
|
6784
6810
|
} catch {
|
|
6785
6811
|
return 0;
|
|
6786
6812
|
}
|
|
6787
6813
|
}
|
|
6788
|
-
function
|
|
6814
|
+
function vl(e, t, n) {
|
|
6789
6815
|
let r = e.reduce((e, t) => e + t.bytes, 0);
|
|
6790
6816
|
if (r <= t) return [];
|
|
6791
6817
|
let i = t * n, a = [...e].sort((e, t) => e.lastAccessed - t.lastAccessed), o = [];
|
|
@@ -6795,7 +6821,7 @@ function _l(e, t, n) {
|
|
|
6795
6821
|
}
|
|
6796
6822
|
return o;
|
|
6797
6823
|
}
|
|
6798
|
-
function
|
|
6824
|
+
function yl() {
|
|
6799
6825
|
let e = /* @__PURE__ */ new Map();
|
|
6800
6826
|
return {
|
|
6801
6827
|
async get(t) {
|
|
@@ -6815,7 +6841,7 @@ function vl() {
|
|
|
6815
6841
|
}
|
|
6816
6842
|
};
|
|
6817
6843
|
}
|
|
6818
|
-
function
|
|
6844
|
+
function bl(e) {
|
|
6819
6845
|
return new Promise((t, n) => {
|
|
6820
6846
|
if (typeof indexedDB > "u") {
|
|
6821
6847
|
n(/* @__PURE__ */ Error("indexedDB 不可用"));
|
|
@@ -6876,7 +6902,7 @@ function yl(e) {
|
|
|
6876
6902
|
}, r.onerror = () => n(r.error);
|
|
6877
6903
|
});
|
|
6878
6904
|
}
|
|
6879
|
-
function
|
|
6905
|
+
function xl(e) {
|
|
6880
6906
|
return {
|
|
6881
6907
|
async get(t) {
|
|
6882
6908
|
let n = e.getItem(t);
|
|
@@ -6921,12 +6947,12 @@ function bl(e) {
|
|
|
6921
6947
|
}
|
|
6922
6948
|
};
|
|
6923
6949
|
}
|
|
6924
|
-
function
|
|
6950
|
+
function Sl(e, t, n) {
|
|
6925
6951
|
let r = (e.get(t) ?? Promise.resolve()).then(n, n);
|
|
6926
6952
|
return e.set(t, r.then(() => void 0, () => void 0)), r;
|
|
6927
6953
|
}
|
|
6928
|
-
function
|
|
6929
|
-
let t = e.dbName ??
|
|
6954
|
+
function Cl(e = {}) {
|
|
6955
|
+
let t = e.dbName ?? el, n = e.backend ?? "indexed", r = e.maxBytes ?? ul(n), i = e.maxBytesPerSession ?? rl, a = e.evictionWatermark ?? il, o = e.debounceMs ?? al, s = /* @__PURE__ */ new Set();
|
|
6930
6956
|
function c(e) {
|
|
6931
6957
|
for (let t of s) try {
|
|
6932
6958
|
t(e);
|
|
@@ -6939,16 +6965,16 @@ function Sl(e = {}) {
|
|
|
6939
6965
|
try {
|
|
6940
6966
|
if (n === "indexed") {
|
|
6941
6967
|
if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
|
|
6942
|
-
l = await
|
|
6968
|
+
l = await bl(t), d(!0);
|
|
6943
6969
|
} else if (n === "session") {
|
|
6944
6970
|
if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
|
|
6945
|
-
l =
|
|
6971
|
+
l = xl(sessionStorage), d(!0);
|
|
6946
6972
|
} else if (n === "local") {
|
|
6947
6973
|
if (typeof localStorage > "u") throw Error("localStorage 不可用");
|
|
6948
|
-
l =
|
|
6949
|
-
} else l =
|
|
6974
|
+
l = xl(localStorage), d(!0);
|
|
6975
|
+
} else l = yl(), d(!1);
|
|
6950
6976
|
} catch (e) {
|
|
6951
|
-
l =
|
|
6977
|
+
l = yl();
|
|
6952
6978
|
let t = e instanceof Error ? e.message : String(e);
|
|
6953
6979
|
d(!1), Promise.resolve().then(() => c({
|
|
6954
6980
|
type: "degraded",
|
|
@@ -6958,10 +6984,10 @@ function Sl(e = {}) {
|
|
|
6958
6984
|
})();
|
|
6959
6985
|
let p = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map();
|
|
6960
6986
|
function g(e, n, r, a) {
|
|
6961
|
-
let o =
|
|
6962
|
-
return
|
|
6987
|
+
let o = fl(t, r, a, sl);
|
|
6988
|
+
return Sl(h, o, async () => {
|
|
6963
6989
|
let t = async () => {
|
|
6964
|
-
let t = await l.get(o), s = await l.get(e), u = s == null ? 0 :
|
|
6990
|
+
let t = await l.get(o), s = await l.get(e), u = s == null ? 0 : _l(s), d = _l(n), f = (t?.bytes ?? 0) + (d - u);
|
|
6965
6991
|
if (f > i) {
|
|
6966
6992
|
c({
|
|
6967
6993
|
type: "quota",
|
|
@@ -6983,12 +7009,12 @@ function Sl(e = {}) {
|
|
|
6983
7009
|
try {
|
|
6984
7010
|
await t();
|
|
6985
7011
|
} catch (e) {
|
|
6986
|
-
if (
|
|
7012
|
+
if (dl(e) && !u) {
|
|
6987
7013
|
u = !0;
|
|
6988
7014
|
try {
|
|
6989
7015
|
await b();
|
|
6990
7016
|
} catch {}
|
|
6991
|
-
l =
|
|
7017
|
+
l = yl(), Promise.resolve().then(() => c({
|
|
6992
7018
|
type: "degraded",
|
|
6993
7019
|
reason: "存储配额超限(QuotaExceededError),已淘汰最旧会话并降级内存"
|
|
6994
7020
|
}));
|
|
@@ -7000,7 +7026,7 @@ function Sl(e = {}) {
|
|
|
7000
7026
|
});
|
|
7001
7027
|
}
|
|
7002
7028
|
function _(e, n, r, i) {
|
|
7003
|
-
let a =
|
|
7029
|
+
let a = fl(t, e, n, r), s = p.get(a);
|
|
7004
7030
|
s && s.resolve();
|
|
7005
7031
|
let c = m.get(a);
|
|
7006
7032
|
return c && clearTimeout(c), new Promise((t) => {
|
|
@@ -7027,15 +7053,15 @@ function Sl(e = {}) {
|
|
|
7027
7053
|
function y() {
|
|
7028
7054
|
v ||= setTimeout(() => {
|
|
7029
7055
|
v = null, b();
|
|
7030
|
-
},
|
|
7056
|
+
}, ol);
|
|
7031
7057
|
}
|
|
7032
7058
|
async function b() {
|
|
7033
7059
|
let e = [];
|
|
7034
|
-
await l.scan(
|
|
7060
|
+
await l.scan(hl(t), (t, n) => {
|
|
7035
7061
|
t.endsWith("::__meta__") && e.push(n);
|
|
7036
7062
|
});
|
|
7037
|
-
let n =
|
|
7038
|
-
for (let e of n) await l.clearPrefix(
|
|
7063
|
+
let n = vl(e, r, a);
|
|
7064
|
+
for (let e of n) await l.clearPrefix(pl(t, e.agentId, e.sessionId)), c({
|
|
7039
7065
|
type: "evicted",
|
|
7040
7066
|
agentId: e.agentId,
|
|
7041
7067
|
sessionId: e.sessionId,
|
|
@@ -7046,13 +7072,13 @@ function Sl(e = {}) {
|
|
|
7046
7072
|
ready: f,
|
|
7047
7073
|
async listSessions(e) {
|
|
7048
7074
|
let n = [];
|
|
7049
|
-
return await l.scan(
|
|
7075
|
+
return await l.scan(ml(t, e), (e, t) => {
|
|
7050
7076
|
e.endsWith("::__meta__") && n.push(t);
|
|
7051
7077
|
}), n.sort((e, t) => t.lastAccessed - e.lastAccessed);
|
|
7052
7078
|
},
|
|
7053
7079
|
async load(e, n) {
|
|
7054
|
-
let r =
|
|
7055
|
-
return await
|
|
7080
|
+
let r = fl(t, e, n, sl);
|
|
7081
|
+
return await Sl(h, r, async () => {
|
|
7056
7082
|
let i = await l.get(r);
|
|
7057
7083
|
if (!i) return;
|
|
7058
7084
|
let a = {
|
|
@@ -7061,8 +7087,8 @@ function Sl(e = {}) {
|
|
|
7061
7087
|
todos: [],
|
|
7062
7088
|
memory: ""
|
|
7063
7089
|
};
|
|
7064
|
-
for (let r of
|
|
7065
|
-
let i = await l.get(
|
|
7090
|
+
for (let r of ll) {
|
|
7091
|
+
let i = await l.get(fl(t, e, n, r));
|
|
7066
7092
|
i != null && (a[r] = i);
|
|
7067
7093
|
}
|
|
7068
7094
|
return i.lastAccessed = Date.now(), await l.set(r, i), a;
|
|
@@ -7070,12 +7096,12 @@ function Sl(e = {}) {
|
|
|
7070
7096
|
},
|
|
7071
7097
|
async save(e, t, n) {
|
|
7072
7098
|
let r = [];
|
|
7073
|
-
for (let i of
|
|
7099
|
+
for (let i of ll) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
|
|
7074
7100
|
await Promise.all(r);
|
|
7075
7101
|
},
|
|
7076
7102
|
async updateTitle(e, n, r) {
|
|
7077
|
-
let i =
|
|
7078
|
-
return
|
|
7103
|
+
let i = fl(t, e, n, sl);
|
|
7104
|
+
return Sl(h, i, async () => {
|
|
7079
7105
|
let e = await l.get(i);
|
|
7080
7106
|
e && (e.title = r, e.lastAccessed = Date.now(), await l.set(i, e));
|
|
7081
7107
|
});
|
|
@@ -7091,10 +7117,10 @@ function Sl(e = {}) {
|
|
|
7091
7117
|
})), c({ type: "flush" }), await b();
|
|
7092
7118
|
},
|
|
7093
7119
|
async deleteSession(e, n) {
|
|
7094
|
-
await l.clearPrefix(
|
|
7120
|
+
await l.clearPrefix(pl(t, e, n));
|
|
7095
7121
|
},
|
|
7096
7122
|
async createSession(e, n, r) {
|
|
7097
|
-
let i = r ??
|
|
7123
|
+
let i = r ?? $c(), a = Date.now(), o = {
|
|
7098
7124
|
agentId: e,
|
|
7099
7125
|
sessionId: i,
|
|
7100
7126
|
createdAt: a,
|
|
@@ -7102,7 +7128,7 @@ function Sl(e = {}) {
|
|
|
7102
7128
|
bytes: 0,
|
|
7103
7129
|
title: n
|
|
7104
7130
|
};
|
|
7105
|
-
return await l.set(
|
|
7131
|
+
return await l.set(fl(t, e, i, sl), o), i;
|
|
7106
7132
|
},
|
|
7107
7133
|
onEvent(e) {
|
|
7108
7134
|
s.add(e);
|
|
@@ -7117,15 +7143,15 @@ function Sl(e = {}) {
|
|
|
7117
7143
|
}
|
|
7118
7144
|
//#endregion
|
|
7119
7145
|
//#region src/core/sdk/optionsResolver.ts
|
|
7120
|
-
function Cl(e) {
|
|
7121
|
-
return e === void 0 ? Sl({ backend: "memory" }) : e === !1 ? null : typeof e == "string" ? Sl({ backend: e }) : e.enabled === !1 ? null : Sl(e);
|
|
7122
|
-
}
|
|
7123
7146
|
function wl(e) {
|
|
7147
|
+
return e === void 0 ? Cl({ backend: "memory" }) : e === !1 ? null : typeof e == "string" ? Cl({ backend: e }) : e.enabled === !1 ? null : Cl(e);
|
|
7148
|
+
}
|
|
7149
|
+
function Tl(e) {
|
|
7124
7150
|
return e.dialog ?? {};
|
|
7125
7151
|
}
|
|
7126
7152
|
//#endregion
|
|
7127
7153
|
//#region src/core/capabilities.ts
|
|
7128
|
-
var
|
|
7154
|
+
var El = [
|
|
7129
7155
|
{
|
|
7130
7156
|
name: "dataOps",
|
|
7131
7157
|
defaultOn: !0
|
|
@@ -7214,13 +7240,13 @@ var Tl = [
|
|
|
7214
7240
|
requires: ["summarization"]
|
|
7215
7241
|
}
|
|
7216
7242
|
];
|
|
7217
|
-
function
|
|
7243
|
+
function Dl(e) {
|
|
7218
7244
|
let t = {};
|
|
7219
|
-
for (let n of
|
|
7245
|
+
for (let n of El) {
|
|
7220
7246
|
let r = e?.[n.name];
|
|
7221
7247
|
t[n.name] = n.defaultOn ? r !== !1 : r === !0;
|
|
7222
7248
|
}
|
|
7223
|
-
for (let e of
|
|
7249
|
+
for (let e of El) if (e.requires && t[e.name]) {
|
|
7224
7250
|
for (let n of e.requires) if (!t[n]) {
|
|
7225
7251
|
t[e.name] = !1;
|
|
7226
7252
|
break;
|
|
@@ -7230,7 +7256,7 @@ function El(e) {
|
|
|
7230
7256
|
}
|
|
7231
7257
|
//#endregion
|
|
7232
7258
|
//#region src/core/sdk/events.ts
|
|
7233
|
-
function
|
|
7259
|
+
function Ol(e) {
|
|
7234
7260
|
let t = /* @__PURE__ */ new Set(), n = (n) => {
|
|
7235
7261
|
if (n.type !== "approval_request") {
|
|
7236
7262
|
if (e) try {
|
|
@@ -7256,7 +7282,7 @@ function Dl(e) {
|
|
|
7256
7282
|
}
|
|
7257
7283
|
//#endregion
|
|
7258
7284
|
//#region src/core/sdk/contextPreset.ts
|
|
7259
|
-
var
|
|
7285
|
+
var kl = {
|
|
7260
7286
|
auto: {
|
|
7261
7287
|
summaryThresholdRatio: .5,
|
|
7262
7288
|
windowRatio: .4,
|
|
@@ -7284,7 +7310,7 @@ var Ol = {
|
|
|
7284
7310
|
enableRecall: !0,
|
|
7285
7311
|
enableLLMSummary: !0
|
|
7286
7312
|
}
|
|
7287
|
-
},
|
|
7313
|
+
}, Al = {
|
|
7288
7314
|
auto: ["describe_data", "read"],
|
|
7289
7315
|
conservative: ["describe_data"],
|
|
7290
7316
|
aggressive: ["describe_data", "read"],
|
|
@@ -7295,8 +7321,8 @@ var Ol = {
|
|
|
7295
7321
|
"search_data"
|
|
7296
7322
|
]
|
|
7297
7323
|
};
|
|
7298
|
-
function
|
|
7299
|
-
let n =
|
|
7324
|
+
function jl(e, t) {
|
|
7325
|
+
let n = kl[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
|
|
7300
7326
|
return {
|
|
7301
7327
|
...n,
|
|
7302
7328
|
...r,
|
|
@@ -7306,7 +7332,7 @@ function Al(e, t) {
|
|
|
7306
7332
|
}
|
|
7307
7333
|
//#endregion
|
|
7308
7334
|
//#region src/core/sdk/middlewareStack.ts
|
|
7309
|
-
var
|
|
7335
|
+
var Ml = {
|
|
7310
7336
|
dataHint: 10,
|
|
7311
7337
|
usageHints: 20,
|
|
7312
7338
|
todos: 30,
|
|
@@ -7323,17 +7349,17 @@ var jl = {
|
|
|
7323
7349
|
subagents: 140,
|
|
7324
7350
|
augmentSystem: 150
|
|
7325
7351
|
};
|
|
7326
|
-
function
|
|
7352
|
+
function Nl(e) {
|
|
7327
7353
|
return e.map((e, t) => ({
|
|
7328
7354
|
m: e,
|
|
7329
7355
|
i: t,
|
|
7330
|
-
p:
|
|
7356
|
+
p: Ml[e.name] ?? Infinity
|
|
7331
7357
|
})).sort((e, t) => e.p - t.p || e.i - t.i).map((e) => e.m);
|
|
7332
7358
|
}
|
|
7333
7359
|
//#endregion
|
|
7334
7360
|
//#region src/core/tools/dataSlotQuery.ts
|
|
7335
|
-
var
|
|
7336
|
-
function
|
|
7361
|
+
var Pl = /[\w$-]/;
|
|
7362
|
+
function Fl(e) {
|
|
7337
7363
|
let t = [], n = e.trim(), r = +(n[0] === "$");
|
|
7338
7364
|
for (; r < n.length;) {
|
|
7339
7365
|
let e = n[r];
|
|
@@ -7344,7 +7370,7 @@ function Pl(e) {
|
|
|
7344
7370
|
continue;
|
|
7345
7371
|
}
|
|
7346
7372
|
let e = "";
|
|
7347
|
-
for (; r < n.length &&
|
|
7373
|
+
for (; r < n.length && Pl.test(n[r]);) e += n[r++];
|
|
7348
7374
|
if (!e) throw Error("JSONPath: .. 后缺属性名");
|
|
7349
7375
|
t.push({
|
|
7350
7376
|
type: "descendKey",
|
|
@@ -7357,7 +7383,7 @@ function Pl(e) {
|
|
|
7357
7383
|
continue;
|
|
7358
7384
|
}
|
|
7359
7385
|
let e = "";
|
|
7360
|
-
for (; r < n.length &&
|
|
7386
|
+
for (; r < n.length && Pl.test(n[r]);) e += n[r++];
|
|
7361
7387
|
if (!e) throw Error("JSONPath: . 后缺属性名");
|
|
7362
7388
|
t.push({
|
|
7363
7389
|
type: "key",
|
|
@@ -7413,7 +7439,7 @@ function Pl(e) {
|
|
|
7413
7439
|
}
|
|
7414
7440
|
return t;
|
|
7415
7441
|
}
|
|
7416
|
-
function
|
|
7442
|
+
function Il(e) {
|
|
7417
7443
|
let t = [], n = 0, r = e.trim();
|
|
7418
7444
|
for (; n < r.length;) {
|
|
7419
7445
|
let e = r[n];
|
|
@@ -7458,7 +7484,7 @@ function Fl(e) {
|
|
|
7458
7484
|
}
|
|
7459
7485
|
return t;
|
|
7460
7486
|
}
|
|
7461
|
-
var
|
|
7487
|
+
var Ll = class {
|
|
7462
7488
|
toks;
|
|
7463
7489
|
item;
|
|
7464
7490
|
pos = 0;
|
|
@@ -7494,12 +7520,12 @@ var Il = class {
|
|
|
7494
7520
|
return this.next(), e;
|
|
7495
7521
|
}
|
|
7496
7522
|
let e = this.operand(), t = this.peek();
|
|
7497
|
-
return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(),
|
|
7523
|
+
return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), Bl(t, e, this.operand())) : Rl(e);
|
|
7498
7524
|
}
|
|
7499
7525
|
operand() {
|
|
7500
7526
|
let e = this.next();
|
|
7501
7527
|
if (e === void 0) throw Error("过滤表达式:缺操作数");
|
|
7502
|
-
if (e.startsWith("@")) return
|
|
7528
|
+
if (e.startsWith("@")) return zl(e, this.item);
|
|
7503
7529
|
if (e[0] === "'" || e[0] === "\"") return e.slice(1, -1);
|
|
7504
7530
|
if (e === "true") return !0;
|
|
7505
7531
|
if (e === "false") return !1;
|
|
@@ -7509,10 +7535,10 @@ var Il = class {
|
|
|
7509
7535
|
throw Error(`过滤表达式:未知操作数 '${e}'`);
|
|
7510
7536
|
}
|
|
7511
7537
|
};
|
|
7512
|
-
function
|
|
7538
|
+
function Rl(e) {
|
|
7513
7539
|
return !!e && e !== 0 && e !== "" && e !== null;
|
|
7514
7540
|
}
|
|
7515
|
-
function
|
|
7541
|
+
function zl(e, t) {
|
|
7516
7542
|
let n = e.split(".").filter((e) => e && e !== "@"), r = t;
|
|
7517
7543
|
for (let e of n) {
|
|
7518
7544
|
if (typeof r != "object" || !r) return;
|
|
@@ -7520,7 +7546,7 @@ function Rl(e, t) {
|
|
|
7520
7546
|
}
|
|
7521
7547
|
return r;
|
|
7522
7548
|
}
|
|
7523
|
-
function
|
|
7549
|
+
function Bl(e, t, n) {
|
|
7524
7550
|
switch (e) {
|
|
7525
7551
|
case "==": return t === n;
|
|
7526
7552
|
case "!=": return t !== n;
|
|
@@ -7531,47 +7557,47 @@ function zl(e, t, n) {
|
|
|
7531
7557
|
default: return !1;
|
|
7532
7558
|
}
|
|
7533
7559
|
}
|
|
7534
|
-
function Bl(e, t) {
|
|
7535
|
-
return new Il(Fl(e), t).parse();
|
|
7536
|
-
}
|
|
7537
7560
|
function Vl(e, t) {
|
|
7538
|
-
return
|
|
7561
|
+
return new Ll(Il(e), t).parse();
|
|
7539
7562
|
}
|
|
7540
7563
|
function Hl(e, t) {
|
|
7564
|
+
return e ? `${e}.${t}` : String(t);
|
|
7565
|
+
}
|
|
7566
|
+
function Ul(e, t) {
|
|
7541
7567
|
let n = [{
|
|
7542
7568
|
path: "",
|
|
7543
7569
|
value: e
|
|
7544
7570
|
}];
|
|
7545
|
-
for (let e of
|
|
7571
|
+
for (let e of Fl(t)) {
|
|
7546
7572
|
let t = [];
|
|
7547
7573
|
if (e.type === "key") for (let r of n) r.value != null && typeof r.value == "object" && e.key in r.value && t.push({
|
|
7548
|
-
path:
|
|
7574
|
+
path: Hl(r.path, e.key),
|
|
7549
7575
|
value: r.value[e.key]
|
|
7550
7576
|
});
|
|
7551
7577
|
else if (e.type === "index") {
|
|
7552
7578
|
for (let r of n) if (Array.isArray(r.value)) {
|
|
7553
7579
|
let n = r.value[e.index];
|
|
7554
7580
|
e.index >= 0 && e.index < r.value.length && t.push({
|
|
7555
|
-
path:
|
|
7581
|
+
path: Hl(r.path, e.index),
|
|
7556
7582
|
value: n,
|
|
7557
7583
|
index: e.index
|
|
7558
7584
|
});
|
|
7559
7585
|
}
|
|
7560
7586
|
} else if (e.type === "wildcard") {
|
|
7561
7587
|
for (let e of n) if (Array.isArray(e.value)) e.value.forEach((n, r) => t.push({
|
|
7562
|
-
path:
|
|
7588
|
+
path: Hl(e.path, r),
|
|
7563
7589
|
value: n,
|
|
7564
7590
|
index: r
|
|
7565
7591
|
}));
|
|
7566
7592
|
else if (e.value != null && typeof e.value == "object") for (let n of Object.keys(e.value)) t.push({
|
|
7567
|
-
path:
|
|
7593
|
+
path: Hl(e.path, n),
|
|
7568
7594
|
value: e.value[n]
|
|
7569
7595
|
});
|
|
7570
7596
|
} else if (e.type === "descendKey") {
|
|
7571
7597
|
let r = e.key, i = (e) => {
|
|
7572
7598
|
if (!(e.value == null || typeof e.value != "object")) for (let n of Object.keys(e.value)) {
|
|
7573
7599
|
let a = {
|
|
7574
|
-
path:
|
|
7600
|
+
path: Hl(e.path, n),
|
|
7575
7601
|
value: e.value[n]
|
|
7576
7602
|
};
|
|
7577
7603
|
n === r && t.push(a), i(a);
|
|
@@ -7582,7 +7608,7 @@ function Hl(e, t) {
|
|
|
7582
7608
|
let e = (n) => {
|
|
7583
7609
|
if (!(n.value == null || typeof n.value != "object")) for (let r of Object.keys(n.value)) {
|
|
7584
7610
|
let i = {
|
|
7585
|
-
path:
|
|
7611
|
+
path: Hl(n.path, r),
|
|
7586
7612
|
value: n.value[r]
|
|
7587
7613
|
};
|
|
7588
7614
|
t.push(i), e(i);
|
|
@@ -7591,16 +7617,16 @@ function Hl(e, t) {
|
|
|
7591
7617
|
for (let t of n) e(t);
|
|
7592
7618
|
} else if (e.type === "filter") {
|
|
7593
7619
|
for (let r of n) if (Array.isArray(r.value)) r.value.forEach((n, i) => {
|
|
7594
|
-
|
|
7595
|
-
path:
|
|
7620
|
+
Vl(e.filter, n) && t.push({
|
|
7621
|
+
path: Hl(r.path, i),
|
|
7596
7622
|
value: n,
|
|
7597
7623
|
index: i
|
|
7598
7624
|
});
|
|
7599
7625
|
});
|
|
7600
7626
|
else if (r.value != null && typeof r.value == "object") for (let n of Object.keys(r.value)) {
|
|
7601
7627
|
let i = r.value[n];
|
|
7602
|
-
|
|
7603
|
-
path:
|
|
7628
|
+
Vl(e.filter, i) && t.push({
|
|
7629
|
+
path: Hl(r.path, n),
|
|
7604
7630
|
value: i
|
|
7605
7631
|
});
|
|
7606
7632
|
}
|
|
@@ -7609,7 +7635,7 @@ function Hl(e, t) {
|
|
|
7609
7635
|
}
|
|
7610
7636
|
return n;
|
|
7611
7637
|
}
|
|
7612
|
-
function
|
|
7638
|
+
function Wl(e, t) {
|
|
7613
7639
|
let n = e.length, r = t.length;
|
|
7614
7640
|
if (!n) return r;
|
|
7615
7641
|
if (!r) return n;
|
|
@@ -7625,7 +7651,7 @@ function Ul(e, t) {
|
|
|
7625
7651
|
}
|
|
7626
7652
|
return i[r];
|
|
7627
7653
|
}
|
|
7628
|
-
function
|
|
7654
|
+
function Gl(e, t, n = {}) {
|
|
7629
7655
|
let r = n.mode || "substring", i = n.limit ?? 50, a = n.matchKey !== !1, o = [], s = null;
|
|
7630
7656
|
if (r === "regex") try {
|
|
7631
7657
|
s = new RegExp(t, "i");
|
|
@@ -7635,11 +7661,11 @@ function Wl(e, t, n = {}) {
|
|
|
7635
7661
|
let c = (e, l, u) => {
|
|
7636
7662
|
if (o.length >= i || e == null) return;
|
|
7637
7663
|
if (typeof e == "object") {
|
|
7638
|
-
if (Array.isArray(e)) e.forEach((e, t) => c(e,
|
|
7639
|
-
else for (let t of Object.keys(e)) c(e[t],
|
|
7664
|
+
if (Array.isArray(e)) e.forEach((e, t) => c(e, Hl(l, t), String(t)));
|
|
7665
|
+
else for (let t of Object.keys(e)) c(e[t], Hl(l, t), t);
|
|
7640
7666
|
return;
|
|
7641
7667
|
}
|
|
7642
|
-
let d = String(e), f =
|
|
7668
|
+
let d = String(e), f = Kl(d, t, r, n.fuzzyThreshold ?? 2, s);
|
|
7643
7669
|
if (f) {
|
|
7644
7670
|
o.push({
|
|
7645
7671
|
path: l,
|
|
@@ -7650,7 +7676,7 @@ function Wl(e, t, n = {}) {
|
|
|
7650
7676
|
return;
|
|
7651
7677
|
}
|
|
7652
7678
|
if (a && u) {
|
|
7653
|
-
let e =
|
|
7679
|
+
let e = Kl(u, t, r, n.fuzzyThreshold ?? 2, s);
|
|
7654
7680
|
e && o.push({
|
|
7655
7681
|
path: l,
|
|
7656
7682
|
key: u,
|
|
@@ -7661,51 +7687,51 @@ function Wl(e, t, n = {}) {
|
|
|
7661
7687
|
};
|
|
7662
7688
|
return c(e, ""), o;
|
|
7663
7689
|
}
|
|
7664
|
-
function
|
|
7690
|
+
function Kl(e, t, n, r, i) {
|
|
7665
7691
|
let a = e.toLowerCase(), o = t.toLowerCase();
|
|
7666
7692
|
if (n === "substring") return a.includes(o) ? 1 : null;
|
|
7667
7693
|
if (n === "regex") return i && i.test(e) ? 1 : null;
|
|
7668
7694
|
if (n === "fuzzy") {
|
|
7669
7695
|
if (a.includes(o)) return 2;
|
|
7670
|
-
let e =
|
|
7696
|
+
let e = Wl(a, o);
|
|
7671
7697
|
return e <= r ? r - e + 1 : null;
|
|
7672
7698
|
}
|
|
7673
7699
|
return null;
|
|
7674
7700
|
}
|
|
7675
|
-
function
|
|
7676
|
-
return
|
|
7701
|
+
function ql(e, t, n = 3e3) {
|
|
7702
|
+
return io(t, n)(e);
|
|
7677
7703
|
}
|
|
7678
7704
|
//#endregion
|
|
7679
7705
|
//#region src/core/tools/resources.ts
|
|
7680
|
-
var
|
|
7681
|
-
function Xl(e) {
|
|
7682
|
-
return `${ql}${e}${Yl}`;
|
|
7683
|
-
}
|
|
7706
|
+
var Jl = "⟦frozen:", Yl = "⟦res:", Xl = "⟧";
|
|
7684
7707
|
function Zl(e) {
|
|
7685
|
-
return `${Jl}${e}${
|
|
7708
|
+
return `${Jl}${e}${Xl}`;
|
|
7686
7709
|
}
|
|
7687
7710
|
function Ql(e) {
|
|
7688
|
-
return
|
|
7711
|
+
return `${Yl}${e}${Xl}`;
|
|
7712
|
+
}
|
|
7713
|
+
function $l(e) {
|
|
7714
|
+
return typeof e == "string" ? e.startsWith(Jl) && e.endsWith(Xl) ? {
|
|
7689
7715
|
type: "frozen",
|
|
7690
7716
|
path: e.slice(8, e.length - 1)
|
|
7691
|
-
} : e.startsWith(
|
|
7717
|
+
} : e.startsWith(Yl) && e.endsWith(Xl) ? {
|
|
7692
7718
|
type: "res",
|
|
7693
7719
|
handle: e.slice(5, e.length - 1)
|
|
7694
7720
|
} : null : null;
|
|
7695
7721
|
}
|
|
7696
|
-
function
|
|
7722
|
+
function eu(e) {
|
|
7697
7723
|
return String(e ?? "").trim().replace(/^\.+/, "");
|
|
7698
7724
|
}
|
|
7699
|
-
function
|
|
7725
|
+
function tu(e) {
|
|
7700
7726
|
let t = 5381;
|
|
7701
7727
|
for (let n = 0; n < e.length; n++) t = (t * 33 ^ e.charCodeAt(n)) >>> 0;
|
|
7702
7728
|
return (t >>> 0).toString(16).padStart(8, "0").slice(0, 8);
|
|
7703
7729
|
}
|
|
7704
|
-
function
|
|
7730
|
+
function nu(e, t) {
|
|
7705
7731
|
return e === t ? !0 : e && t && typeof e == "object" && typeof t == "object" ? JSON.stringify(e) === JSON.stringify(t) : !1;
|
|
7706
7732
|
}
|
|
7707
|
-
function
|
|
7708
|
-
let n =
|
|
7733
|
+
function ru(e, t) {
|
|
7734
|
+
let n = eu(e);
|
|
7709
7735
|
if (!n) return;
|
|
7710
7736
|
let r = t.get(n);
|
|
7711
7737
|
if (r) return {
|
|
@@ -7725,7 +7751,7 @@ function nu(e, t) {
|
|
|
7725
7751
|
}));
|
|
7726
7752
|
return i;
|
|
7727
7753
|
}
|
|
7728
|
-
var
|
|
7754
|
+
var iu = class {
|
|
7729
7755
|
vfs;
|
|
7730
7756
|
constructor(e) {
|
|
7731
7757
|
this.vfs = e;
|
|
@@ -7734,7 +7760,7 @@ var ru = class {
|
|
|
7734
7760
|
return `resources/${e}.json`;
|
|
7735
7761
|
}
|
|
7736
7762
|
ensure(e, t, n) {
|
|
7737
|
-
let r =
|
|
7763
|
+
let r = tu(e), i = {
|
|
7738
7764
|
path: e,
|
|
7739
7765
|
mode: n,
|
|
7740
7766
|
value: t,
|
|
@@ -7746,7 +7772,7 @@ var ru = class {
|
|
|
7746
7772
|
}, r;
|
|
7747
7773
|
}
|
|
7748
7774
|
get(e) {
|
|
7749
|
-
return this.readEntry(this.key(e)) || this.readEntry(this.key(
|
|
7775
|
+
return this.readEntry(this.key(e)) || this.readEntry(this.key(tu(e)));
|
|
7750
7776
|
}
|
|
7751
7777
|
readEntry(e) {
|
|
7752
7778
|
let t = this.vfs.files[e];
|
|
@@ -7762,7 +7788,7 @@ var ru = class {
|
|
|
7762
7788
|
this.ensure(e, t, n?.mode ?? "verbatim");
|
|
7763
7789
|
}
|
|
7764
7790
|
delete(e) {
|
|
7765
|
-
let t = this.get(e)?.handle ??
|
|
7791
|
+
let t = this.get(e)?.handle ?? tu(e), n = this.key(t), r = !!this.vfs.files[n];
|
|
7766
7792
|
return r && delete this.vfs.files[n], r;
|
|
7767
7793
|
}
|
|
7768
7794
|
list() {
|
|
@@ -7782,7 +7808,7 @@ var ru = class {
|
|
|
7782
7808
|
for (let e of Object.keys(this.vfs.files)) e.startsWith("resources/") && delete this.vfs.files[e];
|
|
7783
7809
|
}
|
|
7784
7810
|
};
|
|
7785
|
-
function
|
|
7811
|
+
function au(e) {
|
|
7786
7812
|
let { jp: t, resolved: n, resourcesByPath: r, resourceStore: i } = e;
|
|
7787
7813
|
if (!r.size) return n;
|
|
7788
7814
|
let a = !1;
|
|
@@ -7796,14 +7822,14 @@ function iu(e) {
|
|
|
7796
7822
|
if (t !== "" && e !== t && !e.startsWith(t + ".")) continue;
|
|
7797
7823
|
if (e === t) {
|
|
7798
7824
|
if (o === void 0) continue;
|
|
7799
|
-
return n.mode === "freeze" ?
|
|
7825
|
+
return n.mode === "freeze" ? Zl(e) : i ? Ql(i.ensure(e, o, "verbatim")) : o;
|
|
7800
7826
|
}
|
|
7801
7827
|
let r = t === "" ? e : e.slice(t.length + 1), a = Z(o, r);
|
|
7802
|
-
a !== void 0 && (n.mode === "freeze" ? Ma(o, r,
|
|
7828
|
+
a !== void 0 && (n.mode === "freeze" ? Ma(o, r, Zl(e)) : i && Ma(o, r, Ql(i.ensure(e, a, "verbatim"))));
|
|
7803
7829
|
}
|
|
7804
7830
|
return o;
|
|
7805
7831
|
}
|
|
7806
|
-
function
|
|
7832
|
+
function ou(e, t, n, r) {
|
|
7807
7833
|
if (!r) return {
|
|
7808
7834
|
code: "RESOURCE_NOT_FOUND",
|
|
7809
7835
|
message: `句柄 "${e}" 无法展开(资源池未启用)`,
|
|
@@ -7814,7 +7840,7 @@ function au(e, t, n, r) {
|
|
|
7814
7840
|
code: "RESOURCE_NOT_FOUND",
|
|
7815
7841
|
message: `字段 "${t}" 在 bind 中已不存在,无法展开句柄 "${e}"`,
|
|
7816
7842
|
hint: "该字段可能已被删除或 restore 到不含此字段的快照;重新 read 确认当前结构"
|
|
7817
|
-
} :
|
|
7843
|
+
} : nu(i.value, n) ? { value: i.value } : (r.update(t, n), { value: n }) : n === void 0 ? {
|
|
7818
7844
|
code: "RESOURCE_NOT_FOUND",
|
|
7819
7845
|
message: `句柄 "${e}" 不存在(字段 "${t}" 可能未注册或已被删除)`,
|
|
7820
7846
|
hint: "重新 read 该字段触发懒注册"
|
|
@@ -7824,7 +7850,7 @@ function au(e, t, n, r) {
|
|
|
7824
7850
|
hint: "重新 read 该字段触发懒注册重建句柄,再写回新句柄 ⟦res:<handle>⟧"
|
|
7825
7851
|
};
|
|
7826
7852
|
}
|
|
7827
|
-
function
|
|
7853
|
+
function su(e, t) {
|
|
7828
7854
|
let n = t.getBind();
|
|
7829
7855
|
for (let [r, i] of t.resourcesByPath) {
|
|
7830
7856
|
let a = Z(n, r), o = Z(e, r);
|
|
@@ -7833,11 +7859,11 @@ function ou(e, t) {
|
|
|
7833
7859
|
continue;
|
|
7834
7860
|
}
|
|
7835
7861
|
if (i.mode === "freeze") {
|
|
7836
|
-
if (o ===
|
|
7862
|
+
if (o === Zl(r)) {
|
|
7837
7863
|
Ma(e, r, a);
|
|
7838
7864
|
continue;
|
|
7839
7865
|
}
|
|
7840
|
-
if (!
|
|
7866
|
+
if (!nu(o, a)) return {
|
|
7841
7867
|
ok: !1,
|
|
7842
7868
|
code: "FROZEN_FIELD",
|
|
7843
7869
|
path: r,
|
|
@@ -7845,9 +7871,9 @@ function ou(e, t) {
|
|
|
7845
7871
|
hint: "该字段由系统/集成方维护,LLM 不得改动。如需展示其值用 resource_get({path}) 取真值"
|
|
7846
7872
|
};
|
|
7847
7873
|
} else {
|
|
7848
|
-
let n =
|
|
7874
|
+
let n = $l(o);
|
|
7849
7875
|
if (n && n.type === "res") {
|
|
7850
|
-
let i =
|
|
7876
|
+
let i = ou(n.handle, r, a, t.resourceStore);
|
|
7851
7877
|
if ("value" in i) {
|
|
7852
7878
|
Ma(e, r, i.value);
|
|
7853
7879
|
continue;
|
|
@@ -7860,7 +7886,7 @@ function ou(e, t) {
|
|
|
7860
7886
|
hint: i.hint
|
|
7861
7887
|
};
|
|
7862
7888
|
}
|
|
7863
|
-
if (!
|
|
7889
|
+
if (!nu(o, a)) return {
|
|
7864
7890
|
ok: !1,
|
|
7865
7891
|
code: "VERBATIM_MISMATCH",
|
|
7866
7892
|
path: r,
|
|
@@ -7871,7 +7897,7 @@ function ou(e, t) {
|
|
|
7871
7897
|
}
|
|
7872
7898
|
return { ok: !0 };
|
|
7873
7899
|
}
|
|
7874
|
-
function
|
|
7900
|
+
function cu(e, t, n) {
|
|
7875
7901
|
let r = t === void 0 ? e.message : `patches[${t}]${n ? ` @ "${n}"` : ""}: ${e.message}`;
|
|
7876
7902
|
return Y({
|
|
7877
7903
|
code: e.code,
|
|
@@ -7884,28 +7910,28 @@ function su(e, t, n) {
|
|
|
7884
7910
|
} }
|
|
7885
7911
|
});
|
|
7886
7912
|
}
|
|
7887
|
-
function
|
|
7913
|
+
function lu(e) {
|
|
7888
7914
|
let { value: t, ctx: n } = e;
|
|
7889
7915
|
if (!n || !n.resourcesByPath.size) return {
|
|
7890
7916
|
ok: !0,
|
|
7891
7917
|
value: t
|
|
7892
7918
|
};
|
|
7893
|
-
let r = Pa(t), i =
|
|
7919
|
+
let r = Pa(t), i = su(r, n);
|
|
7894
7920
|
return i.ok ? {
|
|
7895
7921
|
ok: !0,
|
|
7896
7922
|
value: r
|
|
7897
7923
|
} : {
|
|
7898
7924
|
ok: !1,
|
|
7899
|
-
error:
|
|
7925
|
+
error: cu(i)
|
|
7900
7926
|
};
|
|
7901
7927
|
}
|
|
7902
|
-
function
|
|
7928
|
+
function uu(e) {
|
|
7903
7929
|
let { patches: t, clone: n, ctx: r } = e;
|
|
7904
7930
|
if (!r || !r.resourcesByPath.size) return { ok: !0 };
|
|
7905
7931
|
for (let e = 0; e < t.length; e++) {
|
|
7906
7932
|
let n = t[e];
|
|
7907
7933
|
if (n.op === "remove") {
|
|
7908
|
-
let t =
|
|
7934
|
+
let t = ru(n.jsonPath || "", r.resourcesByPath);
|
|
7909
7935
|
if (t) {
|
|
7910
7936
|
let r = t.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED", i = t.spec.mode === "freeze" ? "冻结字段不可删。如需移除请联系集成方调整 data.resources 配置" : "verbatim 字段不可直接删;先 resource_delete({path}) 释放资源保护后再删";
|
|
7911
7937
|
return {
|
|
@@ -7924,27 +7950,27 @@ function lu(e) {
|
|
|
7924
7950
|
}
|
|
7925
7951
|
}
|
|
7926
7952
|
}
|
|
7927
|
-
let i =
|
|
7953
|
+
let i = su(n, r);
|
|
7928
7954
|
if (!i.ok) {
|
|
7929
|
-
let e =
|
|
7955
|
+
let e = du(i.path, t);
|
|
7930
7956
|
return {
|
|
7931
7957
|
ok: !1,
|
|
7932
|
-
error:
|
|
7958
|
+
error: cu(i, e >= 0 ? e : void 0, e >= 0 ? t[e].jsonPath : void 0)
|
|
7933
7959
|
};
|
|
7934
7960
|
}
|
|
7935
7961
|
return { ok: !0 };
|
|
7936
7962
|
}
|
|
7937
|
-
function
|
|
7938
|
-
let n =
|
|
7963
|
+
function du(e, t) {
|
|
7964
|
+
let n = eu(e);
|
|
7939
7965
|
for (let e = 0; e < t.length; e++) {
|
|
7940
|
-
let r =
|
|
7966
|
+
let r = eu(t[e].jsonPath || "");
|
|
7941
7967
|
if (r && (r === n || n.startsWith(r + ".") || r.startsWith(n + "."))) return e;
|
|
7942
7968
|
}
|
|
7943
7969
|
return -1;
|
|
7944
7970
|
}
|
|
7945
7971
|
//#endregion
|
|
7946
7972
|
//#region src/core/tools/dataOps.ts
|
|
7947
|
-
var
|
|
7973
|
+
var fu = /* @__PURE__ */ new Set([
|
|
7948
7974
|
"describe_data",
|
|
7949
7975
|
"get_data",
|
|
7950
7976
|
"set_data",
|
|
@@ -7958,14 +7984,14 @@ var du = /* @__PURE__ */ new Set([
|
|
|
7958
7984
|
"resource_update",
|
|
7959
7985
|
"resource_list",
|
|
7960
7986
|
"resource_delete"
|
|
7961
|
-
]),
|
|
7962
|
-
function
|
|
7963
|
-
return t === "advanced" ? e : t === "minimal" ? e.filter((e) =>
|
|
7987
|
+
]), pu = /* @__PURE__ */ new Set(["read", "write"]);
|
|
7988
|
+
function mu(e, t = "simple") {
|
|
7989
|
+
return t === "advanced" ? e : t === "minimal" ? e.filter((e) => pu.has(e.name)) : e.filter((e) => !fu.has(e.name));
|
|
7964
7990
|
}
|
|
7965
|
-
function
|
|
7991
|
+
function hu(e) {
|
|
7966
7992
|
let { bindRef: t, schema: n, allowKeys: r, snapshots: i, maxSnapshots: a, audit: o, dryRun: s, op: c = "set", protectedCtx: l } = e, u = e.value;
|
|
7967
7993
|
if (l) {
|
|
7968
|
-
let e =
|
|
7994
|
+
let e = lu({
|
|
7969
7995
|
value: u,
|
|
7970
7996
|
ctx: l
|
|
7971
7997
|
});
|
|
@@ -7980,6 +8006,17 @@ function mu(e) {
|
|
|
7980
8006
|
ok: !1,
|
|
7981
8007
|
error: qr("", d.error.issues)
|
|
7982
8008
|
};
|
|
8009
|
+
let f = Ga(t, u, d.data);
|
|
8010
|
+
if (f.length) return {
|
|
8011
|
+
ok: !1,
|
|
8012
|
+
error: Y({
|
|
8013
|
+
code: "SCHEMA_STRIP",
|
|
8014
|
+
message: `字段 ${f.join(", ")} 不在 schema 声明内,写入被拒绝(防静默丢失)`,
|
|
8015
|
+
hint: "该数据结构不支持这些字段;请只用 schema 声明的字段,或在 data.schema 中声明后重试",
|
|
8016
|
+
path: f[0],
|
|
8017
|
+
details: { stripped: f }
|
|
8018
|
+
})
|
|
8019
|
+
};
|
|
7983
8020
|
if (s) return {
|
|
7984
8021
|
ok: !0,
|
|
7985
8022
|
hash: "",
|
|
@@ -7993,12 +8030,12 @@ function mu(e) {
|
|
|
7993
8030
|
hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹(如 {value:\"x\"})或集成方通过 sdk.setData 替换 bind"
|
|
7994
8031
|
})
|
|
7995
8032
|
};
|
|
7996
|
-
let
|
|
8033
|
+
let p = Pa(t), m = i.length ? i[i.length - 1].id + 1 : 1;
|
|
7997
8034
|
for (i.push({
|
|
7998
|
-
id:
|
|
8035
|
+
id: m,
|
|
7999
8036
|
ts: Date.now(),
|
|
8000
8037
|
op: c,
|
|
8001
|
-
value:
|
|
8038
|
+
value: p
|
|
8002
8039
|
}); i.length > a;) i.shift();
|
|
8003
8040
|
return d.data !== null && typeof d.data == "object" && (r ? ja(t, d.data) : Wa(t, d.data)), o({
|
|
8004
8041
|
op: c,
|
|
@@ -8010,7 +8047,7 @@ function mu(e) {
|
|
|
8010
8047
|
data: d.data
|
|
8011
8048
|
};
|
|
8012
8049
|
}
|
|
8013
|
-
function
|
|
8050
|
+
function gu(e) {
|
|
8014
8051
|
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 = Pa(t), p = [];
|
|
8015
8052
|
for (let e = 0; e < n.length; e++) {
|
|
8016
8053
|
let t = n[e], a = t.jsonPath || "";
|
|
@@ -8070,7 +8107,7 @@ function hu(e) {
|
|
|
8070
8107
|
});
|
|
8071
8108
|
}
|
|
8072
8109
|
if (d) {
|
|
8073
|
-
let e =
|
|
8110
|
+
let e = uu({
|
|
8074
8111
|
patches: n,
|
|
8075
8112
|
clone: f,
|
|
8076
8113
|
ctx: d
|
|
@@ -8090,14 +8127,25 @@ function hu(e) {
|
|
|
8090
8127
|
details: Kr(m.error.issues)
|
|
8091
8128
|
}) : qr("", m.error.issues)
|
|
8092
8129
|
};
|
|
8130
|
+
let h = Ga(t, f, m.data);
|
|
8131
|
+
if (h.length) return {
|
|
8132
|
+
ok: !1,
|
|
8133
|
+
error: Y({
|
|
8134
|
+
code: "SCHEMA_STRIP",
|
|
8135
|
+
message: `字段 ${h.join(", ")} 不在 schema 声明内,写入被拒绝(防静默丢失)`,
|
|
8136
|
+
hint: "该数据结构不支持这些字段;请只用 schema 声明的字段,或在 data.schema 中声明后重试",
|
|
8137
|
+
path: h[0],
|
|
8138
|
+
details: { stripped: h }
|
|
8139
|
+
})
|
|
8140
|
+
};
|
|
8093
8141
|
if (u) return {
|
|
8094
8142
|
ok: !0,
|
|
8095
8143
|
applied: p,
|
|
8096
8144
|
clone: f
|
|
8097
8145
|
};
|
|
8098
|
-
let
|
|
8146
|
+
let g = a.length ? a[a.length - 1].id + 1 : 1;
|
|
8099
8147
|
for (a.push({
|
|
8100
|
-
id:
|
|
8148
|
+
id: g,
|
|
8101
8149
|
ts: Date.now(),
|
|
8102
8150
|
op: "edit",
|
|
8103
8151
|
value: Pa(t),
|
|
@@ -8110,41 +8158,41 @@ function hu(e) {
|
|
|
8110
8158
|
clone: f
|
|
8111
8159
|
};
|
|
8112
8160
|
}
|
|
8113
|
-
function
|
|
8161
|
+
function _u(e) {
|
|
8114
8162
|
return e < 1024 ? `${e}B` : e < 1024 * 1024 ? `${(e / 1024).toFixed(1)}KB` : `${(e / (1024 * 1024)).toFixed(1)}MB`;
|
|
8115
8163
|
}
|
|
8116
|
-
function
|
|
8164
|
+
function vu(e, t, n, r) {
|
|
8117
8165
|
if (!t || !n.length || typeof e != "object" || !e) return e;
|
|
8118
8166
|
let i = new Set(n.map((e) => e.field)), a = Pa(e);
|
|
8119
8167
|
return (function e(t) {
|
|
8120
8168
|
if (Array.isArray(t)) for (let n of t) e(n);
|
|
8121
8169
|
else if (t && typeof t == "object") for (let n of Object.keys(t)) {
|
|
8122
8170
|
let a = t[n];
|
|
8123
|
-
typeof a == "string" && i.has(n) && a.length >= r ? t[n] = `<${n} ${
|
|
8171
|
+
typeof a == "string" && i.has(n) && a.length >= r ? t[n] = `<${n} ${_u(a.length)}>` : e(a);
|
|
8124
8172
|
}
|
|
8125
8173
|
})(a), a;
|
|
8126
8174
|
}
|
|
8127
|
-
var
|
|
8128
|
-
function
|
|
8129
|
-
return
|
|
8175
|
+
var yu = 0;
|
|
8176
|
+
function bu() {
|
|
8177
|
+
return yu++, "c_" + Math.random().toString(36).slice(2, 8) + yu.toString(36);
|
|
8130
8178
|
}
|
|
8131
|
-
function
|
|
8179
|
+
function xu(e, t) {
|
|
8132
8180
|
if (!(!e || typeof e != "object")) for (let n of t) {
|
|
8133
8181
|
let t = Z(e, n);
|
|
8134
|
-
if (Array.isArray(t)) for (let e of t) e && typeof e == "object" && !("__pgId" in e) && (e.__pgId =
|
|
8182
|
+
if (Array.isArray(t)) for (let e of t) e && typeof e == "object" && !("__pgId" in e) && (e.__pgId = bu());
|
|
8135
8183
|
}
|
|
8136
8184
|
}
|
|
8137
|
-
function
|
|
8185
|
+
function Su(e) {
|
|
8138
8186
|
(function e(t) {
|
|
8139
8187
|
if (Array.isArray(t)) t.forEach(e);
|
|
8140
8188
|
else if (t && typeof t == "object") for (let n of Object.keys(t)) n.startsWith("__pg") ? delete t[n] : e(t[n]);
|
|
8141
8189
|
})(e);
|
|
8142
8190
|
}
|
|
8143
|
-
function
|
|
8144
|
-
let i = n.pgIdPaths ?? [], a = i.length ? (e) =>
|
|
8191
|
+
function Cu(e, n = {}) {
|
|
8192
|
+
let i = n.pgIdPaths ?? [], a = i.length ? (e) => xu(e, i) : void 0, o = i.length ? da(e.schema, i).schema : e.schema, s = e.bind, c = e.description ?? "主数据对象", l = Wi(o), u = /* @__PURE__ */ new Map(), d = n.vfsStore ? new iu(n.vfsStore) : void 0;
|
|
8145
8193
|
function f(e) {
|
|
8146
8194
|
if (u.clear(), e) for (let t of e) {
|
|
8147
|
-
let e =
|
|
8195
|
+
let e = eu(t.path);
|
|
8148
8196
|
u.set(e, {
|
|
8149
8197
|
path: e,
|
|
8150
8198
|
mode: t.mode
|
|
@@ -8217,7 +8265,7 @@ function Su(e, n = {}) {
|
|
|
8217
8265
|
return e;
|
|
8218
8266
|
},
|
|
8219
8267
|
createResource: d ? (e, t) => {
|
|
8220
|
-
let n =
|
|
8268
|
+
let n = eu(e), r = u.get(n), i = t === void 0 ? Z(s, n) : t;
|
|
8221
8269
|
return d.ensure(n, i, r?.mode ?? "verbatim");
|
|
8222
8270
|
} : void 0,
|
|
8223
8271
|
getResource: d ? (e) => {
|
|
@@ -8230,7 +8278,7 @@ function Su(e, n = {}) {
|
|
|
8230
8278
|
} : void 0;
|
|
8231
8279
|
} : void 0,
|
|
8232
8280
|
updateResource: d ? (e, t) => {
|
|
8233
|
-
let n =
|
|
8281
|
+
let n = eu(e);
|
|
8234
8282
|
d.update(n, t), Ma(s, n, t), T();
|
|
8235
8283
|
} : void 0,
|
|
8236
8284
|
deleteResource: d ? (e) => d.delete(e) : void 0,
|
|
@@ -8291,7 +8339,7 @@ function Su(e, n = {}) {
|
|
|
8291
8339
|
hint: "主数据仅暴露 schema 声明的字段;若需操作该字段,集成方需在 schema 中声明它"
|
|
8292
8340
|
});
|
|
8293
8341
|
let i = r ? Z(s, r) : s;
|
|
8294
|
-
!r && l && (i = $i(i, o)), p && (i =
|
|
8342
|
+
!r && l && (i = $i(i, o)), p && (i = au({
|
|
8295
8343
|
jp: r,
|
|
8296
8344
|
resolved: i,
|
|
8297
8345
|
resourcesByPath: p.resourcesByPath,
|
|
@@ -8308,7 +8356,7 @@ function Su(e, n = {}) {
|
|
|
8308
8356
|
if (i !== null) return i;
|
|
8309
8357
|
let a = Fa(e);
|
|
8310
8358
|
if (a.parseError) return Jr("", e, a.parseError);
|
|
8311
|
-
let c =
|
|
8359
|
+
let c = hu({
|
|
8312
8360
|
bindRef: s,
|
|
8313
8361
|
value: a.parsed,
|
|
8314
8362
|
schema: o,
|
|
@@ -8352,7 +8400,7 @@ function Su(e, n = {}) {
|
|
|
8352
8400
|
message: `edit 仅适用于对象/数组主数据,当前是 ${s === void 0 ? "undefined" : typeof s}`,
|
|
8353
8401
|
hint: "叶子(原始类型)请用 set_data 整体设置"
|
|
8354
8402
|
});
|
|
8355
|
-
let f =
|
|
8403
|
+
let f = gu({
|
|
8356
8404
|
bindRef: s,
|
|
8357
8405
|
patches: [{
|
|
8358
8406
|
op: r,
|
|
@@ -8418,7 +8466,7 @@ function Su(e, n = {}) {
|
|
|
8418
8466
|
hint: "仅 schema 声明的 key 可删"
|
|
8419
8467
|
});
|
|
8420
8468
|
if (p) {
|
|
8421
|
-
let t =
|
|
8469
|
+
let t = ru(e, p.resourcesByPath);
|
|
8422
8470
|
if (t) return Y({
|
|
8423
8471
|
code: t.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED",
|
|
8424
8472
|
message: `delete_data @ "${e}" 命中受保护字段 "${t.protectedPath}"(${t.spec.mode}),不可删除`,
|
|
@@ -8522,7 +8570,7 @@ function Su(e, n = {}) {
|
|
|
8522
8570
|
});
|
|
8523
8571
|
let n = l ? $i(s, o) : s, r;
|
|
8524
8572
|
try {
|
|
8525
|
-
r =
|
|
8573
|
+
r = Ul(n, e);
|
|
8526
8574
|
} catch (t) {
|
|
8527
8575
|
return Y({
|
|
8528
8576
|
code: "JSONPATH_SYNTAX",
|
|
@@ -8546,7 +8594,7 @@ function Su(e, n = {}) {
|
|
|
8546
8594
|
message: "主数据为空,无可搜索内容"
|
|
8547
8595
|
});
|
|
8548
8596
|
try {
|
|
8549
|
-
let a =
|
|
8597
|
+
let a = Gl(l ? $i(s, o) : s, e, {
|
|
8550
8598
|
mode: t,
|
|
8551
8599
|
fuzzyThreshold: n,
|
|
8552
8600
|
matchKey: r,
|
|
@@ -8597,7 +8645,7 @@ function Su(e, n = {}) {
|
|
|
8597
8645
|
e && (c = $i(c, e));
|
|
8598
8646
|
}
|
|
8599
8647
|
} else c = l ? $i(s, o) : s;
|
|
8600
|
-
let u = Pa(c), d = await
|
|
8648
|
+
let u = Pa(c), d = await ql(u, e, a && JSON.stringify(u).length > 1e5 ? 8e3 : 3e3);
|
|
8601
8649
|
if (!d.ok) {
|
|
8602
8650
|
let t = /超时/.test(d.error || "");
|
|
8603
8651
|
return Y({
|
|
@@ -8613,7 +8661,7 @@ function Su(e, n = {}) {
|
|
|
8613
8661
|
if (t === "transform") {
|
|
8614
8662
|
let e = d.result;
|
|
8615
8663
|
if (a) {
|
|
8616
|
-
let t =
|
|
8664
|
+
let t = gu({
|
|
8617
8665
|
bindRef: s,
|
|
8618
8666
|
patches: [{
|
|
8619
8667
|
op: "set",
|
|
@@ -8641,7 +8689,7 @@ function Su(e, n = {}) {
|
|
|
8641
8689
|
message: `主数据 bind 为原始类型(${s === null ? "null" : typeof s}),eval transform(patches) 无法就地替换`,
|
|
8642
8690
|
hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
|
|
8643
8691
|
});
|
|
8644
|
-
let t =
|
|
8692
|
+
let t = gu({
|
|
8645
8693
|
bindRef: s,
|
|
8646
8694
|
patches: e.patches,
|
|
8647
8695
|
schema: o,
|
|
@@ -8661,7 +8709,7 @@ function Su(e, n = {}) {
|
|
|
8661
8709
|
}
|
|
8662
8710
|
let t = e;
|
|
8663
8711
|
if (p) {
|
|
8664
|
-
let e =
|
|
8712
|
+
let e = lu({
|
|
8665
8713
|
value: t,
|
|
8666
8714
|
ctx: p
|
|
8667
8715
|
});
|
|
@@ -8710,7 +8758,7 @@ function Su(e, n = {}) {
|
|
|
8710
8758
|
e && (a = $i(a, e));
|
|
8711
8759
|
}
|
|
8712
8760
|
let c = a;
|
|
8713
|
-
if (p && (c =
|
|
8761
|
+
if (p && (c = au({
|
|
8714
8762
|
jp: t,
|
|
8715
8763
|
resolved: c,
|
|
8716
8764
|
resourcesByPath: p.resourcesByPath,
|
|
@@ -8720,7 +8768,7 @@ function Su(e, n = {}) {
|
|
|
8720
8768
|
} catch (e) {
|
|
8721
8769
|
return `- ${t}: [READ_INTERCEPT: ${e.message}]`;
|
|
8722
8770
|
}
|
|
8723
|
-
return r && r.length && (c = Ia(c, r)), i != null && (c = La(c, i)), c =
|
|
8771
|
+
return r && r.length && (c = Ia(c, r)), i != null && (c = La(c, i)), c = vu(c, f === "", C, S), c === void 0 ? `- ${t} = (undefined)` : `- ${t} = ${Q(c)}`;
|
|
8724
8772
|
});
|
|
8725
8773
|
return `多路径读取(共 ${t.length} 项,hash=${m}):\n${e.join("\n")}`;
|
|
8726
8774
|
}
|
|
@@ -8742,7 +8790,7 @@ function Su(e, n = {}) {
|
|
|
8742
8790
|
e && (g = $i(g, e));
|
|
8743
8791
|
}
|
|
8744
8792
|
let _ = g;
|
|
8745
|
-
if (p && (_ =
|
|
8793
|
+
if (p && (_ = au({
|
|
8746
8794
|
jp: h,
|
|
8747
8795
|
resolved: _,
|
|
8748
8796
|
resourcesByPath: p.resourcesByPath,
|
|
@@ -8755,7 +8803,7 @@ function Su(e, n = {}) {
|
|
|
8755
8803
|
message: `read 拦截器抛错: ${e.message}`
|
|
8756
8804
|
});
|
|
8757
8805
|
}
|
|
8758
|
-
r && r.length && (_ = Ia(_, r)), i != null && (_ = La(_, i)), _ =
|
|
8806
|
+
r && r.length && (_ = Ia(_, r)), i != null && (_ = La(_, i)), _ = vu(_, f === "", C, S);
|
|
8759
8807
|
let y = e ? "" : `主数据说明: ${c}\n格式: 写入值需为 JSON,且通过声明的 schema 校验(校验失败时 write 会返回结构化错误)。字段约束(类型/min/max/enum/必填/默认)见 systemPrompt「可操作数据」段,或用 schema_data({ jsonPath }) 按需查。\n\n`, x = r && r.length ? `(字段裁剪:${r.join(",")})` : "", w = i == null ? "" : `(深度≤${i})`, T = x || w ? ` ${x}${w}` : "";
|
|
8760
8808
|
if ((a !== void 0 || u !== void 0) && Array.isArray(_)) {
|
|
8761
8809
|
let e = _.length, t = Math.max(0, a ?? 0), n = Math.min(200, Math.max(1, u ?? 50)), r = _.slice(t, t + n), i = t + n < e;
|
|
@@ -8828,7 +8876,7 @@ function Su(e, n = {}) {
|
|
|
8828
8876
|
hint: "仅 schema 声明的 key 可删"
|
|
8829
8877
|
});
|
|
8830
8878
|
if (p) {
|
|
8831
|
-
let e =
|
|
8879
|
+
let e = ru(t.jsonPath, p.resourcesByPath);
|
|
8832
8880
|
if (e) return Y({
|
|
8833
8881
|
code: e.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED",
|
|
8834
8882
|
message: `write delete @ "${t.jsonPath}" 命中受保护字段 "${e.protectedPath}"(${e.spec.mode}),不可删除`,
|
|
@@ -8861,7 +8909,7 @@ function Su(e, n = {}) {
|
|
|
8861
8909
|
op: t.op ?? "set",
|
|
8862
8910
|
jsonPath: t.jsonPath || "",
|
|
8863
8911
|
value: g
|
|
8864
|
-
}]), i =
|
|
8912
|
+
}]), i = gu({
|
|
8865
8913
|
bindRef: s,
|
|
8866
8914
|
patches: n,
|
|
8867
8915
|
schema: o,
|
|
@@ -8878,13 +8926,13 @@ function Su(e, n = {}) {
|
|
|
8878
8926
|
detail: `${i.applied.length} 个 patch${i.applied.length > 1 ? "(批量)" : ""}`,
|
|
8879
8927
|
value: i.applied.map((e) => `${e.op}@${e.jp}`),
|
|
8880
8928
|
timestamp: Date.now()
|
|
8881
|
-
}), a && (a(s), T()), b($(s), d),
|
|
8929
|
+
}), a && (a(s), T()), b($(s), d), Su(i.clone), `已 write(edit) 主数据(${i.applied.length} 个 patch)。当前值:${Q(i.clone, 600)} (新 hash=${$(s)})`) : i.error;
|
|
8882
8930
|
}
|
|
8883
8931
|
let C = Fa(g);
|
|
8884
8932
|
if (C.parseError) return Jr("", g, C.parseError);
|
|
8885
8933
|
let w = await k("set", S);
|
|
8886
8934
|
if (w !== null) return w;
|
|
8887
|
-
let E =
|
|
8935
|
+
let E = hu({
|
|
8888
8936
|
bindRef: s,
|
|
8889
8937
|
value: C.parsed,
|
|
8890
8938
|
schema: o,
|
|
@@ -8900,7 +8948,7 @@ function Su(e, n = {}) {
|
|
|
8900
8948
|
if (c) return `dryRun(set): schema 校验通过。预览新值:${Q(E.data, 600)}。未实际写入、未入快照。`;
|
|
8901
8949
|
a && (a(s), T());
|
|
8902
8950
|
let ee = $(s);
|
|
8903
|
-
return b(ee, d),
|
|
8951
|
+
return b(ee, d), Su(E.data), `已 write(set) 主数据 = ${Q(E.data, 600)} (新 hash=${ee})${l ? "(白名单模式:仅更新 schema 声明字段,未声明字段保留)" : ""}`;
|
|
8904
8952
|
}, {
|
|
8905
8953
|
name: "write",
|
|
8906
8954
|
description: "写入主数据(高层入口,合并 set/edit/delete + 自动乐观锁 + 自动快照)。四意图:① 整体替换 write({value:整个对象});② 增量 write({patch:{op,jsonPath,value}}) op=set/remove/merge/append/move(move 的 value=目标路径字符串);③ 批量原子 write({patches:[...]})(任一失败整批回滚);④ 删子路径 write({patch:{jsonPath},del:true})。dryRun:true 预检不落盘。写入自动 schema 校验(失败不写,按错误修正重试)+ 自动快照。详细用法见系统提示「能力使用提示」。",
|
|
@@ -8965,7 +9013,7 @@ function Su(e, n = {}) {
|
|
|
8965
9013
|
});
|
|
8966
9014
|
r = t.value, i = `快照 #${t.id}`;
|
|
8967
9015
|
}
|
|
8968
|
-
let a = l ? $i(s, o) : s, c =
|
|
9016
|
+
let a = l ? $i(s, o) : s, c = Ka(r, Pa(a));
|
|
8969
9017
|
return c.length ? `差异(当前 vs ${i},共 ${c.length} 处):\n${c.map((e) => ` ${e.path}: ${Q(e.from)} → ${Q(e.to)}`).join("\n")}` : `无差异:当前主数据与 ${i} 完全相同。`;
|
|
8970
9018
|
}, {
|
|
8971
9019
|
name: "diff_data",
|
|
@@ -9017,7 +9065,7 @@ function Su(e, n = {}) {
|
|
|
9017
9065
|
}
|
|
9018
9066
|
let f = await k("set", n || (x ? y(a) : void 0));
|
|
9019
9067
|
if (f !== null) return f;
|
|
9020
|
-
let g =
|
|
9068
|
+
let g = hu({
|
|
9021
9069
|
bindRef: s,
|
|
9022
9070
|
value: d,
|
|
9023
9071
|
schema: o,
|
|
@@ -9049,7 +9097,7 @@ function Su(e, n = {}) {
|
|
|
9049
9097
|
message: "未提供 path 或有效 handle",
|
|
9050
9098
|
hint: "传 path(受保护字段)或 handle(占位符 ⟦res:handle⟧ 里的句柄)"
|
|
9051
9099
|
});
|
|
9052
|
-
let r =
|
|
9100
|
+
let r = eu(n);
|
|
9053
9101
|
if (!u.has(r)) return Y({
|
|
9054
9102
|
code: "RESOURCE_NOT_FOUND",
|
|
9055
9103
|
message: `"${n}" 不是受保护字段`,
|
|
@@ -9089,7 +9137,7 @@ function Su(e, n = {}) {
|
|
|
9089
9137
|
message: "resource_update 需要 path",
|
|
9090
9138
|
hint: "传要更新的 verbatim 受保护字段路径"
|
|
9091
9139
|
});
|
|
9092
|
-
let i =
|
|
9140
|
+
let i = eu(e), a = u.get(i);
|
|
9093
9141
|
if (!a) return Y({
|
|
9094
9142
|
code: "RESOURCE_NOT_FOUND",
|
|
9095
9143
|
message: `"${e}" 不是受保护字段`,
|
|
@@ -9177,8 +9225,8 @@ function Su(e, n = {}) {
|
|
|
9177
9225
|
}
|
|
9178
9226
|
//#endregion
|
|
9179
9227
|
//#region src/core/tools/fetchDoc.ts
|
|
9180
|
-
var
|
|
9181
|
-
let n = new AbortController(), r = setTimeout(() => n.abort(),
|
|
9228
|
+
var wu = 3e4, Tu = [r(async ({ url: e, as: t }) => {
|
|
9229
|
+
let n = new AbortController(), r = setTimeout(() => n.abort(), wu);
|
|
9182
9230
|
try {
|
|
9183
9231
|
let r = await fetch(e, {
|
|
9184
9232
|
method: "GET",
|
|
@@ -9195,7 +9243,7 @@ var Cu = 3e4, wu = [r(async ({ url: e, as: t }) => {
|
|
|
9195
9243
|
].join("\n");
|
|
9196
9244
|
} catch (t) {
|
|
9197
9245
|
let r = t?.message || String(t);
|
|
9198
|
-
return n.signal.aborted ? `获取失败:请求超时(${
|
|
9246
|
+
return n.signal.aborted ? `获取失败:请求超时(${wu}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
|
|
9199
9247
|
} finally {
|
|
9200
9248
|
clearTimeout(r);
|
|
9201
9249
|
}
|
|
@@ -9206,7 +9254,7 @@ var Cu = 3e4, wu = [r(async ({ url: e, as: t }) => {
|
|
|
9206
9254
|
url: t.string().describe("要抓取的 URL(同源或已配 CORS)"),
|
|
9207
9255
|
as: t.enum(["text", "markdown"]).optional().describe("返回格式标签,默认 text")
|
|
9208
9256
|
})
|
|
9209
|
-
})],
|
|
9257
|
+
})], Eu = [
|
|
9210
9258
|
"id",
|
|
9211
9259
|
"class",
|
|
9212
9260
|
"href",
|
|
@@ -9218,12 +9266,12 @@ var Cu = 3e4, wu = [r(async ({ url: e, as: t }) => {
|
|
|
9218
9266
|
"aria-label",
|
|
9219
9267
|
"name",
|
|
9220
9268
|
"type"
|
|
9221
|
-
],
|
|
9222
|
-
function
|
|
9269
|
+
], Du = /^(value|srcdoc|formaction|on\w+)$/i, Ou = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session/i;
|
|
9270
|
+
function ku(e, t) {
|
|
9223
9271
|
if (!e) return null;
|
|
9224
|
-
let { depth: n, attrs: r, includeText: i = !0 } = t, a = r !== void 0, o = r ??
|
|
9272
|
+
let { depth: n, attrs: r, includeText: i = !0 } = t, a = r !== void 0, o = r ?? Eu, s = (e) => {
|
|
9225
9273
|
let t = {};
|
|
9226
|
-
for (let n of Array.from(e.attributes)) (a ? o.includes(n.name) : o.includes(n.name) || n.name.startsWith("data-")) && (
|
|
9274
|
+
for (let n of Array.from(e.attributes)) (a ? o.includes(n.name) : o.includes(n.name) || n.name.startsWith("data-")) && (Du.test(n.name) || Ou.test(n.name) || (t[n.name] = n.value));
|
|
9227
9275
|
return t;
|
|
9228
9276
|
}, c = (e, t) => {
|
|
9229
9277
|
let n = {
|
|
@@ -9239,10 +9287,10 @@ function Ou(e, t) {
|
|
|
9239
9287
|
};
|
|
9240
9288
|
return c(e, n);
|
|
9241
9289
|
}
|
|
9242
|
-
var
|
|
9290
|
+
var Au = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
|
|
9243
9291
|
let i = e ? document.querySelector(e) : document.body;
|
|
9244
9292
|
if (!i) return `未找到匹配元素:selector="${e}"`;
|
|
9245
|
-
let a =
|
|
9293
|
+
let a = ku(i, {
|
|
9246
9294
|
depth: t ?? 3,
|
|
9247
9295
|
attrs: n,
|
|
9248
9296
|
includeText: r ?? !0
|
|
@@ -9257,14 +9305,14 @@ var ku = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
|
|
|
9257
9305
|
attrs: t.array(t.string()).optional().describe("属性白名单(传了 = 严格白名单;不传 = 默认常用 + data-*)"),
|
|
9258
9306
|
includeText: t.boolean().optional().describe("是否包含直接文本(默认 true)")
|
|
9259
9307
|
})
|
|
9260
|
-
}),
|
|
9308
|
+
}), ju = [Au];
|
|
9261
9309
|
//#endregion
|
|
9262
9310
|
//#region src/core/tools/envTool.ts
|
|
9263
|
-
function
|
|
9311
|
+
function Mu(e) {
|
|
9264
9312
|
let t = e;
|
|
9265
9313
|
return typeof t.tagName == "string" || typeof t.nodeType == "number" && typeof t.nodeName == "string";
|
|
9266
9314
|
}
|
|
9267
|
-
function
|
|
9315
|
+
function Nu(e, t = 3, n = 2e3, r) {
|
|
9268
9316
|
if (e == null) return e;
|
|
9269
9317
|
if (typeof e == "string") return e.length > n ? e.slice(0, n) + "…(已截断)" : e;
|
|
9270
9318
|
if (typeof e == "number" || typeof e == "boolean") return e;
|
|
@@ -9273,14 +9321,14 @@ function Mu(e, t = 3, n = 2e3, r) {
|
|
|
9273
9321
|
if (typeof e == "bigint") return `${e.toString()}n`;
|
|
9274
9322
|
if (typeof e != "object") return String(e);
|
|
9275
9323
|
let i = e;
|
|
9276
|
-
if (
|
|
9324
|
+
if (Mu(i)) {
|
|
9277
9325
|
let e = i;
|
|
9278
9326
|
return e.tagName ? `[Element: <${e.tagName.toLowerCase()}>]` : `[Node: ${e.nodeName}]`;
|
|
9279
9327
|
}
|
|
9280
9328
|
if (r?.has(i)) return "[Circular]";
|
|
9281
9329
|
let a = r ?? /* @__PURE__ */ new WeakSet();
|
|
9282
9330
|
if (a.add(i), Array.isArray(e)) {
|
|
9283
|
-
let r = e.slice(0, 100).map((e) =>
|
|
9331
|
+
let r = e.slice(0, 100).map((e) => Nu(e, t - 1, n, a));
|
|
9284
9332
|
return e.length > 100 && r.push(`…(共 ${e.length} 项,已截断)`), r;
|
|
9285
9333
|
}
|
|
9286
9334
|
if (t < 0) return "(对象,已截断)";
|
|
@@ -9292,14 +9340,14 @@ function Mu(e, t = 3, n = 2e3, r) {
|
|
|
9292
9340
|
break;
|
|
9293
9341
|
}
|
|
9294
9342
|
try {
|
|
9295
|
-
o[r] =
|
|
9343
|
+
o[r] = Nu(i[r], t - 1, n, a);
|
|
9296
9344
|
} catch {
|
|
9297
9345
|
o[r] = "(getter 抛错)";
|
|
9298
9346
|
}
|
|
9299
9347
|
}
|
|
9300
9348
|
return o;
|
|
9301
9349
|
}
|
|
9302
|
-
function
|
|
9350
|
+
function Pu(e) {
|
|
9303
9351
|
let t = e ?? (typeof window < "u" ? window : {}), n = t.navigator, r = t.location, i = t.document;
|
|
9304
9352
|
return {
|
|
9305
9353
|
location: {
|
|
@@ -9332,9 +9380,9 @@ function Nu(e) {
|
|
|
9332
9380
|
} : "(无 document)"
|
|
9333
9381
|
};
|
|
9334
9382
|
}
|
|
9335
|
-
var
|
|
9383
|
+
var Fu = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|opener|parent|top|self|window|globalThis|closed|history|navigation|trustedTypes|origin|crossOriginIsolated)$/, Iu = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session|ticket/i, Lu = r(({ key: e }) => {
|
|
9336
9384
|
if (e) {
|
|
9337
|
-
if (
|
|
9385
|
+
if (Fu.test(e) || Iu.test(e)) return JSON.stringify({
|
|
9338
9386
|
key: e,
|
|
9339
9387
|
denied: !0,
|
|
9340
9388
|
reason: "安全:该 key 在 denylist(localStorage/sessionStorage/cookie/document 或敏感命名 token/secret/key/auth),不读取防泄漏"
|
|
@@ -9344,18 +9392,18 @@ var Pu = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|open
|
|
|
9344
9392
|
key: e,
|
|
9345
9393
|
exists: t !== void 0,
|
|
9346
9394
|
type: typeof t,
|
|
9347
|
-
value:
|
|
9395
|
+
value: Nu(t)
|
|
9348
9396
|
}, null, 2);
|
|
9349
9397
|
}
|
|
9350
|
-
return JSON.stringify(
|
|
9398
|
+
return JSON.stringify(Pu(), null, 2);
|
|
9351
9399
|
}, {
|
|
9352
9400
|
name: "inspect_env",
|
|
9353
9401
|
description: "读宿主页面环境信息(排查调试)。不传参返回摘要(URL/origin、浏览器/语言、viewport、title/readyState);传 key 读指定 window 属性值(如 key:\"appConfig\")。只读,大结果自动外存 vfs。",
|
|
9354
9402
|
schema: t.object({ key: t.string().optional().describe("要读取的 window 属性名(如 \"appConfig\"/\"__DEBUG__\");不传 = 返回环境摘要") })
|
|
9355
|
-
}),
|
|
9403
|
+
}), Ru = [Lu];
|
|
9356
9404
|
//#endregion
|
|
9357
9405
|
//#region src/core/harness/budget.ts
|
|
9358
|
-
function
|
|
9406
|
+
function zu(e, t, n) {
|
|
9359
9407
|
let r = 0;
|
|
9360
9408
|
return {
|
|
9361
9409
|
name: "budget",
|
|
@@ -9380,12 +9428,12 @@ function Ru(e, t, n) {
|
|
|
9380
9428
|
}
|
|
9381
9429
|
//#endregion
|
|
9382
9430
|
//#region src/core/sdk/actions.ts
|
|
9383
|
-
var
|
|
9384
|
-
function
|
|
9431
|
+
var Bu = /^[a-zA-Z][a-zA-Z0-9_]*$/;
|
|
9432
|
+
function Vu(e) {
|
|
9385
9433
|
let n = [];
|
|
9386
9434
|
for (let [i, a] of Object.entries(e)) {
|
|
9387
|
-
if (!
|
|
9388
|
-
console.warn(`[page-agent-sdk][actions] 动作名 "${i}" 非法(须匹配 ${
|
|
9435
|
+
if (!Bu.test(i)) {
|
|
9436
|
+
console.warn(`[page-agent-sdk][actions] 动作名 "${i}" 非法(须匹配 ${Bu}),已跳过`);
|
|
9389
9437
|
continue;
|
|
9390
9438
|
}
|
|
9391
9439
|
let e = a.description || `宿主动作 ${i}`;
|
|
@@ -9405,9 +9453,9 @@ function Bu(e) {
|
|
|
9405
9453
|
}
|
|
9406
9454
|
return n;
|
|
9407
9455
|
}
|
|
9408
|
-
function
|
|
9456
|
+
function Hu(e) {
|
|
9409
9457
|
let t = {};
|
|
9410
|
-
for (let [n, r] of Object.entries(e))
|
|
9458
|
+
for (let [n, r] of Object.entries(e)) Bu.test(n) && (t[n] = {
|
|
9411
9459
|
description: r.description,
|
|
9412
9460
|
hasParams: !!r.params
|
|
9413
9461
|
});
|
|
@@ -9415,12 +9463,12 @@ function Vu(e) {
|
|
|
9415
9463
|
}
|
|
9416
9464
|
//#endregion
|
|
9417
9465
|
//#region src/core/toolsets.ts
|
|
9418
|
-
var
|
|
9419
|
-
function
|
|
9420
|
-
return
|
|
9466
|
+
var Uu = Tu, Wu = ju;
|
|
9467
|
+
function Gu(e, t) {
|
|
9468
|
+
return Cu(e, t);
|
|
9421
9469
|
}
|
|
9422
|
-
function
|
|
9423
|
-
let a =
|
|
9470
|
+
function Ku(e, t, n, r, i) {
|
|
9471
|
+
let a = Dl(e);
|
|
9424
9472
|
return [
|
|
9425
9473
|
...a.dataOps ? t : [],
|
|
9426
9474
|
...a.fetch ? n : [],
|
|
@@ -9430,7 +9478,7 @@ function Gu(e, t, n, r, i) {
|
|
|
9430
9478
|
}
|
|
9431
9479
|
//#endregion
|
|
9432
9480
|
//#region src/core/sdk/toolRegistry.ts
|
|
9433
|
-
function
|
|
9481
|
+
function qu(e) {
|
|
9434
9482
|
let t = /* @__PURE__ */ new Map(), n = [];
|
|
9435
9483
|
for (let r of e) for (let e of r.tools) {
|
|
9436
9484
|
let i = t.get(e.name);
|
|
@@ -9450,15 +9498,15 @@ function Ku(e) {
|
|
|
9450
9498
|
}
|
|
9451
9499
|
//#endregion
|
|
9452
9500
|
//#region src/core/harness/usageHints.ts
|
|
9453
|
-
var
|
|
9454
|
-
function
|
|
9455
|
-
let a =
|
|
9501
|
+
var Ju = .7;
|
|
9502
|
+
function Yu(e, t, n = "simple", r, i) {
|
|
9503
|
+
let a = Dl(e), o = n !== "advanced", s = n === "minimal";
|
|
9456
9504
|
return {
|
|
9457
9505
|
name: "usageHints",
|
|
9458
9506
|
augmentPrompt: (n) => {
|
|
9459
9507
|
let r = [];
|
|
9460
9508
|
if (a.planning && (r.push("【自适应规划】按任务复杂度决定是否先规划,不要对简单任务过度编排:"), r.push(" · 简单/明确任务(改单字段、调样式、查值)→ 直接 read/write 执行,不必 write_todos。"), r.push(" · 复杂任务(多步、大改、有歧义、不可逆)→ 先 write_todos 拆解,首个任务标 in_progress,逐项推进。"), r.push(" · 执行中发现步骤要改/补/细分 → 用 update_todo({id, content?, status?}) 按 id 增量改单项,不必重传整个清单。"), e?.humanConfirm ? r.push(" · 规划出多步方案若需用户拍板 → 先 request_human_confirmation 给方案选项,确认后再执行。") : r.push(" · 规划出多步方案若需用户拍板 → 以文字列出方案选项等用户回复,勿自行拍板。"), r.push(" · 规划阶段有轮次预算(maxPlanRevisions,默认 5):勿反复调研/改计划而不执行,规划充分后即开始 write 落地。")), t && (o ? (r.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 追加数组 / move 移动数组元素(value=目标路径字符串:数组本身=追加到末尾、数组内下标=插到该位置;同数组即重排如组件调序,目标下标按移除源后解释,一步完成免双 set 交换);批量多改动 write({patches:[{op,jsonPath,value},...]});删子路径 write({patch:{jsonPath:\"路径\"}, del:true})。写入自动经 schema 校验(失败不写,按错误提示改值类型/形状后重试)+ 自动存快照" + (s ? "。" : "(出错可用 restore_data 回退)。")), r.push("修改大对象/数组优先用 write 的 patch 增量(只发改动部分),避免整体重传被 max_tokens 截断致 JSON 不完整。"), r.push("读大数组(read 返回 hasMore=true)用 read({jsonPath,offset,limit}) 分页(offset+=limit 续读,默认 limit=50);一次读多个不相关子路径用 read({jsonPaths:[...]}) 省轮次;复杂 patches 改动先 write({patches,dryRun:true}) 预检(走完整校验不落盘)。"), r.push("read/describe 返回按 schema 投影:仅 schema 声明的字段可见(未声明字段自动隐藏,防误操作);要操作某字段需集成方在 schema 声明。"), s || (r.push("查任意路径完整约束或对比快照差异需切 advanced 工具模式(schema_data/diff_data,当前未装载勿调用);查历史快照值(只读不改当前)用 history_data({id?,jsonPath?})。"), r.push("在大数组里按条件筛选用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素 path/index;定位后用 write patch 改。找名字记不清的元素用 search_data(substring/regex/fuzzy)。批量过滤/映射/聚合/重写大数组用 eval_script(沙箱脚本,mode=query 只读/transform 落地)。"))) : (r.push("改主数据前先 get_data({jsonPath}) 读其当前真实值与 hash(返回末尾 hash=xxx),基于真实值改,不要凭记忆。写入(set/edit/delete)时回传 expectedHash=该 hash 启用乐观锁——若主数据在你 get 之后被外部代码/其他 agent/用户手动改过,会触发冲突:集成方若开启人工介入,工具会挂起等用户决定(保留外部/强制覆盖/回退),你应等待工具返回后按结果继续(保留外部→重新 get 再改;强制覆盖→已写入,继续;回退→已回退到历史快照,基于回退值重写);未开启人工介入时返回 VERSION_CONFLICT 不写入,重新 get 拿最新值与 hash 再改。"), r.push("不确定主数据字段结构时用 describe_data 查看说明。"), r.push("修改大对象/数组优先用 edit_data 增量 patch(只发改动部分),避免 set_data 整体重传被 max_tokens 截断导致 JSON 不完整、校验失败。"), r.push("修改主数据出错时可用 restore_data 回退最近一次。"), r.push("在大数组里按条件筛选元素用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素的 path/index;定位后再 edit_data 改。"), r.push("找名字记不清的元素用 search_data(支持 substring/regex/fuzzy 模糊搜索)。"), r.push("需要过滤/映射/聚合/批量重写大数组时用 eval_script(沙箱脚本,入参 data);只读探查用 mode=query,批量重写用 mode=transform(返回值经校验后落地)。"), r.push("读大数组用 read({jsonPath,offset,limit}) 分页(返回 hasMore=true 时 offset+=limit 续读);一次读多个不相关子路径用 read({jsonPaths});复杂改动先 write({...,dryRun:true}) 预检不落盘。"), r.push("对比当前与历史快照(或一段 JSON against)的差异用 diff_data({snapshotId?,against?})(返回结构化 path→from/to,verify 自纠/操作审计/\"刚才改了啥\");只读查历史快照值用 history_data({id?,jsonPath?})。"))), a.subagent && r.push("独立子任务可 spawn_agent 委派(过程隔离,不占主上下文):默认只读,需要子 agent 写数据时传 writablePaths(路径前缀白名单,越界 PATH_OUT_OF_SCOPE)。多个独立子任务可 spawn_agents 并行委派(各子互不通信,结论由你汇总;并行委派不可授写权限,写操作由你收尾执行)。"), a.inspectEnv && r.push("排查页面环境(当前 URL/浏览器/视口/集成方调试变量)用 inspect_env——不传参返回环境摘要(location/navigator/viewport/document),传 key 读特定 window 属性(如 inspect_env({key:\"appConfig\"}) 读 window.appConfig)。改完数据看渲染、定位\"为何没生效\"时用它(只读,不改数据)。"), a.domInspect && r.push("改完数据想确认渲染是否生效(或定位元素/辅助 UI 设计问答)用 get_dom({selector?,depth?}) 读渲染后 DOM(结构化返回 tag/attrs/text/children,depth 控制深度防爆炸,只读)。配合宿主 actions(save_draft/publish 等)形成\"改数据→get_dom 看渲染→触发动作\"闭环。"), a.draftWrite && !o && (r.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。"), r.push("⚠️ 大 JSON 分块构建是典型多轮工具调用(draft_write×N + draft_commit + read 确认 + 调研 read/query),默认 maxToolRounds=10 可能触顶被 while 截断导致草稿写不完;目标组件数大时集成方应在 createChatSdk 配 maxToolRounds ≥ 20(或按 N+5 估算)。draft_commit 提交同样走乐观锁(改前 read 拿 hash,bind 被改过会触发冲突介入,不静默覆盖)。")), a.todoDeps && r.push("复杂任务可用 todos 层级依赖:write_todos 时给 todo 传 parentId(父任务 id,表达层级)+ deps(依赖的 todo id 数组,必须先完成)。有依赖的任务,deps 全 completed 后再标 in_progress;完成时 update_todo({id, status:\"completed\", evidence:\"完成证据\"}) 记证据。无依赖关系的任务不传 parentId/deps(扁平)。"), a.focus && !o && (r.push("【上下文聚焦】判断任务范围,用 set_focus/add_focus/remove_focus/clear_focus 自动收敛工作范围:"), r.push(" · 局部任务(只改某一组件/区域,如「调导航栏」「改 components.3 样式」)→ 先 read 定位 jsonPath,再 set_focus({path:\"该子树路径\"}) 聚焦;聚焦后每轮只看该子树结构,写其他位置会被 PATH_DENIED 拒绝。"), r.push(" · 多个相关组件(如「同时改导航栏和页脚」)→ set_focus 聚焦首个后用 add_focus({path}) 追加其余;聚焦后可写任一焦点子树,越界仍被拒;移除单个用 remove_focus({path})。"), r.push(" · 全局任务(多处/整体结构,如「重排所有组件」「换主题」)→ 不要聚焦,保持全量视野直接写。"), r.push(" · 完成局部精修、要转向其他区域或做整体改动 → 调 clear_focus 退出聚焦(清空全部焦点),恢复全部读写权限。"), r.push(" · set_focus/add_focus 的 path 必须在 schema 内(类型校验);不确定路径先 read/describe_data 查。")), e?.subagents?.length) {
|
|
9461
|
-
let t = e.subagents.filter((e) => (e.temperature ?? 0) >=
|
|
9509
|
+
let t = e.subagents.filter((e) => (e.temperature ?? 0) >= Ju || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), n = e.subagents.filter((e) => (e.temperature ?? 0) < Ju && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
|
|
9462
9510
|
r.push("【规划-反思-执行·路由】按任务性质选模式,不要对简单任务过度编排:"), t.length && (r.push(` · 创作/设计/开放性需求(如"设计主题风格""换个感觉")→ 先调 ${t.map((e) => "use_" + e.id).join("/")} 出 2-3 套方案(高温创意),`), r.push(e?.humanConfirm ? " 不要自己拍板;拿到方案后,若需用户拍板用 request_human_confirmation 弹选项。" : " 不要自己拍板;拿到方案后以文字列出选项等用户回复(humanConfirm 未开,勿调不存在工具)。")), n.length && r.push(` · 严谨/易错/校验类 → 可先调 ${n.map((e) => "use_" + e.id).join("/")} 反思挑刺(低温审查),据反馈修订。`), r.push(o ? " · 方案定稿后,由你(主 agent)用 write 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。" : " · 方案定稿后,由你(主 agent)用 edit_data 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。"), r.push(" · 简单/明确任务(如\"标题改红色\")直接执行,不必走规划-反思。");
|
|
9463
9511
|
}
|
|
9464
9512
|
e?.humanConfirm && (r.push("【人工确认·必读】以下情形必须先调 request_human_confirmation 征询用户、拿到答复后再继续,不要自行拍板:"), r.push(" 1) 用户让你「给方案/列选项/我来选/挑一个」时:把每个方案作为一个 option,调 request_human_confirmation(question=简述, options=[方案A,方案B,...], recommendation=你推荐的)。不要只回文字罗列方案让用户自己回复——要用工具把选项做成可点选按钮。"), r.push(" 2) 需求有歧义/不确定时:调工具问清楚(options 不传则用户答同意或拒绝)。"), r.push(" 3) 即将执行高风险不可逆操作(删除/覆盖/批量改动)前:调工具确认。"), r.push(" 4) 规划出多步方案需用户确认时:把整个方案(或关键分步)作为 option 调 request_human_confirmation,确认后再执行。"), r.push("用户在选项里选了哪个,就按那个方案继续;选「拒绝」则停止并询问如何调整。"));
|
|
@@ -9478,7 +9526,7 @@ function Ju(e, t, n = "simple", r, i) {
|
|
|
9478
9526
|
}
|
|
9479
9527
|
//#endregion
|
|
9480
9528
|
//#region src/core/harness/resourcesPin.ts
|
|
9481
|
-
function
|
|
9529
|
+
function Xu(e) {
|
|
9482
9530
|
let t = e.toolsExposed === !1 ? "读到 ⟦frozen:path⟧/⟦res:handle⟧ 占位符 = 精确值在冻结区/资源池(不入消息流);resource_get/resource_update 为 advanced 工具,当前模式未装载,勿尝试调用;freeze 字段不可写(撞 FROZEN_FIELD 即放弃);verbatim 字段保持原值,勿在当前模式下尝试改写(直接写新值会 VERBATIM_MISMATCH);撞 RESOURCE_EVICTED/RESOURCE_NOT_FOUND 重新 read 懒注册。" : "读到 ⟦frozen:path⟧/⟦res:handle⟧ 占位符 = 精确值在冻结区/资源池(不入消息流);需真值用 resource_get({path});freeze 字段不可写(撞 FROZEN_FIELD 即放弃);verbatim 直接写新值会 VERBATIM_MISMATCH,先 resource_update 再写回句柄;撞 RESOURCE_EVICTED/RESOURCE_NOT_FOUND 重新 read 懒注册。";
|
|
9483
9531
|
return {
|
|
9484
9532
|
name: "resourcesPin",
|
|
@@ -9493,78 +9541,78 @@ function Yu(e) {
|
|
|
9493
9541
|
}
|
|
9494
9542
|
//#endregion
|
|
9495
9543
|
//#region src/core/backends/skillStore.ts
|
|
9496
|
-
var
|
|
9497
|
-
function
|
|
9498
|
-
return `${
|
|
9544
|
+
var Zu = "v:1::skill-store", Qu = "chat-sdk";
|
|
9545
|
+
function $u(e, t, n) {
|
|
9546
|
+
return `${Zu}::${e}::${t}::${n}`;
|
|
9499
9547
|
}
|
|
9500
|
-
function
|
|
9501
|
-
return `${
|
|
9548
|
+
function ed(e, t) {
|
|
9549
|
+
return `${Zu}::${e}::${t}::`;
|
|
9502
9550
|
}
|
|
9503
|
-
function
|
|
9504
|
-
let t = e.dbName ??
|
|
9551
|
+
function td(e = {}) {
|
|
9552
|
+
let t = e.dbName ?? Qu, n = e.backend ?? "indexed", r = e.id ?? "", i, a, o = new Promise((e) => {
|
|
9505
9553
|
a = e;
|
|
9506
9554
|
});
|
|
9507
9555
|
return (async () => {
|
|
9508
9556
|
try {
|
|
9509
9557
|
if (n === "indexed") {
|
|
9510
9558
|
if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
|
|
9511
|
-
i = await
|
|
9559
|
+
i = await bl(t), a(!0);
|
|
9512
9560
|
} else if (n === "session") {
|
|
9513
9561
|
if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
|
|
9514
|
-
i =
|
|
9562
|
+
i = xl(sessionStorage), a(!0);
|
|
9515
9563
|
} else if (n === "local") {
|
|
9516
9564
|
if (typeof localStorage > "u") throw Error("localStorage 不可用");
|
|
9517
|
-
i =
|
|
9518
|
-
} else i =
|
|
9565
|
+
i = xl(localStorage), a(!0);
|
|
9566
|
+
} else i = yl(), a(!1);
|
|
9519
9567
|
} catch {
|
|
9520
|
-
i =
|
|
9568
|
+
i = yl(), a(!1);
|
|
9521
9569
|
}
|
|
9522
9570
|
})(), {
|
|
9523
9571
|
ready: o,
|
|
9524
9572
|
async list() {
|
|
9525
9573
|
let e = [];
|
|
9526
|
-
return await i.scan(
|
|
9574
|
+
return await i.scan(ed(t, r), (t, n) => {
|
|
9527
9575
|
e.push(n);
|
|
9528
9576
|
}), e;
|
|
9529
9577
|
},
|
|
9530
9578
|
async get(e) {
|
|
9531
|
-
return await i.get(
|
|
9579
|
+
return await i.get($u(t, r, e));
|
|
9532
9580
|
},
|
|
9533
9581
|
async put(e) {
|
|
9534
9582
|
try {
|
|
9535
|
-
await i.set(
|
|
9583
|
+
await i.set($u(t, r, e.name), e);
|
|
9536
9584
|
} catch (e) {
|
|
9537
|
-
|
|
9585
|
+
dl(e) && (i = yl());
|
|
9538
9586
|
}
|
|
9539
9587
|
},
|
|
9540
9588
|
async remove(e) {
|
|
9541
|
-
let n =
|
|
9589
|
+
let n = $u(t, r, e);
|
|
9542
9590
|
return await i.get(n) == null ? !1 : (await i.del(n), !0);
|
|
9543
9591
|
},
|
|
9544
9592
|
async clear() {
|
|
9545
|
-
await i.clearPrefix(
|
|
9593
|
+
await i.clearPrefix(ed(t, r));
|
|
9546
9594
|
},
|
|
9547
9595
|
dispose() {}
|
|
9548
9596
|
};
|
|
9549
9597
|
}
|
|
9550
|
-
var
|
|
9551
|
-
function
|
|
9598
|
+
var nd = /large_results\/[^\s"'`),]+\.txt/g;
|
|
9599
|
+
function rd(e) {
|
|
9552
9600
|
let t = /* @__PURE__ */ new Set(), n = (e) => {
|
|
9553
9601
|
if (typeof e != "string" || !e) return;
|
|
9554
9602
|
let n;
|
|
9555
|
-
for (
|
|
9603
|
+
for (nd.lastIndex = 0; (n = nd.exec(e)) !== null;) t.add(n[0]);
|
|
9556
9604
|
};
|
|
9557
9605
|
for (let t of e) if (n(t.content), t.steps) for (let e of t.steps) n(e.result);
|
|
9558
9606
|
return t;
|
|
9559
9607
|
}
|
|
9560
|
-
function
|
|
9608
|
+
function id(e, t) {
|
|
9561
9609
|
let n = [];
|
|
9562
9610
|
for (let r of Object.keys(e)) r.startsWith("large_results/") && !t.has(r) && n.push(r);
|
|
9563
9611
|
return n;
|
|
9564
9612
|
}
|
|
9565
9613
|
//#endregion
|
|
9566
9614
|
//#region src/core/utils/serialRunner.ts
|
|
9567
|
-
function
|
|
9615
|
+
function ad() {
|
|
9568
9616
|
let e = Promise.resolve();
|
|
9569
9617
|
return function(t) {
|
|
9570
9618
|
let n = e.then(t, t);
|
|
@@ -9573,20 +9621,27 @@ function id() {
|
|
|
9573
9621
|
}
|
|
9574
9622
|
//#endregion
|
|
9575
9623
|
//#region src/core/sdk/createChatSdk.ts
|
|
9576
|
-
var
|
|
9577
|
-
function
|
|
9624
|
+
var od = 30, sd = /* @__PURE__ */ new Map();
|
|
9625
|
+
function cd(e, t) {
|
|
9578
9626
|
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;
|
|
9579
9627
|
}
|
|
9580
|
-
function
|
|
9628
|
+
function ld(e) {
|
|
9629
|
+
return e === "spawn_agent" || e === "spawn_agents" || e.startsWith("use_");
|
|
9630
|
+
}
|
|
9631
|
+
function ud(e, t, n, r) {
|
|
9581
9632
|
let i = 0;
|
|
9582
9633
|
return {
|
|
9583
9634
|
name: "sdk-events",
|
|
9584
9635
|
wrapToolCall: async (t, r) => {
|
|
9585
|
-
let i = await r(t), a =
|
|
9586
|
-
return a
|
|
9636
|
+
let i = await r(t), a = cd(t.name, t.args);
|
|
9637
|
+
return a ? e({
|
|
9587
9638
|
type: "data_change",
|
|
9588
9639
|
operation: a,
|
|
9589
9640
|
value: n()?.bind
|
|
9641
|
+
}) : i.status === "done" && ld(t.name) && e({
|
|
9642
|
+
type: "data_change",
|
|
9643
|
+
operation: "edit",
|
|
9644
|
+
value: n()?.bind
|
|
9590
9645
|
}), i;
|
|
9591
9646
|
},
|
|
9592
9647
|
afterModel: (t) => {
|
|
@@ -9610,7 +9665,7 @@ function cd(e, t, n, r) {
|
|
|
9610
9665
|
}
|
|
9611
9666
|
};
|
|
9612
9667
|
}
|
|
9613
|
-
function
|
|
9668
|
+
function dd(e, t, n, r, i) {
|
|
9614
9669
|
if (!n) return i && console.warn(`[page-agent-sdk][focus] capabilities.focus 关闭,${t} 忽略`), {
|
|
9615
9670
|
ok: !1,
|
|
9616
9671
|
error: "capabilities.focus 关闭"
|
|
@@ -9628,24 +9683,24 @@ function ld(e, t, n, r, i) {
|
|
|
9628
9683
|
error: "当前无主数据 schema,无法聚焦"
|
|
9629
9684
|
});
|
|
9630
9685
|
}
|
|
9631
|
-
function
|
|
9686
|
+
function fd(e, n) {
|
|
9632
9687
|
let i = {
|
|
9633
9688
|
prompt_tokens: 0,
|
|
9634
9689
|
completion_tokens: 0,
|
|
9635
9690
|
total_tokens: 0
|
|
9636
|
-
}, a =
|
|
9691
|
+
}, a = Qc(() => W), o = /* @__PURE__ */ At(0), s = wl(e.storage);
|
|
9637
9692
|
e.debug && s && s.onEvent((e) => console.log("[page-agent-sdk][storage]", e));
|
|
9638
|
-
let { modelCaps: c, summaryLlmInvoke: l, titleLlmInvoke: u, compressDecisionInvoke: d } =
|
|
9693
|
+
let { modelCaps: c, summaryLlmInvoke: l, titleLlmInvoke: u, compressDecisionInvoke: d } = Zc(e), f = c;
|
|
9639
9694
|
if (e.debug && console.log("[page-agent-sdk][modelCaps]", f), f.contextWindow < 2e5) throw Error(`[page-agent-sdk] 模型上下文窗口 ${f.contextWindow} 小于最小支持 ${ii}(需 ≥200K 窗口模型,如 GLM-5.2/Claude/Kimi/Qwen-1M/DeepSeek-v4)`);
|
|
9640
|
-
let h =
|
|
9695
|
+
let h = jl(e, f.contextWindow), g = h.enableLLMSummary !== !1, _ = (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? Al[e.contextPreset ?? "auto"], v = new Set(_), y = e.llm;
|
|
9641
9696
|
e.debug && !l && console.warn("[page-agent-sdk][summarization] 未构造 llmInvoke(apiKey 缺失?),摘要回退零成本索引摘要");
|
|
9642
|
-
let b = /* @__PURE__ */ bt([]), x =
|
|
9697
|
+
let b = /* @__PURE__ */ bt([]), x = sc(e.vfs?.initialFiles, {
|
|
9643
9698
|
persist: s ? { save: (e) => {
|
|
9644
9699
|
G.sessionId && s && s.save(n, G.sessionId, { vfs: e });
|
|
9645
9700
|
} } : void 0,
|
|
9646
9701
|
maxBytes: e.vfs?.maxBytes,
|
|
9647
9702
|
poolBytes: e.vfs?.poolBytes
|
|
9648
|
-
}), S = wa([], { maxPlanRevisions: e.maxPlanRevisions }), C = Oa(), w =
|
|
9703
|
+
}), S = wa([], { maxPlanRevisions: e.maxPlanRevisions }), C = Oa(), w = Za({
|
|
9649
9704
|
getSchema: () => L()?.schema,
|
|
9650
9705
|
getBind: () => L()?.bind,
|
|
9651
9706
|
unfocusGuidance: e.toolMode === "advanced" ? "tool" : "ask-user",
|
|
@@ -9653,20 +9708,20 @@ function ud(e, n) {
|
|
|
9653
9708
|
type: "focus_change",
|
|
9654
9709
|
focuses: e
|
|
9655
9710
|
})
|
|
9656
|
-
}), T =
|
|
9711
|
+
}), T = eo(), E = xo(e.memory || "");
|
|
9657
9712
|
typeof e.memory == "function" && E.refresh();
|
|
9658
9713
|
let D = { current: null }, O = e.data ? {
|
|
9659
9714
|
...e.data,
|
|
9660
9715
|
description: e.data.description ?? "主数据对象"
|
|
9661
|
-
} : void 0, k = !(e.subagents ?? []).some((e) => e._codeAsset) &&
|
|
9662
|
-
k && O?.schema && Qi(O.schema).length && (ee = [...e.subagents ?? [],
|
|
9716
|
+
} : void 0, k = !(e.subagents ?? []).some((e) => e._codeAsset) && Dl(e.capabilities).subagent, ee = e.subagents;
|
|
9717
|
+
k && O?.schema && Qi(O.schema).length && (ee = [...e.subagents ?? [], Ic()], console.info("[page-agent-sdk] 检测到 schema 含代码组件数组(如 components[].code),已自动装配 HTML 代码子 agent(委派编排 + vfs 工作副本 + 格式校验 + 增量 commit)。需定制(codeField/formatCheck/craftNotes 等)请显式传 createHtmlSubagent(...)"));
|
|
9663
9718
|
let A = (ee ?? []).filter((e) => !!e._codeAsset), j = /* @__PURE__ */ new Set();
|
|
9664
9719
|
for (let e of A) {
|
|
9665
9720
|
if (e._codeAsset.writablePaths.length) continue;
|
|
9666
9721
|
let t = Qi(O?.schema, e._codeAsset.codeField);
|
|
9667
9722
|
t.length ? (e._codeAsset.writablePaths = t, Array.isArray(e.writablePaths) && (e.writablePaths = t), e._rebuildCodeAssetPaths?.(t[0]), console.info(`[page-agent-sdk][createHtmlSubagent] 未传 writablePaths,已从 schema 推断: [${t.map((e) => `'${e}'`).join(", ")}]`)) : (console.warn("[page-agent-sdk][createHtmlSubagent] 未能从 schema 推断 writablePaths(开放 schema(z.any()/z.record())/嵌套容器(如 sections[].children[])/点路径 codeField(如 props.html_code)不支持自动推断),已跳过该 html 子 agent(整体不受影响);如确需代码资产机制(vfs + 格式校验 + 增量 commit),请显式传 writablePaths(代码组件 data 区,如 ['components'])"), j.add(e));
|
|
9668
9723
|
}
|
|
9669
|
-
let te = j.size ? A.filter((e) => !j.has(e)) : A, M = j.size ? (ee ?? []).filter((e) => !j.has(e)) : ee, ne = te.length > 0, N = te.flatMap((e) => e._codeAsset.writablePaths), re = te.flatMap((e) => e._codeAsset.writablePaths.map((t) => `${t}.${e._codeAsset.codeField}`)), ie = e.checkpoint, ae = ie !== void 0 && ie !== !1, P = ae ?
|
|
9724
|
+
let te = j.size ? A.filter((e) => !j.has(e)) : A, M = j.size ? (ee ?? []).filter((e) => !j.has(e)) : ee, ne = te.length > 0, N = te.flatMap((e) => e._codeAsset.writablePaths), re = te.flatMap((e) => e._codeAsset.writablePaths.map((t) => `${t}.${e._codeAsset.codeField}`)), ie = e.checkpoint, ae = ie !== void 0 && ie !== !1, P = ae ? zo({
|
|
9670
9725
|
getData: () => L()?.bind,
|
|
9671
9726
|
consumeDataDirty: () => I?.consumeDataDirty?.() ?? !0,
|
|
9672
9727
|
slotPaths: O ? [""] : [],
|
|
@@ -9675,12 +9730,12 @@ function ud(e, n) {
|
|
|
9675
9730
|
getTodos: () => D.current?.getState?.()?.todos ?? [],
|
|
9676
9731
|
messages: b,
|
|
9677
9732
|
maxCheckpoints: ie && typeof ie == "object" ? ie.maxCheckpoints : void 0
|
|
9678
|
-
}) : null, oe = !ie || typeof ie != "object" || ie.auto !== !1, F =
|
|
9733
|
+
}) : null, oe = !ie || typeof ie != "object" || ie.auto !== !1, F = Dl(e.capabilities), se = F.dataOps, ce = F.draftWrite, le = F.tracing, ue = F.automation, de = rc(e);
|
|
9679
9734
|
if (ne) {
|
|
9680
9735
|
let e = te.map((e) => e._codeAsset.orchestratorPrompt).filter(Boolean).join("\n\n");
|
|
9681
9736
|
e && (de += "\n\n" + e);
|
|
9682
9737
|
} else O?.schema && Zi(O.schema) && (de += "\n\n" + ha.htmlDirectWriteFallback, console.warn("[page-agent-sdk] 检测到 schema 含 code 字段但未注册 html 子 agent:已自动注入「主 agent 自己写 HTML」编排(code 作普通字段直接 write,无 vfs 工作副本 / 无格式校验门禁)。如需代码资产机制(vfs + 格式校验 + 增量 commit + 主上下文 code 摘要),注册 createHtmlSubagent;若确为降级意图可忽略。"));
|
|
9683
|
-
let fe = se && O ?
|
|
9738
|
+
let fe = se && O ? Cu(O, {
|
|
9684
9739
|
onAudit: e.onAudit ?? (e.debug ? (e) => console.log("[page-agent-sdk][data audit]", e) : void 0),
|
|
9685
9740
|
maxSnapshots: e.maxSnapshots,
|
|
9686
9741
|
onConflict: a.set,
|
|
@@ -9689,17 +9744,17 @@ function ud(e, n) {
|
|
|
9689
9744
|
vfsStore: ce || O?.resources?.length ? x : void 0,
|
|
9690
9745
|
...N.length ? { pgIdPaths: N } : {},
|
|
9691
9746
|
...re.length ? { largeTextPaths: re } : {}
|
|
9692
|
-
}) : [], pe = se ?
|
|
9747
|
+
}) : [], pe = se ? mu(fe, e.toolMode) : [], I = se && O ? fe.controller ?? null : null, me = se && O?.resources?.length && I?.getResourcesSnapshot ? Xu({
|
|
9693
9748
|
getResourcesSnapshot: () => I?.getResourcesSnapshot?.() ?? [],
|
|
9694
9749
|
toolsExposed: e.toolMode === "advanced"
|
|
9695
|
-
}) : void 0, L = () => I?.get() ?? O, R = /* @__PURE__ */ new Map(), he =
|
|
9750
|
+
}) : void 0, L = () => I?.get() ?? O, R = /* @__PURE__ */ new Map(), he = Ku(F, pe, Tu, ju, Ru);
|
|
9696
9751
|
he.forEach((e) => R.set(e.name, "builtin"));
|
|
9697
9752
|
let z = [...e.tools || []];
|
|
9698
9753
|
z.forEach((e) => R.set(e.name, "user"));
|
|
9699
|
-
let ge =
|
|
9754
|
+
let ge = Vu(e.actions ?? {});
|
|
9700
9755
|
ge.forEach((e) => R.set(e.name, "action"));
|
|
9701
|
-
let _e = [], ve = e.humanConfirm !== !1 && (!e.approval || e.approval.humanConfirmTool !== !1), ye = ve ?
|
|
9702
|
-
ye && R.set(
|
|
9756
|
+
let _e = [], ve = e.humanConfirm !== !1 && (!e.approval || e.approval.humanConfirmTool !== !1), ye = ve ? jo() : null;
|
|
9757
|
+
ye && R.set(ko, "builtin");
|
|
9703
9758
|
let be = ae && P ? [r(async () => {
|
|
9704
9759
|
let e = P.list();
|
|
9705
9760
|
return e.length ? P.restore() ? `已回退到最近一次正常状态(checkpoint #${e[e.length - 1].id})。对话历史、主数据、vfs、todos 已整体还原。请基于回退后的状态重新判断并继续。` : "回退失败:无可用 checkpoint。" : "无可用 checkpoint,无法回退。";
|
|
@@ -9768,7 +9823,7 @@ function ud(e, n) {
|
|
|
9768
9823
|
Te.forEach((e) => R.set(e.name, "builtin"));
|
|
9769
9824
|
let Ee = [], De = /* @__PURE__ */ new Map(), V = H();
|
|
9770
9825
|
function H() {
|
|
9771
|
-
let { tools: e, collisions: t } =
|
|
9826
|
+
let { tools: e, collisions: t } = qu([
|
|
9772
9827
|
{
|
|
9773
9828
|
label: "builtin",
|
|
9774
9829
|
tools: he
|
|
@@ -9805,13 +9860,13 @@ function ud(e, n) {
|
|
|
9805
9860
|
return t.length && console.warn("[page-agent-sdk] 工具重名,后注册覆盖先注册:", t.map((e) => `${e.name}(${e.loser}→${e.winner})`).join(", ")), e;
|
|
9806
9861
|
}
|
|
9807
9862
|
let Oe = F.planning, ke = F.missionAnchor, Ae = F.workingMemory, je = F.skills, Me = F.vfs || ne;
|
|
9808
|
-
if (Me) for (let e of
|
|
9863
|
+
if (Me) for (let e of mc) R.set(e, "builtin");
|
|
9809
9864
|
if (Oe) for (let e of S.tools ?? []) R.set(e.name, "builtin");
|
|
9810
9865
|
let Ne = F.summarization, Pe = F.agentCompression && !!d;
|
|
9811
9866
|
e.debug && F.agentCompression && !d && console.warn("[page-agent-sdk][agentCompression] agentCompression 开启但 summaryLlm 不可用(或缺 apiKey / 模型不支持工具),压缩决策不启用,回退静态压缩");
|
|
9812
|
-
let Fe = F.memory, Ie = F.subagent, Le = Ie ?
|
|
9867
|
+
let Fe = F.memory, Ie = F.subagent, Le = Ie ? ls() : void 0, Re = e.verify?.maxAttempts ?? 2, ze = !!(e.verify?.check || e.verify?.maxAttempts || e.verify?.adversarial), U = e.capabilities?.verify === !1, Be = (F.verify || ze && !U) && e.verify?.enabled !== !1 && Re > 0, Ve = F.contextInspector;
|
|
9813
9868
|
ze && !Be && e.verify?.enabled !== !1 && console.warn("[page-agent-sdk][verify] 检测到 verify 配置(check/maxAttempts/adversarial)但未装载(capabilities.verify:false 显式关闭 或 maxAttempts≤0)");
|
|
9814
|
-
let He = e.subagent, Ue = He?.allowedTools ?? [], We = e.permissions?.length ?
|
|
9869
|
+
let He = e.subagent, Ue = He?.allowedTools ?? [], We = e.permissions?.length ? Do(e.permissions) : void 0, Ge = e.approval && (e.approval.tools !== void 0 || e.approval.confirm) ? Oo(e.approval) : void 0, Ke = [...We ? [We] : [], ...Ge ? [Ge] : []], qe = !Ie || He?.enabled === !1 ? void 0 : Ts({
|
|
9815
9870
|
llm: He?.llm ?? e.llm,
|
|
9816
9871
|
allTools: () => G.agent?.allTools ?? V,
|
|
9817
9872
|
allowedTools: Ue.length ? Ue : void 0,
|
|
@@ -9835,7 +9890,7 @@ function ud(e, n) {
|
|
|
9835
9890
|
timeoutMs: He?.timeoutMs
|
|
9836
9891
|
}), Je = M?.map((e) => {
|
|
9837
9892
|
if (!e._codeAsset) return e;
|
|
9838
|
-
let t = e._codeAsset, n =
|
|
9893
|
+
let t = e._codeAsset, n = kc({
|
|
9839
9894
|
writablePaths: t.writablePaths,
|
|
9840
9895
|
codeVfsPrefix: t.codeVfsPrefix,
|
|
9841
9896
|
ext: t.ext,
|
|
@@ -9850,7 +9905,7 @@ function ud(e, n) {
|
|
|
9850
9905
|
...e,
|
|
9851
9906
|
middleware: r
|
|
9852
9907
|
};
|
|
9853
|
-
}), Ye = Ie && Je !== void 0 ?
|
|
9908
|
+
}), Ye = Ie && Je !== void 0 ? Os(Je, {
|
|
9854
9909
|
llm: e.llm,
|
|
9855
9910
|
allTools: () => G.agent?.allTools ?? V,
|
|
9856
9911
|
debug: e.debug,
|
|
@@ -9871,8 +9926,8 @@ function ud(e, n) {
|
|
|
9871
9926
|
"describe_data",
|
|
9872
9927
|
"read",
|
|
9873
9928
|
"fetch_document"
|
|
9874
|
-
], Qe = V.filter((e) => Ze.includes(e.name)), $e = Be ?
|
|
9875
|
-
check: e.verify.check ??
|
|
9929
|
+
], Qe = V.filter((e) => Ze.includes(e.name)), $e = Be ? ks({
|
|
9930
|
+
check: e.verify.check ?? Fs({
|
|
9876
9931
|
schemas: () => L() ? { "": L().schema } : {},
|
|
9877
9932
|
root: () => L()?.bind
|
|
9878
9933
|
}),
|
|
@@ -9880,10 +9935,10 @@ function ud(e, n) {
|
|
|
9880
9935
|
llm: e.llm,
|
|
9881
9936
|
tools: Qe
|
|
9882
9937
|
} : void 0
|
|
9883
|
-
}) : void 0, et = Ve ?
|
|
9938
|
+
}) : void 0, et = Ve ? Ys({
|
|
9884
9939
|
contextWindow: f.contextWindow,
|
|
9885
|
-
thresholdRatio:
|
|
9886
|
-
}) : void 0, tt =
|
|
9940
|
+
thresholdRatio: jl(e, f.contextWindow).summaryThresholdRatio
|
|
9941
|
+
}) : void 0, tt = Yu({
|
|
9887
9942
|
...F,
|
|
9888
9943
|
humanConfirm: ve,
|
|
9889
9944
|
subagents: M?.map((e) => ({
|
|
@@ -9891,9 +9946,9 @@ function ud(e, n) {
|
|
|
9891
9946
|
description: e.description,
|
|
9892
9947
|
temperature: e.temperature
|
|
9893
9948
|
}))
|
|
9894
|
-
}, se && !!O, e.toolMode, !!O?.resources?.length, { promptSoftCap:
|
|
9949
|
+
}, se && !!O, e.toolMode, !!O?.resources?.length, { promptSoftCap: is(f.contextWindow, h.promptSoftCapTokens) }), nt = O ? {
|
|
9895
9950
|
name: "dataHint",
|
|
9896
|
-
augmentPrompt: () =>
|
|
9951
|
+
augmentPrompt: () => nc(L(), e.schemaHint) || void 0
|
|
9897
9952
|
} : null, rt = e.augmentSystem ? {
|
|
9898
9953
|
name: "augmentSystem",
|
|
9899
9954
|
augmentPrompt: (t) => {
|
|
@@ -9907,7 +9962,7 @@ function ud(e, n) {
|
|
|
9907
9962
|
return;
|
|
9908
9963
|
}
|
|
9909
9964
|
}
|
|
9910
|
-
} : null, it =
|
|
9965
|
+
} : null, it = Ol(e.onEvent), W = it.emit, at, ot = [], st = (e) => ({
|
|
9911
9966
|
name: e.name,
|
|
9912
9967
|
description: e.description,
|
|
9913
9968
|
content: typeof e.getContent == "function" ? e.getContent() : ""
|
|
@@ -9915,7 +9970,7 @@ function ud(e, n) {
|
|
|
9915
9970
|
name: e.name,
|
|
9916
9971
|
description: e.description,
|
|
9917
9972
|
getContent: () => e.content
|
|
9918
|
-
}), lt = e.skillStorage === !1 ? null :
|
|
9973
|
+
}), lt = e.skillStorage === !1 ? null : td({
|
|
9919
9974
|
...typeof e.skillStorage == "object" ? e.skillStorage : {},
|
|
9920
9975
|
id: e.skillStorage && typeof e.skillStorage == "object" && e.skillStorage.id ? e.skillStorage.id : `agent::${n}`
|
|
9921
9976
|
}), ut = () => {
|
|
@@ -9938,7 +9993,7 @@ function ud(e, n) {
|
|
|
9938
9993
|
G.infoTick.value++;
|
|
9939
9994
|
}
|
|
9940
9995
|
} catch {}
|
|
9941
|
-
}, ft = Ne ?
|
|
9996
|
+
}, ft = Ne ? cs({
|
|
9942
9997
|
...h,
|
|
9943
9998
|
llmInvoke: l,
|
|
9944
9999
|
getRegisteredData: () => L() ? [{ description: L().description ?? "主数据对象" }] : [],
|
|
@@ -9947,12 +10002,12 @@ function ud(e, n) {
|
|
|
9947
10002
|
decideInvoke: d,
|
|
9948
10003
|
getSnapshot: () => et?.getSnapshot()
|
|
9949
10004
|
} : {}
|
|
9950
|
-
}) : void 0, pt =
|
|
10005
|
+
}) : void 0, pt = Nl([
|
|
9951
10006
|
...nt ? [nt] : [],
|
|
9952
10007
|
tt,
|
|
9953
10008
|
...ke ? [C] : [],
|
|
9954
10009
|
...Oe ? [S] : [],
|
|
9955
|
-
...je ? [at =
|
|
10010
|
+
...je ? [at = bo(e.skills || [], {
|
|
9956
10011
|
readVfs: Me ? (e) => x.files[e]?.content : void 0,
|
|
9957
10012
|
hostScriptEnabled: F.skillHostScript,
|
|
9958
10013
|
onToolsReady: (e, t) => {
|
|
@@ -9963,15 +10018,15 @@ function ud(e, n) {
|
|
|
9963
10018
|
V = H(), G.agent && G.agent.setTools(V), G.infoTick.value++;
|
|
9964
10019
|
}
|
|
9965
10020
|
})] : [],
|
|
9966
|
-
...Me ? [
|
|
10021
|
+
...Me ? [gc(x)] : [],
|
|
9967
10022
|
...ft ? [ft] : [],
|
|
9968
10023
|
...Ae ? [T] : [],
|
|
9969
10024
|
...B ? [w] : [],
|
|
9970
10025
|
...me ? [me] : [],
|
|
9971
10026
|
...Fe ? [E] : [],
|
|
9972
10027
|
...We ? [We] : [],
|
|
9973
|
-
...ae && oe && P ? [
|
|
9974
|
-
...ve ? [
|
|
10028
|
+
...ae && oe && P ? [Bo(P)] : [],
|
|
10029
|
+
...ve ? [Mo()] : [],
|
|
9975
10030
|
...Ge ? [Ge] : [],
|
|
9976
10031
|
...$e ? [$e] : [],
|
|
9977
10032
|
...qe ? [qe] : [],
|
|
@@ -9979,12 +10034,12 @@ function ud(e, n) {
|
|
|
9979
10034
|
...rt ? [rt] : [],
|
|
9980
10035
|
...et ? [et] : [],
|
|
9981
10036
|
...e.middleware || [],
|
|
9982
|
-
...ue ? [
|
|
10037
|
+
...ue ? [zu(i, {
|
|
9983
10038
|
tokenBudget: e.tokenBudget,
|
|
9984
10039
|
timeBudgetMs: e.timeBudgetMs
|
|
9985
10040
|
}, W)] : [],
|
|
9986
|
-
|
|
9987
|
-
]), mt = e.maxMemoryRounds ??
|
|
10041
|
+
ud(W, b, L, i)
|
|
10042
|
+
]), mt = e.maxMemoryRounds ?? od, ht = e.approval?.timeoutMs, gt = ht === void 0 || ht === 0 ? 3e4 : !Number.isFinite(ht) || ht < 0 ? 0 : ht;
|
|
9988
10043
|
function _t(e) {
|
|
9989
10044
|
if (gt) return (t) => {
|
|
9990
10045
|
if (t.type !== "approval_request") return;
|
|
@@ -10013,7 +10068,7 @@ function ud(e, n) {
|
|
|
10013
10068
|
async function xt() {
|
|
10014
10069
|
s && (yt.value = (await s.listSessions(n)).sort((e, t) => t.lastAccessed - e.lastAccessed));
|
|
10015
10070
|
}
|
|
10016
|
-
let St =
|
|
10071
|
+
let St = ad(), Ct = /* @__PURE__ */ new Set();
|
|
10017
10072
|
function wt(e) {
|
|
10018
10073
|
let t = new AbortController();
|
|
10019
10074
|
return e && (e.aborted ? t.abort() : e.addEventListener("abort", () => t.abort(), { once: !0 })), Ct.add(t), {
|
|
@@ -10256,7 +10311,7 @@ function ud(e, n) {
|
|
|
10256
10311
|
})), e.memory && s.save(n, G.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }), xt(), q = void 0, jt = !1, G.infoTick.value++, r;
|
|
10257
10312
|
},
|
|
10258
10313
|
resetSession: () => {
|
|
10259
|
-
Tt(), a.resolve("keep_external"), G.sessionId =
|
|
10314
|
+
Tt(), a.resolve("keep_external"), G.sessionId = $c(), b.splice(0, b.length), x.clear?.(), S.reset([]), e.memory || E.reset(""), C.reset(), T.reset(), w.reset(), P && P.importStack([]), G.agent && (G.agent.debugLogs.value = []), s && s.createSession(G.agentId, e.session?.title, G.sessionId), W({
|
|
10260
10315
|
type: "session_restored",
|
|
10261
10316
|
sessionId: G.sessionId,
|
|
10262
10317
|
rounds: 0
|
|
@@ -10264,7 +10319,7 @@ function ud(e, n) {
|
|
|
10264
10319
|
},
|
|
10265
10320
|
stream: (e, t, n) => {
|
|
10266
10321
|
if (!G.agent) throw Error("page-agent-sdk: agent 尚未初始化完成,请先 await mount()");
|
|
10267
|
-
x?.setProtectedRefs?.(
|
|
10322
|
+
x?.setProtectedRefs?.(rd(e));
|
|
10268
10323
|
let r = (e) => {
|
|
10269
10324
|
t?.(e), W(e), e.type === "subagent" && (e.kind === "tool_call" || e.kind === "tool_result") && G.infoTick.value++;
|
|
10270
10325
|
};
|
|
@@ -10279,7 +10334,7 @@ function ud(e, n) {
|
|
|
10279
10334
|
if (G.refCount--, G.refCount <= 0) {
|
|
10280
10335
|
Tt(), s && (x.flush?.(), s.flush(), s.dispose()), lt && lt.dispose();
|
|
10281
10336
|
let e = G.mcpClosers.splice(0);
|
|
10282
|
-
e.length && Promise.allSettled(e.map((e) => e())),
|
|
10337
|
+
e.length && Promise.allSettled(e.map((e) => e())), sd.delete(n);
|
|
10283
10338
|
}
|
|
10284
10339
|
},
|
|
10285
10340
|
resolveConflict: a.resolve,
|
|
@@ -10299,14 +10354,14 @@ function ud(e, n) {
|
|
|
10299
10354
|
},
|
|
10300
10355
|
setLlm(t) {
|
|
10301
10356
|
let n;
|
|
10302
|
-
if (
|
|
10357
|
+
if (Hc(t)) n = t;
|
|
10303
10358
|
else {
|
|
10304
10359
|
let e = t;
|
|
10305
10360
|
if ((e.provider ?? "openai") === "anthropic") throw Error("[page-agent-sdk][setLlm] 切换到 Anthropic 需传 BaseChatModel 实例(动态 import 无法同步);请先 const { ChatAnthropic } = await import(\"@langchain/anthropic\") 构造实例后传入");
|
|
10306
10361
|
n = p(e);
|
|
10307
10362
|
}
|
|
10308
10363
|
typeof n.bindTools != "function" && e.debug && console.warn("[page-agent-sdk][setLlm] 新模型不支持 bindTools(tool calling 会失效)"), y = t;
|
|
10309
|
-
let r =
|
|
10364
|
+
let r = Hc(t) ? void 0 : t;
|
|
10310
10365
|
if (f = ai({
|
|
10311
10366
|
model: r?.model ?? t.model ?? t.modelName,
|
|
10312
10367
|
contextWindow: e.contextWindow ?? r?.contextWindow,
|
|
@@ -10349,8 +10404,8 @@ function ud(e, n) {
|
|
|
10349
10404
|
return {
|
|
10350
10405
|
id: n,
|
|
10351
10406
|
sessionId: G.sessionId,
|
|
10352
|
-
model:
|
|
10353
|
-
systemPrompt: G.agent?.getEffectiveSystemPrompt?.() ?? de +
|
|
10407
|
+
model: Hc(y) ? y.model ?? y.modelName : y.model,
|
|
10408
|
+
systemPrompt: G.agent?.getEffectiveSystemPrompt?.() ?? de + nc(L(), e.schemaHint),
|
|
10354
10409
|
tools: (G.agent?.allTools ?? V).map((e) => ({
|
|
10355
10410
|
name: e.name,
|
|
10356
10411
|
description: e.description,
|
|
@@ -10369,7 +10424,7 @@ function ud(e, n) {
|
|
|
10369
10424
|
compression: {
|
|
10370
10425
|
contextWindow: f.contextWindow,
|
|
10371
10426
|
summaryThresholdRatio: h.summaryThresholdRatio ?? .5,
|
|
10372
|
-
promptSoftCap:
|
|
10427
|
+
promptSoftCap: is(f.contextWindow, h.promptSoftCapTokens)
|
|
10373
10428
|
},
|
|
10374
10429
|
memory: E.get(),
|
|
10375
10430
|
middleware: pt.map((e) => e.name),
|
|
@@ -10391,7 +10446,7 @@ function ud(e, n) {
|
|
|
10391
10446
|
spans: G.agent.spans.value,
|
|
10392
10447
|
metrics: ci(G.agent.spans.value)
|
|
10393
10448
|
} : void 0,
|
|
10394
|
-
actions:
|
|
10449
|
+
actions: Hu(e.actions ?? {}),
|
|
10395
10450
|
subagent: {
|
|
10396
10451
|
enabled: !!qe,
|
|
10397
10452
|
maxDepth: e.subagent?.maxDepth ?? 1,
|
|
@@ -10440,11 +10495,11 @@ function ud(e, n) {
|
|
|
10440
10495
|
return B ? w.getFocuses() : [];
|
|
10441
10496
|
},
|
|
10442
10497
|
setFocus(t) {
|
|
10443
|
-
let n =
|
|
10498
|
+
let n = dd(t, "setFocus", B, () => L()?.schema, e.debug);
|
|
10444
10499
|
return n.ok ? (w.setFocus(t), G.infoTick.value++, { ok: !0 }) : n;
|
|
10445
10500
|
},
|
|
10446
10501
|
addFocus(t) {
|
|
10447
|
-
let n =
|
|
10502
|
+
let n = dd(t, "addFocus", B, () => L()?.schema, e.debug);
|
|
10448
10503
|
return n.ok ? w.getFocuses().length >= 8 ? (e.debug && console.warn("[page-agent-sdk][focus] addFocus 拒绝:焦点数已达上限 8(augmentPrompt 注入每焦点子树 schema,过多致 system prompt 超预算)"), {
|
|
10449
10504
|
ok: !1,
|
|
10450
10505
|
error: "焦点数上限 8(避免 system prompt 撑爆)"
|
|
@@ -10488,18 +10543,18 @@ function ud(e, n) {
|
|
|
10488
10543
|
}
|
|
10489
10544
|
function Dt(e) {
|
|
10490
10545
|
let t = {};
|
|
10491
|
-
for (let n of
|
|
10546
|
+
for (let n of rd(e)) {
|
|
10492
10547
|
let e = x.files[n];
|
|
10493
10548
|
e && (t[n] = e.content);
|
|
10494
10549
|
}
|
|
10495
10550
|
return t;
|
|
10496
10551
|
}
|
|
10497
10552
|
function Ot() {
|
|
10498
|
-
let e =
|
|
10553
|
+
let e = id(x.files, rd(b));
|
|
10499
10554
|
for (let t of e) delete x.files[t];
|
|
10500
10555
|
}
|
|
10501
10556
|
function kt() {
|
|
10502
|
-
let e =
|
|
10557
|
+
let e = Yo(b, mt);
|
|
10503
10558
|
if (!e.trimmed) return;
|
|
10504
10559
|
let { older: t, summary: n } = e;
|
|
10505
10560
|
if (W({
|
|
@@ -10517,9 +10572,9 @@ function ud(e, n) {
|
|
|
10517
10572
|
let n = e.summary, { prevSeg: r } = e;
|
|
10518
10573
|
(async () => {
|
|
10519
10574
|
try {
|
|
10520
|
-
let e = await l(
|
|
10575
|
+
let e = await l(es(t, v)), i = b.indexOf(n);
|
|
10521
10576
|
if (i < 0) return;
|
|
10522
|
-
b[i].content =
|
|
10577
|
+
b[i].content = Jo(t, r, e), Mt();
|
|
10523
10578
|
} catch {}
|
|
10524
10579
|
})();
|
|
10525
10580
|
}
|
|
@@ -10543,7 +10598,7 @@ function ud(e, n) {
|
|
|
10543
10598
|
s.save(n, G.sessionId, { focus: e.length ? e : null });
|
|
10544
10599
|
}
|
|
10545
10600
|
ue && P && (s.save(n, G.sessionId, { checkpoints: P.exportStack() }), s.save(n, G.sessionId, { usage: i }));
|
|
10546
|
-
let a =
|
|
10601
|
+
let a = Vc(b);
|
|
10547
10602
|
a && a !== q && (q = a, s.updateTitle(n, G.sessionId, a)), e.autoTitle !== !1 && u && !jt && b.some((e) => e.role === "user") && b.some((e) => e.role === "assistant") && (jt = !0, (async () => {
|
|
10548
10603
|
let e = await u(b);
|
|
10549
10604
|
e && (await s.updateTitle(n, G.sessionId, e), await xt());
|
|
@@ -10551,7 +10606,7 @@ function ud(e, n) {
|
|
|
10551
10606
|
}
|
|
10552
10607
|
return G.initDone = (async () => {
|
|
10553
10608
|
if (await Et(), await K(), e.mcp?.length) {
|
|
10554
|
-
let t = await Promise.allSettled(e.mcp.map((e) =>
|
|
10609
|
+
let t = await Promise.allSettled(e.mcp.map((e) => ec(e)));
|
|
10555
10610
|
G.mcpClosers = t.flatMap((e) => e.status === "fulfilled" ? [e.value.close] : []), G.mcpServers = [], t.forEach((t, n) => {
|
|
10556
10611
|
let r = e.mcp[n], i = r.name ?? r.url;
|
|
10557
10612
|
t.status === "fulfilled" ? (G.mcpServers.push({
|
|
@@ -10561,7 +10616,7 @@ function ud(e, n) {
|
|
|
10561
10616
|
}), t.value.tools.forEach((e) => R.set(e.name, `mcp:${i}`)), _e.push(...t.value.tools)) : console.warn(`[page-agent-sdk][mcp] server ${i} 连接失败:`, t.reason);
|
|
10562
10617
|
}), V = H(), e.debug && console.log(`[page-agent-sdk][mcp] 注入 ${_e.length} 个工具,${G.mcpServers.length} 个 server`);
|
|
10563
10618
|
}
|
|
10564
|
-
let t =
|
|
10619
|
+
let t = Hc(e.llm) ? e.llm : await m(e.llm);
|
|
10565
10620
|
G.agent = Ui({
|
|
10566
10621
|
llm: t,
|
|
10567
10622
|
systemPrompt: de,
|
|
@@ -10593,12 +10648,12 @@ function ud(e, n) {
|
|
|
10593
10648
|
});
|
|
10594
10649
|
})(), G;
|
|
10595
10650
|
}
|
|
10596
|
-
function
|
|
10597
|
-
let n = e.id ??
|
|
10651
|
+
function pd(e, t) {
|
|
10652
|
+
let n = e.id ?? $c();
|
|
10598
10653
|
e.id || console.warn(`[page-agent-sdk] 未传 options.id,已生成随机 id "${n}"。刷新后持久化数据无法恢复,请传稳定 id。`);
|
|
10599
|
-
let r = e.streaming ?? !0, i = e.ui ?? "default", a, o = e.shareContext ?
|
|
10600
|
-
o ? a = o : (a =
|
|
10601
|
-
let s = null, c =
|
|
10654
|
+
let r = e.streaming ?? !0, i = e.ui ?? "default", a, o = e.shareContext ? sd.get(n) : void 0;
|
|
10655
|
+
o ? a = o : (a = fd(e, n), e.shareContext && sd.set(n, a)), a.refCount++;
|
|
10656
|
+
let s = null, c = Tl(e), l = null, u = null;
|
|
10602
10657
|
async function d(n) {
|
|
10603
10658
|
if (await a.initDone, s) {
|
|
10604
10659
|
s.show();
|
|
@@ -10762,7 +10817,7 @@ function dd(e, t) {
|
|
|
10762
10817
|
error: "schema 校验失败:" + (t.error?.message ?? "未知错误")
|
|
10763
10818
|
};
|
|
10764
10819
|
}
|
|
10765
|
-
return
|
|
10820
|
+
return Io(r, e), a.dataOpsController?.markDataDirty?.(), t?.emit !== !1 && a.emit({
|
|
10766
10821
|
type: "data_change",
|
|
10767
10822
|
operation: "set",
|
|
10768
10823
|
value: r
|
|
@@ -10770,12 +10825,12 @@ function dd(e, t) {
|
|
|
10770
10825
|
},
|
|
10771
10826
|
vfsWrite: (e, t) => {
|
|
10772
10827
|
let n = typeof t == "string" ? t : JSON.stringify(t);
|
|
10773
|
-
a.vfsStore.files[
|
|
10828
|
+
a.vfsStore.files[dc(e)] = {
|
|
10774
10829
|
content: n,
|
|
10775
10830
|
updatedAt: Date.now()
|
|
10776
10831
|
};
|
|
10777
10832
|
},
|
|
10778
|
-
vfsRead: (e) => a.vfsStore.files[
|
|
10833
|
+
vfsRead: (e) => a.vfsStore.files[dc(e)]?.content,
|
|
10779
10834
|
createResource: (e, t) => {
|
|
10780
10835
|
let n = a.dataOpsController;
|
|
10781
10836
|
if (!n?.createResource) throw Error("[page-agent-sdk] createResource 不可用:需配 data.resources + vfsStore(capabilities.vfs 默认开)");
|
|
@@ -10814,12 +10869,12 @@ function dd(e, t) {
|
|
|
10814
10869
|
}
|
|
10815
10870
|
//#endregion
|
|
10816
10871
|
//#region src/core/sdk/ragSubagent.ts
|
|
10817
|
-
var
|
|
10872
|
+
var md = "你是知识检索专家。可用工具: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你是只读检索角色,不要尝试修改任何数据。", hd = "# 知识检索策略(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", gd = {
|
|
10818
10873
|
name: "rag-search",
|
|
10819
10874
|
description: "多源知识检索策略:vfs 预注入文档 → 语义检索 → 指定文档加载 → 公网;综合结构化结论 + 溯源",
|
|
10820
|
-
getContent: () =>
|
|
10875
|
+
getContent: () => hd
|
|
10821
10876
|
};
|
|
10822
|
-
function
|
|
10877
|
+
function _d(e, n, i) {
|
|
10823
10878
|
return r(async ({ query: e, topK: t }) => {
|
|
10824
10879
|
try {
|
|
10825
10880
|
let r = await n(e, { topK: t ?? i });
|
|
@@ -10836,7 +10891,7 @@ function hd(e, n, i) {
|
|
|
10836
10891
|
})
|
|
10837
10892
|
});
|
|
10838
10893
|
}
|
|
10839
|
-
function
|
|
10894
|
+
function vd(e, n) {
|
|
10840
10895
|
return r(async ({ source: e }) => {
|
|
10841
10896
|
try {
|
|
10842
10897
|
let t = await n(e), r = Array.isArray(t) ? t : [t];
|
|
@@ -10850,11 +10905,11 @@ function gd(e, n) {
|
|
|
10850
10905
|
schema: t.object({ source: t.string().describe("文档标识(id/URL/key)") })
|
|
10851
10906
|
});
|
|
10852
10907
|
}
|
|
10853
|
-
function
|
|
10908
|
+
function yd(e) {
|
|
10854
10909
|
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;
|
|
10855
10910
|
if (!t && !n && r === !1) throw Error("[page-agent-sdk][createRagSubagent] 至少配一种知识源:retriever / loader / useVfs(true)");
|
|
10856
10911
|
let p = [];
|
|
10857
|
-
t && p.push(
|
|
10912
|
+
t && p.push(_d(s, t, o)), n && p.push(vd(c, n)), f && p.push(...f);
|
|
10858
10913
|
let m = r ? [
|
|
10859
10914
|
"vfs_grep",
|
|
10860
10915
|
"vfs_read",
|
|
@@ -10863,17 +10918,17 @@ function _d(e) {
|
|
|
10863
10918
|
return {
|
|
10864
10919
|
id: i,
|
|
10865
10920
|
description: a ?? "检索知识库(组件文档/UI 规范/业务规则),返回有依据的结构化结论。需要查阅文档才能回答或决定如何配置时委派",
|
|
10866
|
-
systemPrompt:
|
|
10921
|
+
systemPrompt: md,
|
|
10867
10922
|
tools: p.length ? p : void 0,
|
|
10868
10923
|
allowedTools: m,
|
|
10869
|
-
skills: d ?? [
|
|
10924
|
+
skills: d ?? [gd],
|
|
10870
10925
|
maxToolRounds: l,
|
|
10871
10926
|
...u === void 0 ? {} : { summarization: u }
|
|
10872
10927
|
};
|
|
10873
10928
|
}
|
|
10874
10929
|
//#endregion
|
|
10875
10930
|
//#region src/core/utils/clipboard.ts
|
|
10876
|
-
async function
|
|
10931
|
+
async function bd(e) {
|
|
10877
10932
|
try {
|
|
10878
10933
|
let t = globalThis.navigator?.clipboard;
|
|
10879
10934
|
if (t && typeof t.writeText == "function") return await t.writeText(e), !0;
|
|
@@ -10891,8 +10946,8 @@ async function vd(e) {
|
|
|
10891
10946
|
}
|
|
10892
10947
|
//#endregion
|
|
10893
10948
|
//#region src/core/composables/useChat.ts
|
|
10894
|
-
var
|
|
10895
|
-
function
|
|
10949
|
+
var xd = 4e3;
|
|
10950
|
+
function Sd(e = {}) {
|
|
10896
10951
|
let { fetchResponse: t, fetchStream: n, onPersist: r, onClear: i, onQueuedCleared: a } = e, o = /* @__PURE__ */ bt({
|
|
10897
10952
|
messages: e.messages ?? [],
|
|
10898
10953
|
loading: !1,
|
|
@@ -10961,7 +11016,7 @@ function bd(e = {}) {
|
|
|
10961
11016
|
let t = e.delta || "";
|
|
10962
11017
|
n.subReasonFull = (n.subReasonFull || "") + t;
|
|
10963
11018
|
let r = (n.subReason || "") + t;
|
|
10964
|
-
n.subReason = r.length >
|
|
11019
|
+
n.subReason = r.length > xd ? r.slice(-4e3) : r;
|
|
10965
11020
|
break;
|
|
10966
11021
|
}
|
|
10967
11022
|
n.children ||= [];
|
|
@@ -11090,9 +11145,9 @@ function bd(e = {}) {
|
|
|
11090
11145
|
}
|
|
11091
11146
|
//#endregion
|
|
11092
11147
|
//#region src/core/composables/chatContext.ts
|
|
11093
|
-
var
|
|
11094
|
-
function
|
|
11095
|
-
let t =
|
|
11148
|
+
var Cd = Symbol("chatContext");
|
|
11149
|
+
function wd(e = {}) {
|
|
11150
|
+
let t = Sd({
|
|
11096
11151
|
fetchResponse: e.fetchResponse,
|
|
11097
11152
|
fetchStream: e.fetchStream,
|
|
11098
11153
|
messages: e.messages,
|
|
@@ -11112,7 +11167,7 @@ function Sd(e = {}) {
|
|
|
11112
11167
|
}, h = /* @__PURE__ */ At({}), g = (e) => h.value[e] === !0, _ = (e) => {
|
|
11113
11168
|
h.value[e] = !g(e);
|
|
11114
11169
|
}, v = /* @__PURE__ */ At(!1), y = (e) => {
|
|
11115
|
-
|
|
11170
|
+
bd(e).then((e) => {
|
|
11116
11171
|
e && (v.value = !0, setTimeout(() => {
|
|
11117
11172
|
v.value = !1;
|
|
11118
11173
|
}, 1500));
|
|
@@ -11180,15 +11235,15 @@ function Sd(e = {}) {
|
|
|
11180
11235
|
}
|
|
11181
11236
|
};
|
|
11182
11237
|
}
|
|
11183
|
-
function
|
|
11184
|
-
let e = Ln(
|
|
11238
|
+
function Td() {
|
|
11239
|
+
let e = Ln(Cd);
|
|
11185
11240
|
if (!e) throw Error("useChatContext 必须在 provide(chatContextKey) 的组件子树内调用");
|
|
11186
11241
|
return e;
|
|
11187
11242
|
}
|
|
11188
11243
|
//#endregion
|
|
11189
11244
|
//#region src/core/index.headless.ts
|
|
11190
|
-
function
|
|
11191
|
-
return
|
|
11245
|
+
function Ed(e) {
|
|
11246
|
+
return pd(e);
|
|
11192
11247
|
}
|
|
11193
11248
|
//#endregion
|
|
11194
|
-
export {
|
|
11249
|
+
export { El as CAPABILITIES, kl as CONTEXT_PRESETS, Bc as CompressDecisionSchema, rs as DEFAULT_PROMPT_SOFT_CAP, tc as DEFAULT_SYSTEM_PROMPT, _c as HTML_VOID_TAGS, ko as HUMAN_CONFIRM_TOOL_NAME, ii as MIN_CONTEXT_WINDOW, ns as SOFT_CAP_MIN_WINDOW, Xo as STOP_WORDS, ka as UNSAFE_KEYS, Hu as actionsToInspectInfo, Vu as actionsToTools, Zr as agentError, Js as analyzeContext, za as applyPatchToClone, Ha as applyPatchToLive, Xr as asAgentError, nc as buildDataPrompt, rc as buildSystemPrompt, Cd as chatContextKey, hu as commitSetToBind, ec as connectMcp, m as constructLlmFromConfig, p as constructOpenLlmSync, bd as copyText, Ui as createAgent, Oo as createApprovalMiddleware, wd as createChatContext, Ed as createChatSdk, zo as createCheckpointManager, Bo as createCheckpointMiddleware, Qc as createConflictManager, Ys as createContextInspectorMiddleware, Cu as createDataOps, Nc as createHtmlFormatCheck, Ic as createHtmlSubagent, Mo as createHumanConfirmMiddleware, jo as createHumanConfirmTool, yl as createMemoryBackend, xo as createMemoryMiddleware, u as createProxyLlm, yd as createRagSubagent, io as createSandboxRunner, Ol as createSdkEvents, ad as createSerialRunner, Cl as createSessionStore, td as createSkillStore, Ts as createSubagentMiddleware, ls as createSubagentTracker, Os as createSubagentsMiddleware, Yu as createUsageHintsMiddleware, ks as createVerifyMiddleware, sc as createVfs, xl as createWebStorageBackend, Fs as createWriteBackCheck, Pa as deepClone, Gu as defineDataToolset, oo as defineSkill, Lc as defineTool, Na as deleteByPath, Vc as deriveTitle, oa as describeSchemaNode, Di as detectGarbledToolCall, Ka as diffObjects, ku as domToStructure, ju as domTools, Wu as domToolsStatic, Qo as estimateMessageTokens, $o as estimateRoundTokens, X as estimateTokens, g as extractReasoningDelta, ya as extractSchemaHint, Xs as extractText, h as extractTextDelta, _ as extractUsage, Tu as fetchDocTools, Uu as fetchTools, mu as filterByToolMode, Ga as findStrippedKeys, sa as formatConstraints, Kr as formatZodIssues, Z as getByPath, Au as getDomTool, Pu as getEnvSummary, qi as getSchemaAtPath, Wi as getSchemaTopKeys, ci as getTraceMetrics, $ as hashValue, ma as htmlOrchestratorPrompt, es as indexSummarize, Lu as inspectEnvTool, Ru as inspectTools, Hc as isChatModel, vi as isContextLengthError, Gi as isPathAllowed, dl as isQuotaError, Aa as isUnsafePath, Ul as jpEval, Jr as jsonParseError, La as limitDepth, Fa as maybeParseValue, v as normalizeUsage, si as offloadPassThroughChars, oi as offloadThresholdChars, pa as presets, ea as projectBySchema, $i as projectBySchemaDeep, Ia as projectFields, ts as recallRounds, ca as renderSchemaHint, la as renderSchemaOverview, fa as renderSchemaShallow, Dl as resolveCapabilities, jl as resolveContextOptions, Tl as resolveDialogConfig, Zc as resolveLlm, ai as resolveModelCaps, is as resolvePromptSoftCap, wl as resolveStorage, Wa as restoreInPlace, Ua as restoreLive, Yr as routeError, ao as runHostScript, ql as runSandboxedScript, ja as safeMerge, Nu as safeSerialize, Q as safeStringify, Gl as searchJson, Ku as selectBuiltinTools, Ma as setByPath, as as shouldTriggerCompression, ha as systemPromptHelpers, Zo as tokenize, Y as toolError, Ki as unwrapSchema, Sd as useChat, Td as useChatContext, yc as validateHtmlFormat, e as z, qr as zodError };
|