page-agent-sdk 2.38.0 → 2.38.2
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 +1 -1
- package/README.zh-CN.md +3 -3
- package/dist/page-agent-sdk.headless.js +805 -743
- package/dist/page-agent-sdk.iife.js +118 -118
- package/dist/page-agent-sdk.js +1563 -1501
- package/dist/page-agent-sdk.umd.cjs +63 -63
- package/package.json +2 -1
- package/types/headless.d.ts +8 -2
- package/types/index.d.ts +8 -2
|
@@ -357,7 +357,7 @@ function V(e, t, n) {
|
|
|
357
357
|
});
|
|
358
358
|
}
|
|
359
359
|
}
|
|
360
|
-
function
|
|
360
|
+
function H(e, t, n, r, i, a) {
|
|
361
361
|
let o = Fe.get(e);
|
|
362
362
|
if (!o) {
|
|
363
363
|
je++;
|
|
@@ -395,47 +395,47 @@ function ze(e, t, n, r, i, a) {
|
|
|
395
395
|
}
|
|
396
396
|
B();
|
|
397
397
|
}
|
|
398
|
-
function
|
|
398
|
+
function ze(e) {
|
|
399
399
|
let t = /* @__PURE__ */ G(e);
|
|
400
400
|
return t === e ? t : (V(t, "iterate", Re), /* @__PURE__ */ Ct(e) ? t : t.map(Et));
|
|
401
401
|
}
|
|
402
|
-
function
|
|
402
|
+
function Be(e) {
|
|
403
403
|
return V(e = /* @__PURE__ */ G(e), "iterate", Re), e;
|
|
404
404
|
}
|
|
405
|
-
function
|
|
405
|
+
function Ve(e, t) {
|
|
406
406
|
return /* @__PURE__ */ St(e) ? Dt(/* @__PURE__ */ xt(e) ? Et(t) : t) : Et(t);
|
|
407
407
|
}
|
|
408
|
-
var
|
|
408
|
+
var He = {
|
|
409
409
|
__proto__: null,
|
|
410
410
|
[Symbol.iterator]() {
|
|
411
|
-
return
|
|
411
|
+
return Ue(this, Symbol.iterator, (e) => Ve(this, e));
|
|
412
412
|
},
|
|
413
413
|
concat(...e) {
|
|
414
|
-
return
|
|
414
|
+
return ze(this).concat(...e.map((e) => T(e) ? ze(e) : e));
|
|
415
415
|
},
|
|
416
416
|
entries() {
|
|
417
|
-
return
|
|
417
|
+
return Ue(this, "entries", (e) => (e[1] = Ve(this, e[1]), e));
|
|
418
418
|
},
|
|
419
419
|
every(e, t) {
|
|
420
|
-
return
|
|
420
|
+
return Ge(this, "every", e, t, void 0, arguments);
|
|
421
421
|
},
|
|
422
422
|
filter(e, t) {
|
|
423
|
-
return
|
|
423
|
+
return Ge(this, "filter", e, t, (e) => e.map((e) => Ve(this, e)), arguments);
|
|
424
424
|
},
|
|
425
425
|
find(e, t) {
|
|
426
|
-
return
|
|
426
|
+
return Ge(this, "find", e, t, (e) => Ve(this, e), arguments);
|
|
427
427
|
},
|
|
428
428
|
findIndex(e, t) {
|
|
429
|
-
return
|
|
429
|
+
return Ge(this, "findIndex", e, t, void 0, arguments);
|
|
430
430
|
},
|
|
431
431
|
findLast(e, t) {
|
|
432
|
-
return
|
|
432
|
+
return Ge(this, "findLast", e, t, (e) => Ve(this, e), arguments);
|
|
433
433
|
},
|
|
434
434
|
findLastIndex(e, t) {
|
|
435
|
-
return
|
|
435
|
+
return Ge(this, "findLastIndex", e, t, void 0, arguments);
|
|
436
436
|
},
|
|
437
437
|
forEach(e, t) {
|
|
438
|
-
return
|
|
438
|
+
return Ge(this, "forEach", e, t, void 0, arguments);
|
|
439
439
|
},
|
|
440
440
|
includes(...e) {
|
|
441
441
|
return qe(this, "includes", e);
|
|
@@ -444,13 +444,13 @@ var Ue = {
|
|
|
444
444
|
return qe(this, "indexOf", e);
|
|
445
445
|
},
|
|
446
446
|
join(e) {
|
|
447
|
-
return
|
|
447
|
+
return ze(this).join(e);
|
|
448
448
|
},
|
|
449
449
|
lastIndexOf(...e) {
|
|
450
450
|
return qe(this, "lastIndexOf", e);
|
|
451
451
|
},
|
|
452
452
|
map(e, t) {
|
|
453
|
-
return
|
|
453
|
+
return Ge(this, "map", e, t, void 0, arguments);
|
|
454
454
|
},
|
|
455
455
|
pop() {
|
|
456
456
|
return U(this, "pop");
|
|
@@ -459,68 +459,68 @@ var Ue = {
|
|
|
459
459
|
return U(this, "push", e);
|
|
460
460
|
},
|
|
461
461
|
reduce(e, ...t) {
|
|
462
|
-
return
|
|
462
|
+
return Ke(this, "reduce", e, t);
|
|
463
463
|
},
|
|
464
464
|
reduceRight(e, ...t) {
|
|
465
|
-
return
|
|
465
|
+
return Ke(this, "reduceRight", e, t);
|
|
466
466
|
},
|
|
467
467
|
shift() {
|
|
468
468
|
return U(this, "shift");
|
|
469
469
|
},
|
|
470
470
|
some(e, t) {
|
|
471
|
-
return
|
|
471
|
+
return Ge(this, "some", e, t, void 0, arguments);
|
|
472
472
|
},
|
|
473
473
|
splice(...e) {
|
|
474
474
|
return U(this, "splice", e);
|
|
475
475
|
},
|
|
476
476
|
toReversed() {
|
|
477
|
-
return
|
|
477
|
+
return ze(this).toReversed();
|
|
478
478
|
},
|
|
479
479
|
toSorted(e) {
|
|
480
|
-
return
|
|
480
|
+
return ze(this).toSorted(e);
|
|
481
481
|
},
|
|
482
482
|
toSpliced(...e) {
|
|
483
|
-
return
|
|
483
|
+
return ze(this).toSpliced(...e);
|
|
484
484
|
},
|
|
485
485
|
unshift(...e) {
|
|
486
486
|
return U(this, "unshift", e);
|
|
487
487
|
},
|
|
488
488
|
values() {
|
|
489
|
-
return
|
|
489
|
+
return Ue(this, "values", (e) => Ve(this, e));
|
|
490
490
|
}
|
|
491
491
|
};
|
|
492
|
-
function
|
|
493
|
-
let r =
|
|
492
|
+
function Ue(e, t, n) {
|
|
493
|
+
let r = Be(e), i = r[t]();
|
|
494
494
|
return r !== e && !/* @__PURE__ */ Ct(e) && (i._next = i.next, i.next = () => {
|
|
495
495
|
let e = i._next();
|
|
496
496
|
return e.done || (e.value = n(e.value)), e;
|
|
497
497
|
}), i;
|
|
498
498
|
}
|
|
499
|
-
var
|
|
500
|
-
function
|
|
501
|
-
let o =
|
|
502
|
-
if (c !==
|
|
499
|
+
var We = Array.prototype;
|
|
500
|
+
function Ge(e, t, n, r, i, a) {
|
|
501
|
+
let o = Be(e), s = o !== e && !/* @__PURE__ */ Ct(e), c = o[t];
|
|
502
|
+
if (c !== We[t]) {
|
|
503
503
|
let t = c.apply(e, a);
|
|
504
504
|
return s ? Et(t) : t;
|
|
505
505
|
}
|
|
506
506
|
let l = n;
|
|
507
507
|
o !== e && (s ? l = function(t, r) {
|
|
508
|
-
return n.call(this,
|
|
508
|
+
return n.call(this, Ve(e, t), r, e);
|
|
509
509
|
} : n.length > 2 && (l = function(t, r) {
|
|
510
510
|
return n.call(this, t, r, e);
|
|
511
511
|
}));
|
|
512
512
|
let u = c.call(o, l, r);
|
|
513
513
|
return s && i ? i(u) : u;
|
|
514
514
|
}
|
|
515
|
-
function
|
|
516
|
-
let i =
|
|
515
|
+
function Ke(e, t, n, r) {
|
|
516
|
+
let i = Be(e), a = i !== e && !/* @__PURE__ */ Ct(e), o = n, s = !1;
|
|
517
517
|
i !== e && (a ? (s = r.length === 0, o = function(t, r, i) {
|
|
518
|
-
return s && (s = !1, t =
|
|
518
|
+
return s && (s = !1, t = Ve(e, t)), n.call(this, t, Ve(e, r), i, e);
|
|
519
519
|
}) : n.length > 3 && (o = function(t, r, i) {
|
|
520
520
|
return n.call(this, t, r, i, e);
|
|
521
521
|
}));
|
|
522
522
|
let c = i[t](o, ...r);
|
|
523
|
-
return s ?
|
|
523
|
+
return s ? Ve(e, c) : c;
|
|
524
524
|
}
|
|
525
525
|
function qe(e, t, n) {
|
|
526
526
|
let r = /* @__PURE__ */ G(e);
|
|
@@ -553,7 +553,7 @@ var Ze = class {
|
|
|
553
553
|
let a = T(e);
|
|
554
554
|
if (!r) {
|
|
555
555
|
let e;
|
|
556
|
-
if (a && (e =
|
|
556
|
+
if (a && (e = He[t])) return e;
|
|
557
557
|
if (t === "hasOwnProperty") return Xe;
|
|
558
558
|
}
|
|
559
559
|
let o = Reflect.get(e, t, /* @__PURE__ */ K(e) ? e : n);
|
|
@@ -575,11 +575,11 @@ var Ze = class {
|
|
|
575
575
|
if (!/* @__PURE__ */ Ct(n) && !/* @__PURE__ */ St(n) && (i = /* @__PURE__ */ G(i), n = /* @__PURE__ */ G(n)), !a && /* @__PURE__ */ K(i) && !/* @__PURE__ */ K(n)) return r ? (process.env.NODE_ENV !== "production" && de(`Set operation on key "${String(t)}" failed: target is readonly.`, e[t]), !0) : (i.value = n, !0);
|
|
576
576
|
}
|
|
577
577
|
let o = a ? Number(t) < e.length : w(e, t), s = Reflect.set(e, t, n, /* @__PURE__ */ K(e) ? e : r);
|
|
578
|
-
return e === /* @__PURE__ */ G(r) && s && (o ? ie(n, i) &&
|
|
578
|
+
return e === /* @__PURE__ */ G(r) && s && (o ? ie(n, i) && H(e, "set", t, n, i) : H(e, "add", t, n)), s;
|
|
579
579
|
}
|
|
580
580
|
deleteProperty(e, t) {
|
|
581
581
|
let n = w(e, t), r = e[t], i = Reflect.deleteProperty(e, t);
|
|
582
|
-
return i && n &&
|
|
582
|
+
return i && n && H(e, "delete", t, void 0, r), i;
|
|
583
583
|
}
|
|
584
584
|
has(e, t) {
|
|
585
585
|
let n = Reflect.has(e, t);
|
|
@@ -598,8 +598,8 @@ var Ze = class {
|
|
|
598
598
|
deleteProperty(e, t) {
|
|
599
599
|
return process.env.NODE_ENV !== "production" && de(`Delete operation on key "${String(t)}" failed: target is readonly.`, e), !0;
|
|
600
600
|
}
|
|
601
|
-
}, et = /* @__PURE__ */ new Qe(), tt = /* @__PURE__ */ new $e(), nt = /* @__PURE__ */ new $e(!0), rt = (e) => e,
|
|
602
|
-
function
|
|
601
|
+
}, et = /* @__PURE__ */ new Qe(), tt = /* @__PURE__ */ new $e(), nt = /* @__PURE__ */ new $e(!0), rt = (e) => e, it = (e) => Reflect.getPrototypeOf(e);
|
|
602
|
+
function at(e, t, n) {
|
|
603
603
|
return function(...r) {
|
|
604
604
|
let i = this.__v_raw, a = /* @__PURE__ */ G(i), o = E(a), s = e === "entries" || e === Symbol.iterator && o, c = e === "keys" && o, l = i[e](...r), u = n ? rt : t ? Dt : Et;
|
|
605
605
|
return !t && V(a, "iterate", c ? Le : Ie), x(Object.create(l), { next() {
|
|
@@ -614,7 +614,7 @@ function it(e, t, n) {
|
|
|
614
614
|
} });
|
|
615
615
|
};
|
|
616
616
|
}
|
|
617
|
-
function
|
|
617
|
+
function W(e) {
|
|
618
618
|
return function(...t) {
|
|
619
619
|
if (process.env.NODE_ENV !== "production") {
|
|
620
620
|
let n = t[0] ? `on key "${t[0]}" ` : "";
|
|
@@ -628,7 +628,7 @@ function ot(e, t) {
|
|
|
628
628
|
get(n) {
|
|
629
629
|
let r = this.__v_raw, i = /* @__PURE__ */ G(r), a = /* @__PURE__ */ G(n);
|
|
630
630
|
e || (ie(n, a) && V(i, "get", n), V(i, "get", a));
|
|
631
|
-
let { has: o } =
|
|
631
|
+
let { has: o } = it(i), s = t ? rt : e ? Dt : Et;
|
|
632
632
|
if (o.call(i, n)) return s(r.get(n));
|
|
633
633
|
if (o.call(i, a)) return s(r.get(a));
|
|
634
634
|
r !== i && r.get(n);
|
|
@@ -647,31 +647,31 @@ function ot(e, t) {
|
|
|
647
647
|
}
|
|
648
648
|
};
|
|
649
649
|
return x(n, e ? {
|
|
650
|
-
add:
|
|
651
|
-
set:
|
|
652
|
-
delete:
|
|
653
|
-
clear:
|
|
650
|
+
add: W("add"),
|
|
651
|
+
set: W("set"),
|
|
652
|
+
delete: W("delete"),
|
|
653
|
+
clear: W("clear")
|
|
654
654
|
} : {
|
|
655
655
|
add(e) {
|
|
656
|
-
let n = /* @__PURE__ */ G(this), r =
|
|
657
|
-
return r.has.call(n, a) || ie(e, a) && r.has.call(n, e) || ie(i, a) && r.has.call(n, i) || (n.add(a),
|
|
656
|
+
let n = /* @__PURE__ */ G(this), r = it(n), i = /* @__PURE__ */ G(e), a = !t && !/* @__PURE__ */ Ct(e) && !/* @__PURE__ */ St(e) ? i : e;
|
|
657
|
+
return r.has.call(n, a) || ie(e, a) && r.has.call(n, e) || ie(i, a) && r.has.call(n, i) || (n.add(a), H(n, "add", a, a)), this;
|
|
658
658
|
},
|
|
659
659
|
set(e, n) {
|
|
660
660
|
!t && !/* @__PURE__ */ Ct(n) && !/* @__PURE__ */ St(n) && (n = /* @__PURE__ */ G(n));
|
|
661
|
-
let r = /* @__PURE__ */ G(this), { has: i, get: a } =
|
|
661
|
+
let r = /* @__PURE__ */ G(this), { has: i, get: a } = it(r), o = i.call(r, e);
|
|
662
662
|
o ? process.env.NODE_ENV !== "production" && dt(r, i, e) : (e = /* @__PURE__ */ G(e), o = i.call(r, e));
|
|
663
663
|
let s = a.call(r, e);
|
|
664
|
-
return r.set(e, n), o ? ie(n, s) &&
|
|
664
|
+
return r.set(e, n), o ? ie(n, s) && H(r, "set", e, n, s) : H(r, "add", e, n), this;
|
|
665
665
|
},
|
|
666
666
|
delete(e) {
|
|
667
|
-
let t = /* @__PURE__ */ G(this), { has: n, get: r } =
|
|
667
|
+
let t = /* @__PURE__ */ G(this), { has: n, get: r } = it(t), i = n.call(t, e);
|
|
668
668
|
i ? process.env.NODE_ENV !== "production" && dt(t, n, e) : (e = /* @__PURE__ */ G(e), i = n.call(t, e));
|
|
669
669
|
let a = r ? r.call(t, e) : void 0, o = t.delete(e);
|
|
670
|
-
return i &&
|
|
670
|
+
return i && H(t, "delete", e, void 0, a), o;
|
|
671
671
|
},
|
|
672
672
|
clear() {
|
|
673
673
|
let e = /* @__PURE__ */ G(this), t = e.size !== 0, n = process.env.NODE_ENV === "production" ? void 0 : E(e) ? new Map(e) : new Set(e), r = e.clear();
|
|
674
|
-
return t &&
|
|
674
|
+
return t && H(e, "clear", void 0, void 0, n), r;
|
|
675
675
|
}
|
|
676
676
|
}), [
|
|
677
677
|
"keys",
|
|
@@ -679,7 +679,7 @@ function ot(e, t) {
|
|
|
679
679
|
"entries",
|
|
680
680
|
Symbol.iterator
|
|
681
681
|
].forEach((r) => {
|
|
682
|
-
n[r] =
|
|
682
|
+
n[r] = at(r, e, t);
|
|
683
683
|
}), n;
|
|
684
684
|
}
|
|
685
685
|
function st(e, t) {
|
|
@@ -2769,8 +2769,10 @@ function Ni(e, t, n) {
|
|
|
2769
2769
|
let e = typeof r.shape == "function" ? r.shape() : r.shape;
|
|
2770
2770
|
if (!(t in e)) return !1;
|
|
2771
2771
|
r = e[t];
|
|
2772
|
-
} else if (r && (r._def?.type === "array" || r.constructor?.name === "ZodArray"))
|
|
2773
|
-
|
|
2772
|
+
} else if (r && (r._def?.type === "array" || r.constructor?.name === "ZodArray")) {
|
|
2773
|
+
if (!/^\d+$/.test(t)) return !1;
|
|
2774
|
+
r = r.element;
|
|
2775
|
+
} else if (r && (r._def?.type === "union" || r._def?.type === "discriminatedUnion" || Array.isArray(r.options))) return !0;
|
|
2774
2776
|
else return !1;
|
|
2775
2777
|
}
|
|
2776
2778
|
return !0;
|
|
@@ -2800,8 +2802,10 @@ function Fi(e, t) {
|
|
|
2800
2802
|
for (let e of r) {
|
|
2801
2803
|
if (!n) return null;
|
|
2802
2804
|
if (n = Pi(n), n && n.shape && typeof n.shape == "object") n = (typeof n.shape == "function" ? n.shape() : n.shape)[e];
|
|
2803
|
-
else if (n && (n._def?.type === "array" || n.constructor?.name === "ZodArray"))
|
|
2804
|
-
|
|
2805
|
+
else if (n && (n._def?.type === "array" || n.constructor?.name === "ZodArray")) {
|
|
2806
|
+
if (!/^\d+$/.test(e)) return null;
|
|
2807
|
+
n = n.element;
|
|
2808
|
+
} else if (n && (n._def?.type === "union" || n._def?.type === "discriminatedUnion" || Array.isArray(n.options))) return null;
|
|
2805
2809
|
else return null;
|
|
2806
2810
|
}
|
|
2807
2811
|
return n ?? null;
|
|
@@ -3181,8 +3185,7 @@ var ua = /* @__PURE__ */ new Set([
|
|
|
3181
3185
|
"edit_data",
|
|
3182
3186
|
"delete_data",
|
|
3183
3187
|
"write",
|
|
3184
|
-
"
|
|
3185
|
-
"vfs_edit"
|
|
3188
|
+
"draft_commit"
|
|
3186
3189
|
]);
|
|
3187
3190
|
function da(e) {
|
|
3188
3191
|
let t = e ?? {}, n = /* @__PURE__ */ new Set();
|
|
@@ -3217,12 +3220,23 @@ function pa(e) {
|
|
|
3217
3220
|
return n.join("\n");
|
|
3218
3221
|
},
|
|
3219
3222
|
wrapToolCall: async (e, n) => {
|
|
3220
|
-
if (t.length
|
|
3221
|
-
let
|
|
3222
|
-
|
|
3223
|
-
content: `PATH_DENIED · 聚焦越界:当前聚焦 [${t.map((e) => e.label ? `${e.path}(${e.label})` : e.path).join(", ")}],不可操作「${e}」。请先 remove_focus / clear_focus 或换焦点后重试。`,
|
|
3223
|
+
if (t.length) {
|
|
3224
|
+
let r = t.map((e) => e.label ? `${e.path}(${e.label})` : e.path).join(", "), i = (e) => ({
|
|
3225
|
+
content: `PATH_DENIED · 聚焦越界:当前聚焦 [${r}],不可操作「${e}」。请先 remove_focus / clear_focus 或换焦点后重试。`,
|
|
3224
3226
|
status: "error"
|
|
3225
|
-
};
|
|
3227
|
+
});
|
|
3228
|
+
if (e.name === "eval_script") {
|
|
3229
|
+
if (e.args?.mode !== "transform") return n(e);
|
|
3230
|
+
let r = da(e.args);
|
|
3231
|
+
if (!r.length) return i("(整体数据)");
|
|
3232
|
+
for (let e of r) if (!t.some((t) => fa(e, t.path))) return i(e);
|
|
3233
|
+
return n(e);
|
|
3234
|
+
}
|
|
3235
|
+
if (ua.has(e.name)) {
|
|
3236
|
+
let n = da(e.args);
|
|
3237
|
+
if (!n.length) return i("(整体数据)");
|
|
3238
|
+
for (let e of n) if (!t.some((t) => fa(e, t.path))) return i(e);
|
|
3239
|
+
}
|
|
3226
3240
|
}
|
|
3227
3241
|
return n(e);
|
|
3228
3242
|
},
|
|
@@ -3678,7 +3692,9 @@ var Fa = /* @__PURE__ */ new Set([
|
|
|
3678
3692
|
"delete_data",
|
|
3679
3693
|
"write",
|
|
3680
3694
|
"vfs_write",
|
|
3681
|
-
"vfs_edit"
|
|
3695
|
+
"vfs_edit",
|
|
3696
|
+
"draft_commit",
|
|
3697
|
+
"eval_script"
|
|
3682
3698
|
]), Ia = /* @__PURE__ */ new Set([
|
|
3683
3699
|
"get_data",
|
|
3684
3700
|
"describe_data",
|
|
@@ -3711,8 +3727,10 @@ function Ba(e) {
|
|
|
3711
3727
|
return {
|
|
3712
3728
|
name: "permissions",
|
|
3713
3729
|
wrapToolCall: async (t, n) => {
|
|
3714
|
-
let r = Fa.has(t.name) ? "write" : Ia.has(t.name) ? "read" : null
|
|
3715
|
-
|
|
3730
|
+
let r = Fa.has(t.name) ? "write" : Ia.has(t.name) ? "read" : null;
|
|
3731
|
+
t.name === "eval_script" && t.args?.mode !== "transform" && (r = null);
|
|
3732
|
+
let i = za(t.args);
|
|
3733
|
+
if (r === "write" && !i.length && (i = [""]), r && i.length) {
|
|
3716
3734
|
for (let t of i) if (Ra(e, r, t) === "deny") return {
|
|
3717
3735
|
content: `权限拒绝:${r} 操作 "${t}" 被 permissions 规则禁止。`,
|
|
3718
3736
|
status: "error"
|
|
@@ -4221,56 +4239,77 @@ var So = [
|
|
|
4221
4239
|
"search_data",
|
|
4222
4240
|
"fetch_document"
|
|
4223
4241
|
], Co = 1, wo = 4, To = 6, Eo = ["spawn_agent", "spawn_agents"], Do = [
|
|
4242
|
+
"load_skill",
|
|
4243
|
+
"write_todos",
|
|
4244
|
+
"update_todo",
|
|
4245
|
+
"restore_last_checkpoint",
|
|
4246
|
+
"request_human_confirmation",
|
|
4247
|
+
"set_focus",
|
|
4248
|
+
"add_focus",
|
|
4249
|
+
"remove_focus",
|
|
4250
|
+
"clear_focus"
|
|
4251
|
+
];
|
|
4252
|
+
function Oo(e) {
|
|
4253
|
+
return Eo.includes(e) || Do.includes(e) || e.startsWith("use_");
|
|
4254
|
+
}
|
|
4255
|
+
function ko(e, t, n = []) {
|
|
4256
|
+
return [...e.filter((e) => t.has(e.name) && !Oo(e.name)), ...n];
|
|
4257
|
+
}
|
|
4258
|
+
var Ao = [
|
|
4224
4259
|
"write",
|
|
4225
4260
|
"set_data",
|
|
4226
4261
|
"edit_data",
|
|
4227
4262
|
"delete_data",
|
|
4228
4263
|
"draft_commit"
|
|
4229
4264
|
];
|
|
4230
|
-
function
|
|
4265
|
+
function jo(e) {
|
|
4231
4266
|
let t = [];
|
|
4232
4267
|
if (typeof e.jsonPath == "string" && e.jsonPath && t.push(e.jsonPath), typeof e.path == "string" && e.path && t.push(e.path), e.patch && typeof e.patch.jsonPath == "string" && t.push(e.patch.jsonPath), Array.isArray(e.patches)) for (let n of e.patches) n && typeof n.jsonPath == "string" && t.push(n.jsonPath);
|
|
4233
4268
|
return t;
|
|
4234
4269
|
}
|
|
4235
|
-
function
|
|
4270
|
+
function Mo(e, t) {
|
|
4236
4271
|
return t.some((t) => e === t || e.startsWith(t + ".") || e.startsWith(t + "["));
|
|
4237
4272
|
}
|
|
4238
|
-
function
|
|
4273
|
+
function No(e, t) {
|
|
4239
4274
|
let n = e.invoke.bind(e), r = async (e) => {
|
|
4240
|
-
|
|
4275
|
+
if (Array.isArray(e?.patches) && e.patches.some((e) => !e || typeof e.jsonPath != "string" || !e.jsonPath)) return `PATH_OUT_OF_SCOPE:patches 含无 jsonPath 项(作用于根),子 agent 仅可写 ${t.join(", ")} 范围内子路径。请为每个 patch 指定 jsonPath。`;
|
|
4276
|
+
let r = jo(e);
|
|
4241
4277
|
if (!r.length) return `PATH_OUT_OF_SCOPE:子 agent 仅可增量 patch(writablePaths: ${t.join(", ")}),不能整体替换(无 jsonPath)。用 write({patch:{jsonPath,...}}) 增量改。`;
|
|
4242
|
-
for (let e of r) if (!
|
|
4278
|
+
for (let e of r) if (!Mo(e, t)) return `PATH_OUT_OF_SCOPE:子 agent 写 "${e}" 越界(仅可写 ${t.join(", ")})。`;
|
|
4243
4279
|
return n(e);
|
|
4244
4280
|
};
|
|
4245
4281
|
return new Proxy(e, { get(e, t, n) {
|
|
4246
4282
|
return t === "invoke" ? r : Reflect.get(e, t, n);
|
|
4247
4283
|
} });
|
|
4248
4284
|
}
|
|
4249
|
-
async function
|
|
4250
|
-
let
|
|
4285
|
+
async function Po(e, t, n, r, i, a) {
|
|
4286
|
+
let o = t.depth ?? 0, s = t.maxDepth ?? Co, c = /* @__PURE__ */ new Set([...So, ...t.allowedTools ?? []]), l = () => typeof t.allTools == "function" ? t.allTools() : t.allTools, u = ko(l(), c, t.extraTools ?? []);
|
|
4251
4287
|
if (t.writablePaths?.length) {
|
|
4252
|
-
|
|
4253
|
-
let e =
|
|
4254
|
-
|
|
4288
|
+
u = u.filter((e) => !Ao.includes(e.name));
|
|
4289
|
+
let e = l().filter((e) => Ao.includes(e.name) && !Oo(e.name)).map((e) => No(e, t.writablePaths));
|
|
4290
|
+
u = [...u, ...e];
|
|
4255
4291
|
}
|
|
4256
|
-
let
|
|
4292
|
+
let d = o + 1 < s ? [Fo({
|
|
4257
4293
|
...t,
|
|
4258
|
-
depth:
|
|
4259
|
-
})] : [],
|
|
4294
|
+
depth: o + 1
|
|
4295
|
+
})] : [], f = t.getFocuses?.() ?? [], p = f.length ? pa({
|
|
4260
4296
|
getSchema: t.getSchema ?? (() => null),
|
|
4261
|
-
initialFocuses:
|
|
4262
|
-
}) : void 0,
|
|
4297
|
+
initialFocuses: f
|
|
4298
|
+
}) : void 0, m = t.getVfsFiles ? {
|
|
4299
|
+
name: "vfs-bridge",
|
|
4300
|
+
beforeAgent: () => ({ files: t.getVfsFiles() })
|
|
4301
|
+
} : void 0, h = ni({
|
|
4263
4302
|
model: xo(t.llm) ? t.llm.model ?? t.llm.modelName : e.model ?? t.llm.model,
|
|
4264
4303
|
contextWindow: t.llm.contextWindow,
|
|
4265
4304
|
maxOutputTokens: t.llm.maxOutputTokens
|
|
4266
4305
|
});
|
|
4267
|
-
if (
|
|
4268
|
-
let
|
|
4269
|
-
contextWindow:
|
|
4306
|
+
if (h.contextWindow < 2e5) throw Error(`[page-agent-sdk][subagent] 子 agent 模型上下文窗口 ${h.contextWindow} 小于最小支持 ${ti}(需 ≥200K 窗口模型)`);
|
|
4307
|
+
let g = t.summarization === void 0 ? void 0 : yo(typeof t.summarization == "object" ? {
|
|
4308
|
+
contextWindow: h.contextWindow,
|
|
4270
4309
|
...t.summarization
|
|
4271
|
-
} : { contextWindow:
|
|
4272
|
-
contextWindow:
|
|
4273
|
-
maxOutputTokens:
|
|
4310
|
+
} : { contextWindow: h.contextWindow }), _ = ji({
|
|
4311
|
+
contextWindow: h.contextWindow,
|
|
4312
|
+
maxOutputTokens: h.maxOutputTokens,
|
|
4274
4313
|
...xo(t.llm) ? { llm: t.llm } : {
|
|
4275
4314
|
apiKey: t.llm.apiKey,
|
|
4276
4315
|
baseUrl: t.llm.baseUrl,
|
|
@@ -4279,27 +4318,33 @@ async function jo(e, t, n, r, i) {
|
|
|
4279
4318
|
maxTokens: t.maxTokens ?? t.llm.maxTokens
|
|
4280
4319
|
},
|
|
4281
4320
|
systemPrompt: e.role?.trim() || t.systemPrompt || "你是一个专注的子任务执行者。你只有只读工具(读主数据 / 抓文档),用它们完成给定任务,给出简洁结论,不要展开多余解释。",
|
|
4282
|
-
tools:
|
|
4321
|
+
tools: u,
|
|
4283
4322
|
middleware: [
|
|
4284
4323
|
...t.skills?.length ? [Na(t.skills)] : [],
|
|
4324
|
+
...g ? [g] : [],
|
|
4285
4325
|
...m ? [m] : [],
|
|
4286
|
-
...
|
|
4287
|
-
...
|
|
4326
|
+
...d,
|
|
4327
|
+
...p ? [p] : [],
|
|
4328
|
+
...t.guardMiddleware ?? [],
|
|
4288
4329
|
...t.middleware ?? []
|
|
4289
4330
|
],
|
|
4290
4331
|
maxToolRounds: t.maxToolRounds ?? To,
|
|
4291
4332
|
onLog: i,
|
|
4292
4333
|
debug: t.debug
|
|
4293
4334
|
});
|
|
4294
|
-
return t.debug && console.log(`[subagent] 启动子 agent(depth=${
|
|
4335
|
+
return t.debug && console.log(`[subagent] 启动子 agent(depth=${o},工具 ${u.length} 个)`), _.stream([{
|
|
4295
4336
|
role: "user",
|
|
4296
4337
|
content: e.prompt,
|
|
4297
4338
|
timestamp: Date.now()
|
|
4298
4339
|
}], (e) => {
|
|
4340
|
+
if (e.type === "approval_request") {
|
|
4341
|
+
a?.(e);
|
|
4342
|
+
return;
|
|
4343
|
+
}
|
|
4299
4344
|
r && (e.type === "tool_call" || e.type === "tool_result") && r(e);
|
|
4300
4345
|
}, n);
|
|
4301
4346
|
}
|
|
4302
|
-
function
|
|
4347
|
+
function Fo(e) {
|
|
4303
4348
|
let n = e.maxParallel ?? wo, i, a, o, s = (t, n) => (r) => {
|
|
4304
4349
|
e.tracker?.pushStep(t, {
|
|
4305
4350
|
kind: r.type,
|
|
@@ -4318,25 +4363,25 @@ function Mo(e) {
|
|
|
4318
4363
|
};
|
|
4319
4364
|
return {
|
|
4320
4365
|
name: "subagent",
|
|
4321
|
-
tools: [r(async ({ prompt: t, role: n, tools: r, writablePaths:
|
|
4322
|
-
let
|
|
4366
|
+
tools: [r(async ({ prompt: t, role: n, tools: r, writablePaths: c, model: l }) => {
|
|
4367
|
+
let u = (r ?? []).filter((e) => !Ao.includes(e)), d = u.length || c?.length ? {
|
|
4323
4368
|
...e,
|
|
4324
|
-
...
|
|
4325
|
-
...
|
|
4326
|
-
} : e,
|
|
4369
|
+
...u.length ? { allowedTools: u } : {},
|
|
4370
|
+
...c?.length ? { writablePaths: c } : {}
|
|
4371
|
+
} : e, f = `sub-${Math.random().toString(36).slice(2, 8)}`, p = n?.trim() || "子任务", m = (e) => o?.({
|
|
4327
4372
|
...e,
|
|
4328
|
-
source: `子:${
|
|
4329
|
-
}),
|
|
4330
|
-
e.tracker?.start(
|
|
4373
|
+
source: `子:${p}`
|
|
4374
|
+
}), h = Date.now();
|
|
4375
|
+
e.tracker?.start(f, t, p, h);
|
|
4331
4376
|
try {
|
|
4332
|
-
let r = await
|
|
4377
|
+
let r = await Po({
|
|
4333
4378
|
prompt: t,
|
|
4334
4379
|
role: n,
|
|
4335
|
-
model:
|
|
4336
|
-
},
|
|
4337
|
-
return e.tracker?.finish(
|
|
4380
|
+
model: l
|
|
4381
|
+
}, d, i, s(f, p), m, a);
|
|
4382
|
+
return e.tracker?.finish(f, "done", r), r;
|
|
4338
4383
|
} catch (t) {
|
|
4339
|
-
throw e.tracker?.finish(
|
|
4384
|
+
throw e.tracker?.finish(f, "error", String(t?.message ?? t)), t;
|
|
4340
4385
|
}
|
|
4341
4386
|
}, {
|
|
4342
4387
|
name: "spawn_agent",
|
|
@@ -4344,18 +4389,18 @@ function Mo(e) {
|
|
|
4344
4389
|
schema: t.object({
|
|
4345
4390
|
prompt: t.string().describe("子任务描述(子 agent 的唯一输入)"),
|
|
4346
4391
|
role: t.string().optional().describe("子 agent 身份(如\"你是代码审查专家\")"),
|
|
4347
|
-
tools: t.array(t.string()).optional().describe("子 agent 可用工具名白名单(默认只读主数据 + fetch)"),
|
|
4392
|
+
tools: t.array(t.string()).optional().describe("子 agent 可用工具名白名单(默认只读主数据 + fetch)。写工具不可自授——写权限用 writablePaths;委派/框架类工具系统保留不可授"),
|
|
4348
4393
|
writablePaths: t.array(t.string()).optional().describe("子 agent 可写路径前缀(给写权限;越界 PATH_OUT_OF_SCOPE;如 [\"components\"] 允许写 components.* )"),
|
|
4349
4394
|
model: t.string().optional().describe("覆盖模型(默认同主)")
|
|
4350
4395
|
})
|
|
4351
4396
|
}), r(async ({ tasks: t }) => (await Qr(t, n, async (t, n) => {
|
|
4352
|
-
let r = `sub-${n}-${Math.random().toString(36).slice(2, 6)}`,
|
|
4397
|
+
let r = `sub-${n}-${Math.random().toString(36).slice(2, 6)}`, c = t.role?.trim() || `子任务${n + 1}`, l = (e) => o?.({
|
|
4353
4398
|
...e,
|
|
4354
|
-
source: `子:${
|
|
4355
|
-
}),
|
|
4356
|
-
e.tracker?.start(r, t.prompt,
|
|
4399
|
+
source: `子:${c}`
|
|
4400
|
+
}), u = Date.now();
|
|
4401
|
+
e.tracker?.start(r, t.prompt, c, u);
|
|
4357
4402
|
try {
|
|
4358
|
-
let n = await
|
|
4403
|
+
let n = await Po(t, e, i, s(r, c), l, a);
|
|
4359
4404
|
return e.tracker?.finish(r, "done", n ?? "(未完成)"), n;
|
|
4360
4405
|
} catch (t) {
|
|
4361
4406
|
throw e.tracker?.finish(r, "error", String(t?.message ?? t)), t;
|
|
@@ -4371,8 +4416,8 @@ function Mo(e) {
|
|
|
4371
4416
|
wrapToolCall: async (e, t) => (e.signal && (i = e.signal), e.emit && (a = e.emit), e.logSink && (o = e.logSink), t(e))
|
|
4372
4417
|
};
|
|
4373
4418
|
}
|
|
4374
|
-
var
|
|
4375
|
-
function
|
|
4419
|
+
var Io = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
4420
|
+
function Lo(e, t) {
|
|
4376
4421
|
let n = e.tools ?? [];
|
|
4377
4422
|
return {
|
|
4378
4423
|
llm: e.llm ?? t.llm,
|
|
@@ -4390,10 +4435,12 @@ function Po(e, t) {
|
|
|
4390
4435
|
...e.summarization === void 0 ? {} : { summarization: e.summarization },
|
|
4391
4436
|
...t.getFocuses ? { getFocuses: t.getFocuses } : {},
|
|
4392
4437
|
...t.getSchema ? { getSchema: t.getSchema } : {},
|
|
4393
|
-
...t.tracker ? { tracker: t.tracker } : {}
|
|
4438
|
+
...t.tracker ? { tracker: t.tracker } : {},
|
|
4439
|
+
...t.guardMiddleware?.length ? { guardMiddleware: t.guardMiddleware } : {},
|
|
4440
|
+
...t.getVfsFiles ? { getVfsFiles: t.getVfsFiles } : {}
|
|
4394
4441
|
};
|
|
4395
4442
|
}
|
|
4396
|
-
function
|
|
4443
|
+
function Ro(e, n) {
|
|
4397
4444
|
let i, a, o, s = (e, t) => (n) => {
|
|
4398
4445
|
a && a({
|
|
4399
4446
|
type: "subagent",
|
|
@@ -4407,44 +4454,44 @@ function Fo(e, n) {
|
|
|
4407
4454
|
});
|
|
4408
4455
|
}, c = [], l = [], u;
|
|
4409
4456
|
function d(e) {
|
|
4410
|
-
let
|
|
4411
|
-
for (let
|
|
4412
|
-
if (!
|
|
4413
|
-
console.warn(`[subagents] id "${
|
|
4457
|
+
let c = /* @__PURE__ */ new Set(), l = [], u = [];
|
|
4458
|
+
for (let d of e) {
|
|
4459
|
+
if (!Io.test(d.id)) {
|
|
4460
|
+
console.warn(`[subagents] id "${d.id}" 非合法工具名(须 [a-zA-Z_][a-zA-Z0-9_]*),已跳过`);
|
|
4414
4461
|
continue;
|
|
4415
4462
|
}
|
|
4416
|
-
let e = `use_${
|
|
4417
|
-
if (
|
|
4418
|
-
console.warn(`[subagents] id "${
|
|
4463
|
+
let e = `use_${d.id}`;
|
|
4464
|
+
if (c.has(e)) {
|
|
4465
|
+
console.warn(`[subagents] id "${d.id}" 重复,已跳过`);
|
|
4419
4466
|
continue;
|
|
4420
4467
|
}
|
|
4421
|
-
|
|
4422
|
-
let t =
|
|
4468
|
+
c.add(e), l.push(d), u.push(r(async ({ task: e }) => {
|
|
4469
|
+
let t = Lo(d, n), r = (e) => o?.({
|
|
4423
4470
|
...e,
|
|
4424
|
-
source: `子:${
|
|
4425
|
-
}),
|
|
4426
|
-
|
|
4471
|
+
source: `子:${d.id}`
|
|
4472
|
+
}), c = n.tracker, l = c ? `use_${d.id}-${Math.random().toString(36).slice(2, 6)}` : `use_${d.id}`, u = s(`use_${d.id}`, d.id), f = c ? (e) => {
|
|
4473
|
+
c.pushStep(l, {
|
|
4427
4474
|
kind: e.type,
|
|
4428
4475
|
name: e.name,
|
|
4429
4476
|
ts: Date.now()
|
|
4430
|
-
}),
|
|
4431
|
-
} :
|
|
4432
|
-
|
|
4477
|
+
}), u(e);
|
|
4478
|
+
} : u, p = Date.now();
|
|
4479
|
+
c?.start(l, e, d.id, p);
|
|
4433
4480
|
try {
|
|
4434
|
-
let n = await
|
|
4435
|
-
return
|
|
4481
|
+
let n = await Po({ prompt: e }, t, i, f, r, a);
|
|
4482
|
+
return c?.finish(l, "done", n), n;
|
|
4436
4483
|
} catch (e) {
|
|
4437
|
-
throw
|
|
4484
|
+
throw c?.finish(l, "error", String(e?.message ?? e)), e;
|
|
4438
4485
|
}
|
|
4439
4486
|
}, {
|
|
4440
|
-
name: `use_${
|
|
4441
|
-
description: `委派给「${
|
|
4487
|
+
name: `use_${d.id}`,
|
|
4488
|
+
description: `委派给「${d.description}」子 agent 执行任务,返回其结论(过程隔离,不占主上下文)。`,
|
|
4442
4489
|
schema: t.object({ task: t.string().describe("委派给该子 agent 的任务描述") })
|
|
4443
4490
|
}));
|
|
4444
4491
|
}
|
|
4445
4492
|
return {
|
|
4446
|
-
valid:
|
|
4447
|
-
tools:
|
|
4493
|
+
valid: l,
|
|
4494
|
+
tools: u
|
|
4448
4495
|
};
|
|
4449
4496
|
}
|
|
4450
4497
|
let f = d(e);
|
|
@@ -4492,7 +4539,7 @@ function Fo(e, n) {
|
|
|
4492
4539
|
}
|
|
4493
4540
|
//#endregion
|
|
4494
4541
|
//#region src/core/harness/verify.ts
|
|
4495
|
-
function
|
|
4542
|
+
function zo(e) {
|
|
4496
4543
|
return {
|
|
4497
4544
|
name: "verify",
|
|
4498
4545
|
async beforeReturn({ messages: t, state: n, log: r }) {
|
|
@@ -4504,10 +4551,10 @@ function Io(e) {
|
|
|
4504
4551
|
if (e.adversarial) {
|
|
4505
4552
|
r?.("middleware", {
|
|
4506
4553
|
stage: "adversarial_start",
|
|
4507
|
-
model:
|
|
4554
|
+
model: qo(e.adversarial.llm),
|
|
4508
4555
|
tools: (e.adversarial.tools ?? []).length
|
|
4509
4556
|
});
|
|
4510
|
-
let n = await
|
|
4557
|
+
let n = await Zo(t, e.adversarial.llm, r, e.adversarial.tools);
|
|
4511
4558
|
if (r?.("middleware", {
|
|
4512
4559
|
stage: "adversarial_done",
|
|
4513
4560
|
clean: n === null,
|
|
@@ -4518,18 +4565,18 @@ function Io(e) {
|
|
|
4518
4565
|
}
|
|
4519
4566
|
};
|
|
4520
4567
|
}
|
|
4521
|
-
var
|
|
4568
|
+
var Bo = /* @__PURE__ */ new Set([
|
|
4522
4569
|
"set_data",
|
|
4523
4570
|
"edit_data",
|
|
4524
4571
|
"delete_data",
|
|
4525
4572
|
"write"
|
|
4526
|
-
]),
|
|
4527
|
-
function
|
|
4573
|
+
]), Vo = /校验失败|SCHEMA_INVALID|未注册|不存在|仅支持|必须是|NOT_OBJECT|PATH_UNSAFE|VERSION_CONFLICT|WRITE_INTERCEPT/;
|
|
4574
|
+
function Ho(e) {
|
|
4528
4575
|
let t = /* @__PURE__ */ new Map();
|
|
4529
4576
|
for (let n of e) {
|
|
4530
4577
|
let e = n?.tool_calls;
|
|
4531
4578
|
if (Array.isArray(e)) for (let n of e) {
|
|
4532
|
-
if (!
|
|
4579
|
+
if (!Bo.has(n.name)) continue;
|
|
4533
4580
|
let e = n.id, r = n?.args ?? {};
|
|
4534
4581
|
if (n.name === "write") if (r.del && r.patch?.jsonPath) t.set(r.patch.jsonPath, {
|
|
4535
4582
|
path: r.patch.jsonPath,
|
|
@@ -4568,7 +4615,7 @@ function zo(e) {
|
|
|
4568
4615
|
}
|
|
4569
4616
|
return [...t.values()];
|
|
4570
4617
|
}
|
|
4571
|
-
function
|
|
4618
|
+
function Uo(e) {
|
|
4572
4619
|
let t = /* @__PURE__ */ new Map();
|
|
4573
4620
|
for (let n of e) {
|
|
4574
4621
|
let e = n?.tool_call_id, r = n?.content;
|
|
@@ -4576,7 +4623,7 @@ function Bo(e) {
|
|
|
4576
4623
|
}
|
|
4577
4624
|
return t;
|
|
4578
4625
|
}
|
|
4579
|
-
function
|
|
4626
|
+
function Wo(e, t) {
|
|
4580
4627
|
if (t === "") return e;
|
|
4581
4628
|
if (e == null) return;
|
|
4582
4629
|
let n = e;
|
|
@@ -4586,16 +4633,16 @@ function Vo(e, t) {
|
|
|
4586
4633
|
}
|
|
4587
4634
|
return n;
|
|
4588
4635
|
}
|
|
4589
|
-
function
|
|
4636
|
+
function Go(e = {}) {
|
|
4590
4637
|
let t = typeof e.root == "function" ? e.root : e.root === void 0 ? () => e.window ?? globalThis.window : () => e.root, n = typeof e.schemas == "function" ? e.schemas : () => e.schemas ?? {};
|
|
4591
4638
|
return async ({ messages: e }) => {
|
|
4592
|
-
let r =
|
|
4639
|
+
let r = Ho(e);
|
|
4593
4640
|
if (!r.length) return { ok: !0 };
|
|
4594
|
-
let i =
|
|
4641
|
+
let i = Uo(e), a = n()[""], o = t(), s = [];
|
|
4595
4642
|
for (let { path: e, op: t, callId: n } of r) {
|
|
4596
4643
|
let r = n ? i.get(n) : void 0;
|
|
4597
|
-
if (r &&
|
|
4598
|
-
let c =
|
|
4644
|
+
if (r && Vo.test(r)) continue;
|
|
4645
|
+
let c = Wo(o, e);
|
|
4599
4646
|
if (t === "delete_data") c !== void 0 && s.push(`${e} 删除后读回仍有值,疑似未生效`);
|
|
4600
4647
|
else if (c == null) s.push(`写入 ${e} 后读回为空,疑似未生效`);
|
|
4601
4648
|
else if (a) {
|
|
@@ -4609,17 +4656,17 @@ function Ho(e = {}) {
|
|
|
4609
4656
|
} : { ok: !0 };
|
|
4610
4657
|
};
|
|
4611
4658
|
}
|
|
4612
|
-
function
|
|
4659
|
+
function Ko(e) {
|
|
4613
4660
|
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
4614
4661
|
}
|
|
4615
|
-
function
|
|
4616
|
-
return
|
|
4662
|
+
function qo(e) {
|
|
4663
|
+
return Ko(e) ? e.model ?? e.modelName ?? "<实例>" : e.model ?? "<配置>";
|
|
4617
4664
|
}
|
|
4618
|
-
var
|
|
4619
|
-
function
|
|
4620
|
-
return
|
|
4665
|
+
var Jo = /无问题|没有问题|未发现问题|没有发现|没问题|未发现/;
|
|
4666
|
+
function Yo(e) {
|
|
4667
|
+
return Jo.test(e);
|
|
4621
4668
|
}
|
|
4622
|
-
function
|
|
4669
|
+
function Xo(e) {
|
|
4623
4670
|
let t = "", n = "";
|
|
4624
4671
|
for (let r of e) r instanceof a ? t = typeof r.content == "string" ? r.content : "" : r instanceof i && !(r.tool_calls?.length > 0) && (n = typeof r.content == "string" ? r.content : "");
|
|
4625
4672
|
return {
|
|
@@ -4627,8 +4674,8 @@ function qo(e) {
|
|
|
4627
4674
|
lastReply: n
|
|
4628
4675
|
};
|
|
4629
4676
|
}
|
|
4630
|
-
async function
|
|
4631
|
-
let { lastUser: i, lastReply: a } =
|
|
4677
|
+
async function Zo(e, t, n, r) {
|
|
4678
|
+
let { lastUser: i, lastReply: a } = Xo(e);
|
|
4632
4679
|
if (!a) return null;
|
|
4633
4680
|
let o = Array.isArray(r) && r.length > 0, s = [
|
|
4634
4681
|
"你是严格的对抗式审查者,目标是找出以下 AI 助手回复的错误并证明它有问题(事实错误 / 遗漏 / 逻辑矛盾 / 与需求不符)。",
|
|
@@ -4639,7 +4686,7 @@ async function Jo(e, t, n, r) {
|
|
|
4639
4686
|
].join("\n"), c = "你是严格的对抗式审查者,只找问题不赞美。目标是反驳,不是改进。", l = n ? (e) => n(e.type, {
|
|
4640
4687
|
...e.data,
|
|
4641
4688
|
source: "adversarial"
|
|
4642
|
-
}) : void 0, u = await ji(
|
|
4689
|
+
}) : void 0, u = await ji(Ko(t) ? {
|
|
4643
4690
|
llm: t,
|
|
4644
4691
|
tools: r,
|
|
4645
4692
|
maxToolRounds: o ? 4 : 1,
|
|
@@ -4664,11 +4711,11 @@ async function Jo(e, t, n, r) {
|
|
|
4664
4711
|
stage: "adversarial_verdict",
|
|
4665
4712
|
verdict: u,
|
|
4666
4713
|
source: "adversarial"
|
|
4667
|
-
}),
|
|
4714
|
+
}), Yo(u) ? null : u.trim();
|
|
4668
4715
|
}
|
|
4669
4716
|
//#endregion
|
|
4670
4717
|
//#region src/core/utils/contextAnalysis.ts
|
|
4671
|
-
var
|
|
4718
|
+
var Qo = [
|
|
4672
4719
|
{
|
|
4673
4720
|
prefix: "## 可操作数据",
|
|
4674
4721
|
key: "dataHint"
|
|
@@ -4697,7 +4744,7 @@ var Yo = [
|
|
|
4697
4744
|
prefix: "【与当前问题可能相关的早期对话】",
|
|
4698
4745
|
key: "recall"
|
|
4699
4746
|
}
|
|
4700
|
-
],
|
|
4747
|
+
], $o = [
|
|
4701
4748
|
{
|
|
4702
4749
|
key: "systemPrompt",
|
|
4703
4750
|
label: "系统提示词(身份/规则)"
|
|
@@ -4751,9 +4798,9 @@ var Yo = [
|
|
|
4751
4798
|
label: "其他"
|
|
4752
4799
|
}
|
|
4753
4800
|
];
|
|
4754
|
-
function
|
|
4801
|
+
function es() {
|
|
4755
4802
|
let e = {};
|
|
4756
|
-
for (let t of
|
|
4803
|
+
for (let t of $o) e[t.key] = {
|
|
4757
4804
|
key: t.key,
|
|
4758
4805
|
label: t.label,
|
|
4759
4806
|
tokens: 0,
|
|
@@ -4762,16 +4809,16 @@ function Zo() {
|
|
|
4762
4809
|
};
|
|
4763
4810
|
return e;
|
|
4764
4811
|
}
|
|
4765
|
-
function
|
|
4812
|
+
function ts(e, t) {
|
|
4766
4813
|
e.tokens += t, e.msgCount += 1;
|
|
4767
4814
|
}
|
|
4768
|
-
function
|
|
4815
|
+
function ns(e) {
|
|
4769
4816
|
let t = e.content;
|
|
4770
4817
|
return typeof t == "string" ? t : JSON.stringify(t ?? "");
|
|
4771
4818
|
}
|
|
4772
|
-
function
|
|
4819
|
+
function rs(e, t) {
|
|
4773
4820
|
let n = [];
|
|
4774
|
-
for (let t of
|
|
4821
|
+
for (let t of Qo) {
|
|
4775
4822
|
let r = 0;
|
|
4776
4823
|
for (;;) {
|
|
4777
4824
|
let i = e.indexOf(t.prefix, r);
|
|
@@ -4784,35 +4831,35 @@ function es(e, t) {
|
|
|
4784
4831
|
}
|
|
4785
4832
|
if (n.sort((e, t) => e.idx - t.idx), !n.length) {
|
|
4786
4833
|
let n = e.trim();
|
|
4787
|
-
n &&
|
|
4834
|
+
n && ts(t.systemPrompt, X(n));
|
|
4788
4835
|
return;
|
|
4789
4836
|
}
|
|
4790
4837
|
if (n[0].idx > 0) {
|
|
4791
4838
|
let r = e.slice(0, n[0].idx).trim();
|
|
4792
|
-
r &&
|
|
4839
|
+
r && ts(t.systemPrompt, X(r));
|
|
4793
4840
|
}
|
|
4794
4841
|
for (let r = 0; r < n.length; r++) {
|
|
4795
4842
|
let i = n[r].idx, a = r + 1 < n.length ? n[r + 1].idx : e.length, o = e.slice(i, a).trim();
|
|
4796
|
-
o &&
|
|
4843
|
+
o && ts(t[n[r].key], X(o));
|
|
4797
4844
|
}
|
|
4798
4845
|
}
|
|
4799
|
-
function
|
|
4800
|
-
let n =
|
|
4846
|
+
function is(e, t = {}) {
|
|
4847
|
+
let n = es(), r = -1;
|
|
4801
4848
|
for (let t = e.length - 1; t >= 0; t--) if (e[t] instanceof a) {
|
|
4802
4849
|
r = t;
|
|
4803
4850
|
break;
|
|
4804
4851
|
}
|
|
4805
4852
|
for (let t = 0; t < e.length; t++) {
|
|
4806
4853
|
let c = e[t];
|
|
4807
|
-
if (c instanceof o)
|
|
4808
|
-
else if (c instanceof a)
|
|
4854
|
+
if (c instanceof o) rs(ns(c), n);
|
|
4855
|
+
else if (c instanceof a) ts(n[t === r ? "current" : "history"], X(ns(c)));
|
|
4809
4856
|
else if (c instanceof i) {
|
|
4810
4857
|
let e = c.tool_calls ?? [];
|
|
4811
4858
|
if (e.length) {
|
|
4812
4859
|
let t = e.map((e) => JSON.stringify(e.args ?? {})).join(" ");
|
|
4813
|
-
|
|
4814
|
-
} else
|
|
4815
|
-
} else c instanceof s ?
|
|
4860
|
+
ts(n.toolResults, X(t));
|
|
4861
|
+
} else ts(n.assistant, X(ns(c)));
|
|
4862
|
+
} else c instanceof s ? ts(n.toolResults, X(ns(c))) : ts(n.other, X(ns(c)));
|
|
4816
4863
|
}
|
|
4817
4864
|
let c = Object.values(n).filter((e) => e.tokens > 0);
|
|
4818
4865
|
c.sort((e, t) => t.tokens - e.tokens);
|
|
@@ -4829,12 +4876,12 @@ function ts(e, t = {}) {
|
|
|
4829
4876
|
}
|
|
4830
4877
|
//#endregion
|
|
4831
4878
|
//#region src/core/harness/contextInspector.ts
|
|
4832
|
-
function
|
|
4879
|
+
function as(e = {}) {
|
|
4833
4880
|
let t, n = e.contextWindow;
|
|
4834
4881
|
return {
|
|
4835
4882
|
name: "context-inspector",
|
|
4836
4883
|
async wrapModelCall(r, i) {
|
|
4837
|
-
return t =
|
|
4884
|
+
return t = is(r.messages, {
|
|
4838
4885
|
contextWindow: n,
|
|
4839
4886
|
thresholdRatio: e.thresholdRatio
|
|
4840
4887
|
}), i(r);
|
|
@@ -4847,13 +4894,13 @@ function ns(e = {}) {
|
|
|
4847
4894
|
}
|
|
4848
4895
|
//#endregion
|
|
4849
4896
|
//#region src/core/mcp/client.ts
|
|
4850
|
-
function
|
|
4897
|
+
function os(e) {
|
|
4851
4898
|
let t = e?.content;
|
|
4852
4899
|
if (!Array.isArray(t) || !t.length) return "";
|
|
4853
4900
|
let n = t.map((e) => e.type === "text" && e.text ? e.text : e.type === "image" && e.data ? `[image:${String(e.data).slice(0, 32)}…]` : e.type === "audio" && e.data ? "[audio]" : e.type === "resource" && e.resource ? e.resource.text ?? e.resource.blob ?? "" : "").filter(Boolean).join("\n");
|
|
4854
4901
|
return e?.isError ? `工具错误:${n}` : n;
|
|
4855
4902
|
}
|
|
4856
|
-
async function
|
|
4903
|
+
async function ss(e) {
|
|
4857
4904
|
let t = new URL(e.url), n = e.requestInit;
|
|
4858
4905
|
if (e.transport === "http") {
|
|
4859
4906
|
let { StreamableHTTPClientTransport: e } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
|
|
@@ -4866,8 +4913,8 @@ async function is(e) {
|
|
|
4866
4913
|
let { WebSocketClientTransport: r } = await import("@modelcontextprotocol/sdk/client/websocket.js");
|
|
4867
4914
|
return new r(t);
|
|
4868
4915
|
}
|
|
4869
|
-
function
|
|
4870
|
-
return r(async (n) =>
|
|
4916
|
+
function cs(e, t) {
|
|
4917
|
+
return r(async (n) => os(await t.callTool({
|
|
4871
4918
|
name: e.name,
|
|
4872
4919
|
arguments: n
|
|
4873
4920
|
})), {
|
|
@@ -4876,39 +4923,39 @@ function as(e, t) {
|
|
|
4876
4923
|
schema: e.inputSchema
|
|
4877
4924
|
});
|
|
4878
4925
|
}
|
|
4879
|
-
async function
|
|
4880
|
-
let { Client: t } = await import("@modelcontextprotocol/sdk/client"), n = await
|
|
4926
|
+
async function ls(e) {
|
|
4927
|
+
let { Client: t } = await import("@modelcontextprotocol/sdk/client"), n = await ss(e), r = new t({
|
|
4881
4928
|
name: "page-agent-sdk",
|
|
4882
4929
|
version: "1.0"
|
|
4883
4930
|
}, { capabilities: {} });
|
|
4884
4931
|
await r.connect(n);
|
|
4885
4932
|
let { tools: i } = await r.listTools();
|
|
4886
4933
|
return {
|
|
4887
|
-
tools: i.map((e) =>
|
|
4934
|
+
tools: i.map((e) => cs(e, r)),
|
|
4888
4935
|
close: () => r.close()
|
|
4889
4936
|
};
|
|
4890
4937
|
}
|
|
4891
4938
|
//#endregion
|
|
4892
4939
|
//#region src/core/sdk/promptBuilder.ts
|
|
4893
|
-
var
|
|
4940
|
+
var us = [
|
|
4894
4941
|
"你是一个 JSON 操作助手。集成方声明了一个主数据对象(含 zod schema 校验),你通过专用工具安全地读写它来完成任务。",
|
|
4895
4942
|
"所有写操作都经范围控制(仅 schema 声明字段内)与 schema 校验(不合法会返回结构化错误而非写入),并自动留快照可回退。",
|
|
4896
4943
|
"大对象/数组优先用增量 patch(只发改动)而非整体重传,避免输出被截断。",
|
|
4897
4944
|
"---",
|
|
4898
4945
|
ia.reliableWriteRules
|
|
4899
4946
|
].join("\n\n");
|
|
4900
|
-
function
|
|
4947
|
+
function ds(e, t) {
|
|
4901
4948
|
if (!e) return "";
|
|
4902
4949
|
let n = ca(e.schema, t);
|
|
4903
4950
|
return `\n\n## 可操作数据(字段以 read 工具返回的实际值为准)\n${e.description ? e.description + "\n" : ""}${n}`;
|
|
4904
4951
|
}
|
|
4905
|
-
function
|
|
4952
|
+
function fs(e) {
|
|
4906
4953
|
let t = e.appendReliableWriteRules !== !1;
|
|
4907
|
-
return e.systemPrompt ? t ? e.systemPrompt + "\n\n---\n\n" + ia.reliableWriteRules : e.systemPrompt :
|
|
4954
|
+
return e.systemPrompt ? t ? e.systemPrompt + "\n\n---\n\n" + ia.reliableWriteRules : e.systemPrompt : us;
|
|
4908
4955
|
}
|
|
4909
4956
|
//#endregion
|
|
4910
4957
|
//#region src/core/sdk/defineTool.ts
|
|
4911
|
-
function
|
|
4958
|
+
function ps(e) {
|
|
4912
4959
|
return r(async (t) => {
|
|
4913
4960
|
let n = await e.handler(t);
|
|
4914
4961
|
return typeof n == "string" ? n : JSON.stringify(n);
|
|
@@ -4920,7 +4967,7 @@ function us(e) {
|
|
|
4920
4967
|
}
|
|
4921
4968
|
//#endregion
|
|
4922
4969
|
//#region src/core/sdk/inspectContextTool.ts
|
|
4923
|
-
var
|
|
4970
|
+
var ms = t.object({
|
|
4924
4971
|
path: t.string().optional().describe("分类 key 过滤(如 toolResults/history/systemPrompt/dataHint);不传=全部分类"),
|
|
4925
4972
|
role: t.enum([
|
|
4926
4973
|
"user",
|
|
@@ -4930,11 +4977,11 @@ var ds = t.object({
|
|
|
4930
4977
|
]).optional().describe("聚焦每轮首句的角色(assistant→回复摘要,user→问题摘要);不影响工具列表"),
|
|
4931
4978
|
limit: t.number().int().min(1).max(50).optional().describe("返回最近 N 轮(默认全部;超 50 自动截最近 50 防返回过大)")
|
|
4932
4979
|
});
|
|
4933
|
-
function
|
|
4934
|
-
return
|
|
4980
|
+
function hs(e) {
|
|
4981
|
+
return ps({
|
|
4935
4982
|
name: "inspect_context",
|
|
4936
4983
|
description: "查看当前对话上下文的构成(供压缩决策)。返回:totalTokens(历史轮次 token 总和,与触发判断同口径)、occupancy(窗口占用比)、contextWindow、categories(分类占用)、rounds(每轮 token/工具/首句)。先调用本工具查看构成,再决定压缩策略。",
|
|
4937
|
-
schema:
|
|
4984
|
+
schema: ms,
|
|
4938
4985
|
handler: (t) => {
|
|
4939
4986
|
let n = eo(e.getMessages()), r = n.length > 50 ? n.slice(n.length - 50) : n, i = (t.limit && r.length > t.limit ? r.slice(r.length - t.limit) : r).map((e) => {
|
|
4940
4987
|
let n = po(e), r = no(e), i = t.role === "assistant" ? e.assistantMsgs[0] ?? e.userMsg : e.userMsg, a = to(typeof i.content == "string" ? i.content : "", 60);
|
|
@@ -4957,7 +5004,7 @@ function fs(e) {
|
|
|
4957
5004
|
}
|
|
4958
5005
|
//#endregion
|
|
4959
5006
|
//#region src/core/sdk/compressDecision.ts
|
|
4960
|
-
var
|
|
5007
|
+
var gs = t.object({
|
|
4961
5008
|
keepRounds: t.number().int().min(0).max(50).optional(),
|
|
4962
5009
|
windowRatio: t.number().min(0).max(1).optional(),
|
|
4963
5010
|
summarize: t.object({ mode: t.enum(["index", "llm"]) }),
|
|
@@ -4967,23 +5014,23 @@ var ps = t.object({
|
|
|
4967
5014
|
}).refine((e) => e.keepRounds !== void 0 || e.windowRatio !== void 0, { message: "keepRounds 与 windowRatio 至少填一个(按当前触发模式)" });
|
|
4968
5015
|
//#endregion
|
|
4969
5016
|
//#region src/core/sdk/llmResolver.ts
|
|
4970
|
-
function
|
|
5017
|
+
function _s(e) {
|
|
4971
5018
|
let t = e.find((e) => e.role === "user");
|
|
4972
5019
|
if (!t) return;
|
|
4973
5020
|
let n = t.content, r = (typeof n == "string" ? n : Array.isArray(n) ? n.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(n ?? "")).trim().replace(/[\n\r]+/g, " ");
|
|
4974
5021
|
if (r) return r.length > 30 ? r.slice(0, 30) + "…" : r;
|
|
4975
5022
|
}
|
|
4976
|
-
function
|
|
5023
|
+
function vs(e) {
|
|
4977
5024
|
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
4978
5025
|
}
|
|
4979
|
-
function
|
|
5026
|
+
function ys(e) {
|
|
4980
5027
|
let t = e.content;
|
|
4981
5028
|
return typeof t == "string" ? t : Array.isArray(t) ? t.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(t ?? "");
|
|
4982
5029
|
}
|
|
4983
|
-
function
|
|
5030
|
+
function bs(e) {
|
|
4984
5031
|
let t = e.summaryLlm ?? e.llm;
|
|
4985
5032
|
if (!t) return;
|
|
4986
|
-
let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, i = e.summaryTimeoutMs ?? 15e3, s =
|
|
5033
|
+
let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, i = e.summaryTimeoutMs ?? 15e3, s = vs(t) ? t : null, c = vs(t) ? null : t;
|
|
4987
5034
|
if (c && !c.apiKey) {
|
|
4988
5035
|
e.summaryLlm && console.warn("[page-agent-sdk][summarization] summaryLlm 已配置但缺 apiKey,摘要回退主 agent 模型或零成本索引摘要");
|
|
4989
5036
|
return;
|
|
@@ -4995,16 +5042,16 @@ function _s(e) {
|
|
|
4995
5042
|
return !l && c && (l = await f(c, {
|
|
4996
5043
|
temperature: n,
|
|
4997
5044
|
maxTokens: r
|
|
4998
|
-
})),
|
|
5045
|
+
})), ys(await l.invoke([new o("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new a(e)], { signal: t.signal })).trim();
|
|
4999
5046
|
} finally {
|
|
5000
5047
|
clearTimeout(s);
|
|
5001
5048
|
}
|
|
5002
5049
|
};
|
|
5003
5050
|
}
|
|
5004
|
-
function
|
|
5051
|
+
function xs(e) {
|
|
5005
5052
|
let t = e.titleLlm ?? e.summaryLlm ?? e.llm;
|
|
5006
5053
|
if (!t) return;
|
|
5007
|
-
let n =
|
|
5054
|
+
let n = vs(t) ? t : null, r = vs(t) ? null : t;
|
|
5008
5055
|
if (r && !r.apiKey) return;
|
|
5009
5056
|
let i = n;
|
|
5010
5057
|
return async (e) => {
|
|
@@ -5013,7 +5060,7 @@ function vs(e) {
|
|
|
5013
5060
|
return !i && r && (i = await f(r, {
|
|
5014
5061
|
temperature: 0,
|
|
5015
5062
|
maxTokens: 30
|
|
5016
|
-
})),
|
|
5063
|
+
})), ys(await i.invoke([new o("根据以下对话的主旨,生成一个简短的中文标题(不超过15个字,不要标点和引号,直接输出标题文字)。"), new a(t)], { signal: n.signal })).trim().replace(/^["'""「『]|["'""」』]$/g, "").split("\n")[0].slice(0, 20);
|
|
5017
5064
|
} catch {
|
|
5018
5065
|
return "";
|
|
5019
5066
|
} finally {
|
|
@@ -5021,10 +5068,10 @@ function vs(e) {
|
|
|
5021
5068
|
}
|
|
5022
5069
|
};
|
|
5023
5070
|
}
|
|
5024
|
-
function
|
|
5071
|
+
function Ss() {
|
|
5025
5072
|
return `call_dec_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
5026
5073
|
}
|
|
5027
|
-
function
|
|
5074
|
+
function Cs(e) {
|
|
5028
5075
|
let t = e.match(/```(?:json)?\s*([\s\S]*?)```/), n = t ? t[1] : e, r = n.indexOf("{"), i = n.lastIndexOf("}");
|
|
5029
5076
|
if (r < 0 || i < 0 || i <= r) return null;
|
|
5030
5077
|
try {
|
|
@@ -5033,21 +5080,21 @@ function bs(e) {
|
|
|
5033
5080
|
return null;
|
|
5034
5081
|
}
|
|
5035
5082
|
}
|
|
5036
|
-
function
|
|
5083
|
+
function ws(e) {
|
|
5037
5084
|
if (!e) return null;
|
|
5038
|
-
let t =
|
|
5085
|
+
let t = Cs(e);
|
|
5039
5086
|
if (t == null) return null;
|
|
5040
|
-
let n =
|
|
5087
|
+
let n = gs.safeParse(t);
|
|
5041
5088
|
return n.success ? n.data : null;
|
|
5042
5089
|
}
|
|
5043
|
-
async function
|
|
5090
|
+
async function Ts(e, t, n, r) {
|
|
5044
5091
|
let i = [...n];
|
|
5045
5092
|
for (let n = 0; n < 3; n++) {
|
|
5046
5093
|
let n = await e.invoke(i, { signal: r }), a = n?.tool_calls ?? [];
|
|
5047
|
-
if (!a.length) return
|
|
5094
|
+
if (!a.length) return ys(n).trim();
|
|
5048
5095
|
i = [...i, n];
|
|
5049
5096
|
for (let e of a) {
|
|
5050
|
-
let n = e.id ??
|
|
5097
|
+
let n = e.id ?? Ss();
|
|
5051
5098
|
try {
|
|
5052
5099
|
let r = await t.invoke(e.args ?? {}), a = typeof r == "string" ? r : r?.content ?? JSON.stringify(r);
|
|
5053
5100
|
i = [...i, new s({
|
|
@@ -5064,10 +5111,10 @@ async function Ss(e, t, n, r) {
|
|
|
5064
5111
|
}
|
|
5065
5112
|
return "";
|
|
5066
5113
|
}
|
|
5067
|
-
function
|
|
5114
|
+
function Es(e) {
|
|
5068
5115
|
let t = e.summaryLlm ?? e.llm;
|
|
5069
5116
|
if (!t) return;
|
|
5070
|
-
let n =
|
|
5117
|
+
let n = vs(t) ? t : null, r = vs(t) ? null : t;
|
|
5071
5118
|
if (r && !r.apiKey) return;
|
|
5072
5119
|
let i = e.decisionTimeoutMs ?? 6e3, s = e.decisionMaxTokens ?? 2048, c = n;
|
|
5073
5120
|
return async (e) => {
|
|
@@ -5079,12 +5126,12 @@ function Cs(e) {
|
|
|
5079
5126
|
}));
|
|
5080
5127
|
let n = c;
|
|
5081
5128
|
if (typeof n.bindTools != "function") return null;
|
|
5082
|
-
let i =
|
|
5129
|
+
let i = hs({
|
|
5083
5130
|
getMessages: e.getMessages,
|
|
5084
5131
|
getSnapshot: e.getSnapshot,
|
|
5085
5132
|
contextWindow: e.contextWindow
|
|
5086
5133
|
}), l = n.bindTools([i]), u = e.triggerMode === "token" ? "token 模式:必填 windowRatio(0~1 保留窗口预算比例,如 0.4);keepRounds 可选" : "轮数模式:必填 keepRounds(保留最近几轮,如 6);windowRatio 可选", d = [new o(`你是对话历史压缩决策助手。当前触发模式 = ${e.triggerMode}(${e.triggerReason})。先调用 inspect_context 查看上下文构成,再输出压缩决策 JSON。${u}。仅输出 JSON,不要多余文字/markdown。schema:{keepRounds?(int 0-50), windowRatio?(0-1), summarize:{mode:"index"|"llm"}, recallTopK?(int 0-10), preserveTools?(string[]≤10), reason?(≤200字)}。keepRounds/windowRatio 至少填一个。`), new a(`触发原因:${e.triggerReason}\n上下文窗口:${e.contextWindow ?? "未知"} tokens\n阈值比例:${e.thresholdRatio ?? "未知"}\n\n请决策压缩策略(先 inspect_context 查看,再输出 JSON)。`)];
|
|
5087
|
-
return
|
|
5134
|
+
return ws(await Ts(l, i, d, t.signal)) || ws(await Ts(l, i, [...d, new a("上一次输出无效(JSON 解析失败或 schema 校验不通过)。请只输出符合 schema 的压缩决策 JSON,不要多余文字/markdown 代码块。")], t.signal));
|
|
5088
5135
|
} catch {
|
|
5089
5136
|
return null;
|
|
5090
5137
|
} finally {
|
|
@@ -5092,22 +5139,22 @@ function Cs(e) {
|
|
|
5092
5139
|
}
|
|
5093
5140
|
};
|
|
5094
5141
|
}
|
|
5095
|
-
function
|
|
5096
|
-
let t = e.llm, n =
|
|
5142
|
+
function Ds(e) {
|
|
5143
|
+
let t = e.llm, n = vs(e.llm) ? void 0 : e.llm;
|
|
5097
5144
|
return {
|
|
5098
5145
|
modelCaps: ni({
|
|
5099
5146
|
model: n?.model ?? t?.model ?? t?.modelName,
|
|
5100
5147
|
contextWindow: e.contextWindow ?? n?.contextWindow ?? t?.contextWindow,
|
|
5101
5148
|
maxOutputTokens: e.maxOutputTokens ?? n?.maxOutputTokens ?? t?.maxOutputTokens
|
|
5102
5149
|
}),
|
|
5103
|
-
summaryLlmInvoke:
|
|
5104
|
-
titleLlmInvoke:
|
|
5105
|
-
compressDecisionInvoke:
|
|
5150
|
+
summaryLlmInvoke: bs(e),
|
|
5151
|
+
titleLlmInvoke: xs(e),
|
|
5152
|
+
compressDecisionInvoke: Es(e)
|
|
5106
5153
|
};
|
|
5107
5154
|
}
|
|
5108
5155
|
//#endregion
|
|
5109
5156
|
//#region src/core/sdk/conflictManager.ts
|
|
5110
|
-
function
|
|
5157
|
+
function Os(e) {
|
|
5111
5158
|
let t = /* @__PURE__ */ Ot(null), n = 0;
|
|
5112
5159
|
function r(r) {
|
|
5113
5160
|
return new Promise((i) => {
|
|
@@ -5138,7 +5185,7 @@ function Ts(e) {
|
|
|
5138
5185
|
}
|
|
5139
5186
|
//#endregion
|
|
5140
5187
|
//#region src/core/utils/id.ts
|
|
5141
|
-
function
|
|
5188
|
+
function ks() {
|
|
5142
5189
|
try {
|
|
5143
5190
|
if (typeof crypto < "u" && typeof crypto.randomUUID == "function") return crypto.randomUUID();
|
|
5144
5191
|
} catch {}
|
|
@@ -5146,7 +5193,7 @@ function Es() {
|
|
|
5146
5193
|
}
|
|
5147
5194
|
//#endregion
|
|
5148
5195
|
//#region src/core/backends/storage.ts
|
|
5149
|
-
var
|
|
5196
|
+
var As = "chat-sdk", js = 50 * 1024 * 1024, Ms = 4 * 1024 * 1024, Ns = 10 * 1024 * 1024, Ps = .9, Fs = 500, Is = 300, Ls = "__meta__", Rs = "v:1", zs = [
|
|
5150
5197
|
"messages",
|
|
5151
5198
|
"vfs",
|
|
5152
5199
|
"todos",
|
|
@@ -5157,51 +5204,51 @@ var Ds = "chat-sdk", Os = 50 * 1024 * 1024, ks = 4 * 1024 * 1024, As = 10 * 1024
|
|
|
5157
5204
|
"workingMemory",
|
|
5158
5205
|
"focus"
|
|
5159
5206
|
];
|
|
5160
|
-
function
|
|
5161
|
-
return e === "local" || e === "session" ?
|
|
5207
|
+
function Bs(e) {
|
|
5208
|
+
return e === "local" || e === "session" ? Ms : js;
|
|
5162
5209
|
}
|
|
5163
|
-
function
|
|
5210
|
+
function Vs(e) {
|
|
5164
5211
|
if (typeof e != "object" || !e) return !1;
|
|
5165
5212
|
let t = e;
|
|
5166
5213
|
return t.name === "QuotaExceededError" || t.name === "NS_ERROR_DOM_QUOTA_REACHED" || t.code === 22 || t.code === 1014;
|
|
5167
5214
|
}
|
|
5168
|
-
function
|
|
5215
|
+
function Hs(e, t, n, r) {
|
|
5169
5216
|
return [
|
|
5170
|
-
|
|
5217
|
+
Rs,
|
|
5171
5218
|
e,
|
|
5172
5219
|
t,
|
|
5173
5220
|
n,
|
|
5174
5221
|
r
|
|
5175
5222
|
].join("::");
|
|
5176
5223
|
}
|
|
5177
|
-
function
|
|
5224
|
+
function Us(e, t, n) {
|
|
5178
5225
|
return [
|
|
5179
|
-
|
|
5226
|
+
Rs,
|
|
5180
5227
|
e,
|
|
5181
5228
|
t,
|
|
5182
5229
|
n
|
|
5183
5230
|
].join("::") + "::";
|
|
5184
5231
|
}
|
|
5185
|
-
function
|
|
5232
|
+
function Ws(e, t) {
|
|
5186
5233
|
return [
|
|
5187
|
-
|
|
5234
|
+
Rs,
|
|
5188
5235
|
e,
|
|
5189
5236
|
t
|
|
5190
5237
|
].join("::") + "::";
|
|
5191
5238
|
}
|
|
5192
|
-
function
|
|
5193
|
-
return [
|
|
5239
|
+
function Gs(e) {
|
|
5240
|
+
return [Rs, e].join("::") + "::";
|
|
5194
5241
|
}
|
|
5195
|
-
var
|
|
5196
|
-
function
|
|
5197
|
-
|
|
5242
|
+
var Ks = null;
|
|
5243
|
+
function qs(e) {
|
|
5244
|
+
Ks ||= new TextEncoder();
|
|
5198
5245
|
try {
|
|
5199
|
-
return
|
|
5246
|
+
return Ks.encode(JSON.stringify(e)).length;
|
|
5200
5247
|
} catch {
|
|
5201
5248
|
return 0;
|
|
5202
5249
|
}
|
|
5203
5250
|
}
|
|
5204
|
-
function
|
|
5251
|
+
function Js(e, t, n) {
|
|
5205
5252
|
let r = e.reduce((e, t) => e + t.bytes, 0);
|
|
5206
5253
|
if (r <= t) return [];
|
|
5207
5254
|
let i = t * n, a = [...e].sort((e, t) => e.lastAccessed - t.lastAccessed), o = [];
|
|
@@ -5211,7 +5258,7 @@ function Gs(e, t, n) {
|
|
|
5211
5258
|
}
|
|
5212
5259
|
return o;
|
|
5213
5260
|
}
|
|
5214
|
-
function
|
|
5261
|
+
function Ys() {
|
|
5215
5262
|
let e = /* @__PURE__ */ new Map();
|
|
5216
5263
|
return {
|
|
5217
5264
|
async get(t) {
|
|
@@ -5231,7 +5278,7 @@ function Ks() {
|
|
|
5231
5278
|
}
|
|
5232
5279
|
};
|
|
5233
5280
|
}
|
|
5234
|
-
function
|
|
5281
|
+
function Xs(e) {
|
|
5235
5282
|
return new Promise((t, n) => {
|
|
5236
5283
|
if (typeof indexedDB > "u") {
|
|
5237
5284
|
n(/* @__PURE__ */ Error("indexedDB 不可用"));
|
|
@@ -5292,11 +5339,15 @@ function qs(e) {
|
|
|
5292
5339
|
}, r.onerror = () => n(r.error);
|
|
5293
5340
|
});
|
|
5294
5341
|
}
|
|
5295
|
-
function
|
|
5342
|
+
function Zs(e) {
|
|
5296
5343
|
return {
|
|
5297
5344
|
async get(t) {
|
|
5298
5345
|
let n = e.getItem(t);
|
|
5299
|
-
|
|
5346
|
+
if (n != null) try {
|
|
5347
|
+
return JSON.parse(n);
|
|
5348
|
+
} catch {
|
|
5349
|
+
return;
|
|
5350
|
+
}
|
|
5300
5351
|
},
|
|
5301
5352
|
async set(t, n) {
|
|
5302
5353
|
e.setItem(t, JSON.stringify(n));
|
|
@@ -5313,7 +5364,14 @@ function Js(e) {
|
|
|
5313
5364
|
r.sort();
|
|
5314
5365
|
for (let t of r) {
|
|
5315
5366
|
let r = e.getItem(t);
|
|
5316
|
-
if (r
|
|
5367
|
+
if (r == null) continue;
|
|
5368
|
+
let i;
|
|
5369
|
+
try {
|
|
5370
|
+
i = JSON.parse(r);
|
|
5371
|
+
} catch {
|
|
5372
|
+
continue;
|
|
5373
|
+
}
|
|
5374
|
+
if (n(t, i) === !1) return;
|
|
5317
5375
|
}
|
|
5318
5376
|
},
|
|
5319
5377
|
async clearPrefix(t) {
|
|
@@ -5326,12 +5384,12 @@ function Js(e) {
|
|
|
5326
5384
|
}
|
|
5327
5385
|
};
|
|
5328
5386
|
}
|
|
5329
|
-
function
|
|
5387
|
+
function Qs(e, t, n) {
|
|
5330
5388
|
let r = (e.get(t) ?? Promise.resolve()).then(n, n);
|
|
5331
5389
|
return e.set(t, r.then(() => void 0, () => void 0)), r;
|
|
5332
5390
|
}
|
|
5333
|
-
function
|
|
5334
|
-
let t = e.dbName ??
|
|
5391
|
+
function $s(e = {}) {
|
|
5392
|
+
let t = e.dbName ?? As, n = e.backend ?? "indexed", r = e.maxBytes ?? Bs(n), i = e.maxBytesPerSession ?? Ns, a = e.evictionWatermark ?? Ps, o = e.debounceMs ?? Fs, s = /* @__PURE__ */ new Set();
|
|
5335
5393
|
function c(e) {
|
|
5336
5394
|
for (let t of s) try {
|
|
5337
5395
|
t(e);
|
|
@@ -5344,16 +5402,16 @@ function Xs(e = {}) {
|
|
|
5344
5402
|
try {
|
|
5345
5403
|
if (n === "indexed") {
|
|
5346
5404
|
if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
|
|
5347
|
-
l = await
|
|
5405
|
+
l = await Xs(t), d(!0);
|
|
5348
5406
|
} else if (n === "session") {
|
|
5349
5407
|
if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
|
|
5350
|
-
l =
|
|
5408
|
+
l = Zs(sessionStorage), d(!0);
|
|
5351
5409
|
} else if (n === "local") {
|
|
5352
5410
|
if (typeof localStorage > "u") throw Error("localStorage 不可用");
|
|
5353
|
-
l =
|
|
5354
|
-
} else l =
|
|
5411
|
+
l = Zs(localStorage), d(!0);
|
|
5412
|
+
} else l = Ys(), d(!1);
|
|
5355
5413
|
} catch (e) {
|
|
5356
|
-
l =
|
|
5414
|
+
l = Ys();
|
|
5357
5415
|
let t = e instanceof Error ? e.message : String(e);
|
|
5358
5416
|
d(!1), Promise.resolve().then(() => c({
|
|
5359
5417
|
type: "degraded",
|
|
@@ -5363,10 +5421,10 @@ function Xs(e = {}) {
|
|
|
5363
5421
|
})();
|
|
5364
5422
|
let p = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map();
|
|
5365
5423
|
function g(e, n, r, a) {
|
|
5366
|
-
let o =
|
|
5367
|
-
return
|
|
5424
|
+
let o = Hs(t, r, a, Ls);
|
|
5425
|
+
return Qs(h, o, async () => {
|
|
5368
5426
|
let t = async () => {
|
|
5369
|
-
let t = await l.get(o), s = await l.get(e), u = s == null ? 0 :
|
|
5427
|
+
let t = await l.get(o), s = await l.get(e), u = s == null ? 0 : qs(s), d = qs(n), f = (t?.bytes ?? 0) + (d - u);
|
|
5370
5428
|
if (f > i) {
|
|
5371
5429
|
c({
|
|
5372
5430
|
type: "quota",
|
|
@@ -5388,12 +5446,12 @@ function Xs(e = {}) {
|
|
|
5388
5446
|
try {
|
|
5389
5447
|
await t();
|
|
5390
5448
|
} catch (e) {
|
|
5391
|
-
if (
|
|
5449
|
+
if (Vs(e) && !u) {
|
|
5392
5450
|
u = !0;
|
|
5393
5451
|
try {
|
|
5394
5452
|
await b();
|
|
5395
5453
|
} catch {}
|
|
5396
|
-
l =
|
|
5454
|
+
l = Ys(), Promise.resolve().then(() => c({
|
|
5397
5455
|
type: "degraded",
|
|
5398
5456
|
reason: "存储配额超限(QuotaExceededError),已淘汰最旧会话并降级内存"
|
|
5399
5457
|
}));
|
|
@@ -5405,7 +5463,7 @@ function Xs(e = {}) {
|
|
|
5405
5463
|
});
|
|
5406
5464
|
}
|
|
5407
5465
|
function _(e, n, r, i) {
|
|
5408
|
-
let a =
|
|
5466
|
+
let a = Hs(t, e, n, r), s = p.get(a);
|
|
5409
5467
|
s && s.resolve();
|
|
5410
5468
|
let c = m.get(a);
|
|
5411
5469
|
return c && clearTimeout(c), new Promise((t) => {
|
|
@@ -5432,15 +5490,15 @@ function Xs(e = {}) {
|
|
|
5432
5490
|
function y() {
|
|
5433
5491
|
v ||= setTimeout(() => {
|
|
5434
5492
|
v = null, b();
|
|
5435
|
-
},
|
|
5493
|
+
}, Is);
|
|
5436
5494
|
}
|
|
5437
5495
|
async function b() {
|
|
5438
5496
|
let e = [];
|
|
5439
|
-
await l.scan(
|
|
5497
|
+
await l.scan(Gs(t), (t, n) => {
|
|
5440
5498
|
t.endsWith("::__meta__") && e.push(n);
|
|
5441
5499
|
});
|
|
5442
|
-
let n =
|
|
5443
|
-
for (let e of n) await l.clearPrefix(
|
|
5500
|
+
let n = Js(e, r, a);
|
|
5501
|
+
for (let e of n) await l.clearPrefix(Us(t, e.agentId, e.sessionId)), c({
|
|
5444
5502
|
type: "evicted",
|
|
5445
5503
|
agentId: e.agentId,
|
|
5446
5504
|
sessionId: e.sessionId,
|
|
@@ -5451,13 +5509,13 @@ function Xs(e = {}) {
|
|
|
5451
5509
|
ready: f,
|
|
5452
5510
|
async listSessions(e) {
|
|
5453
5511
|
let n = [];
|
|
5454
|
-
return await l.scan(
|
|
5512
|
+
return await l.scan(Ws(t, e), (e, t) => {
|
|
5455
5513
|
e.endsWith("::__meta__") && n.push(t);
|
|
5456
5514
|
}), n.sort((e, t) => t.lastAccessed - e.lastAccessed);
|
|
5457
5515
|
},
|
|
5458
5516
|
async load(e, n) {
|
|
5459
|
-
let r =
|
|
5460
|
-
return await
|
|
5517
|
+
let r = Hs(t, e, n, Ls);
|
|
5518
|
+
return await Qs(h, r, async () => {
|
|
5461
5519
|
let i = await l.get(r);
|
|
5462
5520
|
if (!i) return;
|
|
5463
5521
|
let a = {
|
|
@@ -5466,8 +5524,8 @@ function Xs(e = {}) {
|
|
|
5466
5524
|
todos: [],
|
|
5467
5525
|
memory: ""
|
|
5468
5526
|
};
|
|
5469
|
-
for (let r of
|
|
5470
|
-
let i = await l.get(
|
|
5527
|
+
for (let r of zs) {
|
|
5528
|
+
let i = await l.get(Hs(t, e, n, r));
|
|
5471
5529
|
i != null && (a[r] = i);
|
|
5472
5530
|
}
|
|
5473
5531
|
return i.lastAccessed = Date.now(), await l.set(r, i), a;
|
|
@@ -5475,12 +5533,12 @@ function Xs(e = {}) {
|
|
|
5475
5533
|
},
|
|
5476
5534
|
async save(e, t, n) {
|
|
5477
5535
|
let r = [];
|
|
5478
|
-
for (let i of
|
|
5536
|
+
for (let i of zs) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
|
|
5479
5537
|
await Promise.all(r);
|
|
5480
5538
|
},
|
|
5481
5539
|
async updateTitle(e, n, r) {
|
|
5482
|
-
let i =
|
|
5483
|
-
return
|
|
5540
|
+
let i = Hs(t, e, n, Ls);
|
|
5541
|
+
return Qs(h, i, async () => {
|
|
5484
5542
|
let e = await l.get(i);
|
|
5485
5543
|
e && (e.title = r, e.lastAccessed = Date.now(), await l.set(i, e));
|
|
5486
5544
|
});
|
|
@@ -5496,10 +5554,10 @@ function Xs(e = {}) {
|
|
|
5496
5554
|
})), c({ type: "flush" }), await b();
|
|
5497
5555
|
},
|
|
5498
5556
|
async deleteSession(e, n) {
|
|
5499
|
-
await l.clearPrefix(
|
|
5557
|
+
await l.clearPrefix(Us(t, e, n));
|
|
5500
5558
|
},
|
|
5501
5559
|
async createSession(e, n, r) {
|
|
5502
|
-
let i = r ??
|
|
5560
|
+
let i = r ?? ks(), a = Date.now(), o = {
|
|
5503
5561
|
agentId: e,
|
|
5504
5562
|
sessionId: i,
|
|
5505
5563
|
createdAt: a,
|
|
@@ -5507,7 +5565,7 @@ function Xs(e = {}) {
|
|
|
5507
5565
|
bytes: 0,
|
|
5508
5566
|
title: n
|
|
5509
5567
|
};
|
|
5510
|
-
return await l.set(
|
|
5568
|
+
return await l.set(Hs(t, e, i, Ls), o), i;
|
|
5511
5569
|
},
|
|
5512
5570
|
onEvent(e) {
|
|
5513
5571
|
s.add(e);
|
|
@@ -5522,15 +5580,15 @@ function Xs(e = {}) {
|
|
|
5522
5580
|
}
|
|
5523
5581
|
//#endregion
|
|
5524
5582
|
//#region src/core/sdk/optionsResolver.ts
|
|
5525
|
-
function
|
|
5526
|
-
return e === void 0 || e === !1 ? null : typeof e == "string" ?
|
|
5583
|
+
function ec(e) {
|
|
5584
|
+
return e === void 0 || e === !1 ? null : typeof e == "string" ? $s({ backend: e }) : e.enabled === !1 ? null : $s(e);
|
|
5527
5585
|
}
|
|
5528
|
-
function
|
|
5586
|
+
function tc(e) {
|
|
5529
5587
|
return e.dialog ?? {};
|
|
5530
5588
|
}
|
|
5531
5589
|
//#endregion
|
|
5532
5590
|
//#region src/core/capabilities.ts
|
|
5533
|
-
var
|
|
5591
|
+
var nc = [
|
|
5534
5592
|
{
|
|
5535
5593
|
name: "dataOps",
|
|
5536
5594
|
defaultOn: !0
|
|
@@ -5619,13 +5677,13 @@ var $s = [
|
|
|
5619
5677
|
requires: ["summarization"]
|
|
5620
5678
|
}
|
|
5621
5679
|
];
|
|
5622
|
-
function
|
|
5680
|
+
function rc(e) {
|
|
5623
5681
|
let t = {};
|
|
5624
|
-
for (let n of
|
|
5682
|
+
for (let n of nc) {
|
|
5625
5683
|
let r = e?.[n.name];
|
|
5626
5684
|
t[n.name] = n.defaultOn ? r !== !1 : r === !0;
|
|
5627
5685
|
}
|
|
5628
|
-
for (let e of
|
|
5686
|
+
for (let e of nc) if (e.requires && t[e.name]) {
|
|
5629
5687
|
for (let n of e.requires) if (!t[n]) {
|
|
5630
5688
|
t[e.name] = !1;
|
|
5631
5689
|
break;
|
|
@@ -5635,7 +5693,7 @@ function ec(e) {
|
|
|
5635
5693
|
}
|
|
5636
5694
|
//#endregion
|
|
5637
5695
|
//#region src/core/sdk/events.ts
|
|
5638
|
-
function
|
|
5696
|
+
function ic(e) {
|
|
5639
5697
|
let t = /* @__PURE__ */ new Set(), n = (n) => {
|
|
5640
5698
|
if (n.type !== "approval_request") {
|
|
5641
5699
|
if (e) try {
|
|
@@ -5661,7 +5719,7 @@ function tc(e) {
|
|
|
5661
5719
|
}
|
|
5662
5720
|
//#endregion
|
|
5663
5721
|
//#region src/core/sdk/contextPreset.ts
|
|
5664
|
-
var
|
|
5722
|
+
var ac = {
|
|
5665
5723
|
auto: {
|
|
5666
5724
|
summaryThresholdRatio: .5,
|
|
5667
5725
|
windowRatio: .4,
|
|
@@ -5689,7 +5747,7 @@ var nc = {
|
|
|
5689
5747
|
enableRecall: !0,
|
|
5690
5748
|
enableLLMSummary: !0
|
|
5691
5749
|
}
|
|
5692
|
-
},
|
|
5750
|
+
}, oc = {
|
|
5693
5751
|
auto: ["describe_data", "read"],
|
|
5694
5752
|
conservative: ["describe_data"],
|
|
5695
5753
|
aggressive: ["describe_data", "read"],
|
|
@@ -5700,8 +5758,8 @@ var nc = {
|
|
|
5700
5758
|
"search_data"
|
|
5701
5759
|
]
|
|
5702
5760
|
};
|
|
5703
|
-
function
|
|
5704
|
-
let n =
|
|
5761
|
+
function sc(e, t) {
|
|
5762
|
+
let n = ac[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
|
|
5705
5763
|
return {
|
|
5706
5764
|
...n,
|
|
5707
5765
|
...r,
|
|
@@ -5711,7 +5769,7 @@ function ic(e, t) {
|
|
|
5711
5769
|
}
|
|
5712
5770
|
//#endregion
|
|
5713
5771
|
//#region src/core/sdk/middlewareStack.ts
|
|
5714
|
-
var
|
|
5772
|
+
var cc = {
|
|
5715
5773
|
dataHint: 10,
|
|
5716
5774
|
usageHints: 20,
|
|
5717
5775
|
todos: 30,
|
|
@@ -5728,29 +5786,29 @@ var ac = {
|
|
|
5728
5786
|
subagents: 140,
|
|
5729
5787
|
augmentSystem: 150
|
|
5730
5788
|
};
|
|
5731
|
-
function
|
|
5789
|
+
function lc(e) {
|
|
5732
5790
|
return e.map((e, t) => ({
|
|
5733
5791
|
m: e,
|
|
5734
5792
|
i: t,
|
|
5735
|
-
p:
|
|
5793
|
+
p: cc[e.name] ?? Infinity
|
|
5736
5794
|
})).sort((e, t) => e.p - t.p || e.i - t.i).map((e) => e.m);
|
|
5737
5795
|
}
|
|
5738
5796
|
//#endregion
|
|
5739
5797
|
//#region src/core/tools/jsonUtils.ts
|
|
5740
|
-
var
|
|
5798
|
+
var uc = /* @__PURE__ */ new Set([
|
|
5741
5799
|
"__proto__",
|
|
5742
5800
|
"constructor",
|
|
5743
5801
|
"prototype"
|
|
5744
5802
|
]);
|
|
5745
|
-
function
|
|
5746
|
-
return e.split(".").some((e) =>
|
|
5803
|
+
function dc(e) {
|
|
5804
|
+
return e.split(".").some((e) => uc.has(e));
|
|
5747
5805
|
}
|
|
5748
|
-
function
|
|
5749
|
-
if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t))
|
|
5806
|
+
function fc(e, t) {
|
|
5807
|
+
if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t)) uc.has(n) || (e[n] = t[n]);
|
|
5750
5808
|
}
|
|
5751
5809
|
function Z(e, t) {
|
|
5752
5810
|
if (!t) return e;
|
|
5753
|
-
if (
|
|
5811
|
+
if (dc(t)) return;
|
|
5754
5812
|
let n = t.split("."), r = e;
|
|
5755
5813
|
for (let e of n) {
|
|
5756
5814
|
if (r == null) return;
|
|
@@ -5758,8 +5816,8 @@ function Z(e, t) {
|
|
|
5758
5816
|
}
|
|
5759
5817
|
return r;
|
|
5760
5818
|
}
|
|
5761
|
-
function
|
|
5762
|
-
if (!t ||
|
|
5819
|
+
function pc(e, t, n) {
|
|
5820
|
+
if (!t || dc(t)) return;
|
|
5763
5821
|
let r = t.split("."), i = e;
|
|
5764
5822
|
for (let e = 0; e < r.length - 1; e++) {
|
|
5765
5823
|
let t = r[e];
|
|
@@ -5767,8 +5825,8 @@ function uc(e, t, n) {
|
|
|
5767
5825
|
}
|
|
5768
5826
|
i[r[r.length - 1]] = n;
|
|
5769
5827
|
}
|
|
5770
|
-
function
|
|
5771
|
-
if (!t ||
|
|
5828
|
+
function mc(e, t) {
|
|
5829
|
+
if (!t || dc(t)) return !1;
|
|
5772
5830
|
let n = t.split("."), r = e;
|
|
5773
5831
|
for (let e = 0; e < n.length - 1; e++) {
|
|
5774
5832
|
if (r == null) return !1;
|
|
@@ -5777,10 +5835,10 @@ function dc(e, t) {
|
|
|
5777
5835
|
let i = n[n.length - 1];
|
|
5778
5836
|
return r == null || !(i in r) ? !1 : (Array.isArray(r) && /^\d+$/.test(i) ? r.splice(Number(i), 1) : delete r[i], !0);
|
|
5779
5837
|
}
|
|
5780
|
-
function
|
|
5838
|
+
function hc(e) {
|
|
5781
5839
|
return e === void 0 ? void 0 : JSON.parse(JSON.stringify(e));
|
|
5782
5840
|
}
|
|
5783
|
-
function
|
|
5841
|
+
function gc(e) {
|
|
5784
5842
|
if (typeof e != "string") return { parsed: e };
|
|
5785
5843
|
let t = e.trim();
|
|
5786
5844
|
if (!t) return { parsed: e };
|
|
@@ -5791,20 +5849,20 @@ function pc(e) {
|
|
|
5791
5849
|
return n ? { parseError: t } : { parsed: e };
|
|
5792
5850
|
}
|
|
5793
5851
|
}
|
|
5794
|
-
function
|
|
5852
|
+
function _c(e, t) {
|
|
5795
5853
|
if (typeof e != "object" || !e) return e;
|
|
5796
5854
|
let n = new Set(t);
|
|
5797
|
-
if (Array.isArray(e)) return e.map((e) =>
|
|
5855
|
+
if (Array.isArray(e)) return e.map((e) => _c(e, t));
|
|
5798
5856
|
let r = {};
|
|
5799
5857
|
for (let t of Object.keys(e)) n.has(t) && (r[t] = e[t]);
|
|
5800
5858
|
return r;
|
|
5801
5859
|
}
|
|
5802
|
-
function
|
|
5860
|
+
function vc(e, t) {
|
|
5803
5861
|
if (typeof e != "object" || !e) return e;
|
|
5804
5862
|
if (t <= 0) return Array.isArray(e) ? `[...${e.length}]` : "{...}";
|
|
5805
|
-
if (Array.isArray(e)) return e.map((e) =>
|
|
5863
|
+
if (Array.isArray(e)) return e.map((e) => vc(e, t - 1));
|
|
5806
5864
|
let n = {};
|
|
5807
|
-
for (let r of Object.keys(e)) n[r] =
|
|
5865
|
+
for (let r of Object.keys(e)) n[r] = vc(e[r], t - 1);
|
|
5808
5866
|
return n;
|
|
5809
5867
|
}
|
|
5810
5868
|
function Q(e, t = Infinity) {
|
|
@@ -5826,7 +5884,7 @@ function Q(e, t = Infinity) {
|
|
|
5826
5884
|
}
|
|
5827
5885
|
return r.length > t && (r = r.slice(0, t) + `\n…[已截断,原长度 ${r.length}]`), r;
|
|
5828
5886
|
}
|
|
5829
|
-
function
|
|
5887
|
+
function yc(e, t = 0) {
|
|
5830
5888
|
let n = 3735928559 ^ t, r = 1103547991 ^ t;
|
|
5831
5889
|
for (let t = 0; t < e.length; t++) {
|
|
5832
5890
|
let i = e.charCodeAt(t);
|
|
@@ -5835,31 +5893,31 @@ function gc(e, t = 0) {
|
|
|
5835
5893
|
return n = Math.imul(n ^ n >>> 16, 2246822507) ^ Math.imul(r ^ r >>> 13, 3266489909), r = Math.imul(r ^ r >>> 16, 2246822507) ^ Math.imul(n ^ n >>> 13, 3266489909), 4294967296 * (2097151 & r) + (n >>> 0);
|
|
5836
5894
|
}
|
|
5837
5895
|
function $(e) {
|
|
5838
|
-
return
|
|
5896
|
+
return yc(Q(e)).toString(36);
|
|
5839
5897
|
}
|
|
5840
|
-
function
|
|
5841
|
-
if (t === "set") return n ? (
|
|
5842
|
-
if (t === "remove") return n ? (
|
|
5898
|
+
function bc(e, t, n, r) {
|
|
5899
|
+
if (t === "set") return n ? (pc(e, n, r), null) : "set 操作需要 jsonPath(整体替换请用 set_data)";
|
|
5900
|
+
if (t === "remove") return n ? (mc(e, n), null) : "remove 操作需要 jsonPath";
|
|
5843
5901
|
if (t === "merge") {
|
|
5844
5902
|
let t = n ? Z(e, n) : e;
|
|
5845
|
-
return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (
|
|
5903
|
+
return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (fc(t, r), null);
|
|
5846
5904
|
}
|
|
5847
5905
|
let i = n ? Z(e, n) : e;
|
|
5848
5906
|
return Array.isArray(i) ? (Array.isArray(r) ? i.push(...r) : i.push(r), null) : `append 目标${n ? `(${n})` : "(根)"}不是数组`;
|
|
5849
5907
|
}
|
|
5850
|
-
function
|
|
5851
|
-
if (t === "set")
|
|
5852
|
-
else if (t === "remove")
|
|
5853
|
-
else if (t === "merge")
|
|
5908
|
+
function xc(e, t, n, r) {
|
|
5909
|
+
if (t === "set") pc(e, n, r);
|
|
5910
|
+
else if (t === "remove") mc(e, n);
|
|
5911
|
+
else if (t === "merge") fc(n ? Z(e, n) : e, r);
|
|
5854
5912
|
else {
|
|
5855
5913
|
let t = n ? Z(e, n) : e;
|
|
5856
5914
|
Array.isArray(r) ? t.push(...r) : t.push(r);
|
|
5857
5915
|
}
|
|
5858
5916
|
}
|
|
5859
|
-
function
|
|
5860
|
-
typeof e == "object" && e &&
|
|
5917
|
+
function Sc(e, t) {
|
|
5918
|
+
typeof e == "object" && e && Cc(e, t);
|
|
5861
5919
|
}
|
|
5862
|
-
function
|
|
5920
|
+
function Cc(e, t) {
|
|
5863
5921
|
if (Array.isArray(e)) {
|
|
5864
5922
|
e.length = 0, Array.isArray(t) && e.push(...t);
|
|
5865
5923
|
return;
|
|
@@ -5868,7 +5926,7 @@ function bc(e, t) {
|
|
|
5868
5926
|
for (let t of Object.keys(e)) t in n || delete e[t];
|
|
5869
5927
|
for (let t of Object.keys(n)) e[t] = n[t];
|
|
5870
5928
|
}
|
|
5871
|
-
function
|
|
5929
|
+
function wc(e, t, n = "") {
|
|
5872
5930
|
let r = [];
|
|
5873
5931
|
if (!(typeof e == "object" && e) || !(typeof t == "object" && t) || Array.isArray(e) !== Array.isArray(t)) return e !== t && r.push({
|
|
5874
5932
|
path: n || "(root)",
|
|
@@ -5887,14 +5945,14 @@ function xc(e, t, n = "") {
|
|
|
5887
5945
|
path: i,
|
|
5888
5946
|
from: e[a],
|
|
5889
5947
|
to: void 0
|
|
5890
|
-
}) : r.push(...
|
|
5948
|
+
}) : r.push(...wc(e[a], t[a], i));
|
|
5891
5949
|
}
|
|
5892
5950
|
return r;
|
|
5893
5951
|
}
|
|
5894
5952
|
let i = e, a = t, o = /* @__PURE__ */ new Set([...Object.keys(i), ...Object.keys(a)]);
|
|
5895
5953
|
for (let e of o) {
|
|
5896
5954
|
let t = n ? `${n}.${e}` : e;
|
|
5897
|
-
e in i ? e in a ? r.push(...
|
|
5955
|
+
e in i ? e in a ? r.push(...wc(i[e], a[e], t)) : r.push({
|
|
5898
5956
|
path: t,
|
|
5899
5957
|
from: i[e],
|
|
5900
5958
|
to: void 0
|
|
@@ -5906,48 +5964,48 @@ function xc(e, t, n = "") {
|
|
|
5906
5964
|
}
|
|
5907
5965
|
return r;
|
|
5908
5966
|
}
|
|
5909
|
-
var
|
|
5967
|
+
var Tc = {
|
|
5910
5968
|
largeResults: 4 * 1024 * 1024,
|
|
5911
5969
|
drafts: 2 * 1024 * 1024,
|
|
5912
5970
|
userFiles: 2 * 1024 * 1024,
|
|
5913
5971
|
resources: 4 * 1024 * 1024
|
|
5914
|
-
},
|
|
5972
|
+
}, Ec = [
|
|
5915
5973
|
"largeResults",
|
|
5916
5974
|
"drafts",
|
|
5917
5975
|
"userFiles",
|
|
5918
5976
|
"resources"
|
|
5919
|
-
],
|
|
5920
|
-
function
|
|
5977
|
+
], Dc = .9;
|
|
5978
|
+
function Oc(e, t = {}) {
|
|
5921
5979
|
let n = Object.create(null);
|
|
5922
|
-
if (e) for (let [t, r] of Object.entries(e)) n[
|
|
5980
|
+
if (e) for (let [t, r] of Object.entries(e)) n[Mc(t)] = {
|
|
5923
5981
|
content: r,
|
|
5924
|
-
updatedAt:
|
|
5982
|
+
updatedAt: Pc()
|
|
5925
5983
|
};
|
|
5926
5984
|
let { persist: r } = t, i = t.maxBytes ?? 8388608, a = {
|
|
5927
|
-
...
|
|
5985
|
+
...Tc,
|
|
5928
5986
|
...t.poolBytes ?? {}
|
|
5929
5987
|
};
|
|
5930
5988
|
function o(e) {
|
|
5931
|
-
let t =
|
|
5989
|
+
let t = Mc(e);
|
|
5932
5990
|
return t.startsWith("large_results/") ? "largeResults" : t.startsWith("drafts/") ? "drafts" : t.startsWith("resources/") ? "resources" : "userFiles";
|
|
5933
5991
|
}
|
|
5934
5992
|
function s(e) {
|
|
5935
5993
|
let t = 0;
|
|
5936
|
-
for (let [r, i] of Object.entries(n)) o(r) === e && (t +=
|
|
5994
|
+
for (let [r, i] of Object.entries(n)) o(r) === e && (t += Ac(i.content));
|
|
5937
5995
|
return t;
|
|
5938
5996
|
}
|
|
5939
5997
|
function c() {
|
|
5940
|
-
for (let e of
|
|
5998
|
+
for (let e of Ec) {
|
|
5941
5999
|
let t = a[e];
|
|
5942
6000
|
if (s(e) <= t) continue;
|
|
5943
|
-
let r = t *
|
|
6001
|
+
let r = t * Dc, i = e === "largeResults", c = i && s(e) > t * 1.5;
|
|
5944
6002
|
c && console.warn(`[page-agent-sdk] vfs large_results 池 ${s(e)} > ${Math.round(t * 1.5)}(被引用撑爆)→ 无视 protectedRefs 强制删`);
|
|
5945
6003
|
let l = Object.entries(n).filter(([t]) => o(t) === e).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
|
|
5946
6004
|
for (let [t] of l) if (!(i && !c && u.has(t)) && (delete n[t], s(e) <= r)) break;
|
|
5947
6005
|
}
|
|
5948
|
-
if (
|
|
5949
|
-
let e = i *
|
|
5950
|
-
for (let [i] of r) if (!(o(i) === "largeResults" && !t && u.has(i)) && (delete n[i],
|
|
6006
|
+
if (jc(n) > i) {
|
|
6007
|
+
let e = i * Dc, t = jc(n) > i * 1.5, r = Object.entries(n).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
|
|
6008
|
+
for (let [i] of r) if (!(o(i) === "largeResults" && !t && u.has(i)) && (delete n[i], jc(n) <= e)) break;
|
|
5951
6009
|
}
|
|
5952
6010
|
}
|
|
5953
6011
|
let l = !0, u = /* @__PURE__ */ new Set(), d = null;
|
|
@@ -5983,7 +6041,7 @@ function Tc(e, t = {}) {
|
|
|
5983
6041
|
}
|
|
5984
6042
|
};
|
|
5985
6043
|
return r && (m.hydrate = (e) => {
|
|
5986
|
-
for (let [t, r] of Object.entries(e)) n[
|
|
6044
|
+
for (let [t, r] of Object.entries(e)) n[Mc(t)] = r;
|
|
5987
6045
|
c(), l = !0;
|
|
5988
6046
|
}, m.flush = () => {
|
|
5989
6047
|
d &&= (clearTimeout(d), null), f();
|
|
@@ -5992,19 +6050,19 @@ function Tc(e, t = {}) {
|
|
|
5992
6050
|
p(), l = !0;
|
|
5993
6051
|
}), m;
|
|
5994
6052
|
}
|
|
5995
|
-
var
|
|
5996
|
-
function
|
|
5997
|
-
return
|
|
6053
|
+
var kc = null;
|
|
6054
|
+
function Ac(e) {
|
|
6055
|
+
return kc ||= new TextEncoder(), kc.encode(e).length;
|
|
5998
6056
|
}
|
|
5999
|
-
function
|
|
6057
|
+
function jc(e) {
|
|
6000
6058
|
let t = 0;
|
|
6001
|
-
for (let n of Object.values(e)) t +=
|
|
6059
|
+
for (let n of Object.values(e)) t += Ac(n.content);
|
|
6002
6060
|
return t;
|
|
6003
6061
|
}
|
|
6004
|
-
function
|
|
6062
|
+
function Mc(e) {
|
|
6005
6063
|
return e.replace(/^\/+/, "").replace(/\/+/g, "/");
|
|
6006
6064
|
}
|
|
6007
|
-
function
|
|
6065
|
+
function Nc(e) {
|
|
6008
6066
|
let t = "";
|
|
6009
6067
|
for (let n = 0; n < e.length; n++) {
|
|
6010
6068
|
let r = e[n];
|
|
@@ -6012,10 +6070,10 @@ function Ac(e) {
|
|
|
6012
6070
|
}
|
|
6013
6071
|
return RegExp("^" + t + "$");
|
|
6014
6072
|
}
|
|
6015
|
-
function
|
|
6073
|
+
function Pc() {
|
|
6016
6074
|
return Date.now();
|
|
6017
6075
|
}
|
|
6018
|
-
var
|
|
6076
|
+
var Fc = [
|
|
6019
6077
|
"vfs_read",
|
|
6020
6078
|
"vfs_write",
|
|
6021
6079
|
"vfs_edit",
|
|
@@ -6026,10 +6084,10 @@ var Mc = [
|
|
|
6026
6084
|
"vfs_json_patch",
|
|
6027
6085
|
"vfs_rm"
|
|
6028
6086
|
];
|
|
6029
|
-
function
|
|
6087
|
+
function Ic(e) {
|
|
6030
6088
|
return [
|
|
6031
6089
|
r(async ({ path: t, offset: n, limit: r }) => {
|
|
6032
|
-
let i = e.files[
|
|
6090
|
+
let i = e.files[Mc(t)];
|
|
6033
6091
|
if (!i) return Y({
|
|
6034
6092
|
code: "NOT_FOUND",
|
|
6035
6093
|
path: t,
|
|
@@ -6058,9 +6116,9 @@ function Nc(e) {
|
|
|
6058
6116
|
hint: "jsonString=true 要求 content 是合法 JSON;检查引号/逗号/括号配对;或省略 jsonString 写纯文本"
|
|
6059
6117
|
});
|
|
6060
6118
|
}
|
|
6061
|
-
return e.files[
|
|
6119
|
+
return e.files[Mc(t)] = {
|
|
6062
6120
|
content: n,
|
|
6063
|
-
updatedAt:
|
|
6121
|
+
updatedAt: Pc()
|
|
6064
6122
|
}, `已写入 ${t}(${n.length} 字符)${r ? "(JSON 校验通过)" : ""}`;
|
|
6065
6123
|
}, {
|
|
6066
6124
|
name: "vfs_write",
|
|
@@ -6072,7 +6130,7 @@ function Nc(e) {
|
|
|
6072
6130
|
})
|
|
6073
6131
|
}),
|
|
6074
6132
|
r(async ({ path: t, oldString: n, newString: r }) => {
|
|
6075
|
-
let i =
|
|
6133
|
+
let i = Mc(t), a = e.files[i];
|
|
6076
6134
|
if (!a) return Y({
|
|
6077
6135
|
code: "NOT_FOUND",
|
|
6078
6136
|
path: t,
|
|
@@ -6102,7 +6160,7 @@ function Nc(e) {
|
|
|
6102
6160
|
}
|
|
6103
6161
|
return e.files[i] = {
|
|
6104
6162
|
content: a.content.replace(n, r),
|
|
6105
|
-
updatedAt:
|
|
6163
|
+
updatedAt: Pc()
|
|
6106
6164
|
}, `已替换 ${t} 中 1 处。`;
|
|
6107
6165
|
}, {
|
|
6108
6166
|
name: "vfs_edit",
|
|
@@ -6124,7 +6182,7 @@ function Nc(e) {
|
|
|
6124
6182
|
r(async ({ pattern: t }) => {
|
|
6125
6183
|
let n;
|
|
6126
6184
|
try {
|
|
6127
|
-
n =
|
|
6185
|
+
n = Nc(t);
|
|
6128
6186
|
} catch (e) {
|
|
6129
6187
|
return Y({
|
|
6130
6188
|
code: "GLOB_INVALID",
|
|
@@ -6153,7 +6211,7 @@ function Nc(e) {
|
|
|
6153
6211
|
details: { pattern: t }
|
|
6154
6212
|
});
|
|
6155
6213
|
}
|
|
6156
|
-
let i = n ? [
|
|
6214
|
+
let i = n ? [Mc(n)] : Object.keys(e.files), a = [];
|
|
6157
6215
|
for (let t of i) {
|
|
6158
6216
|
let n = e.files[t];
|
|
6159
6217
|
n && n.content.split("\n").forEach((e, n) => {
|
|
@@ -6170,7 +6228,7 @@ function Nc(e) {
|
|
|
6170
6228
|
})
|
|
6171
6229
|
}),
|
|
6172
6230
|
r(async ({ path: t, jsonPath: n }) => {
|
|
6173
|
-
let r =
|
|
6231
|
+
let r = Mc(t), i = e.files[r];
|
|
6174
6232
|
if (!i) return Y({
|
|
6175
6233
|
code: "NOT_FOUND",
|
|
6176
6234
|
path: t,
|
|
@@ -6207,7 +6265,7 @@ function Nc(e) {
|
|
|
6207
6265
|
})
|
|
6208
6266
|
}),
|
|
6209
6267
|
r(async ({ path: t, patches: n }) => {
|
|
6210
|
-
let r =
|
|
6268
|
+
let r = Mc(t), i = e.files[r];
|
|
6211
6269
|
if (!i) return Y({
|
|
6212
6270
|
code: "NOT_FOUND",
|
|
6213
6271
|
path: t,
|
|
@@ -6225,9 +6283,9 @@ function Nc(e) {
|
|
|
6225
6283
|
hint: "vfs_json_patch 要求文件内容是合法 JSON"
|
|
6226
6284
|
});
|
|
6227
6285
|
}
|
|
6228
|
-
let o =
|
|
6286
|
+
let o = hc(a), s = [];
|
|
6229
6287
|
for (let e of n) {
|
|
6230
|
-
let n =
|
|
6288
|
+
let n = bc(o, e.op, e.jsonPath, e.value);
|
|
6231
6289
|
if (n) return Y({
|
|
6232
6290
|
code: "PATCH_FAILED",
|
|
6233
6291
|
path: t,
|
|
@@ -6240,7 +6298,7 @@ function Nc(e) {
|
|
|
6240
6298
|
let c = JSON.stringify(o);
|
|
6241
6299
|
return e.files[r] = {
|
|
6242
6300
|
content: c,
|
|
6243
|
-
updatedAt:
|
|
6301
|
+
updatedAt: Pc()
|
|
6244
6302
|
}, `已对 ${t} 应用 ${n.length} 个 patch(影响 ${s.length} 处:${s.join(", ")}),文件现 ${c.length} 字符`;
|
|
6245
6303
|
}, {
|
|
6246
6304
|
name: "vfs_json_patch",
|
|
@@ -6260,7 +6318,7 @@ function Nc(e) {
|
|
|
6260
6318
|
})
|
|
6261
6319
|
}),
|
|
6262
6320
|
r(async ({ path: t }) => {
|
|
6263
|
-
let n =
|
|
6321
|
+
let n = Mc(t);
|
|
6264
6322
|
return e.files[n] ? (delete e.files[n], `已删除 ${t}`) : Y({
|
|
6265
6323
|
code: "NOT_FOUND",
|
|
6266
6324
|
path: t,
|
|
@@ -6274,17 +6332,17 @@ function Nc(e) {
|
|
|
6274
6332
|
})
|
|
6275
6333
|
];
|
|
6276
6334
|
}
|
|
6277
|
-
function
|
|
6335
|
+
function Lc(e) {
|
|
6278
6336
|
return {
|
|
6279
6337
|
name: "vfs",
|
|
6280
|
-
tools:
|
|
6338
|
+
tools: Ic(e),
|
|
6281
6339
|
beforeAgent: () => ({ files: e.files })
|
|
6282
6340
|
};
|
|
6283
6341
|
}
|
|
6284
6342
|
//#endregion
|
|
6285
6343
|
//#region src/core/tools/dataSlotQuery.ts
|
|
6286
|
-
var
|
|
6287
|
-
function
|
|
6344
|
+
var Rc = /[\w$-]/;
|
|
6345
|
+
function zc(e) {
|
|
6288
6346
|
let t = [], n = e.trim(), r = +(n[0] === "$");
|
|
6289
6347
|
for (; r < n.length;) {
|
|
6290
6348
|
let e = n[r];
|
|
@@ -6295,7 +6353,7 @@ function Ic(e) {
|
|
|
6295
6353
|
continue;
|
|
6296
6354
|
}
|
|
6297
6355
|
let e = "";
|
|
6298
|
-
for (; r < n.length &&
|
|
6356
|
+
for (; r < n.length && Rc.test(n[r]);) e += n[r++];
|
|
6299
6357
|
if (!e) throw Error("JSONPath: .. 后缺属性名");
|
|
6300
6358
|
t.push({
|
|
6301
6359
|
type: "descendKey",
|
|
@@ -6308,7 +6366,7 @@ function Ic(e) {
|
|
|
6308
6366
|
continue;
|
|
6309
6367
|
}
|
|
6310
6368
|
let e = "";
|
|
6311
|
-
for (; r < n.length &&
|
|
6369
|
+
for (; r < n.length && Rc.test(n[r]);) e += n[r++];
|
|
6312
6370
|
if (!e) throw Error("JSONPath: . 后缺属性名");
|
|
6313
6371
|
t.push({
|
|
6314
6372
|
type: "key",
|
|
@@ -6364,7 +6422,7 @@ function Ic(e) {
|
|
|
6364
6422
|
}
|
|
6365
6423
|
return t;
|
|
6366
6424
|
}
|
|
6367
|
-
function
|
|
6425
|
+
function Bc(e) {
|
|
6368
6426
|
let t = [], n = 0, r = e.trim();
|
|
6369
6427
|
for (; n < r.length;) {
|
|
6370
6428
|
let e = r[n];
|
|
@@ -6409,7 +6467,7 @@ function Lc(e) {
|
|
|
6409
6467
|
}
|
|
6410
6468
|
return t;
|
|
6411
6469
|
}
|
|
6412
|
-
var
|
|
6470
|
+
var Vc = class {
|
|
6413
6471
|
toks;
|
|
6414
6472
|
item;
|
|
6415
6473
|
pos = 0;
|
|
@@ -6445,12 +6503,12 @@ var Rc = class {
|
|
|
6445
6503
|
return this.next(), e;
|
|
6446
6504
|
}
|
|
6447
6505
|
let e = this.operand(), t = this.peek();
|
|
6448
|
-
return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(),
|
|
6506
|
+
return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), Wc(t, e, this.operand())) : Hc(e);
|
|
6449
6507
|
}
|
|
6450
6508
|
operand() {
|
|
6451
6509
|
let e = this.next();
|
|
6452
6510
|
if (e === void 0) throw Error("过滤表达式:缺操作数");
|
|
6453
|
-
if (e.startsWith("@")) return
|
|
6511
|
+
if (e.startsWith("@")) return Uc(e, this.item);
|
|
6454
6512
|
if (e[0] === "'" || e[0] === "\"") return e.slice(1, -1);
|
|
6455
6513
|
if (e === "true") return !0;
|
|
6456
6514
|
if (e === "false") return !1;
|
|
@@ -6460,10 +6518,10 @@ var Rc = class {
|
|
|
6460
6518
|
throw Error(`过滤表达式:未知操作数 '${e}'`);
|
|
6461
6519
|
}
|
|
6462
6520
|
};
|
|
6463
|
-
function
|
|
6521
|
+
function Hc(e) {
|
|
6464
6522
|
return !!e && e !== 0 && e !== "" && e !== null;
|
|
6465
6523
|
}
|
|
6466
|
-
function
|
|
6524
|
+
function Uc(e, t) {
|
|
6467
6525
|
let n = e.split(".").filter((e) => e && e !== "@"), r = t;
|
|
6468
6526
|
for (let e of n) {
|
|
6469
6527
|
if (typeof r != "object" || !r) return;
|
|
@@ -6471,7 +6529,7 @@ function Bc(e, t) {
|
|
|
6471
6529
|
}
|
|
6472
6530
|
return r;
|
|
6473
6531
|
}
|
|
6474
|
-
function
|
|
6532
|
+
function Wc(e, t, n) {
|
|
6475
6533
|
switch (e) {
|
|
6476
6534
|
case "==": return t === n;
|
|
6477
6535
|
case "!=": return t !== n;
|
|
@@ -6482,47 +6540,47 @@ function Vc(e, t, n) {
|
|
|
6482
6540
|
default: return !1;
|
|
6483
6541
|
}
|
|
6484
6542
|
}
|
|
6485
|
-
function
|
|
6486
|
-
return new
|
|
6543
|
+
function Gc(e, t) {
|
|
6544
|
+
return new Vc(Bc(e), t).parse();
|
|
6487
6545
|
}
|
|
6488
|
-
function
|
|
6546
|
+
function Kc(e, t) {
|
|
6489
6547
|
return e ? `${e}.${t}` : String(t);
|
|
6490
6548
|
}
|
|
6491
|
-
function
|
|
6549
|
+
function qc(e, t) {
|
|
6492
6550
|
let n = [{
|
|
6493
6551
|
path: "",
|
|
6494
6552
|
value: e
|
|
6495
6553
|
}];
|
|
6496
|
-
for (let e of
|
|
6554
|
+
for (let e of zc(t)) {
|
|
6497
6555
|
let t = [];
|
|
6498
6556
|
if (e.type === "key") for (let r of n) r.value != null && typeof r.value == "object" && e.key in r.value && t.push({
|
|
6499
|
-
path:
|
|
6557
|
+
path: Kc(r.path, e.key),
|
|
6500
6558
|
value: r.value[e.key]
|
|
6501
6559
|
});
|
|
6502
6560
|
else if (e.type === "index") {
|
|
6503
6561
|
for (let r of n) if (Array.isArray(r.value)) {
|
|
6504
6562
|
let n = r.value[e.index];
|
|
6505
6563
|
e.index >= 0 && e.index < r.value.length && t.push({
|
|
6506
|
-
path:
|
|
6564
|
+
path: Kc(r.path, e.index),
|
|
6507
6565
|
value: n,
|
|
6508
6566
|
index: e.index
|
|
6509
6567
|
});
|
|
6510
6568
|
}
|
|
6511
6569
|
} else if (e.type === "wildcard") {
|
|
6512
6570
|
for (let e of n) if (Array.isArray(e.value)) e.value.forEach((n, r) => t.push({
|
|
6513
|
-
path:
|
|
6571
|
+
path: Kc(e.path, r),
|
|
6514
6572
|
value: n,
|
|
6515
6573
|
index: r
|
|
6516
6574
|
}));
|
|
6517
6575
|
else if (e.value != null && typeof e.value == "object") for (let n of Object.keys(e.value)) t.push({
|
|
6518
|
-
path:
|
|
6576
|
+
path: Kc(e.path, n),
|
|
6519
6577
|
value: e.value[n]
|
|
6520
6578
|
});
|
|
6521
6579
|
} else if (e.type === "descendKey") {
|
|
6522
6580
|
let r = e.key, i = (e) => {
|
|
6523
6581
|
if (!(e.value == null || typeof e.value != "object")) for (let n of Object.keys(e.value)) {
|
|
6524
6582
|
let a = {
|
|
6525
|
-
path:
|
|
6583
|
+
path: Kc(e.path, n),
|
|
6526
6584
|
value: e.value[n]
|
|
6527
6585
|
};
|
|
6528
6586
|
n === r && t.push(a), i(a);
|
|
@@ -6533,7 +6591,7 @@ function Wc(e, t) {
|
|
|
6533
6591
|
let e = (n) => {
|
|
6534
6592
|
if (!(n.value == null || typeof n.value != "object")) for (let r of Object.keys(n.value)) {
|
|
6535
6593
|
let i = {
|
|
6536
|
-
path:
|
|
6594
|
+
path: Kc(n.path, r),
|
|
6537
6595
|
value: n.value[r]
|
|
6538
6596
|
};
|
|
6539
6597
|
t.push(i), e(i);
|
|
@@ -6542,16 +6600,16 @@ function Wc(e, t) {
|
|
|
6542
6600
|
for (let t of n) e(t);
|
|
6543
6601
|
} else if (e.type === "filter") {
|
|
6544
6602
|
for (let r of n) if (Array.isArray(r.value)) r.value.forEach((n, i) => {
|
|
6545
|
-
|
|
6546
|
-
path:
|
|
6603
|
+
Gc(e.filter, n) && t.push({
|
|
6604
|
+
path: Kc(r.path, i),
|
|
6547
6605
|
value: n,
|
|
6548
6606
|
index: i
|
|
6549
6607
|
});
|
|
6550
6608
|
});
|
|
6551
6609
|
else if (r.value != null && typeof r.value == "object") for (let n of Object.keys(r.value)) {
|
|
6552
6610
|
let i = r.value[n];
|
|
6553
|
-
|
|
6554
|
-
path:
|
|
6611
|
+
Gc(e.filter, i) && t.push({
|
|
6612
|
+
path: Kc(r.path, n),
|
|
6555
6613
|
value: i
|
|
6556
6614
|
});
|
|
6557
6615
|
}
|
|
@@ -6560,7 +6618,7 @@ function Wc(e, t) {
|
|
|
6560
6618
|
}
|
|
6561
6619
|
return n;
|
|
6562
6620
|
}
|
|
6563
|
-
function
|
|
6621
|
+
function Jc(e, t) {
|
|
6564
6622
|
let n = e.length, r = t.length;
|
|
6565
6623
|
if (!n) return r;
|
|
6566
6624
|
if (!r) return n;
|
|
@@ -6576,7 +6634,7 @@ function Gc(e, t) {
|
|
|
6576
6634
|
}
|
|
6577
6635
|
return i[r];
|
|
6578
6636
|
}
|
|
6579
|
-
function
|
|
6637
|
+
function Yc(e, t, n = {}) {
|
|
6580
6638
|
let r = n.mode || "substring", i = n.limit ?? 50, a = n.matchKey !== !1, o = [], s = null;
|
|
6581
6639
|
if (r === "regex") try {
|
|
6582
6640
|
s = new RegExp(t, "i");
|
|
@@ -6586,11 +6644,11 @@ function Kc(e, t, n = {}) {
|
|
|
6586
6644
|
let c = (e, l, u) => {
|
|
6587
6645
|
if (o.length >= i || e == null) return;
|
|
6588
6646
|
if (typeof e == "object") {
|
|
6589
|
-
if (Array.isArray(e)) e.forEach((e, t) => c(e,
|
|
6590
|
-
else for (let t of Object.keys(e)) c(e[t],
|
|
6647
|
+
if (Array.isArray(e)) e.forEach((e, t) => c(e, Kc(l, t), String(t)));
|
|
6648
|
+
else for (let t of Object.keys(e)) c(e[t], Kc(l, t), t);
|
|
6591
6649
|
return;
|
|
6592
6650
|
}
|
|
6593
|
-
let d = String(e), f =
|
|
6651
|
+
let d = String(e), f = Xc(d, t, r, n.fuzzyThreshold ?? 2, s);
|
|
6594
6652
|
if (f) {
|
|
6595
6653
|
o.push({
|
|
6596
6654
|
path: l,
|
|
@@ -6601,7 +6659,7 @@ function Kc(e, t, n = {}) {
|
|
|
6601
6659
|
return;
|
|
6602
6660
|
}
|
|
6603
6661
|
if (a && u) {
|
|
6604
|
-
let e =
|
|
6662
|
+
let e = Xc(u, t, r, n.fuzzyThreshold ?? 2, s);
|
|
6605
6663
|
e && o.push({
|
|
6606
6664
|
path: l,
|
|
6607
6665
|
key: u,
|
|
@@ -6612,51 +6670,51 @@ function Kc(e, t, n = {}) {
|
|
|
6612
6670
|
};
|
|
6613
6671
|
return c(e, ""), o;
|
|
6614
6672
|
}
|
|
6615
|
-
function
|
|
6673
|
+
function Xc(e, t, n, r, i) {
|
|
6616
6674
|
let a = e.toLowerCase(), o = t.toLowerCase();
|
|
6617
6675
|
if (n === "substring") return a.includes(o) ? 1 : null;
|
|
6618
6676
|
if (n === "regex") return i && i.test(e) ? 1 : null;
|
|
6619
6677
|
if (n === "fuzzy") {
|
|
6620
6678
|
if (a.includes(o)) return 2;
|
|
6621
|
-
let e =
|
|
6679
|
+
let e = Jc(a, o);
|
|
6622
6680
|
return e <= r ? r - e + 1 : null;
|
|
6623
6681
|
}
|
|
6624
6682
|
return null;
|
|
6625
6683
|
}
|
|
6626
|
-
function
|
|
6684
|
+
function Zc(e, t, n = 3e3) {
|
|
6627
6685
|
return ba(t, n)(e);
|
|
6628
6686
|
}
|
|
6629
6687
|
//#endregion
|
|
6630
6688
|
//#region src/core/tools/resources.ts
|
|
6631
|
-
var
|
|
6632
|
-
function
|
|
6633
|
-
return `${
|
|
6689
|
+
var Qc = "⟦frozen:", $c = "⟦res:", el = "⟧";
|
|
6690
|
+
function tl(e) {
|
|
6691
|
+
return `${Qc}${e}${el}`;
|
|
6634
6692
|
}
|
|
6635
|
-
function
|
|
6636
|
-
return `${
|
|
6693
|
+
function nl(e) {
|
|
6694
|
+
return `${$c}${e}${el}`;
|
|
6637
6695
|
}
|
|
6638
|
-
function
|
|
6639
|
-
return typeof e == "string" ? e.startsWith(
|
|
6696
|
+
function rl(e) {
|
|
6697
|
+
return typeof e == "string" ? e.startsWith(Qc) && e.endsWith(el) ? {
|
|
6640
6698
|
type: "frozen",
|
|
6641
6699
|
path: e.slice(8, e.length - 1)
|
|
6642
|
-
} : e.startsWith(
|
|
6700
|
+
} : e.startsWith($c) && e.endsWith(el) ? {
|
|
6643
6701
|
type: "res",
|
|
6644
6702
|
handle: e.slice(5, e.length - 1)
|
|
6645
6703
|
} : null : null;
|
|
6646
6704
|
}
|
|
6647
|
-
function
|
|
6705
|
+
function il(e) {
|
|
6648
6706
|
return String(e ?? "").trim().replace(/^\.+/, "");
|
|
6649
6707
|
}
|
|
6650
|
-
function
|
|
6708
|
+
function al(e) {
|
|
6651
6709
|
let t = 5381;
|
|
6652
6710
|
for (let n = 0; n < e.length; n++) t = (t * 33 ^ e.charCodeAt(n)) >>> 0;
|
|
6653
6711
|
return (t >>> 0).toString(16).padStart(8, "0").slice(0, 8);
|
|
6654
6712
|
}
|
|
6655
|
-
function
|
|
6713
|
+
function ol(e, t) {
|
|
6656
6714
|
return e === t ? !0 : e && t && typeof e == "object" && typeof t == "object" ? JSON.stringify(e) === JSON.stringify(t) : !1;
|
|
6657
6715
|
}
|
|
6658
|
-
function
|
|
6659
|
-
let n =
|
|
6716
|
+
function sl(e, t) {
|
|
6717
|
+
let n = il(e);
|
|
6660
6718
|
if (!n) return;
|
|
6661
6719
|
let r = t.get(n);
|
|
6662
6720
|
if (r) return {
|
|
@@ -6676,7 +6734,7 @@ function il(e, t) {
|
|
|
6676
6734
|
}));
|
|
6677
6735
|
return i;
|
|
6678
6736
|
}
|
|
6679
|
-
var
|
|
6737
|
+
var cl = class {
|
|
6680
6738
|
vfs;
|
|
6681
6739
|
constructor(e) {
|
|
6682
6740
|
this.vfs = e;
|
|
@@ -6685,7 +6743,7 @@ var al = class {
|
|
|
6685
6743
|
return `resources/${e}.json`;
|
|
6686
6744
|
}
|
|
6687
6745
|
ensure(e, t, n) {
|
|
6688
|
-
let r =
|
|
6746
|
+
let r = al(e), i = {
|
|
6689
6747
|
path: e,
|
|
6690
6748
|
mode: n,
|
|
6691
6749
|
value: t,
|
|
@@ -6697,7 +6755,7 @@ var al = class {
|
|
|
6697
6755
|
}, r;
|
|
6698
6756
|
}
|
|
6699
6757
|
get(e) {
|
|
6700
|
-
return this.readEntry(this.key(e)) || this.readEntry(this.key(
|
|
6758
|
+
return this.readEntry(this.key(e)) || this.readEntry(this.key(al(e)));
|
|
6701
6759
|
}
|
|
6702
6760
|
readEntry(e) {
|
|
6703
6761
|
let t = this.vfs.files[e];
|
|
@@ -6713,7 +6771,7 @@ var al = class {
|
|
|
6713
6771
|
this.ensure(e, t, n?.mode ?? "verbatim");
|
|
6714
6772
|
}
|
|
6715
6773
|
delete(e) {
|
|
6716
|
-
let t = this.get(e)?.handle ??
|
|
6774
|
+
let t = this.get(e)?.handle ?? al(e), n = this.key(t), r = !!this.vfs.files[n];
|
|
6717
6775
|
return r && delete this.vfs.files[n], r;
|
|
6718
6776
|
}
|
|
6719
6777
|
list() {
|
|
@@ -6733,7 +6791,7 @@ var al = class {
|
|
|
6733
6791
|
for (let e of Object.keys(this.vfs.files)) e.startsWith("resources/") && delete this.vfs.files[e];
|
|
6734
6792
|
}
|
|
6735
6793
|
};
|
|
6736
|
-
function
|
|
6794
|
+
function ll(e) {
|
|
6737
6795
|
let { jp: t, resolved: n, resourcesByPath: r, resourceStore: i } = e;
|
|
6738
6796
|
if (!r.size) return n;
|
|
6739
6797
|
let a = !1;
|
|
@@ -6742,19 +6800,19 @@ function ol(e) {
|
|
|
6742
6800
|
break;
|
|
6743
6801
|
}
|
|
6744
6802
|
if (!a) return n;
|
|
6745
|
-
let o =
|
|
6803
|
+
let o = hc(n);
|
|
6746
6804
|
for (let [e, n] of r) {
|
|
6747
6805
|
if (t !== "" && e !== t && !e.startsWith(t + ".")) continue;
|
|
6748
6806
|
if (e === t) {
|
|
6749
6807
|
if (o === void 0) continue;
|
|
6750
|
-
return n.mode === "freeze" ?
|
|
6808
|
+
return n.mode === "freeze" ? tl(e) : i ? nl(i.ensure(e, o, "verbatim")) : o;
|
|
6751
6809
|
}
|
|
6752
6810
|
let r = t === "" ? e : e.slice(t.length + 1), a = Z(o, r);
|
|
6753
|
-
a !== void 0 && (n.mode === "freeze" ?
|
|
6811
|
+
a !== void 0 && (n.mode === "freeze" ? pc(o, r, tl(e)) : i && pc(o, r, nl(i.ensure(e, a, "verbatim"))));
|
|
6754
6812
|
}
|
|
6755
6813
|
return o;
|
|
6756
6814
|
}
|
|
6757
|
-
function
|
|
6815
|
+
function ul(e, t, n, r) {
|
|
6758
6816
|
if (!r) return {
|
|
6759
6817
|
code: "RESOURCE_NOT_FOUND",
|
|
6760
6818
|
message: `句柄 "${e}" 无法展开(资源池未启用)`,
|
|
@@ -6765,7 +6823,7 @@ function sl(e, t, n, r) {
|
|
|
6765
6823
|
code: "RESOURCE_NOT_FOUND",
|
|
6766
6824
|
message: `字段 "${t}" 在 bind 中已不存在,无法展开句柄 "${e}"`,
|
|
6767
6825
|
hint: "该字段可能已被删除或 restore 到不含此字段的快照;重新 read 确认当前结构"
|
|
6768
|
-
} :
|
|
6826
|
+
} : ol(i.value, n) ? { value: i.value } : (r.update(t, n), { value: n }) : n === void 0 ? {
|
|
6769
6827
|
code: "RESOURCE_NOT_FOUND",
|
|
6770
6828
|
message: `句柄 "${e}" 不存在(字段 "${t}" 可能未注册或已被删除)`,
|
|
6771
6829
|
hint: "重新 read 该字段触发懒注册"
|
|
@@ -6775,20 +6833,20 @@ function sl(e, t, n, r) {
|
|
|
6775
6833
|
hint: "重新 read 该字段触发懒注册重建句柄,再写回新句柄 ⟦res:<handle>⟧"
|
|
6776
6834
|
};
|
|
6777
6835
|
}
|
|
6778
|
-
function
|
|
6836
|
+
function dl(e, t) {
|
|
6779
6837
|
let n = t.getBind();
|
|
6780
6838
|
for (let [r, i] of t.resourcesByPath) {
|
|
6781
6839
|
let a = Z(n, r), o = Z(e, r);
|
|
6782
6840
|
if (o === void 0) {
|
|
6783
|
-
a !== void 0 &&
|
|
6841
|
+
a !== void 0 && pc(e, r, a);
|
|
6784
6842
|
continue;
|
|
6785
6843
|
}
|
|
6786
6844
|
if (i.mode === "freeze") {
|
|
6787
|
-
if (o ===
|
|
6788
|
-
|
|
6845
|
+
if (o === tl(r)) {
|
|
6846
|
+
pc(e, r, a);
|
|
6789
6847
|
continue;
|
|
6790
6848
|
}
|
|
6791
|
-
if (!
|
|
6849
|
+
if (!ol(o, a)) return {
|
|
6792
6850
|
ok: !1,
|
|
6793
6851
|
code: "FROZEN_FIELD",
|
|
6794
6852
|
path: r,
|
|
@@ -6796,11 +6854,11 @@ function cl(e, t) {
|
|
|
6796
6854
|
hint: "该字段由系统/集成方维护,LLM 不得改动。如需展示其值用 resource_get({path}) 取真值"
|
|
6797
6855
|
};
|
|
6798
6856
|
} else {
|
|
6799
|
-
let n =
|
|
6857
|
+
let n = rl(o);
|
|
6800
6858
|
if (n && n.type === "res") {
|
|
6801
|
-
let i =
|
|
6859
|
+
let i = ul(n.handle, r, a, t.resourceStore);
|
|
6802
6860
|
if ("value" in i) {
|
|
6803
|
-
|
|
6861
|
+
pc(e, r, i.value);
|
|
6804
6862
|
continue;
|
|
6805
6863
|
}
|
|
6806
6864
|
return {
|
|
@@ -6811,7 +6869,7 @@ function cl(e, t) {
|
|
|
6811
6869
|
hint: i.hint
|
|
6812
6870
|
};
|
|
6813
6871
|
}
|
|
6814
|
-
if (!
|
|
6872
|
+
if (!ol(o, a)) return {
|
|
6815
6873
|
ok: !1,
|
|
6816
6874
|
code: "VERBATIM_MISMATCH",
|
|
6817
6875
|
path: r,
|
|
@@ -6822,7 +6880,7 @@ function cl(e, t) {
|
|
|
6822
6880
|
}
|
|
6823
6881
|
return { ok: !0 };
|
|
6824
6882
|
}
|
|
6825
|
-
function
|
|
6883
|
+
function fl(e, t, n) {
|
|
6826
6884
|
let r = t === void 0 ? e.message : `patches[${t}]${n ? ` @ "${n}"` : ""}: ${e.message}`;
|
|
6827
6885
|
return Y({
|
|
6828
6886
|
code: e.code,
|
|
@@ -6835,28 +6893,28 @@ function ll(e, t, n) {
|
|
|
6835
6893
|
} }
|
|
6836
6894
|
});
|
|
6837
6895
|
}
|
|
6838
|
-
function
|
|
6896
|
+
function pl(e) {
|
|
6839
6897
|
let { value: t, ctx: n } = e;
|
|
6840
6898
|
if (!n || !n.resourcesByPath.size) return {
|
|
6841
6899
|
ok: !0,
|
|
6842
6900
|
value: t
|
|
6843
6901
|
};
|
|
6844
|
-
let r =
|
|
6902
|
+
let r = hc(t), i = dl(r, n);
|
|
6845
6903
|
return i.ok ? {
|
|
6846
6904
|
ok: !0,
|
|
6847
6905
|
value: r
|
|
6848
6906
|
} : {
|
|
6849
6907
|
ok: !1,
|
|
6850
|
-
error:
|
|
6908
|
+
error: fl(i)
|
|
6851
6909
|
};
|
|
6852
6910
|
}
|
|
6853
|
-
function
|
|
6911
|
+
function ml(e) {
|
|
6854
6912
|
let { patches: t, clone: n, ctx: r } = e;
|
|
6855
6913
|
if (!r || !r.resourcesByPath.size) return { ok: !0 };
|
|
6856
6914
|
for (let e = 0; e < t.length; e++) {
|
|
6857
6915
|
let n = t[e];
|
|
6858
6916
|
if (n.op === "remove") {
|
|
6859
|
-
let t =
|
|
6917
|
+
let t = sl(n.jsonPath || "", r.resourcesByPath);
|
|
6860
6918
|
if (t) {
|
|
6861
6919
|
let r = t.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED", i = t.spec.mode === "freeze" ? "冻结字段不可删。如需移除请联系集成方调整 data.resources 配置" : "verbatim 字段不可直接删;先 resource_delete({path}) 释放资源保护后再删";
|
|
6862
6920
|
return {
|
|
@@ -6875,27 +6933,27 @@ function dl(e) {
|
|
|
6875
6933
|
}
|
|
6876
6934
|
}
|
|
6877
6935
|
}
|
|
6878
|
-
let i =
|
|
6936
|
+
let i = dl(n, r);
|
|
6879
6937
|
if (!i.ok) {
|
|
6880
|
-
let e =
|
|
6938
|
+
let e = hl(i.path, t);
|
|
6881
6939
|
return {
|
|
6882
6940
|
ok: !1,
|
|
6883
|
-
error:
|
|
6941
|
+
error: fl(i, e >= 0 ? e : void 0, e >= 0 ? t[e].jsonPath : void 0)
|
|
6884
6942
|
};
|
|
6885
6943
|
}
|
|
6886
6944
|
return { ok: !0 };
|
|
6887
6945
|
}
|
|
6888
|
-
function
|
|
6889
|
-
let n =
|
|
6946
|
+
function hl(e, t) {
|
|
6947
|
+
let n = il(e);
|
|
6890
6948
|
for (let e = 0; e < t.length; e++) {
|
|
6891
|
-
let r =
|
|
6949
|
+
let r = il(t[e].jsonPath || "");
|
|
6892
6950
|
if (r && (r === n || n.startsWith(r + ".") || r.startsWith(n + "."))) return e;
|
|
6893
6951
|
}
|
|
6894
6952
|
return -1;
|
|
6895
6953
|
}
|
|
6896
6954
|
//#endregion
|
|
6897
6955
|
//#region src/core/tools/dataOps.ts
|
|
6898
|
-
var
|
|
6956
|
+
var gl = /* @__PURE__ */ new Set([
|
|
6899
6957
|
"describe_data",
|
|
6900
6958
|
"get_data",
|
|
6901
6959
|
"set_data",
|
|
@@ -6909,14 +6967,14 @@ var pl = /* @__PURE__ */ new Set([
|
|
|
6909
6967
|
"resource_update",
|
|
6910
6968
|
"resource_list",
|
|
6911
6969
|
"resource_delete"
|
|
6912
|
-
]),
|
|
6913
|
-
function
|
|
6914
|
-
return t === "advanced" ? e : t === "minimal" ? e.filter((e) =>
|
|
6970
|
+
]), _l = /* @__PURE__ */ new Set(["read", "write"]);
|
|
6971
|
+
function vl(e, t = "simple") {
|
|
6972
|
+
return t === "advanced" ? e : t === "minimal" ? e.filter((e) => _l.has(e.name)) : e.filter((e) => !gl.has(e.name));
|
|
6915
6973
|
}
|
|
6916
|
-
function
|
|
6974
|
+
function yl(e) {
|
|
6917
6975
|
let { bindRef: t, schema: n, allowKeys: r, snapshots: i, maxSnapshots: a, audit: o, dryRun: s, op: c = "set", protectedCtx: l } = e, u = e.value;
|
|
6918
6976
|
if (l) {
|
|
6919
|
-
let e =
|
|
6977
|
+
let e = pl({
|
|
6920
6978
|
value: u,
|
|
6921
6979
|
ctx: l
|
|
6922
6980
|
});
|
|
@@ -6944,14 +7002,14 @@ function gl(e) {
|
|
|
6944
7002
|
hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹(如 {value:\"x\"})或集成方通过 sdk.setData 替换 bind"
|
|
6945
7003
|
})
|
|
6946
7004
|
};
|
|
6947
|
-
let f =
|
|
7005
|
+
let f = hc(t), p = i.length ? i[i.length - 1].id + 1 : 1;
|
|
6948
7006
|
for (i.push({
|
|
6949
7007
|
id: p,
|
|
6950
7008
|
ts: Date.now(),
|
|
6951
7009
|
op: c,
|
|
6952
7010
|
value: f
|
|
6953
7011
|
}); i.length > a;) i.shift();
|
|
6954
|
-
return d.data !== null && typeof d.data == "object" && (r ?
|
|
7012
|
+
return d.data !== null && typeof d.data == "object" && (r ? fc(t, d.data) : Cc(t, d.data)), o({
|
|
6955
7013
|
op: c,
|
|
6956
7014
|
value: d.data,
|
|
6957
7015
|
timestamp: Date.now()
|
|
@@ -6961,11 +7019,11 @@ function gl(e) {
|
|
|
6961
7019
|
data: d.data
|
|
6962
7020
|
};
|
|
6963
7021
|
}
|
|
6964
|
-
function
|
|
6965
|
-
let { bindRef: t, patches: n, schema: r, allowKeys: i, snapshots: a, maxSnapshots: o, markDataDirty: s, schemaErrorMode: c = "zod", snapshotLabel: l, dryRun: u, protectedCtx: d } = e, f =
|
|
7022
|
+
function bl(e) {
|
|
7023
|
+
let { bindRef: t, patches: n, schema: r, allowKeys: i, snapshots: a, maxSnapshots: o, markDataDirty: s, schemaErrorMode: c = "zod", snapshotLabel: l, dryRun: u, protectedCtx: d } = e, f = hc(t), p = [];
|
|
6966
7024
|
for (let e = 0; e < n.length; e++) {
|
|
6967
7025
|
let t = n[e], a = t.jsonPath || "";
|
|
6968
|
-
if (
|
|
7026
|
+
if (dc(a)) return {
|
|
6969
7027
|
ok: !1,
|
|
6970
7028
|
error: Y({
|
|
6971
7029
|
code: "PATH_UNSAFE",
|
|
@@ -6991,14 +7049,14 @@ function _l(e) {
|
|
|
6991
7049
|
hint: `op 为 ${o} 时 value 必填;删除请用 op:'remove'`
|
|
6992
7050
|
})
|
|
6993
7051
|
};
|
|
6994
|
-
let n =
|
|
7052
|
+
let n = gc(t.value);
|
|
6995
7053
|
if (n.parseError) return {
|
|
6996
7054
|
ok: !1,
|
|
6997
7055
|
error: Gr(`patches[${e}]`, t.value, n.parseError)
|
|
6998
7056
|
};
|
|
6999
7057
|
s = n.parsed;
|
|
7000
7058
|
}
|
|
7001
|
-
let c =
|
|
7059
|
+
let c = bc(f, o, a, s);
|
|
7002
7060
|
if (c) return {
|
|
7003
7061
|
ok: !1,
|
|
7004
7062
|
error: Y({
|
|
@@ -7014,7 +7072,7 @@ function _l(e) {
|
|
|
7014
7072
|
});
|
|
7015
7073
|
}
|
|
7016
7074
|
if (d) {
|
|
7017
|
-
let e =
|
|
7075
|
+
let e = ml({
|
|
7018
7076
|
patches: n,
|
|
7019
7077
|
clone: f,
|
|
7020
7078
|
ctx: d
|
|
@@ -7044,21 +7102,21 @@ function _l(e) {
|
|
|
7044
7102
|
id: h,
|
|
7045
7103
|
ts: Date.now(),
|
|
7046
7104
|
op: "edit",
|
|
7047
|
-
value:
|
|
7105
|
+
value: hc(t),
|
|
7048
7106
|
...l ? { label: l } : {}
|
|
7049
7107
|
}); a.length > o;) a.shift();
|
|
7050
|
-
for (let e of p) e.op === "remove" &&
|
|
7051
|
-
return m.data !== null && typeof m.data == "object" && (i ?
|
|
7108
|
+
for (let e of p) e.op === "remove" && mc(t, e.jp);
|
|
7109
|
+
return m.data !== null && typeof m.data == "object" && (i ? fc(t, m.data) : Cc(t, m.data)), s?.(), {
|
|
7052
7110
|
ok: !0,
|
|
7053
7111
|
applied: p,
|
|
7054
7112
|
clone: f
|
|
7055
7113
|
};
|
|
7056
7114
|
}
|
|
7057
|
-
function
|
|
7058
|
-
let i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s = Mi(i), c = /* @__PURE__ */ new Map(), l = n.vfsStore ? new
|
|
7115
|
+
function xl(e, n = {}) {
|
|
7116
|
+
let i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s = Mi(i), c = /* @__PURE__ */ new Map(), l = n.vfsStore ? new cl(n.vfsStore) : void 0;
|
|
7059
7117
|
function u(e) {
|
|
7060
7118
|
if (c.clear(), e) for (let t of e) {
|
|
7061
|
-
let e =
|
|
7119
|
+
let e = il(t.path);
|
|
7062
7120
|
c.set(e, {
|
|
7063
7121
|
path: e,
|
|
7064
7122
|
mode: t.mode
|
|
@@ -7110,7 +7168,7 @@ function vl(e, n = {}) {
|
|
|
7110
7168
|
return e;
|
|
7111
7169
|
},
|
|
7112
7170
|
createResource: l ? (e, t) => {
|
|
7113
|
-
let n =
|
|
7171
|
+
let n = il(e), r = c.get(n), i = t === void 0 ? Z(a, n) : t;
|
|
7114
7172
|
return l.ensure(n, i, r?.mode ?? "verbatim");
|
|
7115
7173
|
} : void 0,
|
|
7116
7174
|
getResource: l ? (e) => {
|
|
@@ -7123,8 +7181,8 @@ function vl(e, n = {}) {
|
|
|
7123
7181
|
} : void 0;
|
|
7124
7182
|
} : void 0,
|
|
7125
7183
|
updateResource: l ? (e, t) => {
|
|
7126
|
-
let n =
|
|
7127
|
-
l.update(n, t),
|
|
7184
|
+
let n = il(e);
|
|
7185
|
+
l.update(n, t), pc(a, n, t), _();
|
|
7128
7186
|
} : void 0,
|
|
7129
7187
|
deleteResource: l ? (e) => l.delete(e) : void 0,
|
|
7130
7188
|
listResources: l ? () => l.list() : void 0
|
|
@@ -7132,7 +7190,7 @@ function vl(e, n = {}) {
|
|
|
7132
7190
|
n.onAudit?.(e);
|
|
7133
7191
|
};
|
|
7134
7192
|
function b(e, t) {
|
|
7135
|
-
let n =
|
|
7193
|
+
let n = hc(a), r = f.length ? f[f.length - 1].id + 1 : 1;
|
|
7136
7194
|
for (f.push({
|
|
7137
7195
|
id: r,
|
|
7138
7196
|
ts: Date.now(),
|
|
@@ -7163,7 +7221,7 @@ function vl(e, n = {}) {
|
|
|
7163
7221
|
if (o.action === "restore") {
|
|
7164
7222
|
if (!f.length) return `无历史快照可回退(本次为首次操作)。当前值:${Q(a, 400)} (hash=${i})。请重新 read 再改或选「强制覆盖」。`;
|
|
7165
7223
|
let e = f[f.length - 1];
|
|
7166
|
-
return
|
|
7224
|
+
return Sc(a, hc(e.value)), _(), `已回退主数据到历史快照 #${e.id}[${e.op}]。当前值:${Q(a, 400)} (hash=${$(a)})。请基于回退后的值重写或停止。`;
|
|
7167
7225
|
}
|
|
7168
7226
|
return null;
|
|
7169
7227
|
}
|
|
@@ -7173,7 +7231,7 @@ function vl(e, n = {}) {
|
|
|
7173
7231
|
schema: t.object({})
|
|
7174
7232
|
}), C = r(async ({ jsonPath: e }) => {
|
|
7175
7233
|
let t = e || "";
|
|
7176
|
-
if (
|
|
7234
|
+
if (dc(t)) return Y({
|
|
7177
7235
|
code: "PATH_UNSAFE",
|
|
7178
7236
|
message: `jsonPath "${t}" 含非法段(__proto__/constructor/prototype)`,
|
|
7179
7237
|
hint: "使用正常属性路径,如 components.0.text(数组索引用数字)"
|
|
@@ -7184,7 +7242,7 @@ function vl(e, n = {}) {
|
|
|
7184
7242
|
hint: "主数据仅暴露 schema 声明的字段;若需操作该字段,集成方需在 schema 中声明它"
|
|
7185
7243
|
});
|
|
7186
7244
|
let n = t ? Z(a, t) : a;
|
|
7187
|
-
t || (n = Li(n, s)), d && (n =
|
|
7245
|
+
t || (n = Li(n, s)), d && (n = ll({
|
|
7188
7246
|
jp: t,
|
|
7189
7247
|
resolved: n,
|
|
7190
7248
|
resourcesByPath: d.resourcesByPath,
|
|
@@ -7199,9 +7257,9 @@ function vl(e, n = {}) {
|
|
|
7199
7257
|
}), w = r(async ({ value: e, expectedHash: t }) => {
|
|
7200
7258
|
let n = await x("set", t || (h ? m : void 0));
|
|
7201
7259
|
if (n !== null) return n;
|
|
7202
|
-
let r =
|
|
7260
|
+
let r = gc(e);
|
|
7203
7261
|
if (r.parseError) return Gr("", e, r.parseError);
|
|
7204
|
-
let o =
|
|
7262
|
+
let o = yl({
|
|
7205
7263
|
bindRef: a,
|
|
7206
7264
|
value: r.parsed,
|
|
7207
7265
|
schema: i,
|
|
@@ -7228,7 +7286,7 @@ function vl(e, n = {}) {
|
|
|
7228
7286
|
hint: "顶层 op 或 patch.op 至少传一个"
|
|
7229
7287
|
});
|
|
7230
7288
|
let c = n || "";
|
|
7231
|
-
if (
|
|
7289
|
+
if (dc(c)) return Y({
|
|
7232
7290
|
code: "PATH_UNSAFE",
|
|
7233
7291
|
message: `jsonPath "${c}" 含非法段(__proto__/constructor/prototype)`,
|
|
7234
7292
|
hint: "使用正常的属性路径,如 components.0.text(数组索引用数字)"
|
|
@@ -7245,7 +7303,7 @@ function vl(e, n = {}) {
|
|
|
7245
7303
|
message: `edit 仅适用于对象/数组主数据,当前是 ${a === void 0 ? "undefined" : typeof a}`,
|
|
7246
7304
|
hint: "叶子(原始类型)请用 set_data 整体设置"
|
|
7247
7305
|
});
|
|
7248
|
-
let u =
|
|
7306
|
+
let u = bl({
|
|
7249
7307
|
bindRef: a,
|
|
7250
7308
|
patches: [{
|
|
7251
7309
|
op: t,
|
|
@@ -7298,7 +7356,7 @@ function vl(e, n = {}) {
|
|
|
7298
7356
|
message: "delete_data 需要 jsonPath 指定要删的子路径(主数据整体不可删,用 set_data 整体替换)",
|
|
7299
7357
|
hint: "如 jsonPath:\"components.0\" 删数组首项"
|
|
7300
7358
|
});
|
|
7301
|
-
if (
|
|
7359
|
+
if (dc(e)) return Y({
|
|
7302
7360
|
code: "PATH_UNSAFE",
|
|
7303
7361
|
message: `jsonPath "${e}" 含非法段`,
|
|
7304
7362
|
hint: "使用正常属性路径"
|
|
@@ -7309,7 +7367,7 @@ function vl(e, n = {}) {
|
|
|
7309
7367
|
hint: "仅 schema 声明的 key 可删"
|
|
7310
7368
|
});
|
|
7311
7369
|
if (d) {
|
|
7312
|
-
let t =
|
|
7370
|
+
let t = sl(e, d.resourcesByPath);
|
|
7313
7371
|
if (t) return Y({
|
|
7314
7372
|
code: t.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED",
|
|
7315
7373
|
message: `delete_data @ "${e}" 命中受保护字段 "${t.protectedPath}"(${t.spec.mode}),不可删除`,
|
|
@@ -7319,7 +7377,7 @@ function vl(e, n = {}) {
|
|
|
7319
7377
|
let n = await x("delete", t || (h ? m : void 0));
|
|
7320
7378
|
if (n !== null) return n;
|
|
7321
7379
|
b("delete");
|
|
7322
|
-
let r =
|
|
7380
|
+
let r = mc(a, e);
|
|
7323
7381
|
return _(), y({
|
|
7324
7382
|
op: "delete",
|
|
7325
7383
|
detail: e,
|
|
@@ -7345,7 +7403,7 @@ function vl(e, n = {}) {
|
|
|
7345
7403
|
hint: "用 history_data({list:true}) 查看可用快照序号"
|
|
7346
7404
|
});
|
|
7347
7405
|
let n = i.safeParse(t.value);
|
|
7348
|
-
return n.success ? (
|
|
7406
|
+
return n.success ? (Sc(a, hc(t.value)), _(), y({
|
|
7349
7407
|
op: "restore",
|
|
7350
7408
|
detail: `#${t.id}`,
|
|
7351
7409
|
timestamp: Date.now()
|
|
@@ -7379,9 +7437,9 @@ function vl(e, n = {}) {
|
|
|
7379
7437
|
message: `未找到快照 #${e}`,
|
|
7380
7438
|
hint: "不传 id 查看最近一次;或 history_data({list:true}) 查看可用序号"
|
|
7381
7439
|
});
|
|
7382
|
-
let a =
|
|
7440
|
+
let a = hc(r.value), o = t || "";
|
|
7383
7441
|
if (o) {
|
|
7384
|
-
if (
|
|
7442
|
+
if (dc(o)) return Y({
|
|
7385
7443
|
code: "PATH_UNSAFE",
|
|
7386
7444
|
message: `jsonPath "${o}" 含非法段`,
|
|
7387
7445
|
hint: "使用正常属性路径"
|
|
@@ -7412,7 +7470,7 @@ function vl(e, n = {}) {
|
|
|
7412
7470
|
});
|
|
7413
7471
|
let n = s ? Li(a, s) : a, r;
|
|
7414
7472
|
try {
|
|
7415
|
-
r =
|
|
7473
|
+
r = qc(n, e);
|
|
7416
7474
|
} catch (t) {
|
|
7417
7475
|
return Y({
|
|
7418
7476
|
code: "JSONPATH_SYNTAX",
|
|
@@ -7436,7 +7494,7 @@ function vl(e, n = {}) {
|
|
|
7436
7494
|
message: "主数据为空,无可搜索内容"
|
|
7437
7495
|
});
|
|
7438
7496
|
try {
|
|
7439
|
-
let o =
|
|
7497
|
+
let o = Yc(s ? Li(a, s) : a, e, {
|
|
7440
7498
|
mode: t,
|
|
7441
7499
|
fuzzyThreshold: n,
|
|
7442
7500
|
matchKey: r,
|
|
@@ -7486,7 +7544,7 @@ function vl(e, n = {}) {
|
|
|
7486
7544
|
e && (o = Ii(o, e));
|
|
7487
7545
|
}
|
|
7488
7546
|
} else o = s ? Li(a, s) : a;
|
|
7489
|
-
let c =
|
|
7547
|
+
let c = hc(o), l = await Zc(c, e, r && JSON.stringify(c).length > 1e5 ? 8e3 : 3e3);
|
|
7490
7548
|
if (!l.ok) {
|
|
7491
7549
|
let t = /超时/.test(l.error || "");
|
|
7492
7550
|
return Y({
|
|
@@ -7502,7 +7560,7 @@ function vl(e, n = {}) {
|
|
|
7502
7560
|
if (t === "transform") {
|
|
7503
7561
|
let e = l.result;
|
|
7504
7562
|
if (r) {
|
|
7505
|
-
let t =
|
|
7563
|
+
let t = bl({
|
|
7506
7564
|
bindRef: a,
|
|
7507
7565
|
patches: [{
|
|
7508
7566
|
op: "set",
|
|
@@ -7530,7 +7588,7 @@ function vl(e, n = {}) {
|
|
|
7530
7588
|
message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),eval transform(patches) 无法就地替换`,
|
|
7531
7589
|
hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
|
|
7532
7590
|
});
|
|
7533
|
-
let t =
|
|
7591
|
+
let t = bl({
|
|
7534
7592
|
bindRef: a,
|
|
7535
7593
|
patches: e.patches,
|
|
7536
7594
|
schema: i,
|
|
@@ -7550,7 +7608,7 @@ function vl(e, n = {}) {
|
|
|
7550
7608
|
}
|
|
7551
7609
|
let t = e;
|
|
7552
7610
|
if (d) {
|
|
7553
|
-
let e =
|
|
7611
|
+
let e = pl({
|
|
7554
7612
|
value: t,
|
|
7555
7613
|
ctx: d
|
|
7556
7614
|
});
|
|
@@ -7562,7 +7620,7 @@ function vl(e, n = {}) {
|
|
|
7562
7620
|
code: "LEAF_BIND",
|
|
7563
7621
|
message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),eval transform 无法就地替换外部持有的值引用`,
|
|
7564
7622
|
hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
|
|
7565
|
-
}) : (b("edit", "eval_transform"), n.data !== null && typeof n.data == "object" && (s ?
|
|
7623
|
+
}) : (b("edit", "eval_transform"), n.data !== null && typeof n.data == "object" && (s ? fc(a, n.data) : Cc(a, n.data)), _(), y({
|
|
7566
7624
|
op: "edit",
|
|
7567
7625
|
detail: "eval_transform",
|
|
7568
7626
|
timestamp: Date.now()
|
|
@@ -7599,7 +7657,7 @@ function vl(e, n = {}) {
|
|
|
7599
7657
|
e && (o = Ii(o, e));
|
|
7600
7658
|
}
|
|
7601
7659
|
let l = o;
|
|
7602
|
-
if (d && (l =
|
|
7660
|
+
if (d && (l = ll({
|
|
7603
7661
|
jp: t,
|
|
7604
7662
|
resolved: l,
|
|
7605
7663
|
resourcesByPath: d.resourcesByPath,
|
|
@@ -7609,12 +7667,12 @@ function vl(e, n = {}) {
|
|
|
7609
7667
|
} catch (e) {
|
|
7610
7668
|
return `- ${t}: [READ_INTERCEPT: ${e.message}]`;
|
|
7611
7669
|
}
|
|
7612
|
-
return r && r.length && (l =
|
|
7670
|
+
return r && r.length && (l = _c(l, r)), c != null && (l = vc(l, c)), l === void 0 ? `- ${t} = (undefined)` : `- ${t} = ${Q(l)}`;
|
|
7613
7671
|
});
|
|
7614
7672
|
return `多路径读取(共 ${t.length} 项,hash=${f}):\n${e.join("\n")}`;
|
|
7615
7673
|
}
|
|
7616
7674
|
let p = e || "";
|
|
7617
|
-
if (
|
|
7675
|
+
if (dc(p)) return Y({
|
|
7618
7676
|
code: "PATH_UNSAFE",
|
|
7619
7677
|
message: `jsonPath "${p}" 含非法段(__proto__/constructor/prototype)`,
|
|
7620
7678
|
hint: "使用正常属性路径,如 components.0.text(数组索引数字)"
|
|
@@ -7631,7 +7689,7 @@ function vl(e, n = {}) {
|
|
|
7631
7689
|
e && (h = Ii(h, e));
|
|
7632
7690
|
}
|
|
7633
7691
|
let g = h;
|
|
7634
|
-
if (d && (g =
|
|
7692
|
+
if (d && (g = ll({
|
|
7635
7693
|
jp: p,
|
|
7636
7694
|
resolved: g,
|
|
7637
7695
|
resourcesByPath: d.resourcesByPath,
|
|
@@ -7644,7 +7702,7 @@ function vl(e, n = {}) {
|
|
|
7644
7702
|
message: `read 拦截器抛错: ${e.message}`
|
|
7645
7703
|
});
|
|
7646
7704
|
}
|
|
7647
|
-
r && r.length && (g =
|
|
7705
|
+
r && r.length && (g = _c(g, r)), c != null && (g = vc(g, c));
|
|
7648
7706
|
let _ = e ? "" : `主数据说明: ${o}\n格式: 写入值需为 JSON,且通过声明的 schema 校验(校验失败时 write 会返回结构化错误)。字段约束(类型/min/max/enum/必填/默认)见 systemPrompt「可操作数据」段,或用 schema_data({ jsonPath }) 按需查。\n\n`, v = r && r.length ? `(字段裁剪:${r.join(",")})` : "", y = c == null ? "" : `(深度≤${c})`, b = v || y ? ` ${v}${y}` : "";
|
|
7649
7707
|
if ((l !== void 0 || u !== void 0) && Array.isArray(g)) {
|
|
7650
7708
|
let e = g.length, t = Math.max(0, l ?? 0), n = Math.min(200, Math.max(1, u ?? 50)), r = g.slice(t, t + n), i = t + n < e;
|
|
@@ -7706,7 +7764,7 @@ function vl(e, n = {}) {
|
|
|
7706
7764
|
message: "delete 需要 patch.jsonPath 指定要删的子路径(主数据整体不可删,用 write(value) 整体替换)",
|
|
7707
7765
|
hint: "如 patch:{jsonPath:\"components.0\"}, del:true"
|
|
7708
7766
|
});
|
|
7709
|
-
if (
|
|
7767
|
+
if (dc(t.jsonPath)) return Y({
|
|
7710
7768
|
code: "PATH_UNSAFE",
|
|
7711
7769
|
message: `jsonPath "${t.jsonPath}" 含非法段`,
|
|
7712
7770
|
hint: "使用正常属性路径"
|
|
@@ -7717,7 +7775,7 @@ function vl(e, n = {}) {
|
|
|
7717
7775
|
hint: "仅 schema 声明的 key 可删"
|
|
7718
7776
|
});
|
|
7719
7777
|
if (d) {
|
|
7720
|
-
let e =
|
|
7778
|
+
let e = sl(t.jsonPath, d.resourcesByPath);
|
|
7721
7779
|
if (e) return Y({
|
|
7722
7780
|
code: e.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED",
|
|
7723
7781
|
message: `write delete @ "${t.jsonPath}" 命中受保护字段 "${e.protectedPath}"(${e.spec.mode}),不可删除`,
|
|
@@ -7727,11 +7785,11 @@ function vl(e, n = {}) {
|
|
|
7727
7785
|
let e = await x("delete", v);
|
|
7728
7786
|
if (e !== null) return e;
|
|
7729
7787
|
if (c) {
|
|
7730
|
-
let e =
|
|
7731
|
-
return
|
|
7788
|
+
let e = hc(a);
|
|
7789
|
+
return mc(e, t.jsonPath) ? `dryRun(delete): 将删除 @ ${t.jsonPath}。预览剩余:${Q(e, 600)}。未实际写入、未入快照。` : `dryRun(delete): @ ${t.jsonPath} 不存在(无需删除)。未实际写入。`;
|
|
7732
7790
|
}
|
|
7733
7791
|
b("delete");
|
|
7734
|
-
let n =
|
|
7792
|
+
let n = mc(a, t.jsonPath);
|
|
7735
7793
|
return _(), y({
|
|
7736
7794
|
op: "delete",
|
|
7737
7795
|
detail: t.jsonPath,
|
|
@@ -7750,7 +7808,7 @@ function vl(e, n = {}) {
|
|
|
7750
7808
|
op: t.op ?? "set",
|
|
7751
7809
|
jsonPath: t.jsonPath || "",
|
|
7752
7810
|
value: u
|
|
7753
|
-
}]), o =
|
|
7811
|
+
}]), o = bl({
|
|
7754
7812
|
bindRef: a,
|
|
7755
7813
|
patches: n,
|
|
7756
7814
|
schema: i,
|
|
@@ -7769,11 +7827,11 @@ function vl(e, n = {}) {
|
|
|
7769
7827
|
timestamp: Date.now()
|
|
7770
7828
|
}), m = $(a), `已 write(edit) 主数据(${o.applied.length} 个 patch)。当前值:${Q(a, 600)} (新 hash=${$(a)})`) : o.error;
|
|
7771
7829
|
}
|
|
7772
|
-
let S =
|
|
7830
|
+
let S = gc(u);
|
|
7773
7831
|
if (S.parseError) return Gr("", u, S.parseError);
|
|
7774
7832
|
let C = await x("set", v);
|
|
7775
7833
|
if (C !== null) return C;
|
|
7776
|
-
let w =
|
|
7834
|
+
let w = yl({
|
|
7777
7835
|
bindRef: a,
|
|
7778
7836
|
value: S.parsed,
|
|
7779
7837
|
schema: i,
|
|
@@ -7830,7 +7888,7 @@ function vl(e, n = {}) {
|
|
|
7830
7888
|
if (n) {
|
|
7831
7889
|
let e = t;
|
|
7832
7890
|
if (typeof e == "string") {
|
|
7833
|
-
let t =
|
|
7891
|
+
let t = gc(e);
|
|
7834
7892
|
t.parseError || (e = t.parsed);
|
|
7835
7893
|
}
|
|
7836
7894
|
r = e, i = "against";
|
|
@@ -7848,7 +7906,7 @@ function vl(e, n = {}) {
|
|
|
7848
7906
|
});
|
|
7849
7907
|
r = t.value, i = `快照 #${t.id}`;
|
|
7850
7908
|
}
|
|
7851
|
-
let o = s ? Li(a, s) : a, c =
|
|
7909
|
+
let o = s ? Li(a, s) : a, c = wc(r, hc(o));
|
|
7852
7910
|
return c.length ? `差异(当前 vs ${i},共 ${c.length} 处):\n${c.map((e) => ` ${e.path}: ${Q(e.from)} → ${Q(e.to)}`).join("\n")}` : `无差异:当前主数据与 ${i} 完全相同。`;
|
|
7853
7911
|
}, {
|
|
7854
7912
|
name: "diff_data",
|
|
@@ -7900,7 +7958,7 @@ function vl(e, n = {}) {
|
|
|
7900
7958
|
}
|
|
7901
7959
|
let u = await x("set", n || (h ? m : void 0));
|
|
7902
7960
|
if (u !== null) return u;
|
|
7903
|
-
let g =
|
|
7961
|
+
let g = yl({
|
|
7904
7962
|
bindRef: a,
|
|
7905
7963
|
value: l,
|
|
7906
7964
|
schema: i,
|
|
@@ -7932,7 +7990,7 @@ function vl(e, n = {}) {
|
|
|
7932
7990
|
message: "未提供 path 或有效 handle",
|
|
7933
7991
|
hint: "传 path(受保护字段)或 handle(占位符 ⟦res:handle⟧ 里的句柄)"
|
|
7934
7992
|
});
|
|
7935
|
-
let r =
|
|
7993
|
+
let r = il(n);
|
|
7936
7994
|
if (!c.has(r)) return Y({
|
|
7937
7995
|
code: "RESOURCE_NOT_FOUND",
|
|
7938
7996
|
message: `"${n}" 不是受保护字段`,
|
|
@@ -7971,7 +8029,7 @@ function vl(e, n = {}) {
|
|
|
7971
8029
|
message: "resource_update 需要 path",
|
|
7972
8030
|
hint: "传要更新的 verbatim 受保护字段路径"
|
|
7973
8031
|
});
|
|
7974
|
-
let n =
|
|
8032
|
+
let n = il(e), r = c.get(n);
|
|
7975
8033
|
if (!r) return Y({
|
|
7976
8034
|
code: "RESOURCE_NOT_FOUND",
|
|
7977
8035
|
message: `"${e}" 不是受保护字段`,
|
|
@@ -7992,7 +8050,7 @@ function vl(e, n = {}) {
|
|
|
7992
8050
|
details: Ur(n.error.issues)
|
|
7993
8051
|
});
|
|
7994
8052
|
}
|
|
7995
|
-
l.update(n, t),
|
|
8053
|
+
l.update(n, t), pc(a, n, t), m = $(a), _();
|
|
7996
8054
|
let s = l.get(n)?.handle;
|
|
7997
8055
|
return `已更新 verbatim 资源 "${e}" = ${Q(t, 200)}(handle ${s ?? "(未知)"} 不变)。后续 write 该字段写回句柄 ⟦res:${s}⟧ 或新值`;
|
|
7998
8056
|
}, {
|
|
@@ -8053,8 +8111,8 @@ function vl(e, n = {}) {
|
|
|
8053
8111
|
}
|
|
8054
8112
|
//#endregion
|
|
8055
8113
|
//#region src/core/tools/fetchDoc.ts
|
|
8056
|
-
var
|
|
8057
|
-
let n = new AbortController(), r = setTimeout(() => n.abort(),
|
|
8114
|
+
var Sl = 3e4, Cl = [r(async ({ url: e, as: t }) => {
|
|
8115
|
+
let n = new AbortController(), r = setTimeout(() => n.abort(), Sl);
|
|
8058
8116
|
try {
|
|
8059
8117
|
let r = await fetch(e, {
|
|
8060
8118
|
method: "GET",
|
|
@@ -8071,7 +8129,7 @@ var yl = 3e4, bl = [r(async ({ url: e, as: t }) => {
|
|
|
8071
8129
|
].join("\n");
|
|
8072
8130
|
} catch (t) {
|
|
8073
8131
|
let r = t?.message || String(t);
|
|
8074
|
-
return n.signal.aborted ? `获取失败:请求超时(${
|
|
8132
|
+
return n.signal.aborted ? `获取失败:请求超时(${Sl}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
|
|
8075
8133
|
} finally {
|
|
8076
8134
|
clearTimeout(r);
|
|
8077
8135
|
}
|
|
@@ -8082,7 +8140,7 @@ var yl = 3e4, bl = [r(async ({ url: e, as: t }) => {
|
|
|
8082
8140
|
url: t.string().describe("要抓取的 URL(同源或已配 CORS)"),
|
|
8083
8141
|
as: t.enum(["text", "markdown"]).optional().describe("返回格式标签,默认 text")
|
|
8084
8142
|
})
|
|
8085
|
-
})],
|
|
8143
|
+
})], wl = [
|
|
8086
8144
|
"id",
|
|
8087
8145
|
"class",
|
|
8088
8146
|
"href",
|
|
@@ -8094,12 +8152,12 @@ var yl = 3e4, bl = [r(async ({ url: e, as: t }) => {
|
|
|
8094
8152
|
"aria-label",
|
|
8095
8153
|
"name",
|
|
8096
8154
|
"type"
|
|
8097
|
-
],
|
|
8098
|
-
function
|
|
8155
|
+
], Tl = /^(value|srcdoc|formaction|on\w+)$/i, El = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session/i;
|
|
8156
|
+
function Dl(e, t) {
|
|
8099
8157
|
if (!e) return null;
|
|
8100
|
-
let { depth: n, attrs: r, includeText: i = !0 } = t, a = r !== void 0, o = r ??
|
|
8158
|
+
let { depth: n, attrs: r, includeText: i = !0 } = t, a = r !== void 0, o = r ?? wl, s = (e) => {
|
|
8101
8159
|
let t = {};
|
|
8102
|
-
for (let n of Array.from(e.attributes)) (a ? o.includes(n.name) : o.includes(n.name) || n.name.startsWith("data-")) && (
|
|
8160
|
+
for (let n of Array.from(e.attributes)) (a ? o.includes(n.name) : o.includes(n.name) || n.name.startsWith("data-")) && (Tl.test(n.name) || El.test(n.name) || (t[n.name] = n.value));
|
|
8103
8161
|
return t;
|
|
8104
8162
|
}, c = (e, t) => {
|
|
8105
8163
|
let n = {
|
|
@@ -8115,10 +8173,10 @@ function wl(e, t) {
|
|
|
8115
8173
|
};
|
|
8116
8174
|
return c(e, n);
|
|
8117
8175
|
}
|
|
8118
|
-
var
|
|
8176
|
+
var Ol = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
|
|
8119
8177
|
let i = e ? document.querySelector(e) : document.body;
|
|
8120
8178
|
if (!i) return `未找到匹配元素:selector="${e}"`;
|
|
8121
|
-
let a =
|
|
8179
|
+
let a = Dl(i, {
|
|
8122
8180
|
depth: t ?? 3,
|
|
8123
8181
|
attrs: n,
|
|
8124
8182
|
includeText: r ?? !0
|
|
@@ -8133,14 +8191,14 @@ var Tl = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
|
|
|
8133
8191
|
attrs: t.array(t.string()).optional().describe("属性白名单(传了 = 严格白名单;不传 = 默认常用 + data-*)"),
|
|
8134
8192
|
includeText: t.boolean().optional().describe("是否包含直接文本(默认 true)")
|
|
8135
8193
|
})
|
|
8136
|
-
}),
|
|
8194
|
+
}), kl = [Ol];
|
|
8137
8195
|
//#endregion
|
|
8138
8196
|
//#region src/core/tools/envTool.ts
|
|
8139
|
-
function
|
|
8197
|
+
function Al(e) {
|
|
8140
8198
|
let t = e;
|
|
8141
8199
|
return typeof t.tagName == "string" || typeof t.nodeType == "number" && typeof t.nodeName == "string";
|
|
8142
8200
|
}
|
|
8143
|
-
function
|
|
8201
|
+
function jl(e, t = 3, n = 2e3, r) {
|
|
8144
8202
|
if (e == null) return e;
|
|
8145
8203
|
if (typeof e == "string") return e.length > n ? e.slice(0, n) + "…(已截断)" : e;
|
|
8146
8204
|
if (typeof e == "number" || typeof e == "boolean") return e;
|
|
@@ -8149,14 +8207,14 @@ function Ol(e, t = 3, n = 2e3, r) {
|
|
|
8149
8207
|
if (typeof e == "bigint") return `${e.toString()}n`;
|
|
8150
8208
|
if (typeof e != "object") return String(e);
|
|
8151
8209
|
let i = e;
|
|
8152
|
-
if (
|
|
8210
|
+
if (Al(i)) {
|
|
8153
8211
|
let e = i;
|
|
8154
8212
|
return e.tagName ? `[Element: <${e.tagName.toLowerCase()}>]` : `[Node: ${e.nodeName}]`;
|
|
8155
8213
|
}
|
|
8156
8214
|
if (r?.has(i)) return "[Circular]";
|
|
8157
8215
|
let a = r ?? /* @__PURE__ */ new WeakSet();
|
|
8158
8216
|
if (a.add(i), Array.isArray(e)) {
|
|
8159
|
-
let r = e.slice(0, 100).map((e) =>
|
|
8217
|
+
let r = e.slice(0, 100).map((e) => jl(e, t - 1, n, a));
|
|
8160
8218
|
return e.length > 100 && r.push(`…(共 ${e.length} 项,已截断)`), r;
|
|
8161
8219
|
}
|
|
8162
8220
|
if (t < 0) return "(对象,已截断)";
|
|
@@ -8168,14 +8226,14 @@ function Ol(e, t = 3, n = 2e3, r) {
|
|
|
8168
8226
|
break;
|
|
8169
8227
|
}
|
|
8170
8228
|
try {
|
|
8171
|
-
o[r] =
|
|
8229
|
+
o[r] = jl(i[r], t - 1, n, a);
|
|
8172
8230
|
} catch {
|
|
8173
8231
|
o[r] = "(getter 抛错)";
|
|
8174
8232
|
}
|
|
8175
8233
|
}
|
|
8176
8234
|
return o;
|
|
8177
8235
|
}
|
|
8178
|
-
function
|
|
8236
|
+
function Ml(e) {
|
|
8179
8237
|
let t = e ?? (typeof window < "u" ? window : {}), n = t.navigator, r = t.location, i = t.document;
|
|
8180
8238
|
return {
|
|
8181
8239
|
location: {
|
|
@@ -8208,9 +8266,9 @@ function kl(e) {
|
|
|
8208
8266
|
} : "(无 document)"
|
|
8209
8267
|
};
|
|
8210
8268
|
}
|
|
8211
|
-
var
|
|
8269
|
+
var Nl = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|opener|parent|top|self|window|globalThis|closed|history|navigation|trustedTypes|origin|crossOriginIsolated)$/, Pl = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session|ticket/i, Fl = r(({ key: e }) => {
|
|
8212
8270
|
if (e) {
|
|
8213
|
-
if (
|
|
8271
|
+
if (Nl.test(e) || Pl.test(e)) return JSON.stringify({
|
|
8214
8272
|
key: e,
|
|
8215
8273
|
denied: !0,
|
|
8216
8274
|
reason: "安全:该 key 在 denylist(localStorage/sessionStorage/cookie/document 或敏感命名 token/secret/key/auth),不读取防泄漏"
|
|
@@ -8220,18 +8278,18 @@ var Al = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|open
|
|
|
8220
8278
|
key: e,
|
|
8221
8279
|
exists: t !== void 0,
|
|
8222
8280
|
type: typeof t,
|
|
8223
|
-
value:
|
|
8281
|
+
value: jl(t)
|
|
8224
8282
|
}, null, 2);
|
|
8225
8283
|
}
|
|
8226
|
-
return JSON.stringify(
|
|
8284
|
+
return JSON.stringify(Ml(), null, 2);
|
|
8227
8285
|
}, {
|
|
8228
8286
|
name: "inspect_env",
|
|
8229
8287
|
description: "读取宿主页面环境信息(排查调试用,默认开启)。不传参 = 返回环境摘要(location 的 URL/origin/path、navigator 的浏览器/语言、viewport 视口尺寸、document 的 title/readyState);传 key = 读取指定 window 属性值(如 inspect_env({key:\"appConfig\"}) 读集成方挂的调试变量 window.appConfig)。用于排查「当前页面在哪/什么浏览器/视口多大/调试变量值是什么」。轻量只读,大结果自动外存 vfs。",
|
|
8230
8288
|
schema: t.object({ key: t.string().optional().describe("要读取的 window 属性名(如 \"appConfig\"/\"__DEBUG__\");不传 = 返回环境摘要") })
|
|
8231
|
-
}),
|
|
8289
|
+
}), Il = [Fl];
|
|
8232
8290
|
//#endregion
|
|
8233
8291
|
//#region src/core/harness/budget.ts
|
|
8234
|
-
function
|
|
8292
|
+
function Ll(e, t, n) {
|
|
8235
8293
|
let r = 0;
|
|
8236
8294
|
return {
|
|
8237
8295
|
name: "budget",
|
|
@@ -8256,12 +8314,12 @@ function Pl(e, t, n) {
|
|
|
8256
8314
|
}
|
|
8257
8315
|
//#endregion
|
|
8258
8316
|
//#region src/core/sdk/actions.ts
|
|
8259
|
-
var
|
|
8260
|
-
function
|
|
8317
|
+
var Rl = /^[a-zA-Z][a-zA-Z0-9_]*$/;
|
|
8318
|
+
function zl(e) {
|
|
8261
8319
|
let n = [];
|
|
8262
8320
|
for (let [i, a] of Object.entries(e)) {
|
|
8263
|
-
if (!
|
|
8264
|
-
console.warn(`[page-agent-sdk][actions] 动作名 "${i}" 非法(须匹配 ${
|
|
8321
|
+
if (!Rl.test(i)) {
|
|
8322
|
+
console.warn(`[page-agent-sdk][actions] 动作名 "${i}" 非法(须匹配 ${Rl}),已跳过`);
|
|
8265
8323
|
continue;
|
|
8266
8324
|
}
|
|
8267
8325
|
let e = a.description || `宿主动作 ${i}`;
|
|
@@ -8281,9 +8339,9 @@ function Il(e) {
|
|
|
8281
8339
|
}
|
|
8282
8340
|
return n;
|
|
8283
8341
|
}
|
|
8284
|
-
function
|
|
8342
|
+
function Bl(e) {
|
|
8285
8343
|
let t = {};
|
|
8286
|
-
for (let [n, r] of Object.entries(e))
|
|
8344
|
+
for (let [n, r] of Object.entries(e)) Rl.test(n) && (t[n] = {
|
|
8287
8345
|
description: r.description,
|
|
8288
8346
|
hasParams: !!r.params
|
|
8289
8347
|
});
|
|
@@ -8291,12 +8349,12 @@ function Ll(e) {
|
|
|
8291
8349
|
}
|
|
8292
8350
|
//#endregion
|
|
8293
8351
|
//#region src/core/toolsets.ts
|
|
8294
|
-
var
|
|
8295
|
-
function
|
|
8296
|
-
return
|
|
8352
|
+
var Vl = Cl, Hl = kl;
|
|
8353
|
+
function Ul(e, t) {
|
|
8354
|
+
return xl(e, t);
|
|
8297
8355
|
}
|
|
8298
|
-
function
|
|
8299
|
-
let a =
|
|
8356
|
+
function Wl(e, t, n, r, i) {
|
|
8357
|
+
let a = rc(e);
|
|
8300
8358
|
return [
|
|
8301
8359
|
...a.dataOps ? t : [],
|
|
8302
8360
|
...a.fetch ? n : [],
|
|
@@ -8306,7 +8364,7 @@ function Vl(e, t, n, r, i) {
|
|
|
8306
8364
|
}
|
|
8307
8365
|
//#endregion
|
|
8308
8366
|
//#region src/core/sdk/toolRegistry.ts
|
|
8309
|
-
function
|
|
8367
|
+
function Gl(e) {
|
|
8310
8368
|
let t = /* @__PURE__ */ new Map(), n = [];
|
|
8311
8369
|
for (let r of e) for (let e of r.tools) {
|
|
8312
8370
|
let i = t.get(e.name);
|
|
@@ -8326,15 +8384,15 @@ function Hl(e) {
|
|
|
8326
8384
|
}
|
|
8327
8385
|
//#endregion
|
|
8328
8386
|
//#region src/core/harness/usageHints.ts
|
|
8329
|
-
var
|
|
8330
|
-
function
|
|
8331
|
-
let i =
|
|
8387
|
+
var Kl = .7;
|
|
8388
|
+
function ql(e, t, n = "simple", r = !1) {
|
|
8389
|
+
let i = rc(e), a = n !== "advanced";
|
|
8332
8390
|
return {
|
|
8333
8391
|
name: "usageHints",
|
|
8334
8392
|
augmentPrompt: () => {
|
|
8335
8393
|
let n = [];
|
|
8336
8394
|
if (i.planning && (n.push("【自适应规划】按任务复杂度决定是否先规划,不要对简单任务过度编排:"), n.push(" · 简单/明确任务(改单字段、调样式、查值)→ 直接 read/write 执行,不必 write_todos。"), n.push(" · 复杂任务(多步、大改、有歧义、不可逆)→ 先 write_todos 拆解,首个任务标 in_progress,逐项推进。"), n.push(" · 执行中发现步骤要改/补/细分 → 用 update_todo({id, content?, status?}) 按 id 增量改单项,不必重传整个清单。"), n.push(" · 规划出多步方案若需用户拍板 → 先 request_human_confirmation 给方案选项,确认后再执行。"), n.push(" · 规划阶段有轮次预算(maxPlanRevisions,默认 5):勿反复调研/改计划而不执行,规划充分后即开始 write 落地。")), t && (a ? (n.push("读写主数据用 read/write(高层入口,自动乐观锁 + 自动快照)。read({jsonPath}) 读子路径当前值(返回含 hash,write 时自动比对,无需手动传);read() 不传读整个主数据 + 说明。write 改值两姿势:① 改单个字段/子路径用 write({patch:{op:\"set\", jsonPath:\"路径.字段\", value:新值}})——patch.value 就是该字段的新值(类型匹配:string 直传字符串、number 传数字、对象传对象),不要包成 {字段:值} 对象(字段名已在 jsonPath);也兼容 write({value:新值, patch:{op,jsonPath}}) 顶层 value(向后兼容,但优先 patch.value,避免与整体 set 的 value 混淆);② 替换整个对象用 write({value:{整个新对象}})。op:set 设值 / remove 删 / merge 合并对象 / append 追加数组;批量多改动 write({patches:[{op,jsonPath,value},...]});删子路径 write({patch:{jsonPath:\"路径\"}, del:true})。写入自动经 schema 校验(失败不写,按错误提示改值类型/形状后重试)+ 自动存快照(出错可用 restore_data 回退)。"), n.push("修改大对象/数组优先用 write 的 patch 增量(只发改动部分),避免整体重传被 max_tokens 截断致 JSON 不完整。"), n.push("读大数组(read 返回 hasMore=true)用 read({jsonPath,offset,limit}) 分页(offset+=limit 续读,默认 limit=50);一次读多个不相关子路径用 read({jsonPaths:[...]}) 省轮次;复杂 patches 改动先 write({patches,dryRun:true}) 预检(走完整校验不落盘)。"), n.push("read/describe 返回按 schema 投影:仅 schema 声明的字段可见(未声明字段自动隐藏,防误操作);要操作某字段需集成方在 schema 声明,查任意路径完整约束用 schema_data({jsonPath})。"), n.push("查历史快照值(看上一版长啥样 / 冲突诊断 / 用户问\"刚才改了啥\")用 history_data({id?,jsonPath?})(只读不改当前);对比当前与历史快照的差异需切 advanced 用 diff_data(返回结构化 path→from/to)。"), n.push("在大数组里按条件筛选用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素 path/index;定位后用 write patch 改。找名字记不清的元素用 search_data(substring/regex/fuzzy)。批量过滤/映射/聚合/重写大数组用 eval_script(沙箱脚本,mode=query 只读/transform 落地)。")) : (n.push("改主数据前先 get_data({jsonPath}) 读其当前真实值与 hash(返回末尾 hash=xxx),基于真实值改,不要凭记忆。写入(set/edit/delete)时回传 expectedHash=该 hash 启用乐观锁——若主数据在你 get 之后被外部代码/其他 agent/用户手动改过,会触发冲突:集成方若开启人工介入,工具会挂起等用户决定(保留外部/强制覆盖/回退),你应等待工具返回后按结果继续(保留外部→重新 get 再改;强制覆盖→已写入,继续;回退→已回退到历史快照,基于回退值重写);未开启人工介入时返回 VERSION_CONFLICT 不写入,重新 get 拿最新值与 hash 再改。"), n.push("不确定主数据字段结构时用 describe_data 查看说明。"), n.push("修改大对象/数组优先用 edit_data 增量 patch(只发改动部分),避免 set_data 整体重传被 max_tokens 截断导致 JSON 不完整、校验失败。"), n.push("修改主数据出错时可用 restore_data 回退最近一次。"), n.push("在大数组里按条件筛选元素用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素的 path/index;定位后再 edit_data 改。"), n.push("找名字记不清的元素用 search_data(支持 substring/regex/fuzzy 模糊搜索)。"), n.push("需要过滤/映射/聚合/批量重写大数组时用 eval_script(沙箱脚本,入参 data);只读探查用 mode=query,批量重写用 mode=transform(返回值经校验后落地)。"), n.push("读大数组用 read({jsonPath,offset,limit}) 分页(返回 hasMore=true 时 offset+=limit 续读);一次读多个不相关子路径用 read({jsonPaths});复杂改动先 write({...,dryRun:true}) 预检不落盘。"), n.push("对比当前与历史快照(或一段 JSON against)的差异用 diff_data({snapshotId?,against?})(返回结构化 path→from/to,verify 自纠/操作审计/\"刚才改了啥\");只读查历史快照值用 history_data({id?,jsonPath?})。"))), i.subagent && n.push("独立子任务可 spawn_agent 委派(只读工具,过程不占主上下文)。"), i.inspectEnv && n.push("排查页面环境(当前 URL/浏览器/视口/集成方调试变量)用 inspect_env——不传参返回环境摘要(location/navigator/viewport/document),传 key 读特定 window 属性(如 inspect_env({key:\"appConfig\"}) 读 window.appConfig)。改完数据看渲染、定位\"为何没生效\"时用它(只读,不改数据)。"), i.domInspect && n.push("改完数据想确认渲染是否生效(或定位元素/辅助 UI 设计问答)用 get_dom({selector?,depth?}) 读渲染后 DOM(结构化返回 tag/attrs/text/children,depth 控制深度防爆炸,只读)。配合宿主 actions(save_draft/publish 等)形成\"改数据→get_dom 看渲染→触发动作\"闭环。"), i.draftWrite && n.push("生成超大 JSON(如 50+ 组件页面,单次 write 受 max_tokens 限制装不下)用 draft_write 分块构建 → draft_commit 原子提交:draft_write({draftId, chunk, mode}) mode:\"start\" 新建/\"append\" 追加(拼 JSON 片段到 drafts 池);累积完 draft_commit({draftId}) 合并 + schema 校验 + 写主数据(失败草稿保留可修后重试,成功自动清草稿)。小改仍用 write patch,只在大 JSON 从零生成时用 draft。"), i.draftWrite && n.push("⚠️ 大 JSON 分块构建是典型多轮工具调用(draft_write×N + draft_commit + read 确认 + 调研 read/query),默认 maxToolRounds=10 可能触顶被 while 截断导致草稿写不完;目标组件数大时集成方应在 createChatSdk 配 maxToolRounds ≥ 20(或按 N+5 估算)。draft_commit 提交同样走乐观锁(改前 read 拿 hash,bind 被改过会触发冲突介入,不静默覆盖)。"), i.todoDeps && n.push("复杂任务可用 todos 层级依赖:write_todos 时给 todo 传 parentId(父任务 id,表达层级)+ deps(依赖的 todo id 数组,必须先完成)。有依赖的任务,deps 全 completed 后再标 in_progress;完成时 update_todo({id, status:\"completed\", evidence:\"完成证据\"}) 记证据。无依赖关系的任务不传 parentId/deps(扁平)。"), i.focus && !a && (n.push("【上下文聚焦】判断任务范围,用 set_focus/add_focus/remove_focus/clear_focus 自动收敛工作范围:"), n.push(" · 局部任务(只改某一组件/区域,如「调导航栏」「改 components.3 样式」)→ 先 read 定位 jsonPath,再 set_focus({path:\"该子树路径\"}) 聚焦;聚焦后每轮只看该子树结构,写其他位置会被 PATH_DENIED 拒绝。"), n.push(" · 多个相关组件(如「同时改导航栏和页脚」)→ set_focus 聚焦首个后用 add_focus({path}) 追加其余;聚焦后可写任一焦点子树,越界仍被拒;移除单个用 remove_focus({path})。"), n.push(" · 全局任务(多处/整体结构,如「重排所有组件」「换主题」)→ 不要聚焦,保持全量视野直接写。"), n.push(" · 完成局部精修、要转向其他区域或做整体改动 → 调 clear_focus 退出聚焦(清空全部焦点),恢复全部读写权限。"), n.push(" · set_focus/add_focus 的 path 必须在 schema 内(类型校验);不确定路径先 read/describe_data 查。")), r && (n.push("【受保护资源·精确值保护】部分字段被 freeze/verbatim 保护(集成方在 data.resources 声明):"), n.push(" · read 受保护路径返回占位符 ⟦frozen:path⟧(freeze,精确值不入消息流)或 ⟦res:handle⟧(verbatim,原值在资源池),非真值。"), n.push(" · 确需真值用 resource_get({path})(仅受保护路径);freeze 字段完全不可改,撞 FROZEN_FIELD 即放弃该字段改动。"), n.push(" · verbatim 字段改新值:先 resource_update({path,value}) 更新资源池(同步 bind),再 write 写回句柄 ⟦res:handle⟧;直接写新值 → VERBATIM_MISMATCH。"), n.push(" · 撞 RESOURCE_EVICTED(资源被池淘汰)→ 重新 read 该字段懒注册重建句柄;撞 RESOURCE_NOT_FOUND → 重新 read。")), e?.subagents?.length) {
|
|
8337
|
-
let t = e.subagents.filter((e) => (e.temperature ?? 0) >=
|
|
8395
|
+
let t = e.subagents.filter((e) => (e.temperature ?? 0) >= Kl || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), r = e.subagents.filter((e) => (e.temperature ?? 0) < Kl && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
|
|
8338
8396
|
n.push("【规划-反思-执行·路由】按任务性质选模式,不要对简单任务过度编排:"), t.length && (n.push(` · 创作/设计/开放性需求(如"设计主题风格""换个感觉")→ 先调 ${t.map((e) => "use_" + e.id).join("/")} 出 2-3 套方案(高温创意),`), n.push(" 不要自己拍板;拿到方案后,若需用户拍板用 request_human_confirmation 弹选项。")), r.length && n.push(` · 严谨/易错/校验类 → 可先调 ${r.map((e) => "use_" + e.id).join("/")} 反思挑刺(低温审查),据反馈修订。`), n.push(a ? " · 方案定稿后,由你(主 agent)用 write 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。" : " · 方案定稿后,由你(主 agent)用 edit_data 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。"), n.push(" · 简单/明确任务(如\"标题改红色\")直接执行,不必走规划-反思。");
|
|
8339
8397
|
}
|
|
8340
8398
|
return e?.humanConfirm && (n.push("【人工确认·必读】以下情形必须先调 request_human_confirmation 征询用户、拿到答复后再继续,不要自行拍板:"), n.push(" 1) 用户让你「给方案/列选项/我来选/挑一个」时:把每个方案作为一个 option,调 request_human_confirmation(question=简述, options=[方案A,方案B,...], recommendation=你推荐的)。不要只回文字罗列方案让用户自己回复——要用工具把选项做成可点选按钮。"), n.push(" 2) 需求有歧义/不确定时:调工具问清楚(options 不传则用户答同意或拒绝)。"), n.push(" 3) 即将执行高风险不可逆操作(删除/覆盖/批量改动)前:调工具确认。"), n.push(" 4) 规划出多步方案需用户确认时:把整个方案(或关键分步)作为 option 调 request_human_confirmation,确认后再执行。"), n.push("用户在选项里选了哪个,就按那个方案继续;选「拒绝」则停止并询问如何调整。")), n.length && n.unshift("调用工具务必用标准 function calling(工具调用)格式发起,不要在回复正文里输出伪 XML/标签(如 deepseek 的 tool_calls 标签、invoke、function_call、tool_call 等)或 JSON 文本——那不会被识别为工具调用,会被当普通文字,工具不执行。"), n.length ? "## 能力使用提示\n" + n.join("\n") : void 0;
|
|
@@ -8343,7 +8401,7 @@ function Wl(e, t, n = "simple", r = !1) {
|
|
|
8343
8401
|
}
|
|
8344
8402
|
//#endregion
|
|
8345
8403
|
//#region src/core/harness/resourcesPin.ts
|
|
8346
|
-
function
|
|
8404
|
+
function Jl(e) {
|
|
8347
8405
|
return {
|
|
8348
8406
|
name: "resourcesPin",
|
|
8349
8407
|
augmentPrompt: () => {
|
|
@@ -8357,78 +8415,78 @@ function Gl(e) {
|
|
|
8357
8415
|
}
|
|
8358
8416
|
//#endregion
|
|
8359
8417
|
//#region src/core/backends/skillStore.ts
|
|
8360
|
-
var
|
|
8361
|
-
function
|
|
8362
|
-
return `${
|
|
8418
|
+
var Yl = "v:1::skill-store", Xl = "chat-sdk";
|
|
8419
|
+
function Zl(e, t, n) {
|
|
8420
|
+
return `${Yl}::${e}::${t}::${n}`;
|
|
8363
8421
|
}
|
|
8364
|
-
function
|
|
8365
|
-
return `${
|
|
8422
|
+
function Ql(e, t) {
|
|
8423
|
+
return `${Yl}::${e}::${t}::`;
|
|
8366
8424
|
}
|
|
8367
|
-
function
|
|
8368
|
-
let t = e.dbName ??
|
|
8425
|
+
function $l(e = {}) {
|
|
8426
|
+
let t = e.dbName ?? Xl, n = e.backend ?? "indexed", r = e.id ?? "", i, a, o = new Promise((e) => {
|
|
8369
8427
|
a = e;
|
|
8370
8428
|
});
|
|
8371
8429
|
return (async () => {
|
|
8372
8430
|
try {
|
|
8373
8431
|
if (n === "indexed") {
|
|
8374
8432
|
if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
|
|
8375
|
-
i = await
|
|
8433
|
+
i = await Xs(t), a(!0);
|
|
8376
8434
|
} else if (n === "session") {
|
|
8377
8435
|
if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
|
|
8378
|
-
i =
|
|
8436
|
+
i = Zs(sessionStorage), a(!0);
|
|
8379
8437
|
} else if (n === "local") {
|
|
8380
8438
|
if (typeof localStorage > "u") throw Error("localStorage 不可用");
|
|
8381
|
-
i =
|
|
8382
|
-
} else i =
|
|
8439
|
+
i = Zs(localStorage), a(!0);
|
|
8440
|
+
} else i = Ys(), a(!1);
|
|
8383
8441
|
} catch {
|
|
8384
|
-
i =
|
|
8442
|
+
i = Ys(), a(!1);
|
|
8385
8443
|
}
|
|
8386
8444
|
})(), {
|
|
8387
8445
|
ready: o,
|
|
8388
8446
|
async list() {
|
|
8389
8447
|
let e = [];
|
|
8390
|
-
return await i.scan(
|
|
8448
|
+
return await i.scan(Ql(t, r), (t, n) => {
|
|
8391
8449
|
e.push(n);
|
|
8392
8450
|
}), e;
|
|
8393
8451
|
},
|
|
8394
8452
|
async get(e) {
|
|
8395
|
-
return await i.get(
|
|
8453
|
+
return await i.get(Zl(t, r, e));
|
|
8396
8454
|
},
|
|
8397
8455
|
async put(e) {
|
|
8398
8456
|
try {
|
|
8399
|
-
await i.set(
|
|
8457
|
+
await i.set(Zl(t, r, e.name), e);
|
|
8400
8458
|
} catch (e) {
|
|
8401
|
-
|
|
8459
|
+
Vs(e) && (i = Ys());
|
|
8402
8460
|
}
|
|
8403
8461
|
},
|
|
8404
8462
|
async remove(e) {
|
|
8405
|
-
let n =
|
|
8463
|
+
let n = Zl(t, r, e);
|
|
8406
8464
|
return await i.get(n) == null ? !1 : (await i.del(n), !0);
|
|
8407
8465
|
},
|
|
8408
8466
|
async clear() {
|
|
8409
|
-
await i.clearPrefix(
|
|
8467
|
+
await i.clearPrefix(Ql(t, r));
|
|
8410
8468
|
},
|
|
8411
8469
|
dispose() {}
|
|
8412
8470
|
};
|
|
8413
8471
|
}
|
|
8414
|
-
var
|
|
8415
|
-
function
|
|
8472
|
+
var eu = /large_results\/[^\s"'`),]+\.txt/g;
|
|
8473
|
+
function tu(e) {
|
|
8416
8474
|
let t = /* @__PURE__ */ new Set(), n = (e) => {
|
|
8417
8475
|
if (typeof e != "string" || !e) return;
|
|
8418
8476
|
let n;
|
|
8419
|
-
for (
|
|
8477
|
+
for (eu.lastIndex = 0; (n = eu.exec(e)) !== null;) t.add(n[0]);
|
|
8420
8478
|
};
|
|
8421
8479
|
for (let t of e) if (n(t.content), t.steps) for (let e of t.steps) n(e.result);
|
|
8422
8480
|
return t;
|
|
8423
8481
|
}
|
|
8424
|
-
function
|
|
8482
|
+
function nu(e, t) {
|
|
8425
8483
|
let n = [];
|
|
8426
8484
|
for (let r of Object.keys(e)) r.startsWith("large_results/") && !t.has(r) && n.push(r);
|
|
8427
8485
|
return n;
|
|
8428
8486
|
}
|
|
8429
8487
|
//#endregion
|
|
8430
8488
|
//#region src/core/utils/serialRunner.ts
|
|
8431
|
-
function
|
|
8489
|
+
function ru() {
|
|
8432
8490
|
let e = Promise.resolve();
|
|
8433
8491
|
return function(t) {
|
|
8434
8492
|
let n = e.then(t, t);
|
|
@@ -8437,16 +8495,16 @@ function eu() {
|
|
|
8437
8495
|
}
|
|
8438
8496
|
//#endregion
|
|
8439
8497
|
//#region src/core/sdk/createChatSdk.ts
|
|
8440
|
-
var
|
|
8441
|
-
function
|
|
8498
|
+
var iu = 30, au = /* @__PURE__ */ new Map();
|
|
8499
|
+
function ou(e, t) {
|
|
8442
8500
|
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;
|
|
8443
8501
|
}
|
|
8444
|
-
function
|
|
8502
|
+
function su(e, t, n, r) {
|
|
8445
8503
|
let i = 0;
|
|
8446
8504
|
return {
|
|
8447
8505
|
name: "sdk-events",
|
|
8448
8506
|
wrapToolCall: async (t, r) => {
|
|
8449
|
-
let i = await r(t), a =
|
|
8507
|
+
let i = await r(t), a = ou(t.name, t.args);
|
|
8450
8508
|
return a && e({
|
|
8451
8509
|
type: "data_change",
|
|
8452
8510
|
operation: a,
|
|
@@ -8481,7 +8539,7 @@ function iu(e, t, n, r) {
|
|
|
8481
8539
|
}
|
|
8482
8540
|
};
|
|
8483
8541
|
}
|
|
8484
|
-
function
|
|
8542
|
+
function cu(e, t, n, r, i) {
|
|
8485
8543
|
if (!n) return i && console.warn(`[page-agent-sdk][focus] capabilities.focus 关闭,${t} 忽略`), {
|
|
8486
8544
|
ok: !1,
|
|
8487
8545
|
error: "capabilities.focus 关闭"
|
|
@@ -8499,18 +8557,18 @@ function au(e, t, n, r, i) {
|
|
|
8499
8557
|
error: "当前无主数据 schema,无法聚焦"
|
|
8500
8558
|
});
|
|
8501
8559
|
}
|
|
8502
|
-
function
|
|
8560
|
+
function lu(e, n) {
|
|
8503
8561
|
let i = {
|
|
8504
8562
|
prompt_tokens: 0,
|
|
8505
8563
|
completion_tokens: 0,
|
|
8506
8564
|
total_tokens: 0
|
|
8507
|
-
}, a =
|
|
8565
|
+
}, a = Os(() => U), o = /* @__PURE__ */ Ot(0), s = ec(e.storage);
|
|
8508
8566
|
e.debug && s && s.onEvent((e) => console.log("[page-agent-sdk][storage]", e));
|
|
8509
|
-
let { modelCaps: c, summaryLlmInvoke: l, titleLlmInvoke: u, compressDecisionInvoke: p } =
|
|
8567
|
+
let { modelCaps: c, summaryLlmInvoke: l, titleLlmInvoke: u, compressDecisionInvoke: p } = Ds(e), m = c;
|
|
8510
8568
|
if (e.debug && console.log("[page-agent-sdk][modelCaps]", m), m.contextWindow < 2e5) throw Error(`[page-agent-sdk] 模型上下文窗口 ${m.contextWindow} 小于最小支持 ${ti}(需 ≥200K 窗口模型,如 GLM-5.2/Claude/Kimi/Qwen-1M/DeepSeek-v4)`);
|
|
8511
|
-
let h =
|
|
8569
|
+
let h = sc(e, m.contextWindow), g = h.enableLLMSummary !== !1, _ = (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? oc[e.contextPreset ?? "auto"], v = new Set(_), y = e.llm;
|
|
8512
8570
|
e.debug && !l && console.warn("[page-agent-sdk][summarization] 未构造 llmInvoke(apiKey 缺失?),摘要回退零成本索引摘要");
|
|
8513
|
-
let b = /* @__PURE__ */ _t([]), x =
|
|
8571
|
+
let b = /* @__PURE__ */ _t([]), x = Oc(e.vfs?.initialFiles, {
|
|
8514
8572
|
persist: s ? { save: (e) => {
|
|
8515
8573
|
W.sessionId && s && s.save(n, W.sessionId, { vfs: e });
|
|
8516
8574
|
} } : void 0,
|
|
@@ -8530,18 +8588,18 @@ function ou(e, n) {
|
|
|
8530
8588
|
getTodos: () => ee.current?.getState?.()?.todos ?? [],
|
|
8531
8589
|
messages: b,
|
|
8532
8590
|
maxCheckpoints: O && typeof O == "object" ? O.maxCheckpoints : void 0
|
|
8533
|
-
}) : null, te = !O || typeof O != "object" || O.auto !== !1, j =
|
|
8591
|
+
}) : null, te = !O || typeof O != "object" || O.auto !== !1, j = rc(e.capabilities), ne = j.dataOps, M = j.draftWrite, N = j.tracing, re = j.automation, P = fs(e), ie = ne && D ? xl(D, {
|
|
8534
8592
|
onAudit: e.onAudit ?? (e.debug ? (e) => console.log("[page-agent-sdk][data audit]", e) : void 0),
|
|
8535
8593
|
maxSnapshots: e.maxSnapshots,
|
|
8536
8594
|
onConflict: a.set,
|
|
8537
8595
|
autoLock: e.autoLock,
|
|
8538
8596
|
interceptors: e.interceptors,
|
|
8539
8597
|
vfsStore: M || D?.resources?.length ? x : void 0
|
|
8540
|
-
}) : [], ae = ne ?
|
|
8598
|
+
}) : [], ae = ne ? vl(ie, e.toolMode) : [], oe = ne && D ? ie.controller ?? null : null, se = ne && D?.resources?.length && oe?.getResourcesSnapshot ? Jl({ getResourcesSnapshot: () => oe?.getResourcesSnapshot?.() ?? [] }) : void 0, F = () => oe?.get() ?? D, I = /* @__PURE__ */ new Map(), ce = Wl(j, ae, Cl, kl, Il);
|
|
8541
8599
|
ce.forEach((e) => I.set(e.name, "builtin"));
|
|
8542
8600
|
let le = [...e.tools || []];
|
|
8543
8601
|
le.forEach((e) => I.set(e.name, "user"));
|
|
8544
|
-
let L =
|
|
8602
|
+
let L = zl(e.actions ?? {});
|
|
8545
8603
|
L.forEach((e) => I.set(e.name, "action"));
|
|
8546
8604
|
let ue = [], de = e.humanConfirm !== !1 && (!e.approval || e.approval.humanConfirmTool !== !1), fe = de ? Wa() : null;
|
|
8547
8605
|
fe && I.set(Ha, "builtin");
|
|
@@ -8613,7 +8671,7 @@ function ou(e, n) {
|
|
|
8613
8671
|
ve.forEach((e) => I.set(e.name, "builtin"));
|
|
8614
8672
|
let z = [], ye = /* @__PURE__ */ new Map(), B = be();
|
|
8615
8673
|
function be() {
|
|
8616
|
-
let { tools: e, collisions: t } =
|
|
8674
|
+
let { tools: e, collisions: t } = Gl([
|
|
8617
8675
|
{
|
|
8618
8676
|
label: "builtin",
|
|
8619
8677
|
tools: ce
|
|
@@ -8650,15 +8708,15 @@ function ou(e, n) {
|
|
|
8650
8708
|
return t.length && console.warn("[page-agent-sdk] 工具重名,后注册覆盖先注册:", t.map((e) => `${e.name}(${e.loser}→${e.winner})`).join(", ")), e;
|
|
8651
8709
|
}
|
|
8652
8710
|
let xe = j.planning, Se = j.missionAnchor, Ce = j.workingMemory, we = j.skills, Te = j.vfs;
|
|
8653
|
-
if (Te) for (let e of
|
|
8711
|
+
if (Te) for (let e of Fc) I.set(e, "builtin");
|
|
8654
8712
|
if (xe) for (let e of S.tools ?? []) I.set(e.name, "builtin");
|
|
8655
8713
|
let Ee = j.summarization, De = j.agentCompression && !!p;
|
|
8656
8714
|
e.debug && j.agentCompression && !p && console.warn("[page-agent-sdk][agentCompression] agentCompression 开启但 summaryLlm 不可用(或缺 apiKey / 模型不支持工具),压缩决策不启用,回退静态压缩");
|
|
8657
8715
|
let Oe = j.memory, ke = j.subagent, Ae = ke ? bo() : void 0, je = e.verify?.maxAttempts ?? 2, Me = j.verify && e.verify?.enabled !== !1 && je > 0, Ne = j.contextInspector;
|
|
8658
8716
|
e.verify?.check && !j.verify && console.warn("[page-agent-sdk][verify] 检测到 verify.check 但 capabilities.verify 未开启,verify 未装载");
|
|
8659
|
-
let Pe = e.subagent, Fe = Pe?.allowedTools ?? [], Ie = !ke || Pe?.enabled === !1 ? void 0 :
|
|
8717
|
+
let Pe = e.subagent, Fe = Pe?.allowedTools ?? [], Ie = e.permissions?.length ? Ba(e.permissions) : void 0, Le = e.approval && (e.approval.tools !== void 0 || e.approval.confirm) ? Va(e.approval) : void 0, Re = [...Ie ? [Ie] : [], ...Le ? [Le] : []], V = !ke || Pe?.enabled === !1 ? void 0 : Fo({
|
|
8660
8718
|
llm: Pe?.llm ?? e.llm,
|
|
8661
|
-
allTools: () => B,
|
|
8719
|
+
allTools: () => W.agent?.allTools ?? B,
|
|
8662
8720
|
allowedTools: Fe.length ? Fe : void 0,
|
|
8663
8721
|
systemPrompt: Pe?.systemPrompt,
|
|
8664
8722
|
temperature: Pe?.temperature,
|
|
@@ -8669,32 +8727,36 @@ function ou(e, n) {
|
|
|
8669
8727
|
debug: e.debug,
|
|
8670
8728
|
getFocuses: () => w.getFocuses(),
|
|
8671
8729
|
getSchema: () => F()?.schema ?? null,
|
|
8672
|
-
tracker: Ae
|
|
8673
|
-
|
|
8730
|
+
tracker: Ae,
|
|
8731
|
+
guardMiddleware: Re.length ? Re : void 0,
|
|
8732
|
+
getVfsFiles: Te ? () => x.files : void 0
|
|
8733
|
+
}), H = ke && e.subagents !== void 0 ? Ro(e.subagents, {
|
|
8674
8734
|
llm: e.llm,
|
|
8675
|
-
allTools: () => B,
|
|
8735
|
+
allTools: () => W.agent?.allTools ?? B,
|
|
8676
8736
|
debug: e.debug,
|
|
8677
8737
|
getFocuses: () => w.getFocuses(),
|
|
8678
8738
|
getSchema: () => F()?.schema ?? null,
|
|
8679
|
-
tracker: Ae
|
|
8680
|
-
|
|
8739
|
+
tracker: Ae,
|
|
8740
|
+
guardMiddleware: Re.length ? Re : void 0,
|
|
8741
|
+
getVfsFiles: Te ? () => x.files : void 0
|
|
8742
|
+
}) : void 0, ze = H ? H.controller : null, Be = [
|
|
8681
8743
|
"get_data",
|
|
8682
8744
|
"describe_data",
|
|
8683
8745
|
"read",
|
|
8684
8746
|
"fetch_document"
|
|
8685
|
-
],
|
|
8686
|
-
check: e.verify.check ??
|
|
8747
|
+
], Ve = B.filter((e) => Be.includes(e.name)), He = Me ? zo({
|
|
8748
|
+
check: e.verify.check ?? Go({
|
|
8687
8749
|
schemas: () => F() ? { "": F().schema } : {},
|
|
8688
8750
|
root: () => F()?.bind
|
|
8689
8751
|
}),
|
|
8690
8752
|
adversarial: e.verify?.adversarial ? {
|
|
8691
8753
|
llm: e.llm,
|
|
8692
|
-
tools:
|
|
8754
|
+
tools: Ve
|
|
8693
8755
|
} : void 0
|
|
8694
|
-
}) : void 0,
|
|
8756
|
+
}) : void 0, Ue = Ne ? as({
|
|
8695
8757
|
contextWindow: m.contextWindow,
|
|
8696
|
-
thresholdRatio:
|
|
8697
|
-
}) : void 0,
|
|
8758
|
+
thresholdRatio: sc(e, m.contextWindow).summaryThresholdRatio
|
|
8759
|
+
}) : void 0, We = ql({
|
|
8698
8760
|
...j,
|
|
8699
8761
|
humanConfirm: de,
|
|
8700
8762
|
subagents: e.subagents?.map((e) => ({
|
|
@@ -8702,10 +8764,10 @@ function ou(e, n) {
|
|
|
8702
8764
|
description: e.description,
|
|
8703
8765
|
temperature: e.temperature
|
|
8704
8766
|
}))
|
|
8705
|
-
}, ne && !!D, e.toolMode, !!D?.resources?.length),
|
|
8767
|
+
}, ne && !!D, e.toolMode, !!D?.resources?.length), Ge = D ? {
|
|
8706
8768
|
name: "dataHint",
|
|
8707
|
-
augmentPrompt: () =>
|
|
8708
|
-
} : null,
|
|
8769
|
+
augmentPrompt: () => ds(F(), e.schemaHint) || void 0
|
|
8770
|
+
} : null, Ke = e.augmentSystem ? {
|
|
8709
8771
|
name: "augmentSystem",
|
|
8710
8772
|
augmentPrompt: (t) => {
|
|
8711
8773
|
try {
|
|
@@ -8718,52 +8780,52 @@ function ou(e, n) {
|
|
|
8718
8780
|
return;
|
|
8719
8781
|
}
|
|
8720
8782
|
}
|
|
8721
|
-
} : null,
|
|
8783
|
+
} : null, qe = ic(e.onEvent), U = qe.emit, Je, Ye = [], Xe = (e) => ({
|
|
8722
8784
|
name: e.name,
|
|
8723
8785
|
description: e.description,
|
|
8724
8786
|
content: typeof e.getContent == "function" ? e.getContent() : ""
|
|
8725
|
-
}),
|
|
8787
|
+
}), Ze = (e) => ({
|
|
8726
8788
|
name: e.name,
|
|
8727
8789
|
description: e.description,
|
|
8728
8790
|
getContent: () => e.content
|
|
8729
|
-
}),
|
|
8791
|
+
}), Qe = e.skillStorage === !1 ? null : $l({
|
|
8730
8792
|
...typeof e.skillStorage == "object" ? e.skillStorage : {},
|
|
8731
8793
|
id: e.skillStorage && typeof e.skillStorage == "object" && e.skillStorage.id ? e.skillStorage.id : `agent::${n}`
|
|
8732
|
-
}),
|
|
8733
|
-
let t =
|
|
8794
|
+
}), $e = () => {
|
|
8795
|
+
let t = Je ? Je.controller : null;
|
|
8734
8796
|
if (t) {
|
|
8735
|
-
let n = (e.skills || []).filter((e) => !
|
|
8736
|
-
t.set([...n, ...
|
|
8797
|
+
let n = (e.skills || []).filter((e) => !Ye.some((t) => t.name === e.name));
|
|
8798
|
+
t.set([...n, ...Ye]);
|
|
8737
8799
|
}
|
|
8738
8800
|
W.infoTick.value++;
|
|
8739
|
-
},
|
|
8740
|
-
if (
|
|
8741
|
-
let t = await
|
|
8801
|
+
}, et = async () => {
|
|
8802
|
+
if (Qe) try {
|
|
8803
|
+
let t = await Qe.list();
|
|
8742
8804
|
if (t.length) {
|
|
8743
|
-
|
|
8744
|
-
let n =
|
|
8805
|
+
Ye = t.map(Ze);
|
|
8806
|
+
let n = Je ? Je.controller : null;
|
|
8745
8807
|
if (n) {
|
|
8746
|
-
let t = (e.skills || []).filter((e) => !
|
|
8747
|
-
n.set([...t, ...
|
|
8808
|
+
let t = (e.skills || []).filter((e) => !Ye.some((t) => t.name === e.name));
|
|
8809
|
+
n.set([...t, ...Ye]);
|
|
8748
8810
|
}
|
|
8749
8811
|
W.infoTick.value++;
|
|
8750
8812
|
}
|
|
8751
8813
|
} catch {}
|
|
8752
|
-
},
|
|
8814
|
+
}, tt = Ee ? yo({
|
|
8753
8815
|
...h,
|
|
8754
8816
|
llmInvoke: l,
|
|
8755
8817
|
getRegisteredData: () => F() ? [{ description: F().description ?? "主数据对象" }] : [],
|
|
8756
8818
|
preserveLastToolResults: _,
|
|
8757
8819
|
...De ? {
|
|
8758
8820
|
decideInvoke: p,
|
|
8759
|
-
getSnapshot: () =>
|
|
8821
|
+
getSnapshot: () => Ue?.getSnapshot()
|
|
8760
8822
|
} : {}
|
|
8761
|
-
}) : void 0,
|
|
8762
|
-
...
|
|
8763
|
-
|
|
8823
|
+
}) : void 0, nt = lc([
|
|
8824
|
+
...Ge ? [Ge] : [],
|
|
8825
|
+
We,
|
|
8764
8826
|
...Se ? [C] : [],
|
|
8765
8827
|
...xe ? [S] : [],
|
|
8766
|
-
...we ? [
|
|
8828
|
+
...we ? [Je = Na(e.skills || [], {
|
|
8767
8829
|
readVfs: Te ? (e) => x.files[e]?.content : void 0,
|
|
8768
8830
|
hostScriptEnabled: j.skillHostScript,
|
|
8769
8831
|
onToolsReady: (e, t) => {
|
|
@@ -8774,37 +8836,37 @@ function ou(e, n) {
|
|
|
8774
8836
|
B = be(), W.agent && W.agent.setTools(B), W.infoTick.value++;
|
|
8775
8837
|
}
|
|
8776
8838
|
})] : [],
|
|
8777
|
-
...Te ? [
|
|
8778
|
-
|
|
8839
|
+
...Te ? [Lc(x)] : [],
|
|
8840
|
+
...tt ? [tt] : [],
|
|
8779
8841
|
...Ce ? [T] : [],
|
|
8780
8842
|
...R ? [w] : [],
|
|
8781
8843
|
...se ? [se] : [],
|
|
8782
8844
|
...Oe ? [E] : [],
|
|
8783
|
-
...
|
|
8845
|
+
...Ie ? [Ie] : [],
|
|
8784
8846
|
...k && te && A ? [$a(A)] : [],
|
|
8785
8847
|
...de ? [Ga()] : [],
|
|
8786
|
-
...e.approval && (e.approval.tools !== void 0 || e.approval.confirm) ? [Va(e.approval)] : [],
|
|
8787
|
-
...Be ? [Be] : [],
|
|
8788
|
-
...Ie ? [Ie] : [],
|
|
8789
8848
|
...Le ? [Le] : [],
|
|
8790
|
-
...
|
|
8791
|
-
...
|
|
8849
|
+
...He ? [He] : [],
|
|
8850
|
+
...V ? [V] : [],
|
|
8851
|
+
...H ? [H] : [],
|
|
8852
|
+
...Ke ? [Ke] : [],
|
|
8853
|
+
...Ue ? [Ue] : [],
|
|
8792
8854
|
...e.middleware || [],
|
|
8793
|
-
...re ? [
|
|
8855
|
+
...re ? [Ll(i, {
|
|
8794
8856
|
tokenBudget: e.tokenBudget,
|
|
8795
8857
|
timeBudgetMs: e.timeBudgetMs
|
|
8796
|
-
},
|
|
8797
|
-
|
|
8798
|
-
]),
|
|
8799
|
-
async function
|
|
8800
|
-
s && (
|
|
8858
|
+
}, U)] : [],
|
|
8859
|
+
su(U, b, F, i)
|
|
8860
|
+
]), rt = e.maxMemoryRounds ?? iu, it = /* @__PURE__ */ Ot([]);
|
|
8861
|
+
async function at() {
|
|
8862
|
+
s && (it.value = (await s.listSessions(n)).sort((e, t) => t.lastAccessed - e.lastAccessed));
|
|
8801
8863
|
}
|
|
8802
8864
|
let W = {
|
|
8803
8865
|
agentId: n,
|
|
8804
8866
|
store: s,
|
|
8805
8867
|
messages: b,
|
|
8806
8868
|
vfsStore: x,
|
|
8807
|
-
listeners:
|
|
8869
|
+
listeners: qe.listeners,
|
|
8808
8870
|
todosMw: S,
|
|
8809
8871
|
memoryMw: E,
|
|
8810
8872
|
missionMw: C,
|
|
@@ -8818,14 +8880,14 @@ function ou(e, n) {
|
|
|
8818
8880
|
mcpServers: [],
|
|
8819
8881
|
checkpoint: A,
|
|
8820
8882
|
dataOpsController: oe,
|
|
8821
|
-
skillsController:
|
|
8883
|
+
skillsController: Je ? Je.controller : null,
|
|
8822
8884
|
infoTick: o,
|
|
8823
8885
|
pendingConflict: a.pendingConflict,
|
|
8824
|
-
sessions:
|
|
8825
|
-
refreshSessions:
|
|
8886
|
+
sessions: it,
|
|
8887
|
+
refreshSessions: at,
|
|
8826
8888
|
liveData: F,
|
|
8827
8889
|
usage: i,
|
|
8828
|
-
emit:
|
|
8890
|
+
emit: U,
|
|
8829
8891
|
unloadSkillTools(e) {
|
|
8830
8892
|
if (e) {
|
|
8831
8893
|
let t = z.length;
|
|
@@ -8848,21 +8910,21 @@ function ou(e, n) {
|
|
|
8848
8910
|
}
|
|
8849
8911
|
}
|
|
8850
8912
|
}
|
|
8851
|
-
|
|
8913
|
+
lt();
|
|
8852
8914
|
},
|
|
8853
8915
|
addSkill(e) {
|
|
8854
|
-
let t =
|
|
8855
|
-
t >= 0 ?
|
|
8916
|
+
let t = Ye.findIndex((t) => t.name === e.name);
|
|
8917
|
+
t >= 0 ? Ye[t] = e : Ye.push(e), $e(), Qe && Qe.put(Xe(e));
|
|
8856
8918
|
},
|
|
8857
8919
|
removeSkill(e) {
|
|
8858
|
-
let t =
|
|
8859
|
-
return t < 0 ? !1 : (
|
|
8920
|
+
let t = Ye.findIndex((t) => t.name === e);
|
|
8921
|
+
return t < 0 ? !1 : (Ye.splice(t, 1), $e(), Qe && Qe.remove(e), !0);
|
|
8860
8922
|
},
|
|
8861
8923
|
listUserSkills() {
|
|
8862
|
-
return
|
|
8924
|
+
return Ye.map((e) => e.name);
|
|
8863
8925
|
},
|
|
8864
8926
|
getUserSkill(e) {
|
|
8865
|
-
let t =
|
|
8927
|
+
let t = Ye.find((t) => t.name === e);
|
|
8866
8928
|
if (t) return {
|
|
8867
8929
|
name: t.name,
|
|
8868
8930
|
description: t.description,
|
|
@@ -8870,7 +8932,7 @@ function ou(e, n) {
|
|
|
8870
8932
|
};
|
|
8871
8933
|
},
|
|
8872
8934
|
afterRound() {
|
|
8873
|
-
|
|
8935
|
+
ut(), pt();
|
|
8874
8936
|
},
|
|
8875
8937
|
async send(e, t) {
|
|
8876
8938
|
await W.initDone, t ??= {}, t?.mission && Se && C.setMission(t.mission);
|
|
@@ -8900,7 +8962,7 @@ function ou(e, n) {
|
|
|
8900
8962
|
} catch (e) {
|
|
8901
8963
|
let t = qr(e, "fatal");
|
|
8902
8964
|
if (i < r && A?.canRestore()) {
|
|
8903
|
-
i += 1, A.restore(), a = !0,
|
|
8965
|
+
i += 1, A.restore(), a = !0, U({
|
|
8904
8966
|
type: "error",
|
|
8905
8967
|
message: `致命错误自动恢复(${i}/${r}):${t.message},已回退 checkpoint 重试`,
|
|
8906
8968
|
severity: "observable",
|
|
@@ -8912,7 +8974,7 @@ function ou(e, n) {
|
|
|
8912
8974
|
});
|
|
8913
8975
|
continue;
|
|
8914
8976
|
}
|
|
8915
|
-
throw
|
|
8977
|
+
throw U({
|
|
8916
8978
|
type: "error",
|
|
8917
8979
|
message: t.message,
|
|
8918
8980
|
severity: t.severity,
|
|
@@ -8954,7 +9016,7 @@ function ou(e, n) {
|
|
|
8954
9016
|
} catch (o) {
|
|
8955
9017
|
b.length > a && b.splice(a);
|
|
8956
9018
|
let s = qr(o, "fatal");
|
|
8957
|
-
|
|
9019
|
+
U({
|
|
8958
9020
|
type: "error",
|
|
8959
9021
|
message: `批量任务 ${r + 1}/${e.length} 失败:${s.message}`,
|
|
8960
9022
|
severity: "observable",
|
|
@@ -8996,25 +9058,25 @@ function ou(e, n) {
|
|
|
8996
9058
|
}
|
|
8997
9059
|
x.flush?.(), await s.flush();
|
|
8998
9060
|
let r = t ?? "", i;
|
|
8999
|
-
return r ? (i = await s.load(n, r), i || await s.createSession(n, e.session?.title, r)) : r = await s.createSession(n, e.session?.title), W.sessionId = r, b.splice(0, b.length), x.clear?.(), S.reset([]), e.memory || E.reset(""), C.reset(), T.reset(), w.reset(), A && A.importStack([]), W.agent.debugLogs.value = [], i ||= await s.load(n, r), i && (W.applySnapshot(i),
|
|
9061
|
+
return r ? (i = await s.load(n, r), i || await s.createSession(n, e.session?.title, r)) : r = await s.createSession(n, e.session?.title), W.sessionId = r, b.splice(0, b.length), x.clear?.(), S.reset([]), e.memory || E.reset(""), C.reset(), T.reset(), w.reset(), A && A.importStack([]), W.agent.debugLogs.value = [], i ||= await s.load(n, r), i && (W.applySnapshot(i), U({
|
|
9000
9062
|
type: "session_restored",
|
|
9001
9063
|
sessionId: r,
|
|
9002
9064
|
rounds: i.messages?.length ?? 0
|
|
9003
|
-
})), e.memory && s.save(n, W.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }),
|
|
9065
|
+
})), e.memory && s.save(n, W.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }), at(), dt = void 0, ft = !1, r;
|
|
9004
9066
|
},
|
|
9005
9067
|
resetSession: () => {
|
|
9006
|
-
s && (W.sessionId =
|
|
9068
|
+
s && (W.sessionId = ks(), x.clear?.(), S.reset([]), e.memory || E.reset(""), C.reset(), T.reset(), w.reset(), A && A.importStack([]), W.agent && (W.agent.debugLogs.value = []), s.createSession(W.agentId, e.session?.title, W.sessionId), U({
|
|
9007
9069
|
type: "session_restored",
|
|
9008
9070
|
sessionId: W.sessionId,
|
|
9009
9071
|
rounds: 0
|
|
9010
|
-
}),
|
|
9072
|
+
}), at(), dt = void 0, ft = !1);
|
|
9011
9073
|
},
|
|
9012
9074
|
stream: (e, t, n) => {
|
|
9013
9075
|
if (!W.agent) throw Error("page-agent-sdk: agent 尚未初始化完成,请先 await mount()");
|
|
9014
|
-
x?.setProtectedRefs?.(
|
|
9015
|
-
let r =
|
|
9016
|
-
t?.(e),
|
|
9017
|
-
}
|
|
9076
|
+
x?.setProtectedRefs?.(tu(e));
|
|
9077
|
+
let r = (e) => {
|
|
9078
|
+
t?.(e), U(e);
|
|
9079
|
+
};
|
|
9018
9080
|
if (n) {
|
|
9019
9081
|
let e = () => a.resolve("keep_external");
|
|
9020
9082
|
n.aborted ? e() : n.addEventListener("abort", e, { once: !0 });
|
|
@@ -9023,9 +9085,9 @@ function ou(e, n) {
|
|
|
9023
9085
|
},
|
|
9024
9086
|
release() {
|
|
9025
9087
|
if (W.refCount--, W.refCount <= 0) {
|
|
9026
|
-
s && (x.flush?.(), s.flush(), s.dispose()),
|
|
9088
|
+
s && (x.flush?.(), s.flush(), s.dispose()), Qe && Qe.dispose();
|
|
9027
9089
|
let e = W.mcpClosers.splice(0);
|
|
9028
|
-
e.length && Promise.allSettled(e.map((e) => e())),
|
|
9090
|
+
e.length && Promise.allSettled(e.map((e) => e())), au.delete(n);
|
|
9029
9091
|
}
|
|
9030
9092
|
},
|
|
9031
9093
|
resolveConflict: a.resolve,
|
|
@@ -9045,20 +9107,20 @@ function ou(e, n) {
|
|
|
9045
9107
|
},
|
|
9046
9108
|
setLlm(t) {
|
|
9047
9109
|
let n;
|
|
9048
|
-
if (
|
|
9110
|
+
if (vs(t)) n = t;
|
|
9049
9111
|
else {
|
|
9050
9112
|
let e = t;
|
|
9051
9113
|
if ((e.provider ?? "openai") === "anthropic") throw Error("[page-agent-sdk][setLlm] 切换到 Anthropic 需传 BaseChatModel 实例(动态 import 无法同步);请先 const { ChatAnthropic } = await import(\"@langchain/anthropic\") 构造实例后传入");
|
|
9052
9114
|
n = d(e);
|
|
9053
9115
|
}
|
|
9054
9116
|
typeof n.bindTools != "function" && e.debug && console.warn("[page-agent-sdk][setLlm] 新模型不支持 bindTools(tool calling 会失效)"), y = t;
|
|
9055
|
-
let r =
|
|
9117
|
+
let r = vs(t) ? void 0 : t;
|
|
9056
9118
|
if (m = ni({
|
|
9057
9119
|
model: r?.model ?? t.model ?? t.modelName,
|
|
9058
9120
|
contextWindow: e.contextWindow ?? r?.contextWindow,
|
|
9059
9121
|
maxOutputTokens: e.maxOutputTokens ?? r?.maxOutputTokens
|
|
9060
9122
|
}), m.contextWindow < 2e5) throw Error(`[page-agent-sdk][setLlm] 新模型上下文窗口 ${m.contextWindow} 小于最小支持 ${ti}(需 ≥200K 窗口模型)`);
|
|
9061
|
-
W.agent && (W.agent.setLlm(n), W.agent.setModelCaps?.(m)),
|
|
9123
|
+
W.agent && (W.agent.setLlm(n), W.agent.setModelCaps?.(m)), tt?.setContextWindow?.(m.contextWindow), Ue?.setContextWindow?.(m.contextWindow), W.infoTick.value++, e.debug && console.log("[page-agent-sdk][setLlm] 重解析 modelCaps + 回灌:", m);
|
|
9062
9124
|
},
|
|
9063
9125
|
setMemory(e) {
|
|
9064
9126
|
E.reset(e), typeof e == "function" && E.refresh(), W.infoTick.value++;
|
|
@@ -9067,22 +9129,22 @@ function ou(e, n) {
|
|
|
9067
9129
|
return E.refresh();
|
|
9068
9130
|
},
|
|
9069
9131
|
setSubagents(t) {
|
|
9070
|
-
if (!
|
|
9132
|
+
if (!ze) {
|
|
9071
9133
|
e.debug && console.warn("[page-agent-sdk][setSubagents] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略");
|
|
9072
9134
|
return;
|
|
9073
9135
|
}
|
|
9074
|
-
|
|
9136
|
+
ze.set(t), W.infoTick.value++;
|
|
9075
9137
|
},
|
|
9076
9138
|
addSubagent(t) {
|
|
9077
|
-
if (!
|
|
9139
|
+
if (!ze) {
|
|
9078
9140
|
e.debug && console.warn("[page-agent-sdk][addSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略");
|
|
9079
9141
|
return;
|
|
9080
9142
|
}
|
|
9081
|
-
|
|
9143
|
+
ze.add(t), W.infoTick.value++;
|
|
9082
9144
|
},
|
|
9083
9145
|
removeSubagent(t) {
|
|
9084
|
-
if (!
|
|
9085
|
-
let n =
|
|
9146
|
+
if (!ze) return e.debug && console.warn("[page-agent-sdk][removeSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略"), !1;
|
|
9147
|
+
let n = ze.remove(t);
|
|
9086
9148
|
return n && W.infoTick.value++, n;
|
|
9087
9149
|
},
|
|
9088
9150
|
getActiveSubagents() {
|
|
@@ -9095,15 +9157,15 @@ function ou(e, n) {
|
|
|
9095
9157
|
return {
|
|
9096
9158
|
id: n,
|
|
9097
9159
|
sessionId: W.sessionId,
|
|
9098
|
-
model:
|
|
9099
|
-
systemPrompt: W.agent?.getEffectiveSystemPrompt?.() ?? P +
|
|
9160
|
+
model: vs(y) ? y.model ?? y.modelName : y.model,
|
|
9161
|
+
systemPrompt: W.agent?.getEffectiveSystemPrompt?.() ?? P + ds(F(), e.schemaHint),
|
|
9100
9162
|
tools: (W.agent?.allTools ?? B).map((e) => ({
|
|
9101
9163
|
name: e.name,
|
|
9102
9164
|
description: e.description,
|
|
9103
9165
|
schema: e.schema,
|
|
9104
9166
|
source: I.get(e.name) || "user"
|
|
9105
9167
|
})),
|
|
9106
|
-
skills: (
|
|
9168
|
+
skills: (Je ? Je.controller.get() : e.skills ?? []).map((e) => ({
|
|
9107
9169
|
name: e.name,
|
|
9108
9170
|
description: e.description
|
|
9109
9171
|
})),
|
|
@@ -9113,7 +9175,7 @@ function ou(e, n) {
|
|
|
9113
9175
|
} : void 0,
|
|
9114
9176
|
contextPreset: e.contextPreset ?? "auto",
|
|
9115
9177
|
memory: E.get(),
|
|
9116
|
-
middleware:
|
|
9178
|
+
middleware: nt.map((e) => e.name),
|
|
9117
9179
|
todos: (W.agent?.getState?.()?.todos ?? []).map((e) => ({
|
|
9118
9180
|
id: e.id,
|
|
9119
9181
|
content: e.content,
|
|
@@ -9132,23 +9194,23 @@ function ou(e, n) {
|
|
|
9132
9194
|
spans: W.agent.spans.value,
|
|
9133
9195
|
metrics: ai(W.agent.spans.value)
|
|
9134
9196
|
} : void 0,
|
|
9135
|
-
actions:
|
|
9197
|
+
actions: Bl(e.actions ?? {}),
|
|
9136
9198
|
subagent: {
|
|
9137
|
-
enabled: !!
|
|
9199
|
+
enabled: !!V,
|
|
9138
9200
|
maxDepth: e.subagent?.maxDepth ?? 1,
|
|
9139
9201
|
maxParallel: e.subagent?.maxParallel ?? 4,
|
|
9140
9202
|
allowedTools: e.subagent?.allowedTools ?? [],
|
|
9141
|
-
subagents:
|
|
9203
|
+
subagents: ze?.get() ?? [],
|
|
9142
9204
|
active: Ae?.getActive() ?? [],
|
|
9143
9205
|
history: Ae?.getHistory() ?? []
|
|
9144
9206
|
},
|
|
9145
9207
|
verify: {
|
|
9146
|
-
enabled: !!
|
|
9208
|
+
enabled: !!He,
|
|
9147
9209
|
maxAttempts: Me ? je : 0,
|
|
9148
9210
|
adversarial: Me && !!e.verify?.adversarial
|
|
9149
9211
|
},
|
|
9150
9212
|
context: (() => {
|
|
9151
|
-
let e =
|
|
9213
|
+
let e = Ue?.getSnapshot();
|
|
9152
9214
|
if (e) {
|
|
9153
9215
|
let t = W.agent?.getState?.()?.lastCompression;
|
|
9154
9216
|
t && (e.compression = t);
|
|
@@ -9181,11 +9243,11 @@ function ou(e, n) {
|
|
|
9181
9243
|
return R ? w.getFocuses() : [];
|
|
9182
9244
|
},
|
|
9183
9245
|
setFocus(t) {
|
|
9184
|
-
let n =
|
|
9246
|
+
let n = cu(t, "setFocus", R, () => F()?.schema, e.debug);
|
|
9185
9247
|
return n.ok ? (w.setFocus(t), W.infoTick.value++, { ok: !0 }) : n;
|
|
9186
9248
|
},
|
|
9187
9249
|
addFocus(t) {
|
|
9188
|
-
let n =
|
|
9250
|
+
let n = cu(t, "addFocus", R, () => F()?.schema, e.debug);
|
|
9189
9251
|
return n.ok ? w.getFocuses().length >= 8 ? (e.debug && console.warn("[page-agent-sdk][focus] addFocus 拒绝:焦点数已达上限 8(augmentPrompt 注入每焦点子树 schema,过多致 system prompt 超预算)"), {
|
|
9190
9252
|
ok: !1,
|
|
9191
9253
|
error: "焦点数上限 8(避免 system prompt 撑爆)"
|
|
@@ -9198,14 +9260,14 @@ function ou(e, n) {
|
|
|
9198
9260
|
R && (w.clearFocus(), W.infoTick.value++);
|
|
9199
9261
|
}
|
|
9200
9262
|
};
|
|
9201
|
-
async function
|
|
9263
|
+
async function ot() {
|
|
9202
9264
|
if (!s) return;
|
|
9203
9265
|
await s.ready;
|
|
9204
9266
|
let t = e.session || {};
|
|
9205
9267
|
if (t.id) {
|
|
9206
9268
|
W.sessionId = t.id;
|
|
9207
9269
|
let e = await s.load(n, W.sessionId);
|
|
9208
|
-
e ? (W.applySnapshot(e),
|
|
9270
|
+
e ? (W.applySnapshot(e), U({
|
|
9209
9271
|
type: "session_restored",
|
|
9210
9272
|
sessionId: W.sessionId,
|
|
9211
9273
|
rounds: e.messages?.length ?? 0
|
|
@@ -9215,35 +9277,35 @@ function ou(e, n) {
|
|
|
9215
9277
|
if (e.debug && console.log("[page-agent-sdk][restore] listSessions", n, r.length, r.map((e) => e.sessionId)), r.length) {
|
|
9216
9278
|
W.sessionId = r[0].sessionId;
|
|
9217
9279
|
let t = await s.load(n, W.sessionId);
|
|
9218
|
-
t ? (W.applySnapshot(t),
|
|
9280
|
+
t ? (W.applySnapshot(t), U({
|
|
9219
9281
|
type: "session_restored",
|
|
9220
9282
|
sessionId: W.sessionId,
|
|
9221
9283
|
rounds: t.messages?.length ?? 0
|
|
9222
9284
|
}), e.debug && console.log("[page-agent-sdk][restore] 恢复会话", W.sessionId, `${t.messages?.length ?? 0} msgs`)) : e.debug && console.log("[page-agent-sdk][restore] 会话 meta 存在但快照为空", W.sessionId);
|
|
9223
9285
|
} else W.sessionId = await s.createSession(n, t.title), e.debug && console.log("[page-agent-sdk][restore] 新建会话(无历史)", W.sessionId);
|
|
9224
9286
|
} else W.sessionId = await s.createSession(n, t.title);
|
|
9225
|
-
e.memory && s.save(n, W.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }),
|
|
9287
|
+
e.memory && s.save(n, W.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }), at();
|
|
9226
9288
|
}
|
|
9227
|
-
async function
|
|
9228
|
-
await
|
|
9289
|
+
async function st() {
|
|
9290
|
+
await et();
|
|
9229
9291
|
}
|
|
9230
|
-
function
|
|
9292
|
+
function ct(e) {
|
|
9231
9293
|
let t = {};
|
|
9232
|
-
for (let n of
|
|
9294
|
+
for (let n of tu(e)) {
|
|
9233
9295
|
let e = x.files[n];
|
|
9234
9296
|
e && (t[n] = e.content);
|
|
9235
9297
|
}
|
|
9236
9298
|
return t;
|
|
9237
9299
|
}
|
|
9238
|
-
function
|
|
9239
|
-
let e =
|
|
9300
|
+
function lt() {
|
|
9301
|
+
let e = nu(x.files, tu(b));
|
|
9240
9302
|
for (let t of e) delete x.files[t];
|
|
9241
9303
|
}
|
|
9242
|
-
function
|
|
9243
|
-
let e = co(b,
|
|
9304
|
+
function ut() {
|
|
9305
|
+
let e = co(b, rt);
|
|
9244
9306
|
if (!e.trimmed) return;
|
|
9245
9307
|
let { older: t, summary: n } = e;
|
|
9246
|
-
if (
|
|
9308
|
+
if (U({
|
|
9247
9309
|
type: "context_trimmed",
|
|
9248
9310
|
dropped: t.map((e) => ({
|
|
9249
9311
|
round: e.round,
|
|
@@ -9251,22 +9313,22 @@ function ou(e, n) {
|
|
|
9251
9313
|
assistant: e.assistantMsgs.map((e) => e.content),
|
|
9252
9314
|
steps: e.assistantMsgs.flatMap((e) => e.steps ?? [])
|
|
9253
9315
|
})),
|
|
9254
|
-
vfsResults:
|
|
9316
|
+
vfsResults: ct(t.flatMap((e) => [e.userMsg, ...e.assistantMsgs])),
|
|
9255
9317
|
summary: n.content,
|
|
9256
9318
|
reason: "max_memory_rounds"
|
|
9257
|
-
}), b.splice(e.deleteFrom, e.deleteCount, n),
|
|
9319
|
+
}), b.splice(e.deleteFrom, e.deleteCount, n), lt(), g && l) {
|
|
9258
9320
|
let n = e.summary, { prevSeg: r } = e;
|
|
9259
9321
|
(async () => {
|
|
9260
9322
|
try {
|
|
9261
9323
|
let e = await l(mo(t, v)), i = b.indexOf(n);
|
|
9262
9324
|
if (i < 0) return;
|
|
9263
|
-
b[i].content = so(t, r, e),
|
|
9325
|
+
b[i].content = so(t, r, e), pt();
|
|
9264
9326
|
} catch {}
|
|
9265
9327
|
})();
|
|
9266
9328
|
}
|
|
9267
9329
|
}
|
|
9268
|
-
let
|
|
9269
|
-
function
|
|
9330
|
+
let dt, ft = !1;
|
|
9331
|
+
function pt() {
|
|
9270
9332
|
if (!W.sessionId || !s) return;
|
|
9271
9333
|
let t = JSON.parse(JSON.stringify(b));
|
|
9272
9334
|
s.save(n, W.sessionId, { messages: t });
|
|
@@ -9284,15 +9346,15 @@ function ou(e, n) {
|
|
|
9284
9346
|
s.save(n, W.sessionId, { focus: e.length ? e : null });
|
|
9285
9347
|
}
|
|
9286
9348
|
re && A && (s.save(n, W.sessionId, { checkpoints: A.exportStack() }), s.save(n, W.sessionId, { usage: i }));
|
|
9287
|
-
let a =
|
|
9288
|
-
a && a !==
|
|
9349
|
+
let a = _s(b);
|
|
9350
|
+
a && a !== dt && (dt = a, s.updateTitle(n, W.sessionId, a)), e.autoTitle !== !1 && u && !ft && b.some((e) => e.role === "user") && b.some((e) => e.role === "assistant") && (ft = !0, (async () => {
|
|
9289
9351
|
let e = await u(b);
|
|
9290
|
-
e && (await s.updateTitle(n, W.sessionId, e), await
|
|
9352
|
+
e && (await s.updateTitle(n, W.sessionId, e), await at());
|
|
9291
9353
|
})()), e.debug && console.log("[page-agent-sdk][persist] save", W.sessionId, `${b.length} msgs`);
|
|
9292
9354
|
}
|
|
9293
9355
|
return W.initDone = (async () => {
|
|
9294
|
-
if (await
|
|
9295
|
-
let t = await Promise.allSettled(e.mcp.map((e) =>
|
|
9356
|
+
if (await ot(), await st(), e.mcp?.length) {
|
|
9357
|
+
let t = await Promise.allSettled(e.mcp.map((e) => ls(e)));
|
|
9296
9358
|
W.mcpClosers = t.flatMap((e) => e.status === "fulfilled" ? [e.value.close] : []), W.mcpServers = [], t.forEach((t, n) => {
|
|
9297
9359
|
let r = e.mcp[n], i = r.name ?? r.url;
|
|
9298
9360
|
t.status === "fulfilled" ? (W.mcpServers.push({
|
|
@@ -9302,12 +9364,12 @@ function ou(e, n) {
|
|
|
9302
9364
|
}), t.value.tools.forEach((e) => I.set(e.name, `mcp:${i}`)), ue.push(...t.value.tools)) : console.warn(`[page-agent-sdk][mcp] server ${i} 连接失败:`, t.reason);
|
|
9303
9365
|
}), B = be(), e.debug && console.log(`[page-agent-sdk][mcp] 注入 ${ue.length} 个工具,${W.mcpServers.length} 个 server`);
|
|
9304
9366
|
}
|
|
9305
|
-
let t =
|
|
9367
|
+
let t = vs(e.llm) ? e.llm : await f(e.llm);
|
|
9306
9368
|
W.agent = ji({
|
|
9307
9369
|
llm: t,
|
|
9308
9370
|
systemPrompt: P,
|
|
9309
9371
|
tools: B,
|
|
9310
|
-
middleware:
|
|
9372
|
+
middleware: nt,
|
|
9311
9373
|
maxToolRounds: e.maxToolRounds,
|
|
9312
9374
|
maxRetries: e.maxRetries,
|
|
9313
9375
|
maxParallelTools: e.maxParallelTools,
|
|
@@ -9319,7 +9381,7 @@ function ou(e, n) {
|
|
|
9319
9381
|
},
|
|
9320
9382
|
onTrace: N ? (e, t) => {
|
|
9321
9383
|
try {
|
|
9322
|
-
|
|
9384
|
+
U({
|
|
9323
9385
|
type: "trace",
|
|
9324
9386
|
spans: e,
|
|
9325
9387
|
metrics: t
|
|
@@ -9327,17 +9389,17 @@ function ou(e, n) {
|
|
|
9327
9389
|
} catch {}
|
|
9328
9390
|
} : void 0,
|
|
9329
9391
|
debug: e.debug
|
|
9330
|
-
}), ee.current = W.agent,
|
|
9392
|
+
}), ee.current = W.agent, H && H.setReconfigureHook && H.setReconfigureHook(() => {
|
|
9331
9393
|
W.agent && W.agent.setTools(be());
|
|
9332
9394
|
});
|
|
9333
9395
|
})(), W;
|
|
9334
9396
|
}
|
|
9335
|
-
function
|
|
9336
|
-
let n = e.id ??
|
|
9397
|
+
function uu(e, t) {
|
|
9398
|
+
let n = e.id ?? ks();
|
|
9337
9399
|
e.id || console.warn(`[page-agent-sdk] 未传 options.id,已生成随机 id "${n}"。刷新后持久化数据无法恢复,请传稳定 id。`);
|
|
9338
|
-
let r = e.streaming ?? !0, i = e.ui ?? "default", a, o = e.shareContext ?
|
|
9339
|
-
o ? a = o : (a =
|
|
9340
|
-
let s = null, c =
|
|
9400
|
+
let r = e.streaming ?? !0, i = e.ui ?? "default", a, o = e.shareContext ? au.get(n) : void 0;
|
|
9401
|
+
o ? a = o : (a = lu(e, n), e.shareContext && au.set(n, a)), a.refCount++;
|
|
9402
|
+
let s = null, c = tc(e), l = null, u = null;
|
|
9341
9403
|
async function d(n) {
|
|
9342
9404
|
if (await a.initDone, s) {
|
|
9343
9405
|
s.show();
|
|
@@ -9379,7 +9441,7 @@ function su(e, t) {
|
|
|
9379
9441
|
function m() {
|
|
9380
9442
|
s?.show();
|
|
9381
9443
|
}
|
|
9382
|
-
let h =
|
|
9444
|
+
let h = ru();
|
|
9383
9445
|
return {
|
|
9384
9446
|
mount: d,
|
|
9385
9447
|
unmount: f,
|
|
@@ -9492,7 +9554,7 @@ function su(e, t) {
|
|
|
9492
9554
|
},
|
|
9493
9555
|
vfsWrite: (e, t) => {
|
|
9494
9556
|
let n = typeof t == "string" ? t : JSON.stringify(t);
|
|
9495
|
-
a.vfsStore.files[
|
|
9557
|
+
a.vfsStore.files[Mc(e)] = {
|
|
9496
9558
|
content: n,
|
|
9497
9559
|
updatedAt: Date.now()
|
|
9498
9560
|
};
|
|
@@ -9535,12 +9597,12 @@ function su(e, t) {
|
|
|
9535
9597
|
}
|
|
9536
9598
|
//#endregion
|
|
9537
9599
|
//#region src/core/sdk/ragSubagent.ts
|
|
9538
|
-
var
|
|
9600
|
+
var du = "你是知识检索专家。可用工具:search_docs(语义检索)/ load_doc(按 source 加载)/ vfs_grep+vfs_read(搜预注入文档)/ fetch_document(公网 URL)。\n\n工作方式:\n1. 分析任务,拆出需查证的要点(如:需要哪些组件、各自的 props 约束、UI 规范要求);\n2. 多源检索:先 vfs_grep 搜预注入文档(快、静态)→ 不够用 search_docs 语义检索 → 需特定文档用 load_doc → 公网用 fetch_document;\n3. 检索结果不足时换关键词、扩大 topK、或换源重试;\n4. 综合成结构化、可执行结论(不堆原文,提炼成可直接用于决策/配置的信息);\n5. 标注关键信息来源(文档名/段落),便于溯源;检索不到明确说「未检索到」,不编造。\n\n你是只读检索角色,不要尝试修改任何数据。", fu = "# 知识检索策略(RAG)\n\n## 多源决策树\n- vfs_grep / vfs_read:搜集成方预注入 vfs 的文档(组件文档 / UI 规范)—— 快、静态,先查\n- search_docs:语义检索(retriever 向量库)—— 模糊匹配,关键词不确定 / 语义相似时用\n- load_doc:按 source 精确加载(已知文档 id / URL / key)—— 精确取特定文档\n- fetch_document:公网 URL —— 查公开资料\n\n## 综合规范\n- 多源交叉验证(关键结论优先 ≥2 源印证,或单一权威源)\n- 标注来源(文档名 / URL / 段落),便于溯源\n- 结构化、可执行结论(组件清单 + 各自 props 约束 + 适用场景),不堆原文\n- 未检索到明确说「未检索到」,不编造;建议替代方案(改关键词 / 建议写代码组件等)\n\n## 何时用何源\n- 静态文档(组件库文档 / UI 规范):vfs_grep\n- 语义相似(「瀑布流组件」「倒计时」「拼团」):search_docs\n- 已知文档 id / URL:load_doc\n- 公开 URL(设计规范网站 / 第三方文档):fetch_document", pu = {
|
|
9539
9601
|
name: "rag-search",
|
|
9540
9602
|
description: "多源知识检索策略:vfs 预注入文档 → 语义检索 → 指定文档加载 → 公网;综合结构化结论 + 溯源",
|
|
9541
|
-
getContent: () =>
|
|
9603
|
+
getContent: () => fu
|
|
9542
9604
|
};
|
|
9543
|
-
function
|
|
9605
|
+
function mu(e, n, i) {
|
|
9544
9606
|
return r(async ({ query: e, topK: t }) => {
|
|
9545
9607
|
try {
|
|
9546
9608
|
let r = await n(e, { topK: t ?? i });
|
|
@@ -9557,7 +9619,7 @@ function du(e, n, i) {
|
|
|
9557
9619
|
})
|
|
9558
9620
|
});
|
|
9559
9621
|
}
|
|
9560
|
-
function
|
|
9622
|
+
function hu(e, n) {
|
|
9561
9623
|
return r(async ({ source: e }) => {
|
|
9562
9624
|
try {
|
|
9563
9625
|
let t = await n(e), r = Array.isArray(t) ? t : [t];
|
|
@@ -9571,11 +9633,11 @@ function fu(e, n) {
|
|
|
9571
9633
|
schema: t.object({ source: t.string().describe("文档标识(id/URL/key)") })
|
|
9572
9634
|
});
|
|
9573
9635
|
}
|
|
9574
|
-
function
|
|
9636
|
+
function gu(e) {
|
|
9575
9637
|
let { retriever: t, loader: n, useVfs: r = !0, id: i = "rag", description: a, topK: o = 5, searchToolName: s = "search_docs", loadToolName: c = "load_doc", maxToolRounds: l = 8, summarization: u, skills: d, extraTools: f } = e;
|
|
9576
9638
|
if (!t && !n && r === !1) throw Error("[page-agent-sdk][createRagSubagent] 至少配一种知识源:retriever / loader / useVfs(true)");
|
|
9577
9639
|
let p = [];
|
|
9578
|
-
t && p.push(
|
|
9640
|
+
t && p.push(mu(s, t, o)), n && p.push(hu(c, n)), f && p.push(...f);
|
|
9579
9641
|
let m = r ? [
|
|
9580
9642
|
"vfs_grep",
|
|
9581
9643
|
"vfs_read",
|
|
@@ -9584,17 +9646,17 @@ function pu(e) {
|
|
|
9584
9646
|
return {
|
|
9585
9647
|
id: i,
|
|
9586
9648
|
description: a ?? "检索知识库(组件文档/UI 规范/业务规则),返回有依据的结构化结论。需要查阅文档才能回答或决定如何配置时委派",
|
|
9587
|
-
systemPrompt:
|
|
9649
|
+
systemPrompt: du,
|
|
9588
9650
|
tools: p.length ? p : void 0,
|
|
9589
9651
|
allowedTools: m,
|
|
9590
|
-
skills: d ?? [
|
|
9652
|
+
skills: d ?? [pu],
|
|
9591
9653
|
maxToolRounds: l,
|
|
9592
9654
|
...u === void 0 ? {} : { summarization: u }
|
|
9593
9655
|
};
|
|
9594
9656
|
}
|
|
9595
9657
|
//#endregion
|
|
9596
9658
|
//#region src/core/sdk/htmlSubagent.ts
|
|
9597
|
-
function
|
|
9659
|
+
function _u(e) {
|
|
9598
9660
|
return `你是纯代码组件生成专家。可用工具:vfs_write / vfs_edit / vfs_rm(写/改/删代码到 vfs ${e}) / vfs_grep + vfs_read(读 vfs) / write + set(写 data 引用,writablePaths 限定) / read / write_todos + update_todo(规划)。
|
|
9599
9661
|
|
|
9600
9662
|
代码存储约定(重要):
|
|
@@ -9608,12 +9670,12 @@ function mu(e) {
|
|
|
9608
9670
|
3. 小段代码 vfs_write 整体写;大段用 vfs_edit 增量拼(避免单次输出超限);
|
|
9609
9671
|
4. 生成后 read(vfs 文件 + data 引用)确认结构正确;只写 writablePaths 内 data + ${e} 下 vfs。`;
|
|
9610
9672
|
}
|
|
9611
|
-
var
|
|
9673
|
+
var vu = "# 纯代码组件生成规范\n\n## 代码存储约定(重要)\n- 代码正文写 vfs:html/<name>.vue(如 html/hero.vue)\n- data 存引用:{ type:'custom', codeRef:'vfs://html/<name>.vue', name, props }\n- 改代码:vfs_edit 改 vfs 文件(data 的 codeRef 引用不变)\n\n## 何时写代码组件\n- 组件库无对应类型(高度定制交互 / 一次性特效 / 特殊布局)→ 写 custom 代码组件\n- 组件库已有(按钮 / 卡片 / 列表)→ 用现有组件配置,不重造\n\n## Vue SFC 规范\n- Vue 3 <template> + <script setup>(组合式)\n- props 用 defineProps;事件用 defineEmits\n- 只渲染 UI,不做副作用(不发请求 / 不读写 storage)\n\n## props 定义\n- 代码组件 defineProps 接受外部 data 传入(集成方渲染时按 data 的 props 字段传)\n\n## 组件库引用\n- 代码内可 import 组件库组件(如 <Button>);所用依赖以集成方渲染层已注入为准,不重复造\n\n## 安全底线(必须)\n- 禁 eval / new Function / Function 构造器\n- 禁访问 window 敏感属性(document.cookie / apiKey / token)\n- 不引入外部脚本 / CDN\n\n## 可访问性 + 语义化\n- 语义化标签(button / nav / section);图片 alt;交互可键盘聚焦\n- 颜色对比达标;不只用颜色传达信息", yu = {
|
|
9612
9674
|
name: "html-builder",
|
|
9613
9675
|
description: "纯代码组件(custom Vue SFC)生成规范:代码存 vfs+data 引用 / SFC 规范 / 安全底线 / props / 组件库引用 / 可访问性",
|
|
9614
|
-
getContent: () =>
|
|
9676
|
+
getContent: () => vu
|
|
9615
9677
|
};
|
|
9616
|
-
function
|
|
9678
|
+
function bu(e) {
|
|
9617
9679
|
let { writablePaths: t, codeVfsPrefix: n = "html/", id: r = "html", description: i, planning: a = !0, summarization: o = !0, maxToolRounds: s = 12, temperature: c = .4, skills: l, extraTools: u } = e;
|
|
9618
9680
|
if (!t?.length) throw Error("[page-agent-sdk][createHtmlSubagent] writablePaths 必填(代码组件 data 区,如 [\"components\"])");
|
|
9619
9681
|
let d = [];
|
|
@@ -9622,7 +9684,7 @@ function _u(e) {
|
|
|
9622
9684
|
return {
|
|
9623
9685
|
id: r,
|
|
9624
9686
|
description: i ?? "生成/修改纯代码组件(custom Vue SFC)。代码写 vfs,data 存引用;能规划(write_todos)+ 执行。需写代码组件或灵活定制时委派",
|
|
9625
|
-
systemPrompt:
|
|
9687
|
+
systemPrompt: _u(n),
|
|
9626
9688
|
writablePaths: t,
|
|
9627
9689
|
allowedTools: [
|
|
9628
9690
|
"vfs_write",
|
|
@@ -9634,14 +9696,14 @@ function _u(e) {
|
|
|
9634
9696
|
middleware: d.length ? d : void 0,
|
|
9635
9697
|
summarization: o === !1 ? void 0 : o,
|
|
9636
9698
|
temperature: c,
|
|
9637
|
-
skills: l ?? [
|
|
9699
|
+
skills: l ?? [yu],
|
|
9638
9700
|
maxToolRounds: s,
|
|
9639
9701
|
tools: f.length ? f : void 0
|
|
9640
9702
|
};
|
|
9641
9703
|
}
|
|
9642
9704
|
//#endregion
|
|
9643
9705
|
//#region src/core/utils/clipboard.ts
|
|
9644
|
-
async function
|
|
9706
|
+
async function xu(e) {
|
|
9645
9707
|
try {
|
|
9646
9708
|
let t = globalThis.navigator?.clipboard;
|
|
9647
9709
|
if (t && typeof t.writeText == "function") return await t.writeText(e), !0;
|
|
@@ -9659,7 +9721,7 @@ async function vu(e) {
|
|
|
9659
9721
|
}
|
|
9660
9722
|
//#endregion
|
|
9661
9723
|
//#region src/core/composables/useChat.ts
|
|
9662
|
-
function
|
|
9724
|
+
function Su(e = {}) {
|
|
9663
9725
|
let { fetchResponse: t, fetchStream: n, onPersist: r, onClear: i } = e, a = /* @__PURE__ */ _t({
|
|
9664
9726
|
messages: e.messages ?? [],
|
|
9665
9727
|
loading: !1,
|
|
@@ -9838,9 +9900,9 @@ function yu(e = {}) {
|
|
|
9838
9900
|
}
|
|
9839
9901
|
//#endregion
|
|
9840
9902
|
//#region src/core/composables/chatContext.ts
|
|
9841
|
-
var
|
|
9842
|
-
function
|
|
9843
|
-
let t =
|
|
9903
|
+
var Cu = Symbol("chatContext");
|
|
9904
|
+
function wu(e = {}) {
|
|
9905
|
+
let t = Su({
|
|
9844
9906
|
fetchResponse: e.fetchResponse,
|
|
9845
9907
|
fetchStream: e.fetchStream,
|
|
9846
9908
|
messages: e.messages,
|
|
@@ -9859,7 +9921,7 @@ function xu(e = {}) {
|
|
|
9859
9921
|
}, h = /* @__PURE__ */ Ot({}), g = (e) => h.value[e] !== !1, _ = (e) => {
|
|
9860
9922
|
h.value[e] = !g(e);
|
|
9861
9923
|
}, v = /* @__PURE__ */ Ot(!1), y = (e) => {
|
|
9862
|
-
|
|
9924
|
+
xu(e).then((e) => {
|
|
9863
9925
|
e && (v.value = !0, setTimeout(() => {
|
|
9864
9926
|
v.value = !1;
|
|
9865
9927
|
}, 1500));
|
|
@@ -9927,15 +9989,15 @@ function xu(e = {}) {
|
|
|
9927
9989
|
}
|
|
9928
9990
|
};
|
|
9929
9991
|
}
|
|
9930
|
-
function
|
|
9931
|
-
let e = Fn(
|
|
9992
|
+
function Tu() {
|
|
9993
|
+
let e = Fn(Cu);
|
|
9932
9994
|
if (!e) throw Error("useChatContext 必须在 provide(chatContextKey) 的组件子树内调用");
|
|
9933
9995
|
return e;
|
|
9934
9996
|
}
|
|
9935
9997
|
//#endregion
|
|
9936
9998
|
//#region src/core/index.headless.ts
|
|
9937
|
-
function
|
|
9938
|
-
return
|
|
9999
|
+
function Eu(e) {
|
|
10000
|
+
return uu(e);
|
|
9939
10001
|
}
|
|
9940
10002
|
//#endregion
|
|
9941
|
-
export {
|
|
10003
|
+
export { nc as CAPABILITIES, ac as CONTEXT_PRESETS, gs as CompressDecisionSchema, us as DEFAULT_SYSTEM_PROMPT, Ha as HUMAN_CONFIRM_TOOL_NAME, ti as MIN_CONTEXT_WINDOW, lo as STOP_WORDS, uc as UNSAFE_KEYS, Bl as actionsToInspectInfo, zl as actionsToTools, Jr as agentError, is as analyzeContext, bc as applyPatchToClone, xc as applyPatchToLive, qr as asAgentError, ds as buildDataPrompt, fs as buildSystemPrompt, Cu as chatContextKey, yl as commitSetToBind, ls as connectMcp, f as constructLlmFromConfig, d as constructOpenLlmSync, xu as copyText, ji as createAgent, Va as createApprovalMiddleware, wu as createChatContext, Eu as createChatSdk, Qa as createCheckpointManager, $a as createCheckpointMiddleware, Os as createConflictManager, as as createContextInspectorMiddleware, xl as createDataOps, bu as createHtmlSubagent, Ga as createHumanConfirmMiddleware, Wa as createHumanConfirmTool, Ys as createMemoryBackend, Pa as createMemoryMiddleware, u as createProxyLlm, gu as createRagSubagent, ba as createSandboxRunner, ic as createSdkEvents, ru as createSerialRunner, $s as createSessionStore, $l as createSkillStore, Fo as createSubagentMiddleware, bo as createSubagentTracker, Ro as createSubagentsMiddleware, ql as createUsageHintsMiddleware, zo as createVerifyMiddleware, Oc as createVfs, Zs as createWebStorageBackend, Go as createWriteBackCheck, hc as deepClone, Ul as defineDataToolset, Sa as defineSkill, ps as defineTool, mc as deleteByPath, _s as deriveTitle, Ui as describeSchemaNode, xi as detectGarbledToolCall, wc as diffObjects, Dl as domToStructure, kl as domTools, Hl as domToolsStatic, fo as estimateMessageTokens, po as estimateRoundTokens, X as estimateTokens, m as extractReasoningDelta, ca as extractSchemaHint, os as extractText, p as extractTextDelta, h as extractUsage, Cl as fetchDocTools, Vl as fetchTools, vl as filterByToolMode, Wi as formatConstraints, Ur as formatZodIssues, Z as getByPath, Ol as getDomTool, Ml as getEnvSummary, Fi as getSchemaAtPath, Mi as getSchemaTopKeys, ai as getTraceMetrics, $ as hashValue, mo as indexSummarize, Fl as inspectEnvTool, Il as inspectTools, vs as isChatModel, fi as isContextLengthError, Ni as isPathAllowed, Vs as isQuotaError, dc as isUnsafePath, qc as jpEval, Gr as jsonParseError, vc as limitDepth, gc as maybeParseValue, ii as offloadPassThroughChars, ri as offloadThresholdChars, ra as presets, Li as projectBySchema, Ii as projectBySchemaDeep, _c as projectFields, ho as recallRounds, Gi as renderSchemaHint, Ki as renderSchemaOverview, Ji as renderSchemaShallow, rc as resolveCapabilities, sc as resolveContextOptions, tc as resolveDialogConfig, Ds as resolveLlm, ni as resolveModelCaps, ec as resolveStorage, Cc as restoreInPlace, Sc as restoreLive, Kr as routeError, xa as runHostScript, Zc as runSandboxedScript, fc as safeMerge, jl as safeSerialize, Q as safeStringify, Yc as searchJson, Wl as selectBuiltinTools, pc as setByPath, go as shouldTriggerCompression, ia as systemPromptHelpers, uo as tokenize, Y as toolError, Pi as unwrapSchema, Su as useChat, Tu as useChatContext, e as z, Wr as zodError };
|