page-agent-sdk 2.37.0 → 2.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/README.zh-CN.md +1 -0
- package/dist/page-agent-sdk.headless.js +736 -664
- package/dist/page-agent-sdk.iife.js +131 -131
- package/dist/page-agent-sdk.js +2005 -1846
- package/dist/page-agent-sdk.umd.cjs +63 -63
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/types/headless.d.ts +31 -0
- package/types/index.d.ts +31 -0
|
@@ -417,61 +417,61 @@ var Ue = {
|
|
|
417
417
|
return We(this, "entries", (e) => (e[1] = He(this, e[1]), e));
|
|
418
418
|
},
|
|
419
419
|
every(e, t) {
|
|
420
|
-
return
|
|
420
|
+
return Ke(this, "every", e, t, void 0, arguments);
|
|
421
421
|
},
|
|
422
422
|
filter(e, t) {
|
|
423
|
-
return
|
|
423
|
+
return Ke(this, "filter", e, t, (e) => e.map((e) => He(this, e)), arguments);
|
|
424
424
|
},
|
|
425
425
|
find(e, t) {
|
|
426
|
-
return
|
|
426
|
+
return Ke(this, "find", e, t, (e) => He(this, e), arguments);
|
|
427
427
|
},
|
|
428
428
|
findIndex(e, t) {
|
|
429
|
-
return
|
|
429
|
+
return Ke(this, "findIndex", e, t, void 0, arguments);
|
|
430
430
|
},
|
|
431
431
|
findLast(e, t) {
|
|
432
|
-
return
|
|
432
|
+
return Ke(this, "findLast", e, t, (e) => He(this, e), arguments);
|
|
433
433
|
},
|
|
434
434
|
findLastIndex(e, t) {
|
|
435
|
-
return
|
|
435
|
+
return Ke(this, "findLastIndex", e, t, void 0, arguments);
|
|
436
436
|
},
|
|
437
437
|
forEach(e, t) {
|
|
438
|
-
return
|
|
438
|
+
return Ke(this, "forEach", e, t, void 0, arguments);
|
|
439
439
|
},
|
|
440
440
|
includes(...e) {
|
|
441
|
-
return
|
|
441
|
+
return qe(this, "includes", e);
|
|
442
442
|
},
|
|
443
443
|
indexOf(...e) {
|
|
444
|
-
return
|
|
444
|
+
return qe(this, "indexOf", e);
|
|
445
445
|
},
|
|
446
446
|
join(e) {
|
|
447
447
|
return Be(this).join(e);
|
|
448
448
|
},
|
|
449
449
|
lastIndexOf(...e) {
|
|
450
|
-
return
|
|
450
|
+
return qe(this, "lastIndexOf", e);
|
|
451
451
|
},
|
|
452
452
|
map(e, t) {
|
|
453
|
-
return
|
|
453
|
+
return Ke(this, "map", e, t, void 0, arguments);
|
|
454
454
|
},
|
|
455
455
|
pop() {
|
|
456
|
-
return
|
|
456
|
+
return U(this, "pop");
|
|
457
457
|
},
|
|
458
458
|
push(...e) {
|
|
459
|
-
return
|
|
459
|
+
return U(this, "push", e);
|
|
460
460
|
},
|
|
461
461
|
reduce(e, ...t) {
|
|
462
|
-
return
|
|
462
|
+
return H(this, "reduce", e, t);
|
|
463
463
|
},
|
|
464
464
|
reduceRight(e, ...t) {
|
|
465
|
-
return
|
|
465
|
+
return H(this, "reduceRight", e, t);
|
|
466
466
|
},
|
|
467
467
|
shift() {
|
|
468
|
-
return
|
|
468
|
+
return U(this, "shift");
|
|
469
469
|
},
|
|
470
470
|
some(e, t) {
|
|
471
|
-
return
|
|
471
|
+
return Ke(this, "some", e, t, void 0, arguments);
|
|
472
472
|
},
|
|
473
473
|
splice(...e) {
|
|
474
|
-
return
|
|
474
|
+
return U(this, "splice", e);
|
|
475
475
|
},
|
|
476
476
|
toReversed() {
|
|
477
477
|
return Be(this).toReversed();
|
|
@@ -483,7 +483,7 @@ var Ue = {
|
|
|
483
483
|
return Be(this).toSpliced(...e);
|
|
484
484
|
},
|
|
485
485
|
unshift(...e) {
|
|
486
|
-
return
|
|
486
|
+
return U(this, "unshift", e);
|
|
487
487
|
},
|
|
488
488
|
values() {
|
|
489
489
|
return We(this, "values", (e) => He(this, e));
|
|
@@ -497,7 +497,7 @@ function We(e, t, n) {
|
|
|
497
497
|
}), i;
|
|
498
498
|
}
|
|
499
499
|
var Ge = Array.prototype;
|
|
500
|
-
function
|
|
500
|
+
function Ke(e, t, n, r, i, a) {
|
|
501
501
|
let o = Ve(e), s = o !== e && !/* @__PURE__ */ Ct(e), c = o[t];
|
|
502
502
|
if (c !== Ge[t]) {
|
|
503
503
|
let t = c.apply(e, a);
|
|
@@ -512,7 +512,7 @@ function H(e, t, n, r, i, a) {
|
|
|
512
512
|
let u = c.call(o, l, r);
|
|
513
513
|
return s && i ? i(u) : u;
|
|
514
514
|
}
|
|
515
|
-
function
|
|
515
|
+
function H(e, t, n, r) {
|
|
516
516
|
let i = Ve(e), a = i !== e && !/* @__PURE__ */ Ct(e), o = n, s = !1;
|
|
517
517
|
i !== e && (a ? (s = r.length === 0, o = function(t, r, i) {
|
|
518
518
|
return s && (s = !1, t = He(e, t)), n.call(this, t, He(e, r), i, e);
|
|
@@ -522,13 +522,13 @@ function Ke(e, t, n, r) {
|
|
|
522
522
|
let c = i[t](o, ...r);
|
|
523
523
|
return s ? He(e, c) : c;
|
|
524
524
|
}
|
|
525
|
-
function
|
|
525
|
+
function qe(e, t, n) {
|
|
526
526
|
let r = /* @__PURE__ */ G(e);
|
|
527
527
|
V(r, "iterate", Re);
|
|
528
528
|
let i = r[t](...n);
|
|
529
529
|
return (i === -1 || i === !1) && /* @__PURE__ */ wt(n[0]) ? (n[0] = /* @__PURE__ */ G(n[0]), r[t](...n)) : i;
|
|
530
530
|
}
|
|
531
|
-
function
|
|
531
|
+
function U(e, t, n = []) {
|
|
532
532
|
Oe(), ye();
|
|
533
533
|
let r = (/* @__PURE__ */ G(e))[t].apply(e, n);
|
|
534
534
|
return B(), ke(), r;
|
|
@@ -598,10 +598,10 @@ var Ze = class {
|
|
|
598
598
|
deleteProperty(e, t) {
|
|
599
599
|
return process.env.NODE_ENV !== "production" && de(`Delete operation on key "${String(t)}" failed: target is readonly.`, e), !0;
|
|
600
600
|
}
|
|
601
|
-
}, et = /* @__PURE__ */ new Qe(), tt = /* @__PURE__ */ new $e(), nt = /* @__PURE__ */ new $e(!0),
|
|
601
|
+
}, et = /* @__PURE__ */ new Qe(), tt = /* @__PURE__ */ new $e(), nt = /* @__PURE__ */ new $e(!0), rt = (e) => e, W = (e) => Reflect.getPrototypeOf(e);
|
|
602
602
|
function it(e, t, n) {
|
|
603
603
|
return function(...r) {
|
|
604
|
-
let i = this.__v_raw, a = /* @__PURE__ */ G(i), o = E(a), s = e === "entries" || e === Symbol.iterator && o, c = e === "keys" && o, l = i[e](...r), u = n ?
|
|
604
|
+
let i = this.__v_raw, a = /* @__PURE__ */ G(i), o = E(a), s = e === "entries" || e === Symbol.iterator && o, c = e === "keys" && o, l = i[e](...r), u = n ? rt : t ? Dt : Et;
|
|
605
605
|
return !t && V(a, "iterate", c ? Le : Ie), x(Object.create(l), { next() {
|
|
606
606
|
let { value: e, done: t } = l.next();
|
|
607
607
|
return t ? {
|
|
@@ -628,7 +628,7 @@ function ot(e, t) {
|
|
|
628
628
|
get(n) {
|
|
629
629
|
let r = this.__v_raw, i = /* @__PURE__ */ G(r), a = /* @__PURE__ */ G(n);
|
|
630
630
|
e || (ie(n, a) && V(i, "get", n), V(i, "get", a));
|
|
631
|
-
let { has: o } =
|
|
631
|
+
let { has: o } = W(i), s = t ? rt : e ? Dt : Et;
|
|
632
632
|
if (o.call(i, n)) return s(r.get(n));
|
|
633
633
|
if (o.call(i, a)) return s(r.get(a));
|
|
634
634
|
r !== i && r.get(n);
|
|
@@ -642,7 +642,7 @@ function ot(e, t) {
|
|
|
642
642
|
return e || (ie(t, i) && V(r, "has", t), V(r, "has", i)), t === i ? n.has(t) : n.has(t) || n.has(i);
|
|
643
643
|
},
|
|
644
644
|
forEach(n, r) {
|
|
645
|
-
let i = this, a = i.__v_raw, o = /* @__PURE__ */ G(a), s = t ?
|
|
645
|
+
let i = this, a = i.__v_raw, o = /* @__PURE__ */ G(a), s = t ? rt : e ? Dt : Et;
|
|
646
646
|
return !e && V(o, "iterate", Ie), a.forEach((e, t) => n.call(r, s(e), s(t), i));
|
|
647
647
|
}
|
|
648
648
|
};
|
|
@@ -653,18 +653,18 @@ function ot(e, t) {
|
|
|
653
653
|
clear: at("clear")
|
|
654
654
|
} : {
|
|
655
655
|
add(e) {
|
|
656
|
-
let n = /* @__PURE__ */ G(this), r =
|
|
656
|
+
let n = /* @__PURE__ */ G(this), r = W(n), i = /* @__PURE__ */ G(e), a = !t && !/* @__PURE__ */ Ct(e) && !/* @__PURE__ */ St(e) ? i : e;
|
|
657
657
|
return r.has.call(n, a) || ie(e, a) && r.has.call(n, e) || ie(i, a) && r.has.call(n, i) || (n.add(a), ze(n, "add", a, a)), this;
|
|
658
658
|
},
|
|
659
659
|
set(e, n) {
|
|
660
660
|
!t && !/* @__PURE__ */ Ct(n) && !/* @__PURE__ */ St(n) && (n = /* @__PURE__ */ G(n));
|
|
661
|
-
let r = /* @__PURE__ */ G(this), { has: i, get: a } =
|
|
661
|
+
let r = /* @__PURE__ */ G(this), { has: i, get: a } = W(r), o = i.call(r, e);
|
|
662
662
|
o ? process.env.NODE_ENV !== "production" && dt(r, i, e) : (e = /* @__PURE__ */ G(e), o = i.call(r, e));
|
|
663
663
|
let s = a.call(r, e);
|
|
664
664
|
return r.set(e, n), o ? ie(n, s) && ze(r, "set", e, n, s) : ze(r, "add", e, n), this;
|
|
665
665
|
},
|
|
666
666
|
delete(e) {
|
|
667
|
-
let t = /* @__PURE__ */ G(this), { has: n, get: r } =
|
|
667
|
+
let t = /* @__PURE__ */ G(this), { has: n, get: r } = W(t), i = n.call(t, e);
|
|
668
668
|
i ? process.env.NODE_ENV !== "production" && dt(t, n, e) : (e = /* @__PURE__ */ G(e), i = n.call(t, e));
|
|
669
669
|
let a = r ? r.call(t, e) : void 0, o = t.delete(e);
|
|
670
670
|
return i && ze(t, "delete", e, void 0, a), o;
|
|
@@ -4181,57 +4181,86 @@ function yo(e = {}) {
|
|
|
4181
4181
|
}
|
|
4182
4182
|
//#endregion
|
|
4183
4183
|
//#region src/core/harness/subagent.ts
|
|
4184
|
-
function bo(e) {
|
|
4184
|
+
function bo(e = 20) {
|
|
4185
|
+
let t = /* @__PURE__ */ new Map(), n = [];
|
|
4186
|
+
return {
|
|
4187
|
+
start(e, n, r, i) {
|
|
4188
|
+
t.set(e, {
|
|
4189
|
+
taskId: e,
|
|
4190
|
+
task: n,
|
|
4191
|
+
label: r,
|
|
4192
|
+
status: "running",
|
|
4193
|
+
steps: [],
|
|
4194
|
+
startedAt: i
|
|
4195
|
+
});
|
|
4196
|
+
},
|
|
4197
|
+
pushStep(e, n) {
|
|
4198
|
+
let r = t.get(e);
|
|
4199
|
+
r && r.steps.push(n);
|
|
4200
|
+
},
|
|
4201
|
+
finish(r, i, a) {
|
|
4202
|
+
let o = t.get(r);
|
|
4203
|
+
if (o) for (o.status = i, o.durationMs = Date.now() - o.startedAt, o.resultPreview = a.length > 120 ? a.slice(0, 120) + "…" : a, t.delete(r), n.unshift(o); n.length > e;) n.pop();
|
|
4204
|
+
},
|
|
4205
|
+
getActive() {
|
|
4206
|
+
return [...t.values()];
|
|
4207
|
+
},
|
|
4208
|
+
getHistory() {
|
|
4209
|
+
return [...n];
|
|
4210
|
+
}
|
|
4211
|
+
};
|
|
4212
|
+
}
|
|
4213
|
+
function xo(e) {
|
|
4185
4214
|
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
4186
4215
|
}
|
|
4187
|
-
var
|
|
4216
|
+
var So = [
|
|
4188
4217
|
"describe_data",
|
|
4189
4218
|
"get_data",
|
|
4190
4219
|
"read",
|
|
4191
4220
|
"query_data",
|
|
4192
4221
|
"search_data",
|
|
4193
4222
|
"fetch_document"
|
|
4194
|
-
],
|
|
4223
|
+
], Co = 1, wo = 4, To = 6, Eo = ["spawn_agent", "spawn_agents"], Do = [
|
|
4195
4224
|
"write",
|
|
4196
4225
|
"set_data",
|
|
4197
4226
|
"edit_data",
|
|
4198
4227
|
"delete_data",
|
|
4199
4228
|
"draft_commit"
|
|
4200
4229
|
];
|
|
4201
|
-
function
|
|
4230
|
+
function Oo(e) {
|
|
4202
4231
|
let t = [];
|
|
4203
4232
|
if (typeof e.jsonPath == "string" && e.jsonPath && t.push(e.jsonPath), typeof e.path == "string" && e.path && t.push(e.path), e.patch && typeof e.patch.jsonPath == "string" && t.push(e.patch.jsonPath), Array.isArray(e.patches)) for (let n of e.patches) n && typeof n.jsonPath == "string" && t.push(n.jsonPath);
|
|
4204
4233
|
return t;
|
|
4205
4234
|
}
|
|
4206
|
-
function
|
|
4235
|
+
function ko(e, t) {
|
|
4207
4236
|
return t.some((t) => e === t || e.startsWith(t + ".") || e.startsWith(t + "["));
|
|
4208
4237
|
}
|
|
4209
|
-
function
|
|
4238
|
+
function Ao(e, t) {
|
|
4210
4239
|
let n = e.invoke.bind(e), r = async (e) => {
|
|
4211
|
-
let r =
|
|
4240
|
+
let r = Oo(e);
|
|
4212
4241
|
if (!r.length) return `PATH_OUT_OF_SCOPE:子 agent 仅可增量 patch(writablePaths: ${t.join(", ")}),不能整体替换(无 jsonPath)。用 write({patch:{jsonPath,...}}) 增量改。`;
|
|
4213
|
-
for (let e of r) if (!
|
|
4242
|
+
for (let e of r) if (!ko(e, t)) return `PATH_OUT_OF_SCOPE:子 agent 写 "${e}" 越界(仅可写 ${t.join(", ")})。`;
|
|
4214
4243
|
return n(e);
|
|
4215
4244
|
};
|
|
4216
4245
|
return new Proxy(e, { get(e, t, n) {
|
|
4217
4246
|
return t === "invoke" ? r : Reflect.get(e, t, n);
|
|
4218
4247
|
} });
|
|
4219
4248
|
}
|
|
4220
|
-
async function
|
|
4221
|
-
let a = t.depth ?? 0, o = t.maxDepth ??
|
|
4249
|
+
async function jo(e, t, n, r, i) {
|
|
4250
|
+
let a = t.depth ?? 0, o = t.maxDepth ?? Co, s = /* @__PURE__ */ new Set([...So, ...t.allowedTools ?? []]), c = () => typeof t.allTools == "function" ? t.allTools() : t.allTools, l = [...c().filter((e) => s.has(e.name) && !Eo.includes(e.name)), ...t.extraTools ?? []];
|
|
4222
4251
|
if (t.writablePaths?.length) {
|
|
4223
|
-
l = l.filter((e) => !
|
|
4224
|
-
let e = c().filter((e) =>
|
|
4252
|
+
l = l.filter((e) => !Do.includes(e.name));
|
|
4253
|
+
let e = c().filter((e) => Do.includes(e.name) && !Eo.includes(e.name)).map((e) => Ao(e, t.writablePaths));
|
|
4225
4254
|
l = [...l, ...e];
|
|
4226
4255
|
}
|
|
4227
|
-
let u = a + 1 < o ? [
|
|
4256
|
+
let u = a + 1 < o ? [Mo({
|
|
4228
4257
|
...t,
|
|
4229
4258
|
depth: a + 1
|
|
4230
4259
|
})] : [], d = t.getFocuses?.() ?? [], f = d.length ? pa({
|
|
4231
4260
|
getSchema: t.getSchema ?? (() => null),
|
|
4232
4261
|
initialFocuses: d
|
|
4233
4262
|
}) : void 0, p = ni({
|
|
4234
|
-
model:
|
|
4263
|
+
model: xo(t.llm) ? t.llm.model ?? t.llm.modelName : e.model ?? t.llm.model,
|
|
4235
4264
|
contextWindow: t.llm.contextWindow,
|
|
4236
4265
|
maxOutputTokens: t.llm.maxOutputTokens
|
|
4237
4266
|
});
|
|
@@ -4242,7 +4271,7 @@ async function Ao(e, t, n, r, i) {
|
|
|
4242
4271
|
} : { contextWindow: p.contextWindow }), h = ji({
|
|
4243
4272
|
contextWindow: p.contextWindow,
|
|
4244
4273
|
maxOutputTokens: p.maxOutputTokens,
|
|
4245
|
-
...
|
|
4274
|
+
...xo(t.llm) ? { llm: t.llm } : {
|
|
4246
4275
|
apiKey: t.llm.apiKey,
|
|
4247
4276
|
baseUrl: t.llm.baseUrl,
|
|
4248
4277
|
model: e.model ?? t.llm.model,
|
|
@@ -4258,7 +4287,7 @@ async function Ao(e, t, n, r, i) {
|
|
|
4258
4287
|
...f ? [f] : [],
|
|
4259
4288
|
...t.middleware ?? []
|
|
4260
4289
|
],
|
|
4261
|
-
maxToolRounds: t.maxToolRounds ??
|
|
4290
|
+
maxToolRounds: t.maxToolRounds ?? To,
|
|
4262
4291
|
onLog: i,
|
|
4263
4292
|
debug: t.debug
|
|
4264
4293
|
});
|
|
@@ -4270,17 +4299,21 @@ async function Ao(e, t, n, r, i) {
|
|
|
4270
4299
|
r && (e.type === "tool_call" || e.type === "tool_result") && r(e);
|
|
4271
4300
|
}, n);
|
|
4272
4301
|
}
|
|
4273
|
-
function
|
|
4274
|
-
let n = e.maxParallel ??
|
|
4275
|
-
|
|
4302
|
+
function Mo(e) {
|
|
4303
|
+
let n = e.maxParallel ?? wo, i, a, o, s = (t, n) => (r) => {
|
|
4304
|
+
e.tracker?.pushStep(t, {
|
|
4305
|
+
kind: r.type,
|
|
4306
|
+
name: r.name,
|
|
4307
|
+
ts: Date.now()
|
|
4308
|
+
}), a && a({
|
|
4276
4309
|
type: "subagent",
|
|
4277
|
-
taskId:
|
|
4278
|
-
label:
|
|
4279
|
-
kind:
|
|
4280
|
-
name:
|
|
4281
|
-
args:
|
|
4282
|
-
result:
|
|
4283
|
-
status:
|
|
4310
|
+
taskId: t,
|
|
4311
|
+
label: n,
|
|
4312
|
+
kind: r.type,
|
|
4313
|
+
name: r.name,
|
|
4314
|
+
args: r.type === "tool_call" ? r.args : void 0,
|
|
4315
|
+
result: r.type === "tool_result" ? r.result : void 0,
|
|
4316
|
+
status: r.type === "tool_result" ? r.status : void 0
|
|
4284
4317
|
});
|
|
4285
4318
|
};
|
|
4286
4319
|
return {
|
|
@@ -4290,15 +4323,21 @@ function jo(e) {
|
|
|
4290
4323
|
...e,
|
|
4291
4324
|
...r?.length ? { allowedTools: r } : {},
|
|
4292
4325
|
...a?.length ? { writablePaths: a } : {}
|
|
4293
|
-
} : e, u = `sub-${Math.random().toString(36).slice(2, 8)}`, d = n?.trim() || "子任务"
|
|
4294
|
-
return await Ao({
|
|
4295
|
-
prompt: t,
|
|
4296
|
-
role: n,
|
|
4297
|
-
model: c
|
|
4298
|
-
}, l, i, s(u, d), (e) => o?.({
|
|
4326
|
+
} : e, u = `sub-${Math.random().toString(36).slice(2, 8)}`, d = n?.trim() || "子任务", f = (e) => o?.({
|
|
4299
4327
|
...e,
|
|
4300
4328
|
source: `子:${d}`
|
|
4301
|
-
}));
|
|
4329
|
+
}), p = Date.now();
|
|
4330
|
+
e.tracker?.start(u, t, d, p);
|
|
4331
|
+
try {
|
|
4332
|
+
let r = await jo({
|
|
4333
|
+
prompt: t,
|
|
4334
|
+
role: n,
|
|
4335
|
+
model: c
|
|
4336
|
+
}, l, i, s(u, d), f);
|
|
4337
|
+
return e.tracker?.finish(u, "done", r), r;
|
|
4338
|
+
} catch (t) {
|
|
4339
|
+
throw e.tracker?.finish(u, "error", String(t?.message ?? t)), t;
|
|
4340
|
+
}
|
|
4302
4341
|
}, {
|
|
4303
4342
|
name: "spawn_agent",
|
|
4304
4343
|
description: "委派一个独立子 agent 执行子任务,返回其最终结论(过程隔离,不占主上下文)。用于:分治大任务、专项调研、独立验证。子 agent 默认只读(不改页面)。",
|
|
@@ -4310,11 +4349,17 @@ function jo(e) {
|
|
|
4310
4349
|
model: t.string().optional().describe("覆盖模型(默认同主)")
|
|
4311
4350
|
})
|
|
4312
4351
|
}), r(async ({ tasks: t }) => (await Qr(t, n, async (t, n) => {
|
|
4313
|
-
let r = `sub-${n}-${Math.random().toString(36).slice(2, 6)}`, a = t.role?.trim() || `子任务${n + 1}
|
|
4314
|
-
return Ao(t, e, i, s(r, a), (e) => o?.({
|
|
4352
|
+
let r = `sub-${n}-${Math.random().toString(36).slice(2, 6)}`, a = t.role?.trim() || `子任务${n + 1}`, c = (e) => o?.({
|
|
4315
4353
|
...e,
|
|
4316
4354
|
source: `子:${a}`
|
|
4317
|
-
}));
|
|
4355
|
+
}), l = Date.now();
|
|
4356
|
+
e.tracker?.start(r, t.prompt, a, l);
|
|
4357
|
+
try {
|
|
4358
|
+
let n = await jo(t, e, i, s(r, a), c);
|
|
4359
|
+
return e.tracker?.finish(r, "done", n ?? "(未完成)"), n;
|
|
4360
|
+
} catch (t) {
|
|
4361
|
+
throw e.tracker?.finish(r, "error", String(t?.message ?? t)), t;
|
|
4362
|
+
}
|
|
4318
4363
|
}, i)).map((e, t) => `【子任务 ${t + 1}】\n${e ?? "(未完成)"}`).join("\n\n"), {
|
|
4319
4364
|
name: "spawn_agents",
|
|
4320
4365
|
description: "并行委派多个独立子 agent,聚合各自结论(子 agent 间互不通信,由你汇总)。适合:多路调研、多视角审查、批量处理。",
|
|
@@ -4326,8 +4371,8 @@ function jo(e) {
|
|
|
4326
4371
|
wrapToolCall: async (e, t) => (e.signal && (i = e.signal), e.emit && (a = e.emit), e.logSink && (o = e.logSink), t(e))
|
|
4327
4372
|
};
|
|
4328
4373
|
}
|
|
4329
|
-
var
|
|
4330
|
-
function
|
|
4374
|
+
var No = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
4375
|
+
function Po(e, t) {
|
|
4331
4376
|
let n = e.tools ?? [];
|
|
4332
4377
|
return {
|
|
4333
4378
|
llm: e.llm ?? t.llm,
|
|
@@ -4344,10 +4389,11 @@ function No(e, t) {
|
|
|
4344
4389
|
...e.middleware?.length ? { middleware: e.middleware } : {},
|
|
4345
4390
|
...e.summarization === void 0 ? {} : { summarization: e.summarization },
|
|
4346
4391
|
...t.getFocuses ? { getFocuses: t.getFocuses } : {},
|
|
4347
|
-
...t.getSchema ? { getSchema: t.getSchema } : {}
|
|
4392
|
+
...t.getSchema ? { getSchema: t.getSchema } : {},
|
|
4393
|
+
...t.tracker ? { tracker: t.tracker } : {}
|
|
4348
4394
|
};
|
|
4349
4395
|
}
|
|
4350
|
-
function
|
|
4396
|
+
function Fo(e, n) {
|
|
4351
4397
|
let i, a, o, s = (e, t) => (n) => {
|
|
4352
4398
|
a && a({
|
|
4353
4399
|
type: "subagent",
|
|
@@ -4363,7 +4409,7 @@ function Po(e, n) {
|
|
|
4363
4409
|
function d(e) {
|
|
4364
4410
|
let a = /* @__PURE__ */ new Set(), c = [], l = [];
|
|
4365
4411
|
for (let u of e) {
|
|
4366
|
-
if (!
|
|
4412
|
+
if (!No.test(u.id)) {
|
|
4367
4413
|
console.warn(`[subagents] id "${u.id}" 非合法工具名(须 [a-zA-Z_][a-zA-Z0-9_]*),已跳过`);
|
|
4368
4414
|
continue;
|
|
4369
4415
|
}
|
|
@@ -4373,11 +4419,23 @@ function Po(e, n) {
|
|
|
4373
4419
|
continue;
|
|
4374
4420
|
}
|
|
4375
4421
|
a.add(e), c.push(u), l.push(r(async ({ task: e }) => {
|
|
4376
|
-
let t =
|
|
4377
|
-
return Ao({ prompt: e }, t, i, s(`use_${u.id}`, u.id), (e) => o?.({
|
|
4422
|
+
let t = Po(u, n), r = (e) => o?.({
|
|
4378
4423
|
...e,
|
|
4379
4424
|
source: `子:${u.id}`
|
|
4380
|
-
}))
|
|
4425
|
+
}), a = n.tracker, c = a ? `use_${u.id}-${Math.random().toString(36).slice(2, 6)}` : `use_${u.id}`, l = s(`use_${u.id}`, u.id), d = a ? (e) => {
|
|
4426
|
+
a.pushStep(c, {
|
|
4427
|
+
kind: e.type,
|
|
4428
|
+
name: e.name,
|
|
4429
|
+
ts: Date.now()
|
|
4430
|
+
}), l(e);
|
|
4431
|
+
} : l, f = Date.now();
|
|
4432
|
+
a?.start(c, e, u.id, f);
|
|
4433
|
+
try {
|
|
4434
|
+
let n = await jo({ prompt: e }, t, i, d, r);
|
|
4435
|
+
return a?.finish(c, "done", n), n;
|
|
4436
|
+
} catch (e) {
|
|
4437
|
+
throw a?.finish(c, "error", String(e?.message ?? e)), e;
|
|
4438
|
+
}
|
|
4381
4439
|
}, {
|
|
4382
4440
|
name: `use_${u.id}`,
|
|
4383
4441
|
description: `委派给「${u.description}」子 agent 执行任务,返回其结论(过程隔离,不占主上下文)。`,
|
|
@@ -4434,7 +4492,7 @@ function Po(e, n) {
|
|
|
4434
4492
|
}
|
|
4435
4493
|
//#endregion
|
|
4436
4494
|
//#region src/core/harness/verify.ts
|
|
4437
|
-
function
|
|
4495
|
+
function Io(e) {
|
|
4438
4496
|
return {
|
|
4439
4497
|
name: "verify",
|
|
4440
4498
|
async beforeReturn({ messages: t, state: n, log: r }) {
|
|
@@ -4446,10 +4504,10 @@ function Fo(e) {
|
|
|
4446
4504
|
if (e.adversarial) {
|
|
4447
4505
|
r?.("middleware", {
|
|
4448
4506
|
stage: "adversarial_start",
|
|
4449
|
-
model:
|
|
4507
|
+
model: Wo(e.adversarial.llm),
|
|
4450
4508
|
tools: (e.adversarial.tools ?? []).length
|
|
4451
4509
|
});
|
|
4452
|
-
let n = await
|
|
4510
|
+
let n = await Jo(t, e.adversarial.llm, r, e.adversarial.tools);
|
|
4453
4511
|
if (r?.("middleware", {
|
|
4454
4512
|
stage: "adversarial_done",
|
|
4455
4513
|
clean: n === null,
|
|
@@ -4460,18 +4518,18 @@ function Fo(e) {
|
|
|
4460
4518
|
}
|
|
4461
4519
|
};
|
|
4462
4520
|
}
|
|
4463
|
-
var
|
|
4521
|
+
var Lo = /* @__PURE__ */ new Set([
|
|
4464
4522
|
"set_data",
|
|
4465
4523
|
"edit_data",
|
|
4466
4524
|
"delete_data",
|
|
4467
4525
|
"write"
|
|
4468
|
-
]),
|
|
4469
|
-
function
|
|
4526
|
+
]), Ro = /校验失败|SCHEMA_INVALID|未注册|不存在|仅支持|必须是|NOT_OBJECT|PATH_UNSAFE|VERSION_CONFLICT|WRITE_INTERCEPT/;
|
|
4527
|
+
function zo(e) {
|
|
4470
4528
|
let t = /* @__PURE__ */ new Map();
|
|
4471
4529
|
for (let n of e) {
|
|
4472
4530
|
let e = n?.tool_calls;
|
|
4473
4531
|
if (Array.isArray(e)) for (let n of e) {
|
|
4474
|
-
if (!
|
|
4532
|
+
if (!Lo.has(n.name)) continue;
|
|
4475
4533
|
let e = n.id, r = n?.args ?? {};
|
|
4476
4534
|
if (n.name === "write") if (r.del && r.patch?.jsonPath) t.set(r.patch.jsonPath, {
|
|
4477
4535
|
path: r.patch.jsonPath,
|
|
@@ -4510,7 +4568,7 @@ function Ro(e) {
|
|
|
4510
4568
|
}
|
|
4511
4569
|
return [...t.values()];
|
|
4512
4570
|
}
|
|
4513
|
-
function
|
|
4571
|
+
function Bo(e) {
|
|
4514
4572
|
let t = /* @__PURE__ */ new Map();
|
|
4515
4573
|
for (let n of e) {
|
|
4516
4574
|
let e = n?.tool_call_id, r = n?.content;
|
|
@@ -4518,7 +4576,7 @@ function zo(e) {
|
|
|
4518
4576
|
}
|
|
4519
4577
|
return t;
|
|
4520
4578
|
}
|
|
4521
|
-
function
|
|
4579
|
+
function Vo(e, t) {
|
|
4522
4580
|
if (t === "") return e;
|
|
4523
4581
|
if (e == null) return;
|
|
4524
4582
|
let n = e;
|
|
@@ -4528,16 +4586,16 @@ function Bo(e, t) {
|
|
|
4528
4586
|
}
|
|
4529
4587
|
return n;
|
|
4530
4588
|
}
|
|
4531
|
-
function
|
|
4589
|
+
function Ho(e = {}) {
|
|
4532
4590
|
let t = typeof e.root == "function" ? e.root : e.root === void 0 ? () => e.window ?? globalThis.window : () => e.root, n = typeof e.schemas == "function" ? e.schemas : () => e.schemas ?? {};
|
|
4533
4591
|
return async ({ messages: e }) => {
|
|
4534
|
-
let r =
|
|
4592
|
+
let r = zo(e);
|
|
4535
4593
|
if (!r.length) return { ok: !0 };
|
|
4536
|
-
let i =
|
|
4594
|
+
let i = Bo(e), a = n()[""], o = t(), s = [];
|
|
4537
4595
|
for (let { path: e, op: t, callId: n } of r) {
|
|
4538
4596
|
let r = n ? i.get(n) : void 0;
|
|
4539
|
-
if (r &&
|
|
4540
|
-
let c =
|
|
4597
|
+
if (r && Ro.test(r)) continue;
|
|
4598
|
+
let c = Vo(o, e);
|
|
4541
4599
|
if (t === "delete_data") c !== void 0 && s.push(`${e} 删除后读回仍有值,疑似未生效`);
|
|
4542
4600
|
else if (c == null) s.push(`写入 ${e} 后读回为空,疑似未生效`);
|
|
4543
4601
|
else if (a) {
|
|
@@ -4551,17 +4609,17 @@ function Vo(e = {}) {
|
|
|
4551
4609
|
} : { ok: !0 };
|
|
4552
4610
|
};
|
|
4553
4611
|
}
|
|
4554
|
-
function Ho(e) {
|
|
4555
|
-
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
4556
|
-
}
|
|
4557
4612
|
function Uo(e) {
|
|
4558
|
-
return
|
|
4613
|
+
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
4559
4614
|
}
|
|
4560
|
-
|
|
4561
|
-
|
|
4562
|
-
return Wo.test(e);
|
|
4615
|
+
function Wo(e) {
|
|
4616
|
+
return Uo(e) ? e.model ?? e.modelName ?? "<实例>" : e.model ?? "<配置>";
|
|
4563
4617
|
}
|
|
4618
|
+
var Go = /无问题|没有问题|未发现问题|没有发现|没问题|未发现/;
|
|
4564
4619
|
function Ko(e) {
|
|
4620
|
+
return Go.test(e);
|
|
4621
|
+
}
|
|
4622
|
+
function qo(e) {
|
|
4565
4623
|
let t = "", n = "";
|
|
4566
4624
|
for (let r of e) r instanceof a ? t = typeof r.content == "string" ? r.content : "" : r instanceof i && !(r.tool_calls?.length > 0) && (n = typeof r.content == "string" ? r.content : "");
|
|
4567
4625
|
return {
|
|
@@ -4569,8 +4627,8 @@ function Ko(e) {
|
|
|
4569
4627
|
lastReply: n
|
|
4570
4628
|
};
|
|
4571
4629
|
}
|
|
4572
|
-
async function
|
|
4573
|
-
let { lastUser: i, lastReply: a } =
|
|
4630
|
+
async function Jo(e, t, n, r) {
|
|
4631
|
+
let { lastUser: i, lastReply: a } = qo(e);
|
|
4574
4632
|
if (!a) return null;
|
|
4575
4633
|
let o = Array.isArray(r) && r.length > 0, s = [
|
|
4576
4634
|
"你是严格的对抗式审查者,目标是找出以下 AI 助手回复的错误并证明它有问题(事实错误 / 遗漏 / 逻辑矛盾 / 与需求不符)。",
|
|
@@ -4581,7 +4639,7 @@ async function qo(e, t, n, r) {
|
|
|
4581
4639
|
].join("\n"), c = "你是严格的对抗式审查者,只找问题不赞美。目标是反驳,不是改进。", l = n ? (e) => n(e.type, {
|
|
4582
4640
|
...e.data,
|
|
4583
4641
|
source: "adversarial"
|
|
4584
|
-
}) : void 0, u = await ji(
|
|
4642
|
+
}) : void 0, u = await ji(Uo(t) ? {
|
|
4585
4643
|
llm: t,
|
|
4586
4644
|
tools: r,
|
|
4587
4645
|
maxToolRounds: o ? 4 : 1,
|
|
@@ -4606,11 +4664,11 @@ async function qo(e, t, n, r) {
|
|
|
4606
4664
|
stage: "adversarial_verdict",
|
|
4607
4665
|
verdict: u,
|
|
4608
4666
|
source: "adversarial"
|
|
4609
|
-
}),
|
|
4667
|
+
}), Ko(u) ? null : u.trim();
|
|
4610
4668
|
}
|
|
4611
4669
|
//#endregion
|
|
4612
4670
|
//#region src/core/utils/contextAnalysis.ts
|
|
4613
|
-
var
|
|
4671
|
+
var Yo = [
|
|
4614
4672
|
{
|
|
4615
4673
|
prefix: "## 可操作数据",
|
|
4616
4674
|
key: "dataHint"
|
|
@@ -4639,7 +4697,7 @@ var Jo = [
|
|
|
4639
4697
|
prefix: "【与当前问题可能相关的早期对话】",
|
|
4640
4698
|
key: "recall"
|
|
4641
4699
|
}
|
|
4642
|
-
],
|
|
4700
|
+
], Xo = [
|
|
4643
4701
|
{
|
|
4644
4702
|
key: "systemPrompt",
|
|
4645
4703
|
label: "系统提示词(身份/规则)"
|
|
@@ -4693,9 +4751,9 @@ var Jo = [
|
|
|
4693
4751
|
label: "其他"
|
|
4694
4752
|
}
|
|
4695
4753
|
];
|
|
4696
|
-
function
|
|
4754
|
+
function Zo() {
|
|
4697
4755
|
let e = {};
|
|
4698
|
-
for (let t of
|
|
4756
|
+
for (let t of Xo) e[t.key] = {
|
|
4699
4757
|
key: t.key,
|
|
4700
4758
|
label: t.label,
|
|
4701
4759
|
tokens: 0,
|
|
@@ -4704,16 +4762,16 @@ function Xo() {
|
|
|
4704
4762
|
};
|
|
4705
4763
|
return e;
|
|
4706
4764
|
}
|
|
4707
|
-
function
|
|
4765
|
+
function Qo(e, t) {
|
|
4708
4766
|
e.tokens += t, e.msgCount += 1;
|
|
4709
4767
|
}
|
|
4710
|
-
function
|
|
4768
|
+
function $o(e) {
|
|
4711
4769
|
let t = e.content;
|
|
4712
4770
|
return typeof t == "string" ? t : JSON.stringify(t ?? "");
|
|
4713
4771
|
}
|
|
4714
|
-
function
|
|
4772
|
+
function es(e, t) {
|
|
4715
4773
|
let n = [];
|
|
4716
|
-
for (let t of
|
|
4774
|
+
for (let t of Yo) {
|
|
4717
4775
|
let r = 0;
|
|
4718
4776
|
for (;;) {
|
|
4719
4777
|
let i = e.indexOf(t.prefix, r);
|
|
@@ -4726,35 +4784,35 @@ function $o(e, t) {
|
|
|
4726
4784
|
}
|
|
4727
4785
|
if (n.sort((e, t) => e.idx - t.idx), !n.length) {
|
|
4728
4786
|
let n = e.trim();
|
|
4729
|
-
n &&
|
|
4787
|
+
n && Qo(t.systemPrompt, X(n));
|
|
4730
4788
|
return;
|
|
4731
4789
|
}
|
|
4732
4790
|
if (n[0].idx > 0) {
|
|
4733
4791
|
let r = e.slice(0, n[0].idx).trim();
|
|
4734
|
-
r &&
|
|
4792
|
+
r && Qo(t.systemPrompt, X(r));
|
|
4735
4793
|
}
|
|
4736
4794
|
for (let r = 0; r < n.length; r++) {
|
|
4737
4795
|
let i = n[r].idx, a = r + 1 < n.length ? n[r + 1].idx : e.length, o = e.slice(i, a).trim();
|
|
4738
|
-
o &&
|
|
4796
|
+
o && Qo(t[n[r].key], X(o));
|
|
4739
4797
|
}
|
|
4740
4798
|
}
|
|
4741
|
-
function
|
|
4742
|
-
let n =
|
|
4799
|
+
function ts(e, t = {}) {
|
|
4800
|
+
let n = Zo(), r = -1;
|
|
4743
4801
|
for (let t = e.length - 1; t >= 0; t--) if (e[t] instanceof a) {
|
|
4744
4802
|
r = t;
|
|
4745
4803
|
break;
|
|
4746
4804
|
}
|
|
4747
4805
|
for (let t = 0; t < e.length; t++) {
|
|
4748
4806
|
let c = e[t];
|
|
4749
|
-
if (c instanceof o) $o(
|
|
4750
|
-
else if (c instanceof a)
|
|
4807
|
+
if (c instanceof o) es($o(c), n);
|
|
4808
|
+
else if (c instanceof a) Qo(n[t === r ? "current" : "history"], X($o(c)));
|
|
4751
4809
|
else if (c instanceof i) {
|
|
4752
4810
|
let e = c.tool_calls ?? [];
|
|
4753
4811
|
if (e.length) {
|
|
4754
4812
|
let t = e.map((e) => JSON.stringify(e.args ?? {})).join(" ");
|
|
4755
|
-
|
|
4756
|
-
} else
|
|
4757
|
-
} else c instanceof s ?
|
|
4813
|
+
Qo(n.toolResults, X(t));
|
|
4814
|
+
} else Qo(n.assistant, X($o(c)));
|
|
4815
|
+
} else c instanceof s ? Qo(n.toolResults, X($o(c))) : Qo(n.other, X($o(c)));
|
|
4758
4816
|
}
|
|
4759
4817
|
let c = Object.values(n).filter((e) => e.tokens > 0);
|
|
4760
4818
|
c.sort((e, t) => t.tokens - e.tokens);
|
|
@@ -4771,12 +4829,12 @@ function es(e, t = {}) {
|
|
|
4771
4829
|
}
|
|
4772
4830
|
//#endregion
|
|
4773
4831
|
//#region src/core/harness/contextInspector.ts
|
|
4774
|
-
function
|
|
4832
|
+
function ns(e = {}) {
|
|
4775
4833
|
let t, n = e.contextWindow;
|
|
4776
4834
|
return {
|
|
4777
4835
|
name: "context-inspector",
|
|
4778
4836
|
async wrapModelCall(r, i) {
|
|
4779
|
-
return t =
|
|
4837
|
+
return t = ts(r.messages, {
|
|
4780
4838
|
contextWindow: n,
|
|
4781
4839
|
thresholdRatio: e.thresholdRatio
|
|
4782
4840
|
}), i(r);
|
|
@@ -4789,13 +4847,13 @@ function ts(e = {}) {
|
|
|
4789
4847
|
}
|
|
4790
4848
|
//#endregion
|
|
4791
4849
|
//#region src/core/mcp/client.ts
|
|
4792
|
-
function
|
|
4850
|
+
function rs(e) {
|
|
4793
4851
|
let t = e?.content;
|
|
4794
4852
|
if (!Array.isArray(t) || !t.length) return "";
|
|
4795
4853
|
let n = t.map((e) => e.type === "text" && e.text ? e.text : e.type === "image" && e.data ? `[image:${String(e.data).slice(0, 32)}…]` : e.type === "audio" && e.data ? "[audio]" : e.type === "resource" && e.resource ? e.resource.text ?? e.resource.blob ?? "" : "").filter(Boolean).join("\n");
|
|
4796
4854
|
return e?.isError ? `工具错误:${n}` : n;
|
|
4797
4855
|
}
|
|
4798
|
-
async function
|
|
4856
|
+
async function is(e) {
|
|
4799
4857
|
let t = new URL(e.url), n = e.requestInit;
|
|
4800
4858
|
if (e.transport === "http") {
|
|
4801
4859
|
let { StreamableHTTPClientTransport: e } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
|
|
@@ -4808,8 +4866,8 @@ async function rs(e) {
|
|
|
4808
4866
|
let { WebSocketClientTransport: r } = await import("@modelcontextprotocol/sdk/client/websocket.js");
|
|
4809
4867
|
return new r(t);
|
|
4810
4868
|
}
|
|
4811
|
-
function
|
|
4812
|
-
return r(async (n) =>
|
|
4869
|
+
function as(e, t) {
|
|
4870
|
+
return r(async (n) => rs(await t.callTool({
|
|
4813
4871
|
name: e.name,
|
|
4814
4872
|
arguments: n
|
|
4815
4873
|
})), {
|
|
@@ -4818,39 +4876,39 @@ function is(e, t) {
|
|
|
4818
4876
|
schema: e.inputSchema
|
|
4819
4877
|
});
|
|
4820
4878
|
}
|
|
4821
|
-
async function
|
|
4822
|
-
let { Client: t } = await import("@modelcontextprotocol/sdk/client"), n = await
|
|
4879
|
+
async function os(e) {
|
|
4880
|
+
let { Client: t } = await import("@modelcontextprotocol/sdk/client"), n = await is(e), r = new t({
|
|
4823
4881
|
name: "page-agent-sdk",
|
|
4824
4882
|
version: "1.0"
|
|
4825
4883
|
}, { capabilities: {} });
|
|
4826
4884
|
await r.connect(n);
|
|
4827
4885
|
let { tools: i } = await r.listTools();
|
|
4828
4886
|
return {
|
|
4829
|
-
tools: i.map((e) =>
|
|
4887
|
+
tools: i.map((e) => as(e, r)),
|
|
4830
4888
|
close: () => r.close()
|
|
4831
4889
|
};
|
|
4832
4890
|
}
|
|
4833
4891
|
//#endregion
|
|
4834
4892
|
//#region src/core/sdk/promptBuilder.ts
|
|
4835
|
-
var
|
|
4893
|
+
var ss = [
|
|
4836
4894
|
"你是一个 JSON 操作助手。集成方声明了一个主数据对象(含 zod schema 校验),你通过专用工具安全地读写它来完成任务。",
|
|
4837
4895
|
"所有写操作都经范围控制(仅 schema 声明字段内)与 schema 校验(不合法会返回结构化错误而非写入),并自动留快照可回退。",
|
|
4838
4896
|
"大对象/数组优先用增量 patch(只发改动)而非整体重传,避免输出被截断。",
|
|
4839
4897
|
"---",
|
|
4840
4898
|
ia.reliableWriteRules
|
|
4841
4899
|
].join("\n\n");
|
|
4842
|
-
function
|
|
4900
|
+
function cs(e, t) {
|
|
4843
4901
|
if (!e) return "";
|
|
4844
4902
|
let n = ca(e.schema, t);
|
|
4845
4903
|
return `\n\n## 可操作数据(字段以 read 工具返回的实际值为准)\n${e.description ? e.description + "\n" : ""}${n}`;
|
|
4846
4904
|
}
|
|
4847
|
-
function
|
|
4905
|
+
function ls(e) {
|
|
4848
4906
|
let t = e.appendReliableWriteRules !== !1;
|
|
4849
|
-
return e.systemPrompt ? t ? e.systemPrompt + "\n\n---\n\n" + ia.reliableWriteRules : e.systemPrompt :
|
|
4907
|
+
return e.systemPrompt ? t ? e.systemPrompt + "\n\n---\n\n" + ia.reliableWriteRules : e.systemPrompt : ss;
|
|
4850
4908
|
}
|
|
4851
4909
|
//#endregion
|
|
4852
4910
|
//#region src/core/sdk/defineTool.ts
|
|
4853
|
-
function
|
|
4911
|
+
function us(e) {
|
|
4854
4912
|
return r(async (t) => {
|
|
4855
4913
|
let n = await e.handler(t);
|
|
4856
4914
|
return typeof n == "string" ? n : JSON.stringify(n);
|
|
@@ -4862,7 +4920,7 @@ function ls(e) {
|
|
|
4862
4920
|
}
|
|
4863
4921
|
//#endregion
|
|
4864
4922
|
//#region src/core/sdk/inspectContextTool.ts
|
|
4865
|
-
var
|
|
4923
|
+
var ds = t.object({
|
|
4866
4924
|
path: t.string().optional().describe("分类 key 过滤(如 toolResults/history/systemPrompt/dataHint);不传=全部分类"),
|
|
4867
4925
|
role: t.enum([
|
|
4868
4926
|
"user",
|
|
@@ -4872,11 +4930,11 @@ var us = t.object({
|
|
|
4872
4930
|
]).optional().describe("聚焦每轮首句的角色(assistant→回复摘要,user→问题摘要);不影响工具列表"),
|
|
4873
4931
|
limit: t.number().int().min(1).max(50).optional().describe("返回最近 N 轮(默认全部;超 50 自动截最近 50 防返回过大)")
|
|
4874
4932
|
});
|
|
4875
|
-
function
|
|
4876
|
-
return
|
|
4933
|
+
function fs(e) {
|
|
4934
|
+
return us({
|
|
4877
4935
|
name: "inspect_context",
|
|
4878
4936
|
description: "查看当前对话上下文的构成(供压缩决策)。返回:totalTokens(历史轮次 token 总和,与触发判断同口径)、occupancy(窗口占用比)、contextWindow、categories(分类占用)、rounds(每轮 token/工具/首句)。先调用本工具查看构成,再决定压缩策略。",
|
|
4879
|
-
schema:
|
|
4937
|
+
schema: ds,
|
|
4880
4938
|
handler: (t) => {
|
|
4881
4939
|
let n = eo(e.getMessages()), r = n.length > 50 ? n.slice(n.length - 50) : n, i = (t.limit && r.length > t.limit ? r.slice(r.length - t.limit) : r).map((e) => {
|
|
4882
4940
|
let n = po(e), r = no(e), i = t.role === "assistant" ? e.assistantMsgs[0] ?? e.userMsg : e.userMsg, a = to(typeof i.content == "string" ? i.content : "", 60);
|
|
@@ -4899,7 +4957,7 @@ function ds(e) {
|
|
|
4899
4957
|
}
|
|
4900
4958
|
//#endregion
|
|
4901
4959
|
//#region src/core/sdk/compressDecision.ts
|
|
4902
|
-
var
|
|
4960
|
+
var ps = t.object({
|
|
4903
4961
|
keepRounds: t.number().int().min(0).max(50).optional(),
|
|
4904
4962
|
windowRatio: t.number().min(0).max(1).optional(),
|
|
4905
4963
|
summarize: t.object({ mode: t.enum(["index", "llm"]) }),
|
|
@@ -4909,23 +4967,23 @@ var fs = t.object({
|
|
|
4909
4967
|
}).refine((e) => e.keepRounds !== void 0 || e.windowRatio !== void 0, { message: "keepRounds 与 windowRatio 至少填一个(按当前触发模式)" });
|
|
4910
4968
|
//#endregion
|
|
4911
4969
|
//#region src/core/sdk/llmResolver.ts
|
|
4912
|
-
function
|
|
4970
|
+
function ms(e) {
|
|
4913
4971
|
let t = e.find((e) => e.role === "user");
|
|
4914
4972
|
if (!t) return;
|
|
4915
4973
|
let n = t.content, r = (typeof n == "string" ? n : Array.isArray(n) ? n.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(n ?? "")).trim().replace(/[\n\r]+/g, " ");
|
|
4916
4974
|
if (r) return r.length > 30 ? r.slice(0, 30) + "…" : r;
|
|
4917
4975
|
}
|
|
4918
|
-
function
|
|
4976
|
+
function hs(e) {
|
|
4919
4977
|
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
4920
4978
|
}
|
|
4921
|
-
function
|
|
4979
|
+
function gs(e) {
|
|
4922
4980
|
let t = e.content;
|
|
4923
4981
|
return typeof t == "string" ? t : Array.isArray(t) ? t.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(t ?? "");
|
|
4924
4982
|
}
|
|
4925
|
-
function
|
|
4983
|
+
function _s(e) {
|
|
4926
4984
|
let t = e.summaryLlm ?? e.llm;
|
|
4927
4985
|
if (!t) return;
|
|
4928
|
-
let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, i = e.summaryTimeoutMs ?? 15e3, s =
|
|
4986
|
+
let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, i = e.summaryTimeoutMs ?? 15e3, s = hs(t) ? t : null, c = hs(t) ? null : t;
|
|
4929
4987
|
if (c && !c.apiKey) {
|
|
4930
4988
|
e.summaryLlm && console.warn("[page-agent-sdk][summarization] summaryLlm 已配置但缺 apiKey,摘要回退主 agent 模型或零成本索引摘要");
|
|
4931
4989
|
return;
|
|
@@ -4937,16 +4995,16 @@ function gs(e) {
|
|
|
4937
4995
|
return !l && c && (l = await f(c, {
|
|
4938
4996
|
temperature: n,
|
|
4939
4997
|
maxTokens: r
|
|
4940
|
-
})),
|
|
4998
|
+
})), gs(await l.invoke([new o("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new a(e)], { signal: t.signal })).trim();
|
|
4941
4999
|
} finally {
|
|
4942
5000
|
clearTimeout(s);
|
|
4943
5001
|
}
|
|
4944
5002
|
};
|
|
4945
5003
|
}
|
|
4946
|
-
function
|
|
5004
|
+
function vs(e) {
|
|
4947
5005
|
let t = e.titleLlm ?? e.summaryLlm ?? e.llm;
|
|
4948
5006
|
if (!t) return;
|
|
4949
|
-
let n =
|
|
5007
|
+
let n = hs(t) ? t : null, r = hs(t) ? null : t;
|
|
4950
5008
|
if (r && !r.apiKey) return;
|
|
4951
5009
|
let i = n;
|
|
4952
5010
|
return async (e) => {
|
|
@@ -4955,7 +5013,7 @@ function _s(e) {
|
|
|
4955
5013
|
return !i && r && (i = await f(r, {
|
|
4956
5014
|
temperature: 0,
|
|
4957
5015
|
maxTokens: 30
|
|
4958
|
-
})),
|
|
5016
|
+
})), gs(await i.invoke([new o("根据以下对话的主旨,生成一个简短的中文标题(不超过15个字,不要标点和引号,直接输出标题文字)。"), new a(t)], { signal: n.signal })).trim().replace(/^["'""「『]|["'""」』]$/g, "").split("\n")[0].slice(0, 20);
|
|
4959
5017
|
} catch {
|
|
4960
5018
|
return "";
|
|
4961
5019
|
} finally {
|
|
@@ -4963,10 +5021,10 @@ function _s(e) {
|
|
|
4963
5021
|
}
|
|
4964
5022
|
};
|
|
4965
5023
|
}
|
|
4966
|
-
function
|
|
5024
|
+
function ys() {
|
|
4967
5025
|
return `call_dec_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
4968
5026
|
}
|
|
4969
|
-
function
|
|
5027
|
+
function bs(e) {
|
|
4970
5028
|
let t = e.match(/```(?:json)?\s*([\s\S]*?)```/), n = t ? t[1] : e, r = n.indexOf("{"), i = n.lastIndexOf("}");
|
|
4971
5029
|
if (r < 0 || i < 0 || i <= r) return null;
|
|
4972
5030
|
try {
|
|
@@ -4975,21 +5033,21 @@ function ys(e) {
|
|
|
4975
5033
|
return null;
|
|
4976
5034
|
}
|
|
4977
5035
|
}
|
|
4978
|
-
function
|
|
5036
|
+
function xs(e) {
|
|
4979
5037
|
if (!e) return null;
|
|
4980
|
-
let t =
|
|
5038
|
+
let t = bs(e);
|
|
4981
5039
|
if (t == null) return null;
|
|
4982
|
-
let n =
|
|
5040
|
+
let n = ps.safeParse(t);
|
|
4983
5041
|
return n.success ? n.data : null;
|
|
4984
5042
|
}
|
|
4985
|
-
async function
|
|
5043
|
+
async function Ss(e, t, n, r) {
|
|
4986
5044
|
let i = [...n];
|
|
4987
5045
|
for (let n = 0; n < 3; n++) {
|
|
4988
5046
|
let n = await e.invoke(i, { signal: r }), a = n?.tool_calls ?? [];
|
|
4989
|
-
if (!a.length) return
|
|
5047
|
+
if (!a.length) return gs(n).trim();
|
|
4990
5048
|
i = [...i, n];
|
|
4991
5049
|
for (let e of a) {
|
|
4992
|
-
let n = e.id ??
|
|
5050
|
+
let n = e.id ?? ys();
|
|
4993
5051
|
try {
|
|
4994
5052
|
let r = await t.invoke(e.args ?? {}), a = typeof r == "string" ? r : r?.content ?? JSON.stringify(r);
|
|
4995
5053
|
i = [...i, new s({
|
|
@@ -5006,10 +5064,10 @@ async function xs(e, t, n, r) {
|
|
|
5006
5064
|
}
|
|
5007
5065
|
return "";
|
|
5008
5066
|
}
|
|
5009
|
-
function
|
|
5067
|
+
function Cs(e) {
|
|
5010
5068
|
let t = e.summaryLlm ?? e.llm;
|
|
5011
5069
|
if (!t) return;
|
|
5012
|
-
let n =
|
|
5070
|
+
let n = hs(t) ? t : null, r = hs(t) ? null : t;
|
|
5013
5071
|
if (r && !r.apiKey) return;
|
|
5014
5072
|
let i = e.decisionTimeoutMs ?? 6e3, s = e.decisionMaxTokens ?? 2048, c = n;
|
|
5015
5073
|
return async (e) => {
|
|
@@ -5021,12 +5079,12 @@ function Ss(e) {
|
|
|
5021
5079
|
}));
|
|
5022
5080
|
let n = c;
|
|
5023
5081
|
if (typeof n.bindTools != "function") return null;
|
|
5024
|
-
let i =
|
|
5082
|
+
let i = fs({
|
|
5025
5083
|
getMessages: e.getMessages,
|
|
5026
5084
|
getSnapshot: e.getSnapshot,
|
|
5027
5085
|
contextWindow: e.contextWindow
|
|
5028
5086
|
}), l = n.bindTools([i]), u = e.triggerMode === "token" ? "token 模式:必填 windowRatio(0~1 保留窗口预算比例,如 0.4);keepRounds 可选" : "轮数模式:必填 keepRounds(保留最近几轮,如 6);windowRatio 可选", d = [new o(`你是对话历史压缩决策助手。当前触发模式 = ${e.triggerMode}(${e.triggerReason})。先调用 inspect_context 查看上下文构成,再输出压缩决策 JSON。${u}。仅输出 JSON,不要多余文字/markdown。schema:{keepRounds?(int 0-50), windowRatio?(0-1), summarize:{mode:"index"|"llm"}, recallTopK?(int 0-10), preserveTools?(string[]≤10), reason?(≤200字)}。keepRounds/windowRatio 至少填一个。`), new a(`触发原因:${e.triggerReason}\n上下文窗口:${e.contextWindow ?? "未知"} tokens\n阈值比例:${e.thresholdRatio ?? "未知"}\n\n请决策压缩策略(先 inspect_context 查看,再输出 JSON)。`)];
|
|
5029
|
-
return
|
|
5087
|
+
return xs(await Ss(l, i, d, t.signal)) || xs(await Ss(l, i, [...d, new a("上一次输出无效(JSON 解析失败或 schema 校验不通过)。请只输出符合 schema 的压缩决策 JSON,不要多余文字/markdown 代码块。")], t.signal));
|
|
5030
5088
|
} catch {
|
|
5031
5089
|
return null;
|
|
5032
5090
|
} finally {
|
|
@@ -5034,22 +5092,22 @@ function Ss(e) {
|
|
|
5034
5092
|
}
|
|
5035
5093
|
};
|
|
5036
5094
|
}
|
|
5037
|
-
function
|
|
5038
|
-
let t = e.llm, n =
|
|
5095
|
+
function ws(e) {
|
|
5096
|
+
let t = e.llm, n = hs(e.llm) ? void 0 : e.llm;
|
|
5039
5097
|
return {
|
|
5040
5098
|
modelCaps: ni({
|
|
5041
5099
|
model: n?.model ?? t?.model ?? t?.modelName,
|
|
5042
5100
|
contextWindow: e.contextWindow ?? n?.contextWindow ?? t?.contextWindow,
|
|
5043
5101
|
maxOutputTokens: e.maxOutputTokens ?? n?.maxOutputTokens ?? t?.maxOutputTokens
|
|
5044
5102
|
}),
|
|
5045
|
-
summaryLlmInvoke:
|
|
5046
|
-
titleLlmInvoke:
|
|
5047
|
-
compressDecisionInvoke:
|
|
5103
|
+
summaryLlmInvoke: _s(e),
|
|
5104
|
+
titleLlmInvoke: vs(e),
|
|
5105
|
+
compressDecisionInvoke: Cs(e)
|
|
5048
5106
|
};
|
|
5049
5107
|
}
|
|
5050
5108
|
//#endregion
|
|
5051
5109
|
//#region src/core/sdk/conflictManager.ts
|
|
5052
|
-
function
|
|
5110
|
+
function Ts(e) {
|
|
5053
5111
|
let t = /* @__PURE__ */ Ot(null), n = 0;
|
|
5054
5112
|
function r(r) {
|
|
5055
5113
|
return new Promise((i) => {
|
|
@@ -5080,7 +5138,7 @@ function ws(e) {
|
|
|
5080
5138
|
}
|
|
5081
5139
|
//#endregion
|
|
5082
5140
|
//#region src/core/utils/id.ts
|
|
5083
|
-
function
|
|
5141
|
+
function Es() {
|
|
5084
5142
|
try {
|
|
5085
5143
|
if (typeof crypto < "u" && typeof crypto.randomUUID == "function") return crypto.randomUUID();
|
|
5086
5144
|
} catch {}
|
|
@@ -5088,7 +5146,7 @@ function Ts() {
|
|
|
5088
5146
|
}
|
|
5089
5147
|
//#endregion
|
|
5090
5148
|
//#region src/core/backends/storage.ts
|
|
5091
|
-
var
|
|
5149
|
+
var Ds = "chat-sdk", Os = 50 * 1024 * 1024, ks = 4 * 1024 * 1024, As = 10 * 1024 * 1024, js = .9, Ms = 500, Ns = 300, Ps = "__meta__", Fs = "v:1", Is = [
|
|
5092
5150
|
"messages",
|
|
5093
5151
|
"vfs",
|
|
5094
5152
|
"todos",
|
|
@@ -5099,51 +5157,51 @@ var Es = "chat-sdk", Ds = 50 * 1024 * 1024, Os = 4 * 1024 * 1024, ks = 10 * 1024
|
|
|
5099
5157
|
"workingMemory",
|
|
5100
5158
|
"focus"
|
|
5101
5159
|
];
|
|
5102
|
-
function Is(e) {
|
|
5103
|
-
return e === "local" || e === "session" ? Os : Ds;
|
|
5104
|
-
}
|
|
5105
5160
|
function Ls(e) {
|
|
5161
|
+
return e === "local" || e === "session" ? ks : Os;
|
|
5162
|
+
}
|
|
5163
|
+
function Rs(e) {
|
|
5106
5164
|
if (typeof e != "object" || !e) return !1;
|
|
5107
5165
|
let t = e;
|
|
5108
5166
|
return t.name === "QuotaExceededError" || t.name === "NS_ERROR_DOM_QUOTA_REACHED" || t.code === 22 || t.code === 1014;
|
|
5109
5167
|
}
|
|
5110
|
-
function
|
|
5168
|
+
function zs(e, t, n, r) {
|
|
5111
5169
|
return [
|
|
5112
|
-
|
|
5170
|
+
Fs,
|
|
5113
5171
|
e,
|
|
5114
5172
|
t,
|
|
5115
5173
|
n,
|
|
5116
5174
|
r
|
|
5117
5175
|
].join("::");
|
|
5118
5176
|
}
|
|
5119
|
-
function
|
|
5177
|
+
function Bs(e, t, n) {
|
|
5120
5178
|
return [
|
|
5121
|
-
|
|
5179
|
+
Fs,
|
|
5122
5180
|
e,
|
|
5123
5181
|
t,
|
|
5124
5182
|
n
|
|
5125
5183
|
].join("::") + "::";
|
|
5126
5184
|
}
|
|
5127
|
-
function
|
|
5185
|
+
function Vs(e, t) {
|
|
5128
5186
|
return [
|
|
5129
|
-
|
|
5187
|
+
Fs,
|
|
5130
5188
|
e,
|
|
5131
5189
|
t
|
|
5132
5190
|
].join("::") + "::";
|
|
5133
5191
|
}
|
|
5134
|
-
function
|
|
5135
|
-
return [
|
|
5192
|
+
function Hs(e) {
|
|
5193
|
+
return [Fs, e].join("::") + "::";
|
|
5136
5194
|
}
|
|
5137
|
-
var
|
|
5138
|
-
function
|
|
5139
|
-
|
|
5195
|
+
var Us = null;
|
|
5196
|
+
function Ws(e) {
|
|
5197
|
+
Us ||= new TextEncoder();
|
|
5140
5198
|
try {
|
|
5141
|
-
return
|
|
5199
|
+
return Us.encode(JSON.stringify(e)).length;
|
|
5142
5200
|
} catch {
|
|
5143
5201
|
return 0;
|
|
5144
5202
|
}
|
|
5145
5203
|
}
|
|
5146
|
-
function
|
|
5204
|
+
function Gs(e, t, n) {
|
|
5147
5205
|
let r = e.reduce((e, t) => e + t.bytes, 0);
|
|
5148
5206
|
if (r <= t) return [];
|
|
5149
5207
|
let i = t * n, a = [...e].sort((e, t) => e.lastAccessed - t.lastAccessed), o = [];
|
|
@@ -5153,7 +5211,7 @@ function Ws(e, t, n) {
|
|
|
5153
5211
|
}
|
|
5154
5212
|
return o;
|
|
5155
5213
|
}
|
|
5156
|
-
function
|
|
5214
|
+
function Ks() {
|
|
5157
5215
|
let e = /* @__PURE__ */ new Map();
|
|
5158
5216
|
return {
|
|
5159
5217
|
async get(t) {
|
|
@@ -5173,7 +5231,7 @@ function Gs() {
|
|
|
5173
5231
|
}
|
|
5174
5232
|
};
|
|
5175
5233
|
}
|
|
5176
|
-
function
|
|
5234
|
+
function qs(e) {
|
|
5177
5235
|
return new Promise((t, n) => {
|
|
5178
5236
|
if (typeof indexedDB > "u") {
|
|
5179
5237
|
n(/* @__PURE__ */ Error("indexedDB 不可用"));
|
|
@@ -5234,7 +5292,7 @@ function Ks(e) {
|
|
|
5234
5292
|
}, r.onerror = () => n(r.error);
|
|
5235
5293
|
});
|
|
5236
5294
|
}
|
|
5237
|
-
function
|
|
5295
|
+
function Js(e) {
|
|
5238
5296
|
return {
|
|
5239
5297
|
async get(t) {
|
|
5240
5298
|
let n = e.getItem(t);
|
|
@@ -5268,12 +5326,12 @@ function qs(e) {
|
|
|
5268
5326
|
}
|
|
5269
5327
|
};
|
|
5270
5328
|
}
|
|
5271
|
-
function
|
|
5329
|
+
function Ys(e, t, n) {
|
|
5272
5330
|
let r = (e.get(t) ?? Promise.resolve()).then(n, n);
|
|
5273
5331
|
return e.set(t, r.then(() => void 0, () => void 0)), r;
|
|
5274
5332
|
}
|
|
5275
|
-
function
|
|
5276
|
-
let t = e.dbName ??
|
|
5333
|
+
function Xs(e = {}) {
|
|
5334
|
+
let t = e.dbName ?? Ds, n = e.backend ?? "indexed", r = e.maxBytes ?? Ls(n), i = e.maxBytesPerSession ?? As, a = e.evictionWatermark ?? js, o = e.debounceMs ?? Ms, s = /* @__PURE__ */ new Set();
|
|
5277
5335
|
function c(e) {
|
|
5278
5336
|
for (let t of s) try {
|
|
5279
5337
|
t(e);
|
|
@@ -5286,16 +5344,16 @@ function Ys(e = {}) {
|
|
|
5286
5344
|
try {
|
|
5287
5345
|
if (n === "indexed") {
|
|
5288
5346
|
if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
|
|
5289
|
-
l = await
|
|
5347
|
+
l = await qs(t), d(!0);
|
|
5290
5348
|
} else if (n === "session") {
|
|
5291
5349
|
if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
|
|
5292
|
-
l =
|
|
5350
|
+
l = Js(sessionStorage), d(!0);
|
|
5293
5351
|
} else if (n === "local") {
|
|
5294
5352
|
if (typeof localStorage > "u") throw Error("localStorage 不可用");
|
|
5295
|
-
l =
|
|
5296
|
-
} else l =
|
|
5353
|
+
l = Js(localStorage), d(!0);
|
|
5354
|
+
} else l = Ks(), d(!1);
|
|
5297
5355
|
} catch (e) {
|
|
5298
|
-
l =
|
|
5356
|
+
l = Ks();
|
|
5299
5357
|
let t = e instanceof Error ? e.message : String(e);
|
|
5300
5358
|
d(!1), Promise.resolve().then(() => c({
|
|
5301
5359
|
type: "degraded",
|
|
@@ -5305,10 +5363,10 @@ function Ys(e = {}) {
|
|
|
5305
5363
|
})();
|
|
5306
5364
|
let p = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map();
|
|
5307
5365
|
function g(e, n, r, a) {
|
|
5308
|
-
let o =
|
|
5309
|
-
return
|
|
5366
|
+
let o = zs(t, r, a, Ps);
|
|
5367
|
+
return Ys(h, o, async () => {
|
|
5310
5368
|
let t = async () => {
|
|
5311
|
-
let t = await l.get(o), s = await l.get(e), u = s == null ? 0 :
|
|
5369
|
+
let t = await l.get(o), s = await l.get(e), u = s == null ? 0 : Ws(s), d = Ws(n), f = (t?.bytes ?? 0) + (d - u);
|
|
5312
5370
|
if (f > i) {
|
|
5313
5371
|
c({
|
|
5314
5372
|
type: "quota",
|
|
@@ -5330,12 +5388,12 @@ function Ys(e = {}) {
|
|
|
5330
5388
|
try {
|
|
5331
5389
|
await t();
|
|
5332
5390
|
} catch (e) {
|
|
5333
|
-
if (
|
|
5391
|
+
if (Rs(e) && !u) {
|
|
5334
5392
|
u = !0;
|
|
5335
5393
|
try {
|
|
5336
5394
|
await b();
|
|
5337
5395
|
} catch {}
|
|
5338
|
-
l =
|
|
5396
|
+
l = Ks(), Promise.resolve().then(() => c({
|
|
5339
5397
|
type: "degraded",
|
|
5340
5398
|
reason: "存储配额超限(QuotaExceededError),已淘汰最旧会话并降级内存"
|
|
5341
5399
|
}));
|
|
@@ -5347,7 +5405,7 @@ function Ys(e = {}) {
|
|
|
5347
5405
|
});
|
|
5348
5406
|
}
|
|
5349
5407
|
function _(e, n, r, i) {
|
|
5350
|
-
let a =
|
|
5408
|
+
let a = zs(t, e, n, r), s = p.get(a);
|
|
5351
5409
|
s && s.resolve();
|
|
5352
5410
|
let c = m.get(a);
|
|
5353
5411
|
return c && clearTimeout(c), new Promise((t) => {
|
|
@@ -5374,15 +5432,15 @@ function Ys(e = {}) {
|
|
|
5374
5432
|
function y() {
|
|
5375
5433
|
v ||= setTimeout(() => {
|
|
5376
5434
|
v = null, b();
|
|
5377
|
-
},
|
|
5435
|
+
}, Ns);
|
|
5378
5436
|
}
|
|
5379
5437
|
async function b() {
|
|
5380
5438
|
let e = [];
|
|
5381
|
-
await l.scan(
|
|
5439
|
+
await l.scan(Hs(t), (t, n) => {
|
|
5382
5440
|
t.endsWith("::__meta__") && e.push(n);
|
|
5383
5441
|
});
|
|
5384
|
-
let n =
|
|
5385
|
-
for (let e of n) await l.clearPrefix(
|
|
5442
|
+
let n = Gs(e, r, a);
|
|
5443
|
+
for (let e of n) await l.clearPrefix(Bs(t, e.agentId, e.sessionId)), c({
|
|
5386
5444
|
type: "evicted",
|
|
5387
5445
|
agentId: e.agentId,
|
|
5388
5446
|
sessionId: e.sessionId,
|
|
@@ -5393,13 +5451,13 @@ function Ys(e = {}) {
|
|
|
5393
5451
|
ready: f,
|
|
5394
5452
|
async listSessions(e) {
|
|
5395
5453
|
let n = [];
|
|
5396
|
-
return await l.scan(
|
|
5454
|
+
return await l.scan(Vs(t, e), (e, t) => {
|
|
5397
5455
|
e.endsWith("::__meta__") && n.push(t);
|
|
5398
5456
|
}), n.sort((e, t) => t.lastAccessed - e.lastAccessed);
|
|
5399
5457
|
},
|
|
5400
5458
|
async load(e, n) {
|
|
5401
|
-
let r =
|
|
5402
|
-
return await
|
|
5459
|
+
let r = zs(t, e, n, Ps);
|
|
5460
|
+
return await Ys(h, r, async () => {
|
|
5403
5461
|
let i = await l.get(r);
|
|
5404
5462
|
if (!i) return;
|
|
5405
5463
|
let a = {
|
|
@@ -5408,8 +5466,8 @@ function Ys(e = {}) {
|
|
|
5408
5466
|
todos: [],
|
|
5409
5467
|
memory: ""
|
|
5410
5468
|
};
|
|
5411
|
-
for (let r of
|
|
5412
|
-
let i = await l.get(
|
|
5469
|
+
for (let r of Is) {
|
|
5470
|
+
let i = await l.get(zs(t, e, n, r));
|
|
5413
5471
|
i != null && (a[r] = i);
|
|
5414
5472
|
}
|
|
5415
5473
|
return i.lastAccessed = Date.now(), await l.set(r, i), a;
|
|
@@ -5417,12 +5475,12 @@ function Ys(e = {}) {
|
|
|
5417
5475
|
},
|
|
5418
5476
|
async save(e, t, n) {
|
|
5419
5477
|
let r = [];
|
|
5420
|
-
for (let i of
|
|
5478
|
+
for (let i of Is) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
|
|
5421
5479
|
await Promise.all(r);
|
|
5422
5480
|
},
|
|
5423
5481
|
async updateTitle(e, n, r) {
|
|
5424
|
-
let i =
|
|
5425
|
-
return
|
|
5482
|
+
let i = zs(t, e, n, Ps);
|
|
5483
|
+
return Ys(h, i, async () => {
|
|
5426
5484
|
let e = await l.get(i);
|
|
5427
5485
|
e && (e.title = r, e.lastAccessed = Date.now(), await l.set(i, e));
|
|
5428
5486
|
});
|
|
@@ -5438,10 +5496,10 @@ function Ys(e = {}) {
|
|
|
5438
5496
|
})), c({ type: "flush" }), await b();
|
|
5439
5497
|
},
|
|
5440
5498
|
async deleteSession(e, n) {
|
|
5441
|
-
await l.clearPrefix(
|
|
5499
|
+
await l.clearPrefix(Bs(t, e, n));
|
|
5442
5500
|
},
|
|
5443
5501
|
async createSession(e, n, r) {
|
|
5444
|
-
let i = r ??
|
|
5502
|
+
let i = r ?? Es(), a = Date.now(), o = {
|
|
5445
5503
|
agentId: e,
|
|
5446
5504
|
sessionId: i,
|
|
5447
5505
|
createdAt: a,
|
|
@@ -5449,7 +5507,7 @@ function Ys(e = {}) {
|
|
|
5449
5507
|
bytes: 0,
|
|
5450
5508
|
title: n
|
|
5451
5509
|
};
|
|
5452
|
-
return await l.set(
|
|
5510
|
+
return await l.set(zs(t, e, i, Ps), o), i;
|
|
5453
5511
|
},
|
|
5454
5512
|
onEvent(e) {
|
|
5455
5513
|
s.add(e);
|
|
@@ -5464,15 +5522,15 @@ function Ys(e = {}) {
|
|
|
5464
5522
|
}
|
|
5465
5523
|
//#endregion
|
|
5466
5524
|
//#region src/core/sdk/optionsResolver.ts
|
|
5467
|
-
function Xs(e) {
|
|
5468
|
-
return e === void 0 || e === !1 ? null : typeof e == "string" ? Ys({ backend: e }) : e.enabled === !1 ? null : Ys(e);
|
|
5469
|
-
}
|
|
5470
5525
|
function Zs(e) {
|
|
5526
|
+
return e === void 0 || e === !1 ? null : typeof e == "string" ? Xs({ backend: e }) : e.enabled === !1 ? null : Xs(e);
|
|
5527
|
+
}
|
|
5528
|
+
function Qs(e) {
|
|
5471
5529
|
return e.dialog ?? {};
|
|
5472
5530
|
}
|
|
5473
5531
|
//#endregion
|
|
5474
5532
|
//#region src/core/capabilities.ts
|
|
5475
|
-
var
|
|
5533
|
+
var $s = [
|
|
5476
5534
|
{
|
|
5477
5535
|
name: "dataOps",
|
|
5478
5536
|
defaultOn: !0
|
|
@@ -5561,13 +5619,13 @@ var Qs = [
|
|
|
5561
5619
|
requires: ["summarization"]
|
|
5562
5620
|
}
|
|
5563
5621
|
];
|
|
5564
|
-
function
|
|
5622
|
+
function ec(e) {
|
|
5565
5623
|
let t = {};
|
|
5566
|
-
for (let n of
|
|
5624
|
+
for (let n of $s) {
|
|
5567
5625
|
let r = e?.[n.name];
|
|
5568
5626
|
t[n.name] = n.defaultOn ? r !== !1 : r === !0;
|
|
5569
5627
|
}
|
|
5570
|
-
for (let e of
|
|
5628
|
+
for (let e of $s) if (e.requires && t[e.name]) {
|
|
5571
5629
|
for (let n of e.requires) if (!t[n]) {
|
|
5572
5630
|
t[e.name] = !1;
|
|
5573
5631
|
break;
|
|
@@ -5577,7 +5635,7 @@ function $s(e) {
|
|
|
5577
5635
|
}
|
|
5578
5636
|
//#endregion
|
|
5579
5637
|
//#region src/core/sdk/events.ts
|
|
5580
|
-
function
|
|
5638
|
+
function tc(e) {
|
|
5581
5639
|
let t = /* @__PURE__ */ new Set(), n = (n) => {
|
|
5582
5640
|
if (n.type !== "approval_request") {
|
|
5583
5641
|
if (e) try {
|
|
@@ -5603,7 +5661,7 @@ function ec(e) {
|
|
|
5603
5661
|
}
|
|
5604
5662
|
//#endregion
|
|
5605
5663
|
//#region src/core/sdk/contextPreset.ts
|
|
5606
|
-
var
|
|
5664
|
+
var nc = {
|
|
5607
5665
|
auto: {
|
|
5608
5666
|
summaryThresholdRatio: .5,
|
|
5609
5667
|
windowRatio: .4,
|
|
@@ -5631,7 +5689,7 @@ var tc = {
|
|
|
5631
5689
|
enableRecall: !0,
|
|
5632
5690
|
enableLLMSummary: !0
|
|
5633
5691
|
}
|
|
5634
|
-
},
|
|
5692
|
+
}, rc = {
|
|
5635
5693
|
auto: ["describe_data", "read"],
|
|
5636
5694
|
conservative: ["describe_data"],
|
|
5637
5695
|
aggressive: ["describe_data", "read"],
|
|
@@ -5642,8 +5700,8 @@ var tc = {
|
|
|
5642
5700
|
"search_data"
|
|
5643
5701
|
]
|
|
5644
5702
|
};
|
|
5645
|
-
function
|
|
5646
|
-
let n =
|
|
5703
|
+
function ic(e, t) {
|
|
5704
|
+
let n = nc[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
|
|
5647
5705
|
return {
|
|
5648
5706
|
...n,
|
|
5649
5707
|
...r,
|
|
@@ -5653,7 +5711,7 @@ function rc(e, t) {
|
|
|
5653
5711
|
}
|
|
5654
5712
|
//#endregion
|
|
5655
5713
|
//#region src/core/sdk/middlewareStack.ts
|
|
5656
|
-
var
|
|
5714
|
+
var ac = {
|
|
5657
5715
|
dataHint: 10,
|
|
5658
5716
|
usageHints: 20,
|
|
5659
5717
|
todos: 30,
|
|
@@ -5670,29 +5728,29 @@ var ic = {
|
|
|
5670
5728
|
subagents: 140,
|
|
5671
5729
|
augmentSystem: 150
|
|
5672
5730
|
};
|
|
5673
|
-
function
|
|
5731
|
+
function oc(e) {
|
|
5674
5732
|
return e.map((e, t) => ({
|
|
5675
5733
|
m: e,
|
|
5676
5734
|
i: t,
|
|
5677
|
-
p:
|
|
5735
|
+
p: ac[e.name] ?? Infinity
|
|
5678
5736
|
})).sort((e, t) => e.p - t.p || e.i - t.i).map((e) => e.m);
|
|
5679
5737
|
}
|
|
5680
5738
|
//#endregion
|
|
5681
5739
|
//#region src/core/tools/jsonUtils.ts
|
|
5682
|
-
var
|
|
5740
|
+
var sc = /* @__PURE__ */ new Set([
|
|
5683
5741
|
"__proto__",
|
|
5684
5742
|
"constructor",
|
|
5685
5743
|
"prototype"
|
|
5686
5744
|
]);
|
|
5687
|
-
function
|
|
5688
|
-
return e.split(".").some((e) =>
|
|
5745
|
+
function cc(e) {
|
|
5746
|
+
return e.split(".").some((e) => sc.has(e));
|
|
5689
5747
|
}
|
|
5690
|
-
function
|
|
5691
|
-
if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t))
|
|
5748
|
+
function lc(e, t) {
|
|
5749
|
+
if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t)) sc.has(n) || (e[n] = t[n]);
|
|
5692
5750
|
}
|
|
5693
5751
|
function Z(e, t) {
|
|
5694
5752
|
if (!t) return e;
|
|
5695
|
-
if (
|
|
5753
|
+
if (cc(t)) return;
|
|
5696
5754
|
let n = t.split("."), r = e;
|
|
5697
5755
|
for (let e of n) {
|
|
5698
5756
|
if (r == null) return;
|
|
@@ -5700,8 +5758,8 @@ function Z(e, t) {
|
|
|
5700
5758
|
}
|
|
5701
5759
|
return r;
|
|
5702
5760
|
}
|
|
5703
|
-
function
|
|
5704
|
-
if (!t ||
|
|
5761
|
+
function uc(e, t, n) {
|
|
5762
|
+
if (!t || cc(t)) return;
|
|
5705
5763
|
let r = t.split("."), i = e;
|
|
5706
5764
|
for (let e = 0; e < r.length - 1; e++) {
|
|
5707
5765
|
let t = r[e];
|
|
@@ -5709,8 +5767,8 @@ function lc(e, t, n) {
|
|
|
5709
5767
|
}
|
|
5710
5768
|
i[r[r.length - 1]] = n;
|
|
5711
5769
|
}
|
|
5712
|
-
function
|
|
5713
|
-
if (!t ||
|
|
5770
|
+
function dc(e, t) {
|
|
5771
|
+
if (!t || cc(t)) return !1;
|
|
5714
5772
|
let n = t.split("."), r = e;
|
|
5715
5773
|
for (let e = 0; e < n.length - 1; e++) {
|
|
5716
5774
|
if (r == null) return !1;
|
|
@@ -5719,10 +5777,10 @@ function uc(e, t) {
|
|
|
5719
5777
|
let i = n[n.length - 1];
|
|
5720
5778
|
return r == null || !(i in r) ? !1 : (Array.isArray(r) && /^\d+$/.test(i) ? r.splice(Number(i), 1) : delete r[i], !0);
|
|
5721
5779
|
}
|
|
5722
|
-
function
|
|
5780
|
+
function fc(e) {
|
|
5723
5781
|
return e === void 0 ? void 0 : JSON.parse(JSON.stringify(e));
|
|
5724
5782
|
}
|
|
5725
|
-
function
|
|
5783
|
+
function pc(e) {
|
|
5726
5784
|
if (typeof e != "string") return { parsed: e };
|
|
5727
5785
|
let t = e.trim();
|
|
5728
5786
|
if (!t) return { parsed: e };
|
|
@@ -5733,20 +5791,20 @@ function fc(e) {
|
|
|
5733
5791
|
return n ? { parseError: t } : { parsed: e };
|
|
5734
5792
|
}
|
|
5735
5793
|
}
|
|
5736
|
-
function
|
|
5794
|
+
function mc(e, t) {
|
|
5737
5795
|
if (typeof e != "object" || !e) return e;
|
|
5738
5796
|
let n = new Set(t);
|
|
5739
|
-
if (Array.isArray(e)) return e.map((e) =>
|
|
5797
|
+
if (Array.isArray(e)) return e.map((e) => mc(e, t));
|
|
5740
5798
|
let r = {};
|
|
5741
5799
|
for (let t of Object.keys(e)) n.has(t) && (r[t] = e[t]);
|
|
5742
5800
|
return r;
|
|
5743
5801
|
}
|
|
5744
|
-
function
|
|
5802
|
+
function hc(e, t) {
|
|
5745
5803
|
if (typeof e != "object" || !e) return e;
|
|
5746
5804
|
if (t <= 0) return Array.isArray(e) ? `[...${e.length}]` : "{...}";
|
|
5747
|
-
if (Array.isArray(e)) return e.map((e) =>
|
|
5805
|
+
if (Array.isArray(e)) return e.map((e) => hc(e, t - 1));
|
|
5748
5806
|
let n = {};
|
|
5749
|
-
for (let r of Object.keys(e)) n[r] =
|
|
5807
|
+
for (let r of Object.keys(e)) n[r] = hc(e[r], t - 1);
|
|
5750
5808
|
return n;
|
|
5751
5809
|
}
|
|
5752
5810
|
function Q(e, t = Infinity) {
|
|
@@ -5768,7 +5826,7 @@ function Q(e, t = Infinity) {
|
|
|
5768
5826
|
}
|
|
5769
5827
|
return r.length > t && (r = r.slice(0, t) + `\n…[已截断,原长度 ${r.length}]`), r;
|
|
5770
5828
|
}
|
|
5771
|
-
function
|
|
5829
|
+
function gc(e, t = 0) {
|
|
5772
5830
|
let n = 3735928559 ^ t, r = 1103547991 ^ t;
|
|
5773
5831
|
for (let t = 0; t < e.length; t++) {
|
|
5774
5832
|
let i = e.charCodeAt(t);
|
|
@@ -5777,31 +5835,31 @@ function hc(e, t = 0) {
|
|
|
5777
5835
|
return n = Math.imul(n ^ n >>> 16, 2246822507) ^ Math.imul(r ^ r >>> 13, 3266489909), r = Math.imul(r ^ r >>> 16, 2246822507) ^ Math.imul(n ^ n >>> 13, 3266489909), 4294967296 * (2097151 & r) + (n >>> 0);
|
|
5778
5836
|
}
|
|
5779
5837
|
function $(e) {
|
|
5780
|
-
return
|
|
5838
|
+
return gc(Q(e)).toString(36);
|
|
5781
5839
|
}
|
|
5782
|
-
function
|
|
5783
|
-
if (t === "set") return n ? (
|
|
5784
|
-
if (t === "remove") return n ? (
|
|
5840
|
+
function _c(e, t, n, r) {
|
|
5841
|
+
if (t === "set") return n ? (uc(e, n, r), null) : "set 操作需要 jsonPath(整体替换请用 set_data)";
|
|
5842
|
+
if (t === "remove") return n ? (dc(e, n), null) : "remove 操作需要 jsonPath";
|
|
5785
5843
|
if (t === "merge") {
|
|
5786
5844
|
let t = n ? Z(e, n) : e;
|
|
5787
|
-
return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (
|
|
5845
|
+
return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (lc(t, r), null);
|
|
5788
5846
|
}
|
|
5789
5847
|
let i = n ? Z(e, n) : e;
|
|
5790
5848
|
return Array.isArray(i) ? (Array.isArray(r) ? i.push(...r) : i.push(r), null) : `append 目标${n ? `(${n})` : "(根)"}不是数组`;
|
|
5791
5849
|
}
|
|
5792
|
-
function
|
|
5793
|
-
if (t === "set")
|
|
5794
|
-
else if (t === "remove")
|
|
5795
|
-
else if (t === "merge")
|
|
5850
|
+
function vc(e, t, n, r) {
|
|
5851
|
+
if (t === "set") uc(e, n, r);
|
|
5852
|
+
else if (t === "remove") dc(e, n);
|
|
5853
|
+
else if (t === "merge") lc(n ? Z(e, n) : e, r);
|
|
5796
5854
|
else {
|
|
5797
5855
|
let t = n ? Z(e, n) : e;
|
|
5798
5856
|
Array.isArray(r) ? t.push(...r) : t.push(r);
|
|
5799
5857
|
}
|
|
5800
5858
|
}
|
|
5801
|
-
function vc(e, t) {
|
|
5802
|
-
typeof e == "object" && e && yc(e, t);
|
|
5803
|
-
}
|
|
5804
5859
|
function yc(e, t) {
|
|
5860
|
+
typeof e == "object" && e && bc(e, t);
|
|
5861
|
+
}
|
|
5862
|
+
function bc(e, t) {
|
|
5805
5863
|
if (Array.isArray(e)) {
|
|
5806
5864
|
e.length = 0, Array.isArray(t) && e.push(...t);
|
|
5807
5865
|
return;
|
|
@@ -5810,7 +5868,7 @@ function yc(e, t) {
|
|
|
5810
5868
|
for (let t of Object.keys(e)) t in n || delete e[t];
|
|
5811
5869
|
for (let t of Object.keys(n)) e[t] = n[t];
|
|
5812
5870
|
}
|
|
5813
|
-
function
|
|
5871
|
+
function xc(e, t, n = "") {
|
|
5814
5872
|
let r = [];
|
|
5815
5873
|
if (!(typeof e == "object" && e) || !(typeof t == "object" && t) || Array.isArray(e) !== Array.isArray(t)) return e !== t && r.push({
|
|
5816
5874
|
path: n || "(root)",
|
|
@@ -5829,14 +5887,14 @@ function bc(e, t, n = "") {
|
|
|
5829
5887
|
path: i,
|
|
5830
5888
|
from: e[a],
|
|
5831
5889
|
to: void 0
|
|
5832
|
-
}) : r.push(...
|
|
5890
|
+
}) : r.push(...xc(e[a], t[a], i));
|
|
5833
5891
|
}
|
|
5834
5892
|
return r;
|
|
5835
5893
|
}
|
|
5836
5894
|
let i = e, a = t, o = /* @__PURE__ */ new Set([...Object.keys(i), ...Object.keys(a)]);
|
|
5837
5895
|
for (let e of o) {
|
|
5838
5896
|
let t = n ? `${n}.${e}` : e;
|
|
5839
|
-
e in i ? e in a ? r.push(...
|
|
5897
|
+
e in i ? e in a ? r.push(...xc(i[e], a[e], t)) : r.push({
|
|
5840
5898
|
path: t,
|
|
5841
5899
|
from: i[e],
|
|
5842
5900
|
to: void 0
|
|
@@ -5848,48 +5906,48 @@ function bc(e, t, n = "") {
|
|
|
5848
5906
|
}
|
|
5849
5907
|
return r;
|
|
5850
5908
|
}
|
|
5851
|
-
var
|
|
5909
|
+
var Sc = {
|
|
5852
5910
|
largeResults: 4 * 1024 * 1024,
|
|
5853
5911
|
drafts: 2 * 1024 * 1024,
|
|
5854
5912
|
userFiles: 2 * 1024 * 1024,
|
|
5855
5913
|
resources: 4 * 1024 * 1024
|
|
5856
|
-
},
|
|
5914
|
+
}, Cc = [
|
|
5857
5915
|
"largeResults",
|
|
5858
5916
|
"drafts",
|
|
5859
5917
|
"userFiles",
|
|
5860
5918
|
"resources"
|
|
5861
|
-
],
|
|
5862
|
-
function
|
|
5919
|
+
], wc = .9;
|
|
5920
|
+
function Tc(e, t = {}) {
|
|
5863
5921
|
let n = Object.create(null);
|
|
5864
|
-
if (e) for (let [t, r] of Object.entries(e)) n[
|
|
5922
|
+
if (e) for (let [t, r] of Object.entries(e)) n[kc(t)] = {
|
|
5865
5923
|
content: r,
|
|
5866
|
-
updatedAt:
|
|
5924
|
+
updatedAt: jc()
|
|
5867
5925
|
};
|
|
5868
5926
|
let { persist: r } = t, i = t.maxBytes ?? 8388608, a = {
|
|
5869
|
-
...
|
|
5927
|
+
...Sc,
|
|
5870
5928
|
...t.poolBytes ?? {}
|
|
5871
5929
|
};
|
|
5872
5930
|
function o(e) {
|
|
5873
|
-
let t =
|
|
5931
|
+
let t = kc(e);
|
|
5874
5932
|
return t.startsWith("large_results/") ? "largeResults" : t.startsWith("drafts/") ? "drafts" : t.startsWith("resources/") ? "resources" : "userFiles";
|
|
5875
5933
|
}
|
|
5876
5934
|
function s(e) {
|
|
5877
5935
|
let t = 0;
|
|
5878
|
-
for (let [r, i] of Object.entries(n)) o(r) === e && (t +=
|
|
5936
|
+
for (let [r, i] of Object.entries(n)) o(r) === e && (t += Dc(i.content));
|
|
5879
5937
|
return t;
|
|
5880
5938
|
}
|
|
5881
5939
|
function c() {
|
|
5882
|
-
for (let e of
|
|
5940
|
+
for (let e of Cc) {
|
|
5883
5941
|
let t = a[e];
|
|
5884
5942
|
if (s(e) <= t) continue;
|
|
5885
|
-
let r = t *
|
|
5943
|
+
let r = t * wc, i = e === "largeResults", c = i && s(e) > t * 1.5;
|
|
5886
5944
|
c && console.warn(`[page-agent-sdk] vfs large_results 池 ${s(e)} > ${Math.round(t * 1.5)}(被引用撑爆)→ 无视 protectedRefs 强制删`);
|
|
5887
5945
|
let l = Object.entries(n).filter(([t]) => o(t) === e).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
|
|
5888
5946
|
for (let [t] of l) if (!(i && !c && u.has(t)) && (delete n[t], s(e) <= r)) break;
|
|
5889
5947
|
}
|
|
5890
|
-
if (
|
|
5891
|
-
let e = i *
|
|
5892
|
-
for (let [i] of r) if (!(o(i) === "largeResults" && !t && u.has(i)) && (delete n[i],
|
|
5948
|
+
if (Oc(n) > i) {
|
|
5949
|
+
let e = i * wc, t = Oc(n) > i * 1.5, r = Object.entries(n).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
|
|
5950
|
+
for (let [i] of r) if (!(o(i) === "largeResults" && !t && u.has(i)) && (delete n[i], Oc(n) <= e)) break;
|
|
5893
5951
|
}
|
|
5894
5952
|
}
|
|
5895
5953
|
let l = !0, u = /* @__PURE__ */ new Set(), d = null;
|
|
@@ -5925,7 +5983,7 @@ function wc(e, t = {}) {
|
|
|
5925
5983
|
}
|
|
5926
5984
|
};
|
|
5927
5985
|
return r && (m.hydrate = (e) => {
|
|
5928
|
-
for (let [t, r] of Object.entries(e)) n[
|
|
5986
|
+
for (let [t, r] of Object.entries(e)) n[kc(t)] = r;
|
|
5929
5987
|
c(), l = !0;
|
|
5930
5988
|
}, m.flush = () => {
|
|
5931
5989
|
d &&= (clearTimeout(d), null), f();
|
|
@@ -5934,19 +5992,19 @@ function wc(e, t = {}) {
|
|
|
5934
5992
|
p(), l = !0;
|
|
5935
5993
|
}), m;
|
|
5936
5994
|
}
|
|
5937
|
-
var
|
|
5938
|
-
function Ec(e) {
|
|
5939
|
-
return Tc ||= new TextEncoder(), Tc.encode(e).length;
|
|
5940
|
-
}
|
|
5995
|
+
var Ec = null;
|
|
5941
5996
|
function Dc(e) {
|
|
5997
|
+
return Ec ||= new TextEncoder(), Ec.encode(e).length;
|
|
5998
|
+
}
|
|
5999
|
+
function Oc(e) {
|
|
5942
6000
|
let t = 0;
|
|
5943
|
-
for (let n of Object.values(e)) t +=
|
|
6001
|
+
for (let n of Object.values(e)) t += Dc(n.content);
|
|
5944
6002
|
return t;
|
|
5945
6003
|
}
|
|
5946
|
-
function
|
|
6004
|
+
function kc(e) {
|
|
5947
6005
|
return e.replace(/^\/+/, "").replace(/\/+/g, "/");
|
|
5948
6006
|
}
|
|
5949
|
-
function
|
|
6007
|
+
function Ac(e) {
|
|
5950
6008
|
let t = "";
|
|
5951
6009
|
for (let n = 0; n < e.length; n++) {
|
|
5952
6010
|
let r = e[n];
|
|
@@ -5954,10 +6012,10 @@ function kc(e) {
|
|
|
5954
6012
|
}
|
|
5955
6013
|
return RegExp("^" + t + "$");
|
|
5956
6014
|
}
|
|
5957
|
-
function
|
|
6015
|
+
function jc() {
|
|
5958
6016
|
return Date.now();
|
|
5959
6017
|
}
|
|
5960
|
-
var
|
|
6018
|
+
var Mc = [
|
|
5961
6019
|
"vfs_read",
|
|
5962
6020
|
"vfs_write",
|
|
5963
6021
|
"vfs_edit",
|
|
@@ -5968,10 +6026,10 @@ var jc = [
|
|
|
5968
6026
|
"vfs_json_patch",
|
|
5969
6027
|
"vfs_rm"
|
|
5970
6028
|
];
|
|
5971
|
-
function
|
|
6029
|
+
function Nc(e) {
|
|
5972
6030
|
return [
|
|
5973
6031
|
r(async ({ path: t, offset: n, limit: r }) => {
|
|
5974
|
-
let i = e.files[
|
|
6032
|
+
let i = e.files[kc(t)];
|
|
5975
6033
|
if (!i) return Y({
|
|
5976
6034
|
code: "NOT_FOUND",
|
|
5977
6035
|
path: t,
|
|
@@ -6000,9 +6058,9 @@ function Mc(e) {
|
|
|
6000
6058
|
hint: "jsonString=true 要求 content 是合法 JSON;检查引号/逗号/括号配对;或省略 jsonString 写纯文本"
|
|
6001
6059
|
});
|
|
6002
6060
|
}
|
|
6003
|
-
return e.files[
|
|
6061
|
+
return e.files[kc(t)] = {
|
|
6004
6062
|
content: n,
|
|
6005
|
-
updatedAt:
|
|
6063
|
+
updatedAt: jc()
|
|
6006
6064
|
}, `已写入 ${t}(${n.length} 字符)${r ? "(JSON 校验通过)" : ""}`;
|
|
6007
6065
|
}, {
|
|
6008
6066
|
name: "vfs_write",
|
|
@@ -6014,7 +6072,7 @@ function Mc(e) {
|
|
|
6014
6072
|
})
|
|
6015
6073
|
}),
|
|
6016
6074
|
r(async ({ path: t, oldString: n, newString: r }) => {
|
|
6017
|
-
let i =
|
|
6075
|
+
let i = kc(t), a = e.files[i];
|
|
6018
6076
|
if (!a) return Y({
|
|
6019
6077
|
code: "NOT_FOUND",
|
|
6020
6078
|
path: t,
|
|
@@ -6044,7 +6102,7 @@ function Mc(e) {
|
|
|
6044
6102
|
}
|
|
6045
6103
|
return e.files[i] = {
|
|
6046
6104
|
content: a.content.replace(n, r),
|
|
6047
|
-
updatedAt:
|
|
6105
|
+
updatedAt: jc()
|
|
6048
6106
|
}, `已替换 ${t} 中 1 处。`;
|
|
6049
6107
|
}, {
|
|
6050
6108
|
name: "vfs_edit",
|
|
@@ -6066,7 +6124,7 @@ function Mc(e) {
|
|
|
6066
6124
|
r(async ({ pattern: t }) => {
|
|
6067
6125
|
let n;
|
|
6068
6126
|
try {
|
|
6069
|
-
n =
|
|
6127
|
+
n = Ac(t);
|
|
6070
6128
|
} catch (e) {
|
|
6071
6129
|
return Y({
|
|
6072
6130
|
code: "GLOB_INVALID",
|
|
@@ -6095,7 +6153,7 @@ function Mc(e) {
|
|
|
6095
6153
|
details: { pattern: t }
|
|
6096
6154
|
});
|
|
6097
6155
|
}
|
|
6098
|
-
let i = n ? [
|
|
6156
|
+
let i = n ? [kc(n)] : Object.keys(e.files), a = [];
|
|
6099
6157
|
for (let t of i) {
|
|
6100
6158
|
let n = e.files[t];
|
|
6101
6159
|
n && n.content.split("\n").forEach((e, n) => {
|
|
@@ -6112,7 +6170,7 @@ function Mc(e) {
|
|
|
6112
6170
|
})
|
|
6113
6171
|
}),
|
|
6114
6172
|
r(async ({ path: t, jsonPath: n }) => {
|
|
6115
|
-
let r =
|
|
6173
|
+
let r = kc(t), i = e.files[r];
|
|
6116
6174
|
if (!i) return Y({
|
|
6117
6175
|
code: "NOT_FOUND",
|
|
6118
6176
|
path: t,
|
|
@@ -6149,7 +6207,7 @@ function Mc(e) {
|
|
|
6149
6207
|
})
|
|
6150
6208
|
}),
|
|
6151
6209
|
r(async ({ path: t, patches: n }) => {
|
|
6152
|
-
let r =
|
|
6210
|
+
let r = kc(t), i = e.files[r];
|
|
6153
6211
|
if (!i) return Y({
|
|
6154
6212
|
code: "NOT_FOUND",
|
|
6155
6213
|
path: t,
|
|
@@ -6167,9 +6225,9 @@ function Mc(e) {
|
|
|
6167
6225
|
hint: "vfs_json_patch 要求文件内容是合法 JSON"
|
|
6168
6226
|
});
|
|
6169
6227
|
}
|
|
6170
|
-
let o =
|
|
6228
|
+
let o = fc(a), s = [];
|
|
6171
6229
|
for (let e of n) {
|
|
6172
|
-
let n =
|
|
6230
|
+
let n = _c(o, e.op, e.jsonPath, e.value);
|
|
6173
6231
|
if (n) return Y({
|
|
6174
6232
|
code: "PATCH_FAILED",
|
|
6175
6233
|
path: t,
|
|
@@ -6182,7 +6240,7 @@ function Mc(e) {
|
|
|
6182
6240
|
let c = JSON.stringify(o);
|
|
6183
6241
|
return e.files[r] = {
|
|
6184
6242
|
content: c,
|
|
6185
|
-
updatedAt:
|
|
6243
|
+
updatedAt: jc()
|
|
6186
6244
|
}, `已对 ${t} 应用 ${n.length} 个 patch(影响 ${s.length} 处:${s.join(", ")}),文件现 ${c.length} 字符`;
|
|
6187
6245
|
}, {
|
|
6188
6246
|
name: "vfs_json_patch",
|
|
@@ -6202,7 +6260,7 @@ function Mc(e) {
|
|
|
6202
6260
|
})
|
|
6203
6261
|
}),
|
|
6204
6262
|
r(async ({ path: t }) => {
|
|
6205
|
-
let n =
|
|
6263
|
+
let n = kc(t);
|
|
6206
6264
|
return e.files[n] ? (delete e.files[n], `已删除 ${t}`) : Y({
|
|
6207
6265
|
code: "NOT_FOUND",
|
|
6208
6266
|
path: t,
|
|
@@ -6216,17 +6274,17 @@ function Mc(e) {
|
|
|
6216
6274
|
})
|
|
6217
6275
|
];
|
|
6218
6276
|
}
|
|
6219
|
-
function
|
|
6277
|
+
function Pc(e) {
|
|
6220
6278
|
return {
|
|
6221
6279
|
name: "vfs",
|
|
6222
|
-
tools:
|
|
6280
|
+
tools: Nc(e),
|
|
6223
6281
|
beforeAgent: () => ({ files: e.files })
|
|
6224
6282
|
};
|
|
6225
6283
|
}
|
|
6226
6284
|
//#endregion
|
|
6227
6285
|
//#region src/core/tools/dataSlotQuery.ts
|
|
6228
|
-
var
|
|
6229
|
-
function
|
|
6286
|
+
var Fc = /[\w$-]/;
|
|
6287
|
+
function Ic(e) {
|
|
6230
6288
|
let t = [], n = e.trim(), r = +(n[0] === "$");
|
|
6231
6289
|
for (; r < n.length;) {
|
|
6232
6290
|
let e = n[r];
|
|
@@ -6237,7 +6295,7 @@ function Fc(e) {
|
|
|
6237
6295
|
continue;
|
|
6238
6296
|
}
|
|
6239
6297
|
let e = "";
|
|
6240
|
-
for (; r < n.length &&
|
|
6298
|
+
for (; r < n.length && Fc.test(n[r]);) e += n[r++];
|
|
6241
6299
|
if (!e) throw Error("JSONPath: .. 后缺属性名");
|
|
6242
6300
|
t.push({
|
|
6243
6301
|
type: "descendKey",
|
|
@@ -6250,7 +6308,7 @@ function Fc(e) {
|
|
|
6250
6308
|
continue;
|
|
6251
6309
|
}
|
|
6252
6310
|
let e = "";
|
|
6253
|
-
for (; r < n.length &&
|
|
6311
|
+
for (; r < n.length && Fc.test(n[r]);) e += n[r++];
|
|
6254
6312
|
if (!e) throw Error("JSONPath: . 后缺属性名");
|
|
6255
6313
|
t.push({
|
|
6256
6314
|
type: "key",
|
|
@@ -6306,7 +6364,7 @@ function Fc(e) {
|
|
|
6306
6364
|
}
|
|
6307
6365
|
return t;
|
|
6308
6366
|
}
|
|
6309
|
-
function
|
|
6367
|
+
function Lc(e) {
|
|
6310
6368
|
let t = [], n = 0, r = e.trim();
|
|
6311
6369
|
for (; n < r.length;) {
|
|
6312
6370
|
let e = r[n];
|
|
@@ -6351,7 +6409,7 @@ function Ic(e) {
|
|
|
6351
6409
|
}
|
|
6352
6410
|
return t;
|
|
6353
6411
|
}
|
|
6354
|
-
var
|
|
6412
|
+
var Rc = class {
|
|
6355
6413
|
toks;
|
|
6356
6414
|
item;
|
|
6357
6415
|
pos = 0;
|
|
@@ -6387,12 +6445,12 @@ var Lc = class {
|
|
|
6387
6445
|
return this.next(), e;
|
|
6388
6446
|
}
|
|
6389
6447
|
let e = this.operand(), t = this.peek();
|
|
6390
|
-
return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(),
|
|
6448
|
+
return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), Vc(t, e, this.operand())) : zc(e);
|
|
6391
6449
|
}
|
|
6392
6450
|
operand() {
|
|
6393
6451
|
let e = this.next();
|
|
6394
6452
|
if (e === void 0) throw Error("过滤表达式:缺操作数");
|
|
6395
|
-
if (e.startsWith("@")) return
|
|
6453
|
+
if (e.startsWith("@")) return Bc(e, this.item);
|
|
6396
6454
|
if (e[0] === "'" || e[0] === "\"") return e.slice(1, -1);
|
|
6397
6455
|
if (e === "true") return !0;
|
|
6398
6456
|
if (e === "false") return !1;
|
|
@@ -6402,10 +6460,10 @@ var Lc = class {
|
|
|
6402
6460
|
throw Error(`过滤表达式:未知操作数 '${e}'`);
|
|
6403
6461
|
}
|
|
6404
6462
|
};
|
|
6405
|
-
function
|
|
6463
|
+
function zc(e) {
|
|
6406
6464
|
return !!e && e !== 0 && e !== "" && e !== null;
|
|
6407
6465
|
}
|
|
6408
|
-
function
|
|
6466
|
+
function Bc(e, t) {
|
|
6409
6467
|
let n = e.split(".").filter((e) => e && e !== "@"), r = t;
|
|
6410
6468
|
for (let e of n) {
|
|
6411
6469
|
if (typeof r != "object" || !r) return;
|
|
@@ -6413,7 +6471,7 @@ function zc(e, t) {
|
|
|
6413
6471
|
}
|
|
6414
6472
|
return r;
|
|
6415
6473
|
}
|
|
6416
|
-
function
|
|
6474
|
+
function Vc(e, t, n) {
|
|
6417
6475
|
switch (e) {
|
|
6418
6476
|
case "==": return t === n;
|
|
6419
6477
|
case "!=": return t !== n;
|
|
@@ -6424,47 +6482,47 @@ function Bc(e, t, n) {
|
|
|
6424
6482
|
default: return !1;
|
|
6425
6483
|
}
|
|
6426
6484
|
}
|
|
6427
|
-
function Vc(e, t) {
|
|
6428
|
-
return new Lc(Ic(e), t).parse();
|
|
6429
|
-
}
|
|
6430
6485
|
function Hc(e, t) {
|
|
6431
|
-
return
|
|
6486
|
+
return new Rc(Lc(e), t).parse();
|
|
6432
6487
|
}
|
|
6433
6488
|
function Uc(e, t) {
|
|
6489
|
+
return e ? `${e}.${t}` : String(t);
|
|
6490
|
+
}
|
|
6491
|
+
function Wc(e, t) {
|
|
6434
6492
|
let n = [{
|
|
6435
6493
|
path: "",
|
|
6436
6494
|
value: e
|
|
6437
6495
|
}];
|
|
6438
|
-
for (let e of
|
|
6496
|
+
for (let e of Ic(t)) {
|
|
6439
6497
|
let t = [];
|
|
6440
6498
|
if (e.type === "key") for (let r of n) r.value != null && typeof r.value == "object" && e.key in r.value && t.push({
|
|
6441
|
-
path:
|
|
6499
|
+
path: Uc(r.path, e.key),
|
|
6442
6500
|
value: r.value[e.key]
|
|
6443
6501
|
});
|
|
6444
6502
|
else if (e.type === "index") {
|
|
6445
6503
|
for (let r of n) if (Array.isArray(r.value)) {
|
|
6446
6504
|
let n = r.value[e.index];
|
|
6447
6505
|
e.index >= 0 && e.index < r.value.length && t.push({
|
|
6448
|
-
path:
|
|
6506
|
+
path: Uc(r.path, e.index),
|
|
6449
6507
|
value: n,
|
|
6450
6508
|
index: e.index
|
|
6451
6509
|
});
|
|
6452
6510
|
}
|
|
6453
6511
|
} else if (e.type === "wildcard") {
|
|
6454
6512
|
for (let e of n) if (Array.isArray(e.value)) e.value.forEach((n, r) => t.push({
|
|
6455
|
-
path:
|
|
6513
|
+
path: Uc(e.path, r),
|
|
6456
6514
|
value: n,
|
|
6457
6515
|
index: r
|
|
6458
6516
|
}));
|
|
6459
6517
|
else if (e.value != null && typeof e.value == "object") for (let n of Object.keys(e.value)) t.push({
|
|
6460
|
-
path:
|
|
6518
|
+
path: Uc(e.path, n),
|
|
6461
6519
|
value: e.value[n]
|
|
6462
6520
|
});
|
|
6463
6521
|
} else if (e.type === "descendKey") {
|
|
6464
6522
|
let r = e.key, i = (e) => {
|
|
6465
6523
|
if (!(e.value == null || typeof e.value != "object")) for (let n of Object.keys(e.value)) {
|
|
6466
6524
|
let a = {
|
|
6467
|
-
path:
|
|
6525
|
+
path: Uc(e.path, n),
|
|
6468
6526
|
value: e.value[n]
|
|
6469
6527
|
};
|
|
6470
6528
|
n === r && t.push(a), i(a);
|
|
@@ -6475,7 +6533,7 @@ function Uc(e, t) {
|
|
|
6475
6533
|
let e = (n) => {
|
|
6476
6534
|
if (!(n.value == null || typeof n.value != "object")) for (let r of Object.keys(n.value)) {
|
|
6477
6535
|
let i = {
|
|
6478
|
-
path:
|
|
6536
|
+
path: Uc(n.path, r),
|
|
6479
6537
|
value: n.value[r]
|
|
6480
6538
|
};
|
|
6481
6539
|
t.push(i), e(i);
|
|
@@ -6484,16 +6542,16 @@ function Uc(e, t) {
|
|
|
6484
6542
|
for (let t of n) e(t);
|
|
6485
6543
|
} else if (e.type === "filter") {
|
|
6486
6544
|
for (let r of n) if (Array.isArray(r.value)) r.value.forEach((n, i) => {
|
|
6487
|
-
|
|
6488
|
-
path:
|
|
6545
|
+
Hc(e.filter, n) && t.push({
|
|
6546
|
+
path: Uc(r.path, i),
|
|
6489
6547
|
value: n,
|
|
6490
6548
|
index: i
|
|
6491
6549
|
});
|
|
6492
6550
|
});
|
|
6493
6551
|
else if (r.value != null && typeof r.value == "object") for (let n of Object.keys(r.value)) {
|
|
6494
6552
|
let i = r.value[n];
|
|
6495
|
-
|
|
6496
|
-
path:
|
|
6553
|
+
Hc(e.filter, i) && t.push({
|
|
6554
|
+
path: Uc(r.path, n),
|
|
6497
6555
|
value: i
|
|
6498
6556
|
});
|
|
6499
6557
|
}
|
|
@@ -6502,7 +6560,7 @@ function Uc(e, t) {
|
|
|
6502
6560
|
}
|
|
6503
6561
|
return n;
|
|
6504
6562
|
}
|
|
6505
|
-
function
|
|
6563
|
+
function Gc(e, t) {
|
|
6506
6564
|
let n = e.length, r = t.length;
|
|
6507
6565
|
if (!n) return r;
|
|
6508
6566
|
if (!r) return n;
|
|
@@ -6518,7 +6576,7 @@ function Wc(e, t) {
|
|
|
6518
6576
|
}
|
|
6519
6577
|
return i[r];
|
|
6520
6578
|
}
|
|
6521
|
-
function
|
|
6579
|
+
function Kc(e, t, n = {}) {
|
|
6522
6580
|
let r = n.mode || "substring", i = n.limit ?? 50, a = n.matchKey !== !1, o = [], s = null;
|
|
6523
6581
|
if (r === "regex") try {
|
|
6524
6582
|
s = new RegExp(t, "i");
|
|
@@ -6528,11 +6586,11 @@ function Gc(e, t, n = {}) {
|
|
|
6528
6586
|
let c = (e, l, u) => {
|
|
6529
6587
|
if (o.length >= i || e == null) return;
|
|
6530
6588
|
if (typeof e == "object") {
|
|
6531
|
-
if (Array.isArray(e)) e.forEach((e, t) => c(e,
|
|
6532
|
-
else for (let t of Object.keys(e)) c(e[t],
|
|
6589
|
+
if (Array.isArray(e)) e.forEach((e, t) => c(e, Uc(l, t), String(t)));
|
|
6590
|
+
else for (let t of Object.keys(e)) c(e[t], Uc(l, t), t);
|
|
6533
6591
|
return;
|
|
6534
6592
|
}
|
|
6535
|
-
let d = String(e), f =
|
|
6593
|
+
let d = String(e), f = qc(d, t, r, n.fuzzyThreshold ?? 2, s);
|
|
6536
6594
|
if (f) {
|
|
6537
6595
|
o.push({
|
|
6538
6596
|
path: l,
|
|
@@ -6543,7 +6601,7 @@ function Gc(e, t, n = {}) {
|
|
|
6543
6601
|
return;
|
|
6544
6602
|
}
|
|
6545
6603
|
if (a && u) {
|
|
6546
|
-
let e =
|
|
6604
|
+
let e = qc(u, t, r, n.fuzzyThreshold ?? 2, s);
|
|
6547
6605
|
e && o.push({
|
|
6548
6606
|
path: l,
|
|
6549
6607
|
key: u,
|
|
@@ -6554,51 +6612,51 @@ function Gc(e, t, n = {}) {
|
|
|
6554
6612
|
};
|
|
6555
6613
|
return c(e, ""), o;
|
|
6556
6614
|
}
|
|
6557
|
-
function
|
|
6615
|
+
function qc(e, t, n, r, i) {
|
|
6558
6616
|
let a = e.toLowerCase(), o = t.toLowerCase();
|
|
6559
6617
|
if (n === "substring") return a.includes(o) ? 1 : null;
|
|
6560
6618
|
if (n === "regex") return i && i.test(e) ? 1 : null;
|
|
6561
6619
|
if (n === "fuzzy") {
|
|
6562
6620
|
if (a.includes(o)) return 2;
|
|
6563
|
-
let e =
|
|
6621
|
+
let e = Gc(a, o);
|
|
6564
6622
|
return e <= r ? r - e + 1 : null;
|
|
6565
6623
|
}
|
|
6566
6624
|
return null;
|
|
6567
6625
|
}
|
|
6568
|
-
function
|
|
6626
|
+
function Jc(e, t, n = 3e3) {
|
|
6569
6627
|
return ba(t, n)(e);
|
|
6570
6628
|
}
|
|
6571
6629
|
//#endregion
|
|
6572
6630
|
//#region src/core/tools/resources.ts
|
|
6573
|
-
var
|
|
6574
|
-
function Zc(e) {
|
|
6575
|
-
return `${Jc}${e}${Xc}`;
|
|
6576
|
-
}
|
|
6631
|
+
var Yc = "⟦frozen:", Xc = "⟦res:", Zc = "⟧";
|
|
6577
6632
|
function Qc(e) {
|
|
6578
|
-
return `${Yc}${e}${
|
|
6633
|
+
return `${Yc}${e}${Zc}`;
|
|
6579
6634
|
}
|
|
6580
6635
|
function $c(e) {
|
|
6581
|
-
return
|
|
6636
|
+
return `${Xc}${e}${Zc}`;
|
|
6637
|
+
}
|
|
6638
|
+
function el(e) {
|
|
6639
|
+
return typeof e == "string" ? e.startsWith(Yc) && e.endsWith(Zc) ? {
|
|
6582
6640
|
type: "frozen",
|
|
6583
6641
|
path: e.slice(8, e.length - 1)
|
|
6584
|
-
} : e.startsWith(
|
|
6642
|
+
} : e.startsWith(Xc) && e.endsWith(Zc) ? {
|
|
6585
6643
|
type: "res",
|
|
6586
6644
|
handle: e.slice(5, e.length - 1)
|
|
6587
6645
|
} : null : null;
|
|
6588
6646
|
}
|
|
6589
|
-
function
|
|
6647
|
+
function tl(e) {
|
|
6590
6648
|
return String(e ?? "").trim().replace(/^\.+/, "");
|
|
6591
6649
|
}
|
|
6592
|
-
function
|
|
6650
|
+
function nl(e) {
|
|
6593
6651
|
let t = 5381;
|
|
6594
6652
|
for (let n = 0; n < e.length; n++) t = (t * 33 ^ e.charCodeAt(n)) >>> 0;
|
|
6595
6653
|
return (t >>> 0).toString(16).padStart(8, "0").slice(0, 8);
|
|
6596
6654
|
}
|
|
6597
|
-
function
|
|
6655
|
+
function rl(e, t) {
|
|
6598
6656
|
return e === t ? !0 : e && t && typeof e == "object" && typeof t == "object" ? JSON.stringify(e) === JSON.stringify(t) : !1;
|
|
6599
6657
|
}
|
|
6600
|
-
function
|
|
6601
|
-
let n =
|
|
6658
|
+
function il(e, t) {
|
|
6659
|
+
let n = tl(e);
|
|
6602
6660
|
if (!n) return;
|
|
6603
6661
|
let r = t.get(n);
|
|
6604
6662
|
if (r) return {
|
|
@@ -6618,7 +6676,7 @@ function rl(e, t) {
|
|
|
6618
6676
|
}));
|
|
6619
6677
|
return i;
|
|
6620
6678
|
}
|
|
6621
|
-
var
|
|
6679
|
+
var al = class {
|
|
6622
6680
|
vfs;
|
|
6623
6681
|
constructor(e) {
|
|
6624
6682
|
this.vfs = e;
|
|
@@ -6627,7 +6685,7 @@ var il = class {
|
|
|
6627
6685
|
return `resources/${e}.json`;
|
|
6628
6686
|
}
|
|
6629
6687
|
ensure(e, t, n) {
|
|
6630
|
-
let r =
|
|
6688
|
+
let r = nl(e), i = {
|
|
6631
6689
|
path: e,
|
|
6632
6690
|
mode: n,
|
|
6633
6691
|
value: t,
|
|
@@ -6639,7 +6697,7 @@ var il = class {
|
|
|
6639
6697
|
}, r;
|
|
6640
6698
|
}
|
|
6641
6699
|
get(e) {
|
|
6642
|
-
return this.readEntry(this.key(e)) || this.readEntry(this.key(
|
|
6700
|
+
return this.readEntry(this.key(e)) || this.readEntry(this.key(nl(e)));
|
|
6643
6701
|
}
|
|
6644
6702
|
readEntry(e) {
|
|
6645
6703
|
let t = this.vfs.files[e];
|
|
@@ -6655,7 +6713,7 @@ var il = class {
|
|
|
6655
6713
|
this.ensure(e, t, n?.mode ?? "verbatim");
|
|
6656
6714
|
}
|
|
6657
6715
|
delete(e) {
|
|
6658
|
-
let t = this.get(e)?.handle ??
|
|
6716
|
+
let t = this.get(e)?.handle ?? nl(e), n = this.key(t), r = !!this.vfs.files[n];
|
|
6659
6717
|
return r && delete this.vfs.files[n], r;
|
|
6660
6718
|
}
|
|
6661
6719
|
list() {
|
|
@@ -6675,7 +6733,7 @@ var il = class {
|
|
|
6675
6733
|
for (let e of Object.keys(this.vfs.files)) e.startsWith("resources/") && delete this.vfs.files[e];
|
|
6676
6734
|
}
|
|
6677
6735
|
};
|
|
6678
|
-
function
|
|
6736
|
+
function ol(e) {
|
|
6679
6737
|
let { jp: t, resolved: n, resourcesByPath: r, resourceStore: i } = e;
|
|
6680
6738
|
if (!r.size) return n;
|
|
6681
6739
|
let a = !1;
|
|
@@ -6684,19 +6742,19 @@ function al(e) {
|
|
|
6684
6742
|
break;
|
|
6685
6743
|
}
|
|
6686
6744
|
if (!a) return n;
|
|
6687
|
-
let o =
|
|
6745
|
+
let o = fc(n);
|
|
6688
6746
|
for (let [e, n] of r) {
|
|
6689
6747
|
if (t !== "" && e !== t && !e.startsWith(t + ".")) continue;
|
|
6690
6748
|
if (e === t) {
|
|
6691
6749
|
if (o === void 0) continue;
|
|
6692
|
-
return n.mode === "freeze" ?
|
|
6750
|
+
return n.mode === "freeze" ? Qc(e) : i ? $c(i.ensure(e, o, "verbatim")) : o;
|
|
6693
6751
|
}
|
|
6694
6752
|
let r = t === "" ? e : e.slice(t.length + 1), a = Z(o, r);
|
|
6695
|
-
a !== void 0 && (n.mode === "freeze" ?
|
|
6753
|
+
a !== void 0 && (n.mode === "freeze" ? uc(o, r, Qc(e)) : i && uc(o, r, $c(i.ensure(e, a, "verbatim"))));
|
|
6696
6754
|
}
|
|
6697
6755
|
return o;
|
|
6698
6756
|
}
|
|
6699
|
-
function
|
|
6757
|
+
function sl(e, t, n, r) {
|
|
6700
6758
|
if (!r) return {
|
|
6701
6759
|
code: "RESOURCE_NOT_FOUND",
|
|
6702
6760
|
message: `句柄 "${e}" 无法展开(资源池未启用)`,
|
|
@@ -6707,7 +6765,7 @@ function ol(e, t, n, r) {
|
|
|
6707
6765
|
code: "RESOURCE_NOT_FOUND",
|
|
6708
6766
|
message: `字段 "${t}" 在 bind 中已不存在,无法展开句柄 "${e}"`,
|
|
6709
6767
|
hint: "该字段可能已被删除或 restore 到不含此字段的快照;重新 read 确认当前结构"
|
|
6710
|
-
} :
|
|
6768
|
+
} : rl(i.value, n) ? { value: i.value } : (r.update(t, n), { value: n }) : n === void 0 ? {
|
|
6711
6769
|
code: "RESOURCE_NOT_FOUND",
|
|
6712
6770
|
message: `句柄 "${e}" 不存在(字段 "${t}" 可能未注册或已被删除)`,
|
|
6713
6771
|
hint: "重新 read 该字段触发懒注册"
|
|
@@ -6717,20 +6775,20 @@ function ol(e, t, n, r) {
|
|
|
6717
6775
|
hint: "重新 read 该字段触发懒注册重建句柄,再写回新句柄 ⟦res:<handle>⟧"
|
|
6718
6776
|
};
|
|
6719
6777
|
}
|
|
6720
|
-
function
|
|
6778
|
+
function cl(e, t) {
|
|
6721
6779
|
let n = t.getBind();
|
|
6722
6780
|
for (let [r, i] of t.resourcesByPath) {
|
|
6723
6781
|
let a = Z(n, r), o = Z(e, r);
|
|
6724
6782
|
if (o === void 0) {
|
|
6725
|
-
a !== void 0 &&
|
|
6783
|
+
a !== void 0 && uc(e, r, a);
|
|
6726
6784
|
continue;
|
|
6727
6785
|
}
|
|
6728
6786
|
if (i.mode === "freeze") {
|
|
6729
|
-
if (o ===
|
|
6730
|
-
|
|
6787
|
+
if (o === Qc(r)) {
|
|
6788
|
+
uc(e, r, a);
|
|
6731
6789
|
continue;
|
|
6732
6790
|
}
|
|
6733
|
-
if (!
|
|
6791
|
+
if (!rl(o, a)) return {
|
|
6734
6792
|
ok: !1,
|
|
6735
6793
|
code: "FROZEN_FIELD",
|
|
6736
6794
|
path: r,
|
|
@@ -6738,11 +6796,11 @@ function sl(e, t) {
|
|
|
6738
6796
|
hint: "该字段由系统/集成方维护,LLM 不得改动。如需展示其值用 resource_get({path}) 取真值"
|
|
6739
6797
|
};
|
|
6740
6798
|
} else {
|
|
6741
|
-
let n =
|
|
6799
|
+
let n = el(o);
|
|
6742
6800
|
if (n && n.type === "res") {
|
|
6743
|
-
let i =
|
|
6801
|
+
let i = sl(n.handle, r, a, t.resourceStore);
|
|
6744
6802
|
if ("value" in i) {
|
|
6745
|
-
|
|
6803
|
+
uc(e, r, i.value);
|
|
6746
6804
|
continue;
|
|
6747
6805
|
}
|
|
6748
6806
|
return {
|
|
@@ -6753,7 +6811,7 @@ function sl(e, t) {
|
|
|
6753
6811
|
hint: i.hint
|
|
6754
6812
|
};
|
|
6755
6813
|
}
|
|
6756
|
-
if (!
|
|
6814
|
+
if (!rl(o, a)) return {
|
|
6757
6815
|
ok: !1,
|
|
6758
6816
|
code: "VERBATIM_MISMATCH",
|
|
6759
6817
|
path: r,
|
|
@@ -6764,7 +6822,7 @@ function sl(e, t) {
|
|
|
6764
6822
|
}
|
|
6765
6823
|
return { ok: !0 };
|
|
6766
6824
|
}
|
|
6767
|
-
function
|
|
6825
|
+
function ll(e, t, n) {
|
|
6768
6826
|
let r = t === void 0 ? e.message : `patches[${t}]${n ? ` @ "${n}"` : ""}: ${e.message}`;
|
|
6769
6827
|
return Y({
|
|
6770
6828
|
code: e.code,
|
|
@@ -6777,28 +6835,28 @@ function cl(e, t, n) {
|
|
|
6777
6835
|
} }
|
|
6778
6836
|
});
|
|
6779
6837
|
}
|
|
6780
|
-
function
|
|
6838
|
+
function ul(e) {
|
|
6781
6839
|
let { value: t, ctx: n } = e;
|
|
6782
6840
|
if (!n || !n.resourcesByPath.size) return {
|
|
6783
6841
|
ok: !0,
|
|
6784
6842
|
value: t
|
|
6785
6843
|
};
|
|
6786
|
-
let r =
|
|
6844
|
+
let r = fc(t), i = cl(r, n);
|
|
6787
6845
|
return i.ok ? {
|
|
6788
6846
|
ok: !0,
|
|
6789
6847
|
value: r
|
|
6790
6848
|
} : {
|
|
6791
6849
|
ok: !1,
|
|
6792
|
-
error:
|
|
6850
|
+
error: ll(i)
|
|
6793
6851
|
};
|
|
6794
6852
|
}
|
|
6795
|
-
function
|
|
6853
|
+
function dl(e) {
|
|
6796
6854
|
let { patches: t, clone: n, ctx: r } = e;
|
|
6797
6855
|
if (!r || !r.resourcesByPath.size) return { ok: !0 };
|
|
6798
6856
|
for (let e = 0; e < t.length; e++) {
|
|
6799
6857
|
let n = t[e];
|
|
6800
6858
|
if (n.op === "remove") {
|
|
6801
|
-
let t =
|
|
6859
|
+
let t = il(n.jsonPath || "", r.resourcesByPath);
|
|
6802
6860
|
if (t) {
|
|
6803
6861
|
let r = t.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED", i = t.spec.mode === "freeze" ? "冻结字段不可删。如需移除请联系集成方调整 data.resources 配置" : "verbatim 字段不可直接删;先 resource_delete({path}) 释放资源保护后再删";
|
|
6804
6862
|
return {
|
|
@@ -6817,27 +6875,27 @@ function ul(e) {
|
|
|
6817
6875
|
}
|
|
6818
6876
|
}
|
|
6819
6877
|
}
|
|
6820
|
-
let i =
|
|
6878
|
+
let i = cl(n, r);
|
|
6821
6879
|
if (!i.ok) {
|
|
6822
|
-
let e =
|
|
6880
|
+
let e = fl(i.path, t);
|
|
6823
6881
|
return {
|
|
6824
6882
|
ok: !1,
|
|
6825
|
-
error:
|
|
6883
|
+
error: ll(i, e >= 0 ? e : void 0, e >= 0 ? t[e].jsonPath : void 0)
|
|
6826
6884
|
};
|
|
6827
6885
|
}
|
|
6828
6886
|
return { ok: !0 };
|
|
6829
6887
|
}
|
|
6830
|
-
function
|
|
6831
|
-
let n =
|
|
6888
|
+
function fl(e, t) {
|
|
6889
|
+
let n = tl(e);
|
|
6832
6890
|
for (let e = 0; e < t.length; e++) {
|
|
6833
|
-
let r =
|
|
6891
|
+
let r = tl(t[e].jsonPath || "");
|
|
6834
6892
|
if (r && (r === n || n.startsWith(r + ".") || r.startsWith(n + "."))) return e;
|
|
6835
6893
|
}
|
|
6836
6894
|
return -1;
|
|
6837
6895
|
}
|
|
6838
6896
|
//#endregion
|
|
6839
6897
|
//#region src/core/tools/dataOps.ts
|
|
6840
|
-
var
|
|
6898
|
+
var pl = /* @__PURE__ */ new Set([
|
|
6841
6899
|
"describe_data",
|
|
6842
6900
|
"get_data",
|
|
6843
6901
|
"set_data",
|
|
@@ -6851,14 +6909,14 @@ var fl = /* @__PURE__ */ new Set([
|
|
|
6851
6909
|
"resource_update",
|
|
6852
6910
|
"resource_list",
|
|
6853
6911
|
"resource_delete"
|
|
6854
|
-
]),
|
|
6855
|
-
function
|
|
6856
|
-
return t === "advanced" ? e : t === "minimal" ? e.filter((e) =>
|
|
6912
|
+
]), ml = /* @__PURE__ */ new Set(["read", "write"]);
|
|
6913
|
+
function hl(e, t = "simple") {
|
|
6914
|
+
return t === "advanced" ? e : t === "minimal" ? e.filter((e) => ml.has(e.name)) : e.filter((e) => !pl.has(e.name));
|
|
6857
6915
|
}
|
|
6858
|
-
function
|
|
6916
|
+
function gl(e) {
|
|
6859
6917
|
let { bindRef: t, schema: n, allowKeys: r, snapshots: i, maxSnapshots: a, audit: o, dryRun: s, op: c = "set", protectedCtx: l } = e, u = e.value;
|
|
6860
6918
|
if (l) {
|
|
6861
|
-
let e =
|
|
6919
|
+
let e = ul({
|
|
6862
6920
|
value: u,
|
|
6863
6921
|
ctx: l
|
|
6864
6922
|
});
|
|
@@ -6886,14 +6944,14 @@ function hl(e) {
|
|
|
6886
6944
|
hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹(如 {value:\"x\"})或集成方通过 sdk.setData 替换 bind"
|
|
6887
6945
|
})
|
|
6888
6946
|
};
|
|
6889
|
-
let f =
|
|
6947
|
+
let f = fc(t), p = i.length ? i[i.length - 1].id + 1 : 1;
|
|
6890
6948
|
for (i.push({
|
|
6891
6949
|
id: p,
|
|
6892
6950
|
ts: Date.now(),
|
|
6893
6951
|
op: c,
|
|
6894
6952
|
value: f
|
|
6895
6953
|
}); i.length > a;) i.shift();
|
|
6896
|
-
return d.data !== null && typeof d.data == "object" && (r ?
|
|
6954
|
+
return d.data !== null && typeof d.data == "object" && (r ? lc(t, d.data) : bc(t, d.data)), o({
|
|
6897
6955
|
op: c,
|
|
6898
6956
|
value: d.data,
|
|
6899
6957
|
timestamp: Date.now()
|
|
@@ -6903,11 +6961,11 @@ function hl(e) {
|
|
|
6903
6961
|
data: d.data
|
|
6904
6962
|
};
|
|
6905
6963
|
}
|
|
6906
|
-
function
|
|
6907
|
-
let { bindRef: t, patches: n, schema: r, allowKeys: i, snapshots: a, maxSnapshots: o, markDataDirty: s, schemaErrorMode: c = "zod", snapshotLabel: l, dryRun: u, protectedCtx: d } = e, f =
|
|
6964
|
+
function _l(e) {
|
|
6965
|
+
let { bindRef: t, patches: n, schema: r, allowKeys: i, snapshots: a, maxSnapshots: o, markDataDirty: s, schemaErrorMode: c = "zod", snapshotLabel: l, dryRun: u, protectedCtx: d } = e, f = fc(t), p = [];
|
|
6908
6966
|
for (let e = 0; e < n.length; e++) {
|
|
6909
6967
|
let t = n[e], a = t.jsonPath || "";
|
|
6910
|
-
if (
|
|
6968
|
+
if (cc(a)) return {
|
|
6911
6969
|
ok: !1,
|
|
6912
6970
|
error: Y({
|
|
6913
6971
|
code: "PATH_UNSAFE",
|
|
@@ -6933,14 +6991,14 @@ function gl(e) {
|
|
|
6933
6991
|
hint: `op 为 ${o} 时 value 必填;删除请用 op:'remove'`
|
|
6934
6992
|
})
|
|
6935
6993
|
};
|
|
6936
|
-
let n =
|
|
6994
|
+
let n = pc(t.value);
|
|
6937
6995
|
if (n.parseError) return {
|
|
6938
6996
|
ok: !1,
|
|
6939
6997
|
error: Gr(`patches[${e}]`, t.value, n.parseError)
|
|
6940
6998
|
};
|
|
6941
6999
|
s = n.parsed;
|
|
6942
7000
|
}
|
|
6943
|
-
let c =
|
|
7001
|
+
let c = _c(f, o, a, s);
|
|
6944
7002
|
if (c) return {
|
|
6945
7003
|
ok: !1,
|
|
6946
7004
|
error: Y({
|
|
@@ -6956,7 +7014,7 @@ function gl(e) {
|
|
|
6956
7014
|
});
|
|
6957
7015
|
}
|
|
6958
7016
|
if (d) {
|
|
6959
|
-
let e =
|
|
7017
|
+
let e = dl({
|
|
6960
7018
|
patches: n,
|
|
6961
7019
|
clone: f,
|
|
6962
7020
|
ctx: d
|
|
@@ -6986,21 +7044,21 @@ function gl(e) {
|
|
|
6986
7044
|
id: h,
|
|
6987
7045
|
ts: Date.now(),
|
|
6988
7046
|
op: "edit",
|
|
6989
|
-
value:
|
|
7047
|
+
value: fc(t),
|
|
6990
7048
|
...l ? { label: l } : {}
|
|
6991
7049
|
}); a.length > o;) a.shift();
|
|
6992
|
-
for (let e of p) e.op === "remove" &&
|
|
6993
|
-
return m.data !== null && typeof m.data == "object" && (i ?
|
|
7050
|
+
for (let e of p) e.op === "remove" && dc(t, e.jp);
|
|
7051
|
+
return m.data !== null && typeof m.data == "object" && (i ? lc(t, m.data) : bc(t, m.data)), s?.(), {
|
|
6994
7052
|
ok: !0,
|
|
6995
7053
|
applied: p,
|
|
6996
7054
|
clone: f
|
|
6997
7055
|
};
|
|
6998
7056
|
}
|
|
6999
|
-
function
|
|
7000
|
-
let i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s = Mi(i), c = /* @__PURE__ */ new Map(), l = n.vfsStore ? new
|
|
7057
|
+
function vl(e, n = {}) {
|
|
7058
|
+
let i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s = Mi(i), c = /* @__PURE__ */ new Map(), l = n.vfsStore ? new al(n.vfsStore) : void 0;
|
|
7001
7059
|
function u(e) {
|
|
7002
7060
|
if (c.clear(), e) for (let t of e) {
|
|
7003
|
-
let e =
|
|
7061
|
+
let e = tl(t.path);
|
|
7004
7062
|
c.set(e, {
|
|
7005
7063
|
path: e,
|
|
7006
7064
|
mode: t.mode
|
|
@@ -7052,7 +7110,7 @@ function _l(e, n = {}) {
|
|
|
7052
7110
|
return e;
|
|
7053
7111
|
},
|
|
7054
7112
|
createResource: l ? (e, t) => {
|
|
7055
|
-
let n =
|
|
7113
|
+
let n = tl(e), r = c.get(n), i = t === void 0 ? Z(a, n) : t;
|
|
7056
7114
|
return l.ensure(n, i, r?.mode ?? "verbatim");
|
|
7057
7115
|
} : void 0,
|
|
7058
7116
|
getResource: l ? (e) => {
|
|
@@ -7065,8 +7123,8 @@ function _l(e, n = {}) {
|
|
|
7065
7123
|
} : void 0;
|
|
7066
7124
|
} : void 0,
|
|
7067
7125
|
updateResource: l ? (e, t) => {
|
|
7068
|
-
let n =
|
|
7069
|
-
l.update(n, t),
|
|
7126
|
+
let n = tl(e);
|
|
7127
|
+
l.update(n, t), uc(a, n, t), _();
|
|
7070
7128
|
} : void 0,
|
|
7071
7129
|
deleteResource: l ? (e) => l.delete(e) : void 0,
|
|
7072
7130
|
listResources: l ? () => l.list() : void 0
|
|
@@ -7074,7 +7132,7 @@ function _l(e, n = {}) {
|
|
|
7074
7132
|
n.onAudit?.(e);
|
|
7075
7133
|
};
|
|
7076
7134
|
function b(e, t) {
|
|
7077
|
-
let n =
|
|
7135
|
+
let n = fc(a), r = f.length ? f[f.length - 1].id + 1 : 1;
|
|
7078
7136
|
for (f.push({
|
|
7079
7137
|
id: r,
|
|
7080
7138
|
ts: Date.now(),
|
|
@@ -7105,7 +7163,7 @@ function _l(e, n = {}) {
|
|
|
7105
7163
|
if (o.action === "restore") {
|
|
7106
7164
|
if (!f.length) return `无历史快照可回退(本次为首次操作)。当前值:${Q(a, 400)} (hash=${i})。请重新 read 再改或选「强制覆盖」。`;
|
|
7107
7165
|
let e = f[f.length - 1];
|
|
7108
|
-
return
|
|
7166
|
+
return yc(a, fc(e.value)), _(), `已回退主数据到历史快照 #${e.id}[${e.op}]。当前值:${Q(a, 400)} (hash=${$(a)})。请基于回退后的值重写或停止。`;
|
|
7109
7167
|
}
|
|
7110
7168
|
return null;
|
|
7111
7169
|
}
|
|
@@ -7115,7 +7173,7 @@ function _l(e, n = {}) {
|
|
|
7115
7173
|
schema: t.object({})
|
|
7116
7174
|
}), C = r(async ({ jsonPath: e }) => {
|
|
7117
7175
|
let t = e || "";
|
|
7118
|
-
if (
|
|
7176
|
+
if (cc(t)) return Y({
|
|
7119
7177
|
code: "PATH_UNSAFE",
|
|
7120
7178
|
message: `jsonPath "${t}" 含非法段(__proto__/constructor/prototype)`,
|
|
7121
7179
|
hint: "使用正常属性路径,如 components.0.text(数组索引用数字)"
|
|
@@ -7126,7 +7184,7 @@ function _l(e, n = {}) {
|
|
|
7126
7184
|
hint: "主数据仅暴露 schema 声明的字段;若需操作该字段,集成方需在 schema 中声明它"
|
|
7127
7185
|
});
|
|
7128
7186
|
let n = t ? Z(a, t) : a;
|
|
7129
|
-
t || (n = Li(n, s)), d && (n =
|
|
7187
|
+
t || (n = Li(n, s)), d && (n = ol({
|
|
7130
7188
|
jp: t,
|
|
7131
7189
|
resolved: n,
|
|
7132
7190
|
resourcesByPath: d.resourcesByPath,
|
|
@@ -7141,9 +7199,9 @@ function _l(e, n = {}) {
|
|
|
7141
7199
|
}), w = r(async ({ value: e, expectedHash: t }) => {
|
|
7142
7200
|
let n = await x("set", t || (h ? m : void 0));
|
|
7143
7201
|
if (n !== null) return n;
|
|
7144
|
-
let r =
|
|
7202
|
+
let r = pc(e);
|
|
7145
7203
|
if (r.parseError) return Gr("", e, r.parseError);
|
|
7146
|
-
let o =
|
|
7204
|
+
let o = gl({
|
|
7147
7205
|
bindRef: a,
|
|
7148
7206
|
value: r.parsed,
|
|
7149
7207
|
schema: i,
|
|
@@ -7170,7 +7228,7 @@ function _l(e, n = {}) {
|
|
|
7170
7228
|
hint: "顶层 op 或 patch.op 至少传一个"
|
|
7171
7229
|
});
|
|
7172
7230
|
let c = n || "";
|
|
7173
|
-
if (
|
|
7231
|
+
if (cc(c)) return Y({
|
|
7174
7232
|
code: "PATH_UNSAFE",
|
|
7175
7233
|
message: `jsonPath "${c}" 含非法段(__proto__/constructor/prototype)`,
|
|
7176
7234
|
hint: "使用正常的属性路径,如 components.0.text(数组索引用数字)"
|
|
@@ -7187,7 +7245,7 @@ function _l(e, n = {}) {
|
|
|
7187
7245
|
message: `edit 仅适用于对象/数组主数据,当前是 ${a === void 0 ? "undefined" : typeof a}`,
|
|
7188
7246
|
hint: "叶子(原始类型)请用 set_data 整体设置"
|
|
7189
7247
|
});
|
|
7190
|
-
let u =
|
|
7248
|
+
let u = _l({
|
|
7191
7249
|
bindRef: a,
|
|
7192
7250
|
patches: [{
|
|
7193
7251
|
op: t,
|
|
@@ -7240,7 +7298,7 @@ function _l(e, n = {}) {
|
|
|
7240
7298
|
message: "delete_data 需要 jsonPath 指定要删的子路径(主数据整体不可删,用 set_data 整体替换)",
|
|
7241
7299
|
hint: "如 jsonPath:\"components.0\" 删数组首项"
|
|
7242
7300
|
});
|
|
7243
|
-
if (
|
|
7301
|
+
if (cc(e)) return Y({
|
|
7244
7302
|
code: "PATH_UNSAFE",
|
|
7245
7303
|
message: `jsonPath "${e}" 含非法段`,
|
|
7246
7304
|
hint: "使用正常属性路径"
|
|
@@ -7251,7 +7309,7 @@ function _l(e, n = {}) {
|
|
|
7251
7309
|
hint: "仅 schema 声明的 key 可删"
|
|
7252
7310
|
});
|
|
7253
7311
|
if (d) {
|
|
7254
|
-
let t =
|
|
7312
|
+
let t = il(e, d.resourcesByPath);
|
|
7255
7313
|
if (t) return Y({
|
|
7256
7314
|
code: t.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED",
|
|
7257
7315
|
message: `delete_data @ "${e}" 命中受保护字段 "${t.protectedPath}"(${t.spec.mode}),不可删除`,
|
|
@@ -7261,7 +7319,7 @@ function _l(e, n = {}) {
|
|
|
7261
7319
|
let n = await x("delete", t || (h ? m : void 0));
|
|
7262
7320
|
if (n !== null) return n;
|
|
7263
7321
|
b("delete");
|
|
7264
|
-
let r =
|
|
7322
|
+
let r = dc(a, e);
|
|
7265
7323
|
return _(), y({
|
|
7266
7324
|
op: "delete",
|
|
7267
7325
|
detail: e,
|
|
@@ -7287,7 +7345,7 @@ function _l(e, n = {}) {
|
|
|
7287
7345
|
hint: "用 history_data({list:true}) 查看可用快照序号"
|
|
7288
7346
|
});
|
|
7289
7347
|
let n = i.safeParse(t.value);
|
|
7290
|
-
return n.success ? (
|
|
7348
|
+
return n.success ? (yc(a, fc(t.value)), _(), y({
|
|
7291
7349
|
op: "restore",
|
|
7292
7350
|
detail: `#${t.id}`,
|
|
7293
7351
|
timestamp: Date.now()
|
|
@@ -7321,9 +7379,9 @@ function _l(e, n = {}) {
|
|
|
7321
7379
|
message: `未找到快照 #${e}`,
|
|
7322
7380
|
hint: "不传 id 查看最近一次;或 history_data({list:true}) 查看可用序号"
|
|
7323
7381
|
});
|
|
7324
|
-
let a =
|
|
7382
|
+
let a = fc(r.value), o = t || "";
|
|
7325
7383
|
if (o) {
|
|
7326
|
-
if (
|
|
7384
|
+
if (cc(o)) return Y({
|
|
7327
7385
|
code: "PATH_UNSAFE",
|
|
7328
7386
|
message: `jsonPath "${o}" 含非法段`,
|
|
7329
7387
|
hint: "使用正常属性路径"
|
|
@@ -7354,7 +7412,7 @@ function _l(e, n = {}) {
|
|
|
7354
7412
|
});
|
|
7355
7413
|
let n = s ? Li(a, s) : a, r;
|
|
7356
7414
|
try {
|
|
7357
|
-
r =
|
|
7415
|
+
r = Wc(n, e);
|
|
7358
7416
|
} catch (t) {
|
|
7359
7417
|
return Y({
|
|
7360
7418
|
code: "JSONPATH_SYNTAX",
|
|
@@ -7378,7 +7436,7 @@ function _l(e, n = {}) {
|
|
|
7378
7436
|
message: "主数据为空,无可搜索内容"
|
|
7379
7437
|
});
|
|
7380
7438
|
try {
|
|
7381
|
-
let o =
|
|
7439
|
+
let o = Kc(s ? Li(a, s) : a, e, {
|
|
7382
7440
|
mode: t,
|
|
7383
7441
|
fuzzyThreshold: n,
|
|
7384
7442
|
matchKey: r,
|
|
@@ -7428,7 +7486,7 @@ function _l(e, n = {}) {
|
|
|
7428
7486
|
e && (o = Ii(o, e));
|
|
7429
7487
|
}
|
|
7430
7488
|
} else o = s ? Li(a, s) : a;
|
|
7431
|
-
let c =
|
|
7489
|
+
let c = fc(o), l = await Jc(c, e, r && JSON.stringify(c).length > 1e5 ? 8e3 : 3e3);
|
|
7432
7490
|
if (!l.ok) {
|
|
7433
7491
|
let t = /超时/.test(l.error || "");
|
|
7434
7492
|
return Y({
|
|
@@ -7444,7 +7502,7 @@ function _l(e, n = {}) {
|
|
|
7444
7502
|
if (t === "transform") {
|
|
7445
7503
|
let e = l.result;
|
|
7446
7504
|
if (r) {
|
|
7447
|
-
let t =
|
|
7505
|
+
let t = _l({
|
|
7448
7506
|
bindRef: a,
|
|
7449
7507
|
patches: [{
|
|
7450
7508
|
op: "set",
|
|
@@ -7472,7 +7530,7 @@ function _l(e, n = {}) {
|
|
|
7472
7530
|
message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),eval transform(patches) 无法就地替换`,
|
|
7473
7531
|
hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
|
|
7474
7532
|
});
|
|
7475
|
-
let t =
|
|
7533
|
+
let t = _l({
|
|
7476
7534
|
bindRef: a,
|
|
7477
7535
|
patches: e.patches,
|
|
7478
7536
|
schema: i,
|
|
@@ -7492,7 +7550,7 @@ function _l(e, n = {}) {
|
|
|
7492
7550
|
}
|
|
7493
7551
|
let t = e;
|
|
7494
7552
|
if (d) {
|
|
7495
|
-
let e =
|
|
7553
|
+
let e = ul({
|
|
7496
7554
|
value: t,
|
|
7497
7555
|
ctx: d
|
|
7498
7556
|
});
|
|
@@ -7504,7 +7562,7 @@ function _l(e, n = {}) {
|
|
|
7504
7562
|
code: "LEAF_BIND",
|
|
7505
7563
|
message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),eval transform 无法就地替换外部持有的值引用`,
|
|
7506
7564
|
hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
|
|
7507
|
-
}) : (b("edit", "eval_transform"), n.data !== null && typeof n.data == "object" && (s ?
|
|
7565
|
+
}) : (b("edit", "eval_transform"), n.data !== null && typeof n.data == "object" && (s ? lc(a, n.data) : bc(a, n.data)), _(), y({
|
|
7508
7566
|
op: "edit",
|
|
7509
7567
|
detail: "eval_transform",
|
|
7510
7568
|
timestamp: Date.now()
|
|
@@ -7541,7 +7599,7 @@ function _l(e, n = {}) {
|
|
|
7541
7599
|
e && (o = Ii(o, e));
|
|
7542
7600
|
}
|
|
7543
7601
|
let l = o;
|
|
7544
|
-
if (d && (l =
|
|
7602
|
+
if (d && (l = ol({
|
|
7545
7603
|
jp: t,
|
|
7546
7604
|
resolved: l,
|
|
7547
7605
|
resourcesByPath: d.resourcesByPath,
|
|
@@ -7551,12 +7609,12 @@ function _l(e, n = {}) {
|
|
|
7551
7609
|
} catch (e) {
|
|
7552
7610
|
return `- ${t}: [READ_INTERCEPT: ${e.message}]`;
|
|
7553
7611
|
}
|
|
7554
|
-
return r && r.length && (l =
|
|
7612
|
+
return r && r.length && (l = mc(l, r)), c != null && (l = hc(l, c)), l === void 0 ? `- ${t} = (undefined)` : `- ${t} = ${Q(l)}`;
|
|
7555
7613
|
});
|
|
7556
7614
|
return `多路径读取(共 ${t.length} 项,hash=${f}):\n${e.join("\n")}`;
|
|
7557
7615
|
}
|
|
7558
7616
|
let p = e || "";
|
|
7559
|
-
if (
|
|
7617
|
+
if (cc(p)) return Y({
|
|
7560
7618
|
code: "PATH_UNSAFE",
|
|
7561
7619
|
message: `jsonPath "${p}" 含非法段(__proto__/constructor/prototype)`,
|
|
7562
7620
|
hint: "使用正常属性路径,如 components.0.text(数组索引数字)"
|
|
@@ -7573,7 +7631,7 @@ function _l(e, n = {}) {
|
|
|
7573
7631
|
e && (h = Ii(h, e));
|
|
7574
7632
|
}
|
|
7575
7633
|
let g = h;
|
|
7576
|
-
if (d && (g =
|
|
7634
|
+
if (d && (g = ol({
|
|
7577
7635
|
jp: p,
|
|
7578
7636
|
resolved: g,
|
|
7579
7637
|
resourcesByPath: d.resourcesByPath,
|
|
@@ -7586,7 +7644,7 @@ function _l(e, n = {}) {
|
|
|
7586
7644
|
message: `read 拦截器抛错: ${e.message}`
|
|
7587
7645
|
});
|
|
7588
7646
|
}
|
|
7589
|
-
r && r.length && (g =
|
|
7647
|
+
r && r.length && (g = mc(g, r)), c != null && (g = hc(g, c));
|
|
7590
7648
|
let _ = e ? "" : `主数据说明: ${o}\n格式: 写入值需为 JSON,且通过声明的 schema 校验(校验失败时 write 会返回结构化错误)。字段约束(类型/min/max/enum/必填/默认)见 systemPrompt「可操作数据」段,或用 schema_data({ jsonPath }) 按需查。\n\n`, v = r && r.length ? `(字段裁剪:${r.join(",")})` : "", y = c == null ? "" : `(深度≤${c})`, b = v || y ? ` ${v}${y}` : "";
|
|
7591
7649
|
if ((l !== void 0 || u !== void 0) && Array.isArray(g)) {
|
|
7592
7650
|
let e = g.length, t = Math.max(0, l ?? 0), n = Math.min(200, Math.max(1, u ?? 50)), r = g.slice(t, t + n), i = t + n < e;
|
|
@@ -7648,7 +7706,7 @@ function _l(e, n = {}) {
|
|
|
7648
7706
|
message: "delete 需要 patch.jsonPath 指定要删的子路径(主数据整体不可删,用 write(value) 整体替换)",
|
|
7649
7707
|
hint: "如 patch:{jsonPath:\"components.0\"}, del:true"
|
|
7650
7708
|
});
|
|
7651
|
-
if (
|
|
7709
|
+
if (cc(t.jsonPath)) return Y({
|
|
7652
7710
|
code: "PATH_UNSAFE",
|
|
7653
7711
|
message: `jsonPath "${t.jsonPath}" 含非法段`,
|
|
7654
7712
|
hint: "使用正常属性路径"
|
|
@@ -7659,7 +7717,7 @@ function _l(e, n = {}) {
|
|
|
7659
7717
|
hint: "仅 schema 声明的 key 可删"
|
|
7660
7718
|
});
|
|
7661
7719
|
if (d) {
|
|
7662
|
-
let e =
|
|
7720
|
+
let e = il(t.jsonPath, d.resourcesByPath);
|
|
7663
7721
|
if (e) return Y({
|
|
7664
7722
|
code: e.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED",
|
|
7665
7723
|
message: `write delete @ "${t.jsonPath}" 命中受保护字段 "${e.protectedPath}"(${e.spec.mode}),不可删除`,
|
|
@@ -7669,11 +7727,11 @@ function _l(e, n = {}) {
|
|
|
7669
7727
|
let e = await x("delete", v);
|
|
7670
7728
|
if (e !== null) return e;
|
|
7671
7729
|
if (c) {
|
|
7672
|
-
let e =
|
|
7673
|
-
return
|
|
7730
|
+
let e = fc(a);
|
|
7731
|
+
return dc(e, t.jsonPath) ? `dryRun(delete): 将删除 @ ${t.jsonPath}。预览剩余:${Q(e, 600)}。未实际写入、未入快照。` : `dryRun(delete): @ ${t.jsonPath} 不存在(无需删除)。未实际写入。`;
|
|
7674
7732
|
}
|
|
7675
7733
|
b("delete");
|
|
7676
|
-
let n =
|
|
7734
|
+
let n = dc(a, t.jsonPath);
|
|
7677
7735
|
return _(), y({
|
|
7678
7736
|
op: "delete",
|
|
7679
7737
|
detail: t.jsonPath,
|
|
@@ -7692,7 +7750,7 @@ function _l(e, n = {}) {
|
|
|
7692
7750
|
op: t.op ?? "set",
|
|
7693
7751
|
jsonPath: t.jsonPath || "",
|
|
7694
7752
|
value: u
|
|
7695
|
-
}]), o =
|
|
7753
|
+
}]), o = _l({
|
|
7696
7754
|
bindRef: a,
|
|
7697
7755
|
patches: n,
|
|
7698
7756
|
schema: i,
|
|
@@ -7711,11 +7769,11 @@ function _l(e, n = {}) {
|
|
|
7711
7769
|
timestamp: Date.now()
|
|
7712
7770
|
}), m = $(a), `已 write(edit) 主数据(${o.applied.length} 个 patch)。当前值:${Q(a, 600)} (新 hash=${$(a)})`) : o.error;
|
|
7713
7771
|
}
|
|
7714
|
-
let S =
|
|
7772
|
+
let S = pc(u);
|
|
7715
7773
|
if (S.parseError) return Gr("", u, S.parseError);
|
|
7716
7774
|
let C = await x("set", v);
|
|
7717
7775
|
if (C !== null) return C;
|
|
7718
|
-
let w =
|
|
7776
|
+
let w = gl({
|
|
7719
7777
|
bindRef: a,
|
|
7720
7778
|
value: S.parsed,
|
|
7721
7779
|
schema: i,
|
|
@@ -7772,7 +7830,7 @@ function _l(e, n = {}) {
|
|
|
7772
7830
|
if (n) {
|
|
7773
7831
|
let e = t;
|
|
7774
7832
|
if (typeof e == "string") {
|
|
7775
|
-
let t =
|
|
7833
|
+
let t = pc(e);
|
|
7776
7834
|
t.parseError || (e = t.parsed);
|
|
7777
7835
|
}
|
|
7778
7836
|
r = e, i = "against";
|
|
@@ -7790,7 +7848,7 @@ function _l(e, n = {}) {
|
|
|
7790
7848
|
});
|
|
7791
7849
|
r = t.value, i = `快照 #${t.id}`;
|
|
7792
7850
|
}
|
|
7793
|
-
let o = s ? Li(a, s) : a, c =
|
|
7851
|
+
let o = s ? Li(a, s) : a, c = xc(r, fc(o));
|
|
7794
7852
|
return c.length ? `差异(当前 vs ${i},共 ${c.length} 处):\n${c.map((e) => ` ${e.path}: ${Q(e.from)} → ${Q(e.to)}`).join("\n")}` : `无差异:当前主数据与 ${i} 完全相同。`;
|
|
7795
7853
|
}, {
|
|
7796
7854
|
name: "diff_data",
|
|
@@ -7842,7 +7900,7 @@ function _l(e, n = {}) {
|
|
|
7842
7900
|
}
|
|
7843
7901
|
let u = await x("set", n || (h ? m : void 0));
|
|
7844
7902
|
if (u !== null) return u;
|
|
7845
|
-
let g =
|
|
7903
|
+
let g = gl({
|
|
7846
7904
|
bindRef: a,
|
|
7847
7905
|
value: l,
|
|
7848
7906
|
schema: i,
|
|
@@ -7874,7 +7932,7 @@ function _l(e, n = {}) {
|
|
|
7874
7932
|
message: "未提供 path 或有效 handle",
|
|
7875
7933
|
hint: "传 path(受保护字段)或 handle(占位符 ⟦res:handle⟧ 里的句柄)"
|
|
7876
7934
|
});
|
|
7877
|
-
let r =
|
|
7935
|
+
let r = tl(n);
|
|
7878
7936
|
if (!c.has(r)) return Y({
|
|
7879
7937
|
code: "RESOURCE_NOT_FOUND",
|
|
7880
7938
|
message: `"${n}" 不是受保护字段`,
|
|
@@ -7913,7 +7971,7 @@ function _l(e, n = {}) {
|
|
|
7913
7971
|
message: "resource_update 需要 path",
|
|
7914
7972
|
hint: "传要更新的 verbatim 受保护字段路径"
|
|
7915
7973
|
});
|
|
7916
|
-
let n =
|
|
7974
|
+
let n = tl(e), r = c.get(n);
|
|
7917
7975
|
if (!r) return Y({
|
|
7918
7976
|
code: "RESOURCE_NOT_FOUND",
|
|
7919
7977
|
message: `"${e}" 不是受保护字段`,
|
|
@@ -7934,7 +7992,7 @@ function _l(e, n = {}) {
|
|
|
7934
7992
|
details: Ur(n.error.issues)
|
|
7935
7993
|
});
|
|
7936
7994
|
}
|
|
7937
|
-
l.update(n, t),
|
|
7995
|
+
l.update(n, t), uc(a, n, t), m = $(a), _();
|
|
7938
7996
|
let s = l.get(n)?.handle;
|
|
7939
7997
|
return `已更新 verbatim 资源 "${e}" = ${Q(t, 200)}(handle ${s ?? "(未知)"} 不变)。后续 write 该字段写回句柄 ⟦res:${s}⟧ 或新值`;
|
|
7940
7998
|
}, {
|
|
@@ -7995,8 +8053,8 @@ function _l(e, n = {}) {
|
|
|
7995
8053
|
}
|
|
7996
8054
|
//#endregion
|
|
7997
8055
|
//#region src/core/tools/fetchDoc.ts
|
|
7998
|
-
var
|
|
7999
|
-
let n = new AbortController(), r = setTimeout(() => n.abort(),
|
|
8056
|
+
var yl = 3e4, bl = [r(async ({ url: e, as: t }) => {
|
|
8057
|
+
let n = new AbortController(), r = setTimeout(() => n.abort(), yl);
|
|
8000
8058
|
try {
|
|
8001
8059
|
let r = await fetch(e, {
|
|
8002
8060
|
method: "GET",
|
|
@@ -8013,7 +8071,7 @@ var vl = 3e4, yl = [r(async ({ url: e, as: t }) => {
|
|
|
8013
8071
|
].join("\n");
|
|
8014
8072
|
} catch (t) {
|
|
8015
8073
|
let r = t?.message || String(t);
|
|
8016
|
-
return n.signal.aborted ? `获取失败:请求超时(${
|
|
8074
|
+
return n.signal.aborted ? `获取失败:请求超时(${yl}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
|
|
8017
8075
|
} finally {
|
|
8018
8076
|
clearTimeout(r);
|
|
8019
8077
|
}
|
|
@@ -8024,7 +8082,7 @@ var vl = 3e4, yl = [r(async ({ url: e, as: t }) => {
|
|
|
8024
8082
|
url: t.string().describe("要抓取的 URL(同源或已配 CORS)"),
|
|
8025
8083
|
as: t.enum(["text", "markdown"]).optional().describe("返回格式标签,默认 text")
|
|
8026
8084
|
})
|
|
8027
|
-
})],
|
|
8085
|
+
})], xl = [
|
|
8028
8086
|
"id",
|
|
8029
8087
|
"class",
|
|
8030
8088
|
"href",
|
|
@@ -8036,12 +8094,12 @@ var vl = 3e4, yl = [r(async ({ url: e, as: t }) => {
|
|
|
8036
8094
|
"aria-label",
|
|
8037
8095
|
"name",
|
|
8038
8096
|
"type"
|
|
8039
|
-
],
|
|
8040
|
-
function
|
|
8097
|
+
], Sl = /^(value|srcdoc|formaction|on\w+)$/i, Cl = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session/i;
|
|
8098
|
+
function wl(e, t) {
|
|
8041
8099
|
if (!e) return null;
|
|
8042
|
-
let { depth: n, attrs: r, includeText: i = !0 } = t, a = r !== void 0, o = r ??
|
|
8100
|
+
let { depth: n, attrs: r, includeText: i = !0 } = t, a = r !== void 0, o = r ?? xl, s = (e) => {
|
|
8043
8101
|
let t = {};
|
|
8044
|
-
for (let n of Array.from(e.attributes)) (a ? o.includes(n.name) : o.includes(n.name) || n.name.startsWith("data-")) && (
|
|
8102
|
+
for (let n of Array.from(e.attributes)) (a ? o.includes(n.name) : o.includes(n.name) || n.name.startsWith("data-")) && (Sl.test(n.name) || Cl.test(n.name) || (t[n.name] = n.value));
|
|
8045
8103
|
return t;
|
|
8046
8104
|
}, c = (e, t) => {
|
|
8047
8105
|
let n = {
|
|
@@ -8057,10 +8115,10 @@ function Cl(e, t) {
|
|
|
8057
8115
|
};
|
|
8058
8116
|
return c(e, n);
|
|
8059
8117
|
}
|
|
8060
|
-
var
|
|
8118
|
+
var Tl = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
|
|
8061
8119
|
let i = e ? document.querySelector(e) : document.body;
|
|
8062
8120
|
if (!i) return `未找到匹配元素:selector="${e}"`;
|
|
8063
|
-
let a =
|
|
8121
|
+
let a = wl(i, {
|
|
8064
8122
|
depth: t ?? 3,
|
|
8065
8123
|
attrs: n,
|
|
8066
8124
|
includeText: r ?? !0
|
|
@@ -8075,14 +8133,14 @@ var wl = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
|
|
|
8075
8133
|
attrs: t.array(t.string()).optional().describe("属性白名单(传了 = 严格白名单;不传 = 默认常用 + data-*)"),
|
|
8076
8134
|
includeText: t.boolean().optional().describe("是否包含直接文本(默认 true)")
|
|
8077
8135
|
})
|
|
8078
|
-
}),
|
|
8136
|
+
}), El = [Tl];
|
|
8079
8137
|
//#endregion
|
|
8080
8138
|
//#region src/core/tools/envTool.ts
|
|
8081
|
-
function
|
|
8139
|
+
function Dl(e) {
|
|
8082
8140
|
let t = e;
|
|
8083
8141
|
return typeof t.tagName == "string" || typeof t.nodeType == "number" && typeof t.nodeName == "string";
|
|
8084
8142
|
}
|
|
8085
|
-
function
|
|
8143
|
+
function Ol(e, t = 3, n = 2e3, r) {
|
|
8086
8144
|
if (e == null) return e;
|
|
8087
8145
|
if (typeof e == "string") return e.length > n ? e.slice(0, n) + "…(已截断)" : e;
|
|
8088
8146
|
if (typeof e == "number" || typeof e == "boolean") return e;
|
|
@@ -8091,14 +8149,14 @@ function Dl(e, t = 3, n = 2e3, r) {
|
|
|
8091
8149
|
if (typeof e == "bigint") return `${e.toString()}n`;
|
|
8092
8150
|
if (typeof e != "object") return String(e);
|
|
8093
8151
|
let i = e;
|
|
8094
|
-
if (
|
|
8152
|
+
if (Dl(i)) {
|
|
8095
8153
|
let e = i;
|
|
8096
8154
|
return e.tagName ? `[Element: <${e.tagName.toLowerCase()}>]` : `[Node: ${e.nodeName}]`;
|
|
8097
8155
|
}
|
|
8098
8156
|
if (r?.has(i)) return "[Circular]";
|
|
8099
8157
|
let a = r ?? /* @__PURE__ */ new WeakSet();
|
|
8100
8158
|
if (a.add(i), Array.isArray(e)) {
|
|
8101
|
-
let r = e.slice(0, 100).map((e) =>
|
|
8159
|
+
let r = e.slice(0, 100).map((e) => Ol(e, t - 1, n, a));
|
|
8102
8160
|
return e.length > 100 && r.push(`…(共 ${e.length} 项,已截断)`), r;
|
|
8103
8161
|
}
|
|
8104
8162
|
if (t < 0) return "(对象,已截断)";
|
|
@@ -8110,14 +8168,14 @@ function Dl(e, t = 3, n = 2e3, r) {
|
|
|
8110
8168
|
break;
|
|
8111
8169
|
}
|
|
8112
8170
|
try {
|
|
8113
|
-
o[r] =
|
|
8171
|
+
o[r] = Ol(i[r], t - 1, n, a);
|
|
8114
8172
|
} catch {
|
|
8115
8173
|
o[r] = "(getter 抛错)";
|
|
8116
8174
|
}
|
|
8117
8175
|
}
|
|
8118
8176
|
return o;
|
|
8119
8177
|
}
|
|
8120
|
-
function
|
|
8178
|
+
function kl(e) {
|
|
8121
8179
|
let t = e ?? (typeof window < "u" ? window : {}), n = t.navigator, r = t.location, i = t.document;
|
|
8122
8180
|
return {
|
|
8123
8181
|
location: {
|
|
@@ -8150,9 +8208,9 @@ function Ol(e) {
|
|
|
8150
8208
|
} : "(无 document)"
|
|
8151
8209
|
};
|
|
8152
8210
|
}
|
|
8153
|
-
var
|
|
8211
|
+
var Al = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|opener|parent|top|self|window|globalThis|closed|history|navigation|trustedTypes|origin|crossOriginIsolated)$/, jl = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session|ticket/i, Ml = r(({ key: e }) => {
|
|
8154
8212
|
if (e) {
|
|
8155
|
-
if (
|
|
8213
|
+
if (Al.test(e) || jl.test(e)) return JSON.stringify({
|
|
8156
8214
|
key: e,
|
|
8157
8215
|
denied: !0,
|
|
8158
8216
|
reason: "安全:该 key 在 denylist(localStorage/sessionStorage/cookie/document 或敏感命名 token/secret/key/auth),不读取防泄漏"
|
|
@@ -8162,18 +8220,18 @@ var kl = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|open
|
|
|
8162
8220
|
key: e,
|
|
8163
8221
|
exists: t !== void 0,
|
|
8164
8222
|
type: typeof t,
|
|
8165
|
-
value:
|
|
8223
|
+
value: Ol(t)
|
|
8166
8224
|
}, null, 2);
|
|
8167
8225
|
}
|
|
8168
|
-
return JSON.stringify(
|
|
8226
|
+
return JSON.stringify(kl(), null, 2);
|
|
8169
8227
|
}, {
|
|
8170
8228
|
name: "inspect_env",
|
|
8171
8229
|
description: "读取宿主页面环境信息(排查调试用,默认开启)。不传参 = 返回环境摘要(location 的 URL/origin/path、navigator 的浏览器/语言、viewport 视口尺寸、document 的 title/readyState);传 key = 读取指定 window 属性值(如 inspect_env({key:\"appConfig\"}) 读集成方挂的调试变量 window.appConfig)。用于排查「当前页面在哪/什么浏览器/视口多大/调试变量值是什么」。轻量只读,大结果自动外存 vfs。",
|
|
8172
8230
|
schema: t.object({ key: t.string().optional().describe("要读取的 window 属性名(如 \"appConfig\"/\"__DEBUG__\");不传 = 返回环境摘要") })
|
|
8173
|
-
}),
|
|
8231
|
+
}), Nl = [Ml];
|
|
8174
8232
|
//#endregion
|
|
8175
8233
|
//#region src/core/harness/budget.ts
|
|
8176
|
-
function
|
|
8234
|
+
function Pl(e, t, n) {
|
|
8177
8235
|
let r = 0;
|
|
8178
8236
|
return {
|
|
8179
8237
|
name: "budget",
|
|
@@ -8198,12 +8256,12 @@ function Nl(e, t, n) {
|
|
|
8198
8256
|
}
|
|
8199
8257
|
//#endregion
|
|
8200
8258
|
//#region src/core/sdk/actions.ts
|
|
8201
|
-
var
|
|
8202
|
-
function
|
|
8259
|
+
var Fl = /^[a-zA-Z][a-zA-Z0-9_]*$/;
|
|
8260
|
+
function Il(e) {
|
|
8203
8261
|
let n = [];
|
|
8204
8262
|
for (let [i, a] of Object.entries(e)) {
|
|
8205
|
-
if (!
|
|
8206
|
-
console.warn(`[page-agent-sdk][actions] 动作名 "${i}" 非法(须匹配 ${
|
|
8263
|
+
if (!Fl.test(i)) {
|
|
8264
|
+
console.warn(`[page-agent-sdk][actions] 动作名 "${i}" 非法(须匹配 ${Fl}),已跳过`);
|
|
8207
8265
|
continue;
|
|
8208
8266
|
}
|
|
8209
8267
|
let e = a.description || `宿主动作 ${i}`;
|
|
@@ -8223,9 +8281,9 @@ function Fl(e) {
|
|
|
8223
8281
|
}
|
|
8224
8282
|
return n;
|
|
8225
8283
|
}
|
|
8226
|
-
function
|
|
8284
|
+
function Ll(e) {
|
|
8227
8285
|
let t = {};
|
|
8228
|
-
for (let [n, r] of Object.entries(e))
|
|
8286
|
+
for (let [n, r] of Object.entries(e)) Fl.test(n) && (t[n] = {
|
|
8229
8287
|
description: r.description,
|
|
8230
8288
|
hasParams: !!r.params
|
|
8231
8289
|
});
|
|
@@ -8233,12 +8291,12 @@ function Il(e) {
|
|
|
8233
8291
|
}
|
|
8234
8292
|
//#endregion
|
|
8235
8293
|
//#region src/core/toolsets.ts
|
|
8236
|
-
var
|
|
8237
|
-
function
|
|
8238
|
-
return
|
|
8294
|
+
var Rl = bl, zl = El;
|
|
8295
|
+
function Bl(e, t) {
|
|
8296
|
+
return vl(e, t);
|
|
8239
8297
|
}
|
|
8240
|
-
function
|
|
8241
|
-
let a =
|
|
8298
|
+
function Vl(e, t, n, r, i) {
|
|
8299
|
+
let a = ec(e);
|
|
8242
8300
|
return [
|
|
8243
8301
|
...a.dataOps ? t : [],
|
|
8244
8302
|
...a.fetch ? n : [],
|
|
@@ -8248,7 +8306,7 @@ function Bl(e, t, n, r, i) {
|
|
|
8248
8306
|
}
|
|
8249
8307
|
//#endregion
|
|
8250
8308
|
//#region src/core/sdk/toolRegistry.ts
|
|
8251
|
-
function
|
|
8309
|
+
function Hl(e) {
|
|
8252
8310
|
let t = /* @__PURE__ */ new Map(), n = [];
|
|
8253
8311
|
for (let r of e) for (let e of r.tools) {
|
|
8254
8312
|
let i = t.get(e.name);
|
|
@@ -8268,15 +8326,15 @@ function Vl(e) {
|
|
|
8268
8326
|
}
|
|
8269
8327
|
//#endregion
|
|
8270
8328
|
//#region src/core/harness/usageHints.ts
|
|
8271
|
-
var
|
|
8272
|
-
function
|
|
8273
|
-
let i =
|
|
8329
|
+
var Ul = .7;
|
|
8330
|
+
function Wl(e, t, n = "simple", r = !1) {
|
|
8331
|
+
let i = ec(e), a = n !== "advanced";
|
|
8274
8332
|
return {
|
|
8275
8333
|
name: "usageHints",
|
|
8276
8334
|
augmentPrompt: () => {
|
|
8277
8335
|
let n = [];
|
|
8278
8336
|
if (i.planning && (n.push("【自适应规划】按任务复杂度决定是否先规划,不要对简单任务过度编排:"), n.push(" · 简单/明确任务(改单字段、调样式、查值)→ 直接 read/write 执行,不必 write_todos。"), n.push(" · 复杂任务(多步、大改、有歧义、不可逆)→ 先 write_todos 拆解,首个任务标 in_progress,逐项推进。"), n.push(" · 执行中发现步骤要改/补/细分 → 用 update_todo({id, content?, status?}) 按 id 增量改单项,不必重传整个清单。"), n.push(" · 规划出多步方案若需用户拍板 → 先 request_human_confirmation 给方案选项,确认后再执行。"), n.push(" · 规划阶段有轮次预算(maxPlanRevisions,默认 5):勿反复调研/改计划而不执行,规划充分后即开始 write 落地。")), t && (a ? (n.push("读写主数据用 read/write(高层入口,自动乐观锁 + 自动快照)。read({jsonPath}) 读子路径当前值(返回含 hash,write 时自动比对,无需手动传);read() 不传读整个主数据 + 说明。write 改值两姿势:① 改单个字段/子路径用 write({patch:{op:\"set\", jsonPath:\"路径.字段\", value:新值}})——patch.value 就是该字段的新值(类型匹配:string 直传字符串、number 传数字、对象传对象),不要包成 {字段:值} 对象(字段名已在 jsonPath);也兼容 write({value:新值, patch:{op,jsonPath}}) 顶层 value(向后兼容,但优先 patch.value,避免与整体 set 的 value 混淆);② 替换整个对象用 write({value:{整个新对象}})。op:set 设值 / remove 删 / merge 合并对象 / append 追加数组;批量多改动 write({patches:[{op,jsonPath,value},...]});删子路径 write({patch:{jsonPath:\"路径\"}, del:true})。写入自动经 schema 校验(失败不写,按错误提示改值类型/形状后重试)+ 自动存快照(出错可用 restore_data 回退)。"), n.push("修改大对象/数组优先用 write 的 patch 增量(只发改动部分),避免整体重传被 max_tokens 截断致 JSON 不完整。"), n.push("读大数组(read 返回 hasMore=true)用 read({jsonPath,offset,limit}) 分页(offset+=limit 续读,默认 limit=50);一次读多个不相关子路径用 read({jsonPaths:[...]}) 省轮次;复杂 patches 改动先 write({patches,dryRun:true}) 预检(走完整校验不落盘)。"), n.push("read/describe 返回按 schema 投影:仅 schema 声明的字段可见(未声明字段自动隐藏,防误操作);要操作某字段需集成方在 schema 声明,查任意路径完整约束用 schema_data({jsonPath})。"), n.push("查历史快照值(看上一版长啥样 / 冲突诊断 / 用户问\"刚才改了啥\")用 history_data({id?,jsonPath?})(只读不改当前);对比当前与历史快照的差异需切 advanced 用 diff_data(返回结构化 path→from/to)。"), n.push("在大数组里按条件筛选用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素 path/index;定位后用 write patch 改。找名字记不清的元素用 search_data(substring/regex/fuzzy)。批量过滤/映射/聚合/重写大数组用 eval_script(沙箱脚本,mode=query 只读/transform 落地)。")) : (n.push("改主数据前先 get_data({jsonPath}) 读其当前真实值与 hash(返回末尾 hash=xxx),基于真实值改,不要凭记忆。写入(set/edit/delete)时回传 expectedHash=该 hash 启用乐观锁——若主数据在你 get 之后被外部代码/其他 agent/用户手动改过,会触发冲突:集成方若开启人工介入,工具会挂起等用户决定(保留外部/强制覆盖/回退),你应等待工具返回后按结果继续(保留外部→重新 get 再改;强制覆盖→已写入,继续;回退→已回退到历史快照,基于回退值重写);未开启人工介入时返回 VERSION_CONFLICT 不写入,重新 get 拿最新值与 hash 再改。"), n.push("不确定主数据字段结构时用 describe_data 查看说明。"), n.push("修改大对象/数组优先用 edit_data 增量 patch(只发改动部分),避免 set_data 整体重传被 max_tokens 截断导致 JSON 不完整、校验失败。"), n.push("修改主数据出错时可用 restore_data 回退最近一次。"), n.push("在大数组里按条件筛选元素用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素的 path/index;定位后再 edit_data 改。"), n.push("找名字记不清的元素用 search_data(支持 substring/regex/fuzzy 模糊搜索)。"), n.push("需要过滤/映射/聚合/批量重写大数组时用 eval_script(沙箱脚本,入参 data);只读探查用 mode=query,批量重写用 mode=transform(返回值经校验后落地)。"), n.push("读大数组用 read({jsonPath,offset,limit}) 分页(返回 hasMore=true 时 offset+=limit 续读);一次读多个不相关子路径用 read({jsonPaths});复杂改动先 write({...,dryRun:true}) 预检不落盘。"), n.push("对比当前与历史快照(或一段 JSON against)的差异用 diff_data({snapshotId?,against?})(返回结构化 path→from/to,verify 自纠/操作审计/\"刚才改了啥\");只读查历史快照值用 history_data({id?,jsonPath?})。"))), i.subagent && n.push("独立子任务可 spawn_agent 委派(只读工具,过程不占主上下文)。"), i.inspectEnv && n.push("排查页面环境(当前 URL/浏览器/视口/集成方调试变量)用 inspect_env——不传参返回环境摘要(location/navigator/viewport/document),传 key 读特定 window 属性(如 inspect_env({key:\"appConfig\"}) 读 window.appConfig)。改完数据看渲染、定位\"为何没生效\"时用它(只读,不改数据)。"), i.domInspect && n.push("改完数据想确认渲染是否生效(或定位元素/辅助 UI 设计问答)用 get_dom({selector?,depth?}) 读渲染后 DOM(结构化返回 tag/attrs/text/children,depth 控制深度防爆炸,只读)。配合宿主 actions(save_draft/publish 等)形成\"改数据→get_dom 看渲染→触发动作\"闭环。"), i.draftWrite && n.push("生成超大 JSON(如 50+ 组件页面,单次 write 受 max_tokens 限制装不下)用 draft_write 分块构建 → draft_commit 原子提交:draft_write({draftId, chunk, mode}) mode:\"start\" 新建/\"append\" 追加(拼 JSON 片段到 drafts 池);累积完 draft_commit({draftId}) 合并 + schema 校验 + 写主数据(失败草稿保留可修后重试,成功自动清草稿)。小改仍用 write patch,只在大 JSON 从零生成时用 draft。"), i.draftWrite && n.push("⚠️ 大 JSON 分块构建是典型多轮工具调用(draft_write×N + draft_commit + read 确认 + 调研 read/query),默认 maxToolRounds=10 可能触顶被 while 截断导致草稿写不完;目标组件数大时集成方应在 createChatSdk 配 maxToolRounds ≥ 20(或按 N+5 估算)。draft_commit 提交同样走乐观锁(改前 read 拿 hash,bind 被改过会触发冲突介入,不静默覆盖)。"), i.todoDeps && n.push("复杂任务可用 todos 层级依赖:write_todos 时给 todo 传 parentId(父任务 id,表达层级)+ deps(依赖的 todo id 数组,必须先完成)。有依赖的任务,deps 全 completed 后再标 in_progress;完成时 update_todo({id, status:\"completed\", evidence:\"完成证据\"}) 记证据。无依赖关系的任务不传 parentId/deps(扁平)。"), i.focus && !a && (n.push("【上下文聚焦】判断任务范围,用 set_focus/add_focus/remove_focus/clear_focus 自动收敛工作范围:"), n.push(" · 局部任务(只改某一组件/区域,如「调导航栏」「改 components.3 样式」)→ 先 read 定位 jsonPath,再 set_focus({path:\"该子树路径\"}) 聚焦;聚焦后每轮只看该子树结构,写其他位置会被 PATH_DENIED 拒绝。"), n.push(" · 多个相关组件(如「同时改导航栏和页脚」)→ set_focus 聚焦首个后用 add_focus({path}) 追加其余;聚焦后可写任一焦点子树,越界仍被拒;移除单个用 remove_focus({path})。"), n.push(" · 全局任务(多处/整体结构,如「重排所有组件」「换主题」)→ 不要聚焦,保持全量视野直接写。"), n.push(" · 完成局部精修、要转向其他区域或做整体改动 → 调 clear_focus 退出聚焦(清空全部焦点),恢复全部读写权限。"), n.push(" · set_focus/add_focus 的 path 必须在 schema 内(类型校验);不确定路径先 read/describe_data 查。")), r && (n.push("【受保护资源·精确值保护】部分字段被 freeze/verbatim 保护(集成方在 data.resources 声明):"), n.push(" · read 受保护路径返回占位符 ⟦frozen:path⟧(freeze,精确值不入消息流)或 ⟦res:handle⟧(verbatim,原值在资源池),非真值。"), n.push(" · 确需真值用 resource_get({path})(仅受保护路径);freeze 字段完全不可改,撞 FROZEN_FIELD 即放弃该字段改动。"), n.push(" · verbatim 字段改新值:先 resource_update({path,value}) 更新资源池(同步 bind),再 write 写回句柄 ⟦res:handle⟧;直接写新值 → VERBATIM_MISMATCH。"), n.push(" · 撞 RESOURCE_EVICTED(资源被池淘汰)→ 重新 read 该字段懒注册重建句柄;撞 RESOURCE_NOT_FOUND → 重新 read。")), e?.subagents?.length) {
|
|
8279
|
-
let t = e.subagents.filter((e) => (e.temperature ?? 0) >=
|
|
8337
|
+
let t = e.subagents.filter((e) => (e.temperature ?? 0) >= Ul || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), r = e.subagents.filter((e) => (e.temperature ?? 0) < Ul && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
|
|
8280
8338
|
n.push("【规划-反思-执行·路由】按任务性质选模式,不要对简单任务过度编排:"), t.length && (n.push(` · 创作/设计/开放性需求(如"设计主题风格""换个感觉")→ 先调 ${t.map((e) => "use_" + e.id).join("/")} 出 2-3 套方案(高温创意),`), n.push(" 不要自己拍板;拿到方案后,若需用户拍板用 request_human_confirmation 弹选项。")), r.length && n.push(` · 严谨/易错/校验类 → 可先调 ${r.map((e) => "use_" + e.id).join("/")} 反思挑刺(低温审查),据反馈修订。`), n.push(a ? " · 方案定稿后,由你(主 agent)用 write 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。" : " · 方案定稿后,由你(主 agent)用 edit_data 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。"), n.push(" · 简单/明确任务(如\"标题改红色\")直接执行,不必走规划-反思。");
|
|
8281
8339
|
}
|
|
8282
8340
|
return e?.humanConfirm && (n.push("【人工确认·必读】以下情形必须先调 request_human_confirmation 征询用户、拿到答复后再继续,不要自行拍板:"), n.push(" 1) 用户让你「给方案/列选项/我来选/挑一个」时:把每个方案作为一个 option,调 request_human_confirmation(question=简述, options=[方案A,方案B,...], recommendation=你推荐的)。不要只回文字罗列方案让用户自己回复——要用工具把选项做成可点选按钮。"), n.push(" 2) 需求有歧义/不确定时:调工具问清楚(options 不传则用户答同意或拒绝)。"), n.push(" 3) 即将执行高风险不可逆操作(删除/覆盖/批量改动)前:调工具确认。"), n.push(" 4) 规划出多步方案需用户确认时:把整个方案(或关键分步)作为 option 调 request_human_confirmation,确认后再执行。"), n.push("用户在选项里选了哪个,就按那个方案继续;选「拒绝」则停止并询问如何调整。")), n.length && n.unshift("调用工具务必用标准 function calling(工具调用)格式发起,不要在回复正文里输出伪 XML/标签(如 deepseek 的 tool_calls 标签、invoke、function_call、tool_call 等)或 JSON 文本——那不会被识别为工具调用,会被当普通文字,工具不执行。"), n.length ? "## 能力使用提示\n" + n.join("\n") : void 0;
|
|
@@ -8285,7 +8343,7 @@ function Ul(e, t, n = "simple", r = !1) {
|
|
|
8285
8343
|
}
|
|
8286
8344
|
//#endregion
|
|
8287
8345
|
//#region src/core/harness/resourcesPin.ts
|
|
8288
|
-
function
|
|
8346
|
+
function Gl(e) {
|
|
8289
8347
|
return {
|
|
8290
8348
|
name: "resourcesPin",
|
|
8291
8349
|
augmentPrompt: () => {
|
|
@@ -8299,78 +8357,78 @@ function Wl(e) {
|
|
|
8299
8357
|
}
|
|
8300
8358
|
//#endregion
|
|
8301
8359
|
//#region src/core/backends/skillStore.ts
|
|
8302
|
-
var
|
|
8303
|
-
function
|
|
8304
|
-
return `${
|
|
8360
|
+
var Kl = "v:1::skill-store", ql = "chat-sdk";
|
|
8361
|
+
function Jl(e, t, n) {
|
|
8362
|
+
return `${Kl}::${e}::${t}::${n}`;
|
|
8305
8363
|
}
|
|
8306
|
-
function
|
|
8307
|
-
return `${
|
|
8364
|
+
function Yl(e, t) {
|
|
8365
|
+
return `${Kl}::${e}::${t}::`;
|
|
8308
8366
|
}
|
|
8309
|
-
function
|
|
8310
|
-
let t = e.dbName ??
|
|
8367
|
+
function Xl(e = {}) {
|
|
8368
|
+
let t = e.dbName ?? ql, n = e.backend ?? "indexed", r = e.id ?? "", i, a, o = new Promise((e) => {
|
|
8311
8369
|
a = e;
|
|
8312
8370
|
});
|
|
8313
8371
|
return (async () => {
|
|
8314
8372
|
try {
|
|
8315
8373
|
if (n === "indexed") {
|
|
8316
8374
|
if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
|
|
8317
|
-
i = await
|
|
8375
|
+
i = await qs(t), a(!0);
|
|
8318
8376
|
} else if (n === "session") {
|
|
8319
8377
|
if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
|
|
8320
|
-
i =
|
|
8378
|
+
i = Js(sessionStorage), a(!0);
|
|
8321
8379
|
} else if (n === "local") {
|
|
8322
8380
|
if (typeof localStorage > "u") throw Error("localStorage 不可用");
|
|
8323
|
-
i =
|
|
8324
|
-
} else i =
|
|
8381
|
+
i = Js(localStorage), a(!0);
|
|
8382
|
+
} else i = Ks(), a(!1);
|
|
8325
8383
|
} catch {
|
|
8326
|
-
i =
|
|
8384
|
+
i = Ks(), a(!1);
|
|
8327
8385
|
}
|
|
8328
8386
|
})(), {
|
|
8329
8387
|
ready: o,
|
|
8330
8388
|
async list() {
|
|
8331
8389
|
let e = [];
|
|
8332
|
-
return await i.scan(
|
|
8390
|
+
return await i.scan(Yl(t, r), (t, n) => {
|
|
8333
8391
|
e.push(n);
|
|
8334
8392
|
}), e;
|
|
8335
8393
|
},
|
|
8336
8394
|
async get(e) {
|
|
8337
|
-
return await i.get(
|
|
8395
|
+
return await i.get(Jl(t, r, e));
|
|
8338
8396
|
},
|
|
8339
8397
|
async put(e) {
|
|
8340
8398
|
try {
|
|
8341
|
-
await i.set(
|
|
8399
|
+
await i.set(Jl(t, r, e.name), e);
|
|
8342
8400
|
} catch (e) {
|
|
8343
|
-
|
|
8401
|
+
Rs(e) && (i = Ks());
|
|
8344
8402
|
}
|
|
8345
8403
|
},
|
|
8346
8404
|
async remove(e) {
|
|
8347
|
-
let n =
|
|
8405
|
+
let n = Jl(t, r, e);
|
|
8348
8406
|
return await i.get(n) == null ? !1 : (await i.del(n), !0);
|
|
8349
8407
|
},
|
|
8350
8408
|
async clear() {
|
|
8351
|
-
await i.clearPrefix(
|
|
8409
|
+
await i.clearPrefix(Yl(t, r));
|
|
8352
8410
|
},
|
|
8353
8411
|
dispose() {}
|
|
8354
8412
|
};
|
|
8355
8413
|
}
|
|
8356
|
-
var
|
|
8357
|
-
function
|
|
8414
|
+
var Zl = /large_results\/[^\s"'`),]+\.txt/g;
|
|
8415
|
+
function Ql(e) {
|
|
8358
8416
|
let t = /* @__PURE__ */ new Set(), n = (e) => {
|
|
8359
8417
|
if (typeof e != "string" || !e) return;
|
|
8360
8418
|
let n;
|
|
8361
|
-
for (
|
|
8419
|
+
for (Zl.lastIndex = 0; (n = Zl.exec(e)) !== null;) t.add(n[0]);
|
|
8362
8420
|
};
|
|
8363
8421
|
for (let t of e) if (n(t.content), t.steps) for (let e of t.steps) n(e.result);
|
|
8364
8422
|
return t;
|
|
8365
8423
|
}
|
|
8366
|
-
function
|
|
8424
|
+
function $l(e, t) {
|
|
8367
8425
|
let n = [];
|
|
8368
8426
|
for (let r of Object.keys(e)) r.startsWith("large_results/") && !t.has(r) && n.push(r);
|
|
8369
8427
|
return n;
|
|
8370
8428
|
}
|
|
8371
8429
|
//#endregion
|
|
8372
8430
|
//#region src/core/utils/serialRunner.ts
|
|
8373
|
-
function
|
|
8431
|
+
function eu() {
|
|
8374
8432
|
let e = Promise.resolve();
|
|
8375
8433
|
return function(t) {
|
|
8376
8434
|
let n = e.then(t, t);
|
|
@@ -8379,16 +8437,16 @@ function $l() {
|
|
|
8379
8437
|
}
|
|
8380
8438
|
//#endregion
|
|
8381
8439
|
//#region src/core/sdk/createChatSdk.ts
|
|
8382
|
-
var
|
|
8383
|
-
function
|
|
8440
|
+
var tu = 30, nu = /* @__PURE__ */ new Map();
|
|
8441
|
+
function ru(e, t) {
|
|
8384
8442
|
return e === "set_data" ? "set" : e === "edit_data" ? "edit" : e === "delete_data" ? "delete" : e === "restore_data" ? "restore" : e === "write" ? t?.del ? "delete" : t?.patch ? "edit" : "set" : null;
|
|
8385
8443
|
}
|
|
8386
|
-
function
|
|
8444
|
+
function iu(e, t, n, r) {
|
|
8387
8445
|
let i = 0;
|
|
8388
8446
|
return {
|
|
8389
8447
|
name: "sdk-events",
|
|
8390
8448
|
wrapToolCall: async (t, r) => {
|
|
8391
|
-
let i = await r(t), a =
|
|
8449
|
+
let i = await r(t), a = ru(t.name, t.args);
|
|
8392
8450
|
return a && e({
|
|
8393
8451
|
type: "data_change",
|
|
8394
8452
|
operation: a,
|
|
@@ -8423,7 +8481,7 @@ function ru(e, t, n, r) {
|
|
|
8423
8481
|
}
|
|
8424
8482
|
};
|
|
8425
8483
|
}
|
|
8426
|
-
function
|
|
8484
|
+
function au(e, t, n, r, i) {
|
|
8427
8485
|
if (!n) return i && console.warn(`[page-agent-sdk][focus] capabilities.focus 关闭,${t} 忽略`), {
|
|
8428
8486
|
ok: !1,
|
|
8429
8487
|
error: "capabilities.focus 关闭"
|
|
@@ -8441,18 +8499,18 @@ function iu(e, t, n, r, i) {
|
|
|
8441
8499
|
error: "当前无主数据 schema,无法聚焦"
|
|
8442
8500
|
});
|
|
8443
8501
|
}
|
|
8444
|
-
function
|
|
8502
|
+
function ou(e, n) {
|
|
8445
8503
|
let i = {
|
|
8446
8504
|
prompt_tokens: 0,
|
|
8447
8505
|
completion_tokens: 0,
|
|
8448
8506
|
total_tokens: 0
|
|
8449
|
-
}, a =
|
|
8507
|
+
}, a = Ts(() => H), o = /* @__PURE__ */ Ot(0), s = Zs(e.storage);
|
|
8450
8508
|
e.debug && s && s.onEvent((e) => console.log("[page-agent-sdk][storage]", e));
|
|
8451
|
-
let { modelCaps: c, summaryLlmInvoke: l, titleLlmInvoke: u, compressDecisionInvoke: p } =
|
|
8509
|
+
let { modelCaps: c, summaryLlmInvoke: l, titleLlmInvoke: u, compressDecisionInvoke: p } = ws(e), m = c;
|
|
8452
8510
|
if (e.debug && console.log("[page-agent-sdk][modelCaps]", m), m.contextWindow < 2e5) throw Error(`[page-agent-sdk] 模型上下文窗口 ${m.contextWindow} 小于最小支持 ${ti}(需 ≥200K 窗口模型,如 GLM-5.2/Claude/Kimi/Qwen-1M/DeepSeek-v4)`);
|
|
8453
|
-
let h =
|
|
8511
|
+
let h = ic(e, m.contextWindow), g = h.enableLLMSummary !== !1, _ = (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? rc[e.contextPreset ?? "auto"], v = new Set(_), y = e.llm;
|
|
8454
8512
|
e.debug && !l && console.warn("[page-agent-sdk][summarization] 未构造 llmInvoke(apiKey 缺失?),摘要回退零成本索引摘要");
|
|
8455
|
-
let b = /* @__PURE__ */ _t([]), x =
|
|
8513
|
+
let b = /* @__PURE__ */ _t([]), x = Tc(e.vfs?.initialFiles, {
|
|
8456
8514
|
persist: s ? { save: (e) => {
|
|
8457
8515
|
W.sessionId && s && s.save(n, W.sessionId, { vfs: e });
|
|
8458
8516
|
} } : void 0,
|
|
@@ -8472,18 +8530,18 @@ function au(e, n) {
|
|
|
8472
8530
|
getTodos: () => ee.current?.getState?.()?.todos ?? [],
|
|
8473
8531
|
messages: b,
|
|
8474
8532
|
maxCheckpoints: O && typeof O == "object" ? O.maxCheckpoints : void 0
|
|
8475
|
-
}) : null, te = !O || typeof O != "object" || O.auto !== !1, j =
|
|
8533
|
+
}) : null, te = !O || typeof O != "object" || O.auto !== !1, j = ec(e.capabilities), ne = j.dataOps, M = j.draftWrite, N = j.tracing, re = j.automation, P = ls(e), ie = ne && D ? vl(D, {
|
|
8476
8534
|
onAudit: e.onAudit ?? (e.debug ? (e) => console.log("[page-agent-sdk][data audit]", e) : void 0),
|
|
8477
8535
|
maxSnapshots: e.maxSnapshots,
|
|
8478
8536
|
onConflict: a.set,
|
|
8479
8537
|
autoLock: e.autoLock,
|
|
8480
8538
|
interceptors: e.interceptors,
|
|
8481
8539
|
vfsStore: M || D?.resources?.length ? x : void 0
|
|
8482
|
-
}) : [], ae = ne ?
|
|
8540
|
+
}) : [], ae = ne ? hl(ie, e.toolMode) : [], oe = ne && D ? ie.controller ?? null : null, se = ne && D?.resources?.length && oe?.getResourcesSnapshot ? Gl({ getResourcesSnapshot: () => oe?.getResourcesSnapshot?.() ?? [] }) : void 0, F = () => oe?.get() ?? D, I = /* @__PURE__ */ new Map(), ce = Vl(j, ae, bl, El, Nl);
|
|
8483
8541
|
ce.forEach((e) => I.set(e.name, "builtin"));
|
|
8484
8542
|
let le = [...e.tools || []];
|
|
8485
8543
|
le.forEach((e) => I.set(e.name, "user"));
|
|
8486
|
-
let L =
|
|
8544
|
+
let L = Il(e.actions ?? {});
|
|
8487
8545
|
L.forEach((e) => I.set(e.name, "action"));
|
|
8488
8546
|
let ue = [], de = e.humanConfirm !== !1 && (!e.approval || e.approval.humanConfirmTool !== !1), fe = de ? Wa() : null;
|
|
8489
8547
|
fe && I.set(Ha, "builtin");
|
|
@@ -8555,7 +8613,7 @@ function au(e, n) {
|
|
|
8555
8613
|
ve.forEach((e) => I.set(e.name, "builtin"));
|
|
8556
8614
|
let z = [], ye = /* @__PURE__ */ new Map(), B = be();
|
|
8557
8615
|
function be() {
|
|
8558
|
-
let { tools: e, collisions: t } =
|
|
8616
|
+
let { tools: e, collisions: t } = Hl([
|
|
8559
8617
|
{
|
|
8560
8618
|
label: "builtin",
|
|
8561
8619
|
tools: ce
|
|
@@ -8592,49 +8650,51 @@ function au(e, n) {
|
|
|
8592
8650
|
return t.length && console.warn("[page-agent-sdk] 工具重名,后注册覆盖先注册:", t.map((e) => `${e.name}(${e.loser}→${e.winner})`).join(", ")), e;
|
|
8593
8651
|
}
|
|
8594
8652
|
let xe = j.planning, Se = j.missionAnchor, Ce = j.workingMemory, we = j.skills, Te = j.vfs;
|
|
8595
|
-
if (Te) for (let e of
|
|
8653
|
+
if (Te) for (let e of Mc) I.set(e, "builtin");
|
|
8596
8654
|
if (xe) for (let e of S.tools ?? []) I.set(e.name, "builtin");
|
|
8597
8655
|
let Ee = j.summarization, De = j.agentCompression && !!p;
|
|
8598
8656
|
e.debug && j.agentCompression && !p && console.warn("[page-agent-sdk][agentCompression] agentCompression 开启但 summaryLlm 不可用(或缺 apiKey / 模型不支持工具),压缩决策不启用,回退静态压缩");
|
|
8599
|
-
let Oe = j.memory, ke = j.subagent, Ae = e.verify?.maxAttempts ?? 2,
|
|
8657
|
+
let Oe = j.memory, ke = j.subagent, Ae = ke ? bo() : void 0, je = e.verify?.maxAttempts ?? 2, Me = j.verify && e.verify?.enabled !== !1 && je > 0, Ne = j.contextInspector;
|
|
8600
8658
|
e.verify?.check && !j.verify && console.warn("[page-agent-sdk][verify] 检测到 verify.check 但 capabilities.verify 未开启,verify 未装载");
|
|
8601
|
-
let
|
|
8602
|
-
llm:
|
|
8659
|
+
let Pe = e.subagent, Fe = Pe?.allowedTools ?? [], Ie = !ke || Pe?.enabled === !1 ? void 0 : Mo({
|
|
8660
|
+
llm: Pe?.llm ?? e.llm,
|
|
8603
8661
|
allTools: () => B,
|
|
8604
|
-
allowedTools:
|
|
8605
|
-
systemPrompt:
|
|
8606
|
-
temperature:
|
|
8607
|
-
maxTokens:
|
|
8608
|
-
skills:
|
|
8609
|
-
maxDepth:
|
|
8610
|
-
maxParallel:
|
|
8662
|
+
allowedTools: Fe.length ? Fe : void 0,
|
|
8663
|
+
systemPrompt: Pe?.systemPrompt,
|
|
8664
|
+
temperature: Pe?.temperature,
|
|
8665
|
+
maxTokens: Pe?.maxTokens,
|
|
8666
|
+
skills: Pe?.skills,
|
|
8667
|
+
maxDepth: Pe?.maxDepth,
|
|
8668
|
+
maxParallel: Pe?.maxParallel,
|
|
8611
8669
|
debug: e.debug,
|
|
8612
8670
|
getFocuses: () => w.getFocuses(),
|
|
8613
|
-
getSchema: () => F()?.schema ?? null
|
|
8614
|
-
|
|
8671
|
+
getSchema: () => F()?.schema ?? null,
|
|
8672
|
+
tracker: Ae
|
|
8673
|
+
}), Le = ke && e.subagents !== void 0 ? Fo(e.subagents, {
|
|
8615
8674
|
llm: e.llm,
|
|
8616
8675
|
allTools: () => B,
|
|
8617
8676
|
debug: e.debug,
|
|
8618
8677
|
getFocuses: () => w.getFocuses(),
|
|
8619
|
-
getSchema: () => F()?.schema ?? null
|
|
8620
|
-
|
|
8678
|
+
getSchema: () => F()?.schema ?? null,
|
|
8679
|
+
tracker: Ae
|
|
8680
|
+
}) : void 0, Re = Le ? Le.controller : null, V = [
|
|
8621
8681
|
"get_data",
|
|
8622
8682
|
"describe_data",
|
|
8623
8683
|
"read",
|
|
8624
8684
|
"fetch_document"
|
|
8625
|
-
],
|
|
8626
|
-
check: e.verify.check ??
|
|
8685
|
+
], ze = B.filter((e) => V.includes(e.name)), Be = Me ? Io({
|
|
8686
|
+
check: e.verify.check ?? Ho({
|
|
8627
8687
|
schemas: () => F() ? { "": F().schema } : {},
|
|
8628
8688
|
root: () => F()?.bind
|
|
8629
8689
|
}),
|
|
8630
8690
|
adversarial: e.verify?.adversarial ? {
|
|
8631
8691
|
llm: e.llm,
|
|
8632
|
-
tools:
|
|
8692
|
+
tools: ze
|
|
8633
8693
|
} : void 0
|
|
8634
|
-
}) : void 0,
|
|
8694
|
+
}) : void 0, Ve = Ne ? ns({
|
|
8635
8695
|
contextWindow: m.contextWindow,
|
|
8636
|
-
thresholdRatio:
|
|
8637
|
-
}) : void 0,
|
|
8696
|
+
thresholdRatio: ic(e, m.contextWindow).summaryThresholdRatio
|
|
8697
|
+
}) : void 0, He = Wl({
|
|
8638
8698
|
...j,
|
|
8639
8699
|
humanConfirm: de,
|
|
8640
8700
|
subagents: e.subagents?.map((e) => ({
|
|
@@ -8642,10 +8702,10 @@ function au(e, n) {
|
|
|
8642
8702
|
description: e.description,
|
|
8643
8703
|
temperature: e.temperature
|
|
8644
8704
|
}))
|
|
8645
|
-
}, ne && !!D, e.toolMode, !!D?.resources?.length),
|
|
8705
|
+
}, ne && !!D, e.toolMode, !!D?.resources?.length), Ue = D ? {
|
|
8646
8706
|
name: "dataHint",
|
|
8647
|
-
augmentPrompt: () =>
|
|
8648
|
-
} : null,
|
|
8707
|
+
augmentPrompt: () => cs(F(), e.schemaHint) || void 0
|
|
8708
|
+
} : null, We = e.augmentSystem ? {
|
|
8649
8709
|
name: "augmentSystem",
|
|
8650
8710
|
augmentPrompt: (t) => {
|
|
8651
8711
|
try {
|
|
@@ -8658,30 +8718,30 @@ function au(e, n) {
|
|
|
8658
8718
|
return;
|
|
8659
8719
|
}
|
|
8660
8720
|
}
|
|
8661
|
-
} : null,
|
|
8721
|
+
} : null, Ge = e.onEvent, Ke = tc(e.onEvent), H = Ke.emit, qe, U = [], Je = (e) => ({
|
|
8662
8722
|
name: e.name,
|
|
8663
8723
|
description: e.description,
|
|
8664
8724
|
content: typeof e.getContent == "function" ? e.getContent() : ""
|
|
8665
|
-
}),
|
|
8725
|
+
}), Ye = (e) => ({
|
|
8666
8726
|
name: e.name,
|
|
8667
8727
|
description: e.description,
|
|
8668
8728
|
getContent: () => e.content
|
|
8669
|
-
}),
|
|
8729
|
+
}), Xe = e.skillStorage === !1 ? null : Xl({
|
|
8670
8730
|
...typeof e.skillStorage == "object" ? e.skillStorage : {},
|
|
8671
8731
|
id: e.skillStorage && typeof e.skillStorage == "object" && e.skillStorage.id ? e.skillStorage.id : `agent::${n}`
|
|
8672
|
-
}),
|
|
8673
|
-
let t =
|
|
8732
|
+
}), Ze = () => {
|
|
8733
|
+
let t = qe ? qe.controller : null;
|
|
8674
8734
|
if (t) {
|
|
8675
8735
|
let n = (e.skills || []).filter((e) => !U.some((t) => t.name === e.name));
|
|
8676
8736
|
t.set([...n, ...U]);
|
|
8677
8737
|
}
|
|
8678
8738
|
W.infoTick.value++;
|
|
8679
|
-
},
|
|
8680
|
-
if (
|
|
8681
|
-
let t = await
|
|
8739
|
+
}, Qe = async () => {
|
|
8740
|
+
if (Xe) try {
|
|
8741
|
+
let t = await Xe.list();
|
|
8682
8742
|
if (t.length) {
|
|
8683
|
-
U = t.map(
|
|
8684
|
-
let n =
|
|
8743
|
+
U = t.map(Ye);
|
|
8744
|
+
let n = qe ? qe.controller : null;
|
|
8685
8745
|
if (n) {
|
|
8686
8746
|
let t = (e.skills || []).filter((e) => !U.some((t) => t.name === e.name));
|
|
8687
8747
|
n.set([...t, ...U]);
|
|
@@ -8689,21 +8749,21 @@ function au(e, n) {
|
|
|
8689
8749
|
W.infoTick.value++;
|
|
8690
8750
|
}
|
|
8691
8751
|
} catch {}
|
|
8692
|
-
},
|
|
8752
|
+
}, $e = Ee ? yo({
|
|
8693
8753
|
...h,
|
|
8694
8754
|
llmInvoke: l,
|
|
8695
8755
|
getRegisteredData: () => F() ? [{ description: F().description ?? "主数据对象" }] : [],
|
|
8696
8756
|
preserveLastToolResults: _,
|
|
8697
8757
|
...De ? {
|
|
8698
8758
|
decideInvoke: p,
|
|
8699
|
-
getSnapshot: () =>
|
|
8759
|
+
getSnapshot: () => Ve?.getSnapshot()
|
|
8700
8760
|
} : {}
|
|
8701
|
-
}) : void 0,
|
|
8702
|
-
...
|
|
8703
|
-
|
|
8761
|
+
}) : void 0, et = oc([
|
|
8762
|
+
...Ue ? [Ue] : [],
|
|
8763
|
+
He,
|
|
8704
8764
|
...Se ? [C] : [],
|
|
8705
8765
|
...xe ? [S] : [],
|
|
8706
|
-
...we ? [
|
|
8766
|
+
...we ? [qe = Na(e.skills || [], {
|
|
8707
8767
|
readVfs: Te ? (e) => x.files[e]?.content : void 0,
|
|
8708
8768
|
hostScriptEnabled: j.skillHostScript,
|
|
8709
8769
|
onToolsReady: (e, t) => {
|
|
@@ -8714,8 +8774,8 @@ function au(e, n) {
|
|
|
8714
8774
|
B = be(), W.agent && W.agent.setTools(B), W.infoTick.value++;
|
|
8715
8775
|
}
|
|
8716
8776
|
})] : [],
|
|
8717
|
-
...Te ? [
|
|
8718
|
-
|
|
8777
|
+
...Te ? [Pc(x)] : [],
|
|
8778
|
+
...$e ? [$e] : [],
|
|
8719
8779
|
...Ce ? [T] : [],
|
|
8720
8780
|
...R ? [w] : [],
|
|
8721
8781
|
...se ? [se] : [],
|
|
@@ -8724,27 +8784,27 @@ function au(e, n) {
|
|
|
8724
8784
|
...k && te && A ? [$a(A)] : [],
|
|
8725
8785
|
...de ? [Ga()] : [],
|
|
8726
8786
|
...e.approval && (e.approval.tools !== void 0 || e.approval.confirm) ? [Va(e.approval)] : [],
|
|
8727
|
-
...ze ? [ze] : [],
|
|
8728
|
-
...Fe ? [Fe] : [],
|
|
8729
|
-
...Ie ? [Ie] : [],
|
|
8730
|
-
...Ue ? [Ue] : [],
|
|
8731
8787
|
...Be ? [Be] : [],
|
|
8788
|
+
...Ie ? [Ie] : [],
|
|
8789
|
+
...Le ? [Le] : [],
|
|
8790
|
+
...We ? [We] : [],
|
|
8791
|
+
...Ve ? [Ve] : [],
|
|
8732
8792
|
...e.middleware || [],
|
|
8733
|
-
...re ? [
|
|
8793
|
+
...re ? [Pl(i, {
|
|
8734
8794
|
tokenBudget: e.tokenBudget,
|
|
8735
8795
|
timeBudgetMs: e.timeBudgetMs
|
|
8736
8796
|
}, H)] : [],
|
|
8737
|
-
|
|
8738
|
-
]),
|
|
8739
|
-
async function
|
|
8740
|
-
s && (
|
|
8797
|
+
iu(H, b, F, i)
|
|
8798
|
+
]), tt = e.maxMemoryRounds ?? tu, nt = /* @__PURE__ */ Ot([]);
|
|
8799
|
+
async function rt() {
|
|
8800
|
+
s && (nt.value = (await s.listSessions(n)).sort((e, t) => t.lastAccessed - e.lastAccessed));
|
|
8741
8801
|
}
|
|
8742
8802
|
let W = {
|
|
8743
8803
|
agentId: n,
|
|
8744
8804
|
store: s,
|
|
8745
8805
|
messages: b,
|
|
8746
8806
|
vfsStore: x,
|
|
8747
|
-
listeners:
|
|
8807
|
+
listeners: Ke.listeners,
|
|
8748
8808
|
todosMw: S,
|
|
8749
8809
|
memoryMw: E,
|
|
8750
8810
|
missionMw: C,
|
|
@@ -8758,11 +8818,11 @@ function au(e, n) {
|
|
|
8758
8818
|
mcpServers: [],
|
|
8759
8819
|
checkpoint: A,
|
|
8760
8820
|
dataOpsController: oe,
|
|
8761
|
-
skillsController:
|
|
8821
|
+
skillsController: qe ? qe.controller : null,
|
|
8762
8822
|
infoTick: o,
|
|
8763
8823
|
pendingConflict: a.pendingConflict,
|
|
8764
|
-
sessions:
|
|
8765
|
-
refreshSessions:
|
|
8824
|
+
sessions: nt,
|
|
8825
|
+
refreshSessions: rt,
|
|
8766
8826
|
liveData: F,
|
|
8767
8827
|
usage: i,
|
|
8768
8828
|
emit: H,
|
|
@@ -8788,15 +8848,15 @@ function au(e, n) {
|
|
|
8788
8848
|
}
|
|
8789
8849
|
}
|
|
8790
8850
|
}
|
|
8791
|
-
|
|
8851
|
+
st();
|
|
8792
8852
|
},
|
|
8793
8853
|
addSkill(e) {
|
|
8794
8854
|
let t = U.findIndex((t) => t.name === e.name);
|
|
8795
|
-
t >= 0 ? U[t] = e : U.push(e),
|
|
8855
|
+
t >= 0 ? U[t] = e : U.push(e), Ze(), Xe && Xe.put(Je(e));
|
|
8796
8856
|
},
|
|
8797
8857
|
removeSkill(e) {
|
|
8798
8858
|
let t = U.findIndex((t) => t.name === e);
|
|
8799
|
-
return t < 0 ? !1 : (U.splice(t, 1),
|
|
8859
|
+
return t < 0 ? !1 : (U.splice(t, 1), Ze(), Xe && Xe.remove(e), !0);
|
|
8800
8860
|
},
|
|
8801
8861
|
listUserSkills() {
|
|
8802
8862
|
return U.map((e) => e.name);
|
|
@@ -8810,7 +8870,7 @@ function au(e, n) {
|
|
|
8810
8870
|
};
|
|
8811
8871
|
},
|
|
8812
8872
|
afterRound() {
|
|
8813
|
-
|
|
8873
|
+
ct(), dt();
|
|
8814
8874
|
},
|
|
8815
8875
|
async send(e, t) {
|
|
8816
8876
|
await W.initDone, t ??= {}, t?.mission && Se && C.setMission(t.mission);
|
|
@@ -8940,19 +9000,19 @@ function au(e, n) {
|
|
|
8940
9000
|
type: "session_restored",
|
|
8941
9001
|
sessionId: r,
|
|
8942
9002
|
rounds: i.messages?.length ?? 0
|
|
8943
|
-
})), e.memory && s.save(n, W.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }),
|
|
9003
|
+
})), e.memory && s.save(n, W.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }), rt(), lt = void 0, ut = !1, r;
|
|
8944
9004
|
},
|
|
8945
9005
|
resetSession: () => {
|
|
8946
|
-
s && (W.sessionId =
|
|
9006
|
+
s && (W.sessionId = Es(), x.clear?.(), S.reset([]), e.memory || E.reset(""), C.reset(), T.reset(), w.reset(), A && A.importStack([]), W.agent && (W.agent.debugLogs.value = []), s.createSession(W.agentId, e.session?.title, W.sessionId), H({
|
|
8947
9007
|
type: "session_restored",
|
|
8948
9008
|
sessionId: W.sessionId,
|
|
8949
9009
|
rounds: 0
|
|
8950
|
-
}),
|
|
9010
|
+
}), rt(), lt = void 0, ut = !1);
|
|
8951
9011
|
},
|
|
8952
9012
|
stream: (e, t, n) => {
|
|
8953
9013
|
if (!W.agent) throw Error("page-agent-sdk: agent 尚未初始化完成,请先 await mount()");
|
|
8954
|
-
x?.setProtectedRefs?.(
|
|
8955
|
-
let r =
|
|
9014
|
+
x?.setProtectedRefs?.(Ql(e));
|
|
9015
|
+
let r = Ge ? (e) => {
|
|
8956
9016
|
t?.(e), H(e);
|
|
8957
9017
|
} : t;
|
|
8958
9018
|
if (n) {
|
|
@@ -8963,9 +9023,9 @@ function au(e, n) {
|
|
|
8963
9023
|
},
|
|
8964
9024
|
release() {
|
|
8965
9025
|
if (W.refCount--, W.refCount <= 0) {
|
|
8966
|
-
s && (x.flush?.(), s.flush(), s.dispose()),
|
|
9026
|
+
s && (x.flush?.(), s.flush(), s.dispose()), Xe && Xe.dispose();
|
|
8967
9027
|
let e = W.mcpClosers.splice(0);
|
|
8968
|
-
e.length && Promise.allSettled(e.map((e) => e())),
|
|
9028
|
+
e.length && Promise.allSettled(e.map((e) => e())), nu.delete(n);
|
|
8969
9029
|
}
|
|
8970
9030
|
},
|
|
8971
9031
|
resolveConflict: a.resolve,
|
|
@@ -8985,20 +9045,20 @@ function au(e, n) {
|
|
|
8985
9045
|
},
|
|
8986
9046
|
setLlm(t) {
|
|
8987
9047
|
let n;
|
|
8988
|
-
if (
|
|
9048
|
+
if (hs(t)) n = t;
|
|
8989
9049
|
else {
|
|
8990
9050
|
let e = t;
|
|
8991
9051
|
if ((e.provider ?? "openai") === "anthropic") throw Error("[page-agent-sdk][setLlm] 切换到 Anthropic 需传 BaseChatModel 实例(动态 import 无法同步);请先 const { ChatAnthropic } = await import(\"@langchain/anthropic\") 构造实例后传入");
|
|
8992
9052
|
n = d(e);
|
|
8993
9053
|
}
|
|
8994
9054
|
typeof n.bindTools != "function" && e.debug && console.warn("[page-agent-sdk][setLlm] 新模型不支持 bindTools(tool calling 会失效)"), y = t;
|
|
8995
|
-
let r =
|
|
9055
|
+
let r = hs(t) ? void 0 : t;
|
|
8996
9056
|
if (m = ni({
|
|
8997
9057
|
model: r?.model ?? t.model ?? t.modelName,
|
|
8998
9058
|
contextWindow: e.contextWindow ?? r?.contextWindow,
|
|
8999
9059
|
maxOutputTokens: e.maxOutputTokens ?? r?.maxOutputTokens
|
|
9000
9060
|
}), m.contextWindow < 2e5) throw Error(`[page-agent-sdk][setLlm] 新模型上下文窗口 ${m.contextWindow} 小于最小支持 ${ti}(需 ≥200K 窗口模型)`);
|
|
9001
|
-
W.agent && (W.agent.setLlm(n), W.agent.setModelCaps?.(m)),
|
|
9061
|
+
W.agent && (W.agent.setLlm(n), W.agent.setModelCaps?.(m)), $e?.setContextWindow?.(m.contextWindow), Ve?.setContextWindow?.(m.contextWindow), W.infoTick.value++, e.debug && console.log("[page-agent-sdk][setLlm] 重解析 modelCaps + 回灌:", m);
|
|
9002
9062
|
},
|
|
9003
9063
|
setMemory(e) {
|
|
9004
9064
|
E.reset(e), typeof e == "function" && E.refresh(), W.infoTick.value++;
|
|
@@ -9007,37 +9067,43 @@ function au(e, n) {
|
|
|
9007
9067
|
return E.refresh();
|
|
9008
9068
|
},
|
|
9009
9069
|
setSubagents(t) {
|
|
9010
|
-
if (!
|
|
9070
|
+
if (!Re) {
|
|
9011
9071
|
e.debug && console.warn("[page-agent-sdk][setSubagents] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略");
|
|
9012
9072
|
return;
|
|
9013
9073
|
}
|
|
9014
|
-
|
|
9074
|
+
Re.set(t), W.infoTick.value++;
|
|
9015
9075
|
},
|
|
9016
9076
|
addSubagent(t) {
|
|
9017
|
-
if (!
|
|
9077
|
+
if (!Re) {
|
|
9018
9078
|
e.debug && console.warn("[page-agent-sdk][addSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略");
|
|
9019
9079
|
return;
|
|
9020
9080
|
}
|
|
9021
|
-
|
|
9081
|
+
Re.add(t), W.infoTick.value++;
|
|
9022
9082
|
},
|
|
9023
9083
|
removeSubagent(t) {
|
|
9024
|
-
if (!
|
|
9025
|
-
let n =
|
|
9084
|
+
if (!Re) return e.debug && console.warn("[page-agent-sdk][removeSubagent] 未配 subagents:[] 或 capabilities.subagent 关闭,忽略"), !1;
|
|
9085
|
+
let n = Re.remove(t);
|
|
9026
9086
|
return n && W.infoTick.value++, n;
|
|
9027
9087
|
},
|
|
9088
|
+
getActiveSubagents() {
|
|
9089
|
+
return Ae?.getActive() ?? [];
|
|
9090
|
+
},
|
|
9091
|
+
get subagentHistory() {
|
|
9092
|
+
return Ae?.getHistory() ?? [];
|
|
9093
|
+
},
|
|
9028
9094
|
getInfo() {
|
|
9029
9095
|
return {
|
|
9030
9096
|
id: n,
|
|
9031
9097
|
sessionId: W.sessionId,
|
|
9032
|
-
model:
|
|
9033
|
-
systemPrompt: W.agent?.getEffectiveSystemPrompt?.() ?? P +
|
|
9098
|
+
model: hs(y) ? y.model ?? y.modelName : y.model,
|
|
9099
|
+
systemPrompt: W.agent?.getEffectiveSystemPrompt?.() ?? P + cs(F(), e.schemaHint),
|
|
9034
9100
|
tools: (W.agent?.allTools ?? B).map((e) => ({
|
|
9035
9101
|
name: e.name,
|
|
9036
9102
|
description: e.description,
|
|
9037
9103
|
schema: e.schema,
|
|
9038
9104
|
source: I.get(e.name) || "user"
|
|
9039
9105
|
})),
|
|
9040
|
-
skills: (
|
|
9106
|
+
skills: (qe ? qe.controller.get() : e.skills ?? []).map((e) => ({
|
|
9041
9107
|
name: e.name,
|
|
9042
9108
|
description: e.description
|
|
9043
9109
|
})),
|
|
@@ -9047,7 +9113,7 @@ function au(e, n) {
|
|
|
9047
9113
|
} : void 0,
|
|
9048
9114
|
contextPreset: e.contextPreset ?? "auto",
|
|
9049
9115
|
memory: E.get(),
|
|
9050
|
-
middleware:
|
|
9116
|
+
middleware: et.map((e) => e.name),
|
|
9051
9117
|
todos: (W.agent?.getState?.()?.todos ?? []).map((e) => ({
|
|
9052
9118
|
id: e.id,
|
|
9053
9119
|
content: e.content,
|
|
@@ -9066,21 +9132,23 @@ function au(e, n) {
|
|
|
9066
9132
|
spans: W.agent.spans.value,
|
|
9067
9133
|
metrics: ai(W.agent.spans.value)
|
|
9068
9134
|
} : void 0,
|
|
9069
|
-
actions:
|
|
9135
|
+
actions: Ll(e.actions ?? {}),
|
|
9070
9136
|
subagent: {
|
|
9071
|
-
enabled: !!
|
|
9137
|
+
enabled: !!Ie,
|
|
9072
9138
|
maxDepth: e.subagent?.maxDepth ?? 1,
|
|
9073
9139
|
maxParallel: e.subagent?.maxParallel ?? 4,
|
|
9074
9140
|
allowedTools: e.subagent?.allowedTools ?? [],
|
|
9075
|
-
subagents:
|
|
9141
|
+
subagents: Re?.get() ?? [],
|
|
9142
|
+
active: Ae?.getActive() ?? [],
|
|
9143
|
+
history: Ae?.getHistory() ?? []
|
|
9076
9144
|
},
|
|
9077
9145
|
verify: {
|
|
9078
|
-
enabled: !!
|
|
9079
|
-
maxAttempts:
|
|
9080
|
-
adversarial:
|
|
9146
|
+
enabled: !!Be,
|
|
9147
|
+
maxAttempts: Me ? je : 0,
|
|
9148
|
+
adversarial: Me && !!e.verify?.adversarial
|
|
9081
9149
|
},
|
|
9082
9150
|
context: (() => {
|
|
9083
|
-
let e =
|
|
9151
|
+
let e = Ve?.getSnapshot();
|
|
9084
9152
|
if (e) {
|
|
9085
9153
|
let t = W.agent?.getState?.()?.lastCompression;
|
|
9086
9154
|
t && (e.compression = t);
|
|
@@ -9113,11 +9181,11 @@ function au(e, n) {
|
|
|
9113
9181
|
return R ? w.getFocuses() : [];
|
|
9114
9182
|
},
|
|
9115
9183
|
setFocus(t) {
|
|
9116
|
-
let n =
|
|
9184
|
+
let n = au(t, "setFocus", R, () => F()?.schema, e.debug);
|
|
9117
9185
|
return n.ok ? (w.setFocus(t), W.infoTick.value++, { ok: !0 }) : n;
|
|
9118
9186
|
},
|
|
9119
9187
|
addFocus(t) {
|
|
9120
|
-
let n =
|
|
9188
|
+
let n = au(t, "addFocus", R, () => F()?.schema, e.debug);
|
|
9121
9189
|
return n.ok ? w.getFocuses().length >= 8 ? (e.debug && console.warn("[page-agent-sdk][focus] addFocus 拒绝:焦点数已达上限 8(augmentPrompt 注入每焦点子树 schema,过多致 system prompt 超预算)"), {
|
|
9122
9190
|
ok: !1,
|
|
9123
9191
|
error: "焦点数上限 8(避免 system prompt 撑爆)"
|
|
@@ -9130,7 +9198,7 @@ function au(e, n) {
|
|
|
9130
9198
|
R && (w.clearFocus(), W.infoTick.value++);
|
|
9131
9199
|
}
|
|
9132
9200
|
};
|
|
9133
|
-
async function
|
|
9201
|
+
async function it() {
|
|
9134
9202
|
if (!s) return;
|
|
9135
9203
|
await s.ready;
|
|
9136
9204
|
let t = e.session || {};
|
|
@@ -9154,25 +9222,25 @@ function au(e, n) {
|
|
|
9154
9222
|
}), e.debug && console.log("[page-agent-sdk][restore] 恢复会话", W.sessionId, `${t.messages?.length ?? 0} msgs`)) : e.debug && console.log("[page-agent-sdk][restore] 会话 meta 存在但快照为空", W.sessionId);
|
|
9155
9223
|
} else W.sessionId = await s.createSession(n, t.title), e.debug && console.log("[page-agent-sdk][restore] 新建会话(无历史)", W.sessionId);
|
|
9156
9224
|
} else W.sessionId = await s.createSession(n, t.title);
|
|
9157
|
-
e.memory && s.save(n, W.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }),
|
|
9225
|
+
e.memory && s.save(n, W.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }), rt();
|
|
9158
9226
|
}
|
|
9159
|
-
async function
|
|
9160
|
-
await
|
|
9227
|
+
async function at() {
|
|
9228
|
+
await Qe();
|
|
9161
9229
|
}
|
|
9162
|
-
function
|
|
9230
|
+
function ot(e) {
|
|
9163
9231
|
let t = {};
|
|
9164
|
-
for (let n of
|
|
9232
|
+
for (let n of Ql(e)) {
|
|
9165
9233
|
let e = x.files[n];
|
|
9166
9234
|
e && (t[n] = e.content);
|
|
9167
9235
|
}
|
|
9168
9236
|
return t;
|
|
9169
9237
|
}
|
|
9170
|
-
function
|
|
9171
|
-
let e =
|
|
9238
|
+
function st() {
|
|
9239
|
+
let e = $l(x.files, Ql(b));
|
|
9172
9240
|
for (let t of e) delete x.files[t];
|
|
9173
9241
|
}
|
|
9174
|
-
function
|
|
9175
|
-
let e = co(b,
|
|
9242
|
+
function ct() {
|
|
9243
|
+
let e = co(b, tt);
|
|
9176
9244
|
if (!e.trimmed) return;
|
|
9177
9245
|
let { older: t, summary: n } = e;
|
|
9178
9246
|
if (H({
|
|
@@ -9183,22 +9251,22 @@ function au(e, n) {
|
|
|
9183
9251
|
assistant: e.assistantMsgs.map((e) => e.content),
|
|
9184
9252
|
steps: e.assistantMsgs.flatMap((e) => e.steps ?? [])
|
|
9185
9253
|
})),
|
|
9186
|
-
vfsResults:
|
|
9254
|
+
vfsResults: ot(t.flatMap((e) => [e.userMsg, ...e.assistantMsgs])),
|
|
9187
9255
|
summary: n.content,
|
|
9188
9256
|
reason: "max_memory_rounds"
|
|
9189
|
-
}), b.splice(e.deleteFrom, e.deleteCount, n),
|
|
9257
|
+
}), b.splice(e.deleteFrom, e.deleteCount, n), st(), g && l) {
|
|
9190
9258
|
let n = e.summary, { prevSeg: r } = e;
|
|
9191
9259
|
(async () => {
|
|
9192
9260
|
try {
|
|
9193
9261
|
let e = await l(mo(t, v)), i = b.indexOf(n);
|
|
9194
9262
|
if (i < 0) return;
|
|
9195
|
-
b[i].content = so(t, r, e),
|
|
9263
|
+
b[i].content = so(t, r, e), dt();
|
|
9196
9264
|
} catch {}
|
|
9197
9265
|
})();
|
|
9198
9266
|
}
|
|
9199
9267
|
}
|
|
9200
|
-
let
|
|
9201
|
-
function
|
|
9268
|
+
let lt, ut = !1;
|
|
9269
|
+
function dt() {
|
|
9202
9270
|
if (!W.sessionId || !s) return;
|
|
9203
9271
|
let t = JSON.parse(JSON.stringify(b));
|
|
9204
9272
|
s.save(n, W.sessionId, { messages: t });
|
|
@@ -9216,15 +9284,15 @@ function au(e, n) {
|
|
|
9216
9284
|
s.save(n, W.sessionId, { focus: e.length ? e : null });
|
|
9217
9285
|
}
|
|
9218
9286
|
re && A && (s.save(n, W.sessionId, { checkpoints: A.exportStack() }), s.save(n, W.sessionId, { usage: i }));
|
|
9219
|
-
let a =
|
|
9220
|
-
a && a !==
|
|
9287
|
+
let a = ms(b);
|
|
9288
|
+
a && a !== lt && (lt = a, s.updateTitle(n, W.sessionId, a)), e.autoTitle !== !1 && u && !ut && b.some((e) => e.role === "user") && b.some((e) => e.role === "assistant") && (ut = !0, (async () => {
|
|
9221
9289
|
let e = await u(b);
|
|
9222
|
-
e && (await s.updateTitle(n, W.sessionId, e), await
|
|
9290
|
+
e && (await s.updateTitle(n, W.sessionId, e), await rt());
|
|
9223
9291
|
})()), e.debug && console.log("[page-agent-sdk][persist] save", W.sessionId, `${b.length} msgs`);
|
|
9224
9292
|
}
|
|
9225
9293
|
return W.initDone = (async () => {
|
|
9226
|
-
if (await
|
|
9227
|
-
let t = await Promise.allSettled(e.mcp.map((e) =>
|
|
9294
|
+
if (await it(), await at(), e.mcp?.length) {
|
|
9295
|
+
let t = await Promise.allSettled(e.mcp.map((e) => os(e)));
|
|
9228
9296
|
W.mcpClosers = t.flatMap((e) => e.status === "fulfilled" ? [e.value.close] : []), W.mcpServers = [], t.forEach((t, n) => {
|
|
9229
9297
|
let r = e.mcp[n], i = r.name ?? r.url;
|
|
9230
9298
|
t.status === "fulfilled" ? (W.mcpServers.push({
|
|
@@ -9234,18 +9302,18 @@ function au(e, n) {
|
|
|
9234
9302
|
}), t.value.tools.forEach((e) => I.set(e.name, `mcp:${i}`)), ue.push(...t.value.tools)) : console.warn(`[page-agent-sdk][mcp] server ${i} 连接失败:`, t.reason);
|
|
9235
9303
|
}), B = be(), e.debug && console.log(`[page-agent-sdk][mcp] 注入 ${ue.length} 个工具,${W.mcpServers.length} 个 server`);
|
|
9236
9304
|
}
|
|
9237
|
-
let t =
|
|
9305
|
+
let t = hs(e.llm) ? e.llm : await f(e.llm);
|
|
9238
9306
|
W.agent = ji({
|
|
9239
9307
|
llm: t,
|
|
9240
9308
|
systemPrompt: P,
|
|
9241
9309
|
tools: B,
|
|
9242
|
-
middleware:
|
|
9310
|
+
middleware: et,
|
|
9243
9311
|
maxToolRounds: e.maxToolRounds,
|
|
9244
9312
|
maxRetries: e.maxRetries,
|
|
9245
9313
|
maxParallelTools: e.maxParallelTools,
|
|
9246
9314
|
contextWindow: m.contextWindow,
|
|
9247
9315
|
maxOutputTokens: m.maxOutputTokens,
|
|
9248
|
-
maxVerifyAttempts:
|
|
9316
|
+
maxVerifyAttempts: Me ? je : 0,
|
|
9249
9317
|
onLlmChange: (e) => {
|
|
9250
9318
|
y = e;
|
|
9251
9319
|
},
|
|
@@ -9259,17 +9327,17 @@ function au(e, n) {
|
|
|
9259
9327
|
} catch {}
|
|
9260
9328
|
} : void 0,
|
|
9261
9329
|
debug: e.debug
|
|
9262
|
-
}), ee.current = W.agent,
|
|
9330
|
+
}), ee.current = W.agent, Le && Le.setReconfigureHook && Le.setReconfigureHook(() => {
|
|
9263
9331
|
W.agent && W.agent.setTools(be());
|
|
9264
9332
|
});
|
|
9265
9333
|
})(), W;
|
|
9266
9334
|
}
|
|
9267
|
-
function
|
|
9268
|
-
let n = e.id ??
|
|
9335
|
+
function su(e, t) {
|
|
9336
|
+
let n = e.id ?? Es();
|
|
9269
9337
|
e.id || console.warn(`[page-agent-sdk] 未传 options.id,已生成随机 id "${n}"。刷新后持久化数据无法恢复,请传稳定 id。`);
|
|
9270
|
-
let r = e.streaming ?? !0, i = e.ui ?? "default", a, o = e.shareContext ?
|
|
9271
|
-
o ? a = o : (a =
|
|
9272
|
-
let s = null, c =
|
|
9338
|
+
let r = e.streaming ?? !0, i = e.ui ?? "default", a, o = e.shareContext ? nu.get(n) : void 0;
|
|
9339
|
+
o ? a = o : (a = ou(e, n), e.shareContext && nu.set(n, a)), a.refCount++;
|
|
9340
|
+
let s = null, c = Qs(e), l = null, u = null;
|
|
9273
9341
|
async function d(n) {
|
|
9274
9342
|
if (await a.initDone, s) {
|
|
9275
9343
|
s.show();
|
|
@@ -9311,7 +9379,7 @@ function ou(e, t) {
|
|
|
9311
9379
|
function m() {
|
|
9312
9380
|
s?.show();
|
|
9313
9381
|
}
|
|
9314
|
-
let h =
|
|
9382
|
+
let h = eu();
|
|
9315
9383
|
return {
|
|
9316
9384
|
mount: d,
|
|
9317
9385
|
unmount: f,
|
|
@@ -9424,7 +9492,7 @@ function ou(e, t) {
|
|
|
9424
9492
|
},
|
|
9425
9493
|
vfsWrite: (e, t) => {
|
|
9426
9494
|
let n = typeof t == "string" ? t : JSON.stringify(t);
|
|
9427
|
-
a.vfsStore.files[
|
|
9495
|
+
a.vfsStore.files[kc(e)] = {
|
|
9428
9496
|
content: n,
|
|
9429
9497
|
updatedAt: Date.now()
|
|
9430
9498
|
};
|
|
@@ -9458,17 +9526,21 @@ function ou(e, t) {
|
|
|
9458
9526
|
refreshMemory: () => a.refreshMemory(),
|
|
9459
9527
|
setSubagents: (e) => a.setSubagents(e),
|
|
9460
9528
|
addSubagent: (e) => a.addSubagent(e),
|
|
9461
|
-
removeSubagent: (e) => a.removeSubagent(e)
|
|
9529
|
+
removeSubagent: (e) => a.removeSubagent(e),
|
|
9530
|
+
getActiveSubagents: () => a.getActiveSubagents(),
|
|
9531
|
+
get subagentHistory() {
|
|
9532
|
+
return a.subagentHistory;
|
|
9533
|
+
}
|
|
9462
9534
|
};
|
|
9463
9535
|
}
|
|
9464
9536
|
//#endregion
|
|
9465
9537
|
//#region src/core/sdk/ragSubagent.ts
|
|
9466
|
-
var
|
|
9538
|
+
var cu = "你是知识检索专家。可用工具:search_docs(语义检索)/ load_doc(按 source 加载)/ vfs_grep+vfs_read(搜预注入文档)/ fetch_document(公网 URL)。\n\n工作方式:\n1. 分析任务,拆出需查证的要点(如:需要哪些组件、各自的 props 约束、UI 规范要求);\n2. 多源检索:先 vfs_grep 搜预注入文档(快、静态)→ 不够用 search_docs 语义检索 → 需特定文档用 load_doc → 公网用 fetch_document;\n3. 检索结果不足时换关键词、扩大 topK、或换源重试;\n4. 综合成结构化、可执行结论(不堆原文,提炼成可直接用于决策/配置的信息);\n5. 标注关键信息来源(文档名/段落),便于溯源;检索不到明确说「未检索到」,不编造。\n\n你是只读检索角色,不要尝试修改任何数据。", lu = "# 知识检索策略(RAG)\n\n## 多源决策树\n- vfs_grep / vfs_read:搜集成方预注入 vfs 的文档(组件文档 / UI 规范)—— 快、静态,先查\n- search_docs:语义检索(retriever 向量库)—— 模糊匹配,关键词不确定 / 语义相似时用\n- load_doc:按 source 精确加载(已知文档 id / URL / key)—— 精确取特定文档\n- fetch_document:公网 URL —— 查公开资料\n\n## 综合规范\n- 多源交叉验证(关键结论优先 ≥2 源印证,或单一权威源)\n- 标注来源(文档名 / URL / 段落),便于溯源\n- 结构化、可执行结论(组件清单 + 各自 props 约束 + 适用场景),不堆原文\n- 未检索到明确说「未检索到」,不编造;建议替代方案(改关键词 / 建议写代码组件等)\n\n## 何时用何源\n- 静态文档(组件库文档 / UI 规范):vfs_grep\n- 语义相似(「瀑布流组件」「倒计时」「拼团」):search_docs\n- 已知文档 id / URL:load_doc\n- 公开 URL(设计规范网站 / 第三方文档):fetch_document", uu = {
|
|
9467
9539
|
name: "rag-search",
|
|
9468
9540
|
description: "多源知识检索策略:vfs 预注入文档 → 语义检索 → 指定文档加载 → 公网;综合结构化结论 + 溯源",
|
|
9469
|
-
getContent: () =>
|
|
9541
|
+
getContent: () => lu
|
|
9470
9542
|
};
|
|
9471
|
-
function
|
|
9543
|
+
function du(e, n, i) {
|
|
9472
9544
|
return r(async ({ query: e, topK: t }) => {
|
|
9473
9545
|
try {
|
|
9474
9546
|
let r = await n(e, { topK: t ?? i });
|
|
@@ -9485,7 +9557,7 @@ function uu(e, n, i) {
|
|
|
9485
9557
|
})
|
|
9486
9558
|
});
|
|
9487
9559
|
}
|
|
9488
|
-
function
|
|
9560
|
+
function fu(e, n) {
|
|
9489
9561
|
return r(async ({ source: e }) => {
|
|
9490
9562
|
try {
|
|
9491
9563
|
let t = await n(e), r = Array.isArray(t) ? t : [t];
|
|
@@ -9499,11 +9571,11 @@ function du(e, n) {
|
|
|
9499
9571
|
schema: t.object({ source: t.string().describe("文档标识(id/URL/key)") })
|
|
9500
9572
|
});
|
|
9501
9573
|
}
|
|
9502
|
-
function
|
|
9574
|
+
function pu(e) {
|
|
9503
9575
|
let { retriever: t, loader: n, useVfs: r = !0, id: i = "rag", description: a, topK: o = 5, searchToolName: s = "search_docs", loadToolName: c = "load_doc", maxToolRounds: l = 8, summarization: u, skills: d, extraTools: f } = e;
|
|
9504
9576
|
if (!t && !n && r === !1) throw Error("[page-agent-sdk][createRagSubagent] 至少配一种知识源:retriever / loader / useVfs(true)");
|
|
9505
9577
|
let p = [];
|
|
9506
|
-
t && p.push(
|
|
9578
|
+
t && p.push(du(s, t, o)), n && p.push(fu(c, n)), f && p.push(...f);
|
|
9507
9579
|
let m = r ? [
|
|
9508
9580
|
"vfs_grep",
|
|
9509
9581
|
"vfs_read",
|
|
@@ -9512,17 +9584,17 @@ function fu(e) {
|
|
|
9512
9584
|
return {
|
|
9513
9585
|
id: i,
|
|
9514
9586
|
description: a ?? "检索知识库(组件文档/UI 规范/业务规则),返回有依据的结构化结论。需要查阅文档才能回答或决定如何配置时委派",
|
|
9515
|
-
systemPrompt:
|
|
9587
|
+
systemPrompt: cu,
|
|
9516
9588
|
tools: p.length ? p : void 0,
|
|
9517
9589
|
allowedTools: m,
|
|
9518
|
-
skills: d ?? [
|
|
9590
|
+
skills: d ?? [uu],
|
|
9519
9591
|
maxToolRounds: l,
|
|
9520
9592
|
...u === void 0 ? {} : { summarization: u }
|
|
9521
9593
|
};
|
|
9522
9594
|
}
|
|
9523
9595
|
//#endregion
|
|
9524
9596
|
//#region src/core/sdk/htmlSubagent.ts
|
|
9525
|
-
function
|
|
9597
|
+
function mu(e) {
|
|
9526
9598
|
return `你是纯代码组件生成专家。可用工具:vfs_write / vfs_edit / vfs_rm(写/改/删代码到 vfs ${e}) / vfs_grep + vfs_read(读 vfs) / write + set(写 data 引用,writablePaths 限定) / read / write_todos + update_todo(规划)。
|
|
9527
9599
|
|
|
9528
9600
|
代码存储约定(重要):
|
|
@@ -9536,12 +9608,12 @@ function pu(e) {
|
|
|
9536
9608
|
3. 小段代码 vfs_write 整体写;大段用 vfs_edit 增量拼(避免单次输出超限);
|
|
9537
9609
|
4. 生成后 read(vfs 文件 + data 引用)确认结构正确;只写 writablePaths 内 data + ${e} 下 vfs。`;
|
|
9538
9610
|
}
|
|
9539
|
-
var
|
|
9611
|
+
var hu = "# 纯代码组件生成规范\n\n## 代码存储约定(重要)\n- 代码正文写 vfs:html/<name>.vue(如 html/hero.vue)\n- data 存引用:{ type:'custom', codeRef:'vfs://html/<name>.vue', name, props }\n- 改代码:vfs_edit 改 vfs 文件(data 的 codeRef 引用不变)\n\n## 何时写代码组件\n- 组件库无对应类型(高度定制交互 / 一次性特效 / 特殊布局)→ 写 custom 代码组件\n- 组件库已有(按钮 / 卡片 / 列表)→ 用现有组件配置,不重造\n\n## Vue SFC 规范\n- Vue 3 <template> + <script setup>(组合式)\n- props 用 defineProps;事件用 defineEmits\n- 只渲染 UI,不做副作用(不发请求 / 不读写 storage)\n\n## props 定义\n- 代码组件 defineProps 接受外部 data 传入(集成方渲染时按 data 的 props 字段传)\n\n## 组件库引用\n- 代码内可 import 组件库组件(如 <Button>);所用依赖以集成方渲染层已注入为准,不重复造\n\n## 安全底线(必须)\n- 禁 eval / new Function / Function 构造器\n- 禁访问 window 敏感属性(document.cookie / apiKey / token)\n- 不引入外部脚本 / CDN\n\n## 可访问性 + 语义化\n- 语义化标签(button / nav / section);图片 alt;交互可键盘聚焦\n- 颜色对比达标;不只用颜色传达信息", gu = {
|
|
9540
9612
|
name: "html-builder",
|
|
9541
9613
|
description: "纯代码组件(custom Vue SFC)生成规范:代码存 vfs+data 引用 / SFC 规范 / 安全底线 / props / 组件库引用 / 可访问性",
|
|
9542
|
-
getContent: () =>
|
|
9614
|
+
getContent: () => hu
|
|
9543
9615
|
};
|
|
9544
|
-
function
|
|
9616
|
+
function _u(e) {
|
|
9545
9617
|
let { writablePaths: t, codeVfsPrefix: n = "html/", id: r = "html", description: i, planning: a = !0, summarization: o = !0, maxToolRounds: s = 12, temperature: c = .4, skills: l, extraTools: u } = e;
|
|
9546
9618
|
if (!t?.length) throw Error("[page-agent-sdk][createHtmlSubagent] writablePaths 必填(代码组件 data 区,如 [\"components\"])");
|
|
9547
9619
|
let d = [];
|
|
@@ -9550,7 +9622,7 @@ function gu(e) {
|
|
|
9550
9622
|
return {
|
|
9551
9623
|
id: r,
|
|
9552
9624
|
description: i ?? "生成/修改纯代码组件(custom Vue SFC)。代码写 vfs,data 存引用;能规划(write_todos)+ 执行。需写代码组件或灵活定制时委派",
|
|
9553
|
-
systemPrompt:
|
|
9625
|
+
systemPrompt: mu(n),
|
|
9554
9626
|
writablePaths: t,
|
|
9555
9627
|
allowedTools: [
|
|
9556
9628
|
"vfs_write",
|
|
@@ -9562,14 +9634,14 @@ function gu(e) {
|
|
|
9562
9634
|
middleware: d.length ? d : void 0,
|
|
9563
9635
|
summarization: o === !1 ? void 0 : o,
|
|
9564
9636
|
temperature: c,
|
|
9565
|
-
skills: l ?? [
|
|
9637
|
+
skills: l ?? [gu],
|
|
9566
9638
|
maxToolRounds: s,
|
|
9567
9639
|
tools: f.length ? f : void 0
|
|
9568
9640
|
};
|
|
9569
9641
|
}
|
|
9570
9642
|
//#endregion
|
|
9571
9643
|
//#region src/core/utils/clipboard.ts
|
|
9572
|
-
async function
|
|
9644
|
+
async function vu(e) {
|
|
9573
9645
|
try {
|
|
9574
9646
|
let t = globalThis.navigator?.clipboard;
|
|
9575
9647
|
if (t && typeof t.writeText == "function") return await t.writeText(e), !0;
|
|
@@ -9587,7 +9659,7 @@ async function _u(e) {
|
|
|
9587
9659
|
}
|
|
9588
9660
|
//#endregion
|
|
9589
9661
|
//#region src/core/composables/useChat.ts
|
|
9590
|
-
function
|
|
9662
|
+
function yu(e = {}) {
|
|
9591
9663
|
let { fetchResponse: t, fetchStream: n, onPersist: r, onClear: i } = e, a = /* @__PURE__ */ _t({
|
|
9592
9664
|
messages: e.messages ?? [],
|
|
9593
9665
|
loading: !1,
|
|
@@ -9766,9 +9838,9 @@ function vu(e = {}) {
|
|
|
9766
9838
|
}
|
|
9767
9839
|
//#endregion
|
|
9768
9840
|
//#region src/core/composables/chatContext.ts
|
|
9769
|
-
var
|
|
9770
|
-
function
|
|
9771
|
-
let t =
|
|
9841
|
+
var bu = Symbol("chatContext");
|
|
9842
|
+
function xu(e = {}) {
|
|
9843
|
+
let t = yu({
|
|
9772
9844
|
fetchResponse: e.fetchResponse,
|
|
9773
9845
|
fetchStream: e.fetchStream,
|
|
9774
9846
|
messages: e.messages,
|
|
@@ -9787,7 +9859,7 @@ function bu(e = {}) {
|
|
|
9787
9859
|
}, h = /* @__PURE__ */ Ot({}), g = (e) => h.value[e] !== !1, _ = (e) => {
|
|
9788
9860
|
h.value[e] = !g(e);
|
|
9789
9861
|
}, v = /* @__PURE__ */ Ot(!1), y = (e) => {
|
|
9790
|
-
|
|
9862
|
+
vu(e).then((e) => {
|
|
9791
9863
|
e && (v.value = !0, setTimeout(() => {
|
|
9792
9864
|
v.value = !1;
|
|
9793
9865
|
}, 1500));
|
|
@@ -9855,15 +9927,15 @@ function bu(e = {}) {
|
|
|
9855
9927
|
}
|
|
9856
9928
|
};
|
|
9857
9929
|
}
|
|
9858
|
-
function
|
|
9859
|
-
let e = Fn(
|
|
9930
|
+
function Su() {
|
|
9931
|
+
let e = Fn(bu);
|
|
9860
9932
|
if (!e) throw Error("useChatContext 必须在 provide(chatContextKey) 的组件子树内调用");
|
|
9861
9933
|
return e;
|
|
9862
9934
|
}
|
|
9863
9935
|
//#endregion
|
|
9864
9936
|
//#region src/core/index.headless.ts
|
|
9865
|
-
function
|
|
9866
|
-
return
|
|
9937
|
+
function Cu(e) {
|
|
9938
|
+
return su(e);
|
|
9867
9939
|
}
|
|
9868
9940
|
//#endregion
|
|
9869
|
-
export {
|
|
9941
|
+
export { $s as CAPABILITIES, nc as CONTEXT_PRESETS, ps as CompressDecisionSchema, ss as DEFAULT_SYSTEM_PROMPT, Ha as HUMAN_CONFIRM_TOOL_NAME, ti as MIN_CONTEXT_WINDOW, lo as STOP_WORDS, sc as UNSAFE_KEYS, Ll as actionsToInspectInfo, Il as actionsToTools, Jr as agentError, ts as analyzeContext, _c as applyPatchToClone, vc as applyPatchToLive, qr as asAgentError, cs as buildDataPrompt, ls as buildSystemPrompt, bu as chatContextKey, gl as commitSetToBind, os as connectMcp, f as constructLlmFromConfig, d as constructOpenLlmSync, vu as copyText, ji as createAgent, Va as createApprovalMiddleware, xu as createChatContext, Cu as createChatSdk, Qa as createCheckpointManager, $a as createCheckpointMiddleware, Ts as createConflictManager, ns as createContextInspectorMiddleware, vl as createDataOps, _u as createHtmlSubagent, Ga as createHumanConfirmMiddleware, Wa as createHumanConfirmTool, Ks as createMemoryBackend, Pa as createMemoryMiddleware, u as createProxyLlm, pu as createRagSubagent, ba as createSandboxRunner, tc as createSdkEvents, eu as createSerialRunner, Xs as createSessionStore, Xl as createSkillStore, Mo as createSubagentMiddleware, bo as createSubagentTracker, Fo as createSubagentsMiddleware, Wl as createUsageHintsMiddleware, Io as createVerifyMiddleware, Tc as createVfs, Js as createWebStorageBackend, Ho as createWriteBackCheck, fc as deepClone, Bl as defineDataToolset, Sa as defineSkill, us as defineTool, dc as deleteByPath, ms as deriveTitle, Ui as describeSchemaNode, xi as detectGarbledToolCall, xc as diffObjects, wl as domToStructure, El as domTools, zl as domToolsStatic, fo as estimateMessageTokens, po as estimateRoundTokens, X as estimateTokens, m as extractReasoningDelta, ca as extractSchemaHint, rs as extractText, p as extractTextDelta, h as extractUsage, bl as fetchDocTools, Rl as fetchTools, hl as filterByToolMode, Wi as formatConstraints, Ur as formatZodIssues, Z as getByPath, Tl as getDomTool, kl as getEnvSummary, Fi as getSchemaAtPath, Mi as getSchemaTopKeys, ai as getTraceMetrics, $ as hashValue, mo as indexSummarize, Ml as inspectEnvTool, Nl as inspectTools, hs as isChatModel, fi as isContextLengthError, Ni as isPathAllowed, Rs as isQuotaError, cc as isUnsafePath, Wc as jpEval, Gr as jsonParseError, hc as limitDepth, pc as maybeParseValue, ii as offloadPassThroughChars, ri as offloadThresholdChars, ra as presets, Li as projectBySchema, Ii as projectBySchemaDeep, mc as projectFields, ho as recallRounds, Gi as renderSchemaHint, Ki as renderSchemaOverview, Ji as renderSchemaShallow, ec as resolveCapabilities, ic as resolveContextOptions, Qs as resolveDialogConfig, ws as resolveLlm, ni as resolveModelCaps, Zs as resolveStorage, bc as restoreInPlace, yc as restoreLive, Kr as routeError, xa as runHostScript, Jc as runSandboxedScript, lc as safeMerge, Ol as safeSerialize, Q as safeStringify, Kc as searchJson, Vl as selectBuiltinTools, uc as setByPath, go as shouldTriggerCompression, ia as systemPromptHelpers, uo as tokenize, Y as toolError, Pi as unwrapSchema, yu as useChat, Su as useChatContext, e as z, Wr as zodError };
|