page-agent-sdk 3.11.0 → 3.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/README.zh-CN.md +3 -3
- package/dist/page-agent-sdk.headless.js +281 -232
- package/dist/page-agent-sdk.iife.js +117 -116
- package/dist/page-agent-sdk.js +1441 -1348
- package/dist/page-agent-sdk.umd.cjs +74 -73
- package/dist/style.css +1 -1
- package/package.json +3 -2
- package/types/index.d.ts +4 -2
|
@@ -370,7 +370,7 @@ function Fe(e) {
|
|
|
370
370
|
}
|
|
371
371
|
}
|
|
372
372
|
var Ie = /* @__PURE__ */ new WeakMap(), Le = /* @__PURE__ */ Symbol(process.env.NODE_ENV === "production" ? "" : "Object iterate"), Re = /* @__PURE__ */ Symbol(process.env.NODE_ENV === "production" ? "" : "Map keys iterate"), ze = /* @__PURE__ */ Symbol(process.env.NODE_ENV === "production" ? "" : "Array iterate");
|
|
373
|
-
function
|
|
373
|
+
function U(e, t, n) {
|
|
374
374
|
if (H && z) {
|
|
375
375
|
let r = Ie.get(e);
|
|
376
376
|
r || Ie.set(e, r = /* @__PURE__ */ new Map());
|
|
@@ -382,7 +382,7 @@ function Be(e, t, n) {
|
|
|
382
382
|
});
|
|
383
383
|
}
|
|
384
384
|
}
|
|
385
|
-
function
|
|
385
|
+
function Be(e, t, n, r, i, a) {
|
|
386
386
|
let o = Ie.get(e);
|
|
387
387
|
if (!o) {
|
|
388
388
|
Me++;
|
|
@@ -422,13 +422,13 @@ function U(e, t, n, r, i, a) {
|
|
|
422
422
|
}
|
|
423
423
|
function Ve(e) {
|
|
424
424
|
let t = /* @__PURE__ */ K(e);
|
|
425
|
-
return t === e ? t : (
|
|
425
|
+
return t === e ? t : (U(t, "iterate", ze), /* @__PURE__ */ G(e) ? t : t.map(Ot));
|
|
426
426
|
}
|
|
427
427
|
function He(e) {
|
|
428
|
-
return
|
|
428
|
+
return U(e = /* @__PURE__ */ K(e), "iterate", ze), e;
|
|
429
429
|
}
|
|
430
430
|
function Ue(e, t) {
|
|
431
|
-
return /* @__PURE__ */
|
|
431
|
+
return /* @__PURE__ */ Tt(e) ? kt(/* @__PURE__ */ wt(e) ? Ot(t) : t) : Ot(t);
|
|
432
432
|
}
|
|
433
433
|
var We = {
|
|
434
434
|
__proto__: null,
|
|
@@ -516,14 +516,14 @@ var We = {
|
|
|
516
516
|
};
|
|
517
517
|
function Ge(e, t, n) {
|
|
518
518
|
let r = He(e), i = r[t]();
|
|
519
|
-
return r !== e && !/* @__PURE__ */
|
|
519
|
+
return r !== e && !/* @__PURE__ */ G(e) && (i._next = i.next, i.next = () => {
|
|
520
520
|
let e = i._next();
|
|
521
521
|
return e.done || (e.value = n(e.value)), e;
|
|
522
522
|
}), i;
|
|
523
523
|
}
|
|
524
524
|
var Ke = Array.prototype;
|
|
525
525
|
function qe(e, t, n, r, i, a) {
|
|
526
|
-
let o = He(e), s = o !== e && !/* @__PURE__ */
|
|
526
|
+
let o = He(e), s = o !== e && !/* @__PURE__ */ G(e), c = o[t];
|
|
527
527
|
if (c !== Ke[t]) {
|
|
528
528
|
let t = c.apply(e, a);
|
|
529
529
|
return s ? Ot(t) : t;
|
|
@@ -538,7 +538,7 @@ function qe(e, t, n, r, i, a) {
|
|
|
538
538
|
return s && i ? i(u) : u;
|
|
539
539
|
}
|
|
540
540
|
function Je(e, t, n, r) {
|
|
541
|
-
let i = He(e), a = i !== e && !/* @__PURE__ */
|
|
541
|
+
let i = He(e), a = i !== e && !/* @__PURE__ */ G(e), o = n, s = !1;
|
|
542
542
|
i !== e && (a ? (s = r.length === 0, o = function(t, r, i) {
|
|
543
543
|
return s && (s = !1, t = Ue(e, t)), n.call(this, t, Ue(e, r), i, e);
|
|
544
544
|
}) : n.length > 3 && (o = function(t, r, i) {
|
|
@@ -549,7 +549,7 @@ function Je(e, t, n, r) {
|
|
|
549
549
|
}
|
|
550
550
|
function Ye(e, t, n) {
|
|
551
551
|
let r = /* @__PURE__ */ K(e);
|
|
552
|
-
|
|
552
|
+
U(r, "iterate", ze);
|
|
553
553
|
let i = r[t](...n);
|
|
554
554
|
return (i === -1 || i === !1) && /* @__PURE__ */ Et(n[0]) ? (n[0] = /* @__PURE__ */ K(n[0]), r[t](...n)) : i;
|
|
555
555
|
}
|
|
@@ -562,7 +562,7 @@ var Ze = /* @__PURE__ */ y("__proto__,__v_isRef,__isVue"), Qe = new Set(/* @__PU
|
|
|
562
562
|
function $e(e) {
|
|
563
563
|
te(e) || (e = String(e));
|
|
564
564
|
let t = /* @__PURE__ */ K(this);
|
|
565
|
-
return
|
|
565
|
+
return U(t, "has", e), t.hasOwnProperty(e);
|
|
566
566
|
}
|
|
567
567
|
var et = class {
|
|
568
568
|
constructor(e = !1, t = !1) {
|
|
@@ -582,7 +582,7 @@ var et = class {
|
|
|
582
582
|
if (t === "hasOwnProperty") return $e;
|
|
583
583
|
}
|
|
584
584
|
let o = Reflect.get(e, t, /* @__PURE__ */ q(e) ? e : n);
|
|
585
|
-
if ((te(t) ? Qe.has(t) : Ze(t)) || (r ||
|
|
585
|
+
if ((te(t) ? Qe.has(t) : Ze(t)) || (r || U(e, "get", t), i)) return o;
|
|
586
586
|
if (/* @__PURE__ */ q(o)) {
|
|
587
587
|
let e = a && P(t) ? o : o.value;
|
|
588
588
|
return r && M(e) ? /* @__PURE__ */ xt(e) : e;
|
|
@@ -596,22 +596,22 @@ var et = class {
|
|
|
596
596
|
set(e, t, n, r) {
|
|
597
597
|
let i = e[t], a = O(e) && P(t);
|
|
598
598
|
if (!this._isShallow) {
|
|
599
|
-
let r = /* @__PURE__ */
|
|
600
|
-
if (!/* @__PURE__ */
|
|
599
|
+
let r = /* @__PURE__ */ Tt(i);
|
|
600
|
+
if (!/* @__PURE__ */ G(n) && !/* @__PURE__ */ Tt(n) && (i = /* @__PURE__ */ K(i), n = /* @__PURE__ */ K(n)), !a && /* @__PURE__ */ q(i) && !/* @__PURE__ */ q(n)) return r ? (process.env.NODE_ENV !== "production" && L(`Set operation on key "${String(t)}" failed: target is readonly.`, e[t]), !0) : (i.value = n, !0);
|
|
601
601
|
}
|
|
602
602
|
let o = a ? Number(t) < e.length : D(e, t), s = Reflect.set(e, t, n, /* @__PURE__ */ q(e) ? e : r);
|
|
603
|
-
return e === /* @__PURE__ */ K(r) && s && (o ? F(n, i) &&
|
|
603
|
+
return e === /* @__PURE__ */ K(r) && s && (o ? F(n, i) && Be(e, "set", t, n, i) : Be(e, "add", t, n)), s;
|
|
604
604
|
}
|
|
605
605
|
deleteProperty(e, t) {
|
|
606
606
|
let n = D(e, t), r = e[t], i = Reflect.deleteProperty(e, t);
|
|
607
|
-
return i && n &&
|
|
607
|
+
return i && n && Be(e, "delete", t, void 0, r), i;
|
|
608
608
|
}
|
|
609
609
|
has(e, t) {
|
|
610
610
|
let n = Reflect.has(e, t);
|
|
611
|
-
return (!te(t) || !Qe.has(t)) &&
|
|
611
|
+
return (!te(t) || !Qe.has(t)) && U(e, "has", t), n;
|
|
612
612
|
}
|
|
613
613
|
ownKeys(e) {
|
|
614
|
-
return
|
|
614
|
+
return U(e, "iterate", O(e) ? "length" : Le), Reflect.ownKeys(e);
|
|
615
615
|
}
|
|
616
616
|
}, nt = class extends et {
|
|
617
617
|
constructor(e = !1) {
|
|
@@ -623,11 +623,11 @@ var et = class {
|
|
|
623
623
|
deleteProperty(e, t) {
|
|
624
624
|
return process.env.NODE_ENV !== "production" && L(`Delete operation on key "${String(t)}" failed: target is readonly.`, e), !0;
|
|
625
625
|
}
|
|
626
|
-
},
|
|
626
|
+
}, rt = /* @__PURE__ */ new tt(), it = /* @__PURE__ */ new nt(), W = /* @__PURE__ */ new nt(!0), at = (e) => e, ot = (e) => Reflect.getPrototypeOf(e);
|
|
627
627
|
function st(e, t, n) {
|
|
628
628
|
return function(...r) {
|
|
629
629
|
let i = this.__v_raw, a = /* @__PURE__ */ K(i), o = k(a), s = e === "entries" || e === Symbol.iterator && o, c = e === "keys" && o, l = i[e](...r), u = n ? at : t ? kt : Ot;
|
|
630
|
-
return !t &&
|
|
630
|
+
return !t && U(a, "iterate", c ? Re : Le), w(Object.create(l), { next() {
|
|
631
631
|
let { value: e, done: t } = l.next();
|
|
632
632
|
return t ? {
|
|
633
633
|
value: e,
|
|
@@ -652,7 +652,7 @@ function lt(e, t) {
|
|
|
652
652
|
let n = {
|
|
653
653
|
get(n) {
|
|
654
654
|
let r = this.__v_raw, i = /* @__PURE__ */ K(r), a = /* @__PURE__ */ K(n);
|
|
655
|
-
e || (F(n, a) &&
|
|
655
|
+
e || (F(n, a) && U(i, "get", n), U(i, "get", a));
|
|
656
656
|
let { has: o } = ot(i), s = t ? at : e ? kt : Ot;
|
|
657
657
|
if (o.call(i, n)) return s(r.get(n));
|
|
658
658
|
if (o.call(i, a)) return s(r.get(a));
|
|
@@ -660,15 +660,15 @@ function lt(e, t) {
|
|
|
660
660
|
},
|
|
661
661
|
get size() {
|
|
662
662
|
let t = this.__v_raw;
|
|
663
|
-
return !e &&
|
|
663
|
+
return !e && U(/* @__PURE__ */ K(t), "iterate", Le), t.size;
|
|
664
664
|
},
|
|
665
665
|
has(t) {
|
|
666
666
|
let n = this.__v_raw, r = /* @__PURE__ */ K(n), i = /* @__PURE__ */ K(t);
|
|
667
|
-
return e || (F(t, i) &&
|
|
667
|
+
return e || (F(t, i) && U(r, "has", t), U(r, "has", i)), t === i ? n.has(t) : n.has(t) || n.has(i);
|
|
668
668
|
},
|
|
669
669
|
forEach(n, r) {
|
|
670
670
|
let i = this, a = i.__v_raw, o = /* @__PURE__ */ K(a), s = t ? at : e ? kt : Ot;
|
|
671
|
-
return !e &&
|
|
671
|
+
return !e && U(o, "iterate", Le), a.forEach((e, t) => n.call(r, s(e), s(t), i));
|
|
672
672
|
}
|
|
673
673
|
};
|
|
674
674
|
return w(n, e ? {
|
|
@@ -678,25 +678,25 @@ function lt(e, t) {
|
|
|
678
678
|
clear: ct("clear")
|
|
679
679
|
} : {
|
|
680
680
|
add(e) {
|
|
681
|
-
let n = /* @__PURE__ */ K(this), r = ot(n), i = /* @__PURE__ */ K(e), a = !t && !/* @__PURE__ */
|
|
682
|
-
return r.has.call(n, a) || F(e, a) && r.has.call(n, e) || F(i, a) && r.has.call(n, i) || (n.add(a),
|
|
681
|
+
let n = /* @__PURE__ */ K(this), r = ot(n), i = /* @__PURE__ */ K(e), a = !t && !/* @__PURE__ */ G(e) && !/* @__PURE__ */ Tt(e) ? i : e;
|
|
682
|
+
return r.has.call(n, a) || F(e, a) && r.has.call(n, e) || F(i, a) && r.has.call(n, i) || (n.add(a), Be(n, "add", a, a)), this;
|
|
683
683
|
},
|
|
684
684
|
set(e, n) {
|
|
685
|
-
!t && !/* @__PURE__ */
|
|
685
|
+
!t && !/* @__PURE__ */ G(n) && !/* @__PURE__ */ Tt(n) && (n = /* @__PURE__ */ K(n));
|
|
686
686
|
let r = /* @__PURE__ */ K(this), { has: i, get: a } = ot(r), o = i.call(r, e);
|
|
687
687
|
o ? process.env.NODE_ENV !== "production" && mt(r, i, e) : (e = /* @__PURE__ */ K(e), o = i.call(r, e));
|
|
688
688
|
let s = a.call(r, e);
|
|
689
|
-
return r.set(e, n), o ? F(n, s) &&
|
|
689
|
+
return r.set(e, n), o ? F(n, s) && Be(r, "set", e, n, s) : Be(r, "add", e, n), this;
|
|
690
690
|
},
|
|
691
691
|
delete(e) {
|
|
692
692
|
let t = /* @__PURE__ */ K(this), { has: n, get: r } = ot(t), i = n.call(t, e);
|
|
693
693
|
i ? process.env.NODE_ENV !== "production" && mt(t, n, e) : (e = /* @__PURE__ */ K(e), i = n.call(t, e));
|
|
694
694
|
let a = r ? r.call(t, e) : void 0, o = t.delete(e);
|
|
695
|
-
return i &&
|
|
695
|
+
return i && Be(t, "delete", e, void 0, a), o;
|
|
696
696
|
},
|
|
697
697
|
clear() {
|
|
698
698
|
let e = /* @__PURE__ */ K(this), t = e.size !== 0, n = process.env.NODE_ENV === "production" ? void 0 : k(e) ? new Map(e) : new Set(e), r = e.clear();
|
|
699
|
-
return t &&
|
|
699
|
+
return t && Be(e, "clear", void 0, void 0, n), r;
|
|
700
700
|
}
|
|
701
701
|
}), [
|
|
702
702
|
"keys",
|
|
@@ -733,15 +733,15 @@ function yt(e) {
|
|
|
733
733
|
}
|
|
734
734
|
// @__NO_SIDE_EFFECTS__
|
|
735
735
|
function bt(e) {
|
|
736
|
-
return /* @__PURE__ */
|
|
736
|
+
return /* @__PURE__ */ Tt(e) ? e : Ct(e, !1, rt, dt, ht);
|
|
737
737
|
}
|
|
738
738
|
// @__NO_SIDE_EFFECTS__
|
|
739
739
|
function xt(e) {
|
|
740
|
-
return Ct(e, !0,
|
|
740
|
+
return Ct(e, !0, it, ft, _t);
|
|
741
741
|
}
|
|
742
742
|
// @__NO_SIDE_EFFECTS__
|
|
743
743
|
function St(e) {
|
|
744
|
-
return Ct(e, !0,
|
|
744
|
+
return Ct(e, !0, W, pt, vt);
|
|
745
745
|
}
|
|
746
746
|
function Ct(e, t, n, r, i) {
|
|
747
747
|
if (!M(e)) return process.env.NODE_ENV !== "production" && L(`value cannot be made ${t ? "readonly" : "reactive"}: ${String(e)}`), e;
|
|
@@ -754,15 +754,15 @@ function Ct(e, t, n, r, i) {
|
|
|
754
754
|
return i.set(e, s), s;
|
|
755
755
|
}
|
|
756
756
|
// @__NO_SIDE_EFFECTS__
|
|
757
|
-
function
|
|
758
|
-
return /* @__PURE__ */
|
|
757
|
+
function wt(e) {
|
|
758
|
+
return /* @__PURE__ */ Tt(e) ? /* @__PURE__ */ wt(e.__v_raw) : !!(e && e.__v_isReactive);
|
|
759
759
|
}
|
|
760
760
|
// @__NO_SIDE_EFFECTS__
|
|
761
|
-
function
|
|
761
|
+
function Tt(e) {
|
|
762
762
|
return !!(e && e.__v_isReadonly);
|
|
763
763
|
}
|
|
764
764
|
// @__NO_SIDE_EFFECTS__
|
|
765
|
-
function
|
|
765
|
+
function G(e) {
|
|
766
766
|
return !!(e && e.__v_isShallow);
|
|
767
767
|
}
|
|
768
768
|
// @__NO_SIDE_EFFECTS__
|
|
@@ -805,7 +805,7 @@ var Nt = class {
|
|
|
805
805
|
}), this._value;
|
|
806
806
|
}
|
|
807
807
|
set value(e) {
|
|
808
|
-
let t = this._rawValue, n = this.__v_isShallow || /* @__PURE__ */
|
|
808
|
+
let t = this._rawValue, n = this.__v_isShallow || /* @__PURE__ */ G(e) || /* @__PURE__ */ Tt(e);
|
|
809
809
|
e = n ? e : /* @__PURE__ */ K(e), F(e, t) && (this._rawValue = e, this._value = n ? e : Ot(e), process.env.NODE_ENV === "production" ? this.dep.trigger() : this.dep.trigger({
|
|
810
810
|
target: this,
|
|
811
811
|
type: "set",
|
|
@@ -834,7 +834,7 @@ var It = {
|
|
|
834
834
|
}
|
|
835
835
|
};
|
|
836
836
|
function Lt(e) {
|
|
837
|
-
return /* @__PURE__ */
|
|
837
|
+
return /* @__PURE__ */ wt(e) ? e : new Proxy(e, It);
|
|
838
838
|
}
|
|
839
839
|
var Rt = class {
|
|
840
840
|
constructor(e, t, n) {
|
|
@@ -873,10 +873,10 @@ function Ut(e, t = !1, n = Ht) {
|
|
|
873
873
|
function Wt(e, t, n = b) {
|
|
874
874
|
let { immediate: r, deep: i, once: a, scheduler: o, augmentJob: s, call: c } = n, l = (e) => {
|
|
875
875
|
(n.onWarn || L)("Invalid watch source: ", e, "A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.");
|
|
876
|
-
}, u = (e) => i ? e : /* @__PURE__ */
|
|
877
|
-
if (/* @__PURE__ */ q(e) ? (f = () => e.value, h = /* @__PURE__ */
|
|
876
|
+
}, u = (e) => i ? e : /* @__PURE__ */ G(e) || i === !1 || i === 0 ? Gt(e, 1) : Gt(e), d, f, p, m, h = !1, g = !1;
|
|
877
|
+
if (/* @__PURE__ */ q(e) ? (f = () => e.value, h = /* @__PURE__ */ G(e)) : /* @__PURE__ */ wt(e) ? (f = () => u(e), h = !0) : O(e) ? (g = !0, h = e.some((e) => /* @__PURE__ */ wt(e) || /* @__PURE__ */ G(e)), f = () => e.map((e) => {
|
|
878
878
|
if (/* @__PURE__ */ q(e)) return e.value;
|
|
879
|
-
if (/* @__PURE__ */
|
|
879
|
+
if (/* @__PURE__ */ wt(e)) return u(e);
|
|
880
880
|
if (A(e)) return c ? c(e, 2) : e();
|
|
881
881
|
process.env.NODE_ENV !== "production" && l(e);
|
|
882
882
|
})) : A(e) ? f = t ? c ? () => c(e, 2) : e : () => {
|
|
@@ -1328,7 +1328,7 @@ var Gn = /* @__PURE__ */ Symbol.for("v-ndc"), Kn = (e) => e ? Fr(e) ? Lr(e) : Kn
|
|
|
1328
1328
|
else Zn && (o[t] = 0);
|
|
1329
1329
|
}
|
|
1330
1330
|
let l = qn[t], u, d;
|
|
1331
|
-
if (l) return t === "$attrs" ? (
|
|
1331
|
+
if (l) return t === "$attrs" ? (U(e.attrs, "get", ""), process.env.NODE_ENV) : process.env.NODE_ENV !== "production" && t === "$slots" && U(e, "get", t), l(e);
|
|
1332
1332
|
if ((u = s.__cssModules) && (u = u[t])) return u;
|
|
1333
1333
|
if (n !== b && D(n, t)) return o[t] = 4, n[t];
|
|
1334
1334
|
if (d = c.config.globalProperties, D(d, t)) return d[t];
|
|
@@ -1652,25 +1652,25 @@ function Wr() {
|
|
|
1652
1652
|
s(n),
|
|
1653
1653
|
">"
|
|
1654
1654
|
];
|
|
1655
|
-
} else if (/* @__PURE__ */
|
|
1655
|
+
} else if (/* @__PURE__ */ wt(t)) return [
|
|
1656
1656
|
"div",
|
|
1657
1657
|
{},
|
|
1658
1658
|
[
|
|
1659
1659
|
"span",
|
|
1660
1660
|
e,
|
|
1661
|
-
/* @__PURE__ */
|
|
1661
|
+
/* @__PURE__ */ G(t) ? "ShallowReactive" : "Reactive"
|
|
1662
1662
|
],
|
|
1663
1663
|
"<",
|
|
1664
1664
|
s(t),
|
|
1665
|
-
`>${/* @__PURE__ */
|
|
1665
|
+
`>${/* @__PURE__ */ Tt(t) ? " (readonly)" : ""}`
|
|
1666
1666
|
];
|
|
1667
|
-
else if (/* @__PURE__ */
|
|
1667
|
+
else if (/* @__PURE__ */ Tt(t)) return [
|
|
1668
1668
|
"div",
|
|
1669
1669
|
{},
|
|
1670
1670
|
[
|
|
1671
1671
|
"span",
|
|
1672
1672
|
e,
|
|
1673
|
-
/* @__PURE__ */
|
|
1673
|
+
/* @__PURE__ */ G(t) ? "ShallowReadonly" : "Readonly"
|
|
1674
1674
|
],
|
|
1675
1675
|
"<",
|
|
1676
1676
|
s(t),
|
|
@@ -1762,7 +1762,7 @@ function Wr() {
|
|
|
1762
1762
|
if (O(r) && r.includes(t) || M(r) && t in r || e.extends && l(e.extends, t, n) || e.mixins && e.mixins.some((e) => l(e, t, n))) return !0;
|
|
1763
1763
|
}
|
|
1764
1764
|
function u(e) {
|
|
1765
|
-
return /* @__PURE__ */
|
|
1765
|
+
return /* @__PURE__ */ G(e) ? "ShallowRef" : e.effect ? "ComputedRef" : "Ref";
|
|
1766
1766
|
}
|
|
1767
1767
|
window.devtoolsFormatters ? window.devtoolsFormatters.push(i) : window.devtoolsFormatters = [i];
|
|
1768
1768
|
}
|
|
@@ -3250,15 +3250,15 @@ var pa = {
|
|
|
3250
3250
|
subagent: !1
|
|
3251
3251
|
} }
|
|
3252
3252
|
};
|
|
3253
|
-
function ma(e) {
|
|
3254
|
-
let
|
|
3253
|
+
function ma(e, t = "code") {
|
|
3254
|
+
let n = `use_${e}`;
|
|
3255
3255
|
return [
|
|
3256
|
-
`【执行纪律(最重要)】收到代码组件任务后:**新建类直接委派**(追加组件无需通读/翻页现有数组,子 agent 自会采样一个组件看结构)→ 修改类才 read 定位(by name)→ 调 ${
|
|
3256
|
+
`【执行纪律(最重要)】收到代码组件任务后:**新建类直接委派**(追加组件无需通读/翻页现有数组,子 agent 自会采样一个组件看结构)→ 修改类才 read 定位(by name)→ 调 ${n} 委派 → read 核对 → 回复用户。**中间绝不输出过渡性文字** —— 「我先看看…」「稍后委派」「接下来我会…」这类计划性回复等于任务没做就结束了(回复即本轮终止);所有调研和委派在本轮内连续完成,完成后才回复总结。`,
|
|
3257
3257
|
"【产物形态】每个组件是完整、自包含的 HTML 页面(含 style/script,可独立成页);你只负责委派和收尾,不关心宿主如何渲染(v-html / iframe / SFC 是集成方的事)。",
|
|
3258
|
-
`【主 agent 职责边界(硬规则)】禁止直接 read/write 代码组件的
|
|
3259
|
-
`【多组件逐个委派(防上下文污染)】一次要多个组件:① write_todos 列出(每项 name + 要点)② 逐个委派 —— 每组件一次 ${
|
|
3260
|
-
`【委派 task 规格化(收窄子 agent 决策,防开放任务致装饰穷举)】委派 ${
|
|
3261
|
-
`【委派失败重试】${
|
|
3258
|
+
`【主 agent 职责边界(硬规则)】禁止直接 read/write 代码组件的 ${t} 字段(read 只得 <code Nkb> 摘要没用;write 绕过 vfs/verify 危险)—— 生成/修改/排查代码一律经 ${n},收尾 read 核对。`,
|
|
3259
|
+
`【多组件逐个委派(防上下文污染)】一次要多个组件:① write_todos 列出(每项 name + 要点)② 逐个委派 —— 每组件一次 ${n},task 只写该组件(name + 要点 + 主题/风格),勿一次委派多个(同一子 agent 共享上下文生成多个 → class/样式冲突污染)③ 每次返回 read 核对(确认已生成 + 名称对)+ update_todo 标完成 ④ 主题/风格在每次 task 里转述(每个子 agent 全新上下文,不知其他组件)。`,
|
|
3260
|
+
`【委派 task 规格化(收窄子 agent 决策,防开放任务致装饰穷举)】委派 ${n} 的 task 必须含:① 组件定位(by name)② 视觉风格(配色/质感/字体;**给 1-2 个具体视觉锚** —— 主色 hex **取自平台 UI/设计规范 skill 的定义值**(有规范类 skill 先 load 再引用其 hex,勿凭页面观察自造近似色;无规范才自定,如「金黄 #F7C948」)、主体占比(如「杯高约画布 60%」)或装饰密度(如「仅 2 类背景装饰」)—— 细节空间收窄,子 agent 不在装饰细节上展开推演)③ 内容(文案/数据/图)④ 交互意图(动效/状态/触发)⑤ 历史偏好(可选):聊天上下文中有与该组件相关的用户历史偏好/反馈(如「用户偏好深色系」「上轮嫌动画太快」),提炼一句附 task 末尾(新子 agent 无记忆,全靠 task);**不含技术实现**(SVG vs CSS / keyframes vs transition 归子 agent 选)。❌「生成啤酒杯动画」→ ✅「啤酒杯倒酒(beer):金黄啤酒 #F7C948 从上方倒入透明杯(杯高约画布 60%),深绿背景,液体循环下落 2s,hover 杯子放大」。规格简练(4 要素各半句),远省子 agent 思考 token。`,
|
|
3261
|
+
`【委派失败重试】${n} 返回乱码/内部标记(如 <|DSML|)/空结论或报错 = 子 agent 异常,**重新委派一次**(task 附「上次失败,这次先把代码写短些/分步」);连续两次失败才降级告知用户。**不要因此自己直接 write/edit ${t} 字段**(绕过 vfs/格式校验,且你拿不到规范全文)。`,
|
|
3262
3262
|
"【预算将尽暂停】组件很多、接近工具轮次上限不要硬扛:完成手头这个后报告「已生成 K/N,还剩 M 个」,等用户确认后从 todos 剩余项继续(勿重复已完成)。"
|
|
3263
3263
|
].join("\n");
|
|
3264
3264
|
}
|
|
@@ -3273,12 +3273,12 @@ var ha = {
|
|
|
3273
3273
|
"6. 写入若触发乐观锁冲突(返回 VERSION_CONFLICT 或工具挂起等用户决定):等工具返回结果后按其指示继续(保留外部值 → 重新 read 再改;已覆盖/已回退 → 基于结果重写),不要放弃任务。"
|
|
3274
3274
|
].join("\n"),
|
|
3275
3275
|
htmlPageOrchestrator: ma("html"),
|
|
3276
|
-
htmlPageProposeFirst: ["【新建/创意类请求】先用简短文字给出 2~3 套方案(每套一两句风格/配色/结构要点),询问用户选哪套;选定前不要委派生成代码、不要写 components。", "
|
|
3276
|
+
htmlPageProposeFirst: ["【新建/创意类请求】先用简短文字给出 2~3 套方案(每套一两句风格/配色/结构要点),询问用户选哪套;选定前不要委派生成代码、不要写 components。", "【方案切换】已生成某套方案后改选另一套:不重新罗列,直接依据之前描述重新委派生成并覆盖相应组件(委派工具见编排段 use_<id>)。"].join("\n"),
|
|
3277
3277
|
htmlDirectWriteFallback: [
|
|
3278
|
-
"【纯代码组件 · 你直接写】当前未配备 html 子 agent
|
|
3279
|
-
"【HTML
|
|
3280
|
-
"
|
|
3281
|
-
"【质量自检】无格式校验门禁,写完自查标签闭合 /
|
|
3278
|
+
"【纯代码组件 · 你直接写】当前未配备 html 子 agent,纯代码组件的代码字段(code,以 schema 声明为准)由你直接 write(普通字段,经 schema 校验 + 乐观锁 + 快照栈,与改其他字段无异;无 vfs 工作副本 / 无格式校验门禁)。",
|
|
3279
|
+
"【HTML 生成规范】代码字段必须是完整、自包含的 HTML 页面(含 <style>/<script>,可独立成页):标签正确闭合、style/script 集中放置(如 <head> 内)、class 加前缀防冲突;可引外部 JS/CSS(CDN/字体)。安全底线:禁 eval/new Function、不引可疑外部脚本、不访问 document.cookie 等敏感属性。",
|
|
3280
|
+
"【修改而非重写】改已有代码:先 read({jsonPath}) 取当前代码字段 → 基于当前值增量改(只动要改的部分,如换配色/文案/某段结构),不要整体重写整个代码字段(易丢已有内容、token 浪费)。",
|
|
3281
|
+
"【质量自检】无格式校验门禁,写完自查标签闭合 / 结构完整;代码进 data 由集成方渲染层(v-html/iframe)呈现。如需代码资产机制(vfs 工作副本 + 格式校验 + 增量 commit),注册 createHtmlSubagent。"
|
|
3282
3282
|
].join("\n")
|
|
3283
3283
|
}, ga = 15, _a = 4e3, va = /* @__PURE__ */ new WeakMap();
|
|
3284
3284
|
function ya(e, t) {
|
|
@@ -3353,7 +3353,7 @@ function wa(e = [], n = {}) {
|
|
|
3353
3353
|
name: "todos",
|
|
3354
3354
|
tools: [r(async ({ todos: e }) => {
|
|
3355
3355
|
if (!s) s = !0, c = 1;
|
|
3356
|
-
else if (c > l) return `规划阶段已达上限(${l} 轮,现在已是第 ${c} 版计划)。停止调研/修订,基于当前清单开始执行(用 write
|
|
3356
|
+
else if (c > l) return `规划阶段已达上限(${l} 轮,现在已是第 ${c} 版计划)。停止调研/修订,基于当前清单开始执行(用 write 落地;advanced 模式亦可用 set_data/edit_data)。当前清单:\n${i.map((e, t) => `${t + 1}. #${e.id} [${e.status}] ${e.content}`).join("\n") || "(空)"}`;
|
|
3357
3357
|
return i = Sa(e), `已更新任务清单:${i.length} 项\n${i.map((e, t) => `${t + 1}. #${e.id} [${e.status}] ${e.content}`).join("\n")}`;
|
|
3358
3358
|
}, {
|
|
3359
3359
|
name: "write_todos",
|
|
@@ -3697,7 +3697,7 @@ function Ya(e, t) {
|
|
|
3697
3697
|
return Array.isArray(a) && Number(i) >= a.length;
|
|
3698
3698
|
}
|
|
3699
3699
|
function Xa(e) {
|
|
3700
|
-
let t = e.initialFocuses ? [...e.initialFocuses] : [], n = () => e.onChange?.([...t]);
|
|
3700
|
+
let t = e.initialFocuses ? [...e.initialFocuses] : [], n = () => e.onChange?.([...t]), r = e.unfocusGuidance ?? "tool", i = r === "tool" ? "需改其他组件请先 remove_focus / clear_focus 或换焦点。" : r === "ask-user" ? "焦点由用户在输入框设定与移除(聚焦 chip ✕);用户要求改其他组件时,提示用户移除聚焦后重试,勿尝试写焦点外(会被拒)。" : "需改其他组件时,在收口回复中说明需先取消焦点(焦点由主会话管理),勿尝试越界写。", a = r === "tool" ? "请先 remove_focus / clear_focus 或换焦点后重试。" : r === "ask-user" ? "焦点由用户在输入框管理,请提示用户移除输入框中的聚焦 chip 后重试(当前模式无 focus 工具)。" : "请只改焦点子树;需改其他组件时,在收口回复中说明需先取消焦点。";
|
|
3701
3701
|
return {
|
|
3702
3702
|
name: "focus",
|
|
3703
3703
|
beforeAgent: () => t.length ? {
|
|
@@ -3709,7 +3709,7 @@ function Xa(e) {
|
|
|
3709
3709
|
let n = [
|
|
3710
3710
|
"## 当前精修目标",
|
|
3711
3711
|
t.map((e) => `· ${e.path}${e.label ? `(${e.label})` : ""}`).join("\n"),
|
|
3712
|
-
`仅操作上述 ${t.length} 个聚焦子树${t.length > 1 ? "之一" : ""}
|
|
3712
|
+
`仅操作上述 ${t.length} 个聚焦子树${t.length > 1 ? "之一" : ""},用户未指明目标的指令默认作用于聚焦组件;不要改动其他组件;${i}`
|
|
3713
3713
|
], r = e.getSchema();
|
|
3714
3714
|
if (r) {
|
|
3715
3715
|
let e = t.map((e) => {
|
|
@@ -3722,21 +3722,21 @@ function Xa(e) {
|
|
|
3722
3722
|
},
|
|
3723
3723
|
wrapToolCall: async (n, r) => {
|
|
3724
3724
|
if (t.length) {
|
|
3725
|
-
let i = t.map((e) => e.label ? `${e.path}(${e.label})` : e.path).join(", "),
|
|
3726
|
-
content: `PATH_DENIED · 聚焦越界:当前聚焦 [${i}],不可操作「${e}
|
|
3725
|
+
let i = t.map((e) => e.label ? `${e.path}(${e.label})` : e.path).join(", "), o = (e) => ({
|
|
3726
|
+
content: `PATH_DENIED · 聚焦越界:当前聚焦 [${i}],不可操作「${e}」。${a}`,
|
|
3727
3727
|
status: "error"
|
|
3728
3728
|
});
|
|
3729
3729
|
if (n.name === "eval_script") {
|
|
3730
3730
|
if (n.args?.mode !== "transform") return r(n);
|
|
3731
3731
|
let i = qa(n.args);
|
|
3732
|
-
if (!i.length) return
|
|
3733
|
-
for (let n of i) if (!t.some((e) => Ja(n, e.path)) && !Ya(n, e.getBind?.())) return
|
|
3732
|
+
if (!i.length) return o("(整体数据)");
|
|
3733
|
+
for (let n of i) if (!t.some((e) => Ja(n, e.path)) && !Ya(n, e.getBind?.())) return o(n);
|
|
3734
3734
|
return r(n);
|
|
3735
3735
|
}
|
|
3736
3736
|
if (Ka.has(n.name)) {
|
|
3737
3737
|
let r = qa(n.args);
|
|
3738
|
-
if (!r.length) return
|
|
3739
|
-
for (let n of r) if (!t.some((e) => Ja(n, e.path)) && !Ya(n, e.getBind?.())) return
|
|
3738
|
+
if (!r.length) return o("(整体数据)");
|
|
3739
|
+
for (let n of r) if (!t.some((e) => Ja(n, e.path)) && !Ya(n, e.getBind?.())) return o(n);
|
|
3740
3740
|
}
|
|
3741
3741
|
}
|
|
3742
3742
|
return r(n);
|
|
@@ -4841,7 +4841,8 @@ async function Cs(e, t, n, r, i, a) {
|
|
|
4841
4841
|
})] : [], p = t.getFocuses?.() ?? [], m = p.length ? Xa({
|
|
4842
4842
|
getSchema: t.getSchema ?? (() => null),
|
|
4843
4843
|
getBind: t.getBind,
|
|
4844
|
-
initialFocuses: p
|
|
4844
|
+
initialFocuses: p,
|
|
4845
|
+
unfocusGuidance: "report-parent"
|
|
4845
4846
|
}) : void 0, h = t.getVfsFiles ? {
|
|
4846
4847
|
name: "vfs-bridge",
|
|
4847
4848
|
beforeAgent: () => ({ files: t.getVfsFiles() })
|
|
@@ -6214,7 +6215,7 @@ function Oc(e) {
|
|
|
6214
6215
|
break;
|
|
6215
6216
|
}
|
|
6216
6217
|
}
|
|
6217
|
-
return `## 组件代码文件地图(改组件时按 name 直接改对应 vfs 文件;框架自动 checkout/commit)${c ? "\n📝 笔记 = 前任维护者交接(设计决策/用户反馈/踩坑)
|
|
6218
|
+
return `## 组件代码文件地图(改组件时按 name 直接改对应 vfs 文件;框架自动 checkout/commit)${c ? "\n📝 笔记 = 前任维护者交接(设计决策/用户反馈/踩坑),改该组件时遵循;收口回复末行必须附一行 [note] 交接笔记(本组件本次的实现要点),框架存进组件转交下任" : ""}\n${i.join("\n")}${l}`;
|
|
6218
6219
|
},
|
|
6219
6220
|
wrapToolCall: async (e, i) => {
|
|
6220
6221
|
let a = e.name === "vfs_write" || e.name === "vfs_edit" || e.name === "vfs_rm" ? e.args?.path : void 0, s = typeof a == "string" ? uc(a) : void 0, c = typeof s == "string" && s.startsWith(n);
|
|
@@ -6225,7 +6226,7 @@ function Oc(e) {
|
|
|
6225
6226
|
if (e.size) {
|
|
6226
6227
|
let t = Tc(s, n);
|
|
6227
6228
|
if (t && !e.has(t)) return {
|
|
6228
|
-
content: `PATH_DENIED · vfs 越界:当前聚焦代码文件 [${[...e].map((e) => `${n}${e}.${r}`).join(", ")}],你要改的 "${s}"
|
|
6229
|
+
content: `PATH_DENIED · vfs 越界:当前聚焦代码文件 [${[...e].map((e) => `${n}${e}.${r}`).join(", ")}],你要改的 "${s}" 不在其中。请只改焦点组件的代码文件;如需改其他组件,请在收口回复中说明需先取消聚焦(焦点由主会话/用户管理,你无 focus 工具)后重试。`,
|
|
6229
6230
|
status: "error"
|
|
6230
6231
|
};
|
|
6231
6232
|
}
|
|
@@ -6284,27 +6285,27 @@ function Oc(e) {
|
|
|
6284
6285
|
}
|
|
6285
6286
|
//#endregion
|
|
6286
6287
|
//#region src/core/sdk/htmlSubagent.ts
|
|
6287
|
-
function kc(e) {
|
|
6288
|
-
let
|
|
6288
|
+
function kc(e, t, n) {
|
|
6289
|
+
let r = "html";
|
|
6289
6290
|
return `你是纯代码组件生成专家。可用工具:vfs_write / vfs_edit / vfs_rm(写/改/删代码工作副本 vfs ${e}) / vfs_read + vfs_grep(读 vfs) / validate_code(代码格式自检) / write(写 data,writablePaths 限定;set/patch 增量或整体) / read / write_todos + update_todo(规划)。
|
|
6290
6291
|
|
|
6291
6292
|
收 task 规格照做(减少你自己的思考纠结):task 含视觉(配色/质感)+ 内容(文案/数据)+ 交互(动效/触发)规格时,**照规格实现**(技术实现 SVG vs CSS / keyframes vs transition 自行选成熟模式,不穷举);task 缺规格(主 agent 漏写)时,按字面意图选**一个简单方案**直接实现,不纠结「该用什么风格」—— 主 agent 掌整页主题协调,你负责落地。
|
|
6292
6293
|
|
|
6293
6294
|
代码作为数据资产(重要):
|
|
6294
|
-
- 代码正文是 data 的
|
|
6295
|
-
- vfs 是编辑工作副本:框架在每次委派开始时自动把 data
|
|
6295
|
+
- 代码正文是 data 的 ${t} 字段(资产,随 data json 进服务端 DB);UI 直接绑 data.${t} 渲染
|
|
6296
|
+
- vfs 是编辑工作副本:框架在每次委派开始时自动把 data.${t} 检出到 vfs(${e}<__pgId>.${r}),你改 vfs,委派结束框架自动把改过的 vfs 增量回写 data.${t}
|
|
6296
6297
|
- __pgId 是框架管的内部字段(组件稳定映射键):read 看不到、write 写不进,你别碰
|
|
6297
6298
|
|
|
6298
6299
|
两条工作路径:
|
|
6299
|
-
- **修改已有组件**(改颜色/文案/布局等):必经 vfs —— 上下文有「组件代码文件地图」(name → vfs 路径),按 name 找到对应文件直接 vfs_edit 增量改目标片段 → validate_code 自检;框架自动回写 data
|
|
6300
|
-
- **新建组件**:write({ patch:{ op:'set', jsonPath:'
|
|
6300
|
+
- **修改已有组件**(改颜色/文案/布局等):必经 vfs —— 上下文有「组件代码文件地图」(name → vfs 路径),按 name 找到对应文件直接 vfs_edit 增量改目标片段 → validate_code 自检;框架自动回写 data.${t}。勿直接 write data.${t} 改已有组件(绕过 vfs/verify,且无增量友好);文件未检出时先 vfs_write 创建
|
|
6301
|
+
- **新建组件**:write({ patch:{ op:'set', jsonPath:'${n}.N', value:{...} } }) —— value 按 data schema **全字段写**(含全部必填字段 —— 字段名以样本为准照抄,如类型/名称,外加 ${t} 代码正文;缺必填字段会被 schema 拒)。调研**只看一个样本**:read({jsonPath:'${n}', offset:0, limit:1}) 取首个元素照抄字段名即可(**禁止分页逐个翻完整数组**,大数组翻页纯烧轮次;也不要 describe_data/schema_data 反复查);N = 数组长度(追加到末尾,read 返回的 total/length 即是)。框架自动补 __pgId。**固定流程**:直接 write data → validate_code({jsonPath:'${n}.N.${t}'}) 自检(从 data 读刚写的代码,零重传 content)→ read 确认;**不必手动 vfs_write 建工作副本**(框架下次委派自动 checkout;仅当本次委派内还要继续精修它,才 vfs_write 建副本再 vfs_edit)。**校验方式**:新建组件用 jsonPath(零重传)/ 修改组件用 path(vfs 文件)/ content 仅兜底;**禁止在思考里权衡「content 太长 / 要不要重传 / 先 vfs_write 再 by path」**,选对应方式一次校验即收口(为之纠结反费更多 token,真实复盘子 agent 曾在此循环 10+ 回合致整页超时)。**${t} 字段直接写完整代码字符串,换行/引号照常写,无需手工 JSON 转义**
|
|
6301
6302
|
|
|
6302
6303
|
焦点精修(若继承到主 agent 焦点):
|
|
6303
|
-
- 上下文若提示「当前精修目标」(如
|
|
6304
|
+
- 上下文若提示「当前精修目标」(如 ${n}.2),说明主 agent 聚焦了某组件 → 你**只能改该焦点组件**的代码文件(vfs 文件 ${e}<焦点组件 __pgId>.${r});改其他组件的代码文件会被 PATH_DENIED 硬拦
|
|
6304
6305
|
- 直接改焦点组件文件,不要尝试改其他组件(浪费轮次);聚焦模式下也不能新建组件(数据写被拦)—— 若 task 要新建,反馈主 agent 需先取消焦点
|
|
6305
6306
|
|
|
6306
6307
|
代码形态规则:
|
|
6307
|
-
${`- 输出形态:完整、自包含的 HTML 页面(.${
|
|
6308
|
+
${`- 输出形态:完整、自包含的 HTML 页面(.${r},可独立成页)`}
|
|
6308
6309
|
|
|
6309
6310
|
输出要求(生成完整、自包含、能独立成页的 HTML):
|
|
6310
6311
|
- 产物是**完整、自包含的 HTML 页面**(结构完整、标签闭合、交互逻辑用 <script>),能独立正确渲染
|
|
@@ -6315,7 +6316,7 @@ ${`- 输出形态:完整、自包含的 HTML 页面(.${t},可独立成页)`}
|
|
|
6315
6316
|
|
|
6316
6317
|
诚实交付:
|
|
6317
6318
|
- 按用户需求产出完整 HTML 页面。若某需求无法实现,结论简短说明(不展开权衡、不解释渲染原理)。禁止假装实现了未做到的特性。
|
|
6318
|
-
-
|
|
6319
|
+
- 收尾回复末尾附 1 行交接笔记(格式见文末「收口格式」,**必守**)。
|
|
6319
6320
|
|
|
6320
6321
|
工作方式:
|
|
6321
6322
|
1. 中等任务(多组件 / 大段代码)先 write_todos 拆解:read 看现有结构 → 规划各组件 → 逐个改/建 → read 确认。**todo 工具约束**:write_todos 是整表替换(一次列全),update_todo 是增量(标完成/改状态);两者**不可在同一轮混用**(一轮内只用一种,否则被拒),别再同轮重试另一种;
|
|
@@ -6332,14 +6333,55 @@ ${`- 输出形态:完整、自包含的 HTML 页面(.${t},可独立成页)`}
|
|
|
6332
6333
|
- **机械决定一次定**:写法选择(read 回读 vs 复制、vfs 草稿 vs 直写 data、并行 vs 串行)快速选一个,**不在思考里反复权衡 token 成本**(为之纠结反更费 token)。
|
|
6333
6334
|
- **禁止在思考里整段写出完整代码草稿**:CSS/JS/HTML 代码只写进 write / vfs_write / vfs_edit 工具调用(代码只出现一次);思考里只做高层设计(结构 / 字段 / 方案选择),不要先逐行预写一遍代码再在工具里重复一遍 —— 那会让代码 token 翻倍。
|
|
6334
6335
|
- **终稿纪律(一次写成)**:动手前要点清单一次定稿(≤10 条:结构 + DOM 分层/z-index + 关键尺寸 + 动画时序),清单齐了**直接在工具调用里写终稿**;① 不先写一版再推翻重写第二版(整段重写 = 代码 token 翻倍,写前多花 30 秒把清单想齐);② 同一几何/层级约束(bottom 定位/遮挡/z-index)**只推演一次**,不重复推导第二遍;③ 写完发现小问题(遮挡/重叠/命名),只改那一处,不重写整段。
|
|
6335
|
-
-
|
|
6336
|
-
- 一次想清楚 → 动手 → 验证 →
|
|
6336
|
+
- **代码字符串不纠结转义**:代码字段(${t})/ content 参数就是普通字符串,直接写完整代码文本(换行、引号照常写),不要纠结「\n」转义、单双引号、字面换行会不会被拒 —— 框架自动序列化,反复权衡纯属浪费 token。
|
|
6337
|
+
- 一次想清楚 → 动手 → 验证 → 收口。**思考是手段不是目的,产出代码才是**。
|
|
6338
|
+
8. **收口格式(必守,最后一行)**:收口回复 = 简短结果总结 + **末行交接笔记** \`[note] <一句话实现要点>\` —— 关键设计决策 / 用户偏好 / 踩坑(如「[note] 液面用 height keyframes 4.2s 循环;装饰仅灯串+光斑 2 类」)。框架只识别末尾 [note] 行存进组件、自动转交下次维护该组件的子 agent;**漏写 = 下任失去交接**(真 LLM 实测漏写率 3/4,务必末行带上)。一行内,只写可复用结论。`;
|
|
6339
|
+
}
|
|
6340
|
+
function Ac(e, t) {
|
|
6341
|
+
return `# HTML 完整页面生成规范
|
|
6342
|
+
|
|
6343
|
+
## 代码资产模型(重要)
|
|
6344
|
+
- 代码正文是 data 的 ${t} 字段(资产,随 data json 进服务端 DB);UI 绑 data.${t} 渲染
|
|
6345
|
+
- vfs 是编辑工作副本:框架自动 checkout(data.${t}→vfs)/ commit(vfs→data.${t}),你只改 vfs
|
|
6346
|
+
- __pgId 框架管(read 看不到、write 写不进),别碰
|
|
6347
|
+
|
|
6348
|
+
## 两条工作路径
|
|
6349
|
+
- 修改已有组件:必经 vfs —— 按上下文「组件代码文件地图」(name → vfs 路径)定位文件,vfs_edit 增量改 → validate_code;勿直接 write data.${t};文件未检出先 vfs_write 创建
|
|
6350
|
+
- 新建组件:write({patch:{op:'set',jsonPath:'${e}.N',value:{...}}}) —— value 按 schema 全字段写(必填字段不能漏,字段名以样本为准;调研只 read({jsonPath:'${e}',offset:0,limit:1}) 看一个样本照抄字段名,勿分页翻全量数组),框架补 __pgId。固定流程 write → validate_code({jsonPath:'${e}.N.${t}'})(零重传 content)→ read 确认,**不手动 vfs_write 建副本**(框架下次委派自动 checkout)。${t} 字段直接写完整代码字符串,换行/引号照常写,无需手工 JSON 转义
|
|
6351
|
+
|
|
6352
|
+
## 焦点精修(继承主 agent 焦点时)
|
|
6353
|
+
- 上下文提示「当前精修目标」(如 ${e}.2)→ 只改该焦点组件的代码文件;改其他组件会被 PATH_DENIED 硬拦
|
|
6354
|
+
- 聚焦模式不能新建组件(数据写被拦),要新建先反馈主 agent 取消焦点
|
|
6355
|
+
|
|
6356
|
+
## 输出:完整、自包含、能独立成页的 HTML
|
|
6357
|
+
- 产物是**完整、自包含的 HTML 页面**(结构完整、标签闭合),能独立正确渲染。下游改造(抽 body / 包组件 / 片段化)由插件或 tool 做,不是你的事
|
|
6358
|
+
- **交互逻辑默认用 <script> 实现**(完整页面含 script 是常态);仅当用户明确要求「纯 CSS / 不要 script」时不写
|
|
6359
|
+
- **CSS 用 <style> 块、script 用 <script> 块集中放置**(如 <head> 内),不散落内联 —— 便于下游工具提取成独立 html/css/js
|
|
6360
|
+
- 可引入外部 JS / CSS(CDN 组件库、字体、外链样式)按需使用;class 统一加前缀防冲突(如 .pg-hero-…)
|
|
6361
|
+
|
|
6362
|
+
## 标签闭合(必须)
|
|
6363
|
+
- 非自闭合标签必须成对闭合(<img> / <br> / <input> 等 void 元素除外)
|
|
6364
|
+
- 每次生成/修改后调 validate_code 自检(只校验结构合法性),报错用 vfs_edit 修正直到通过
|
|
6365
|
+
|
|
6366
|
+
## 何时写代码组件
|
|
6367
|
+
- 组件库无对应类型(高度定制布局 / 一次性专题页 / 特殊视觉效果)→ 写完整 HTML 页面
|
|
6368
|
+
- 组件库已有(按钮 / 卡片 / 列表)→ 用现有组件配置,不重造
|
|
6369
|
+
|
|
6370
|
+
## 安全底线(必须)
|
|
6371
|
+
- 禁 eval / new Function / Function 构造器
|
|
6372
|
+
- 禁访问 window 敏感属性(document.cookie / apiKey / token)
|
|
6373
|
+
|
|
6374
|
+
## 可访问性 + 语义化
|
|
6375
|
+
- 语义化标签(button / nav / section);图片 alt;交互可键盘聚焦
|
|
6376
|
+
- 颜色对比达标;不只用颜色传达信息`;
|
|
6377
|
+
}
|
|
6378
|
+
function jc(e = "components", t = "code") {
|
|
6379
|
+
return {
|
|
6380
|
+
name: "html-fragment",
|
|
6381
|
+
description: "完整 HTML 页面生成规范:代码作为 data 资产 / vfs 工作副本 / 完整自包含可独立成页 / script+CSS 集中放置 / 可引外部 JS/CSS / validate_code 自检 / 安全底线 / 可访问性",
|
|
6382
|
+
getContent: () => Ac(e, t)
|
|
6383
|
+
};
|
|
6337
6384
|
}
|
|
6338
|
-
var Ac = "# HTML 完整页面生成规范\n\n## 代码资产模型(重要)\n- 代码正文是 data 的 code 字段(资产,随 data json 进服务端 DB);UI 绑 data.code 渲染\n- vfs 是编辑工作副本:框架自动 checkout(data.code→vfs)/ commit(vfs→data.code),你只改 vfs\n- __pgId 框架管(read 看不到、write 写不进),别碰\n\n## 两条工作路径\n- 修改已有组件:必经 vfs —— 按上下文「组件代码文件地图」(name → vfs 路径)定位文件,vfs_edit 增量改 → validate_code;勿直接 write data.code;文件未检出先 vfs_write 创建\n- 新建组件:write({patch:{op:'set',jsonPath:'components.N',value:{...}}}) —— value 按 schema 全字段写(必填字段如 type 不能漏;调研只 read({jsonPath:'components',offset:0,limit:1}) 看一个样本照抄字段名,勿分页翻全量数组),框架补 __pgId。固定流程 write → validate_code({jsonPath:'components.N.code'})(零重传 content)→ read 确认,**不手动 vfs_write 建副本**(框架下次委派自动 checkout)。code 字段直接写完整代码字符串,换行/引号照常写,无需手工 JSON 转义\n\n## 焦点精修(继承主 agent 焦点时)\n- 上下文提示「当前精修目标」(如 components.2(banner))→ 只改该焦点组件的代码文件;改其他组件会被 PATH_DENIED 硬拦\n- 聚焦模式不能新建组件(数据写被拦),要新建先反馈主 agent 取消焦点\n\n## 输出:完整、自包含、能独立成页的 HTML\n- 产物是**完整、自包含的 HTML 页面**(结构完整、标签闭合),能独立正确渲染。下游改造(抽 body / 包组件 / 片段化)由插件或 tool 做,不是你的事\n- **交互逻辑默认用 <script> 实现**(完整页面含 script 是常态);仅当用户明确要求「纯 CSS / 不要 script」时不写\n- **CSS 用 <style> 块、script 用 <script> 块集中放置**(如 <head> 内),不散落内联 —— 便于下游工具提取成独立 html/css/js\n- 可引入外部 JS / CSS(CDN 组件库、字体、外链样式)按需使用;class 统一加前缀防冲突(如 .pg-hero-…)\n\n## 标签闭合(必须)\n- 非自闭合标签必须成对闭合(<img> / <br> / <input> 等 void 元素除外)\n- 每次生成/修改后调 validate_code 自检(只校验结构合法性),报错用 vfs_edit 修正直到通过\n\n## 何时写代码组件\n- 组件库无对应类型(高度定制布局 / 一次性专题页 / 特殊视觉效果)→ 写完整 HTML 页面\n- 组件库已有(按钮 / 卡片 / 列表)→ 用现有组件配置,不重造\n\n## 安全底线(必须)\n- 禁 eval / new Function / Function 构造器\n- 禁访问 window 敏感属性(document.cookie / apiKey / token)\n\n## 可访问性 + 语义化\n- 语义化标签(button / nav / section);图片 alt;交互可键盘聚焦\n- 颜色对比达标;不只用颜色传达信息", jc = {
|
|
6339
|
-
name: "html-fragment",
|
|
6340
|
-
description: "完整 HTML 页面生成规范:代码作为 data 资产 / vfs 工作副本 / 完整自包含可独立成页 / script+CSS 集中放置 / 可引外部 JS/CSS / validate_code 自检 / 安全底线 / 可访问性",
|
|
6341
|
-
getContent: () => Ac
|
|
6342
|
-
};
|
|
6343
6385
|
function Mc(e = {}) {
|
|
6344
6386
|
let t = e.vfsPrefix ?? "html/";
|
|
6345
6387
|
return ({ state: e }) => {
|
|
@@ -6400,8 +6442,8 @@ function Nc(e) {
|
|
|
6400
6442
|
name: "validate_code",
|
|
6401
6443
|
description: "校验 HTML 代码格式(标签闭合等结构合法性;DOCTYPE/html/head/body/script 均允许 —— 完整页面级)。生成/修改代码后必调;报错修正后复查直到通过。",
|
|
6402
6444
|
schema: t.object({
|
|
6403
|
-
jsonPath: t.string().optional().describe("首选。从 data
|
|
6404
|
-
path: t.string().optional().describe("修改已有组件时校验 vfs 工作副本文件(如
|
|
6445
|
+
jsonPath: t.string().optional().describe("首选。从 data 读代码校验(传代码字段的 jsonPath;新建组件 write 后用,零重传 content)"),
|
|
6446
|
+
path: t.string().optional().describe("修改已有组件时校验 vfs 工作副本文件(如 " + e + "hero.html)"),
|
|
6405
6447
|
content: t.string().optional().describe("兜底。仅当 jsonPath/path 均不便时直传代码")
|
|
6406
6448
|
})
|
|
6407
6449
|
})]
|
|
@@ -6416,11 +6458,10 @@ function Fc(e = {}) {
|
|
|
6416
6458
|
if (t !== void 0 && !Array.isArray(t)) throw Error("[page-agent-sdk][createHtmlSubagent] writablePaths 须为字符串数组(代码组件 data 区,如 [\"components\"])/ 省略以从 schema 自动推断");
|
|
6417
6459
|
let h = [];
|
|
6418
6460
|
a && h.push(wa()), d && (h.push(Nc(n)), h.push(Os({ check: Mc({ vfsPrefix: n }) })));
|
|
6419
|
-
let g = u ?? []
|
|
6420
|
-
return {
|
|
6461
|
+
let g = u ?? [], _ = t?.[0] ?? "components", v = l === void 0, y = {
|
|
6421
6462
|
id: r,
|
|
6422
|
-
description: i ??
|
|
6423
|
-
systemPrompt: kc(n),
|
|
6463
|
+
description: i ?? `生成/修改纯代码组件(代码作为 data 资产,代码字段 ${f} 随 data 持久化;vfs 作工作副本;能规划(write_todos)+ 执行)。需写代码组件或灵活定制时委派`,
|
|
6464
|
+
systemPrompt: kc(n, f, _),
|
|
6424
6465
|
writablePaths: t ?? [],
|
|
6425
6466
|
allowedTools: [
|
|
6426
6467
|
"vfs_write",
|
|
@@ -6433,7 +6474,7 @@ function Fc(e = {}) {
|
|
|
6433
6474
|
summarization: o === !1 ? void 0 : o,
|
|
6434
6475
|
maxVerifyAttempts: d ? Pc : void 0,
|
|
6435
6476
|
temperature: c,
|
|
6436
|
-
skills:
|
|
6477
|
+
skills: v ? [jc(_, f)] : l,
|
|
6437
6478
|
maxToolRounds: s,
|
|
6438
6479
|
tools: g.length ? g : void 0,
|
|
6439
6480
|
_codeAsset: {
|
|
@@ -6442,9 +6483,12 @@ function Fc(e = {}) {
|
|
|
6442
6483
|
ext: "html",
|
|
6443
6484
|
codeField: f,
|
|
6444
6485
|
craftNotes: m,
|
|
6445
|
-
...p ? { orchestratorPrompt: ma(r) } : {}
|
|
6486
|
+
...p ? { orchestratorPrompt: ma(r, f) } : {}
|
|
6446
6487
|
}
|
|
6447
6488
|
};
|
|
6489
|
+
return y._rebuildCodeAssetPaths = (e) => {
|
|
6490
|
+
y.systemPrompt = kc(n, f, e), v && (y.skills = [jc(e, f)]);
|
|
6491
|
+
}, y;
|
|
6448
6492
|
}
|
|
6449
6493
|
//#endregion
|
|
6450
6494
|
//#region src/core/sdk/defineTool.ts
|
|
@@ -9408,21 +9452,21 @@ function Ku(e) {
|
|
|
9408
9452
|
//#region src/core/harness/usageHints.ts
|
|
9409
9453
|
var qu = .7;
|
|
9410
9454
|
function Ju(e, t, n = "simple", r, i) {
|
|
9411
|
-
let a = El(e), o = n !== "advanced";
|
|
9455
|
+
let a = El(e), o = n !== "advanced", s = n === "minimal";
|
|
9412
9456
|
return {
|
|
9413
9457
|
name: "usageHints",
|
|
9414
9458
|
augmentPrompt: (n) => {
|
|
9415
9459
|
let r = [];
|
|
9416
|
-
if (a.planning && (r.push("【自适应规划】按任务复杂度决定是否先规划,不要对简单任务过度编排:"), r.push(" · 简单/明确任务(改单字段、调样式、查值)→ 直接 read/write 执行,不必 write_todos。"), r.push(" · 复杂任务(多步、大改、有歧义、不可逆)→ 先 write_todos 拆解,首个任务标 in_progress,逐项推进。"), r.push(" · 执行中发现步骤要改/补/细分 → 用 update_todo({id, content?, status?}) 按 id 增量改单项,不必重传整个清单。"), r.push(" · 规划出多步方案若需用户拍板 → 先 request_human_confirmation 给方案选项,确认后再执行。"), r.push(" · 规划阶段有轮次预算(maxPlanRevisions,默认 5):勿反复调研/改计划而不执行,规划充分后即开始 write 落地。")), t && (o ? (r.push("读写主数据用 read/write(高层入口,自动乐观锁 + 自动快照)。read({jsonPath}) 读子路径当前值(返回含 hash,write 时自动比对,无需手动传);read() 不传读整个主数据 + 说明。write 改值两姿势:① 改单个字段/子路径用 write({patch:{op:\"set\", jsonPath:\"路径.字段\", value:新值}})——patch.value 就是该字段的新值(类型匹配:string 直传字符串、number 传数字、对象传对象),不要包成 {字段:值} 对象(字段名已在 jsonPath);也兼容 write({value:新值, patch:{op,jsonPath}}) 顶层 value(向后兼容,但优先 patch.value,避免与整体 set 的 value 混淆);② 替换整个对象用 write({value:{整个新对象}})。op:set 设值 / remove 删 / merge 合并对象 / append 追加数组 / move 移动数组元素(value=目标路径字符串:数组本身=追加到末尾、数组内下标=插到该位置;同数组即重排如组件调序,目标下标按移除源后解释,一步完成免双 set 交换);批量多改动 write({patches:[{op,jsonPath,value},...]});删子路径 write({patch:{jsonPath:\"路径\"}, del:true})。写入自动经 schema 校验(失败不写,按错误提示改值类型/形状后重试)+ 自动存快照(出错可用 restore_data 回退)。"), r.push("修改大对象/数组优先用 write 的 patch 增量(只发改动部分),避免整体重传被 max_tokens 截断致 JSON 不完整。"), r.push("读大数组(read 返回 hasMore=true)用 read({jsonPath,offset,limit}) 分页(offset+=limit 续读,默认 limit=50);一次读多个不相关子路径用 read({jsonPaths:[...]}) 省轮次;复杂 patches 改动先 write({patches,dryRun:true}) 预检(走完整校验不落盘)。"), r.push("read/describe 返回按 schema 投影:仅 schema 声明的字段可见(未声明字段自动隐藏,防误操作);要操作某字段需集成方在 schema
|
|
9460
|
+
if (a.planning && (r.push("【自适应规划】按任务复杂度决定是否先规划,不要对简单任务过度编排:"), r.push(" · 简单/明确任务(改单字段、调样式、查值)→ 直接 read/write 执行,不必 write_todos。"), r.push(" · 复杂任务(多步、大改、有歧义、不可逆)→ 先 write_todos 拆解,首个任务标 in_progress,逐项推进。"), r.push(" · 执行中发现步骤要改/补/细分 → 用 update_todo({id, content?, status?}) 按 id 增量改单项,不必重传整个清单。"), e?.humanConfirm ? r.push(" · 规划出多步方案若需用户拍板 → 先 request_human_confirmation 给方案选项,确认后再执行。") : r.push(" · 规划出多步方案若需用户拍板 → 以文字列出方案选项等用户回复,勿自行拍板。"), r.push(" · 规划阶段有轮次预算(maxPlanRevisions,默认 5):勿反复调研/改计划而不执行,规划充分后即开始 write 落地。")), t && (o ? (r.push("读写主数据用 read/write(高层入口,自动乐观锁 + 自动快照)。read({jsonPath}) 读子路径当前值(返回含 hash,write 时自动比对,无需手动传);read() 不传读整个主数据 + 说明。write 改值两姿势:① 改单个字段/子路径用 write({patch:{op:\"set\", jsonPath:\"路径.字段\", value:新值}})——patch.value 就是该字段的新值(类型匹配:string 直传字符串、number 传数字、对象传对象),不要包成 {字段:值} 对象(字段名已在 jsonPath);也兼容 write({value:新值, patch:{op,jsonPath}}) 顶层 value(向后兼容,但优先 patch.value,避免与整体 set 的 value 混淆);② 替换整个对象用 write({value:{整个新对象}})。op:set 设值 / remove 删 / merge 合并对象 / append 追加数组 / move 移动数组元素(value=目标路径字符串:数组本身=追加到末尾、数组内下标=插到该位置;同数组即重排如组件调序,目标下标按移除源后解释,一步完成免双 set 交换);批量多改动 write({patches:[{op,jsonPath,value},...]});删子路径 write({patch:{jsonPath:\"路径\"}, del:true})。写入自动经 schema 校验(失败不写,按错误提示改值类型/形状后重试)+ 自动存快照" + (s ? "。" : "(出错可用 restore_data 回退)。")), r.push("修改大对象/数组优先用 write 的 patch 增量(只发改动部分),避免整体重传被 max_tokens 截断致 JSON 不完整。"), r.push("读大数组(read 返回 hasMore=true)用 read({jsonPath,offset,limit}) 分页(offset+=limit 续读,默认 limit=50);一次读多个不相关子路径用 read({jsonPaths:[...]}) 省轮次;复杂 patches 改动先 write({patches,dryRun:true}) 预检(走完整校验不落盘)。"), r.push("read/describe 返回按 schema 投影:仅 schema 声明的字段可见(未声明字段自动隐藏,防误操作);要操作某字段需集成方在 schema 声明。"), s || (r.push("查任意路径完整约束或对比快照差异需切 advanced 工具模式(schema_data/diff_data,当前未装载勿调用);查历史快照值(只读不改当前)用 history_data({id?,jsonPath?})。"), r.push("在大数组里按条件筛选用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素 path/index;定位后用 write patch 改。找名字记不清的元素用 search_data(substring/regex/fuzzy)。批量过滤/映射/聚合/重写大数组用 eval_script(沙箱脚本,mode=query 只读/transform 落地)。"))) : (r.push("改主数据前先 get_data({jsonPath}) 读其当前真实值与 hash(返回末尾 hash=xxx),基于真实值改,不要凭记忆。写入(set/edit/delete)时回传 expectedHash=该 hash 启用乐观锁——若主数据在你 get 之后被外部代码/其他 agent/用户手动改过,会触发冲突:集成方若开启人工介入,工具会挂起等用户决定(保留外部/强制覆盖/回退),你应等待工具返回后按结果继续(保留外部→重新 get 再改;强制覆盖→已写入,继续;回退→已回退到历史快照,基于回退值重写);未开启人工介入时返回 VERSION_CONFLICT 不写入,重新 get 拿最新值与 hash 再改。"), r.push("不确定主数据字段结构时用 describe_data 查看说明。"), r.push("修改大对象/数组优先用 edit_data 增量 patch(只发改动部分),避免 set_data 整体重传被 max_tokens 截断导致 JSON 不完整、校验失败。"), r.push("修改主数据出错时可用 restore_data 回退最近一次。"), r.push("在大数组里按条件筛选元素用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素的 path/index;定位后再 edit_data 改。"), r.push("找名字记不清的元素用 search_data(支持 substring/regex/fuzzy 模糊搜索)。"), r.push("需要过滤/映射/聚合/批量重写大数组时用 eval_script(沙箱脚本,入参 data);只读探查用 mode=query,批量重写用 mode=transform(返回值经校验后落地)。"), r.push("读大数组用 read({jsonPath,offset,limit}) 分页(返回 hasMore=true 时 offset+=limit 续读);一次读多个不相关子路径用 read({jsonPaths});复杂改动先 write({...,dryRun:true}) 预检不落盘。"), r.push("对比当前与历史快照(或一段 JSON against)的差异用 diff_data({snapshotId?,against?})(返回结构化 path→from/to,verify 自纠/操作审计/\"刚才改了啥\");只读查历史快照值用 history_data({id?,jsonPath?})。"))), a.subagent && r.push("独立子任务可 spawn_agent 委派(过程隔离,不占主上下文):默认只读,需要子 agent 写数据时传 writablePaths(路径前缀白名单,越界 PATH_OUT_OF_SCOPE)。多个独立子任务可 spawn_agents 并行委派(各子互不通信,结论由你汇总;并行委派不可授写权限,写操作由你收尾执行)。"), a.inspectEnv && r.push("排查页面环境(当前 URL/浏览器/视口/集成方调试变量)用 inspect_env——不传参返回环境摘要(location/navigator/viewport/document),传 key 读特定 window 属性(如 inspect_env({key:\"appConfig\"}) 读 window.appConfig)。改完数据看渲染、定位\"为何没生效\"时用它(只读,不改数据)。"), a.domInspect && r.push("改完数据想确认渲染是否生效(或定位元素/辅助 UI 设计问答)用 get_dom({selector?,depth?}) 读渲染后 DOM(结构化返回 tag/attrs/text/children,depth 控制深度防爆炸,只读)。配合宿主 actions(save_draft/publish 等)形成\"改数据→get_dom 看渲染→触发动作\"闭环。"), a.draftWrite && !o && (r.push("生成超大 JSON(如 50+ 组件页面,单次 write 受 max_tokens 限制装不下)用 draft_write 分块构建 → draft_commit 原子提交:draft_write({draftId, chunk, mode}) mode:\"start\" 新建/\"append\" 追加(拼 JSON 片段到 drafts 池);累积完 draft_commit({draftId}) 合并 + schema 校验 + 写主数据(失败草稿保留可修后重试,成功自动清草稿)。小改仍用 write patch,只在大 JSON 从零生成时用 draft。"), r.push("⚠️ 大 JSON 分块构建是典型多轮工具调用(draft_write×N + draft_commit + read 确认 + 调研 read/query),默认 maxToolRounds=10 可能触顶被 while 截断导致草稿写不完;目标组件数大时集成方应在 createChatSdk 配 maxToolRounds ≥ 20(或按 N+5 估算)。draft_commit 提交同样走乐观锁(改前 read 拿 hash,bind 被改过会触发冲突介入,不静默覆盖)。")), a.todoDeps && r.push("复杂任务可用 todos 层级依赖:write_todos 时给 todo 传 parentId(父任务 id,表达层级)+ deps(依赖的 todo id 数组,必须先完成)。有依赖的任务,deps 全 completed 后再标 in_progress;完成时 update_todo({id, status:\"completed\", evidence:\"完成证据\"}) 记证据。无依赖关系的任务不传 parentId/deps(扁平)。"), a.focus && !o && (r.push("【上下文聚焦】判断任务范围,用 set_focus/add_focus/remove_focus/clear_focus 自动收敛工作范围:"), r.push(" · 局部任务(只改某一组件/区域,如「调导航栏」「改 components.3 样式」)→ 先 read 定位 jsonPath,再 set_focus({path:\"该子树路径\"}) 聚焦;聚焦后每轮只看该子树结构,写其他位置会被 PATH_DENIED 拒绝。"), r.push(" · 多个相关组件(如「同时改导航栏和页脚」)→ set_focus 聚焦首个后用 add_focus({path}) 追加其余;聚焦后可写任一焦点子树,越界仍被拒;移除单个用 remove_focus({path})。"), r.push(" · 全局任务(多处/整体结构,如「重排所有组件」「换主题」)→ 不要聚焦,保持全量视野直接写。"), r.push(" · 完成局部精修、要转向其他区域或做整体改动 → 调 clear_focus 退出聚焦(清空全部焦点),恢复全部读写权限。"), r.push(" · set_focus/add_focus 的 path 必须在 schema 内(类型校验);不确定路径先 read/describe_data 查。")), e?.subagents?.length) {
|
|
9417
9461
|
let t = e.subagents.filter((e) => (e.temperature ?? 0) >= qu || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), n = e.subagents.filter((e) => (e.temperature ?? 0) < qu && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
|
|
9418
|
-
r.push("【规划-反思-执行·路由】按任务性质选模式,不要对简单任务过度编排:"), t.length && (r.push(` · 创作/设计/开放性需求(如"设计主题风格""换个感觉")→ 先调 ${t.map((e) => "use_" + e.id).join("/")} 出 2-3 套方案(高温创意),`), r.push(" 不要自己拍板;拿到方案后,若需用户拍板用 request_human_confirmation 弹选项。")), n.length && r.push(` · 严谨/易错/校验类 → 可先调 ${n.map((e) => "use_" + e.id).join("/")} 反思挑刺(低温审查),据反馈修订。`), r.push(o ? " · 方案定稿后,由你(主 agent)用 write 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。" : " · 方案定稿后,由你(主 agent)用 edit_data 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。"), r.push(" · 简单/明确任务(如\"标题改红色\")直接执行,不必走规划-反思。");
|
|
9462
|
+
r.push("【规划-反思-执行·路由】按任务性质选模式,不要对简单任务过度编排:"), t.length && (r.push(` · 创作/设计/开放性需求(如"设计主题风格""换个感觉")→ 先调 ${t.map((e) => "use_" + e.id).join("/")} 出 2-3 套方案(高温创意),`), r.push(e?.humanConfirm ? " 不要自己拍板;拿到方案后,若需用户拍板用 request_human_confirmation 弹选项。" : " 不要自己拍板;拿到方案后以文字列出选项等用户回复(humanConfirm 未开,勿调不存在工具)。")), n.length && r.push(` · 严谨/易错/校验类 → 可先调 ${n.map((e) => "use_" + e.id).join("/")} 反思挑刺(低温审查),据反馈修订。`), r.push(o ? " · 方案定稿后,由你(主 agent)用 write 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。" : " · 方案定稿后,由你(主 agent)用 edit_data 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。"), r.push(" · 简单/明确任务(如\"标题改红色\")直接执行,不必走规划-反思。");
|
|
9419
9463
|
}
|
|
9420
9464
|
e?.humanConfirm && (r.push("【人工确认·必读】以下情形必须先调 request_human_confirmation 征询用户、拿到答复后再继续,不要自行拍板:"), r.push(" 1) 用户让你「给方案/列选项/我来选/挑一个」时:把每个方案作为一个 option,调 request_human_confirmation(question=简述, options=[方案A,方案B,...], recommendation=你推荐的)。不要只回文字罗列方案让用户自己回复——要用工具把选项做成可点选按钮。"), r.push(" 2) 需求有歧义/不确定时:调工具问清楚(options 不传则用户答同意或拒绝)。"), r.push(" 3) 即将执行高风险不可逆操作(删除/覆盖/批量改动)前:调工具确认。"), r.push(" 4) 规划出多步方案需用户确认时:把整个方案(或关键分步)作为 option 调 request_human_confirmation,确认后再执行。"), r.push("用户在选项里选了哪个,就按那个方案继续;选「拒绝」则停止并询问如何调整。"));
|
|
9421
|
-
let
|
|
9422
|
-
if (
|
|
9423
|
-
let e =
|
|
9424
|
-
!
|
|
9425
|
-
let o = Object.entries(
|
|
9465
|
+
let c = n?.loopProgress;
|
|
9466
|
+
if (c) {
|
|
9467
|
+
let e = c.invokeUsage.prompt_tokens || c.invokeUsage.total_tokens, t = i?.promptSoftCap ?? Infinity, n = c.maxToolRounds > 0 && c.rounds >= Math.ceil(c.maxToolRounds * .7), a = t !== Infinity && e >= t * .5;
|
|
9468
|
+
!c.budgetHinted && (n || a) && (c.rounds > 0 || e > 0) && (c.budgetHinted = !0, r.push(`⏳ 预算提示:本任务已用 ${c.rounds}/${c.maxToolRounds} 工具轮、累计约 ${Math.max(1, Math.round(e / 1e3))}K prompt tokens。若已接近目标请收敛并给出总结;尚未接近请向用户汇报进度与剩余计划,勿默默继续。`));
|
|
9469
|
+
let o = Object.entries(c.writeFailures).filter(([, e]) => e >= 2);
|
|
9426
9470
|
if (o.length) {
|
|
9427
9471
|
let e = o.map(([e, t]) => `${e || "(整体)"}×${t}`).join("、");
|
|
9428
9472
|
r.push(`⚠️ 以下路径已连续写失败:${e}。连续失败常意味着方向错了——先 read 重新核对实际值/类型,或 restore_data 回退后再改;若确需继续,换思路而非原样重试。`);
|
|
@@ -9435,14 +9479,15 @@ function Ju(e, t, n = "simple", r, i) {
|
|
|
9435
9479
|
//#endregion
|
|
9436
9480
|
//#region src/core/harness/resourcesPin.ts
|
|
9437
9481
|
function Yu(e) {
|
|
9482
|
+
let t = e.toolsExposed === !1 ? "读到 ⟦frozen:path⟧/⟦res:handle⟧ 占位符 = 精确值在冻结区/资源池(不入消息流);resource_get/resource_update 为 advanced 工具,当前模式未装载,勿尝试调用;freeze 字段不可写(撞 FROZEN_FIELD 即放弃);verbatim 字段保持原值,勿在当前模式下尝试改写(直接写新值会 VERBATIM_MISMATCH);撞 RESOURCE_EVICTED/RESOURCE_NOT_FOUND 重新 read 懒注册。" : "读到 ⟦frozen:path⟧/⟦res:handle⟧ 占位符 = 精确值在冻结区/资源池(不入消息流);需真值用 resource_get({path});freeze 字段不可写(撞 FROZEN_FIELD 即放弃);verbatim 直接写新值会 VERBATIM_MISMATCH,先 resource_update 再写回句柄;撞 RESOURCE_EVICTED/RESOURCE_NOT_FOUND 重新 read 懒注册。";
|
|
9438
9483
|
return {
|
|
9439
9484
|
name: "resourcesPin",
|
|
9440
9485
|
augmentPrompt: () => {
|
|
9441
|
-
let
|
|
9442
|
-
if (!
|
|
9443
|
-
let
|
|
9444
|
-
for (let e of
|
|
9445
|
-
return
|
|
9486
|
+
let n = e.getResourcesSnapshot();
|
|
9487
|
+
if (!n.length) return;
|
|
9488
|
+
let r = ["## 受保护资源(跨压缩保留 · 精确值保护)"];
|
|
9489
|
+
for (let e of n) e.mode === "freeze" ? r.push(`- ${e.path} (freeze 已冻结,不可改)`) : r.push(`- ${e.path} (verbatim 原样保留)${e.handle ? ` ⟦res:${e.handle}⟧` : ""}`);
|
|
9490
|
+
return r.push(t), r.join("\n");
|
|
9446
9491
|
}
|
|
9447
9492
|
};
|
|
9448
9493
|
}
|
|
@@ -9603,6 +9648,7 @@ function ud(e, n) {
|
|
|
9603
9648
|
}), S = wa([], { maxPlanRevisions: e.maxPlanRevisions }), C = Oa(), w = Xa({
|
|
9604
9649
|
getSchema: () => L()?.schema,
|
|
9605
9650
|
getBind: () => L()?.bind,
|
|
9651
|
+
unfocusGuidance: e.toolMode === "advanced" ? "tool" : "ask-user",
|
|
9606
9652
|
onChange: (e) => W({
|
|
9607
9653
|
type: "focus_change",
|
|
9608
9654
|
focuses: e
|
|
@@ -9618,7 +9664,7 @@ function ud(e, n) {
|
|
|
9618
9664
|
for (let e of A) {
|
|
9619
9665
|
if (e._codeAsset.writablePaths.length) continue;
|
|
9620
9666
|
let t = Qi(O?.schema, e._codeAsset.codeField);
|
|
9621
|
-
t.length ? (e._codeAsset.writablePaths = t, Array.isArray(e.writablePaths) && (e.writablePaths = t), console.info(`[page-agent-sdk][createHtmlSubagent] 未传 writablePaths,已从 schema 推断: [${t.map((e) => `'${e}'`).join(", ")}]`)) : (console.warn("[page-agent-sdk][createHtmlSubagent] 未能从 schema 推断 writablePaths(开放 schema(z.any()/z.record())/嵌套容器(如 sections[].children[])/点路径 codeField(如 props.html_code)不支持自动推断),已跳过该 html 子 agent(整体不受影响);如确需代码资产机制(vfs + 格式校验 + 增量 commit),请显式传 writablePaths(代码组件 data 区,如 ['components'])"), j.add(e));
|
|
9667
|
+
t.length ? (e._codeAsset.writablePaths = t, Array.isArray(e.writablePaths) && (e.writablePaths = t), e._rebuildCodeAssetPaths?.(t[0]), console.info(`[page-agent-sdk][createHtmlSubagent] 未传 writablePaths,已从 schema 推断: [${t.map((e) => `'${e}'`).join(", ")}]`)) : (console.warn("[page-agent-sdk][createHtmlSubagent] 未能从 schema 推断 writablePaths(开放 schema(z.any()/z.record())/嵌套容器(如 sections[].children[])/点路径 codeField(如 props.html_code)不支持自动推断),已跳过该 html 子 agent(整体不受影响);如确需代码资产机制(vfs + 格式校验 + 增量 commit),请显式传 writablePaths(代码组件 data 区,如 ['components'])"), j.add(e));
|
|
9622
9668
|
}
|
|
9623
9669
|
let te = j.size ? A.filter((e) => !j.has(e)) : A, M = j.size ? (ee ?? []).filter((e) => !j.has(e)) : ee, ne = te.length > 0, N = te.flatMap((e) => e._codeAsset.writablePaths), re = te.flatMap((e) => e._codeAsset.writablePaths.map((t) => `${t}.${e._codeAsset.codeField}`)), ie = e.checkpoint, ae = ie !== void 0 && ie !== !1, P = ae ? Ro({
|
|
9624
9670
|
getData: () => L()?.bind,
|
|
@@ -9643,7 +9689,10 @@ function ud(e, n) {
|
|
|
9643
9689
|
vfsStore: ce || O?.resources?.length ? x : void 0,
|
|
9644
9690
|
...N.length ? { pgIdPaths: N } : {},
|
|
9645
9691
|
...re.length ? { largeTextPaths: re } : {}
|
|
9646
|
-
}) : [], pe = se ? pu(fe, e.toolMode) : [], I = se && O ? fe.controller ?? null : null, me = se && O?.resources?.length && I?.getResourcesSnapshot ? Yu({
|
|
9692
|
+
}) : [], pe = se ? pu(fe, e.toolMode) : [], I = se && O ? fe.controller ?? null : null, me = se && O?.resources?.length && I?.getResourcesSnapshot ? Yu({
|
|
9693
|
+
getResourcesSnapshot: () => I?.getResourcesSnapshot?.() ?? [],
|
|
9694
|
+
toolsExposed: e.toolMode === "advanced"
|
|
9695
|
+
}) : void 0, L = () => I?.get() ?? O, R = /* @__PURE__ */ new Map(), he = Gu(F, pe, wu, Au, Lu);
|
|
9647
9696
|
he.forEach((e) => R.set(e.name, "builtin"));
|
|
9648
9697
|
let z = [...e.tools || []];
|
|
9649
9698
|
z.forEach((e) => R.set(e.name, "user"));
|
|
@@ -9760,31 +9809,31 @@ function ud(e, n) {
|
|
|
9760
9809
|
if (Oe) for (let e of S.tools ?? []) R.set(e.name, "builtin");
|
|
9761
9810
|
let Ne = F.summarization, Pe = F.agentCompression && !!d;
|
|
9762
9811
|
e.debug && F.agentCompression && !d && console.warn("[page-agent-sdk][agentCompression] agentCompression 开启但 summaryLlm 不可用(或缺 apiKey / 模型不支持工具),压缩决策不启用,回退静态压缩");
|
|
9763
|
-
let Fe = F.memory, Ie = F.subagent, Le = Ie ? cs() : void 0, Re = e.verify?.maxAttempts ?? 2, ze = F.verify && e.verify?.enabled !== !1 && Re > 0,
|
|
9764
|
-
e.verify?.
|
|
9765
|
-
let
|
|
9766
|
-
llm:
|
|
9812
|
+
let Fe = F.memory, Ie = F.subagent, Le = Ie ? cs() : void 0, Re = e.verify?.maxAttempts ?? 2, ze = !!(e.verify?.check || e.verify?.maxAttempts || e.verify?.adversarial), U = e.capabilities?.verify === !1, Be = (F.verify || ze && !U) && e.verify?.enabled !== !1 && Re > 0, Ve = F.contextInspector;
|
|
9813
|
+
ze && !Be && e.verify?.enabled !== !1 && console.warn("[page-agent-sdk][verify] 检测到 verify 配置(check/maxAttempts/adversarial)但未装载(capabilities.verify:false 显式关闭 或 maxAttempts≤0)");
|
|
9814
|
+
let He = e.subagent, Ue = He?.allowedTools ?? [], We = e.permissions?.length ? Eo(e.permissions) : void 0, Ge = e.approval && (e.approval.tools !== void 0 || e.approval.confirm) ? Do(e.approval) : void 0, Ke = [...We ? [We] : [], ...Ge ? [Ge] : []], qe = !Ie || He?.enabled === !1 ? void 0 : ws({
|
|
9815
|
+
llm: He?.llm ?? e.llm,
|
|
9767
9816
|
allTools: () => G.agent?.allTools ?? V,
|
|
9768
|
-
allowedTools:
|
|
9769
|
-
systemPrompt:
|
|
9770
|
-
temperature:
|
|
9771
|
-
maxTokens:
|
|
9772
|
-
skills:
|
|
9773
|
-
maxDepth:
|
|
9774
|
-
maxParallel:
|
|
9817
|
+
allowedTools: Ue.length ? Ue : void 0,
|
|
9818
|
+
systemPrompt: He?.systemPrompt,
|
|
9819
|
+
temperature: He?.temperature,
|
|
9820
|
+
maxTokens: He?.maxTokens,
|
|
9821
|
+
skills: He?.skills,
|
|
9822
|
+
maxDepth: He?.maxDepth,
|
|
9823
|
+
maxParallel: He?.maxParallel,
|
|
9775
9824
|
debug: e.debug,
|
|
9776
9825
|
getFocuses: () => w.getFocuses(),
|
|
9777
9826
|
getSchema: () => L()?.schema ?? null,
|
|
9778
9827
|
tracker: Le,
|
|
9779
|
-
guardMiddleware:
|
|
9828
|
+
guardMiddleware: Ke.length ? Ke : void 0,
|
|
9780
9829
|
getVfsFiles: Me ? () => x.files : void 0,
|
|
9781
9830
|
enterDataScope: I?.enterScope ? (e) => I.enterScope(e) : void 0,
|
|
9782
9831
|
exitDataScope: I?.exitScope ? (e) => I.exitScope(e) : void 0,
|
|
9783
9832
|
onUsage: (e) => {
|
|
9784
9833
|
i.prompt_tokens = (i.prompt_tokens ?? 0) + (e.prompt_tokens ?? 0), i.completion_tokens = (i.completion_tokens ?? 0) + (e.completion_tokens ?? 0), i.total_tokens = (i.total_tokens ?? 0) + (e.total_tokens ?? 0);
|
|
9785
9834
|
},
|
|
9786
|
-
timeoutMs:
|
|
9787
|
-
}),
|
|
9835
|
+
timeoutMs: He?.timeoutMs
|
|
9836
|
+
}), Je = M?.map((e) => {
|
|
9788
9837
|
if (!e._codeAsset) return e;
|
|
9789
9838
|
let t = e._codeAsset, n = Oc({
|
|
9790
9839
|
writablePaths: t.writablePaths,
|
|
@@ -9801,7 +9850,7 @@ function ud(e, n) {
|
|
|
9801
9850
|
...e,
|
|
9802
9851
|
middleware: r
|
|
9803
9852
|
};
|
|
9804
|
-
}),
|
|
9853
|
+
}), Ye = Ie && Je !== void 0 ? Ds(Je, {
|
|
9805
9854
|
llm: e.llm,
|
|
9806
9855
|
allTools: () => G.agent?.allTools ?? V,
|
|
9807
9856
|
debug: e.debug,
|
|
@@ -9809,7 +9858,7 @@ function ud(e, n) {
|
|
|
9809
9858
|
getSchema: () => L()?.schema ?? null,
|
|
9810
9859
|
getBind: () => L()?.bind,
|
|
9811
9860
|
tracker: Le,
|
|
9812
|
-
guardMiddleware:
|
|
9861
|
+
guardMiddleware: Ke.length ? Ke : void 0,
|
|
9813
9862
|
getVfsFiles: Me ? () => x.files : void 0,
|
|
9814
9863
|
enterDataScope: I?.enterScope ? (e) => I.enterScope(e) : void 0,
|
|
9815
9864
|
exitDataScope: I?.exitScope ? (e) => I.exitScope(e) : void 0,
|
|
@@ -9817,24 +9866,24 @@ function ud(e, n) {
|
|
|
9817
9866
|
i.prompt_tokens = (i.prompt_tokens ?? 0) + (e.prompt_tokens ?? 0), i.completion_tokens = (i.completion_tokens ?? 0) + (e.completion_tokens ?? 0), i.total_tokens = (i.total_tokens ?? 0) + (e.total_tokens ?? 0);
|
|
9818
9867
|
},
|
|
9819
9868
|
timeoutMs: e.subagent?.timeoutMs
|
|
9820
|
-
}) : void 0,
|
|
9869
|
+
}) : void 0, Xe = Ye ? Ye.controller : null, Ze = [
|
|
9821
9870
|
"get_data",
|
|
9822
9871
|
"describe_data",
|
|
9823
9872
|
"read",
|
|
9824
9873
|
"fetch_document"
|
|
9825
|
-
],
|
|
9874
|
+
], Qe = V.filter((e) => Ze.includes(e.name)), $e = Be ? Os({
|
|
9826
9875
|
check: e.verify.check ?? Ps({
|
|
9827
9876
|
schemas: () => L() ? { "": L().schema } : {},
|
|
9828
9877
|
root: () => L()?.bind
|
|
9829
9878
|
}),
|
|
9830
9879
|
adversarial: e.verify?.adversarial ? {
|
|
9831
9880
|
llm: e.llm,
|
|
9832
|
-
tools:
|
|
9881
|
+
tools: Qe
|
|
9833
9882
|
} : void 0
|
|
9834
|
-
}) : void 0,
|
|
9883
|
+
}) : void 0, et = Ve ? Js({
|
|
9835
9884
|
contextWindow: f.contextWindow,
|
|
9836
9885
|
thresholdRatio: Al(e, f.contextWindow).summaryThresholdRatio
|
|
9837
|
-
}) : void 0,
|
|
9886
|
+
}) : void 0, tt = Ju({
|
|
9838
9887
|
...F,
|
|
9839
9888
|
humanConfirm: ve,
|
|
9840
9889
|
subagents: M?.map((e) => ({
|
|
@@ -9842,10 +9891,10 @@ function ud(e, n) {
|
|
|
9842
9891
|
description: e.description,
|
|
9843
9892
|
temperature: e.temperature
|
|
9844
9893
|
}))
|
|
9845
|
-
}, se && !!O, e.toolMode, !!O?.resources?.length, { promptSoftCap: rs(f.contextWindow, h.promptSoftCapTokens) }),
|
|
9894
|
+
}, se && !!O, e.toolMode, !!O?.resources?.length, { promptSoftCap: rs(f.contextWindow, h.promptSoftCapTokens) }), nt = O ? {
|
|
9846
9895
|
name: "dataHint",
|
|
9847
9896
|
augmentPrompt: () => tc(L(), e.schemaHint) || void 0
|
|
9848
|
-
} : null,
|
|
9897
|
+
} : null, rt = e.augmentSystem ? {
|
|
9849
9898
|
name: "augmentSystem",
|
|
9850
9899
|
augmentPrompt: (t) => {
|
|
9851
9900
|
try {
|
|
@@ -9858,52 +9907,52 @@ function ud(e, n) {
|
|
|
9858
9907
|
return;
|
|
9859
9908
|
}
|
|
9860
9909
|
}
|
|
9861
|
-
} : null,
|
|
9910
|
+
} : null, it = Dl(e.onEvent), W = it.emit, at, ot = [], st = (e) => ({
|
|
9862
9911
|
name: e.name,
|
|
9863
9912
|
description: e.description,
|
|
9864
9913
|
content: typeof e.getContent == "function" ? e.getContent() : ""
|
|
9865
|
-
}),
|
|
9914
|
+
}), ct = (e) => ({
|
|
9866
9915
|
name: e.name,
|
|
9867
9916
|
description: e.description,
|
|
9868
9917
|
getContent: () => e.content
|
|
9869
|
-
}),
|
|
9918
|
+
}), lt = e.skillStorage === !1 ? null : ed({
|
|
9870
9919
|
...typeof e.skillStorage == "object" ? e.skillStorage : {},
|
|
9871
9920
|
id: e.skillStorage && typeof e.skillStorage == "object" && e.skillStorage.id ? e.skillStorage.id : `agent::${n}`
|
|
9872
|
-
}),
|
|
9873
|
-
let t =
|
|
9921
|
+
}), ut = () => {
|
|
9922
|
+
let t = at ? at.controller : null;
|
|
9874
9923
|
if (t) {
|
|
9875
|
-
let n = (e.skills || []).filter((e) => !
|
|
9876
|
-
t.set([...n, ...
|
|
9924
|
+
let n = (e.skills || []).filter((e) => !ot.some((t) => t.name === e.name));
|
|
9925
|
+
t.set([...n, ...ot]);
|
|
9877
9926
|
}
|
|
9878
9927
|
G.infoTick.value++;
|
|
9879
|
-
},
|
|
9880
|
-
if (
|
|
9881
|
-
let t = await
|
|
9928
|
+
}, dt = async () => {
|
|
9929
|
+
if (lt) try {
|
|
9930
|
+
let t = await lt.list();
|
|
9882
9931
|
if (t.length) {
|
|
9883
|
-
|
|
9884
|
-
let n =
|
|
9932
|
+
ot = t.map(ct);
|
|
9933
|
+
let n = at ? at.controller : null;
|
|
9885
9934
|
if (n) {
|
|
9886
|
-
let t = (e.skills || []).filter((e) => !
|
|
9887
|
-
n.set([...t, ...
|
|
9935
|
+
let t = (e.skills || []).filter((e) => !ot.some((t) => t.name === e.name));
|
|
9936
|
+
n.set([...t, ...ot]);
|
|
9888
9937
|
}
|
|
9889
9938
|
G.infoTick.value++;
|
|
9890
9939
|
}
|
|
9891
9940
|
} catch {}
|
|
9892
|
-
},
|
|
9941
|
+
}, ft = Ne ? ss({
|
|
9893
9942
|
...h,
|
|
9894
9943
|
llmInvoke: l,
|
|
9895
9944
|
getRegisteredData: () => L() ? [{ description: L().description ?? "主数据对象" }] : [],
|
|
9896
9945
|
preserveLastToolResults: _,
|
|
9897
9946
|
...Pe ? {
|
|
9898
9947
|
decideInvoke: d,
|
|
9899
|
-
getSnapshot: () =>
|
|
9948
|
+
getSnapshot: () => et?.getSnapshot()
|
|
9900
9949
|
} : {}
|
|
9901
|
-
}) : void 0,
|
|
9902
|
-
...
|
|
9903
|
-
|
|
9950
|
+
}) : void 0, pt = Ml([
|
|
9951
|
+
...nt ? [nt] : [],
|
|
9952
|
+
tt,
|
|
9904
9953
|
...ke ? [C] : [],
|
|
9905
9954
|
...Oe ? [S] : [],
|
|
9906
|
-
...je ? [
|
|
9955
|
+
...je ? [at = yo(e.skills || [], {
|
|
9907
9956
|
readVfs: Me ? (e) => x.files[e]?.content : void 0,
|
|
9908
9957
|
hostScriptEnabled: F.skillHostScript,
|
|
9909
9958
|
onToolsReady: (e, t) => {
|
|
@@ -9915,29 +9964,29 @@ function ud(e, n) {
|
|
|
9915
9964
|
}
|
|
9916
9965
|
})] : [],
|
|
9917
9966
|
...Me ? [hc(x)] : [],
|
|
9918
|
-
...
|
|
9967
|
+
...ft ? [ft] : [],
|
|
9919
9968
|
...Ae ? [T] : [],
|
|
9920
9969
|
...B ? [w] : [],
|
|
9921
9970
|
...me ? [me] : [],
|
|
9922
9971
|
...Fe ? [E] : [],
|
|
9923
|
-
...
|
|
9972
|
+
...We ? [We] : [],
|
|
9924
9973
|
...ae && oe && P ? [zo(P)] : [],
|
|
9925
9974
|
...ve ? [jo()] : [],
|
|
9926
|
-
...Ue ? [Ue] : [],
|
|
9927
|
-
...Ze ? [Ze] : [],
|
|
9928
9975
|
...Ge ? [Ge] : [],
|
|
9976
|
+
...$e ? [$e] : [],
|
|
9929
9977
|
...qe ? [qe] : [],
|
|
9930
|
-
...
|
|
9931
|
-
...
|
|
9978
|
+
...Ye ? [Ye] : [],
|
|
9979
|
+
...rt ? [rt] : [],
|
|
9980
|
+
...et ? [et] : [],
|
|
9932
9981
|
...e.middleware || [],
|
|
9933
9982
|
...ue ? [Ru(i, {
|
|
9934
9983
|
tokenBudget: e.tokenBudget,
|
|
9935
9984
|
timeBudgetMs: e.timeBudgetMs
|
|
9936
9985
|
}, W)] : [],
|
|
9937
9986
|
cd(W, b, L, i)
|
|
9938
|
-
]),
|
|
9939
|
-
function
|
|
9940
|
-
if (
|
|
9987
|
+
]), mt = e.maxMemoryRounds ?? ad, ht = e.approval?.timeoutMs, gt = ht === void 0 || ht === 0 ? 3e4 : !Number.isFinite(ht) || ht < 0 ? 0 : ht;
|
|
9988
|
+
function _t(e) {
|
|
9989
|
+
if (gt) return (t) => {
|
|
9941
9990
|
if (t.type !== "approval_request") return;
|
|
9942
9991
|
let n = Date.now(), r = t.toolName;
|
|
9943
9992
|
setTimeout(() => {
|
|
@@ -9951,37 +10000,37 @@ function ud(e, n) {
|
|
|
9951
10000
|
waitedMs: Date.now() - n
|
|
9952
10001
|
}
|
|
9953
10002
|
}));
|
|
9954
|
-
},
|
|
10003
|
+
}, gt);
|
|
9955
10004
|
};
|
|
9956
10005
|
}
|
|
9957
|
-
function
|
|
9958
|
-
let t =
|
|
10006
|
+
function vt(e) {
|
|
10007
|
+
let t = _t(e);
|
|
9959
10008
|
return (e) => {
|
|
9960
10009
|
t?.(e), e.type === "error" && W(e);
|
|
9961
10010
|
};
|
|
9962
10011
|
}
|
|
9963
|
-
let
|
|
9964
|
-
async function
|
|
9965
|
-
s && (
|
|
10012
|
+
let yt = /* @__PURE__ */ At([]);
|
|
10013
|
+
async function xt() {
|
|
10014
|
+
s && (yt.value = (await s.listSessions(n)).sort((e, t) => t.lastAccessed - e.lastAccessed));
|
|
9966
10015
|
}
|
|
9967
|
-
let
|
|
9968
|
-
function
|
|
10016
|
+
let St = id(), Ct = /* @__PURE__ */ new Set();
|
|
10017
|
+
function wt(e) {
|
|
9969
10018
|
let t = new AbortController();
|
|
9970
|
-
return e && (e.aborted ? t.abort() : e.addEventListener("abort", () => t.abort(), { once: !0 })),
|
|
10019
|
+
return e && (e.aborted ? t.abort() : e.addEventListener("abort", () => t.abort(), { once: !0 })), Ct.add(t), {
|
|
9971
10020
|
controller: t,
|
|
9972
|
-
untrack: () =>
|
|
10021
|
+
untrack: () => Ct.delete(t)
|
|
9973
10022
|
};
|
|
9974
10023
|
}
|
|
9975
|
-
function
|
|
9976
|
-
for (let e of
|
|
9977
|
-
|
|
10024
|
+
function Tt() {
|
|
10025
|
+
for (let e of Ct) e.abort();
|
|
10026
|
+
Ct.clear();
|
|
9978
10027
|
}
|
|
9979
10028
|
let G = {
|
|
9980
10029
|
agentId: n,
|
|
9981
10030
|
store: s,
|
|
9982
10031
|
messages: b,
|
|
9983
10032
|
vfsStore: x,
|
|
9984
|
-
listeners:
|
|
10033
|
+
listeners: it.listeners,
|
|
9985
10034
|
todosMw: S,
|
|
9986
10035
|
memoryMw: E,
|
|
9987
10036
|
missionMw: C,
|
|
@@ -9995,17 +10044,17 @@ function ud(e, n) {
|
|
|
9995
10044
|
mcpServers: [],
|
|
9996
10045
|
checkpoint: P,
|
|
9997
10046
|
dataOpsController: I,
|
|
9998
|
-
skillsController:
|
|
10047
|
+
skillsController: at ? at.controller : null,
|
|
9999
10048
|
infoTick: o,
|
|
10000
10049
|
pendingConflict: a.pendingConflict,
|
|
10001
|
-
sessions:
|
|
10002
|
-
refreshSessions:
|
|
10050
|
+
sessions: yt,
|
|
10051
|
+
refreshSessions: xt,
|
|
10003
10052
|
liveData: L,
|
|
10004
10053
|
usage: i,
|
|
10005
10054
|
emit: W,
|
|
10006
|
-
runSerial:
|
|
10007
|
-
trackActive:
|
|
10008
|
-
abortAllActive:
|
|
10055
|
+
runSerial: St,
|
|
10056
|
+
trackActive: wt,
|
|
10057
|
+
abortAllActive: Tt,
|
|
10009
10058
|
unloadSkillTools(e) {
|
|
10010
10059
|
if (e) {
|
|
10011
10060
|
let t = Ee.length;
|
|
@@ -10028,21 +10077,21 @@ function ud(e, n) {
|
|
|
10028
10077
|
}
|
|
10029
10078
|
}
|
|
10030
10079
|
}
|
|
10031
|
-
|
|
10080
|
+
Ot();
|
|
10032
10081
|
},
|
|
10033
10082
|
addSkill(e) {
|
|
10034
|
-
let t =
|
|
10035
|
-
t >= 0 ?
|
|
10083
|
+
let t = ot.findIndex((t) => t.name === e.name);
|
|
10084
|
+
t >= 0 ? ot[t] = e : ot.push(e), ut(), lt && lt.put(st(e));
|
|
10036
10085
|
},
|
|
10037
10086
|
removeSkill(e) {
|
|
10038
|
-
let t =
|
|
10039
|
-
return t < 0 ? !1 : (
|
|
10087
|
+
let t = ot.findIndex((t) => t.name === e);
|
|
10088
|
+
return t < 0 ? !1 : (ot.splice(t, 1), ut(), lt && lt.remove(e), !0);
|
|
10040
10089
|
},
|
|
10041
10090
|
listUserSkills() {
|
|
10042
|
-
return
|
|
10091
|
+
return ot.map((e) => e.name);
|
|
10043
10092
|
},
|
|
10044
10093
|
getUserSkill(e) {
|
|
10045
|
-
let t =
|
|
10094
|
+
let t = ot.find((t) => t.name === e);
|
|
10046
10095
|
if (t) return {
|
|
10047
10096
|
name: t.name,
|
|
10048
10097
|
description: t.description,
|
|
@@ -10050,7 +10099,7 @@ function ud(e, n) {
|
|
|
10050
10099
|
};
|
|
10051
10100
|
},
|
|
10052
10101
|
afterRound() {
|
|
10053
|
-
|
|
10102
|
+
kt(), Mt();
|
|
10054
10103
|
},
|
|
10055
10104
|
async send(e, t) {
|
|
10056
10105
|
await G.initDone, t ??= {}, t?.mission && ke && C.setMission(t.mission);
|
|
@@ -10059,7 +10108,7 @@ function ud(e, n) {
|
|
|
10059
10108
|
let r = t.interceptors.input(e);
|
|
10060
10109
|
typeof r == "string" && (n = r);
|
|
10061
10110
|
} catch {}
|
|
10062
|
-
let r = ue ? t.maxAutoRetries ?? 1 : 0, i = 0, a = !1, o =
|
|
10111
|
+
let r = ue ? t.maxAutoRetries ?? 1 : 0, i = 0, a = !1, o = vt(t.signal);
|
|
10063
10112
|
for (;;) {
|
|
10064
10113
|
a ||= (b.push({
|
|
10065
10114
|
role: "user",
|
|
@@ -10105,7 +10154,7 @@ function ud(e, n) {
|
|
|
10105
10154
|
},
|
|
10106
10155
|
async batch(e, t, n) {
|
|
10107
10156
|
if (await G.initDone, !e.length) return [];
|
|
10108
|
-
let r = [], i =
|
|
10157
|
+
let r = [], i = vt(n);
|
|
10109
10158
|
for (let a = 0; a < e.length; a++) {
|
|
10110
10159
|
if (n?.aborted) {
|
|
10111
10160
|
for (let t = a; t < e.length; t++) r.push({
|
|
@@ -10204,14 +10253,14 @@ function ud(e, n) {
|
|
|
10204
10253
|
type: "session_restored",
|
|
10205
10254
|
sessionId: r,
|
|
10206
10255
|
rounds: i.messages?.length ?? 0
|
|
10207
|
-
})), e.memory && s.save(n, G.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }),
|
|
10256
|
+
})), e.memory && s.save(n, G.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }), xt(), q = void 0, jt = !1, G.infoTick.value++, r;
|
|
10208
10257
|
},
|
|
10209
10258
|
resetSession: () => {
|
|
10210
|
-
|
|
10259
|
+
Tt(), a.resolve("keep_external"), G.sessionId = Qc(), b.splice(0, b.length), x.clear?.(), S.reset([]), e.memory || E.reset(""), C.reset(), T.reset(), w.reset(), P && P.importStack([]), G.agent && (G.agent.debugLogs.value = []), s && s.createSession(G.agentId, e.session?.title, G.sessionId), W({
|
|
10211
10260
|
type: "session_restored",
|
|
10212
10261
|
sessionId: G.sessionId,
|
|
10213
10262
|
rounds: 0
|
|
10214
|
-
}),
|
|
10263
|
+
}), G.infoTick.value++, xt(), q = void 0, jt = !1;
|
|
10215
10264
|
},
|
|
10216
10265
|
stream: (e, t, n) => {
|
|
10217
10266
|
if (!G.agent) throw Error("page-agent-sdk: agent 尚未初始化完成,请先 await mount()");
|
|
@@ -10223,12 +10272,12 @@ function ud(e, n) {
|
|
|
10223
10272
|
let e = () => a.resolve("keep_external");
|
|
10224
10273
|
n.aborted ? e() : n.addEventListener("abort", e, { once: !0 });
|
|
10225
10274
|
}
|
|
10226
|
-
let { controller: i, untrack: o } =
|
|
10275
|
+
let { controller: i, untrack: o } = wt(n);
|
|
10227
10276
|
return G.agent.stream(e, r, i.signal).finally(o);
|
|
10228
10277
|
},
|
|
10229
10278
|
release() {
|
|
10230
10279
|
if (G.refCount--, G.refCount <= 0) {
|
|
10231
|
-
|
|
10280
|
+
Tt(), s && (x.flush?.(), s.flush(), s.dispose()), lt && lt.dispose();
|
|
10232
10281
|
let e = G.mcpClosers.splice(0);
|
|
10233
10282
|
e.length && Promise.allSettled(e.map((e) => e())), od.delete(n);
|
|
10234
10283
|
}
|
|
@@ -10263,7 +10312,7 @@ function ud(e, n) {
|
|
|
10263
10312
|
contextWindow: e.contextWindow ?? r?.contextWindow,
|
|
10264
10313
|
maxOutputTokens: e.maxOutputTokens ?? r?.maxOutputTokens
|
|
10265
10314
|
}), f.contextWindow < 2e5) throw Error(`[page-agent-sdk][setLlm] 新模型上下文窗口 ${f.contextWindow} 小于最小支持 ${ii}(需 ≥200K 窗口模型)`);
|
|
10266
|
-
G.agent && (G.agent.setLlm(n), G.agent.setModelCaps?.(f)),
|
|
10315
|
+
G.agent && (G.agent.setLlm(n), G.agent.setModelCaps?.(f)), ft?.setContextWindow?.(f.contextWindow), et?.setContextWindow?.(f.contextWindow), G.infoTick.value++, e.debug && console.log("[page-agent-sdk][setLlm] 重解析 modelCaps + 回灌:", f);
|
|
10267
10316
|
},
|
|
10268
10317
|
setMemory(e) {
|
|
10269
10318
|
E.reset(e), typeof e == "function" && E.refresh(), G.infoTick.value++;
|
|
@@ -10272,22 +10321,22 @@ function ud(e, n) {
|
|
|
10272
10321
|
return E.refresh();
|
|
10273
10322
|
},
|
|
10274
10323
|
setSubagents(t) {
|
|
10275
|
-
if (!
|
|
10324
|
+
if (!Xe) {
|
|
10276
10325
|
e.debug && console.warn("[page-agent-sdk][setSubagents] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略");
|
|
10277
10326
|
return;
|
|
10278
10327
|
}
|
|
10279
|
-
|
|
10328
|
+
Xe.set(t), G.infoTick.value++;
|
|
10280
10329
|
},
|
|
10281
10330
|
addSubagent(t) {
|
|
10282
|
-
if (!
|
|
10331
|
+
if (!Xe) {
|
|
10283
10332
|
e.debug && console.warn("[page-agent-sdk][addSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略");
|
|
10284
10333
|
return;
|
|
10285
10334
|
}
|
|
10286
|
-
|
|
10335
|
+
Xe.add(t), G.infoTick.value++;
|
|
10287
10336
|
},
|
|
10288
10337
|
removeSubagent(t) {
|
|
10289
|
-
if (!
|
|
10290
|
-
let n =
|
|
10338
|
+
if (!Xe) return e.debug && console.warn("[page-agent-sdk][removeSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略"), !1;
|
|
10339
|
+
let n = Xe.remove(t);
|
|
10291
10340
|
return n && G.infoTick.value++, n;
|
|
10292
10341
|
},
|
|
10293
10342
|
getActiveSubagents() {
|
|
@@ -10308,7 +10357,7 @@ function ud(e, n) {
|
|
|
10308
10357
|
schema: e.schema,
|
|
10309
10358
|
source: R.get(e.name) || "user"
|
|
10310
10359
|
})),
|
|
10311
|
-
skills: (
|
|
10360
|
+
skills: (at ? at.controller.get() : e.skills ?? []).map((e) => ({
|
|
10312
10361
|
name: e.name,
|
|
10313
10362
|
description: e.description
|
|
10314
10363
|
})),
|
|
@@ -10323,7 +10372,7 @@ function ud(e, n) {
|
|
|
10323
10372
|
promptSoftCap: rs(f.contextWindow, h.promptSoftCapTokens)
|
|
10324
10373
|
},
|
|
10325
10374
|
memory: E.get(),
|
|
10326
|
-
middleware:
|
|
10375
|
+
middleware: pt.map((e) => e.name),
|
|
10327
10376
|
todos: (G.agent?.getState?.()?.todos ?? []).map((e) => ({
|
|
10328
10377
|
id: e.id,
|
|
10329
10378
|
content: e.content,
|
|
@@ -10344,21 +10393,21 @@ function ud(e, n) {
|
|
|
10344
10393
|
} : void 0,
|
|
10345
10394
|
actions: Vu(e.actions ?? {}),
|
|
10346
10395
|
subagent: {
|
|
10347
|
-
enabled: !!
|
|
10396
|
+
enabled: !!qe,
|
|
10348
10397
|
maxDepth: e.subagent?.maxDepth ?? 1,
|
|
10349
10398
|
maxParallel: e.subagent?.maxParallel ?? 4,
|
|
10350
10399
|
allowedTools: e.subagent?.allowedTools ?? [],
|
|
10351
|
-
subagents:
|
|
10400
|
+
subagents: Xe?.get() ?? [],
|
|
10352
10401
|
active: Le?.getActive() ?? [],
|
|
10353
10402
|
history: Le?.getHistory() ?? []
|
|
10354
10403
|
},
|
|
10355
10404
|
verify: {
|
|
10356
|
-
enabled:
|
|
10357
|
-
maxAttempts:
|
|
10358
|
-
adversarial:
|
|
10405
|
+
enabled: !!$e,
|
|
10406
|
+
maxAttempts: Be ? Re : 0,
|
|
10407
|
+
adversarial: Be && !!e.verify?.adversarial
|
|
10359
10408
|
},
|
|
10360
10409
|
context: (() => {
|
|
10361
|
-
let e =
|
|
10410
|
+
let e = et?.getSnapshot();
|
|
10362
10411
|
if (e) {
|
|
10363
10412
|
let t = G.agent?.getState?.()?.lastCompression;
|
|
10364
10413
|
t && (e.compression = t);
|
|
@@ -10408,7 +10457,7 @@ function ud(e, n) {
|
|
|
10408
10457
|
B && (w.clearFocus(), G.infoTick.value++);
|
|
10409
10458
|
}
|
|
10410
10459
|
};
|
|
10411
|
-
async function
|
|
10460
|
+
async function Et() {
|
|
10412
10461
|
if (!s) return;
|
|
10413
10462
|
await s.ready;
|
|
10414
10463
|
let t = e.session || {};
|
|
@@ -10432,12 +10481,12 @@ function ud(e, n) {
|
|
|
10432
10481
|
}), e.debug && console.log("[page-agent-sdk][restore] 恢复会话", G.sessionId, `${t.messages?.length ?? 0} msgs`)) : e.debug && console.log("[page-agent-sdk][restore] 会话 meta 存在但快照为空", G.sessionId);
|
|
10433
10482
|
} else G.sessionId = await s.createSession(n, t.title), e.debug && console.log("[page-agent-sdk][restore] 新建会话(无历史)", G.sessionId);
|
|
10434
10483
|
} else G.sessionId = await s.createSession(n, t.title);
|
|
10435
|
-
e.memory && s.save(n, G.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }),
|
|
10484
|
+
e.memory && s.save(n, G.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }), xt();
|
|
10436
10485
|
}
|
|
10437
|
-
async function
|
|
10438
|
-
await
|
|
10486
|
+
async function K() {
|
|
10487
|
+
await dt();
|
|
10439
10488
|
}
|
|
10440
|
-
function
|
|
10489
|
+
function Dt(e) {
|
|
10441
10490
|
let t = {};
|
|
10442
10491
|
for (let n of nd(e)) {
|
|
10443
10492
|
let e = x.files[n];
|
|
@@ -10445,12 +10494,12 @@ function ud(e, n) {
|
|
|
10445
10494
|
}
|
|
10446
10495
|
return t;
|
|
10447
10496
|
}
|
|
10448
|
-
function
|
|
10497
|
+
function Ot() {
|
|
10449
10498
|
let e = rd(x.files, nd(b));
|
|
10450
10499
|
for (let t of e) delete x.files[t];
|
|
10451
10500
|
}
|
|
10452
|
-
function
|
|
10453
|
-
let e = Jo(b,
|
|
10501
|
+
function kt() {
|
|
10502
|
+
let e = Jo(b, mt);
|
|
10454
10503
|
if (!e.trimmed) return;
|
|
10455
10504
|
let { older: t, summary: n } = e;
|
|
10456
10505
|
if (W({
|
|
@@ -10461,22 +10510,22 @@ function ud(e, n) {
|
|
|
10461
10510
|
assistant: e.assistantMsgs.map((e) => e.content),
|
|
10462
10511
|
steps: e.assistantMsgs.flatMap((e) => e.steps ?? [])
|
|
10463
10512
|
})),
|
|
10464
|
-
vfsResults:
|
|
10513
|
+
vfsResults: Dt(t.flatMap((e) => [e.userMsg, ...e.assistantMsgs])),
|
|
10465
10514
|
summary: n.content,
|
|
10466
10515
|
reason: "max_memory_rounds"
|
|
10467
|
-
}), b.splice(e.deleteFrom, e.deleteCount, n),
|
|
10516
|
+
}), b.splice(e.deleteFrom, e.deleteCount, n), Ot(), g && l) {
|
|
10468
10517
|
let n = e.summary, { prevSeg: r } = e;
|
|
10469
10518
|
(async () => {
|
|
10470
10519
|
try {
|
|
10471
10520
|
let e = await l($o(t, v)), i = b.indexOf(n);
|
|
10472
10521
|
if (i < 0) return;
|
|
10473
|
-
b[i].content = qo(t, r, e),
|
|
10522
|
+
b[i].content = qo(t, r, e), Mt();
|
|
10474
10523
|
} catch {}
|
|
10475
10524
|
})();
|
|
10476
10525
|
}
|
|
10477
10526
|
}
|
|
10478
|
-
let
|
|
10479
|
-
function
|
|
10527
|
+
let q, jt = !1;
|
|
10528
|
+
function Mt() {
|
|
10480
10529
|
if (!G.sessionId || !s) return;
|
|
10481
10530
|
let t = JSON.parse(JSON.stringify(b));
|
|
10482
10531
|
s.save(n, G.sessionId, { messages: t });
|
|
@@ -10495,13 +10544,13 @@ function ud(e, n) {
|
|
|
10495
10544
|
}
|
|
10496
10545
|
ue && P && (s.save(n, G.sessionId, { checkpoints: P.exportStack() }), s.save(n, G.sessionId, { usage: i }));
|
|
10497
10546
|
let a = Bc(b);
|
|
10498
|
-
a && a !==
|
|
10547
|
+
a && a !== q && (q = a, s.updateTitle(n, G.sessionId, a)), e.autoTitle !== !1 && u && !jt && b.some((e) => e.role === "user") && b.some((e) => e.role === "assistant") && (jt = !0, (async () => {
|
|
10499
10548
|
let e = await u(b);
|
|
10500
|
-
e && (await s.updateTitle(n, G.sessionId, e), await
|
|
10549
|
+
e && (await s.updateTitle(n, G.sessionId, e), await xt());
|
|
10501
10550
|
})()), e.debug && console.log("[page-agent-sdk][persist] save", G.sessionId, `${b.length} msgs`);
|
|
10502
10551
|
}
|
|
10503
10552
|
return G.initDone = (async () => {
|
|
10504
|
-
if (await
|
|
10553
|
+
if (await Et(), await K(), e.mcp?.length) {
|
|
10505
10554
|
let t = await Promise.allSettled(e.mcp.map((e) => $s(e)));
|
|
10506
10555
|
G.mcpClosers = t.flatMap((e) => e.status === "fulfilled" ? [e.value.close] : []), G.mcpServers = [], t.forEach((t, n) => {
|
|
10507
10556
|
let r = e.mcp[n], i = r.name ?? r.url;
|
|
@@ -10517,14 +10566,14 @@ function ud(e, n) {
|
|
|
10517
10566
|
llm: t,
|
|
10518
10567
|
systemPrompt: de,
|
|
10519
10568
|
tools: V,
|
|
10520
|
-
middleware:
|
|
10569
|
+
middleware: pt,
|
|
10521
10570
|
maxToolRounds: e.maxToolRounds,
|
|
10522
10571
|
maxRetries: e.maxRetries,
|
|
10523
10572
|
stallMs: e.streamStallMs ?? 9e4,
|
|
10524
10573
|
maxParallelTools: e.maxParallelTools,
|
|
10525
10574
|
contextWindow: f.contextWindow,
|
|
10526
10575
|
maxOutputTokens: f.maxOutputTokens,
|
|
10527
|
-
maxVerifyAttempts:
|
|
10576
|
+
maxVerifyAttempts: Be ? Re : 0,
|
|
10528
10577
|
roundTokenBudget: e.roundTokenBudget ?? 0,
|
|
10529
10578
|
onLlmChange: (e) => {
|
|
10530
10579
|
y = e;
|
|
@@ -10539,7 +10588,7 @@ function ud(e, n) {
|
|
|
10539
10588
|
} catch {}
|
|
10540
10589
|
} : void 0,
|
|
10541
10590
|
debug: e.debug
|
|
10542
|
-
}), D.current = G.agent,
|
|
10591
|
+
}), D.current = G.agent, Ye && Ye.setReconfigureHook && Ye.setReconfigureHook(() => {
|
|
10543
10592
|
G.agent && G.agent.setTools(H());
|
|
10544
10593
|
});
|
|
10545
10594
|
})(), G;
|