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