page-agent-sdk 3.24.0 → 3.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/README.zh-CN.md +2 -2
- package/dist/page-agent-sdk.headless.js +682 -650
- package/dist/page-agent-sdk.iife.js +125 -125
- package/dist/page-agent-sdk.js +1584 -1552
- package/dist/page-agent-sdk.umd.cjs +69 -69
- package/package.json +1 -1
|
@@ -4942,7 +4942,11 @@ function ws(e, t, n) {
|
|
|
4942
4942
|
} : Reflect.get(e, r, i);
|
|
4943
4943
|
} });
|
|
4944
4944
|
}
|
|
4945
|
-
|
|
4945
|
+
function Ts(e, t) {
|
|
4946
|
+
let n = t?.__pgKeepExternal;
|
|
4947
|
+
return n?.length ? `${e}\n\n⚠️ [keep_external] 委派期间组件「${n.join("、")}」的代码被外部(人工/宿主)修改,已保留外部版本,本次子 agent 的修改未提交。这不是子 agent 失败。请勿直接重写、也勿立即重新委派 —— 先向用户如实说明「检测到你在生成期间手动修改了该组件,已保留你的版本」,由用户决定是否仍按原任务继续。` : e;
|
|
4948
|
+
}
|
|
4949
|
+
async function Es(e, t, n, r, i, a) {
|
|
4946
4950
|
let o = t.depth ?? 0, s = t.maxDepth ?? ps, c = /* @__PURE__ */ new Set([...fs, ...t.allowedTools ?? []]), l = () => typeof t.allTools == "function" ? t.allTools() : t.allTools, u = ys(l(), c, t.extraTools ?? []);
|
|
4947
4951
|
if (t.writablePaths?.length) {
|
|
4948
4952
|
u = u.filter((e) => !bs(e));
|
|
@@ -4951,7 +4955,7 @@ async function Ts(e, t, n, r, i, a) {
|
|
|
4951
4955
|
}
|
|
4952
4956
|
let d = `sub-${o}-${Math.random().toString(36).slice(2, 10)}`;
|
|
4953
4957
|
t.enterDataScope && (u = u.map((e) => e.__dataOpsScoped ? ws(e, d, t.enterDataScope) : e));
|
|
4954
|
-
let f = o + 1 < s ? [
|
|
4958
|
+
let f = o + 1 < s ? [Ds({
|
|
4955
4959
|
...t,
|
|
4956
4960
|
depth: o + 1
|
|
4957
4961
|
})] : [], p = t.getFocuses?.() ?? [], h = p.length ? Qa({
|
|
@@ -5031,7 +5035,7 @@ async function Ts(e, t, n, r, i, a) {
|
|
|
5031
5035
|
r && (e.type === "tool_call" || e.type === "tool_result" || e.type === "reasoning") && r(e);
|
|
5032
5036
|
}, C.signal);
|
|
5033
5037
|
if (!t.timeoutMs || t.timeoutMs <= 0) try {
|
|
5034
|
-
return await E;
|
|
5038
|
+
return Ts(await E, S.getState());
|
|
5035
5039
|
} finally {
|
|
5036
5040
|
T();
|
|
5037
5041
|
}
|
|
@@ -5042,12 +5046,12 @@ async function Ts(e, t, n, r, i, a) {
|
|
|
5042
5046
|
});
|
|
5043
5047
|
E.catch(() => {});
|
|
5044
5048
|
try {
|
|
5045
|
-
return await Promise.race([E, O]);
|
|
5049
|
+
return Ts(await Promise.race([E, O]), S.getState());
|
|
5046
5050
|
} finally {
|
|
5047
5051
|
clearTimeout(D), T();
|
|
5048
5052
|
}
|
|
5049
5053
|
}
|
|
5050
|
-
function
|
|
5054
|
+
function Ds(e) {
|
|
5051
5055
|
let n = e.maxParallel ?? ms, i, a, o, s = (e) => e?.configurable?.__pgSubagentCall ?? {
|
|
5052
5056
|
signal: i,
|
|
5053
5057
|
emit: a,
|
|
@@ -5094,7 +5098,7 @@ function Es(e) {
|
|
|
5094
5098
|
}), h = Date.now();
|
|
5095
5099
|
e.tracker?.start(f, t, p, h);
|
|
5096
5100
|
try {
|
|
5097
|
-
let r = await
|
|
5101
|
+
let r = await Es({
|
|
5098
5102
|
prompt: t,
|
|
5099
5103
|
role: n,
|
|
5100
5104
|
model: a
|
|
@@ -5122,7 +5126,7 @@ function Es(e) {
|
|
|
5122
5126
|
}), s = Date.now();
|
|
5123
5127
|
e.tracker?.start(r, t.prompt, a, s);
|
|
5124
5128
|
try {
|
|
5125
|
-
let n = await
|
|
5129
|
+
let n = await Es(t, e, i.signal, c(r, a, i.toolCallId, i.emit), o, i.emit);
|
|
5126
5130
|
return e.tracker?.finish(r, "done", n ?? "(未完成)"), {
|
|
5127
5131
|
ok: !0,
|
|
5128
5132
|
text: n ?? "(未完成)"
|
|
@@ -5154,8 +5158,8 @@ function Es(e) {
|
|
|
5154
5158
|
}, t(e))
|
|
5155
5159
|
};
|
|
5156
5160
|
}
|
|
5157
|
-
var
|
|
5158
|
-
function
|
|
5161
|
+
var Os = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
5162
|
+
function ks(e, t) {
|
|
5159
5163
|
let n = e.tools ?? [];
|
|
5160
5164
|
return {
|
|
5161
5165
|
llm: e.llm ?? t.llm,
|
|
@@ -5183,7 +5187,7 @@ function Os(e, t) {
|
|
|
5183
5187
|
...t.timeoutMs === void 0 ? {} : { timeoutMs: t.timeoutMs }
|
|
5184
5188
|
};
|
|
5185
5189
|
}
|
|
5186
|
-
function
|
|
5190
|
+
function As(e, n) {
|
|
5187
5191
|
let i, a, o, s = (e) => e?.configurable?.__pgSubagentCall ?? {
|
|
5188
5192
|
signal: i,
|
|
5189
5193
|
emit: a,
|
|
@@ -5216,7 +5220,7 @@ function ks(e, n) {
|
|
|
5216
5220
|
function f(e) {
|
|
5217
5221
|
let i = /* @__PURE__ */ new Set(), a = [], o = [];
|
|
5218
5222
|
for (let l of e) {
|
|
5219
|
-
if (!
|
|
5223
|
+
if (!Os.test(l.id)) {
|
|
5220
5224
|
console.warn(`[subagents] id "${l.id}" 非合法工具名(须 [a-zA-Z_][a-zA-Z0-9_]*),已跳过`);
|
|
5221
5225
|
continue;
|
|
5222
5226
|
}
|
|
@@ -5226,7 +5230,7 @@ function ks(e, n) {
|
|
|
5226
5230
|
continue;
|
|
5227
5231
|
}
|
|
5228
5232
|
i.add(e), a.push(l), o.push(r(async ({ task: e, components: t }, r) => {
|
|
5229
|
-
let i = s(r), a =
|
|
5233
|
+
let i = s(r), a = ks(l, n), o = (e) => i.logSink?.({
|
|
5230
5234
|
...e,
|
|
5231
5235
|
source: `子:${l.id}`
|
|
5232
5236
|
}), u = n.tracker, d = u ? `use_${l.id}-${Math.random().toString(36).slice(2, 6)}` : `use_${l.id}`, f = n.componentLock, p = d, m, h = [], g = (e, t) => i.logSink?.({
|
|
@@ -5257,7 +5261,7 @@ function ks(e, n) {
|
|
|
5257
5261
|
} : _, y = Date.now();
|
|
5258
5262
|
u?.start(d, e, l.id, y);
|
|
5259
5263
|
try {
|
|
5260
|
-
let t = await
|
|
5264
|
+
let t = await Es({ prompt: e }, a, i.signal, v, o, i.emit);
|
|
5261
5265
|
return u?.finish(d, "done", t), t;
|
|
5262
5266
|
} catch (e) {
|
|
5263
5267
|
throw u?.finish(d, "error", String(e?.message ?? e)), e;
|
|
@@ -5331,7 +5335,7 @@ function ks(e, n) {
|
|
|
5331
5335
|
}
|
|
5332
5336
|
//#endregion
|
|
5333
5337
|
//#region src/core/harness/verify.ts
|
|
5334
|
-
function
|
|
5338
|
+
function js(e) {
|
|
5335
5339
|
return {
|
|
5336
5340
|
name: "verify",
|
|
5337
5341
|
async beforeReturn({ messages: t, state: n, log: r }) {
|
|
@@ -5343,10 +5347,10 @@ function As(e) {
|
|
|
5343
5347
|
if (e.adversarial) {
|
|
5344
5348
|
r?.("middleware", {
|
|
5345
5349
|
stage: "adversarial_start",
|
|
5346
|
-
model:
|
|
5350
|
+
model: zs(e.adversarial.llm),
|
|
5347
5351
|
tools: (e.adversarial.tools ?? []).length
|
|
5348
5352
|
});
|
|
5349
|
-
let n = await
|
|
5353
|
+
let n = await Us(t, e.adversarial.llm, r, e.adversarial.tools);
|
|
5350
5354
|
if (r?.("middleware", {
|
|
5351
5355
|
stage: "adversarial_done",
|
|
5352
5356
|
clean: n === null,
|
|
@@ -5357,18 +5361,18 @@ function As(e) {
|
|
|
5357
5361
|
}
|
|
5358
5362
|
};
|
|
5359
5363
|
}
|
|
5360
|
-
var
|
|
5364
|
+
var Ms = /* @__PURE__ */ new Set([
|
|
5361
5365
|
"set_data",
|
|
5362
5366
|
"edit_data",
|
|
5363
5367
|
"delete_data",
|
|
5364
5368
|
"write"
|
|
5365
|
-
]),
|
|
5366
|
-
function
|
|
5369
|
+
]), Ns = /校验失败|SCHEMA_INVALID|未注册|不存在|仅支持|必须是|NOT_OBJECT|PATH_UNSAFE|VERSION_CONFLICT|WRITE_INTERCEPT/;
|
|
5370
|
+
function Ps(e) {
|
|
5367
5371
|
let t = /* @__PURE__ */ new Map();
|
|
5368
5372
|
for (let n of e) {
|
|
5369
5373
|
let e = n?.tool_calls;
|
|
5370
5374
|
if (Array.isArray(e)) for (let n of e) {
|
|
5371
|
-
if (!
|
|
5375
|
+
if (!Ms.has(n.name)) continue;
|
|
5372
5376
|
let e = n.id, r = n?.args ?? {};
|
|
5373
5377
|
if (n.name === "write") if (r.del && r.patch?.jsonPath) t.set(r.patch.jsonPath, {
|
|
5374
5378
|
path: r.patch.jsonPath,
|
|
@@ -5407,7 +5411,7 @@ function Ns(e) {
|
|
|
5407
5411
|
}
|
|
5408
5412
|
return [...t.values()];
|
|
5409
5413
|
}
|
|
5410
|
-
function
|
|
5414
|
+
function Fs(e) {
|
|
5411
5415
|
let t = /* @__PURE__ */ new Map();
|
|
5412
5416
|
for (let n of e) {
|
|
5413
5417
|
let e = n?.tool_call_id, r = n?.content;
|
|
@@ -5415,7 +5419,7 @@ function Ps(e) {
|
|
|
5415
5419
|
}
|
|
5416
5420
|
return t;
|
|
5417
5421
|
}
|
|
5418
|
-
function
|
|
5422
|
+
function Is(e, t) {
|
|
5419
5423
|
if (t === "") return e;
|
|
5420
5424
|
if (e == null) return;
|
|
5421
5425
|
let n = e;
|
|
@@ -5425,16 +5429,16 @@ function Fs(e, t) {
|
|
|
5425
5429
|
}
|
|
5426
5430
|
return n;
|
|
5427
5431
|
}
|
|
5428
|
-
function
|
|
5432
|
+
function Ls(e = {}) {
|
|
5429
5433
|
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 ?? {};
|
|
5430
5434
|
return async ({ messages: e }) => {
|
|
5431
|
-
let r =
|
|
5435
|
+
let r = Ps(e);
|
|
5432
5436
|
if (!r.length) return { ok: !0 };
|
|
5433
|
-
let i =
|
|
5437
|
+
let i = Fs(e), a = n()[""], o = t(), s = [];
|
|
5434
5438
|
for (let { path: e, op: t, callId: n } of r) {
|
|
5435
5439
|
let r = n ? i.get(n) : void 0;
|
|
5436
|
-
if (r &&
|
|
5437
|
-
let c =
|
|
5440
|
+
if (r && Ns.test(r)) continue;
|
|
5441
|
+
let c = Is(o, e);
|
|
5438
5442
|
if (t === "delete_data") c !== void 0 && s.push(`${e} 删除后读回仍有值,疑似未生效`);
|
|
5439
5443
|
else if (c == null) s.push(`写入 ${e} 后读回为空,疑似未生效`);
|
|
5440
5444
|
else if (a) {
|
|
@@ -5448,17 +5452,17 @@ function Is(e = {}) {
|
|
|
5448
5452
|
} : { ok: !0 };
|
|
5449
5453
|
};
|
|
5450
5454
|
}
|
|
5451
|
-
function Ls(e) {
|
|
5452
|
-
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
5453
|
-
}
|
|
5454
5455
|
function Rs(e) {
|
|
5455
|
-
return
|
|
5456
|
+
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
5456
5457
|
}
|
|
5457
|
-
|
|
5458
|
-
|
|
5459
|
-
return zs.test(e);
|
|
5458
|
+
function zs(e) {
|
|
5459
|
+
return Rs(e) ? e.model ?? e.modelName ?? "<实例>" : e.model ?? "<配置>";
|
|
5460
5460
|
}
|
|
5461
|
+
var Bs = /无问题|没有问题|未发现问题|没有发现|没问题|未发现/;
|
|
5461
5462
|
function Vs(e) {
|
|
5463
|
+
return Bs.test(e);
|
|
5464
|
+
}
|
|
5465
|
+
function Hs(e) {
|
|
5462
5466
|
let t = "", n = "";
|
|
5463
5467
|
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 : "");
|
|
5464
5468
|
return {
|
|
@@ -5466,8 +5470,8 @@ function Vs(e) {
|
|
|
5466
5470
|
lastReply: n
|
|
5467
5471
|
};
|
|
5468
5472
|
}
|
|
5469
|
-
async function
|
|
5470
|
-
let { lastUser: i, lastReply: a } =
|
|
5473
|
+
async function Us(e, t, n, r) {
|
|
5474
|
+
let { lastUser: i, lastReply: a } = Hs(e);
|
|
5471
5475
|
if (!a) return null;
|
|
5472
5476
|
let o = Array.isArray(r) && r.length > 0, s = [
|
|
5473
5477
|
"你是严格的对抗式审查者,目标是找出以下 AI 助手回复的错误并证明它有问题(事实错误 / 遗漏 / 逻辑矛盾 / 与需求不符)。",
|
|
@@ -5478,7 +5482,7 @@ async function Hs(e, t, n, r) {
|
|
|
5478
5482
|
].join("\n"), c = "你是严格的对抗式审查者,只找问题不赞美。目标是反驳,不是改进。", l = n ? (e) => n(e.type, {
|
|
5479
5483
|
...e.data,
|
|
5480
5484
|
source: "adversarial"
|
|
5481
|
-
}) : void 0, u = await Wi(
|
|
5485
|
+
}) : void 0, u = await Wi(Rs(t) ? {
|
|
5482
5486
|
llm: t,
|
|
5483
5487
|
tools: r,
|
|
5484
5488
|
maxToolRounds: o ? 4 : 1,
|
|
@@ -5503,11 +5507,11 @@ async function Hs(e, t, n, r) {
|
|
|
5503
5507
|
stage: "adversarial_verdict",
|
|
5504
5508
|
verdict: u,
|
|
5505
5509
|
source: "adversarial"
|
|
5506
|
-
}),
|
|
5510
|
+
}), Vs(u) ? null : u.trim();
|
|
5507
5511
|
}
|
|
5508
5512
|
//#endregion
|
|
5509
5513
|
//#region src/core/utils/contextAnalysis.ts
|
|
5510
|
-
var
|
|
5514
|
+
var Ws = [
|
|
5511
5515
|
{
|
|
5512
5516
|
prefix: "## 可操作数据",
|
|
5513
5517
|
key: "dataHint"
|
|
@@ -5536,7 +5540,7 @@ var Us = [
|
|
|
5536
5540
|
prefix: "【与当前问题可能相关的早期对话】",
|
|
5537
5541
|
key: "recall"
|
|
5538
5542
|
}
|
|
5539
|
-
],
|
|
5543
|
+
], Gs = [
|
|
5540
5544
|
{
|
|
5541
5545
|
key: "systemPrompt",
|
|
5542
5546
|
label: "系统提示词(身份/规则)"
|
|
@@ -5590,9 +5594,9 @@ var Us = [
|
|
|
5590
5594
|
label: "其他"
|
|
5591
5595
|
}
|
|
5592
5596
|
];
|
|
5593
|
-
function
|
|
5597
|
+
function Ks() {
|
|
5594
5598
|
let e = {};
|
|
5595
|
-
for (let t of
|
|
5599
|
+
for (let t of Gs) e[t.key] = {
|
|
5596
5600
|
key: t.key,
|
|
5597
5601
|
label: t.label,
|
|
5598
5602
|
tokens: 0,
|
|
@@ -5601,16 +5605,16 @@ function Gs() {
|
|
|
5601
5605
|
};
|
|
5602
5606
|
return e;
|
|
5603
5607
|
}
|
|
5604
|
-
function
|
|
5608
|
+
function qs(e, t) {
|
|
5605
5609
|
e.tokens += t, e.msgCount += 1;
|
|
5606
5610
|
}
|
|
5607
|
-
function
|
|
5611
|
+
function Js(e) {
|
|
5608
5612
|
let t = e.content;
|
|
5609
5613
|
return typeof t == "string" ? t : JSON.stringify(t ?? "");
|
|
5610
5614
|
}
|
|
5611
|
-
function
|
|
5615
|
+
function Ys(e, t) {
|
|
5612
5616
|
let n = [];
|
|
5613
|
-
for (let t of
|
|
5617
|
+
for (let t of Ws) {
|
|
5614
5618
|
let r = 0;
|
|
5615
5619
|
for (;;) {
|
|
5616
5620
|
let i = e.indexOf(t.prefix, r);
|
|
@@ -5623,35 +5627,35 @@ function Js(e, t) {
|
|
|
5623
5627
|
}
|
|
5624
5628
|
if (n.sort((e, t) => e.idx - t.idx), !n.length) {
|
|
5625
5629
|
let n = e.trim();
|
|
5626
|
-
n &&
|
|
5630
|
+
n && qs(t.systemPrompt, X(n));
|
|
5627
5631
|
return;
|
|
5628
5632
|
}
|
|
5629
5633
|
if (n[0].idx > 0) {
|
|
5630
5634
|
let r = e.slice(0, n[0].idx).trim();
|
|
5631
|
-
r &&
|
|
5635
|
+
r && qs(t.systemPrompt, X(r));
|
|
5632
5636
|
}
|
|
5633
5637
|
for (let r = 0; r < n.length; r++) {
|
|
5634
5638
|
let i = n[r].idx, a = r + 1 < n.length ? n[r + 1].idx : e.length, o = e.slice(i, a).trim();
|
|
5635
|
-
o &&
|
|
5639
|
+
o && qs(t[n[r].key], X(o));
|
|
5636
5640
|
}
|
|
5637
5641
|
}
|
|
5638
|
-
function
|
|
5639
|
-
let n =
|
|
5642
|
+
function Xs(e, t = {}) {
|
|
5643
|
+
let n = Ks(), r = -1;
|
|
5640
5644
|
for (let t = e.length - 1; t >= 0; t--) if (e[t] instanceof a) {
|
|
5641
5645
|
r = t;
|
|
5642
5646
|
break;
|
|
5643
5647
|
}
|
|
5644
5648
|
for (let t = 0; t < e.length; t++) {
|
|
5645
5649
|
let c = e[t];
|
|
5646
|
-
if (c instanceof o) Js(
|
|
5647
|
-
else if (c instanceof a)
|
|
5650
|
+
if (c instanceof o) Ys(Js(c), n);
|
|
5651
|
+
else if (c instanceof a) qs(n[t === r ? "current" : "history"], X(Js(c)));
|
|
5648
5652
|
else if (c instanceof i) {
|
|
5649
5653
|
let e = c.tool_calls ?? [];
|
|
5650
5654
|
if (e.length) {
|
|
5651
5655
|
let t = e.map((e) => JSON.stringify(e.args ?? {})).join(" ");
|
|
5652
|
-
|
|
5653
|
-
} else
|
|
5654
|
-
} else c instanceof s ?
|
|
5656
|
+
qs(n.toolResults, X(t));
|
|
5657
|
+
} else qs(n.assistant, X(Js(c)));
|
|
5658
|
+
} else c instanceof s ? qs(n.toolResults, X(Js(c))) : qs(n.other, X(Js(c)));
|
|
5655
5659
|
}
|
|
5656
5660
|
let c = Object.values(n).filter((e) => e.tokens > 0);
|
|
5657
5661
|
c.sort((e, t) => t.tokens - e.tokens);
|
|
@@ -5668,12 +5672,12 @@ function Ys(e, t = {}) {
|
|
|
5668
5672
|
}
|
|
5669
5673
|
//#endregion
|
|
5670
5674
|
//#region src/core/harness/contextInspector.ts
|
|
5671
|
-
function
|
|
5675
|
+
function Zs(e = {}) {
|
|
5672
5676
|
let t, n = e.contextWindow;
|
|
5673
5677
|
return {
|
|
5674
5678
|
name: "context-inspector",
|
|
5675
5679
|
async wrapModelCall(r, i) {
|
|
5676
|
-
return t =
|
|
5680
|
+
return t = Xs(r.messages, {
|
|
5677
5681
|
contextWindow: n,
|
|
5678
5682
|
thresholdRatio: e.thresholdRatio
|
|
5679
5683
|
}), i(r);
|
|
@@ -5684,13 +5688,13 @@ function Xs(e = {}) {
|
|
|
5684
5688
|
}
|
|
5685
5689
|
};
|
|
5686
5690
|
}
|
|
5687
|
-
function
|
|
5691
|
+
function Qs(e) {
|
|
5688
5692
|
let t = e?.content;
|
|
5689
5693
|
if (!Array.isArray(t) || !t.length) return "";
|
|
5690
5694
|
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");
|
|
5691
5695
|
return e?.isError ? `工具错误:${n}` : n;
|
|
5692
5696
|
}
|
|
5693
|
-
async function
|
|
5697
|
+
async function $s(e) {
|
|
5694
5698
|
let t = new URL(e.url), n = e.requestInit;
|
|
5695
5699
|
if (e.transport === "http") {
|
|
5696
5700
|
let { StreamableHTTPClientTransport: e } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
|
|
@@ -5703,7 +5707,7 @@ async function Qs(e) {
|
|
|
5703
5707
|
let { WebSocketClientTransport: r } = await import("@modelcontextprotocol/sdk/client/websocket.js");
|
|
5704
5708
|
return new r(t);
|
|
5705
5709
|
}
|
|
5706
|
-
async function
|
|
5710
|
+
async function ec(e, t, n) {
|
|
5707
5711
|
let r;
|
|
5708
5712
|
try {
|
|
5709
5713
|
return await Promise.race([e, new Promise((e, i) => {
|
|
@@ -5713,8 +5717,8 @@ async function $s(e, t, n) {
|
|
|
5713
5717
|
clearTimeout(r);
|
|
5714
5718
|
}
|
|
5715
5719
|
}
|
|
5716
|
-
function
|
|
5717
|
-
return r(async (r) =>
|
|
5720
|
+
function tc(e, t, n) {
|
|
5721
|
+
return r(async (r) => Qs(await ec(t.callTool({
|
|
5718
5722
|
name: e.name,
|
|
5719
5723
|
arguments: r
|
|
5720
5724
|
}), e.name, n)), {
|
|
@@ -5723,8 +5727,8 @@ function ec(e, t, n) {
|
|
|
5723
5727
|
schema: e.inputSchema
|
|
5724
5728
|
});
|
|
5725
5729
|
}
|
|
5726
|
-
async function
|
|
5727
|
-
let { Client: t } = await import("@modelcontextprotocol/sdk/client"), n = await
|
|
5730
|
+
async function nc(e) {
|
|
5731
|
+
let { Client: t } = await import("@modelcontextprotocol/sdk/client"), n = await $s(e), r = new t({
|
|
5728
5732
|
name: "page-agent-sdk",
|
|
5729
5733
|
version: "1.0"
|
|
5730
5734
|
}, { capabilities: {} }), i = e.timeoutMs ?? 15e3, a;
|
|
@@ -5742,19 +5746,19 @@ async function tc(e) {
|
|
|
5742
5746
|
}
|
|
5743
5747
|
let { tools: o } = await r.listTools();
|
|
5744
5748
|
return {
|
|
5745
|
-
tools: o.map((t) =>
|
|
5749
|
+
tools: o.map((t) => tc(t, r, e.callTimeoutMs ?? 6e4)),
|
|
5746
5750
|
close: () => r.close()
|
|
5747
5751
|
};
|
|
5748
5752
|
}
|
|
5749
5753
|
//#endregion
|
|
5750
5754
|
//#region src/core/sdk/promptBuilder.ts
|
|
5751
|
-
var
|
|
5755
|
+
var rc = [
|
|
5752
5756
|
"你是一个 JSON 操作助手。集成方声明了一个主数据对象(含 zod schema 校验),你通过专用工具安全地读写它来完成任务。",
|
|
5753
5757
|
"所有写操作都经范围控制(仅 schema 声明字段内)与 schema 校验(不合法会返回结构化错误而非写入),并自动留快照可回退。",
|
|
5754
5758
|
"大对象/数组优先用增量 patch(只发改动)而非整体重传,避免输出被截断。",
|
|
5755
5759
|
"---",
|
|
5756
5760
|
ga.reliableWriteRules
|
|
5757
|
-
].join("\n\n"),
|
|
5761
|
+
].join("\n\n"), ic = [
|
|
5758
5762
|
"You are a JSON operations assistant. The integrator declared a main data object (with zod schema validation); you complete tasks by reading and writing it safely through dedicated tools.",
|
|
5759
5763
|
"All writes go through scope control (only schema-declared fields) and schema validation (invalid writes return a structured error instead of being applied), with automatic snapshots for rollback.",
|
|
5760
5764
|
"For large objects/arrays prefer incremental patches (send only the change) over resending the whole value, to avoid output truncation.",
|
|
@@ -5762,57 +5766,57 @@ var nc = [
|
|
|
5762
5766
|
"---",
|
|
5763
5767
|
ga.reliableWriteRulesEn
|
|
5764
5768
|
].join("\n\n");
|
|
5765
|
-
function
|
|
5769
|
+
function ac(e, t) {
|
|
5766
5770
|
if (!e) return "";
|
|
5767
5771
|
let n = ba(e.schema, t);
|
|
5768
5772
|
return `\n\n## 可操作数据(字段以 read 工具返回的实际值为准)\n${e.description ? e.description + "\n" : ""}${n}`;
|
|
5769
5773
|
}
|
|
5770
|
-
function
|
|
5774
|
+
function oc(e) {
|
|
5771
5775
|
let t = e.locale === "en-US", n = t ? ga.reliableWriteRulesEn : ga.reliableWriteRules, r = e.appendReliableWriteRules !== !1;
|
|
5772
|
-
return e.systemPrompt ? r ? e.systemPrompt + "\n\n---\n\n" + n : e.systemPrompt : t ?
|
|
5776
|
+
return e.systemPrompt ? r ? e.systemPrompt + "\n\n---\n\n" + n : e.systemPrompt : t ? ic : rc;
|
|
5773
5777
|
}
|
|
5774
|
-
var
|
|
5778
|
+
var sc = {
|
|
5775
5779
|
largeResults: 4 * 1024 * 1024,
|
|
5776
5780
|
drafts: 2 * 1024 * 1024,
|
|
5777
5781
|
userFiles: 2 * 1024 * 1024,
|
|
5778
5782
|
resources: 4 * 1024 * 1024
|
|
5779
|
-
},
|
|
5783
|
+
}, cc = [
|
|
5780
5784
|
"largeResults",
|
|
5781
5785
|
"drafts",
|
|
5782
5786
|
"userFiles",
|
|
5783
5787
|
"resources"
|
|
5784
|
-
],
|
|
5785
|
-
function
|
|
5788
|
+
], lc = .9;
|
|
5789
|
+
function uc(e, t = {}) {
|
|
5786
5790
|
let n = Object.create(null);
|
|
5787
|
-
if (e) for (let [t, r] of Object.entries(e)) n[
|
|
5791
|
+
if (e) for (let [t, r] of Object.entries(e)) n[mc(t)] = {
|
|
5788
5792
|
content: r,
|
|
5789
|
-
updatedAt:
|
|
5793
|
+
updatedAt: gc()
|
|
5790
5794
|
};
|
|
5791
5795
|
let { persist: r } = t, i = t.maxBytes ?? 8388608, a = {
|
|
5792
|
-
...
|
|
5796
|
+
...sc,
|
|
5793
5797
|
...t.poolBytes ?? {}
|
|
5794
5798
|
};
|
|
5795
5799
|
function o(e) {
|
|
5796
|
-
let t =
|
|
5800
|
+
let t = mc(e);
|
|
5797
5801
|
return t.startsWith("large_results/") ? "largeResults" : t.startsWith("drafts/") ? "drafts" : t.startsWith("resources/") ? "resources" : "userFiles";
|
|
5798
5802
|
}
|
|
5799
5803
|
function s(e) {
|
|
5800
5804
|
let t = 0;
|
|
5801
|
-
for (let [r, i] of Object.entries(n)) o(r) === e && (t +=
|
|
5805
|
+
for (let [r, i] of Object.entries(n)) o(r) === e && (t += fc(i.content));
|
|
5802
5806
|
return t;
|
|
5803
5807
|
}
|
|
5804
5808
|
function c() {
|
|
5805
|
-
for (let e of
|
|
5809
|
+
for (let e of cc) {
|
|
5806
5810
|
let t = a[e];
|
|
5807
5811
|
if (s(e) <= t) continue;
|
|
5808
|
-
let r = t *
|
|
5812
|
+
let r = t * lc, i = e === "largeResults", c = i && s(e) > t * 1.5;
|
|
5809
5813
|
c && console.warn(`[page-agent-sdk] vfs large_results 池 ${s(e)} > ${Math.round(t * 1.5)}(被引用撑爆)→ 无视 protectedRefs 强制删`);
|
|
5810
5814
|
let l = Object.entries(n).filter(([t]) => o(t) === e).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
|
|
5811
5815
|
for (let [t] of l) if (!(i && !c && u.has(t)) && (delete n[t], s(e) <= r)) break;
|
|
5812
5816
|
}
|
|
5813
|
-
if (
|
|
5814
|
-
let e = i *
|
|
5815
|
-
for (let [i] of r) if (!(o(i) === "largeResults" && !t && u.has(i)) && (delete n[i],
|
|
5817
|
+
if (pc(n) > i) {
|
|
5818
|
+
let e = i * lc, t = pc(n) > i * 1.5, r = Object.entries(n).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
|
|
5819
|
+
for (let [i] of r) if (!(o(i) === "largeResults" && !t && u.has(i)) && (delete n[i], pc(n) <= e)) break;
|
|
5816
5820
|
}
|
|
5817
5821
|
}
|
|
5818
5822
|
let l = !0, u = /* @__PURE__ */ new Set(), d = null;
|
|
@@ -5847,10 +5851,10 @@ function lc(e, t = {}) {
|
|
|
5847
5851
|
u = e;
|
|
5848
5852
|
},
|
|
5849
5853
|
getPoolOf: (e) => o(e),
|
|
5850
|
-
getPoolLimit: (e) => a[e] ??
|
|
5854
|
+
getPoolLimit: (e) => a[e] ?? sc.userFiles
|
|
5851
5855
|
};
|
|
5852
5856
|
return r && (m.hydrate = (e) => {
|
|
5853
|
-
for (let [t, r] of Object.entries(e)) n[
|
|
5857
|
+
for (let [t, r] of Object.entries(e)) n[mc(t)] = r;
|
|
5854
5858
|
c(), l = !0;
|
|
5855
5859
|
}, m.flush = () => {
|
|
5856
5860
|
d &&= (clearTimeout(d), null), f();
|
|
@@ -5859,19 +5863,19 @@ function lc(e, t = {}) {
|
|
|
5859
5863
|
p(), l = !0;
|
|
5860
5864
|
}), m;
|
|
5861
5865
|
}
|
|
5862
|
-
var
|
|
5863
|
-
function dc(e) {
|
|
5864
|
-
return uc ||= new TextEncoder(), uc.encode(e).length;
|
|
5865
|
-
}
|
|
5866
|
+
var dc = null;
|
|
5866
5867
|
function fc(e) {
|
|
5868
|
+
return dc ||= new TextEncoder(), dc.encode(e).length;
|
|
5869
|
+
}
|
|
5870
|
+
function pc(e) {
|
|
5867
5871
|
let t = 0;
|
|
5868
|
-
for (let n of Object.values(e)) t +=
|
|
5872
|
+
for (let n of Object.values(e)) t += fc(n.content);
|
|
5869
5873
|
return t;
|
|
5870
5874
|
}
|
|
5871
|
-
function
|
|
5875
|
+
function mc(e) {
|
|
5872
5876
|
return e.replace(/^\/+/, "").replace(/\/+/g, "/");
|
|
5873
5877
|
}
|
|
5874
|
-
function
|
|
5878
|
+
function hc(e) {
|
|
5875
5879
|
let t = "";
|
|
5876
5880
|
for (let n = 0; n < e.length; n++) {
|
|
5877
5881
|
let r = e[n];
|
|
@@ -5879,10 +5883,10 @@ function mc(e) {
|
|
|
5879
5883
|
}
|
|
5880
5884
|
return RegExp("^" + t + "$");
|
|
5881
5885
|
}
|
|
5882
|
-
function
|
|
5886
|
+
function gc() {
|
|
5883
5887
|
return Date.now();
|
|
5884
5888
|
}
|
|
5885
|
-
var
|
|
5889
|
+
var _c = [
|
|
5886
5890
|
"vfs_read",
|
|
5887
5891
|
"vfs_write",
|
|
5888
5892
|
"vfs_edit",
|
|
@@ -5893,10 +5897,10 @@ var gc = [
|
|
|
5893
5897
|
"vfs_json_patch",
|
|
5894
5898
|
"vfs_rm"
|
|
5895
5899
|
];
|
|
5896
|
-
function
|
|
5900
|
+
function vc(e) {
|
|
5897
5901
|
return [
|
|
5898
5902
|
r(async ({ path: t, offset: n, limit: r }) => {
|
|
5899
|
-
let i = e.files[
|
|
5903
|
+
let i = e.files[mc(t)];
|
|
5900
5904
|
if (!i) return Y({
|
|
5901
5905
|
code: "NOT_FOUND",
|
|
5902
5906
|
path: t,
|
|
@@ -5915,7 +5919,7 @@ function _c(e) {
|
|
|
5915
5919
|
})
|
|
5916
5920
|
}),
|
|
5917
5921
|
r(async ({ path: t, content: n, jsonString: r }) => {
|
|
5918
|
-
let i =
|
|
5922
|
+
let i = mc(t), a = e.getPoolLimit?.(e.getPoolOf?.(i) ?? "userFiles") ?? 2 * 1024 * 1024, o = fc(n);
|
|
5919
5923
|
if (o > a) {
|
|
5920
5924
|
let n = e.getPoolOf?.(i) ?? "userFiles";
|
|
5921
5925
|
return Y({
|
|
@@ -5937,7 +5941,7 @@ function _c(e) {
|
|
|
5937
5941
|
}
|
|
5938
5942
|
return e.files[i] = {
|
|
5939
5943
|
content: n,
|
|
5940
|
-
updatedAt:
|
|
5944
|
+
updatedAt: gc()
|
|
5941
5945
|
}, `已写入 ${t}(${n.length} 字符)${r ? "(JSON 校验通过)" : ""}`;
|
|
5942
5946
|
}, {
|
|
5943
5947
|
name: "vfs_write",
|
|
@@ -5949,7 +5953,7 @@ function _c(e) {
|
|
|
5949
5953
|
})
|
|
5950
5954
|
}),
|
|
5951
5955
|
r(async ({ path: t, oldString: n, newString: r }) => {
|
|
5952
|
-
let i =
|
|
5956
|
+
let i = mc(t), a = e.files[i];
|
|
5953
5957
|
if (!a) return Y({
|
|
5954
5958
|
code: "NOT_FOUND",
|
|
5955
5959
|
path: t,
|
|
@@ -5979,7 +5983,7 @@ function _c(e) {
|
|
|
5979
5983
|
}
|
|
5980
5984
|
return e.files[i] = {
|
|
5981
5985
|
content: a.content.replace(n, r),
|
|
5982
|
-
updatedAt:
|
|
5986
|
+
updatedAt: gc()
|
|
5983
5987
|
}, `已替换 ${t} 中 1 处。`;
|
|
5984
5988
|
}, {
|
|
5985
5989
|
name: "vfs_edit",
|
|
@@ -6001,7 +6005,7 @@ function _c(e) {
|
|
|
6001
6005
|
r(async ({ pattern: t }) => {
|
|
6002
6006
|
let n;
|
|
6003
6007
|
try {
|
|
6004
|
-
n =
|
|
6008
|
+
n = hc(t);
|
|
6005
6009
|
} catch (e) {
|
|
6006
6010
|
return Y({
|
|
6007
6011
|
code: "GLOB_INVALID",
|
|
@@ -6030,7 +6034,7 @@ function _c(e) {
|
|
|
6030
6034
|
details: { pattern: t }
|
|
6031
6035
|
});
|
|
6032
6036
|
}
|
|
6033
|
-
let i = n ? [
|
|
6037
|
+
let i = n ? [mc(n)] : Object.keys(e.files), a = [];
|
|
6034
6038
|
for (let t of i) {
|
|
6035
6039
|
let n = e.files[t];
|
|
6036
6040
|
n && n.content.split("\n").forEach((e, n) => {
|
|
@@ -6047,7 +6051,7 @@ function _c(e) {
|
|
|
6047
6051
|
})
|
|
6048
6052
|
}),
|
|
6049
6053
|
r(async ({ path: t, jsonPath: n }) => {
|
|
6050
|
-
let r =
|
|
6054
|
+
let r = mc(t), i = e.files[r];
|
|
6051
6055
|
if (!i) return Y({
|
|
6052
6056
|
code: "NOT_FOUND",
|
|
6053
6057
|
path: t,
|
|
@@ -6084,7 +6088,7 @@ function _c(e) {
|
|
|
6084
6088
|
})
|
|
6085
6089
|
}),
|
|
6086
6090
|
r(async ({ path: t, patches: n }) => {
|
|
6087
|
-
let r =
|
|
6091
|
+
let r = mc(t), i = e.files[r];
|
|
6088
6092
|
if (!i) return Y({
|
|
6089
6093
|
code: "NOT_FOUND",
|
|
6090
6094
|
path: t,
|
|
@@ -6117,7 +6121,7 @@ function _c(e) {
|
|
|
6117
6121
|
let c = JSON.stringify(o);
|
|
6118
6122
|
return e.files[r] = {
|
|
6119
6123
|
content: c,
|
|
6120
|
-
updatedAt:
|
|
6124
|
+
updatedAt: gc()
|
|
6121
6125
|
}, `已对 ${t} 应用 ${n.length} 个 patch(影响 ${s.length} 处:${s.join(", ")}),文件现 ${c.length} 字符`;
|
|
6122
6126
|
}, {
|
|
6123
6127
|
name: "vfs_json_patch",
|
|
@@ -6137,7 +6141,7 @@ function _c(e) {
|
|
|
6137
6141
|
})
|
|
6138
6142
|
}),
|
|
6139
6143
|
r(async ({ path: t }) => {
|
|
6140
|
-
let n =
|
|
6144
|
+
let n = mc(t);
|
|
6141
6145
|
return e.files[n] ? (delete e.files[n], `已删除 ${t}`) : Y({
|
|
6142
6146
|
code: "NOT_FOUND",
|
|
6143
6147
|
path: t,
|
|
@@ -6151,16 +6155,16 @@ function _c(e) {
|
|
|
6151
6155
|
})
|
|
6152
6156
|
];
|
|
6153
6157
|
}
|
|
6154
|
-
function
|
|
6158
|
+
function yc(e) {
|
|
6155
6159
|
return {
|
|
6156
6160
|
name: "vfs",
|
|
6157
|
-
tools:
|
|
6161
|
+
tools: vc(e),
|
|
6158
6162
|
beforeAgent: () => ({ files: e.files })
|
|
6159
6163
|
};
|
|
6160
6164
|
}
|
|
6161
6165
|
//#endregion
|
|
6162
6166
|
//#region src/core/tools/htmlValidate.ts
|
|
6163
|
-
var
|
|
6167
|
+
var bc = /* @__PURE__ */ new Set([
|
|
6164
6168
|
"area",
|
|
6165
6169
|
"base",
|
|
6166
6170
|
"br",
|
|
@@ -6175,8 +6179,8 @@ var yc = /* @__PURE__ */ new Set([
|
|
|
6175
6179
|
"source",
|
|
6176
6180
|
"track",
|
|
6177
6181
|
"wbr"
|
|
6178
|
-
]),
|
|
6179
|
-
function
|
|
6182
|
+
]), xc = /* @__PURE__ */ new Set(["script", "style"]);
|
|
6183
|
+
function Sc(e) {
|
|
6180
6184
|
let t = [], n = e.length;
|
|
6181
6185
|
if (!e.trim()) return t;
|
|
6182
6186
|
let r = [0];
|
|
@@ -6253,8 +6257,8 @@ function xc(e) {
|
|
|
6253
6257
|
}
|
|
6254
6258
|
continue;
|
|
6255
6259
|
}
|
|
6256
|
-
if (!(
|
|
6257
|
-
if (
|
|
6260
|
+
if (!(bc.has(p) || m)) {
|
|
6261
|
+
if (xc.has(p)) {
|
|
6258
6262
|
let n = RegExp(`</${p}\\s*>`, "i").exec(e.slice(o));
|
|
6259
6263
|
if (!n) {
|
|
6260
6264
|
t.push({
|
|
@@ -6283,8 +6287,8 @@ function xc(e) {
|
|
|
6283
6287
|
}
|
|
6284
6288
|
//#endregion
|
|
6285
6289
|
//#region src/core/sdk/codeAssetMiddleware.ts
|
|
6286
|
-
var
|
|
6287
|
-
function
|
|
6290
|
+
var Cc = "__pgTouched", wc = "__pgFinalText", Tc = "__pgCodeHashes", Ec = "__pgKeepExternal", Dc = "__pgNotes", Oc = 200;
|
|
6291
|
+
function kc(e) {
|
|
6288
6292
|
let t = [];
|
|
6289
6293
|
for (let n of e.split("\n")) {
|
|
6290
6294
|
let e = n.match(/^\s*[-*]?\s*\[note\]\s*(.*)$/i);
|
|
@@ -6292,27 +6296,27 @@ function Dc(e) {
|
|
|
6292
6296
|
}
|
|
6293
6297
|
return [...new Set(t)];
|
|
6294
6298
|
}
|
|
6295
|
-
function
|
|
6296
|
-
let n = Array.isArray(e[
|
|
6297
|
-
e[
|
|
6299
|
+
function Ac(e, t) {
|
|
6300
|
+
let n = Array.isArray(e[Dc]) ? e[Dc].filter((e) => typeof e == "string") : [];
|
|
6301
|
+
e[Dc] = [.../* @__PURE__ */ new Set([...n, ...t])].map((e) => e.length > Oc ? e.slice(0, Oc) + "…" : e).slice(-5);
|
|
6298
6302
|
}
|
|
6299
|
-
function
|
|
6303
|
+
function jc(e) {
|
|
6300
6304
|
let t = 5381;
|
|
6301
6305
|
for (let n = 0; n < e.length; n++) t = (t << 5) + t + e.charCodeAt(n) | 0;
|
|
6302
6306
|
return (t >>> 0).toString(16);
|
|
6303
6307
|
}
|
|
6304
|
-
function
|
|
6308
|
+
function Mc(e, t) {
|
|
6305
6309
|
let n = [];
|
|
6306
|
-
return
|
|
6310
|
+
return Pc(e, t, (e) => {
|
|
6307
6311
|
typeof e.name == "string" && e.name && n.push(e.name);
|
|
6308
6312
|
}), n;
|
|
6309
6313
|
}
|
|
6310
|
-
function
|
|
6314
|
+
function Nc(e, t) {
|
|
6311
6315
|
if (!e.startsWith(t)) return null;
|
|
6312
6316
|
let n = e.slice(t.length), r = n.lastIndexOf(".");
|
|
6313
6317
|
return (r > 0 ? n.slice(0, r) : r === 0 ? "" : n) || null;
|
|
6314
6318
|
}
|
|
6315
|
-
function
|
|
6319
|
+
function Pc(e, t, n) {
|
|
6316
6320
|
if (!(!e || typeof e != "object")) for (let r of t) {
|
|
6317
6321
|
let t = Z(e, r);
|
|
6318
6322
|
if (Array.isArray(t)) for (let e = 0; e < t.length; e++) {
|
|
@@ -6321,7 +6325,7 @@ function Mc(e, t, n) {
|
|
|
6321
6325
|
}
|
|
6322
6326
|
}
|
|
6323
6327
|
}
|
|
6324
|
-
function
|
|
6328
|
+
function Fc(e, t, n) {
|
|
6325
6329
|
let r = /* @__PURE__ */ new Set();
|
|
6326
6330
|
if (!e || typeof e != "object") return r;
|
|
6327
6331
|
for (let i of t) {
|
|
@@ -6340,17 +6344,17 @@ function Nc(e, t, n) {
|
|
|
6340
6344
|
}
|
|
6341
6345
|
return r;
|
|
6342
6346
|
}
|
|
6343
|
-
function
|
|
6347
|
+
function Ic(e) {
|
|
6344
6348
|
let { writablePaths: t, codeVfsPrefix: n, ext: r, codeField: i = "code", onWarning: a, getController: o, vfsStore: s, craftNotes: c = !0 } = e;
|
|
6345
6349
|
return {
|
|
6346
6350
|
name: "code-asset-checkout-commit",
|
|
6347
6351
|
beforeAgent: (e) => {
|
|
6348
6352
|
let c = o()?.get?.().bind, l = 0, u = 0, d = /* @__PURE__ */ new Map();
|
|
6349
|
-
if (
|
|
6353
|
+
if (Pc(c, t, (e) => {
|
|
6350
6354
|
l++;
|
|
6351
6355
|
let t = Z(e, i);
|
|
6352
6356
|
if (typeof t == "string") {
|
|
6353
|
-
u++, d.set(e.__pgId,
|
|
6357
|
+
u++, d.set(e.__pgId, jc(t));
|
|
6354
6358
|
let i = `${n}${e.__pgId}.${r}`;
|
|
6355
6359
|
s.files[i] = {
|
|
6356
6360
|
content: t,
|
|
@@ -6370,22 +6374,23 @@ function Pc(e) {
|
|
|
6370
6374
|
}
|
|
6371
6375
|
return {
|
|
6372
6376
|
files: s.files,
|
|
6373
|
-
[
|
|
6374
|
-
[
|
|
6375
|
-
[
|
|
6377
|
+
[Cc]: /* @__PURE__ */ new Set(),
|
|
6378
|
+
[wc]: { text: "" },
|
|
6379
|
+
[Tc]: d,
|
|
6380
|
+
[Ec]: []
|
|
6376
6381
|
};
|
|
6377
6382
|
},
|
|
6378
6383
|
wrapModelCall: async (e, t) => {
|
|
6379
|
-
let n = await t(e), r = e.state[
|
|
6384
|
+
let n = await t(e), r = e.state[wc];
|
|
6380
6385
|
return r && !(n.toolCalls && n.toolCalls.length) && typeof n.content == "string" && n.content && (r.text = n.content), n;
|
|
6381
6386
|
},
|
|
6382
6387
|
augmentPrompt: () => {
|
|
6383
6388
|
let e = o()?.get?.().bind, i = [], a = 0;
|
|
6384
|
-
if (
|
|
6389
|
+
if (Pc(e, t, (e, t, o) => {
|
|
6385
6390
|
a++;
|
|
6386
6391
|
let l = typeof e.name == "string" && e.name ? e.name : "", u = l ? `${l} [${o}]` : `(未命名 [${o}])`, d = `${n}${e.__pgId}.${r}`, f = !!s.files[d];
|
|
6387
6392
|
if (i.push(`- ${u} → ${d}${f ? "" : "(尚未检出,先 vfs_write 创建)"}`), c) {
|
|
6388
|
-
let t = Array.isArray(e[
|
|
6393
|
+
let t = Array.isArray(e[Dc]) ? e[Dc].filter((e) => typeof e == "string") : [];
|
|
6389
6394
|
if (t.length) {
|
|
6390
6395
|
let e = t[t.length - 1];
|
|
6391
6396
|
i.push(` 📝 笔记×${t.length}(最近):${e.length > 120 ? e.slice(0, 120) + "…" : e}`);
|
|
@@ -6403,13 +6408,13 @@ function Pc(e) {
|
|
|
6403
6408
|
return `## 组件代码文件地图(改组件时按 name 直接改对应 vfs 文件;框架自动 checkout/commit)${c ? "\n📝 笔记 = 前任维护者交接(设计决策/用户反馈/踩坑),改该组件时遵循;收口回复末行必须附一行 [note] 交接笔记(本组件本次的实现要点),框架存进组件转交下任" : ""}\n${i.join("\n")}${l}`;
|
|
6404
6409
|
},
|
|
6405
6410
|
wrapToolCall: async (e, i) => {
|
|
6406
|
-
let a = e.name === "vfs_write" || e.name === "vfs_edit" || e.name === "vfs_rm" ? e.args?.path : void 0, s = typeof a == "string" ?
|
|
6411
|
+
let a = e.name === "vfs_write" || e.name === "vfs_edit" || e.name === "vfs_rm" ? e.args?.path : void 0, s = typeof a == "string" ? mc(a) : void 0, c = typeof s == "string" && s.startsWith(n);
|
|
6407
6412
|
if (c) {
|
|
6408
6413
|
let i = e.state.focuses;
|
|
6409
6414
|
if (i && i.length) {
|
|
6410
|
-
let e =
|
|
6415
|
+
let e = Fc(o()?.get?.().bind, t, i);
|
|
6411
6416
|
if (e.size) {
|
|
6412
|
-
let t =
|
|
6417
|
+
let t = Nc(s, n);
|
|
6413
6418
|
if (t && !e.has(t)) return {
|
|
6414
6419
|
content: `PATH_DENIED · vfs 越界:当前聚焦代码文件 [${[...e].map((e) => `${n}${e}.${r}`).join(", ")}],你要改的 "${s}" 不在其中。请只改焦点组件的代码文件;如需改其他组件,请在收口回复中说明需先取消聚焦(焦点由主会话/用户管理,你无 focus 工具)后重试。`,
|
|
6415
6420
|
status: "error"
|
|
@@ -6419,7 +6424,7 @@ function Pc(e) {
|
|
|
6419
6424
|
}
|
|
6420
6425
|
let l = await i(e);
|
|
6421
6426
|
if (c) {
|
|
6422
|
-
let t = e.state[
|
|
6427
|
+
let t = e.state[Cc];
|
|
6423
6428
|
t && t.add(s);
|
|
6424
6429
|
}
|
|
6425
6430
|
return l;
|
|
@@ -6427,52 +6432,54 @@ function Pc(e) {
|
|
|
6427
6432
|
afterAgent: (e) => {
|
|
6428
6433
|
let a = o(), l = a?.get?.().bind;
|
|
6429
6434
|
if (!l) return;
|
|
6430
|
-
let u = e[
|
|
6435
|
+
let u = e[Cc] ?? /* @__PURE__ */ new Set();
|
|
6431
6436
|
if (u.size) {
|
|
6432
|
-
let o = e[
|
|
6433
|
-
|
|
6434
|
-
let
|
|
6435
|
-
c.add(
|
|
6436
|
-
let
|
|
6437
|
-
if (u.has(
|
|
6438
|
-
let n = s.files[
|
|
6437
|
+
let o = e[Tc] ?? /* @__PURE__ */ new Map(), c = /* @__PURE__ */ new Set();
|
|
6438
|
+
Pc(l, t, (t) => {
|
|
6439
|
+
let a = t.__pgId;
|
|
6440
|
+
c.add(a);
|
|
6441
|
+
let l = `${n}${a}.${r}`;
|
|
6442
|
+
if (u.has(l)) try {
|
|
6443
|
+
let n = s.files[l];
|
|
6439
6444
|
if (n && typeof n.content == "string") {
|
|
6440
|
-
let r = o.get(
|
|
6445
|
+
let r = o.get(a);
|
|
6441
6446
|
if (r !== void 0) {
|
|
6442
|
-
let n = Z(
|
|
6443
|
-
if (typeof n != "string" ||
|
|
6444
|
-
console.warn(`[page-agent-sdk][code-asset] 组件 ${
|
|
6447
|
+
let n = Z(t, i);
|
|
6448
|
+
if (typeof n != "string" || jc(n) !== r) {
|
|
6449
|
+
console.warn(`[page-agent-sdk][code-asset] 组件 ${t.name ?? a}(${l})在修改期间被外部更新,已保留外部版本(keep_external),本次子 agent 修改未提交`);
|
|
6450
|
+
let n = e[Ec], r = String(t.name ?? a);
|
|
6451
|
+
Array.isArray(n) ? n.push(r) : e[Ec] = [r];
|
|
6445
6452
|
return;
|
|
6446
6453
|
}
|
|
6447
6454
|
}
|
|
6448
|
-
let s =
|
|
6455
|
+
let s = Sc(n.content);
|
|
6449
6456
|
if (s.length) {
|
|
6450
|
-
console.warn(`[page-agent-sdk][code-asset] 跳过 commit 未通过校验的半成品(可能 abort/timeout 未跑完 verify):${
|
|
6457
|
+
console.warn(`[page-agent-sdk][code-asset] 跳过 commit 未通过校验的半成品(可能 abort/timeout 未跑完 verify):${l} - ${s[0].message}(${s[0].code})`);
|
|
6451
6458
|
return;
|
|
6452
6459
|
}
|
|
6453
|
-
Na(
|
|
6460
|
+
Na(t, i, n.content);
|
|
6454
6461
|
}
|
|
6455
6462
|
} catch (e) {
|
|
6456
|
-
console.warn(`[page-agent-sdk][code-asset] 组件 commit 失败已跳过(其余组件不受影响):${
|
|
6463
|
+
console.warn(`[page-agent-sdk][code-asset] 组件 commit 失败已跳过(其余组件不受影响):${l} - ${String(e?.message ?? e)}`);
|
|
6457
6464
|
}
|
|
6458
6465
|
});
|
|
6459
6466
|
for (let e of u) {
|
|
6460
|
-
let t =
|
|
6467
|
+
let t = Nc(e, n);
|
|
6461
6468
|
t && !c.has(t) && (console.warn(`[page-agent-sdk][code-asset] 组件 ${t}(${e})已被外部删除,放弃 commit 并清理 vfs 工作副本(不复活组件)`), delete s.files[e]);
|
|
6462
6469
|
}
|
|
6463
6470
|
a?.markDataDirty?.(), a?.recomputeBaseline?.();
|
|
6464
6471
|
}
|
|
6465
6472
|
if (!c) return;
|
|
6466
|
-
let d =
|
|
6473
|
+
let d = kc(e[wc]?.text ?? "");
|
|
6467
6474
|
if (!d.length) return;
|
|
6468
6475
|
let f = [];
|
|
6469
|
-
if (
|
|
6476
|
+
if (Pc(l, t, (e) => {
|
|
6470
6477
|
(u.size === 0 || u.has(`${n}${e.__pgId}.${r}`)) && f.push(e);
|
|
6471
6478
|
}), !f.length) return;
|
|
6472
6479
|
let p = !1;
|
|
6473
6480
|
for (let e of d) {
|
|
6474
6481
|
let t = f.length === 1 ? f[0] : f.find((t) => typeof t.name == "string" && !!t.name && e.includes(t.name));
|
|
6475
|
-
t && (
|
|
6482
|
+
t && (Ac(t, [e]), p = !0);
|
|
6476
6483
|
}
|
|
6477
6484
|
p && a?.markDataDirty?.();
|
|
6478
6485
|
}
|
|
@@ -6480,7 +6487,7 @@ function Pc(e) {
|
|
|
6480
6487
|
}
|
|
6481
6488
|
//#endregion
|
|
6482
6489
|
//#region src/core/sdk/componentLock.ts
|
|
6483
|
-
function
|
|
6490
|
+
function Lc() {
|
|
6484
6491
|
let e = /* @__PURE__ */ new Map();
|
|
6485
6492
|
return {
|
|
6486
6493
|
async acquire(t, n) {
|
|
@@ -6519,7 +6526,7 @@ function Fc() {
|
|
|
6519
6526
|
}
|
|
6520
6527
|
};
|
|
6521
6528
|
}
|
|
6522
|
-
function
|
|
6529
|
+
function Rc(e, t) {
|
|
6523
6530
|
if (Array.isArray(e.components) && e.components.length) {
|
|
6524
6531
|
let n = new Set(t), r = [...new Set(e.components.filter((e) => typeof e == "string" && e && n.has(e)))];
|
|
6525
6532
|
if (r.length) return {
|
|
@@ -6536,12 +6543,12 @@ function Ic(e, t) {
|
|
|
6536
6543
|
via: "none"
|
|
6537
6544
|
};
|
|
6538
6545
|
}
|
|
6539
|
-
function
|
|
6546
|
+
function zc(e, t, n) {
|
|
6540
6547
|
let r = new Set(n);
|
|
6541
6548
|
if (!r.size || !e || typeof e != "object") return [];
|
|
6542
6549
|
let i = [];
|
|
6543
6550
|
for (let n of t) {
|
|
6544
|
-
let t =
|
|
6551
|
+
let t = Bc(e, n);
|
|
6545
6552
|
if (Array.isArray(t)) for (let e = 0; e < t.length; e++) {
|
|
6546
6553
|
let a = t[e];
|
|
6547
6554
|
a && typeof a == "object" && typeof a.name == "string" && r.has(a.name) && i.push(`${n}.${e}`);
|
|
@@ -6549,7 +6556,7 @@ function Lc(e, t, n) {
|
|
|
6549
6556
|
}
|
|
6550
6557
|
return i;
|
|
6551
6558
|
}
|
|
6552
|
-
function
|
|
6559
|
+
function Bc(e, t) {
|
|
6553
6560
|
let n = e;
|
|
6554
6561
|
for (let e of t.split(".")) {
|
|
6555
6562
|
if (!n || typeof n != "object") return;
|
|
@@ -6557,15 +6564,26 @@ function Rc(e, t) {
|
|
|
6557
6564
|
}
|
|
6558
6565
|
return n;
|
|
6559
6566
|
}
|
|
6560
|
-
function
|
|
6567
|
+
function Vc(e, t) {
|
|
6561
6568
|
return t.some((t) => e === t || e.startsWith(t + "."));
|
|
6562
6569
|
}
|
|
6563
|
-
function
|
|
6570
|
+
function Hc(e, t) {
|
|
6571
|
+
let n = [];
|
|
6572
|
+
for (let { writablePaths: r, codeField: i } of t) for (let t of r) {
|
|
6573
|
+
let r = Bc(e, t);
|
|
6574
|
+
if (Array.isArray(r)) for (let e = 0; e < r.length; e++) {
|
|
6575
|
+
let a = r[e];
|
|
6576
|
+
a && typeof a == "object" && typeof Bc(a, i) == "string" && n.push(`${t}.${e}.${i}`);
|
|
6577
|
+
}
|
|
6578
|
+
}
|
|
6579
|
+
return n;
|
|
6580
|
+
}
|
|
6581
|
+
function Uc(e) {
|
|
6564
6582
|
let t = e ?? {}, n = /* @__PURE__ */ new Set();
|
|
6565
6583
|
if (typeof t.jsonPath == "string" && t.jsonPath && n.add(t.jsonPath), typeof t.path == "string" && t.path && n.add(t.path), t.patch && typeof t.patch.jsonPath == "string" && t.patch.jsonPath && n.add(t.patch.jsonPath), Array.isArray(t.patches)) for (let e of t.patches) e && typeof e.jsonPath == "string" && e.jsonPath && n.add(e.jsonPath);
|
|
6566
6584
|
return [...n];
|
|
6567
6585
|
}
|
|
6568
|
-
function
|
|
6586
|
+
function Wc(e) {
|
|
6569
6587
|
return {
|
|
6570
6588
|
name: "component-write-guard",
|
|
6571
6589
|
wrapToolCall: async (t, n) => {
|
|
@@ -6584,26 +6602,36 @@ function Vc(e) {
|
|
|
6584
6602
|
status: "error"
|
|
6585
6603
|
};
|
|
6586
6604
|
}
|
|
6587
|
-
let a = e.getLocked(), o = Object.keys(a);
|
|
6605
|
+
let a = e.getLocked(), o = Object.keys(a), s = e.getCodeFieldPaths?.() ?? [], c = Uc(i);
|
|
6606
|
+
if (s.length) {
|
|
6607
|
+
let t = c.filter((e) => Vc(e, s));
|
|
6608
|
+
if (t.length) return e.onReject?.({
|
|
6609
|
+
paths: t,
|
|
6610
|
+
lockedPrefixes: s,
|
|
6611
|
+
owner: "(codeField 恒守卫)"
|
|
6612
|
+
}), {
|
|
6613
|
+
content: `CUSTOM_CODE_DELEGATION · 写目标 [${t.join(", ")}] 是代码组件的代码字段,主 agent 不可直接写(会绕过 vfs 工作副本与格式校验,且可能覆盖外部/人工修改)。修改该组件须委派代码组件子 agent(use_html / use_<id>);若此前委派结果提示 keep_external(外部修改已保留),先向用户说明并确认后再委派,勿自行改写。`,
|
|
6614
|
+
status: "error"
|
|
6615
|
+
};
|
|
6616
|
+
}
|
|
6588
6617
|
if (!o.length) return n(t);
|
|
6589
|
-
let
|
|
6590
|
-
if (!
|
|
6591
|
-
let c = Bc(i);
|
|
6618
|
+
let l = zc(e.getBind(), e.writablePaths, o);
|
|
6619
|
+
if (!l.length) return n(t);
|
|
6592
6620
|
if (!c.length) return e.onReject?.({
|
|
6593
6621
|
paths: ["(整体 set)"],
|
|
6594
|
-
lockedPrefixes:
|
|
6622
|
+
lockedPrefixes: l,
|
|
6595
6623
|
owner: o.join(",")
|
|
6596
6624
|
}), {
|
|
6597
6625
|
content: `COMPONENT_LOCKED · 组件 [${o.join(", ")}] 正在被子 agent 修改,整体写入会触碰它们。请改用增量 patch(write({patch:{jsonPath,...}}))只写未锁定组件,或等委派结束后再整体操作。`,
|
|
6598
6626
|
status: "error"
|
|
6599
6627
|
};
|
|
6600
|
-
let
|
|
6601
|
-
return
|
|
6602
|
-
paths:
|
|
6603
|
-
lockedPrefixes:
|
|
6628
|
+
let u = c.filter((e) => Vc(e, l));
|
|
6629
|
+
return u.length ? (e.onReject?.({
|
|
6630
|
+
paths: u,
|
|
6631
|
+
lockedPrefixes: l,
|
|
6604
6632
|
owner: o.join(",")
|
|
6605
6633
|
}), {
|
|
6606
|
-
content: `COMPONENT_LOCKED · 写目标 [${
|
|
6634
|
+
content: `COMPONENT_LOCKED · 写目标 [${u.join(", ")}] 命中的组件正在被子 agent 修改(委派结束后自动解锁)。请先做其他组件/其他操作,稍后再写该组件;若需改它,等本轮委派完成后再试。`,
|
|
6607
6635
|
status: "error"
|
|
6608
6636
|
}) : n(t);
|
|
6609
6637
|
}
|
|
@@ -6611,7 +6639,7 @@ function Vc(e) {
|
|
|
6611
6639
|
}
|
|
6612
6640
|
//#endregion
|
|
6613
6641
|
//#region src/core/sdk/htmlSubagent.ts
|
|
6614
|
-
function
|
|
6642
|
+
function Gc(e, t, n) {
|
|
6615
6643
|
let r = "html";
|
|
6616
6644
|
return `你是纯代码组件生成专家。可用工具:vfs_write / vfs_edit / vfs_rm(写/改/删代码工作副本 vfs ${e}) / vfs_read + vfs_grep(读 vfs) / validate_code(代码格式自检) / write(写 data,writablePaths 限定;set/patch 增量或整体) / read / write_todos + update_todo(规划)。
|
|
6617
6645
|
|
|
@@ -6665,7 +6693,7 @@ ${`- 输出形态:完整、自包含的 HTML 页面(.${r},可独立成页)`}
|
|
|
6665
6693
|
- 一次想清楚 → 动手 → 验证 → 收口。**思考是手段不是目的,产出代码才是**。
|
|
6666
6694
|
8. **收口格式(必守,最后一行)**:收口回复 = 简短结果总结 + **末行交接笔记** \`[note] <一句话实现要点>\` —— 关键设计决策 / 用户偏好 / 踩坑(如「[note] 液面用 height keyframes 4.2s 循环;装饰仅灯串+光斑 2 类」)。框架只识别末尾 [note] 行存进组件、自动转交下次维护该组件的子 agent;**漏写 = 下任失去交接**(真 LLM 实测漏写率 3/4,务必末行带上)。一行内,只写可复用结论。`;
|
|
6667
6695
|
}
|
|
6668
|
-
function
|
|
6696
|
+
function Kc(e, t) {
|
|
6669
6697
|
return `# HTML 完整页面生成规范
|
|
6670
6698
|
|
|
6671
6699
|
## 代码资产模型(重要)
|
|
@@ -6703,14 +6731,14 @@ function Uc(e, t) {
|
|
|
6703
6731
|
- 语义化标签(button / nav / section);图片 alt;交互可键盘聚焦
|
|
6704
6732
|
- 颜色对比达标;不只用颜色传达信息`;
|
|
6705
6733
|
}
|
|
6706
|
-
function
|
|
6734
|
+
function qc(e = "components", t = "code") {
|
|
6707
6735
|
return {
|
|
6708
6736
|
name: "html-fragment",
|
|
6709
6737
|
description: "完整 HTML 页面生成规范:代码作为 data 资产 / vfs 工作副本 / 完整自包含可独立成页 / script+CSS 集中放置 / 可引外部 JS/CSS / validate_code 自检 / 安全底线 / 可访问性",
|
|
6710
|
-
getContent: () =>
|
|
6738
|
+
getContent: () => Kc(e, t)
|
|
6711
6739
|
};
|
|
6712
6740
|
}
|
|
6713
|
-
function
|
|
6741
|
+
function Jc(e = {}) {
|
|
6714
6742
|
let t = e.vfsPrefix ?? "html/";
|
|
6715
6743
|
return ({ state: e }) => {
|
|
6716
6744
|
let n = e.files;
|
|
@@ -6718,7 +6746,7 @@ function Gc(e = {}) {
|
|
|
6718
6746
|
let r = [];
|
|
6719
6747
|
for (let [e, i] of Object.entries(n)) {
|
|
6720
6748
|
if (!e.startsWith(t)) continue;
|
|
6721
|
-
let n =
|
|
6749
|
+
let n = Sc(i.content);
|
|
6722
6750
|
for (let t of n) r.push(`${e} 第 ${t.line} 行:${t.message}(${t.code})`);
|
|
6723
6751
|
}
|
|
6724
6752
|
return r.length ? {
|
|
@@ -6727,7 +6755,7 @@ function Gc(e = {}) {
|
|
|
6727
6755
|
} : { ok: !0 };
|
|
6728
6756
|
};
|
|
6729
6757
|
}
|
|
6730
|
-
function
|
|
6758
|
+
function Yc(e) {
|
|
6731
6759
|
let n, i, a = {
|
|
6732
6760
|
name: "html-validate-tools",
|
|
6733
6761
|
beforeAgent: (e) => {
|
|
@@ -6762,7 +6790,7 @@ function Kc(e) {
|
|
|
6762
6790
|
}
|
|
6763
6791
|
let s = [];
|
|
6764
6792
|
for (let e of o) {
|
|
6765
|
-
let t =
|
|
6793
|
+
let t = Sc(e.content);
|
|
6766
6794
|
t.length && s.push(`${e.path}:\n${t.map((e) => ` 第 ${e.line} 行 ${e.message}(${e.code})`).join("\n")}`);
|
|
6767
6795
|
}
|
|
6768
6796
|
return s.length ? `❌ 格式校验未通过:\n${s.join("\n")}\n请用 vfs_edit 修正后重新调用 validate_code 复查。` : `✅ 格式校验通过(${o.map((e) => e.path).join(", ")}:标签闭合等结构合法)。`;
|
|
@@ -6780,16 +6808,16 @@ function Kc(e) {
|
|
|
6780
6808
|
i = e;
|
|
6781
6809
|
}, a;
|
|
6782
6810
|
}
|
|
6783
|
-
var
|
|
6784
|
-
function
|
|
6811
|
+
var Xc = 2;
|
|
6812
|
+
function Zc(e = {}) {
|
|
6785
6813
|
let { writablePaths: t, codeVfsPrefix: n = "html/", id: r = "html", description: i, planning: a = !0, summarization: o = !0, maxToolRounds: s = 12, temperature: c = .4, skills: l, extraTools: u, formatCheck: d = !0, codeField: f = "code", orchestratorPrompt: p = !0, craftNotes: m = !0 } = e;
|
|
6786
6814
|
if (t !== void 0 && !Array.isArray(t)) throw Error("[page-agent-sdk][createHtmlSubagent] writablePaths 须为字符串数组(代码组件 data 区,如 [\"components\"])/ 省略以从 schema 自动推断");
|
|
6787
6815
|
let h = [];
|
|
6788
|
-
a && h.push(Ta()), d && (h.push(
|
|
6816
|
+
a && h.push(Ta()), d && (h.push(Yc(n)), h.push(js({ check: Jc({ vfsPrefix: n }) })));
|
|
6789
6817
|
let g = u ?? [], _ = t?.[0] ?? "components", v = l === void 0, y = {
|
|
6790
6818
|
id: r,
|
|
6791
6819
|
description: i ?? `生成/修改纯代码组件(代码作为 data 资产,代码字段 ${f} 随 data 持久化;vfs 作工作副本;能规划(write_todos)+ 执行)。需写代码组件或灵活定制时委派`,
|
|
6792
|
-
systemPrompt:
|
|
6820
|
+
systemPrompt: Gc(n, f, _),
|
|
6793
6821
|
writablePaths: t ?? [],
|
|
6794
6822
|
allowedTools: [
|
|
6795
6823
|
"vfs_write",
|
|
@@ -6800,9 +6828,9 @@ function Jc(e = {}) {
|
|
|
6800
6828
|
],
|
|
6801
6829
|
middleware: h.length ? h : void 0,
|
|
6802
6830
|
summarization: o === !1 ? void 0 : o,
|
|
6803
|
-
maxVerifyAttempts: d ?
|
|
6831
|
+
maxVerifyAttempts: d ? Xc : void 0,
|
|
6804
6832
|
temperature: c,
|
|
6805
|
-
skills: v ? [
|
|
6833
|
+
skills: v ? [qc(_, f)] : l,
|
|
6806
6834
|
maxToolRounds: s,
|
|
6807
6835
|
tools: g.length ? g : void 0,
|
|
6808
6836
|
_codeAsset: {
|
|
@@ -6815,12 +6843,12 @@ function Jc(e = {}) {
|
|
|
6815
6843
|
}
|
|
6816
6844
|
};
|
|
6817
6845
|
return y._rebuildCodeAssetPaths = (e) => {
|
|
6818
|
-
y.systemPrompt =
|
|
6846
|
+
y.systemPrompt = Gc(n, f, e), v && (y.skills = [qc(e, f)]);
|
|
6819
6847
|
}, y;
|
|
6820
6848
|
}
|
|
6821
6849
|
//#endregion
|
|
6822
6850
|
//#region src/core/sdk/defineTool.ts
|
|
6823
|
-
function
|
|
6851
|
+
function Qc(e) {
|
|
6824
6852
|
return r(async (t) => {
|
|
6825
6853
|
let n = await e.handler(t);
|
|
6826
6854
|
return typeof n == "string" ? n : JSON.stringify(n);
|
|
@@ -6832,7 +6860,7 @@ function Yc(e) {
|
|
|
6832
6860
|
}
|
|
6833
6861
|
//#endregion
|
|
6834
6862
|
//#region src/core/sdk/inspectContextTool.ts
|
|
6835
|
-
var
|
|
6863
|
+
var $c = t.object({
|
|
6836
6864
|
path: t.string().optional().describe("分类 key 过滤(如 toolResults/history/systemPrompt/dataHint);不传=全部分类"),
|
|
6837
6865
|
role: t.enum([
|
|
6838
6866
|
"user",
|
|
@@ -6842,11 +6870,11 @@ var Xc = t.object({
|
|
|
6842
6870
|
]).optional().describe("聚焦每轮首句的角色(assistant→回复摘要,user→问题摘要);不影响工具列表"),
|
|
6843
6871
|
limit: t.number().int().min(1).max(50).optional().describe("返回最近 N 轮(默认全部;超 50 自动截最近 50 防返回过大)")
|
|
6844
6872
|
});
|
|
6845
|
-
function
|
|
6846
|
-
return
|
|
6873
|
+
function el(e) {
|
|
6874
|
+
return Qc({
|
|
6847
6875
|
name: "inspect_context",
|
|
6848
6876
|
description: "查看当前对话上下文的构成(供压缩决策)。返回:totalTokens(历史轮次 token 总和,与触发判断同口径)、occupancy(窗口占用比)、contextWindow、categories(分类占用)、rounds(每轮 token/工具/首句)。先调用本工具查看构成,再决定压缩策略。",
|
|
6849
|
-
schema:
|
|
6877
|
+
schema: $c,
|
|
6850
6878
|
handler: (t) => {
|
|
6851
6879
|
let n = Ho(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) => {
|
|
6852
6880
|
let n = es(e), r = Wo(e), i = t.role === "assistant" ? e.assistantMsgs[0] ?? e.userMsg : e.userMsg, a = Uo(typeof i.content == "string" ? i.content : "", 60);
|
|
@@ -6869,7 +6897,7 @@ function Zc(e) {
|
|
|
6869
6897
|
}
|
|
6870
6898
|
//#endregion
|
|
6871
6899
|
//#region src/core/sdk/compressDecision.ts
|
|
6872
|
-
var
|
|
6900
|
+
var tl = t.object({
|
|
6873
6901
|
keepRounds: t.number().int().min(0).max(50).optional(),
|
|
6874
6902
|
windowRatio: t.number().min(0).max(1).optional(),
|
|
6875
6903
|
summarize: t.object({ mode: t.enum(["index", "llm"]) }),
|
|
@@ -6879,23 +6907,23 @@ var Qc = t.object({
|
|
|
6879
6907
|
}).refine((e) => e.keepRounds !== void 0 || e.windowRatio !== void 0, { message: "keepRounds 与 windowRatio 至少填一个(按当前触发模式)" });
|
|
6880
6908
|
//#endregion
|
|
6881
6909
|
//#region src/core/sdk/llmResolver.ts
|
|
6882
|
-
function
|
|
6910
|
+
function nl(e) {
|
|
6883
6911
|
let t = e.find((e) => e.role === "user");
|
|
6884
6912
|
if (!t) return;
|
|
6885
6913
|
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, " ");
|
|
6886
6914
|
if (r) return r.length > 30 ? r.slice(0, 30) + "…" : r;
|
|
6887
6915
|
}
|
|
6888
|
-
function
|
|
6916
|
+
function rl(e) {
|
|
6889
6917
|
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
6890
6918
|
}
|
|
6891
|
-
function
|
|
6919
|
+
function il(e) {
|
|
6892
6920
|
let t = e.content;
|
|
6893
6921
|
return typeof t == "string" ? t : Array.isArray(t) ? t.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(t ?? "");
|
|
6894
6922
|
}
|
|
6895
|
-
function
|
|
6923
|
+
function al(e) {
|
|
6896
6924
|
let t = e.summaryLlm ?? e.llm;
|
|
6897
6925
|
if (!t) return;
|
|
6898
|
-
let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, i = e.summaryTimeoutMs ?? 15e3, s =
|
|
6926
|
+
let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, i = e.summaryTimeoutMs ?? 15e3, s = rl(t) ? t : null, c = rl(t) ? null : t;
|
|
6899
6927
|
if (c && !c.apiKey) {
|
|
6900
6928
|
e.summaryLlm && console.warn("[page-agent-sdk][summarization] summaryLlm 已配置但缺 apiKey,摘要回退主 agent 模型或零成本索引摘要");
|
|
6901
6929
|
return;
|
|
@@ -6907,16 +6935,16 @@ function nl(e) {
|
|
|
6907
6935
|
return !l && c && (l = await m(c, {
|
|
6908
6936
|
temperature: n,
|
|
6909
6937
|
maxTokens: r
|
|
6910
|
-
})),
|
|
6938
|
+
})), il(await l.invoke([new o("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new a(e)], { signal: t.signal })).trim();
|
|
6911
6939
|
} finally {
|
|
6912
6940
|
clearTimeout(s);
|
|
6913
6941
|
}
|
|
6914
6942
|
};
|
|
6915
6943
|
}
|
|
6916
|
-
function
|
|
6944
|
+
function ol(e) {
|
|
6917
6945
|
let t = e.titleLlm ?? e.summaryLlm ?? e.llm;
|
|
6918
6946
|
if (!t) return;
|
|
6919
|
-
let n =
|
|
6947
|
+
let n = rl(t) ? t : null, r = rl(t) ? null : t;
|
|
6920
6948
|
if (r && !r.apiKey) return;
|
|
6921
6949
|
let i = n;
|
|
6922
6950
|
return async (t) => {
|
|
@@ -6927,7 +6955,7 @@ function rl(e) {
|
|
|
6927
6955
|
maxTokens: 30
|
|
6928
6956
|
}));
|
|
6929
6957
|
let t = await i.invoke([new o(e.i18n?.locale === "en-US" ? "Generate a short English title (max 10 words) summarizing the conversation below. Output the title text only, no quotes or punctuation." : "根据以下对话的主旨,生成一个简短的中文标题(不超过15个字,不要标点和引号,直接输出标题文字)。"), new a(n)], { signal: s.signal }), c = e.i18n?.locale === "en-US" ? 60 : 20;
|
|
6930
|
-
return
|
|
6958
|
+
return il(t).trim().replace(/^["'""「『]|["'""」』]$/g, "").split("\n")[0].slice(0, c);
|
|
6931
6959
|
} catch {
|
|
6932
6960
|
return "";
|
|
6933
6961
|
} finally {
|
|
@@ -6935,10 +6963,10 @@ function rl(e) {
|
|
|
6935
6963
|
}
|
|
6936
6964
|
};
|
|
6937
6965
|
}
|
|
6938
|
-
function
|
|
6966
|
+
function sl() {
|
|
6939
6967
|
return `call_dec_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
6940
6968
|
}
|
|
6941
|
-
function
|
|
6969
|
+
function cl(e) {
|
|
6942
6970
|
let t = e.match(/```(?:json)?\s*([\s\S]*?)```/), n = t ? t[1] : e, r = n.indexOf("{"), i = n.lastIndexOf("}");
|
|
6943
6971
|
if (r < 0 || i < 0 || i <= r) return null;
|
|
6944
6972
|
try {
|
|
@@ -6947,21 +6975,21 @@ function al(e) {
|
|
|
6947
6975
|
return null;
|
|
6948
6976
|
}
|
|
6949
6977
|
}
|
|
6950
|
-
function
|
|
6978
|
+
function ll(e) {
|
|
6951
6979
|
if (!e) return null;
|
|
6952
|
-
let t =
|
|
6980
|
+
let t = cl(e);
|
|
6953
6981
|
if (t == null) return null;
|
|
6954
|
-
let n =
|
|
6982
|
+
let n = tl.safeParse(t);
|
|
6955
6983
|
return n.success ? n.data : null;
|
|
6956
6984
|
}
|
|
6957
|
-
async function
|
|
6985
|
+
async function ul(e, t, n, r) {
|
|
6958
6986
|
let i = [...n];
|
|
6959
6987
|
for (let n = 0; n < 3; n++) {
|
|
6960
6988
|
let n = await e.invoke(i, { signal: r }), a = n?.tool_calls ?? [];
|
|
6961
|
-
if (!a.length) return
|
|
6989
|
+
if (!a.length) return il(n).trim();
|
|
6962
6990
|
i = [...i, n];
|
|
6963
6991
|
for (let e of a) {
|
|
6964
|
-
let n = e.id ??
|
|
6992
|
+
let n = e.id ?? sl();
|
|
6965
6993
|
try {
|
|
6966
6994
|
let r = await t.invoke(e.args ?? {}), a = typeof r == "string" ? r : r?.content ?? JSON.stringify(r);
|
|
6967
6995
|
i = [...i, new s({
|
|
@@ -6978,10 +7006,10 @@ async function sl(e, t, n, r) {
|
|
|
6978
7006
|
}
|
|
6979
7007
|
return "";
|
|
6980
7008
|
}
|
|
6981
|
-
function
|
|
7009
|
+
function dl(e) {
|
|
6982
7010
|
let t = e.summaryLlm ?? e.llm;
|
|
6983
7011
|
if (!t) return;
|
|
6984
|
-
let n =
|
|
7012
|
+
let n = rl(t) ? t : null, r = rl(t) ? null : t;
|
|
6985
7013
|
if (r && !r.apiKey) return;
|
|
6986
7014
|
let i = e.decisionTimeoutMs ?? 6e3, s = e.decisionMaxTokens ?? 2048, c = n;
|
|
6987
7015
|
return async (e) => {
|
|
@@ -6993,12 +7021,12 @@ function cl(e) {
|
|
|
6993
7021
|
}));
|
|
6994
7022
|
let n = c;
|
|
6995
7023
|
if (typeof n.bindTools != "function") return null;
|
|
6996
|
-
let i =
|
|
7024
|
+
let i = el({
|
|
6997
7025
|
getMessages: e.getMessages,
|
|
6998
7026
|
getSnapshot: e.getSnapshot,
|
|
6999
7027
|
contextWindow: e.contextWindow
|
|
7000
7028
|
}), 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)。`)];
|
|
7001
|
-
return
|
|
7029
|
+
return ll(await ul(l, i, d, t.signal)) || ll(await ul(l, i, [...d, new a("上一次输出无效(JSON 解析失败或 schema 校验不通过)。请只输出符合 schema 的压缩决策 JSON,不要多余文字/markdown 代码块。")], t.signal));
|
|
7002
7030
|
} catch {
|
|
7003
7031
|
return null;
|
|
7004
7032
|
} finally {
|
|
@@ -7006,22 +7034,22 @@ function cl(e) {
|
|
|
7006
7034
|
}
|
|
7007
7035
|
};
|
|
7008
7036
|
}
|
|
7009
|
-
function
|
|
7010
|
-
let t = e.llm, n =
|
|
7037
|
+
function fl(e) {
|
|
7038
|
+
let t = e.llm, n = rl(e.llm) ? void 0 : e.llm;
|
|
7011
7039
|
return {
|
|
7012
7040
|
modelCaps: oi({
|
|
7013
7041
|
model: n?.model ?? t?.model ?? t?.modelName,
|
|
7014
7042
|
contextWindow: e.contextWindow ?? n?.contextWindow ?? t?.contextWindow,
|
|
7015
7043
|
maxOutputTokens: e.maxOutputTokens ?? n?.maxOutputTokens ?? t?.maxOutputTokens
|
|
7016
7044
|
}),
|
|
7017
|
-
summaryLlmInvoke:
|
|
7018
|
-
titleLlmInvoke:
|
|
7019
|
-
compressDecisionInvoke:
|
|
7045
|
+
summaryLlmInvoke: al(e),
|
|
7046
|
+
titleLlmInvoke: ol(e),
|
|
7047
|
+
compressDecisionInvoke: dl(e)
|
|
7020
7048
|
};
|
|
7021
7049
|
}
|
|
7022
7050
|
//#endregion
|
|
7023
7051
|
//#region src/core/sdk/conflictManager.ts
|
|
7024
|
-
function
|
|
7052
|
+
function pl(e) {
|
|
7025
7053
|
let t = /* @__PURE__ */ At(null), n = 0;
|
|
7026
7054
|
function r(r) {
|
|
7027
7055
|
return new Promise((i) => {
|
|
@@ -7052,7 +7080,7 @@ function ul(e) {
|
|
|
7052
7080
|
}
|
|
7053
7081
|
//#endregion
|
|
7054
7082
|
//#region src/core/utils/id.ts
|
|
7055
|
-
function
|
|
7083
|
+
function ml() {
|
|
7056
7084
|
try {
|
|
7057
7085
|
if (typeof crypto < "u" && typeof crypto.randomUUID == "function") return crypto.randomUUID();
|
|
7058
7086
|
} catch {}
|
|
@@ -7060,7 +7088,7 @@ function dl() {
|
|
|
7060
7088
|
}
|
|
7061
7089
|
//#endregion
|
|
7062
7090
|
//#region src/core/backends/storage.ts
|
|
7063
|
-
var
|
|
7091
|
+
var hl = "chat-sdk", gl = 50 * 1024 * 1024, _l = 4 * 1024 * 1024, vl = 10 * 1024 * 1024, yl = .9, bl = 500, xl = 300, Sl = "__meta__", Cl = "v:1", wl = [
|
|
7064
7092
|
"messages",
|
|
7065
7093
|
"vfs",
|
|
7066
7094
|
"todos",
|
|
@@ -7071,51 +7099,51 @@ var fl = "chat-sdk", pl = 50 * 1024 * 1024, ml = 4 * 1024 * 1024, hl = 10 * 1024
|
|
|
7071
7099
|
"workingMemory",
|
|
7072
7100
|
"focus"
|
|
7073
7101
|
];
|
|
7074
|
-
function
|
|
7075
|
-
return e === "local" || e === "session" ?
|
|
7102
|
+
function Tl(e) {
|
|
7103
|
+
return e === "local" || e === "session" ? _l : gl;
|
|
7076
7104
|
}
|
|
7077
|
-
function
|
|
7105
|
+
function El(e) {
|
|
7078
7106
|
if (typeof e != "object" || !e) return !1;
|
|
7079
7107
|
let t = e;
|
|
7080
7108
|
return t.name === "QuotaExceededError" || t.name === "NS_ERROR_DOM_QUOTA_REACHED" || t.code === 22 || t.code === 1014;
|
|
7081
7109
|
}
|
|
7082
|
-
function
|
|
7110
|
+
function Dl(e, t, n, r) {
|
|
7083
7111
|
return [
|
|
7084
|
-
|
|
7112
|
+
Cl,
|
|
7085
7113
|
e,
|
|
7086
7114
|
t,
|
|
7087
7115
|
n,
|
|
7088
7116
|
r
|
|
7089
7117
|
].join("::");
|
|
7090
7118
|
}
|
|
7091
|
-
function
|
|
7119
|
+
function Ol(e, t, n) {
|
|
7092
7120
|
return [
|
|
7093
|
-
|
|
7121
|
+
Cl,
|
|
7094
7122
|
e,
|
|
7095
7123
|
t,
|
|
7096
7124
|
n
|
|
7097
7125
|
].join("::") + "::";
|
|
7098
7126
|
}
|
|
7099
|
-
function
|
|
7127
|
+
function kl(e, t) {
|
|
7100
7128
|
return [
|
|
7101
|
-
|
|
7129
|
+
Cl,
|
|
7102
7130
|
e,
|
|
7103
7131
|
t
|
|
7104
7132
|
].join("::") + "::";
|
|
7105
7133
|
}
|
|
7106
|
-
function
|
|
7107
|
-
return [
|
|
7134
|
+
function Al(e) {
|
|
7135
|
+
return [Cl, e].join("::") + "::";
|
|
7108
7136
|
}
|
|
7109
|
-
var
|
|
7110
|
-
function
|
|
7111
|
-
|
|
7137
|
+
var jl = null;
|
|
7138
|
+
function Ml(e) {
|
|
7139
|
+
jl ||= new TextEncoder();
|
|
7112
7140
|
try {
|
|
7113
|
-
return
|
|
7141
|
+
return jl.encode(JSON.stringify(e)).length;
|
|
7114
7142
|
} catch {
|
|
7115
7143
|
return 0;
|
|
7116
7144
|
}
|
|
7117
7145
|
}
|
|
7118
|
-
function
|
|
7146
|
+
function Nl(e, t, n) {
|
|
7119
7147
|
let r = e.reduce((e, t) => e + t.bytes, 0);
|
|
7120
7148
|
if (r <= t) return [];
|
|
7121
7149
|
let i = t * n, a = [...e].sort((e, t) => e.lastAccessed - t.lastAccessed), o = [];
|
|
@@ -7125,7 +7153,7 @@ function Al(e, t, n) {
|
|
|
7125
7153
|
}
|
|
7126
7154
|
return o;
|
|
7127
7155
|
}
|
|
7128
|
-
function
|
|
7156
|
+
function Pl() {
|
|
7129
7157
|
let e = /* @__PURE__ */ new Map();
|
|
7130
7158
|
return {
|
|
7131
7159
|
async get(t) {
|
|
@@ -7145,7 +7173,7 @@ function jl() {
|
|
|
7145
7173
|
}
|
|
7146
7174
|
};
|
|
7147
7175
|
}
|
|
7148
|
-
function
|
|
7176
|
+
function Fl(e) {
|
|
7149
7177
|
return new Promise((t, n) => {
|
|
7150
7178
|
if (typeof indexedDB > "u") {
|
|
7151
7179
|
n(/* @__PURE__ */ Error("indexedDB 不可用"));
|
|
@@ -7206,7 +7234,7 @@ function Ml(e) {
|
|
|
7206
7234
|
}, r.onerror = () => n(r.error);
|
|
7207
7235
|
});
|
|
7208
7236
|
}
|
|
7209
|
-
function
|
|
7237
|
+
function Il(e) {
|
|
7210
7238
|
return {
|
|
7211
7239
|
async get(t) {
|
|
7212
7240
|
let n = e.getItem(t);
|
|
@@ -7251,12 +7279,12 @@ function Nl(e) {
|
|
|
7251
7279
|
}
|
|
7252
7280
|
};
|
|
7253
7281
|
}
|
|
7254
|
-
function
|
|
7282
|
+
function Ll(e, t, n) {
|
|
7255
7283
|
let r = (e.get(t) ?? Promise.resolve()).then(n, n);
|
|
7256
7284
|
return e.set(t, r.then(() => void 0, () => void 0)), r;
|
|
7257
7285
|
}
|
|
7258
|
-
function
|
|
7259
|
-
let t = e.dbName ??
|
|
7286
|
+
function Rl(e = {}) {
|
|
7287
|
+
let t = e.dbName ?? hl, n = e.backend ?? "indexed", r = e.maxBytes ?? Tl(n), i = e.maxBytesPerSession ?? vl, a = e.evictionWatermark ?? yl, o = e.debounceMs ?? bl, s = /* @__PURE__ */ new Set();
|
|
7260
7288
|
function c(e) {
|
|
7261
7289
|
for (let t of s) try {
|
|
7262
7290
|
t(e);
|
|
@@ -7269,16 +7297,16 @@ function Fl(e = {}) {
|
|
|
7269
7297
|
try {
|
|
7270
7298
|
if (n === "indexed") {
|
|
7271
7299
|
if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
|
|
7272
|
-
l = await
|
|
7300
|
+
l = await Fl(t), d(!0);
|
|
7273
7301
|
} else if (n === "session") {
|
|
7274
7302
|
if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
|
|
7275
|
-
l =
|
|
7303
|
+
l = Il(sessionStorage), d(!0);
|
|
7276
7304
|
} else if (n === "local") {
|
|
7277
7305
|
if (typeof localStorage > "u") throw Error("localStorage 不可用");
|
|
7278
|
-
l =
|
|
7279
|
-
} else l =
|
|
7306
|
+
l = Il(localStorage), d(!0);
|
|
7307
|
+
} else l = Pl(), d(!1);
|
|
7280
7308
|
} catch (e) {
|
|
7281
|
-
l =
|
|
7309
|
+
l = Pl();
|
|
7282
7310
|
let t = e instanceof Error ? e.message : String(e);
|
|
7283
7311
|
d(!1), Promise.resolve().then(() => c({
|
|
7284
7312
|
type: "degraded",
|
|
@@ -7288,10 +7316,10 @@ function Fl(e = {}) {
|
|
|
7288
7316
|
})();
|
|
7289
7317
|
let p = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map();
|
|
7290
7318
|
function g(e, n, r, a) {
|
|
7291
|
-
let o =
|
|
7292
|
-
return
|
|
7319
|
+
let o = Dl(t, r, a, Sl);
|
|
7320
|
+
return Ll(h, o, async () => {
|
|
7293
7321
|
let t = async () => {
|
|
7294
|
-
let t = await l.get(o), s = await l.get(e), u = s == null ? 0 :
|
|
7322
|
+
let t = await l.get(o), s = await l.get(e), u = s == null ? 0 : Ml(s), d = Ml(n), f = (t?.bytes ?? 0) + (d - u);
|
|
7295
7323
|
if (f > i) {
|
|
7296
7324
|
c({
|
|
7297
7325
|
type: "quota",
|
|
@@ -7313,12 +7341,12 @@ function Fl(e = {}) {
|
|
|
7313
7341
|
try {
|
|
7314
7342
|
await t();
|
|
7315
7343
|
} catch (e) {
|
|
7316
|
-
if (
|
|
7344
|
+
if (El(e) && !u) {
|
|
7317
7345
|
u = !0;
|
|
7318
7346
|
try {
|
|
7319
7347
|
await b();
|
|
7320
7348
|
} catch {}
|
|
7321
|
-
l =
|
|
7349
|
+
l = Pl(), Promise.resolve().then(() => c({
|
|
7322
7350
|
type: "degraded",
|
|
7323
7351
|
reason: "存储配额超限(QuotaExceededError),已淘汰最旧会话并降级内存"
|
|
7324
7352
|
}));
|
|
@@ -7330,7 +7358,7 @@ function Fl(e = {}) {
|
|
|
7330
7358
|
});
|
|
7331
7359
|
}
|
|
7332
7360
|
function _(e, n, r, i) {
|
|
7333
|
-
let a =
|
|
7361
|
+
let a = Dl(t, e, n, r), s = p.get(a);
|
|
7334
7362
|
s && s.resolve();
|
|
7335
7363
|
let c = m.get(a);
|
|
7336
7364
|
return c && clearTimeout(c), new Promise((t) => {
|
|
@@ -7357,15 +7385,15 @@ function Fl(e = {}) {
|
|
|
7357
7385
|
function y() {
|
|
7358
7386
|
v ||= setTimeout(() => {
|
|
7359
7387
|
v = null, b();
|
|
7360
|
-
},
|
|
7388
|
+
}, xl);
|
|
7361
7389
|
}
|
|
7362
7390
|
async function b() {
|
|
7363
7391
|
let e = [];
|
|
7364
|
-
await l.scan(
|
|
7392
|
+
await l.scan(Al(t), (t, n) => {
|
|
7365
7393
|
t.endsWith("::__meta__") && e.push(n);
|
|
7366
7394
|
});
|
|
7367
|
-
let n =
|
|
7368
|
-
for (let e of n) await l.clearPrefix(
|
|
7395
|
+
let n = Nl(e, r, a);
|
|
7396
|
+
for (let e of n) await l.clearPrefix(Ol(t, e.agentId, e.sessionId)), c({
|
|
7369
7397
|
type: "evicted",
|
|
7370
7398
|
agentId: e.agentId,
|
|
7371
7399
|
sessionId: e.sessionId,
|
|
@@ -7376,13 +7404,13 @@ function Fl(e = {}) {
|
|
|
7376
7404
|
ready: f,
|
|
7377
7405
|
async listSessions(e) {
|
|
7378
7406
|
let n = [];
|
|
7379
|
-
return await l.scan(
|
|
7407
|
+
return await l.scan(kl(t, e), (e, t) => {
|
|
7380
7408
|
e.endsWith("::__meta__") && n.push(t);
|
|
7381
7409
|
}), n.sort((e, t) => t.lastAccessed - e.lastAccessed);
|
|
7382
7410
|
},
|
|
7383
7411
|
async load(e, n) {
|
|
7384
|
-
let r =
|
|
7385
|
-
return await
|
|
7412
|
+
let r = Dl(t, e, n, Sl);
|
|
7413
|
+
return await Ll(h, r, async () => {
|
|
7386
7414
|
let i = await l.get(r);
|
|
7387
7415
|
if (!i) return;
|
|
7388
7416
|
let a = {
|
|
@@ -7391,8 +7419,8 @@ function Fl(e = {}) {
|
|
|
7391
7419
|
todos: [],
|
|
7392
7420
|
memory: ""
|
|
7393
7421
|
};
|
|
7394
|
-
for (let r of
|
|
7395
|
-
let i = await l.get(
|
|
7422
|
+
for (let r of wl) {
|
|
7423
|
+
let i = await l.get(Dl(t, e, n, r));
|
|
7396
7424
|
i != null && (a[r] = i);
|
|
7397
7425
|
}
|
|
7398
7426
|
return i.lastAccessed = Date.now(), await l.set(r, i), a;
|
|
@@ -7400,12 +7428,12 @@ function Fl(e = {}) {
|
|
|
7400
7428
|
},
|
|
7401
7429
|
async save(e, t, n) {
|
|
7402
7430
|
let r = [];
|
|
7403
|
-
for (let i of
|
|
7431
|
+
for (let i of wl) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
|
|
7404
7432
|
await Promise.all(r);
|
|
7405
7433
|
},
|
|
7406
7434
|
async updateTitle(e, n, r) {
|
|
7407
|
-
let i =
|
|
7408
|
-
return
|
|
7435
|
+
let i = Dl(t, e, n, Sl);
|
|
7436
|
+
return Ll(h, i, async () => {
|
|
7409
7437
|
let e = await l.get(i);
|
|
7410
7438
|
e && (e.title = r, e.lastAccessed = Date.now(), await l.set(i, e));
|
|
7411
7439
|
});
|
|
@@ -7421,13 +7449,13 @@ function Fl(e = {}) {
|
|
|
7421
7449
|
})), c({ type: "flush" }), await b();
|
|
7422
7450
|
},
|
|
7423
7451
|
async deleteSession(e, n) {
|
|
7424
|
-
let r =
|
|
7452
|
+
let r = Ol(t, e, n);
|
|
7425
7453
|
for (let [e, t] of p.entries()) e.startsWith(r) && (t.resolve(), p.delete(e));
|
|
7426
7454
|
for (let [e, t] of m.entries()) e.startsWith(r) && (clearTimeout(t), m.delete(e));
|
|
7427
7455
|
await l.clearPrefix(r);
|
|
7428
7456
|
},
|
|
7429
7457
|
async createSession(e, n, r) {
|
|
7430
|
-
let i = r ??
|
|
7458
|
+
let i = r ?? ml(), a = Date.now(), o = {
|
|
7431
7459
|
agentId: e,
|
|
7432
7460
|
sessionId: i,
|
|
7433
7461
|
createdAt: a,
|
|
@@ -7435,7 +7463,7 @@ function Fl(e = {}) {
|
|
|
7435
7463
|
bytes: 0,
|
|
7436
7464
|
title: n
|
|
7437
7465
|
};
|
|
7438
|
-
return await l.set(
|
|
7466
|
+
return await l.set(Dl(t, e, i, Sl), o), i;
|
|
7439
7467
|
},
|
|
7440
7468
|
onEvent(e) {
|
|
7441
7469
|
s.add(e);
|
|
@@ -7450,15 +7478,15 @@ function Fl(e = {}) {
|
|
|
7450
7478
|
}
|
|
7451
7479
|
//#endregion
|
|
7452
7480
|
//#region src/core/sdk/optionsResolver.ts
|
|
7453
|
-
function
|
|
7454
|
-
return e === void 0 ?
|
|
7481
|
+
function zl(e) {
|
|
7482
|
+
return e === void 0 ? Rl({ backend: "memory" }) : e === !1 ? null : typeof e == "string" ? Rl({ backend: e }) : e.enabled === !1 ? null : Rl(e);
|
|
7455
7483
|
}
|
|
7456
|
-
function
|
|
7484
|
+
function Bl(e) {
|
|
7457
7485
|
return e.dialog ?? {};
|
|
7458
7486
|
}
|
|
7459
7487
|
//#endregion
|
|
7460
7488
|
//#region src/core/capabilities.ts
|
|
7461
|
-
var
|
|
7489
|
+
var Vl = [
|
|
7462
7490
|
{
|
|
7463
7491
|
name: "dataOps",
|
|
7464
7492
|
defaultOn: !0
|
|
@@ -7551,13 +7579,13 @@ var Rl = [
|
|
|
7551
7579
|
defaultOn: !1
|
|
7552
7580
|
}
|
|
7553
7581
|
];
|
|
7554
|
-
function
|
|
7582
|
+
function Hl(e) {
|
|
7555
7583
|
let t = {};
|
|
7556
|
-
for (let n of
|
|
7584
|
+
for (let n of Vl) {
|
|
7557
7585
|
let r = e?.[n.name];
|
|
7558
7586
|
t[n.name] = n.defaultOn ? r !== !1 : r === !0;
|
|
7559
7587
|
}
|
|
7560
|
-
for (let e of
|
|
7588
|
+
for (let e of Vl) if (e.requires && t[e.name]) {
|
|
7561
7589
|
for (let n of e.requires) if (!t[n]) {
|
|
7562
7590
|
t[e.name] = !1;
|
|
7563
7591
|
break;
|
|
@@ -7567,7 +7595,7 @@ function zl(e) {
|
|
|
7567
7595
|
}
|
|
7568
7596
|
//#endregion
|
|
7569
7597
|
//#region src/core/sdk/events.ts
|
|
7570
|
-
function
|
|
7598
|
+
function Ul(e) {
|
|
7571
7599
|
let t = /* @__PURE__ */ new Set(), n = (n) => {
|
|
7572
7600
|
if (n.type !== "approval_request") {
|
|
7573
7601
|
if (e) try {
|
|
@@ -7593,7 +7621,7 @@ function Bl(e) {
|
|
|
7593
7621
|
}
|
|
7594
7622
|
//#endregion
|
|
7595
7623
|
//#region src/core/sdk/contextPreset.ts
|
|
7596
|
-
var
|
|
7624
|
+
var Wl = {
|
|
7597
7625
|
auto: {
|
|
7598
7626
|
summaryThresholdRatio: .5,
|
|
7599
7627
|
windowRatio: .4,
|
|
@@ -7621,7 +7649,7 @@ var Vl = {
|
|
|
7621
7649
|
enableRecall: !0,
|
|
7622
7650
|
enableLLMSummary: !0
|
|
7623
7651
|
}
|
|
7624
|
-
},
|
|
7652
|
+
}, Gl = {
|
|
7625
7653
|
auto: ["describe_data", "read"],
|
|
7626
7654
|
conservative: ["describe_data"],
|
|
7627
7655
|
aggressive: ["describe_data", "read"],
|
|
@@ -7632,8 +7660,8 @@ var Vl = {
|
|
|
7632
7660
|
"search_data"
|
|
7633
7661
|
]
|
|
7634
7662
|
};
|
|
7635
|
-
function
|
|
7636
|
-
let n =
|
|
7663
|
+
function Kl(e, t) {
|
|
7664
|
+
let n = Wl[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
|
|
7637
7665
|
return {
|
|
7638
7666
|
...n,
|
|
7639
7667
|
...r,
|
|
@@ -7643,7 +7671,7 @@ function Ul(e, t) {
|
|
|
7643
7671
|
}
|
|
7644
7672
|
//#endregion
|
|
7645
7673
|
//#region src/core/sdk/middlewareStack.ts
|
|
7646
|
-
var
|
|
7674
|
+
var ql = {
|
|
7647
7675
|
dataHint: 10,
|
|
7648
7676
|
usageHints: 20,
|
|
7649
7677
|
todos: 30,
|
|
@@ -7660,17 +7688,17 @@ var Wl = {
|
|
|
7660
7688
|
subagents: 140,
|
|
7661
7689
|
augmentSystem: 150
|
|
7662
7690
|
};
|
|
7663
|
-
function
|
|
7691
|
+
function Jl(e) {
|
|
7664
7692
|
return e.map((e, t) => ({
|
|
7665
7693
|
m: e,
|
|
7666
7694
|
i: t,
|
|
7667
|
-
p:
|
|
7695
|
+
p: ql[e.name] ?? Infinity
|
|
7668
7696
|
})).sort((e, t) => e.p - t.p || e.i - t.i).map((e) => e.m);
|
|
7669
7697
|
}
|
|
7670
7698
|
//#endregion
|
|
7671
7699
|
//#region src/core/tools/dataSlotQuery.ts
|
|
7672
|
-
var
|
|
7673
|
-
function
|
|
7700
|
+
var Yl = /[\w$-]/;
|
|
7701
|
+
function Xl(e) {
|
|
7674
7702
|
let t = [], n = e.trim(), r = +(n[0] === "$");
|
|
7675
7703
|
for (; r < n.length;) {
|
|
7676
7704
|
let e = n[r];
|
|
@@ -7681,7 +7709,7 @@ function ql(e) {
|
|
|
7681
7709
|
continue;
|
|
7682
7710
|
}
|
|
7683
7711
|
let e = "";
|
|
7684
|
-
for (; r < n.length &&
|
|
7712
|
+
for (; r < n.length && Yl.test(n[r]);) e += n[r++];
|
|
7685
7713
|
if (!e) throw Error("JSONPath: .. 后缺属性名");
|
|
7686
7714
|
t.push({
|
|
7687
7715
|
type: "descendKey",
|
|
@@ -7694,7 +7722,7 @@ function ql(e) {
|
|
|
7694
7722
|
continue;
|
|
7695
7723
|
}
|
|
7696
7724
|
let e = "";
|
|
7697
|
-
for (; r < n.length &&
|
|
7725
|
+
for (; r < n.length && Yl.test(n[r]);) e += n[r++];
|
|
7698
7726
|
if (!e) throw Error("JSONPath: . 后缺属性名");
|
|
7699
7727
|
t.push({
|
|
7700
7728
|
type: "key",
|
|
@@ -7750,7 +7778,7 @@ function ql(e) {
|
|
|
7750
7778
|
}
|
|
7751
7779
|
return t;
|
|
7752
7780
|
}
|
|
7753
|
-
function
|
|
7781
|
+
function Zl(e) {
|
|
7754
7782
|
let t = [], n = 0, r = e.trim();
|
|
7755
7783
|
for (; n < r.length;) {
|
|
7756
7784
|
let e = r[n];
|
|
@@ -7795,7 +7823,7 @@ function Jl(e) {
|
|
|
7795
7823
|
}
|
|
7796
7824
|
return t;
|
|
7797
7825
|
}
|
|
7798
|
-
var
|
|
7826
|
+
var Ql = class {
|
|
7799
7827
|
toks;
|
|
7800
7828
|
item;
|
|
7801
7829
|
pos = 0;
|
|
@@ -7831,12 +7859,12 @@ var Yl = class {
|
|
|
7831
7859
|
return this.next(), e;
|
|
7832
7860
|
}
|
|
7833
7861
|
let e = this.operand(), t = this.peek();
|
|
7834
|
-
return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(),
|
|
7862
|
+
return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), tu(t, e, this.operand())) : $l(e);
|
|
7835
7863
|
}
|
|
7836
7864
|
operand() {
|
|
7837
7865
|
let e = this.next();
|
|
7838
7866
|
if (e === void 0) throw Error("过滤表达式:缺操作数");
|
|
7839
|
-
if (e.startsWith("@")) return
|
|
7867
|
+
if (e.startsWith("@")) return eu(e, this.item);
|
|
7840
7868
|
if (e[0] === "'" || e[0] === "\"") return e.slice(1, -1);
|
|
7841
7869
|
if (e === "true") return !0;
|
|
7842
7870
|
if (e === "false") return !1;
|
|
@@ -7846,10 +7874,10 @@ var Yl = class {
|
|
|
7846
7874
|
throw Error(`过滤表达式:未知操作数 '${e}'`);
|
|
7847
7875
|
}
|
|
7848
7876
|
};
|
|
7849
|
-
function
|
|
7877
|
+
function $l(e) {
|
|
7850
7878
|
return !!e && e !== 0 && e !== "" && e !== null;
|
|
7851
7879
|
}
|
|
7852
|
-
function
|
|
7880
|
+
function eu(e, t) {
|
|
7853
7881
|
let n = e.split(".").filter((e) => e && e !== "@"), r = t;
|
|
7854
7882
|
for (let e of n) {
|
|
7855
7883
|
if (typeof r != "object" || !r) return;
|
|
@@ -7857,7 +7885,7 @@ function Zl(e, t) {
|
|
|
7857
7885
|
}
|
|
7858
7886
|
return r;
|
|
7859
7887
|
}
|
|
7860
|
-
function
|
|
7888
|
+
function tu(e, t, n) {
|
|
7861
7889
|
switch (e) {
|
|
7862
7890
|
case "==": return t === n;
|
|
7863
7891
|
case "!=": return t !== n;
|
|
@@ -7868,47 +7896,47 @@ function Ql(e, t, n) {
|
|
|
7868
7896
|
default: return !1;
|
|
7869
7897
|
}
|
|
7870
7898
|
}
|
|
7871
|
-
function
|
|
7872
|
-
return new
|
|
7899
|
+
function nu(e, t) {
|
|
7900
|
+
return new Ql(Zl(e), t).parse();
|
|
7873
7901
|
}
|
|
7874
|
-
function
|
|
7902
|
+
function ru(e, t) {
|
|
7875
7903
|
return e ? `${e}.${t}` : String(t);
|
|
7876
7904
|
}
|
|
7877
|
-
function
|
|
7905
|
+
function iu(e, t) {
|
|
7878
7906
|
let n = [{
|
|
7879
7907
|
path: "",
|
|
7880
7908
|
value: e
|
|
7881
7909
|
}];
|
|
7882
|
-
for (let e of
|
|
7910
|
+
for (let e of Xl(t)) {
|
|
7883
7911
|
let t = [];
|
|
7884
7912
|
if (e.type === "key") for (let r of n) r.value != null && typeof r.value == "object" && e.key in r.value && t.push({
|
|
7885
|
-
path:
|
|
7913
|
+
path: ru(r.path, e.key),
|
|
7886
7914
|
value: r.value[e.key]
|
|
7887
7915
|
});
|
|
7888
7916
|
else if (e.type === "index") {
|
|
7889
7917
|
for (let r of n) if (Array.isArray(r.value)) {
|
|
7890
7918
|
let n = r.value[e.index];
|
|
7891
7919
|
e.index >= 0 && e.index < r.value.length && t.push({
|
|
7892
|
-
path:
|
|
7920
|
+
path: ru(r.path, e.index),
|
|
7893
7921
|
value: n,
|
|
7894
7922
|
index: e.index
|
|
7895
7923
|
});
|
|
7896
7924
|
}
|
|
7897
7925
|
} else if (e.type === "wildcard") {
|
|
7898
7926
|
for (let e of n) if (Array.isArray(e.value)) e.value.forEach((n, r) => t.push({
|
|
7899
|
-
path:
|
|
7927
|
+
path: ru(e.path, r),
|
|
7900
7928
|
value: n,
|
|
7901
7929
|
index: r
|
|
7902
7930
|
}));
|
|
7903
7931
|
else if (e.value != null && typeof e.value == "object") for (let n of Object.keys(e.value)) t.push({
|
|
7904
|
-
path:
|
|
7932
|
+
path: ru(e.path, n),
|
|
7905
7933
|
value: e.value[n]
|
|
7906
7934
|
});
|
|
7907
7935
|
} else if (e.type === "descendKey") {
|
|
7908
7936
|
let r = e.key, i = (e) => {
|
|
7909
7937
|
if (!(e.value == null || typeof e.value != "object")) for (let n of Object.keys(e.value)) {
|
|
7910
7938
|
let a = {
|
|
7911
|
-
path:
|
|
7939
|
+
path: ru(e.path, n),
|
|
7912
7940
|
value: e.value[n]
|
|
7913
7941
|
};
|
|
7914
7942
|
n === r && t.push(a), i(a);
|
|
@@ -7919,7 +7947,7 @@ function tu(e, t) {
|
|
|
7919
7947
|
let e = (n) => {
|
|
7920
7948
|
if (!(n.value == null || typeof n.value != "object")) for (let r of Object.keys(n.value)) {
|
|
7921
7949
|
let i = {
|
|
7922
|
-
path:
|
|
7950
|
+
path: ru(n.path, r),
|
|
7923
7951
|
value: n.value[r]
|
|
7924
7952
|
};
|
|
7925
7953
|
t.push(i), e(i);
|
|
@@ -7928,16 +7956,16 @@ function tu(e, t) {
|
|
|
7928
7956
|
for (let t of n) e(t);
|
|
7929
7957
|
} else if (e.type === "filter") {
|
|
7930
7958
|
for (let r of n) if (Array.isArray(r.value)) r.value.forEach((n, i) => {
|
|
7931
|
-
|
|
7932
|
-
path:
|
|
7959
|
+
nu(e.filter, n) && t.push({
|
|
7960
|
+
path: ru(r.path, i),
|
|
7933
7961
|
value: n,
|
|
7934
7962
|
index: i
|
|
7935
7963
|
});
|
|
7936
7964
|
});
|
|
7937
7965
|
else if (r.value != null && typeof r.value == "object") for (let n of Object.keys(r.value)) {
|
|
7938
7966
|
let i = r.value[n];
|
|
7939
|
-
|
|
7940
|
-
path:
|
|
7967
|
+
nu(e.filter, i) && t.push({
|
|
7968
|
+
path: ru(r.path, n),
|
|
7941
7969
|
value: i
|
|
7942
7970
|
});
|
|
7943
7971
|
}
|
|
@@ -7946,7 +7974,7 @@ function tu(e, t) {
|
|
|
7946
7974
|
}
|
|
7947
7975
|
return n;
|
|
7948
7976
|
}
|
|
7949
|
-
function
|
|
7977
|
+
function au(e, t) {
|
|
7950
7978
|
let n = e.length, r = t.length;
|
|
7951
7979
|
if (!n) return r;
|
|
7952
7980
|
if (!r) return n;
|
|
@@ -7962,7 +7990,7 @@ function nu(e, t) {
|
|
|
7962
7990
|
}
|
|
7963
7991
|
return i[r];
|
|
7964
7992
|
}
|
|
7965
|
-
function
|
|
7993
|
+
function ou(e, t, n = {}) {
|
|
7966
7994
|
let r = n.mode || "substring", i = n.limit ?? 50, a = n.matchKey !== !1, o = [], s = null;
|
|
7967
7995
|
if (r === "regex") try {
|
|
7968
7996
|
s = new RegExp(t, "i");
|
|
@@ -7972,11 +8000,11 @@ function ru(e, t, n = {}) {
|
|
|
7972
8000
|
let c = (e, l, u) => {
|
|
7973
8001
|
if (o.length >= i || e == null) return;
|
|
7974
8002
|
if (typeof e == "object") {
|
|
7975
|
-
if (Array.isArray(e)) e.forEach((e, t) => c(e,
|
|
7976
|
-
else for (let t of Object.keys(e)) c(e[t],
|
|
8003
|
+
if (Array.isArray(e)) e.forEach((e, t) => c(e, ru(l, t), String(t)));
|
|
8004
|
+
else for (let t of Object.keys(e)) c(e[t], ru(l, t), t);
|
|
7977
8005
|
return;
|
|
7978
8006
|
}
|
|
7979
|
-
let d = String(e), f =
|
|
8007
|
+
let d = String(e), f = su(d, t, r, n.fuzzyThreshold ?? 2, s);
|
|
7980
8008
|
if (f) {
|
|
7981
8009
|
o.push({
|
|
7982
8010
|
path: l,
|
|
@@ -7987,7 +8015,7 @@ function ru(e, t, n = {}) {
|
|
|
7987
8015
|
return;
|
|
7988
8016
|
}
|
|
7989
8017
|
if (a && u) {
|
|
7990
|
-
let e =
|
|
8018
|
+
let e = su(u, t, r, n.fuzzyThreshold ?? 2, s);
|
|
7991
8019
|
e && o.push({
|
|
7992
8020
|
path: l,
|
|
7993
8021
|
key: u,
|
|
@@ -7998,51 +8026,51 @@ function ru(e, t, n = {}) {
|
|
|
7998
8026
|
};
|
|
7999
8027
|
return c(e, ""), o;
|
|
8000
8028
|
}
|
|
8001
|
-
function
|
|
8029
|
+
function su(e, t, n, r, i) {
|
|
8002
8030
|
let a = e.toLowerCase(), o = t.toLowerCase();
|
|
8003
8031
|
if (n === "substring") return a.includes(o) ? 1 : null;
|
|
8004
8032
|
if (n === "regex") return i && i.test(e) ? 1 : null;
|
|
8005
8033
|
if (n === "fuzzy") {
|
|
8006
8034
|
if (a.includes(o)) return 2;
|
|
8007
|
-
let e =
|
|
8035
|
+
let e = au(a, o);
|
|
8008
8036
|
return e <= r ? r - e + 1 : null;
|
|
8009
8037
|
}
|
|
8010
8038
|
return null;
|
|
8011
8039
|
}
|
|
8012
|
-
function
|
|
8040
|
+
function cu(e, t, n = 3e3) {
|
|
8013
8041
|
return ao(t, n)(e);
|
|
8014
8042
|
}
|
|
8015
8043
|
//#endregion
|
|
8016
8044
|
//#region src/core/tools/resources.ts
|
|
8017
|
-
var
|
|
8018
|
-
function
|
|
8019
|
-
return `${
|
|
8045
|
+
var lu = "⟦frozen:", uu = "⟦res:", du = "⟧";
|
|
8046
|
+
function fu(e) {
|
|
8047
|
+
return `${lu}${e}${du}`;
|
|
8020
8048
|
}
|
|
8021
|
-
function
|
|
8022
|
-
return `${
|
|
8049
|
+
function pu(e) {
|
|
8050
|
+
return `${uu}${e}${du}`;
|
|
8023
8051
|
}
|
|
8024
|
-
function
|
|
8025
|
-
return typeof e == "string" ? e.startsWith(
|
|
8052
|
+
function mu(e) {
|
|
8053
|
+
return typeof e == "string" ? e.startsWith(lu) && e.endsWith(du) ? {
|
|
8026
8054
|
type: "frozen",
|
|
8027
8055
|
path: e.slice(8, e.length - 1)
|
|
8028
|
-
} : e.startsWith(
|
|
8056
|
+
} : e.startsWith(uu) && e.endsWith(du) ? {
|
|
8029
8057
|
type: "res",
|
|
8030
8058
|
handle: e.slice(5, e.length - 1)
|
|
8031
8059
|
} : null : null;
|
|
8032
8060
|
}
|
|
8033
|
-
function
|
|
8061
|
+
function hu(e) {
|
|
8034
8062
|
return String(e ?? "").trim().replace(/^\.+/, "");
|
|
8035
8063
|
}
|
|
8036
|
-
function
|
|
8064
|
+
function gu(e) {
|
|
8037
8065
|
let t = 5381;
|
|
8038
8066
|
for (let n = 0; n < e.length; n++) t = (t * 33 ^ e.charCodeAt(n)) >>> 0;
|
|
8039
8067
|
return (t >>> 0).toString(16).padStart(8, "0").slice(0, 8);
|
|
8040
8068
|
}
|
|
8041
|
-
function
|
|
8069
|
+
function _u(e, t) {
|
|
8042
8070
|
return e === t ? !0 : e && t && typeof e == "object" && typeof t == "object" ? JSON.stringify(e) === JSON.stringify(t) : !1;
|
|
8043
8071
|
}
|
|
8044
|
-
function
|
|
8045
|
-
let n =
|
|
8072
|
+
function vu(e, t) {
|
|
8073
|
+
let n = hu(e);
|
|
8046
8074
|
if (!n) return;
|
|
8047
8075
|
let r = t.get(n);
|
|
8048
8076
|
if (r) return {
|
|
@@ -8062,7 +8090,7 @@ function hu(e, t) {
|
|
|
8062
8090
|
}));
|
|
8063
8091
|
return i;
|
|
8064
8092
|
}
|
|
8065
|
-
var
|
|
8093
|
+
var yu = class {
|
|
8066
8094
|
vfs;
|
|
8067
8095
|
constructor(e) {
|
|
8068
8096
|
this.vfs = e;
|
|
@@ -8071,7 +8099,7 @@ var gu = class {
|
|
|
8071
8099
|
return `resources/${e}.json`;
|
|
8072
8100
|
}
|
|
8073
8101
|
ensure(e, t, n) {
|
|
8074
|
-
let r =
|
|
8102
|
+
let r = gu(e), i = {
|
|
8075
8103
|
path: e,
|
|
8076
8104
|
mode: n,
|
|
8077
8105
|
value: t,
|
|
@@ -8083,7 +8111,7 @@ var gu = class {
|
|
|
8083
8111
|
}, r;
|
|
8084
8112
|
}
|
|
8085
8113
|
get(e) {
|
|
8086
|
-
return this.readEntry(this.key(e)) || this.readEntry(this.key(
|
|
8114
|
+
return this.readEntry(this.key(e)) || this.readEntry(this.key(gu(e)));
|
|
8087
8115
|
}
|
|
8088
8116
|
readEntry(e) {
|
|
8089
8117
|
let t = this.vfs.files[e];
|
|
@@ -8099,7 +8127,7 @@ var gu = class {
|
|
|
8099
8127
|
this.ensure(e, t, n?.mode ?? "verbatim");
|
|
8100
8128
|
}
|
|
8101
8129
|
delete(e) {
|
|
8102
|
-
let t = this.get(e)?.handle ??
|
|
8130
|
+
let t = this.get(e)?.handle ?? gu(e), n = this.key(t), r = !!this.vfs.files[n];
|
|
8103
8131
|
return r && delete this.vfs.files[n], r;
|
|
8104
8132
|
}
|
|
8105
8133
|
list() {
|
|
@@ -8119,7 +8147,7 @@ var gu = class {
|
|
|
8119
8147
|
for (let e of Object.keys(this.vfs.files)) e.startsWith("resources/") && delete this.vfs.files[e];
|
|
8120
8148
|
}
|
|
8121
8149
|
};
|
|
8122
|
-
function
|
|
8150
|
+
function bu(e) {
|
|
8123
8151
|
let { jp: t, resolved: n, resourcesByPath: r, resourceStore: i } = e;
|
|
8124
8152
|
if (!r.size) return n;
|
|
8125
8153
|
let a = !1;
|
|
@@ -8133,14 +8161,14 @@ function _u(e) {
|
|
|
8133
8161
|
if (t !== "" && e !== t && !e.startsWith(t + ".")) continue;
|
|
8134
8162
|
if (e === t) {
|
|
8135
8163
|
if (o === void 0) continue;
|
|
8136
|
-
return n.mode === "freeze" ?
|
|
8164
|
+
return n.mode === "freeze" ? fu(e) : i ? pu(i.ensure(e, o, "verbatim")) : o;
|
|
8137
8165
|
}
|
|
8138
8166
|
let r = t === "" ? e : e.slice(t.length + 1), a = Z(o, r);
|
|
8139
|
-
a !== void 0 && (n.mode === "freeze" ? Na(o, r,
|
|
8167
|
+
a !== void 0 && (n.mode === "freeze" ? Na(o, r, fu(e)) : i && Na(o, r, pu(i.ensure(e, a, "verbatim"))));
|
|
8140
8168
|
}
|
|
8141
8169
|
return o;
|
|
8142
8170
|
}
|
|
8143
|
-
function
|
|
8171
|
+
function xu(e, t, n, r) {
|
|
8144
8172
|
if (!r) return {
|
|
8145
8173
|
code: "RESOURCE_NOT_FOUND",
|
|
8146
8174
|
message: `句柄 "${e}" 无法展开(资源池未启用)`,
|
|
@@ -8151,7 +8179,7 @@ function vu(e, t, n, r) {
|
|
|
8151
8179
|
code: "RESOURCE_NOT_FOUND",
|
|
8152
8180
|
message: `字段 "${t}" 在 bind 中已不存在,无法展开句柄 "${e}"`,
|
|
8153
8181
|
hint: "该字段可能已被删除或 restore 到不含此字段的快照;重新 read 确认当前结构"
|
|
8154
|
-
} :
|
|
8182
|
+
} : _u(i.value, n) ? { value: i.value } : (r.update(t, n), { value: n }) : n === void 0 ? {
|
|
8155
8183
|
code: "RESOURCE_NOT_FOUND",
|
|
8156
8184
|
message: `句柄 "${e}" 不存在(字段 "${t}" 可能未注册或已被删除)`,
|
|
8157
8185
|
hint: "重新 read 该字段触发懒注册"
|
|
@@ -8161,7 +8189,7 @@ function vu(e, t, n, r) {
|
|
|
8161
8189
|
hint: "重新 read 该字段触发懒注册重建句柄,再写回新句柄 ⟦res:<handle>⟧"
|
|
8162
8190
|
};
|
|
8163
8191
|
}
|
|
8164
|
-
function
|
|
8192
|
+
function Su(e, t) {
|
|
8165
8193
|
let n = t.getBind();
|
|
8166
8194
|
for (let [r, i] of t.resourcesByPath) {
|
|
8167
8195
|
let a = Z(n, r), o = Z(e, r);
|
|
@@ -8170,11 +8198,11 @@ function yu(e, t) {
|
|
|
8170
8198
|
continue;
|
|
8171
8199
|
}
|
|
8172
8200
|
if (i.mode === "freeze") {
|
|
8173
|
-
if (o ===
|
|
8201
|
+
if (o === fu(r)) {
|
|
8174
8202
|
Na(e, r, a);
|
|
8175
8203
|
continue;
|
|
8176
8204
|
}
|
|
8177
|
-
if (!
|
|
8205
|
+
if (!_u(o, a)) return {
|
|
8178
8206
|
ok: !1,
|
|
8179
8207
|
code: "FROZEN_FIELD",
|
|
8180
8208
|
path: r,
|
|
@@ -8182,9 +8210,9 @@ function yu(e, t) {
|
|
|
8182
8210
|
hint: "该字段由系统/集成方维护,LLM 不得改动。如需展示其值用 resource_get({path}) 取真值"
|
|
8183
8211
|
};
|
|
8184
8212
|
} else {
|
|
8185
|
-
let n =
|
|
8213
|
+
let n = mu(o);
|
|
8186
8214
|
if (n && n.type === "res") {
|
|
8187
|
-
let i =
|
|
8215
|
+
let i = xu(n.handle, r, a, t.resourceStore);
|
|
8188
8216
|
if ("value" in i) {
|
|
8189
8217
|
Na(e, r, i.value);
|
|
8190
8218
|
continue;
|
|
@@ -8197,7 +8225,7 @@ function yu(e, t) {
|
|
|
8197
8225
|
hint: i.hint
|
|
8198
8226
|
};
|
|
8199
8227
|
}
|
|
8200
|
-
if (!
|
|
8228
|
+
if (!_u(o, a)) return {
|
|
8201
8229
|
ok: !1,
|
|
8202
8230
|
code: "VERBATIM_MISMATCH",
|
|
8203
8231
|
path: r,
|
|
@@ -8208,7 +8236,7 @@ function yu(e, t) {
|
|
|
8208
8236
|
}
|
|
8209
8237
|
return { ok: !0 };
|
|
8210
8238
|
}
|
|
8211
|
-
function
|
|
8239
|
+
function Cu(e, t, n) {
|
|
8212
8240
|
let r = t === void 0 ? e.message : `patches[${t}]${n ? ` @ "${n}"` : ""}: ${e.message}`;
|
|
8213
8241
|
return Y({
|
|
8214
8242
|
code: e.code,
|
|
@@ -8221,28 +8249,28 @@ function bu(e, t, n) {
|
|
|
8221
8249
|
} }
|
|
8222
8250
|
});
|
|
8223
8251
|
}
|
|
8224
|
-
function
|
|
8252
|
+
function wu(e) {
|
|
8225
8253
|
let { value: t, ctx: n } = e;
|
|
8226
8254
|
if (!n || !n.resourcesByPath.size) return {
|
|
8227
8255
|
ok: !0,
|
|
8228
8256
|
value: t
|
|
8229
8257
|
};
|
|
8230
|
-
let r = Fa(t), i =
|
|
8258
|
+
let r = Fa(t), i = Su(r, n);
|
|
8231
8259
|
return i.ok ? {
|
|
8232
8260
|
ok: !0,
|
|
8233
8261
|
value: r
|
|
8234
8262
|
} : {
|
|
8235
8263
|
ok: !1,
|
|
8236
|
-
error:
|
|
8264
|
+
error: Cu(i)
|
|
8237
8265
|
};
|
|
8238
8266
|
}
|
|
8239
|
-
function
|
|
8267
|
+
function Tu(e) {
|
|
8240
8268
|
let { patches: t, clone: n, ctx: r } = e;
|
|
8241
8269
|
if (!r || !r.resourcesByPath.size) return { ok: !0 };
|
|
8242
8270
|
for (let e = 0; e < t.length; e++) {
|
|
8243
8271
|
let n = t[e];
|
|
8244
8272
|
if (n.op === "remove") {
|
|
8245
|
-
let t =
|
|
8273
|
+
let t = vu(n.jsonPath || "", r.resourcesByPath);
|
|
8246
8274
|
if (t) {
|
|
8247
8275
|
let r = t.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED", i = t.spec.mode === "freeze" ? "冻结字段不可删。如需移除请联系集成方调整 data.resources 配置" : "verbatim 字段不可直接删;先 resource_delete({path}) 释放资源保护后再删";
|
|
8248
8276
|
return {
|
|
@@ -8261,27 +8289,27 @@ function Su(e) {
|
|
|
8261
8289
|
}
|
|
8262
8290
|
}
|
|
8263
8291
|
}
|
|
8264
|
-
let i =
|
|
8292
|
+
let i = Su(n, r);
|
|
8265
8293
|
if (!i.ok) {
|
|
8266
|
-
let e =
|
|
8294
|
+
let e = Eu(i.path, t);
|
|
8267
8295
|
return {
|
|
8268
8296
|
ok: !1,
|
|
8269
|
-
error:
|
|
8297
|
+
error: Cu(i, e >= 0 ? e : void 0, e >= 0 ? t[e].jsonPath : void 0)
|
|
8270
8298
|
};
|
|
8271
8299
|
}
|
|
8272
8300
|
return { ok: !0 };
|
|
8273
8301
|
}
|
|
8274
|
-
function
|
|
8275
|
-
let n =
|
|
8302
|
+
function Eu(e, t) {
|
|
8303
|
+
let n = hu(e);
|
|
8276
8304
|
for (let e = 0; e < t.length; e++) {
|
|
8277
|
-
let r =
|
|
8305
|
+
let r = hu(t[e].jsonPath || "");
|
|
8278
8306
|
if (r && (r === n || n.startsWith(r + ".") || r.startsWith(n + "."))) return e;
|
|
8279
8307
|
}
|
|
8280
8308
|
return -1;
|
|
8281
8309
|
}
|
|
8282
8310
|
//#endregion
|
|
8283
8311
|
//#region src/core/tools/dataOps.ts
|
|
8284
|
-
var
|
|
8312
|
+
var Du = /* @__PURE__ */ new Set([
|
|
8285
8313
|
"describe_data",
|
|
8286
8314
|
"get_data",
|
|
8287
8315
|
"set_data",
|
|
@@ -8295,14 +8323,14 @@ var wu = /* @__PURE__ */ new Set([
|
|
|
8295
8323
|
"resource_update",
|
|
8296
8324
|
"resource_list",
|
|
8297
8325
|
"resource_delete"
|
|
8298
|
-
]),
|
|
8299
|
-
function
|
|
8300
|
-
return t === "advanced" ? e : t === "minimal" ? e.filter((e) =>
|
|
8326
|
+
]), Ou = /* @__PURE__ */ new Set(["read", "write"]);
|
|
8327
|
+
function ku(e, t = "simple") {
|
|
8328
|
+
return t === "advanced" ? e : t === "minimal" ? e.filter((e) => Ou.has(e.name)) : e.filter((e) => !Du.has(e.name));
|
|
8301
8329
|
}
|
|
8302
|
-
function
|
|
8330
|
+
function Au(e) {
|
|
8303
8331
|
let { bindRef: t, schema: n, allowKeys: r, snapshots: i, maxSnapshots: a, audit: o, dryRun: s, op: c = "set", protectedCtx: l } = e, u = e.value, d = e.internalAfterWrite ? Fa(t) : null;
|
|
8304
8332
|
if (l) {
|
|
8305
|
-
let e =
|
|
8333
|
+
let e = wu({
|
|
8306
8334
|
value: u,
|
|
8307
8335
|
ctx: l
|
|
8308
8336
|
});
|
|
@@ -8358,7 +8386,7 @@ function Du(e) {
|
|
|
8358
8386
|
data: f.data
|
|
8359
8387
|
};
|
|
8360
8388
|
}
|
|
8361
|
-
function
|
|
8389
|
+
function ju(e) {
|
|
8362
8390
|
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 = e.internalAfterWrite ? Fa(t) : null, p = Fa(t), m = [];
|
|
8363
8391
|
for (let e = 0; e < n.length; e++) {
|
|
8364
8392
|
let t = n[e], a = t.jsonPath || "";
|
|
@@ -8418,7 +8446,7 @@ function Ou(e) {
|
|
|
8418
8446
|
});
|
|
8419
8447
|
}
|
|
8420
8448
|
if (d) {
|
|
8421
|
-
let e =
|
|
8449
|
+
let e = Tu({
|
|
8422
8450
|
patches: n,
|
|
8423
8451
|
clone: p,
|
|
8424
8452
|
ctx: d
|
|
@@ -8469,37 +8497,37 @@ function Ou(e) {
|
|
|
8469
8497
|
clone: p
|
|
8470
8498
|
};
|
|
8471
8499
|
}
|
|
8472
|
-
function
|
|
8500
|
+
function Mu(e) {
|
|
8473
8501
|
return e < 1024 ? `${e}B` : e < 1024 * 1024 ? `${(e / 1024).toFixed(1)}KB` : `${(e / (1024 * 1024)).toFixed(1)}MB`;
|
|
8474
8502
|
}
|
|
8475
|
-
function
|
|
8503
|
+
function Nu(e, t, n, r) {
|
|
8476
8504
|
if (!t || !n.length || typeof e != "object" || !e) return e;
|
|
8477
8505
|
let i = new Set(n.map((e) => e.field)), a = Fa(e);
|
|
8478
8506
|
return (function e(t) {
|
|
8479
8507
|
if (Array.isArray(t)) for (let n of t) e(n);
|
|
8480
8508
|
else if (t && typeof t == "object") for (let n of Object.keys(t)) {
|
|
8481
8509
|
let a = t[n];
|
|
8482
|
-
typeof a == "string" && i.has(n) && a.length >= r ? t[n] = `<${n} ${
|
|
8510
|
+
typeof a == "string" && i.has(n) && a.length >= r ? t[n] = `<${n} ${Mu(a.length)}>` : e(a);
|
|
8483
8511
|
}
|
|
8484
8512
|
})(a), a;
|
|
8485
8513
|
}
|
|
8486
|
-
var
|
|
8487
|
-
function
|
|
8488
|
-
return
|
|
8514
|
+
var Pu = 0;
|
|
8515
|
+
function Fu() {
|
|
8516
|
+
return Pu++, "c_" + Math.random().toString(36).slice(2, 8) + Pu.toString(36);
|
|
8489
8517
|
}
|
|
8490
|
-
function
|
|
8518
|
+
function Iu(e, t) {
|
|
8491
8519
|
if (!(!e || typeof e != "object")) for (let n of t) {
|
|
8492
8520
|
let t = Z(e, n);
|
|
8493
|
-
if (Array.isArray(t)) for (let e of t) e && typeof e == "object" && !("__pgId" in e) && (e.__pgId =
|
|
8521
|
+
if (Array.isArray(t)) for (let e of t) e && typeof e == "object" && !("__pgId" in e) && (e.__pgId = Fu());
|
|
8494
8522
|
}
|
|
8495
8523
|
}
|
|
8496
|
-
function
|
|
8524
|
+
function Lu(e) {
|
|
8497
8525
|
(function e(t) {
|
|
8498
8526
|
if (Array.isArray(t)) t.forEach(e);
|
|
8499
8527
|
else if (t && typeof t == "object") for (let n of Object.keys(t)) n.startsWith("__pg") ? delete t[n] : e(t[n]);
|
|
8500
8528
|
})(e);
|
|
8501
8529
|
}
|
|
8502
|
-
function
|
|
8530
|
+
function Ru(e, n = {}) {
|
|
8503
8531
|
let i = n.pgIdPaths ?? [], a = i.length ? (e, t) => {
|
|
8504
8532
|
if (t && typeof t == "object") for (let n of i) {
|
|
8505
8533
|
let r = Z(t, n), i = Z(e, n);
|
|
@@ -8514,7 +8542,7 @@ function Fu(e, n = {}) {
|
|
|
8514
8542
|
if (!(!t || typeof t != "object" || "__pgId" in t)) for (let e = 0; e < r.length; e++) {
|
|
8515
8543
|
if (o.has(e)) continue;
|
|
8516
8544
|
let n = r[e];
|
|
8517
|
-
if (!(!n || typeof n != "object" || !n.__pgId) &&
|
|
8545
|
+
if (!(!n || typeof n != "object" || !n.__pgId) && _u(a(n), a(t))) {
|
|
8518
8546
|
t.__pgId = n.__pgId, o.add(e);
|
|
8519
8547
|
break;
|
|
8520
8548
|
}
|
|
@@ -8526,11 +8554,11 @@ function Fu(e, n = {}) {
|
|
|
8526
8554
|
t && n && typeof n == "object" && !("__pgId" in n) && (n.__pgId = t, o.add(e));
|
|
8527
8555
|
}
|
|
8528
8556
|
}
|
|
8529
|
-
|
|
8530
|
-
} : void 0, o = i.length ? fa(e.schema, i).schema : e.schema, s = e.bind, c = e.description ?? "主数据对象", l = Gi(o), u = /* @__PURE__ */ new Map(), d = n.vfsStore ? new
|
|
8557
|
+
Iu(e, i);
|
|
8558
|
+
} : void 0, o = i.length ? fa(e.schema, i).schema : e.schema, s = e.bind, c = e.description ?? "主数据对象", l = Gi(o), u = /* @__PURE__ */ new Map(), d = n.vfsStore ? new yu(n.vfsStore) : void 0;
|
|
8531
8559
|
function f(e) {
|
|
8532
8560
|
if (u.clear(), e) for (let t of e) {
|
|
8533
|
-
let e =
|
|
8561
|
+
let e = hu(t.path);
|
|
8534
8562
|
u.set(e, {
|
|
8535
8563
|
path: e,
|
|
8536
8564
|
mode: t.mode
|
|
@@ -8603,7 +8631,7 @@ function Fu(e, n = {}) {
|
|
|
8603
8631
|
return e;
|
|
8604
8632
|
},
|
|
8605
8633
|
createResource: d ? (e, t) => {
|
|
8606
|
-
let n =
|
|
8634
|
+
let n = hu(e), r = u.get(n), i = t === void 0 ? Z(s, n) : t;
|
|
8607
8635
|
return d.ensure(n, i, r?.mode ?? "verbatim");
|
|
8608
8636
|
} : void 0,
|
|
8609
8637
|
getResource: d ? (e) => {
|
|
@@ -8616,7 +8644,7 @@ function Fu(e, n = {}) {
|
|
|
8616
8644
|
} : void 0;
|
|
8617
8645
|
} : void 0,
|
|
8618
8646
|
updateResource: d ? (e, t) => {
|
|
8619
|
-
let n =
|
|
8647
|
+
let n = hu(e);
|
|
8620
8648
|
d.update(n, t), Na(s, n, t), T();
|
|
8621
8649
|
} : void 0,
|
|
8622
8650
|
deleteResource: d ? (e) => d.delete(e) : void 0,
|
|
@@ -8679,14 +8707,14 @@ function Fu(e, n = {}) {
|
|
|
8679
8707
|
hint: "主数据仅暴露 schema 声明的字段;若需操作该字段,集成方需在 schema 中声明它"
|
|
8680
8708
|
});
|
|
8681
8709
|
let i = r ? Z(s, r) : s;
|
|
8682
|
-
!r && l && (i = ea(i, o)), p && (i =
|
|
8710
|
+
!r && l && (i = ea(i, o)), p && (i = bu({
|
|
8683
8711
|
jp: r,
|
|
8684
8712
|
resolved: i,
|
|
8685
8713
|
resourcesByPath: p.resourcesByPath,
|
|
8686
8714
|
resourceStore: p.resourceStore
|
|
8687
8715
|
}));
|
|
8688
8716
|
let a = $(s);
|
|
8689
|
-
return b(a, n), i === void 0 ? `主数据${r ? ` @ ${r}` : ""} = (undefined) (hash=${a})` : (i =
|
|
8717
|
+
return b(a, n), i === void 0 ? `主数据${r ? ` @ ${r}` : ""} = (undefined) (hash=${a})` : (i = Nu(i, n === "", C, S), `主数据${r ? ` @ ${r}` : ""} = ${Q(i)} (hash=${a})`);
|
|
8690
8718
|
}, {
|
|
8691
8719
|
name: "get_data",
|
|
8692
8720
|
description: "@deprecated(改用 read,等价且支持 fields/depth/分页)。读取主数据当前值(返回含 hash 供乐观锁);jsonPath 可选读子路径。大结果自动外存 vfs。",
|
|
@@ -8696,7 +8724,7 @@ function Fu(e, n = {}) {
|
|
|
8696
8724
|
if (i !== null) return i;
|
|
8697
8725
|
let c = Ia(e);
|
|
8698
8726
|
if (c.parseError) return Yr("", e, c.parseError);
|
|
8699
|
-
let u =
|
|
8727
|
+
let u = Au({
|
|
8700
8728
|
bindRef: s,
|
|
8701
8729
|
value: c.parsed,
|
|
8702
8730
|
schema: o,
|
|
@@ -8743,7 +8771,7 @@ function Fu(e, n = {}) {
|
|
|
8743
8771
|
message: `edit 仅适用于对象/数组主数据,当前是 ${s === void 0 ? "undefined" : typeof s}`,
|
|
8744
8772
|
hint: "叶子(原始类型)请用 set_data 整体设置"
|
|
8745
8773
|
});
|
|
8746
|
-
let g =
|
|
8774
|
+
let g = ju({
|
|
8747
8775
|
bindRef: s,
|
|
8748
8776
|
patches: [{
|
|
8749
8777
|
op: r,
|
|
@@ -8812,7 +8840,7 @@ function Fu(e, n = {}) {
|
|
|
8812
8840
|
hint: "仅 schema 声明的 key 可删"
|
|
8813
8841
|
});
|
|
8814
8842
|
if (p) {
|
|
8815
|
-
let t =
|
|
8843
|
+
let t = vu(e, p.resourcesByPath);
|
|
8816
8844
|
if (t) return Y({
|
|
8817
8845
|
code: t.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED",
|
|
8818
8846
|
message: `delete_data @ "${e}" 命中受保护字段 "${t.protectedPath}"(${t.spec.mode}),不可删除`,
|
|
@@ -8921,7 +8949,7 @@ function Fu(e, n = {}) {
|
|
|
8921
8949
|
});
|
|
8922
8950
|
let i = l ? ea(s, o) : s, a;
|
|
8923
8951
|
try {
|
|
8924
|
-
a =
|
|
8952
|
+
a = iu(i, e);
|
|
8925
8953
|
} catch (t) {
|
|
8926
8954
|
return Y({
|
|
8927
8955
|
code: "JSONPATH_SYNTAX",
|
|
@@ -8930,7 +8958,7 @@ function Fu(e, n = {}) {
|
|
|
8930
8958
|
details: { expr: e }
|
|
8931
8959
|
});
|
|
8932
8960
|
}
|
|
8933
|
-
let c = t ?? 50, u = a.slice(0, c), d = u.map((e) => `{"path":${JSON.stringify(e.path)},"index":${e.index === void 0 ? "null" : e.index},"value":${Q(
|
|
8961
|
+
let c = t ?? 50, u = a.slice(0, c), d = u.map((e) => `{"path":${JSON.stringify(e.path)},"index":${e.index === void 0 ? "null" : e.index},"value":${Q(Nu(e.value, r === "", C, S))}}`);
|
|
8934
8962
|
return `{"matched":${a.length},"returned":${u.length},"truncated":${a.length > c},"results":[${d.join(",")}]}`;
|
|
8935
8963
|
}, {
|
|
8936
8964
|
name: "query_data",
|
|
@@ -8945,7 +8973,7 @@ function Fu(e, n = {}) {
|
|
|
8945
8973
|
message: "主数据为空,无可搜索内容"
|
|
8946
8974
|
});
|
|
8947
8975
|
try {
|
|
8948
|
-
let a =
|
|
8976
|
+
let a = ou(l ? ea(s, o) : s, e, {
|
|
8949
8977
|
mode: t,
|
|
8950
8978
|
fuzzyThreshold: n,
|
|
8951
8979
|
matchKey: r,
|
|
@@ -8996,7 +9024,7 @@ function Fu(e, n = {}) {
|
|
|
8996
9024
|
e && (u = ea(u, e));
|
|
8997
9025
|
}
|
|
8998
9026
|
} else u = l ? ea(s, o) : s;
|
|
8999
|
-
let d = Fa(u), f = await
|
|
9027
|
+
let d = Fa(u), f = await cu(d, e, c && JSON.stringify(d).length > 1e5 ? 8e3 : 3e3);
|
|
9000
9028
|
if (!f.ok) {
|
|
9001
9029
|
let t = /超时/.test(f.error || "");
|
|
9002
9030
|
return Y({
|
|
@@ -9012,7 +9040,7 @@ function Fu(e, n = {}) {
|
|
|
9012
9040
|
if (t === "transform") {
|
|
9013
9041
|
let e = f.result;
|
|
9014
9042
|
if (c) {
|
|
9015
|
-
let t =
|
|
9043
|
+
let t = ju({
|
|
9016
9044
|
bindRef: s,
|
|
9017
9045
|
patches: [{
|
|
9018
9046
|
op: "set",
|
|
@@ -9041,7 +9069,7 @@ function Fu(e, n = {}) {
|
|
|
9041
9069
|
message: `主数据 bind 为原始类型(${s === null ? "null" : typeof s}),eval transform(patches) 无法就地替换`,
|
|
9042
9070
|
hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
|
|
9043
9071
|
});
|
|
9044
|
-
let t =
|
|
9072
|
+
let t = ju({
|
|
9045
9073
|
bindRef: s,
|
|
9046
9074
|
patches: e.patches,
|
|
9047
9075
|
schema: o,
|
|
@@ -9062,7 +9090,7 @@ function Fu(e, n = {}) {
|
|
|
9062
9090
|
}
|
|
9063
9091
|
let t = e;
|
|
9064
9092
|
if (p) {
|
|
9065
|
-
let e =
|
|
9093
|
+
let e = wu({
|
|
9066
9094
|
value: t,
|
|
9067
9095
|
ctx: p
|
|
9068
9096
|
});
|
|
@@ -9114,7 +9142,7 @@ function Fu(e, n = {}) {
|
|
|
9114
9142
|
e && (c = ea(c, e));
|
|
9115
9143
|
}
|
|
9116
9144
|
let u = c;
|
|
9117
|
-
if (p && (u =
|
|
9145
|
+
if (p && (u = bu({
|
|
9118
9146
|
jp: a,
|
|
9119
9147
|
resolved: u,
|
|
9120
9148
|
resourcesByPath: p.resourcesByPath,
|
|
@@ -9124,7 +9152,7 @@ function Fu(e, n = {}) {
|
|
|
9124
9152
|
} catch (e) {
|
|
9125
9153
|
return `- ${a}: [READ_INTERCEPT: ${e.message}]`;
|
|
9126
9154
|
}
|
|
9127
|
-
return r && r.length && (u = La(u, r)), i != null && (u = Ra(u, i)), u =
|
|
9155
|
+
return r && r.length && (u = La(u, r)), i != null && (u = Ra(u, i)), u = Nu(u, f === "", C, S), u === void 0 ? `- ${a} = (undefined)` : `- ${a} = ${Q(u)}`;
|
|
9128
9156
|
});
|
|
9129
9157
|
return e && b(m, f), `多路径读取(共 ${t.length} 项,hash=${m}):\n${a.join("\n")}`;
|
|
9130
9158
|
}
|
|
@@ -9146,7 +9174,7 @@ function Fu(e, n = {}) {
|
|
|
9146
9174
|
e && (g = ea(g, e));
|
|
9147
9175
|
}
|
|
9148
9176
|
let _ = g;
|
|
9149
|
-
if (p && (_ =
|
|
9177
|
+
if (p && (_ = bu({
|
|
9150
9178
|
jp: h,
|
|
9151
9179
|
resolved: _,
|
|
9152
9180
|
resourcesByPath: p.resourcesByPath,
|
|
@@ -9159,7 +9187,7 @@ function Fu(e, n = {}) {
|
|
|
9159
9187
|
message: `read 拦截器抛错: ${e.message}`
|
|
9160
9188
|
});
|
|
9161
9189
|
}
|
|
9162
|
-
b(m, f), r && r.length && (_ = La(_, r)), i != null && (_ = Ra(_, i)), _ =
|
|
9190
|
+
b(m, f), r && r.length && (_ = La(_, r)), i != null && (_ = Ra(_, i)), _ = Nu(_, f === "", C, S);
|
|
9163
9191
|
let y = e ? "" : `主数据说明: ${c}\n格式: 写入值需为 JSON,且通过声明的 schema 校验(校验失败时 write 会返回结构化错误)。字段约束(类型/min/max/enum/必填/默认)见 systemPrompt「可操作数据」段,或用 schema_data({ jsonPath }) 按需查。\n\n`, x = r && r.length ? `(字段裁剪:${r.join(",")})` : "", w = i == null ? "" : `(深度≤${i})`, T = x || w ? ` ${x}${w}` : "";
|
|
9164
9192
|
if ((a !== void 0 || u !== void 0) && Array.isArray(_)) {
|
|
9165
9193
|
let e = _.length, t = Math.max(0, a ?? 0), n = Math.min(200, Math.max(1, u ?? 50)), r = _.slice(t, t + n), i = t + n < e;
|
|
@@ -9232,7 +9260,7 @@ function Fu(e, n = {}) {
|
|
|
9232
9260
|
hint: "仅 schema 声明的 key 可删"
|
|
9233
9261
|
});
|
|
9234
9262
|
if (p) {
|
|
9235
|
-
let e =
|
|
9263
|
+
let e = vu(t.jsonPath, p.resourcesByPath);
|
|
9236
9264
|
if (e) return Y({
|
|
9237
9265
|
code: e.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED",
|
|
9238
9266
|
message: `write delete @ "${t.jsonPath}" 命中受保护字段 "${e.protectedPath}"(${e.spec.mode}),不可删除`,
|
|
@@ -9265,7 +9293,7 @@ function Fu(e, n = {}) {
|
|
|
9265
9293
|
op: t.op ?? "set",
|
|
9266
9294
|
jsonPath: t.jsonPath || "",
|
|
9267
9295
|
value: g
|
|
9268
|
-
}]), i =
|
|
9296
|
+
}]), i = ju({
|
|
9269
9297
|
bindRef: s,
|
|
9270
9298
|
patches: n,
|
|
9271
9299
|
schema: o,
|
|
@@ -9283,13 +9311,13 @@ function Fu(e, n = {}) {
|
|
|
9283
9311
|
detail: `${i.applied.length} 个 patch${i.applied.length > 1 ? "(批量)" : ""}`,
|
|
9284
9312
|
value: i.applied.map((e) => `${e.op}@${e.jp}`),
|
|
9285
9313
|
timestamp: Date.now()
|
|
9286
|
-
}), b($(s), d),
|
|
9314
|
+
}), b($(s), d), Lu(i.clone), `已 write(edit) 主数据(${i.applied.length} 个 patch)。当前值:${Q(i.clone, 600)} (新 hash=${$(s)})`) : i.error;
|
|
9287
9315
|
}
|
|
9288
9316
|
let C = Ia(g);
|
|
9289
9317
|
if (C.parseError) return Yr("", g, C.parseError);
|
|
9290
9318
|
let w = await k("set", S);
|
|
9291
9319
|
if (w !== null) return w;
|
|
9292
|
-
let E =
|
|
9320
|
+
let E = Au({
|
|
9293
9321
|
bindRef: s,
|
|
9294
9322
|
value: C.parsed,
|
|
9295
9323
|
schema: o,
|
|
@@ -9305,7 +9333,7 @@ function Fu(e, n = {}) {
|
|
|
9305
9333
|
if (!E.ok) return E.error;
|
|
9306
9334
|
if (c) return `dryRun(set): schema 校验通过。预览新值:${Q(E.data, 600)}。未实际写入、未入快照。`;
|
|
9307
9335
|
let A = $(s);
|
|
9308
|
-
return b(A, d),
|
|
9336
|
+
return b(A, d), Lu(E.data), `已 write(set) 主数据 = ${Q(E.data, 600)} (新 hash=${A})${l ? "(白名单模式:仅更新 schema 声明字段,未声明字段保留)" : ""}`;
|
|
9309
9337
|
}, {
|
|
9310
9338
|
name: "write",
|
|
9311
9339
|
description: "写入主数据(高层入口,合并 set/edit/delete + 自动乐观锁 + 自动快照)。四意图:① 整体替换 write({value:整个对象});② 增量 write({patch:{op,jsonPath,value}}) op=set/remove/merge/append/move(move 的 value=目标路径字符串);③ 批量原子 write({patches:[...]})(任一失败整批回滚);④ 删子路径 write({patch:{jsonPath},del:true})。dryRun:true 预检不落盘。写入自动 schema 校验(失败不写,按错误修正重试)+ 自动快照。详细用法见系统提示「能力使用提示」。",
|
|
@@ -9424,7 +9452,7 @@ function Fu(e, n = {}) {
|
|
|
9424
9452
|
}
|
|
9425
9453
|
let g = await k("set", n || (x ? y(c) : void 0));
|
|
9426
9454
|
if (g !== null) return g;
|
|
9427
|
-
let _ =
|
|
9455
|
+
let _ = Au({
|
|
9428
9456
|
bindRef: s,
|
|
9429
9457
|
value: f,
|
|
9430
9458
|
schema: o,
|
|
@@ -9457,7 +9485,7 @@ function Fu(e, n = {}) {
|
|
|
9457
9485
|
message: "未提供 path 或有效 handle",
|
|
9458
9486
|
hint: "传 path(受保护字段)或 handle(占位符 ⟦res:handle⟧ 里的句柄)"
|
|
9459
9487
|
});
|
|
9460
|
-
let r =
|
|
9488
|
+
let r = hu(n);
|
|
9461
9489
|
if (!u.has(r)) return Y({
|
|
9462
9490
|
code: "RESOURCE_NOT_FOUND",
|
|
9463
9491
|
message: `"${n}" 不是受保护字段`,
|
|
@@ -9497,7 +9525,7 @@ function Fu(e, n = {}) {
|
|
|
9497
9525
|
message: "resource_update 需要 path",
|
|
9498
9526
|
hint: "传要更新的 verbatim 受保护字段路径"
|
|
9499
9527
|
});
|
|
9500
|
-
let i =
|
|
9528
|
+
let i = hu(e), a = u.get(i);
|
|
9501
9529
|
if (!a) return Y({
|
|
9502
9530
|
code: "RESOURCE_NOT_FOUND",
|
|
9503
9531
|
message: `"${e}" 不是受保护字段`,
|
|
@@ -9587,8 +9615,8 @@ function Fu(e, n = {}) {
|
|
|
9587
9615
|
}
|
|
9588
9616
|
//#endregion
|
|
9589
9617
|
//#region src/core/tools/fetchDoc.ts
|
|
9590
|
-
var
|
|
9591
|
-
let n = new AbortController(), r = setTimeout(() => n.abort(),
|
|
9618
|
+
var zu = 3e4, Bu = [r(async ({ url: e, as: t }) => {
|
|
9619
|
+
let n = new AbortController(), r = setTimeout(() => n.abort(), zu);
|
|
9592
9620
|
try {
|
|
9593
9621
|
let r = await fetch(e, {
|
|
9594
9622
|
method: "GET",
|
|
@@ -9605,7 +9633,7 @@ var Iu = 3e4, Lu = [r(async ({ url: e, as: t }) => {
|
|
|
9605
9633
|
].join("\n");
|
|
9606
9634
|
} catch (t) {
|
|
9607
9635
|
let r = t?.message || String(t);
|
|
9608
|
-
return n.signal.aborted ? `获取失败:请求超时(${
|
|
9636
|
+
return n.signal.aborted ? `获取失败:请求超时(${zu}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
|
|
9609
9637
|
} finally {
|
|
9610
9638
|
clearTimeout(r);
|
|
9611
9639
|
}
|
|
@@ -9616,7 +9644,7 @@ var Iu = 3e4, Lu = [r(async ({ url: e, as: t }) => {
|
|
|
9616
9644
|
url: t.string().describe("要抓取的 URL(同源或已配 CORS)"),
|
|
9617
9645
|
as: t.enum(["text", "markdown"]).optional().describe("返回格式标签,默认 text")
|
|
9618
9646
|
})
|
|
9619
|
-
})],
|
|
9647
|
+
})], Vu = [
|
|
9620
9648
|
"id",
|
|
9621
9649
|
"class",
|
|
9622
9650
|
"href",
|
|
@@ -9628,12 +9656,12 @@ var Iu = 3e4, Lu = [r(async ({ url: e, as: t }) => {
|
|
|
9628
9656
|
"aria-label",
|
|
9629
9657
|
"name",
|
|
9630
9658
|
"type"
|
|
9631
|
-
],
|
|
9632
|
-
function
|
|
9659
|
+
], Hu = /^(value|srcdoc|formaction|on\w+)$/i, Uu = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session/i;
|
|
9660
|
+
function Wu(e, t) {
|
|
9633
9661
|
if (!e) return null;
|
|
9634
|
-
let { depth: n, attrs: r, includeText: i = !0 } = t, a = r !== void 0, o = r ??
|
|
9662
|
+
let { depth: n, attrs: r, includeText: i = !0 } = t, a = r !== void 0, o = r ?? Vu, s = (e) => {
|
|
9635
9663
|
let t = {};
|
|
9636
|
-
for (let n of Array.from(e.attributes)) (a ? o.includes(n.name) : o.includes(n.name) || n.name.startsWith("data-")) && (
|
|
9664
|
+
for (let n of Array.from(e.attributes)) (a ? o.includes(n.name) : o.includes(n.name) || n.name.startsWith("data-")) && (Hu.test(n.name) || Uu.test(n.name) || (t[n.name] = n.value));
|
|
9637
9665
|
return t;
|
|
9638
9666
|
}, c = (e, t) => {
|
|
9639
9667
|
let n = {
|
|
@@ -9649,10 +9677,10 @@ function Vu(e, t) {
|
|
|
9649
9677
|
};
|
|
9650
9678
|
return c(e, n);
|
|
9651
9679
|
}
|
|
9652
|
-
var
|
|
9680
|
+
var Gu = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
|
|
9653
9681
|
let i = e ? document.querySelector(e) : document.body;
|
|
9654
9682
|
if (!i) return `未找到匹配元素:selector="${e}"`;
|
|
9655
|
-
let a =
|
|
9683
|
+
let a = Wu(i, {
|
|
9656
9684
|
depth: t ?? 3,
|
|
9657
9685
|
attrs: n,
|
|
9658
9686
|
includeText: r ?? !0
|
|
@@ -9667,22 +9695,22 @@ var Hu = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
|
|
|
9667
9695
|
attrs: t.array(t.string()).optional().describe("属性白名单(传了 = 严格白名单;不传 = 默认常用 + data-*)"),
|
|
9668
9696
|
includeText: t.boolean().optional().describe("是否包含直接文本(默认 true)")
|
|
9669
9697
|
})
|
|
9670
|
-
}),
|
|
9671
|
-
function
|
|
9672
|
-
if (
|
|
9698
|
+
}), Ku = [Gu], qu = /* @__PURE__ */ "display.position.visibility.opacity.color.background-color.background-image.font-size.font-weight.line-height.text-align.z-index.overflow.width.height.margin.padding.border.border-radius.box-shadow.transform.transition.animation.cursor.pointer-events.flex-direction.gap.max-width.min-height".split("."), Ju = /* @__PURE__ */ new WeakMap(), Yu = !1;
|
|
9699
|
+
function Xu() {
|
|
9700
|
+
if (Yu) return;
|
|
9673
9701
|
let e = globalThis.EventTarget;
|
|
9674
9702
|
if (!e?.prototype?.addEventListener) return;
|
|
9675
|
-
|
|
9703
|
+
Yu = !0;
|
|
9676
9704
|
let t = e.prototype.addEventListener, n = e.prototype.removeEventListener;
|
|
9677
9705
|
e.prototype.addEventListener = function(e, ...n) {
|
|
9678
9706
|
try {
|
|
9679
|
-
let t =
|
|
9680
|
-
t || (t = /* @__PURE__ */ new Map(),
|
|
9707
|
+
let t = Ju.get(this);
|
|
9708
|
+
t || (t = /* @__PURE__ */ new Map(), Ju.set(this, t)), t.set(String(e), (t.get(String(e)) ?? 0) + 1);
|
|
9681
9709
|
} catch {}
|
|
9682
9710
|
return t.call(this, e, ...n);
|
|
9683
9711
|
}, e.prototype.removeEventListener = function(e, ...t) {
|
|
9684
9712
|
try {
|
|
9685
|
-
let t =
|
|
9713
|
+
let t = Ju.get(this);
|
|
9686
9714
|
if (t) {
|
|
9687
9715
|
let n = (t.get(String(e)) ?? 1) - 1;
|
|
9688
9716
|
n <= 0 ? t.delete(String(e)) : t.set(String(e), n);
|
|
@@ -9691,10 +9719,10 @@ function qu() {
|
|
|
9691
9719
|
return n.call(this, e, ...t);
|
|
9692
9720
|
};
|
|
9693
9721
|
}
|
|
9694
|
-
function
|
|
9695
|
-
return [...
|
|
9722
|
+
function Zu(e) {
|
|
9723
|
+
return [...Ju.get(e)?.entries() ?? []].filter(([, e]) => e > 0).map(([e]) => e);
|
|
9696
9724
|
}
|
|
9697
|
-
function
|
|
9725
|
+
function Qu(e, t = 12) {
|
|
9698
9726
|
let n = [], r = e, i = 0;
|
|
9699
9727
|
for (; r && r.tagName && i < t;) {
|
|
9700
9728
|
let e = r.tagName.toLowerCase(), t = r.id;
|
|
@@ -9715,7 +9743,7 @@ function Yu(e, t = 12) {
|
|
|
9715
9743
|
}
|
|
9716
9744
|
return n.join(" > ");
|
|
9717
9745
|
}
|
|
9718
|
-
function
|
|
9746
|
+
function $u(e, t, n = {}) {
|
|
9719
9747
|
if (!e) return {
|
|
9720
9748
|
hits: [],
|
|
9721
9749
|
total: 0,
|
|
@@ -9753,7 +9781,7 @@ function Xu(e, t, n = {}) {
|
|
|
9753
9781
|
n = r.slice(Math.max(0, i - 20), i + t.length + 40);
|
|
9754
9782
|
}
|
|
9755
9783
|
return {
|
|
9756
|
-
selector:
|
|
9784
|
+
selector: Qu(e),
|
|
9757
9785
|
tag: e.tagName.toLowerCase(),
|
|
9758
9786
|
text: n.slice(0, 120)
|
|
9759
9787
|
};
|
|
@@ -9762,7 +9790,7 @@ function Xu(e, t, n = {}) {
|
|
|
9762
9790
|
truncated: a.length > o
|
|
9763
9791
|
};
|
|
9764
9792
|
}
|
|
9765
|
-
var
|
|
9793
|
+
var ed = [
|
|
9766
9794
|
"content",
|
|
9767
9795
|
"display",
|
|
9768
9796
|
"width",
|
|
@@ -9770,14 +9798,14 @@ var Zu = [
|
|
|
9770
9798
|
"background-color",
|
|
9771
9799
|
"position"
|
|
9772
9800
|
];
|
|
9773
|
-
function
|
|
9801
|
+
function td(e, t = {}) {
|
|
9774
9802
|
if (!e) return null;
|
|
9775
9803
|
let n = {
|
|
9776
|
-
selector:
|
|
9804
|
+
selector: Qu(e),
|
|
9777
9805
|
tag: e.tagName.toLowerCase(),
|
|
9778
9806
|
attrs: {}
|
|
9779
9807
|
};
|
|
9780
|
-
for (let t of Array.from(e.attributes)) !(
|
|
9808
|
+
for (let t of Array.from(e.attributes)) !(Vu.includes(t.name) || t.name.startsWith("data-")) || Hu.test(t.name) || Uu.test(t.name) || (n.attrs[t.name] = t.value);
|
|
9781
9809
|
let r = Array.from(e.childNodes).filter((e) => e.nodeType === 3).map((e) => e.textContent || "").join("").trim();
|
|
9782
9810
|
r && (n.text = r.slice(0, 400));
|
|
9783
9811
|
let i = String(e.innerText ?? e.textContent ?? "").trim();
|
|
@@ -9799,7 +9827,7 @@ function Qu(e, t = {}) {
|
|
|
9799
9827
|
if (typeof a != "function") return r;
|
|
9800
9828
|
try {
|
|
9801
9829
|
let i = a(e, n ?? null);
|
|
9802
|
-
for (let e of n ?
|
|
9830
|
+
for (let e of n ? ed : t.styles ?? qu) {
|
|
9803
9831
|
let t = typeof i.getPropertyValue == "function" ? i.getPropertyValue(e) : i[e];
|
|
9804
9832
|
t && (r[e] = String(t).slice(0, 200));
|
|
9805
9833
|
}
|
|
@@ -9817,16 +9845,16 @@ function Qu(e, t = {}) {
|
|
|
9817
9845
|
n.events = {
|
|
9818
9846
|
inline: t,
|
|
9819
9847
|
vue: r ? Object.keys(r).filter((e) => /^on[A-Z]/.test(e)).map((e) => e.slice(2).toLowerCase()) : [],
|
|
9820
|
-
captured:
|
|
9848
|
+
captured: Zu(e)
|
|
9821
9849
|
};
|
|
9822
9850
|
}
|
|
9823
9851
|
return n;
|
|
9824
9852
|
}
|
|
9825
|
-
var
|
|
9826
|
-
|
|
9853
|
+
var nd = r(({ query: e, mode: t, limit: n, root: r }) => {
|
|
9854
|
+
Xu();
|
|
9827
9855
|
let i = r ? document.querySelector(r) : document;
|
|
9828
9856
|
if (r && !i) return `未找到 root 元素:selector="${r}"`;
|
|
9829
|
-
let a =
|
|
9857
|
+
let a = $u(i, e, {
|
|
9830
9858
|
mode: t,
|
|
9831
9859
|
limit: n
|
|
9832
9860
|
});
|
|
@@ -9843,11 +9871,11 @@ var $u = r(({ query: e, mode: t, limit: n, root: r }) => {
|
|
|
9843
9871
|
limit: t.number().int().min(1).max(20).optional().describe("返回上限(默认 10)"),
|
|
9844
9872
|
root: t.string().optional().describe("限定搜索范围的容器选择器(默认整页)")
|
|
9845
9873
|
})
|
|
9846
|
-
}),
|
|
9847
|
-
|
|
9874
|
+
}), rd = r(({ selector: e, styles: t, includeHtml: n, htmlLimit: r, includeEvents: i, includeRect: a, pseudo: o }) => {
|
|
9875
|
+
Xu();
|
|
9848
9876
|
let s = document.querySelector(e);
|
|
9849
9877
|
if (!s) return `未找到匹配元素:selector="${e}"(可先用 dom_search 定位)`;
|
|
9850
|
-
let c =
|
|
9878
|
+
let c = td(s, {
|
|
9851
9879
|
styles: t,
|
|
9852
9880
|
includeHtml: n,
|
|
9853
9881
|
htmlLimit: r,
|
|
@@ -9868,7 +9896,7 @@ var $u = r(({ query: e, mode: t, limit: n, root: r }) => {
|
|
|
9868
9896
|
includeRect: t.boolean().optional().describe("是否含几何位置(默认 true)"),
|
|
9869
9897
|
pseudo: t.boolean().optional().describe("是否含 ::before/::after 伪元素摘要(默认 false)")
|
|
9870
9898
|
})
|
|
9871
|
-
}),
|
|
9899
|
+
}), id = {
|
|
9872
9900
|
name: "dom-inspect",
|
|
9873
9901
|
description: "页面 DOM 深度检视工具(dom_search 搜索元素 / dom_info 读内容·计算样式·事件绑定·几何)。定位元素、验证样式落地、排查交互绑定时加载",
|
|
9874
9902
|
getContent: () => [
|
|
@@ -9885,15 +9913,15 @@ var $u = r(({ query: e, mode: t, limit: n, root: r }) => {
|
|
|
9885
9913
|
"## 排障套路",
|
|
9886
9914
|
"1. dom_search(mode:\"text\", query:按钮文案) 定位 → 2. dom_info(styles:[\"display\",\"background-color\",\"pointer-events\"]) 验证样式/点击性 → 3. 不符则改数据(get_dom 看结构对照)"
|
|
9887
9915
|
].join("\n"),
|
|
9888
|
-
tools: [() => [
|
|
9916
|
+
tools: [() => [nd, rd]]
|
|
9889
9917
|
};
|
|
9890
9918
|
//#endregion
|
|
9891
9919
|
//#region src/core/tools/envTool.ts
|
|
9892
|
-
function
|
|
9920
|
+
function ad(e) {
|
|
9893
9921
|
let t = e;
|
|
9894
9922
|
return typeof t.tagName == "string" || typeof t.nodeType == "number" && typeof t.nodeName == "string";
|
|
9895
9923
|
}
|
|
9896
|
-
function
|
|
9924
|
+
function od(e, t = 3, n = 2e3, r, i) {
|
|
9897
9925
|
if (e == null) return e;
|
|
9898
9926
|
if (typeof e == "string") return e.length > n ? e.slice(0, n) + "…(已截断)" : e;
|
|
9899
9927
|
if (typeof e == "number" || typeof e == "boolean") return e;
|
|
@@ -9902,14 +9930,14 @@ function rd(e, t = 3, n = 2e3, r, i) {
|
|
|
9902
9930
|
if (typeof e == "bigint") return `${e.toString()}n`;
|
|
9903
9931
|
if (typeof e != "object") return String(e);
|
|
9904
9932
|
let a = e;
|
|
9905
|
-
if (
|
|
9933
|
+
if (ad(a)) {
|
|
9906
9934
|
let e = a;
|
|
9907
9935
|
return e.tagName ? `[Element: <${e.tagName.toLowerCase()}>]` : `[Node: ${e.nodeName}]`;
|
|
9908
9936
|
}
|
|
9909
9937
|
if (r?.has(a)) return "[Circular]";
|
|
9910
9938
|
let o = r ?? /* @__PURE__ */ new WeakSet();
|
|
9911
9939
|
if (o.add(a), Array.isArray(e)) {
|
|
9912
|
-
let r = e.slice(0, 100).map((e) =>
|
|
9940
|
+
let r = e.slice(0, 100).map((e) => od(e, t - 1, n, o, i));
|
|
9913
9941
|
return e.length > 100 && r.push(`…(共 ${e.length} 项,已截断)`), r;
|
|
9914
9942
|
}
|
|
9915
9943
|
if (t < 0) return "(对象,已截断)";
|
|
@@ -9922,14 +9950,14 @@ function rd(e, t = 3, n = 2e3, r, i) {
|
|
|
9922
9950
|
}
|
|
9923
9951
|
try {
|
|
9924
9952
|
let e = a[r];
|
|
9925
|
-
i?.test(r) ? s[r] = "[REDACTED]" : s[r] =
|
|
9953
|
+
i?.test(r) ? s[r] = "[REDACTED]" : s[r] = od(e, t - 1, n, o, i);
|
|
9926
9954
|
} catch {
|
|
9927
9955
|
s[r] = "(getter 抛错)";
|
|
9928
9956
|
}
|
|
9929
9957
|
}
|
|
9930
9958
|
return s;
|
|
9931
9959
|
}
|
|
9932
|
-
function
|
|
9960
|
+
function sd(e) {
|
|
9933
9961
|
let t = e ?? (typeof window < "u" ? window : {}), n = t.navigator, r = t.location, i = t.document;
|
|
9934
9962
|
return {
|
|
9935
9963
|
location: {
|
|
@@ -9962,9 +9990,9 @@ function id(e) {
|
|
|
9962
9990
|
} : "(无 document)"
|
|
9963
9991
|
};
|
|
9964
9992
|
}
|
|
9965
|
-
var
|
|
9993
|
+
var cd = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|opener|parent|top|self|window|globalThis|closed|history|navigation|trustedTypes|origin|crossOriginIsolated)$/, ld = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session|ticket/i, ud = r(({ key: e }) => {
|
|
9966
9994
|
if (e) {
|
|
9967
|
-
if (
|
|
9995
|
+
if (cd.test(e) || ld.test(e)) return JSON.stringify({
|
|
9968
9996
|
key: e,
|
|
9969
9997
|
denied: !0,
|
|
9970
9998
|
reason: "安全:该 key 在 denylist(localStorage/sessionStorage/cookie/document 或敏感命名 token/secret/key/auth),不读取防泄漏"
|
|
@@ -9974,18 +10002,18 @@ var ad = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|open
|
|
|
9974
10002
|
key: e,
|
|
9975
10003
|
exists: t !== void 0,
|
|
9976
10004
|
type: typeof t,
|
|
9977
|
-
value:
|
|
10005
|
+
value: od(t, 3, 2e3, void 0, ld)
|
|
9978
10006
|
}, null, 2);
|
|
9979
10007
|
}
|
|
9980
|
-
return JSON.stringify(
|
|
10008
|
+
return JSON.stringify(sd(), null, 2);
|
|
9981
10009
|
}, {
|
|
9982
10010
|
name: "inspect_env",
|
|
9983
10011
|
description: "读宿主页面环境信息(排查调试)。不传参返回摘要(URL/origin、浏览器/语言、viewport、title/readyState);传 key 读指定 window 属性值(如 key:\"appConfig\")。只读,大结果自动外存 vfs。",
|
|
9984
10012
|
schema: t.object({ key: t.string().optional().describe("要读取的 window 属性名(如 \"appConfig\"/\"__DEBUG__\");不传 = 返回环境摘要") })
|
|
9985
|
-
}),
|
|
10013
|
+
}), dd = [ud];
|
|
9986
10014
|
//#endregion
|
|
9987
10015
|
//#region src/core/harness/budget.ts
|
|
9988
|
-
function
|
|
10016
|
+
function fd(e, t, n) {
|
|
9989
10017
|
let r = 0;
|
|
9990
10018
|
return {
|
|
9991
10019
|
name: "budget",
|
|
@@ -10010,12 +10038,12 @@ function ld(e, t, n) {
|
|
|
10010
10038
|
}
|
|
10011
10039
|
//#endregion
|
|
10012
10040
|
//#region src/core/sdk/actions.ts
|
|
10013
|
-
var
|
|
10014
|
-
function
|
|
10041
|
+
var pd = /^[a-zA-Z][a-zA-Z0-9_]*$/;
|
|
10042
|
+
function md(e) {
|
|
10015
10043
|
let n = [];
|
|
10016
10044
|
for (let [i, a] of Object.entries(e)) {
|
|
10017
|
-
if (!
|
|
10018
|
-
console.warn(`[page-agent-sdk][actions] 动作名 "${i}" 非法(须匹配 ${
|
|
10045
|
+
if (!pd.test(i)) {
|
|
10046
|
+
console.warn(`[page-agent-sdk][actions] 动作名 "${i}" 非法(须匹配 ${pd}),已跳过`);
|
|
10019
10047
|
continue;
|
|
10020
10048
|
}
|
|
10021
10049
|
let e = a.description || `宿主动作 ${i}`;
|
|
@@ -10035,9 +10063,9 @@ function dd(e) {
|
|
|
10035
10063
|
}
|
|
10036
10064
|
return n;
|
|
10037
10065
|
}
|
|
10038
|
-
function
|
|
10066
|
+
function hd(e) {
|
|
10039
10067
|
let t = {};
|
|
10040
|
-
for (let [n, r] of Object.entries(e))
|
|
10068
|
+
for (let [n, r] of Object.entries(e)) pd.test(n) && (t[n] = {
|
|
10041
10069
|
description: r.description,
|
|
10042
10070
|
hasParams: !!r.params
|
|
10043
10071
|
});
|
|
@@ -10045,12 +10073,12 @@ function fd(e) {
|
|
|
10045
10073
|
}
|
|
10046
10074
|
//#endregion
|
|
10047
10075
|
//#region src/core/toolsets.ts
|
|
10048
|
-
var
|
|
10049
|
-
function
|
|
10050
|
-
return
|
|
10076
|
+
var gd = Bu, _d = Ku;
|
|
10077
|
+
function vd(e, t) {
|
|
10078
|
+
return Ru(e, t);
|
|
10051
10079
|
}
|
|
10052
|
-
function
|
|
10053
|
-
let a =
|
|
10080
|
+
function yd(e, t, n, r, i) {
|
|
10081
|
+
let a = Hl(e);
|
|
10054
10082
|
return [
|
|
10055
10083
|
...a.dataOps ? t : [],
|
|
10056
10084
|
...a.fetch ? n : [],
|
|
@@ -10060,7 +10088,7 @@ function gd(e, t, n, r, i) {
|
|
|
10060
10088
|
}
|
|
10061
10089
|
//#endregion
|
|
10062
10090
|
//#region src/core/sdk/toolRegistry.ts
|
|
10063
|
-
function
|
|
10091
|
+
function bd(e) {
|
|
10064
10092
|
let t = /* @__PURE__ */ new Map(), n = [];
|
|
10065
10093
|
for (let r of e) for (let e of r.tools) {
|
|
10066
10094
|
let i = t.get(e.name);
|
|
@@ -10080,15 +10108,15 @@ function _d(e) {
|
|
|
10080
10108
|
}
|
|
10081
10109
|
//#endregion
|
|
10082
10110
|
//#region src/core/harness/usageHints.ts
|
|
10083
|
-
var
|
|
10084
|
-
function
|
|
10085
|
-
let a =
|
|
10111
|
+
var xd = .7;
|
|
10112
|
+
function Sd(e, t, n = "simple", r, i) {
|
|
10113
|
+
let a = Hl(e), o = n !== "advanced", s = n === "minimal";
|
|
10086
10114
|
return {
|
|
10087
10115
|
name: "usageHints",
|
|
10088
10116
|
augmentPrompt: (n) => {
|
|
10089
10117
|
let r = [];
|
|
10090
10118
|
if (a.planning && (r.push("【自适应规划】按任务复杂度决定是否先规划,不要对简单任务过度编排:"), r.push(" · 简单/明确任务(改单字段、调样式、查值)→ 直接 read/write 执行,不必 write_todos。"), r.push(" · 复杂任务(多步、大改、有歧义、不可逆)→ 先 write_todos 拆解,首个任务标 in_progress,逐项推进。"), r.push(" · 执行中发现步骤要改/补/细分 → 用 update_todo({id, content?, status?}) 按 id 增量改单项,不必重传整个清单。"), e?.humanConfirm ? r.push(" · 规划出多步方案若需用户拍板 → 先 request_human_confirmation 给方案选项,确认后再执行。") : r.push(" · 规划出多步方案若需用户拍板 → 以文字列出方案选项等用户回复,勿自行拍板。"), r.push(" · 规划阶段有轮次预算(maxPlanRevisions,默认 5):勿反复调研/改计划而不执行,规划充分后即开始 write 落地。")), t && (o ? (r.push("读写主数据用 read/write(高层入口,自动乐观锁 + 自动快照)。read({jsonPath}) 读子路径当前值(返回含 hash,write 时自动比对,无需手动传);read() 不传读整个主数据 + 说明。write 改值两姿势:① 改单个字段/子路径用 write({patch:{op:\"set\", jsonPath:\"路径.字段\", value:新值}})——patch.value 就是该字段的新值(类型匹配:string 直传字符串、number 传数字、对象传对象),不要包成 {字段:值} 对象(字段名已在 jsonPath);也兼容 write({value:新值, patch:{op,jsonPath}}) 顶层 value(向后兼容,但优先 patch.value,避免与整体 set 的 value 混淆);② 替换整个对象用 write({value:{整个新对象}})。op:set 设值 / remove 删 / merge 合并对象 / append 追加数组 / move 移动数组元素(value=目标路径字符串:数组本身=追加到末尾、数组内下标=插到该位置;同数组即重排如组件调序,目标下标按移除源后解释,一步完成免双 set 交换);批量多改动 write({patches:[{op,jsonPath,value},...]});删子路径 write({patch:{jsonPath:\"路径\"}, del:true})。写入自动经 schema 校验(失败不写,按错误提示改值类型/形状后重试)+ 自动存快照" + (s ? "。" : "(出错可用 restore_data 回退)。")), r.push("修改大对象/数组优先用 write 的 patch 增量(只发改动部分),避免整体重传被 max_tokens 截断致 JSON 不完整。"), r.push("读大数组(read 返回 hasMore=true)用 read({jsonPath,offset,limit}) 分页(offset+=limit 续读,默认 limit=50);一次读多个不相关子路径用 read({jsonPaths:[...]}) 省轮次;复杂 patches 改动先 write({patches,dryRun:true}) 预检(走完整校验不落盘)。"), r.push("read/describe 返回按 schema 投影:仅 schema 声明的字段可见(未声明字段自动隐藏,防误操作);要操作某字段需集成方在 schema 声明。"), s || (r.push("查任意路径完整约束或对比快照差异需切 advanced 工具模式(schema_data/diff_data,当前未装载勿调用);查历史快照值(只读不改当前)用 history_data({id?,jsonPath?})。"), r.push("在大数组里按条件筛选用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素 path/index;定位后用 write patch 改。找名字记不清的元素用 search_data(substring/regex/fuzzy)。批量过滤/映射/聚合/重写大数组用 eval_script(沙箱脚本,mode=query 只读/transform 落地)。"))) : (r.push("改主数据前先 get_data({jsonPath}) 读其当前真实值与 hash(返回末尾 hash=xxx),基于真实值改,不要凭记忆。写入(set/edit/delete)时回传 expectedHash=该 hash 启用乐观锁——若主数据在你 get 之后被外部代码/其他 agent/用户手动改过,会触发冲突:集成方若开启人工介入,工具会挂起等用户决定(保留外部/强制覆盖/回退),你应等待工具返回后按结果继续(保留外部→重新 get 再改;强制覆盖→已写入,继续;回退→已回退到历史快照,基于回退值重写);未开启人工介入时返回 VERSION_CONFLICT 不写入,重新 get 拿最新值与 hash 再改。"), r.push("不确定主数据字段结构时用 describe_data 查看说明。"), r.push("修改大对象/数组优先用 edit_data 增量 patch(只发改动部分),避免 set_data 整体重传被 max_tokens 截断导致 JSON 不完整、校验失败。"), r.push("修改主数据出错时可用 restore_data 回退最近一次。"), r.push("在大数组里按条件筛选元素用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素的 path/index;定位后再 edit_data 改。"), r.push("找名字记不清的元素用 search_data(支持 substring/regex/fuzzy 模糊搜索)。"), r.push("需要过滤/映射/聚合/批量重写大数组时用 eval_script(沙箱脚本,入参 data);只读探查用 mode=query,批量重写用 mode=transform(返回值经校验后落地)。"), r.push("读大数组用 read({jsonPath,offset,limit}) 分页(返回 hasMore=true 时 offset+=limit 续读);一次读多个不相关子路径用 read({jsonPaths});复杂改动先 write({...,dryRun:true}) 预检不落盘。"), r.push("对比当前与历史快照(或一段 JSON against)的差异用 diff_data({snapshotId?,against?})(返回结构化 path→from/to,verify 自纠/操作审计/\"刚才改了啥\");只读查历史快照值用 history_data({id?,jsonPath?})。"))), a.subagent && r.push("独立子任务可 spawn_agent 委派(过程隔离,不占主上下文):默认只读,需要子 agent 写数据时传 writablePaths(路径前缀白名单,越界 PATH_OUT_OF_SCOPE)。多个独立子任务可 spawn_agents 并行委派(各子互不通信,结论由你汇总;并行委派不可授写权限,写操作由你收尾执行)。"), a.inspectEnv && r.push("排查页面环境(当前 URL/浏览器/视口/集成方调试变量)用 inspect_env——不传参返回环境摘要(location/navigator/viewport/document),传 key 读特定 window 属性(如 inspect_env({key:\"appConfig\"}) 读 window.appConfig)。改完数据看渲染、定位\"为何没生效\"时用它(只读,不改数据)。"), a.domInspect && r.push("改完数据想确认渲染是否生效(或定位元素/辅助 UI 设计问答)用 get_dom({selector?,depth?}) 读渲染后 DOM(结构化返回 tag/attrs/text/children,depth 控制深度防爆炸,只读)。配合宿主 actions(save_draft/publish 等)形成\"改数据→get_dom 看渲染→触发动作\"闭环。"), a.draftWrite && !o && (r.push("生成超大 JSON(如 50+ 组件页面,单次 write 受 max_tokens 限制装不下)用 draft_write 分块构建 → draft_commit 原子提交:draft_write({draftId, chunk, mode}) mode:\"start\" 新建/\"append\" 追加(拼 JSON 片段到 drafts 池);累积完 draft_commit({draftId}) 合并 + schema 校验 + 写主数据(失败草稿保留可修后重试,成功自动清草稿)。小改仍用 write patch,只在大 JSON 从零生成时用 draft。"), r.push("⚠️ 大 JSON 分块构建是典型多轮工具调用(draft_write×N + draft_commit + read 确认 + 调研 read/query),默认 maxToolRounds=10 可能触顶被 while 截断导致草稿写不完;目标组件数大时集成方应在 createChatSdk 配 maxToolRounds ≥ 20(或按 N+5 估算)。draft_commit 提交同样走乐观锁(改前 read 拿 hash,bind 被改过会触发冲突介入,不静默覆盖)。")), a.todoDeps && r.push("复杂任务可用 todos 层级依赖:write_todos 时给 todo 传 parentId(父任务 id,表达层级)+ deps(依赖的 todo id 数组,必须先完成)。有依赖的任务,deps 全 completed 后再标 in_progress;完成时 update_todo({id, status:\"completed\", evidence:\"完成证据\"}) 记证据。无依赖关系的任务不传 parentId/deps(扁平)。"), a.focus && !o && (r.push("【上下文聚焦】判断任务范围,用 set_focus/add_focus/remove_focus/clear_focus 自动收敛工作范围:"), r.push(" · 局部任务(只改某一组件/区域,如「调导航栏」「改 components.3 样式」)→ 先 read 定位 jsonPath,再 set_focus({path:\"该子树路径\"}) 聚焦;聚焦后每轮只看该子树结构,写其他位置会被 PATH_DENIED 拒绝。"), r.push(" · 多个相关组件(如「同时改导航栏和页脚」)→ set_focus 聚焦首个后用 add_focus({path}) 追加其余;聚焦后可写任一焦点子树,越界仍被拒;移除单个用 remove_focus({path})。"), r.push(" · 全局任务(多处/整体结构,如「重排所有组件」「换主题」)→ 不要聚焦,保持全量视野直接写。"), r.push(" · 完成局部精修、要转向其他区域或做整体改动 → 调 clear_focus 退出聚焦(清空全部焦点),恢复全部读写权限。"), r.push(" · set_focus/add_focus 的 path 必须在 schema 内(类型校验);不确定路径先 read/describe_data 查。")), e?.subagents?.length) {
|
|
10091
|
-
let t = e.subagents.filter((e) => (e.temperature ?? 0) >=
|
|
10119
|
+
let t = e.subagents.filter((e) => (e.temperature ?? 0) >= xd || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), n = e.subagents.filter((e) => (e.temperature ?? 0) < xd && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
|
|
10092
10120
|
r.push("【规划-反思-执行·路由】按任务性质选模式,不要对简单任务过度编排:"), t.length && (r.push(` · 创作/设计/开放性需求(如"设计主题风格""换个感觉")→ 先调 ${t.map((e) => "use_" + e.id).join("/")} 出 2-3 套方案(高温创意),`), r.push(e?.humanConfirm ? " 不要自己拍板;拿到方案后,若需用户拍板用 request_human_confirmation 弹选项。" : " 不要自己拍板;拿到方案后以文字列出选项等用户回复(humanConfirm 未开,勿调不存在工具)。")), n.length && r.push(` · 严谨/易错/校验类 → 可先调 ${n.map((e) => "use_" + e.id).join("/")} 反思挑刺(低温审查),据反馈修订。`), r.push(o ? " · 方案定稿后,由你(主 agent)用 write 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。" : " · 方案定稿后,由你(主 agent)用 edit_data 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。"), r.push(" · 简单/明确任务(如\"标题改红色\")直接执行,不必走规划-反思。");
|
|
10093
10121
|
}
|
|
10094
10122
|
e?.humanConfirm && (r.push("【人工确认·必读】以下情形必须先调 request_human_confirmation 征询用户、拿到答复后再继续,不要自行拍板:"), r.push(" 1) 用户让你「给方案/列选项/我来选/挑一个」时:把每个方案作为一个 option,调 request_human_confirmation(question=简述, options=[方案A,方案B,...], recommendation=你推荐的)。不要只回文字罗列方案让用户自己回复——要用工具把选项做成可点选按钮。"), r.push(" 2) 需求有歧义/不确定时:调工具问清楚(options 不传则用户答同意或拒绝)。"), r.push(" 3) 即将执行高风险不可逆操作(删除/覆盖/批量改动)前:调工具确认。"), r.push(" 4) 规划出多步方案需用户确认时:把整个方案(或关键分步)作为 option 调 request_human_confirmation,确认后再执行。"), r.push("用户在选项里选了哪个,就按那个方案继续;选「拒绝」则停止并询问如何调整。"));
|
|
@@ -10108,7 +10136,7 @@ function yd(e, t, n = "simple", r, i) {
|
|
|
10108
10136
|
}
|
|
10109
10137
|
//#endregion
|
|
10110
10138
|
//#region src/core/harness/resourcesPin.ts
|
|
10111
|
-
function
|
|
10139
|
+
function Cd(e) {
|
|
10112
10140
|
let t = e.toolsExposed === !1 ? "读到 ⟦frozen:path⟧/⟦res:handle⟧ 占位符 = 精确值在冻结区/资源池(不入消息流);resource_get/resource_update 为 advanced 工具,当前模式未装载,勿尝试调用;freeze 字段不可写(撞 FROZEN_FIELD 即放弃);verbatim 字段保持原值,勿在当前模式下尝试改写(直接写新值会 VERBATIM_MISMATCH);撞 RESOURCE_EVICTED/RESOURCE_NOT_FOUND 重新 read 懒注册。" : "读到 ⟦frozen:path⟧/⟦res:handle⟧ 占位符 = 精确值在冻结区/资源池(不入消息流);需真值用 resource_get({path});freeze 字段不可写(撞 FROZEN_FIELD 即放弃);verbatim 直接写新值会 VERBATIM_MISMATCH,先 resource_update 再写回句柄;撞 RESOURCE_EVICTED/RESOURCE_NOT_FOUND 重新 read 懒注册。";
|
|
10113
10141
|
return {
|
|
10114
10142
|
name: "resourcesPin",
|
|
@@ -10123,102 +10151,102 @@ function bd(e) {
|
|
|
10123
10151
|
}
|
|
10124
10152
|
//#endregion
|
|
10125
10153
|
//#region src/core/backends/skillStore.ts
|
|
10126
|
-
var
|
|
10127
|
-
function
|
|
10128
|
-
return `${
|
|
10154
|
+
var wd = "v:1::skill-store", Td = "chat-sdk";
|
|
10155
|
+
function Ed(e, t, n) {
|
|
10156
|
+
return `${wd}::${e}::${t}::${n}`;
|
|
10129
10157
|
}
|
|
10130
|
-
function
|
|
10131
|
-
return `${
|
|
10158
|
+
function Dd(e, t) {
|
|
10159
|
+
return `${wd}::${e}::${t}::`;
|
|
10132
10160
|
}
|
|
10133
|
-
function
|
|
10134
|
-
let t = e.dbName ??
|
|
10161
|
+
function Od(e = {}) {
|
|
10162
|
+
let t = e.dbName ?? Td, n = e.backend ?? "indexed", r = e.id ?? "", i, a, o = new Promise((e) => {
|
|
10135
10163
|
a = e;
|
|
10136
10164
|
});
|
|
10137
10165
|
return (async () => {
|
|
10138
10166
|
try {
|
|
10139
10167
|
if (n === "indexed") {
|
|
10140
10168
|
if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
|
|
10141
|
-
i = await
|
|
10169
|
+
i = await Fl(t), a(!0);
|
|
10142
10170
|
} else if (n === "session") {
|
|
10143
10171
|
if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
|
|
10144
|
-
i =
|
|
10172
|
+
i = Il(sessionStorage), a(!0);
|
|
10145
10173
|
} else if (n === "local") {
|
|
10146
10174
|
if (typeof localStorage > "u") throw Error("localStorage 不可用");
|
|
10147
|
-
i =
|
|
10148
|
-
} else i =
|
|
10175
|
+
i = Il(localStorage), a(!0);
|
|
10176
|
+
} else i = Pl(), a(!1);
|
|
10149
10177
|
} catch {
|
|
10150
|
-
i =
|
|
10178
|
+
i = Pl(), a(!1);
|
|
10151
10179
|
}
|
|
10152
10180
|
})(), {
|
|
10153
10181
|
ready: o,
|
|
10154
10182
|
async list() {
|
|
10155
10183
|
let e = [];
|
|
10156
|
-
return await i.scan(
|
|
10184
|
+
return await i.scan(Dd(t, r), (t, n) => {
|
|
10157
10185
|
e.push(n);
|
|
10158
10186
|
}), e;
|
|
10159
10187
|
},
|
|
10160
10188
|
async get(e) {
|
|
10161
|
-
return await i.get(
|
|
10189
|
+
return await i.get(Ed(t, r, e));
|
|
10162
10190
|
},
|
|
10163
10191
|
async put(e) {
|
|
10164
10192
|
try {
|
|
10165
|
-
await i.set(
|
|
10193
|
+
await i.set(Ed(t, r, e.name), e);
|
|
10166
10194
|
} catch (e) {
|
|
10167
|
-
|
|
10195
|
+
El(e) && (i = Pl());
|
|
10168
10196
|
}
|
|
10169
10197
|
},
|
|
10170
10198
|
async remove(e) {
|
|
10171
|
-
let n =
|
|
10199
|
+
let n = Ed(t, r, e);
|
|
10172
10200
|
return await i.get(n) == null ? !1 : (await i.del(n), !0);
|
|
10173
10201
|
},
|
|
10174
10202
|
async clear() {
|
|
10175
|
-
await i.clearPrefix(
|
|
10203
|
+
await i.clearPrefix(Dd(t, r));
|
|
10176
10204
|
},
|
|
10177
10205
|
dispose() {}
|
|
10178
10206
|
};
|
|
10179
10207
|
}
|
|
10180
10208
|
//#endregion
|
|
10181
10209
|
//#region src/core/backends/preferenceStore.ts
|
|
10182
|
-
var
|
|
10210
|
+
var kd = [
|
|
10183
10211
|
"color",
|
|
10184
10212
|
"copy",
|
|
10185
10213
|
"layout",
|
|
10186
10214
|
"interaction",
|
|
10187
10215
|
"tech",
|
|
10188
10216
|
"other"
|
|
10189
|
-
],
|
|
10190
|
-
function
|
|
10191
|
-
return `${
|
|
10217
|
+
], Ad = "v:1::pref-store", jd = "chat-sdk";
|
|
10218
|
+
function Md(e, t, n) {
|
|
10219
|
+
return `${Ad}::${e}::${t}::${n}`;
|
|
10192
10220
|
}
|
|
10193
|
-
function
|
|
10194
|
-
return `${
|
|
10221
|
+
function Nd(e, t) {
|
|
10222
|
+
return `${Ad}::${e}::${t}::`;
|
|
10195
10223
|
}
|
|
10196
|
-
function
|
|
10224
|
+
function Pd() {
|
|
10197
10225
|
return `pref-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
|
|
10198
10226
|
}
|
|
10199
|
-
function
|
|
10200
|
-
let t = e.dbName ??
|
|
10227
|
+
function Fd(e = {}) {
|
|
10228
|
+
let t = e.dbName ?? jd, n = e.backend ?? "indexed", r = e.id ?? "", i = e.maxEntries ?? 20, a, o, s = new Promise((e) => {
|
|
10201
10229
|
o = e;
|
|
10202
10230
|
});
|
|
10203
10231
|
(async () => {
|
|
10204
10232
|
try {
|
|
10205
10233
|
if (n === "indexed") {
|
|
10206
10234
|
if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
|
|
10207
|
-
a = await
|
|
10235
|
+
a = await Fl(t), o(!0);
|
|
10208
10236
|
} else if (n === "session") {
|
|
10209
10237
|
if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
|
|
10210
|
-
a =
|
|
10238
|
+
a = Il(sessionStorage), o(!0);
|
|
10211
10239
|
} else if (n === "local") {
|
|
10212
10240
|
if (typeof localStorage > "u") throw Error("localStorage 不可用");
|
|
10213
|
-
a =
|
|
10214
|
-
} else a =
|
|
10241
|
+
a = Il(localStorage), o(!0);
|
|
10242
|
+
} else a = Pl(), o(!1);
|
|
10215
10243
|
} catch {
|
|
10216
|
-
a =
|
|
10244
|
+
a = Pl(), o(!1);
|
|
10217
10245
|
}
|
|
10218
10246
|
})();
|
|
10219
10247
|
async function c() {
|
|
10220
10248
|
let e = [];
|
|
10221
|
-
return await a.scan(
|
|
10249
|
+
return await a.scan(Nd(t, r), (t, n) => {
|
|
10222
10250
|
e.push(n);
|
|
10223
10251
|
}), e;
|
|
10224
10252
|
}
|
|
@@ -10229,7 +10257,7 @@ function Md(e = {}) {
|
|
|
10229
10257
|
},
|
|
10230
10258
|
async put(e) {
|
|
10231
10259
|
let n = await c(), o = Date.now(), s = n.reduce((e, t) => Math.max(e, t.updatedAt), 0), l = n.find((t) => t.topic === e.topic), u = {
|
|
10232
|
-
id: e.id ?? l?.id ??
|
|
10260
|
+
id: e.id ?? l?.id ?? Pd(),
|
|
10233
10261
|
content: e.content,
|
|
10234
10262
|
topic: e.topic,
|
|
10235
10263
|
sourceSessionId: l?.sourceSessionId ?? e.sourceSessionId,
|
|
@@ -10237,71 +10265,71 @@ function Md(e = {}) {
|
|
|
10237
10265
|
createdAt: l?.createdAt ?? o,
|
|
10238
10266
|
updatedAt: Math.max(o, s + 1)
|
|
10239
10267
|
};
|
|
10240
|
-
l && l.id !== u.id && await a.del(
|
|
10268
|
+
l && l.id !== u.id && await a.del(Md(t, r, l.id));
|
|
10241
10269
|
try {
|
|
10242
|
-
await a.set(
|
|
10270
|
+
await a.set(Md(t, r, u.id), u);
|
|
10243
10271
|
} catch (e) {
|
|
10244
|
-
|
|
10272
|
+
El(e) && (a = Pl(), await a.set(Md(t, r, u.id), u));
|
|
10245
10273
|
}
|
|
10246
10274
|
let d = await c();
|
|
10247
10275
|
if (d.length > i) {
|
|
10248
10276
|
let e = d.sort((e, t) => e.updatedAt - t.updatedAt).slice(0, d.length - i);
|
|
10249
|
-
for (let n of e) await a.del(
|
|
10277
|
+
for (let n of e) await a.del(Md(t, r, n.id));
|
|
10250
10278
|
}
|
|
10251
10279
|
return u;
|
|
10252
10280
|
},
|
|
10253
10281
|
async remove(e) {
|
|
10254
|
-
let n =
|
|
10282
|
+
let n = Md(t, r, e);
|
|
10255
10283
|
return await a.get(n) == null ? !1 : (await a.del(n), !0);
|
|
10256
10284
|
},
|
|
10257
10285
|
async clear() {
|
|
10258
|
-
await a.clearPrefix(
|
|
10286
|
+
await a.clearPrefix(Nd(t, r));
|
|
10259
10287
|
},
|
|
10260
10288
|
dispose() {}
|
|
10261
10289
|
};
|
|
10262
10290
|
}
|
|
10263
10291
|
//#endregion
|
|
10264
10292
|
//#region src/core/harness/preferences.ts
|
|
10265
|
-
var
|
|
10293
|
+
var Id = {
|
|
10266
10294
|
color: "颜色",
|
|
10267
10295
|
copy: "文案",
|
|
10268
10296
|
layout: "排版",
|
|
10269
10297
|
interaction: "交互",
|
|
10270
10298
|
tech: "技术",
|
|
10271
10299
|
other: "其他"
|
|
10272
|
-
},
|
|
10300
|
+
}, Ld = [
|
|
10273
10301
|
/^(?:请|帮我|麻烦)?你?记住[::,,、]?\s*(.{4,200})/,
|
|
10274
10302
|
/^(?:从)?今后(?:开始|起)?[::,,]?\s*(.{4,200})/,
|
|
10275
10303
|
/^以后(?:都|全都|总是|尽量)?[::,,]?\s*(.{4,200})/
|
|
10276
|
-
],
|
|
10304
|
+
], Rd = /(?:不要|别再|别用|别加|太(?:艳|花|亮|暗|大|小|密|挤|乱|复杂|素|少)|不喜欢|讨厌|希望|更喜欢|偏好|永远|一律|统一保持|保持统一)/, zd = [
|
|
10277
10305
|
["layout", /布局|排版|间距|留白|密度|居中|对齐|栅格|边距|紧凑|圆角|分栏|层级|大小|尺寸/],
|
|
10278
10306
|
["copy", /文案|文字|标题|副标题|字体|字号|措辞|语气|口语|书面|简洁|简短|详尽|emoji|表情/],
|
|
10279
10307
|
["interaction", /动画|动效|过渡|交互|悬停|hover|点击反馈|弹窗|提示|加载|滚动/],
|
|
10280
10308
|
["tech", /代码|框架|组件|技术|写法|命名|注释|依赖|版本|接口/],
|
|
10281
10309
|
["color", /颜色|配色|色调|色彩|深色|浅色|饱和|渐变|紫|红|橙|黄|绿|青|蓝|粉|棕|灰|黑|白|金|银/]
|
|
10282
10310
|
];
|
|
10283
|
-
function
|
|
10284
|
-
for (let [t, n] of
|
|
10311
|
+
function Bd(e) {
|
|
10312
|
+
for (let [t, n] of zd) if (n.test(e)) return t;
|
|
10285
10313
|
return "other";
|
|
10286
10314
|
}
|
|
10287
|
-
function
|
|
10315
|
+
function Vd(e) {
|
|
10288
10316
|
let t = e.trim();
|
|
10289
|
-
if (!(!t || t.length > 500)) for (let e of
|
|
10317
|
+
if (!(!t || t.length > 500)) for (let e of Ld) {
|
|
10290
10318
|
let n = t.match(e);
|
|
10291
10319
|
if (n?.[1]) {
|
|
10292
10320
|
let e = n[1].trim().replace(/[。.!!]+$/, "");
|
|
10293
10321
|
return e.length < 3 ? void 0 : {
|
|
10294
10322
|
content: e,
|
|
10295
|
-
topic:
|
|
10323
|
+
topic: Bd(e)
|
|
10296
10324
|
};
|
|
10297
10325
|
}
|
|
10298
10326
|
}
|
|
10299
10327
|
}
|
|
10300
|
-
function
|
|
10328
|
+
function Hd(e) {
|
|
10301
10329
|
let t = e.trim();
|
|
10302
|
-
return t.length < 4 || t.length > 500 || /^(你好|hi|hello|ok|好的|继续|嗯|谢谢|hey|哈喽|收到|明白)/i.test(t) ? !1 :
|
|
10330
|
+
return t.length < 4 || t.length > 500 || /^(你好|hi|hello|ok|好的|继续|嗯|谢谢|hey|哈喽|收到|明白)/i.test(t) ? !1 : Rd.test(t);
|
|
10303
10331
|
}
|
|
10304
|
-
function
|
|
10332
|
+
function Ud(e) {
|
|
10305
10333
|
return [
|
|
10306
10334
|
"你是用户偏好提取器。判断下面的用户消息是否包含「持久偏好」—— 对未来同类工作都适用的口味/规则(如配色口味、文案风格、排版密度),而非仅针对本轮的任务指令。",
|
|
10307
10335
|
"只输出 JSON(无任何其他文本):{\"captured\": true, \"content\": \"一句话中性陈述(用户视角,如:不用紫色,偏好低饱和)\", \"topic\": \"color|copy|layout|interaction|tech|other\"} 或 {\"captured\": false, \"content\": \"\", \"topic\": \"other\"}",
|
|
@@ -10310,7 +10338,7 @@ function Bd(e) {
|
|
|
10310
10338
|
`用户消息:"""${e.slice(0, 800)}"""`
|
|
10311
10339
|
].join("\n");
|
|
10312
10340
|
}
|
|
10313
|
-
function
|
|
10341
|
+
function Wd(e) {
|
|
10314
10342
|
if (!e) return;
|
|
10315
10343
|
let t = (e.match(/```(?:json)?\s*([\s\S]*?)```/)?.[1] ?? e).match(/\{[\s\S]*\}/)?.[0];
|
|
10316
10344
|
if (t) try {
|
|
@@ -10319,19 +10347,19 @@ function Vd(e) {
|
|
|
10319
10347
|
let n = typeof e.content == "string" ? e.content.trim().replace(/[。.!!]+$/, "") : "";
|
|
10320
10348
|
return n.length < 3 || n.length > 200 ? void 0 : {
|
|
10321
10349
|
content: n,
|
|
10322
|
-
topic:
|
|
10350
|
+
topic: kd.includes(e.topic) ? e.topic : "other"
|
|
10323
10351
|
};
|
|
10324
10352
|
} catch {
|
|
10325
10353
|
return;
|
|
10326
10354
|
}
|
|
10327
10355
|
}
|
|
10328
|
-
function
|
|
10356
|
+
function Gd(e) {
|
|
10329
10357
|
if (!e.length) return;
|
|
10330
10358
|
let t = ["## 用户偏好(跨会话沉淀;除非用户本轮另有指示,遵守以下偏好)"];
|
|
10331
|
-
for (let n of e) t.push(`- ${
|
|
10359
|
+
for (let n of e) t.push(`- ${Id[n.topic]}:${n.content}`);
|
|
10332
10360
|
return t.join("\n");
|
|
10333
10361
|
}
|
|
10334
|
-
function
|
|
10362
|
+
function Kd(e) {
|
|
10335
10363
|
let t = [], n = -1, r = Promise.resolve(), i = (t) => e.onDebug?.({
|
|
10336
10364
|
stage: "preferences",
|
|
10337
10365
|
...t
|
|
@@ -10352,21 +10380,21 @@ function Ud(e) {
|
|
|
10352
10380
|
}
|
|
10353
10381
|
return {
|
|
10354
10382
|
name: "preferences",
|
|
10355
|
-
augmentPrompt: () =>
|
|
10383
|
+
augmentPrompt: () => Gd(t),
|
|
10356
10384
|
afterAgent: (t) => {
|
|
10357
10385
|
let r = t.messages ?? [];
|
|
10358
10386
|
for (let t = n + 1; t < r.length; t++) {
|
|
10359
10387
|
let n = r[t];
|
|
10360
10388
|
if (n.role !== "user" || typeof n.content != "string" || !n.content) continue;
|
|
10361
|
-
let o = n.content, s =
|
|
10389
|
+
let o = n.content, s = Vd(o);
|
|
10362
10390
|
if (s) {
|
|
10363
10391
|
a(s.content, s.topic, t, "explicit");
|
|
10364
10392
|
continue;
|
|
10365
10393
|
}
|
|
10366
|
-
if (e.llmInvoke &&
|
|
10394
|
+
if (e.llmInvoke && Hd(o)) {
|
|
10367
10395
|
let n = t;
|
|
10368
|
-
e.llmInvoke(
|
|
10369
|
-
let t =
|
|
10396
|
+
e.llmInvoke(Ud(o)).then((e) => {
|
|
10397
|
+
let t = Wd(e);
|
|
10370
10398
|
t && a(t.content, t.topic, n, "llm");
|
|
10371
10399
|
}).catch((e) => i({ extractError: String(e) }));
|
|
10372
10400
|
}
|
|
@@ -10389,24 +10417,24 @@ function Ud(e) {
|
|
|
10389
10417
|
}
|
|
10390
10418
|
};
|
|
10391
10419
|
}
|
|
10392
|
-
var
|
|
10393
|
-
function
|
|
10420
|
+
var qd = /large_results\/[^\s"'`),]+\.txt/g;
|
|
10421
|
+
function Jd(e) {
|
|
10394
10422
|
let t = /* @__PURE__ */ new Set(), n = (e) => {
|
|
10395
10423
|
if (typeof e != "string" || !e) return;
|
|
10396
10424
|
let n;
|
|
10397
|
-
for (
|
|
10425
|
+
for (qd.lastIndex = 0; (n = qd.exec(e)) !== null;) t.add(n[0]);
|
|
10398
10426
|
};
|
|
10399
10427
|
for (let t of e) if (n(t.content), t.steps) for (let e of t.steps) n(e.result);
|
|
10400
10428
|
return t;
|
|
10401
10429
|
}
|
|
10402
|
-
function
|
|
10430
|
+
function Yd(e, t) {
|
|
10403
10431
|
let n = [];
|
|
10404
10432
|
for (let r of Object.keys(e)) r.startsWith("large_results/") && !t.has(r) && n.push(r);
|
|
10405
10433
|
return n;
|
|
10406
10434
|
}
|
|
10407
10435
|
//#endregion
|
|
10408
10436
|
//#region src/core/utils/serialRunner.ts
|
|
10409
|
-
function
|
|
10437
|
+
function Xd() {
|
|
10410
10438
|
let e = Promise.resolve();
|
|
10411
10439
|
return function(t) {
|
|
10412
10440
|
let n = e.then(t, t);
|
|
@@ -10415,24 +10443,24 @@ function qd() {
|
|
|
10415
10443
|
}
|
|
10416
10444
|
//#endregion
|
|
10417
10445
|
//#region src/core/sdk/createChatSdk.ts
|
|
10418
|
-
var
|
|
10419
|
-
function
|
|
10446
|
+
var Zd = 30, Qd = /* @__PURE__ */ new Map();
|
|
10447
|
+
function $d(e, t) {
|
|
10420
10448
|
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;
|
|
10421
10449
|
}
|
|
10422
|
-
function
|
|
10450
|
+
function ef(e) {
|
|
10423
10451
|
return e === "spawn_agent" || e === "spawn_agents" || e.startsWith("use_");
|
|
10424
10452
|
}
|
|
10425
|
-
function
|
|
10453
|
+
function tf(e, t, n, r) {
|
|
10426
10454
|
let i = 0;
|
|
10427
10455
|
return {
|
|
10428
10456
|
name: "sdk-events",
|
|
10429
10457
|
wrapToolCall: async (t, r) => {
|
|
10430
|
-
let i = await r(t), a =
|
|
10458
|
+
let i = await r(t), a = $d(t.name, t.args);
|
|
10431
10459
|
return a ? e({
|
|
10432
10460
|
type: "data_change",
|
|
10433
10461
|
operation: a,
|
|
10434
10462
|
value: n()?.bind
|
|
10435
|
-
}) : i.status === "done" &&
|
|
10463
|
+
}) : i.status === "done" && ef(t.name) && e({
|
|
10436
10464
|
type: "data_change",
|
|
10437
10465
|
operation: "edit",
|
|
10438
10466
|
value: n()?.bind
|
|
@@ -10459,7 +10487,7 @@ function Qd(e, t, n, r) {
|
|
|
10459
10487
|
}
|
|
10460
10488
|
};
|
|
10461
10489
|
}
|
|
10462
|
-
function
|
|
10490
|
+
function nf(e, t, n, r, i) {
|
|
10463
10491
|
if (!n) return i && console.warn(`[page-agent-sdk][focus] capabilities.focus 关闭,${t} 忽略`), {
|
|
10464
10492
|
ok: !1,
|
|
10465
10493
|
error: "capabilities.focus 关闭"
|
|
@@ -10477,18 +10505,18 @@ function $d(e, t, n, r, i) {
|
|
|
10477
10505
|
error: "当前无主数据 schema,无法聚焦"
|
|
10478
10506
|
});
|
|
10479
10507
|
}
|
|
10480
|
-
function
|
|
10508
|
+
function rf(e, n) {
|
|
10481
10509
|
let i = {
|
|
10482
10510
|
prompt_tokens: 0,
|
|
10483
10511
|
completion_tokens: 0,
|
|
10484
10512
|
total_tokens: 0
|
|
10485
|
-
}, a =
|
|
10513
|
+
}, a = pl(() => G), o = /* @__PURE__ */ At(0), s = zl(e.storage);
|
|
10486
10514
|
e.debug && s && s.onEvent((e) => console.log("[page-agent-sdk][storage]", e));
|
|
10487
|
-
let { modelCaps: c, summaryLlmInvoke: l, titleLlmInvoke: u, compressDecisionInvoke: d } =
|
|
10515
|
+
let { modelCaps: c, summaryLlmInvoke: l, titleLlmInvoke: u, compressDecisionInvoke: d } = fl(e), f = c;
|
|
10488
10516
|
if (e.debug && console.log("[page-agent-sdk][modelCaps]", f), f.contextWindow < 2e5) throw Error(`[page-agent-sdk] 模型上下文窗口 ${f.contextWindow} 小于最小支持 ${ai}(需 ≥200K 窗口模型,如 GLM-5.2/Claude/Kimi/Qwen-1M/DeepSeek-v4)`);
|
|
10489
|
-
let h =
|
|
10517
|
+
let h = Kl(e, f.contextWindow), g = h.enableLLMSummary !== !1, _ = (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? Gl[e.contextPreset ?? "auto"], v = new Set(_), y = e.llm;
|
|
10490
10518
|
e.debug && !l && console.warn("[page-agent-sdk][summarization] 未构造 llmInvoke(apiKey 缺失?),摘要回退零成本索引摘要");
|
|
10491
|
-
let b = /* @__PURE__ */ bt([]), x =
|
|
10519
|
+
let b = /* @__PURE__ */ bt([]), x = uc(e.vfs?.initialFiles, {
|
|
10492
10520
|
persist: s ? { save: (e) => {
|
|
10493
10521
|
zt({ vfs: e });
|
|
10494
10522
|
} } : void 0,
|
|
@@ -10507,8 +10535,8 @@ function ef(e, n) {
|
|
|
10507
10535
|
let D = { current: null }, O = e.data ? {
|
|
10508
10536
|
...e.data,
|
|
10509
10537
|
description: e.data.description ?? "主数据对象"
|
|
10510
|
-
} : void 0, k = !(e.subagents ?? []).some((e) => e._codeAsset) &&
|
|
10511
|
-
k && O?.schema && $i(O.schema).length && (A = [...e.subagents ?? [],
|
|
10538
|
+
} : void 0, k = !(e.subagents ?? []).some((e) => e._codeAsset) && Hl(e.capabilities).subagent, A = e.subagents;
|
|
10539
|
+
k && O?.schema && $i(O.schema).length && (A = [...e.subagents ?? [], Zc()], console.info("[page-agent-sdk] 检测到 schema 含代码组件数组(如 components[].code),已自动装配 HTML 代码子 agent(委派编排 + vfs 工作副本 + 格式校验 + 增量 commit)。需定制(codeField/formatCheck/craftNotes 等)请显式传 createHtmlSubagent(...)"));
|
|
10512
10540
|
let ee = (A ?? []).filter((e) => !!e._codeAsset), j = /* @__PURE__ */ new Set();
|
|
10513
10541
|
for (let e of ee) {
|
|
10514
10542
|
if (e._codeAsset.writablePaths.length) continue;
|
|
@@ -10524,7 +10552,7 @@ function ef(e, n) {
|
|
|
10524
10552
|
getTodos: () => D.current?.getState?.()?.todos ?? [],
|
|
10525
10553
|
messages: b,
|
|
10526
10554
|
maxCheckpoints: re && typeof re == "object" ? re.maxCheckpoints : void 0
|
|
10527
|
-
}) : null, ae = !re || typeof re != "object" || re.auto !== !1, I =
|
|
10555
|
+
}) : null, ae = !re || typeof re != "object" || re.auto !== !1, I = Hl(e.capabilities), oe = I.dataOps, se = I.draftWrite, ce = I.tracing, le = I.automation, ue = oc({
|
|
10528
10556
|
...e,
|
|
10529
10557
|
locale: e.i18n?.locale
|
|
10530
10558
|
});
|
|
@@ -10532,7 +10560,7 @@ function ef(e, n) {
|
|
|
10532
10560
|
let e = M.map((e) => e._codeAsset.orchestratorPrompt).filter(Boolean).join("\n\n");
|
|
10533
10561
|
e && (ue += "\n\n" + e);
|
|
10534
10562
|
} else O?.schema && Qi(O.schema) && (ue += "\n\n" + ga.htmlDirectWriteFallback, console.warn("[page-agent-sdk] 检测到 schema 含 code 字段但未注册 html 子 agent:已自动注入「主 agent 自己写 HTML」编排(code 作普通字段直接 write,无 vfs 工作副本 / 无格式校验门禁)。如需代码资产机制(vfs + 格式校验 + 增量 commit + 主上下文 code 摘要),注册 createHtmlSubagent;若确为降级意图可忽略。"));
|
|
10535
|
-
let de = oe && O ?
|
|
10563
|
+
let de = oe && O ? Ru(O, {
|
|
10536
10564
|
onAudit: e.onAudit ?? (e.debug ? (e) => console.log("[page-agent-sdk][data audit]", e) : void 0),
|
|
10537
10565
|
maxSnapshots: e.maxSnapshots,
|
|
10538
10566
|
onConflict: a.set,
|
|
@@ -10541,18 +10569,18 @@ function ef(e, n) {
|
|
|
10541
10569
|
vfsStore: se || O?.resources?.length ? x : void 0,
|
|
10542
10570
|
...P.length ? { pgIdPaths: P } : {},
|
|
10543
10571
|
...ne.length ? { largeTextPaths: ne } : {}
|
|
10544
|
-
}) : [], fe = oe ?
|
|
10572
|
+
}) : [], fe = oe ? ku(de, e.toolMode) : [], L = oe && O ? de.controller ?? null : null, pe = oe && O?.resources?.length && L?.getResourcesSnapshot ? Cd({
|
|
10545
10573
|
getResourcesSnapshot: () => L?.getResourcesSnapshot?.() ?? [],
|
|
10546
10574
|
toolsExposed: e.toolMode === "advanced"
|
|
10547
|
-
}) : void 0, R = () => L?.get() ?? O, z = /* @__PURE__ */ new Map(), me =
|
|
10548
|
-
...
|
|
10549
|
-
|
|
10550
|
-
|
|
10551
|
-
] :
|
|
10575
|
+
}) : void 0, R = () => L?.get() ?? O, z = /* @__PURE__ */ new Map(), me = yd(I, fe, Bu, I.domInspect && !I.skills ? [
|
|
10576
|
+
...Ku,
|
|
10577
|
+
nd,
|
|
10578
|
+
rd
|
|
10579
|
+
] : Ku, dd);
|
|
10552
10580
|
me.forEach((e) => z.set(e.name, "builtin"));
|
|
10553
10581
|
let he = [...e.tools || []];
|
|
10554
10582
|
he.forEach((e) => z.set(e.name, "user"));
|
|
10555
|
-
let B =
|
|
10583
|
+
let B = md(e.actions ?? {});
|
|
10556
10584
|
B.forEach((e) => z.set(e.name, "action"));
|
|
10557
10585
|
let ge = [], _e = !1, ve = e.humanConfirm !== !1 && (!e.approval || e.approval.humanConfirmTool !== !1), ye = ve ? Mo() : null;
|
|
10558
10586
|
ye && z.set(Ao, "builtin");
|
|
@@ -10624,7 +10652,7 @@ function ef(e, n) {
|
|
|
10624
10652
|
Te.forEach((e) => z.set(e.name, "builtin"));
|
|
10625
10653
|
let Ee = [], De = /* @__PURE__ */ new Map(), H = U();
|
|
10626
10654
|
function U() {
|
|
10627
|
-
let { tools: e, collisions: t } =
|
|
10655
|
+
let { tools: e, collisions: t } = bd([
|
|
10628
10656
|
{
|
|
10629
10657
|
label: "builtin",
|
|
10630
10658
|
tools: me
|
|
@@ -10661,13 +10689,13 @@ function ef(e, n) {
|
|
|
10661
10689
|
return t.length && console.warn("[page-agent-sdk] 工具重名,后注册覆盖先注册:", t.map((e) => `${e.name}(${e.loser}→${e.winner})`).join(", ")), e;
|
|
10662
10690
|
}
|
|
10663
10691
|
let Oe = I.planning, ke = I.missionAnchor, Ae = I.workingMemory, je = I.skills, Me = I.vfs || N;
|
|
10664
|
-
if (Me) for (let e of
|
|
10692
|
+
if (Me) for (let e of _c) z.set(e, "builtin");
|
|
10665
10693
|
if (Oe) for (let e of S.tools ?? []) z.set(e.name, "builtin");
|
|
10666
10694
|
let Ne = I.summarization, Pe = I.agentCompression && !!d;
|
|
10667
10695
|
e.debug && I.agentCompression && !d && console.warn("[page-agent-sdk][agentCompression] agentCompression 开启但 summaryLlm 不可用(或缺 apiKey / 模型不支持工具),压缩决策不启用,回退静态压缩");
|
|
10668
10696
|
let Fe = I.memory, Ie = I.subagent, Le = Ie ? us() : void 0, Re = e.verify?.maxAttempts ?? 2, ze = !!(e.verify?.check || e.verify?.maxAttempts || e.verify?.adversarial), W = e.capabilities?.verify === !1, Be = (I.verify || ze && !W) && e.verify?.enabled !== !1 && Re > 0, Ve = I.contextInspector;
|
|
10669
10697
|
ze && !Be && e.verify?.enabled !== !1 && console.warn("[page-agent-sdk][verify] 检测到 verify 配置(check/maxAttempts/adversarial)但未装载(capabilities.verify:false 显式关闭 或 maxAttempts≤0)");
|
|
10670
|
-
let He = e.subagent, Ue = He?.allowedTools ?? [], We = e.permissions?.length ? Oo(e.permissions) : void 0, Ge = e.approval && (e.approval.tools !== void 0 || e.approval.confirm) ? ko(e.approval) : void 0, Ke = [...We ? [We] : [], ...Ge ? [Ge] : []], qe = !Ie || He?.enabled === !1 ? void 0 :
|
|
10698
|
+
let He = e.subagent, Ue = He?.allowedTools ?? [], We = e.permissions?.length ? Oo(e.permissions) : void 0, Ge = e.approval && (e.approval.tools !== void 0 || e.approval.confirm) ? ko(e.approval) : void 0, Ke = [...We ? [We] : [], ...Ge ? [Ge] : []], qe = !Ie || He?.enabled === !1 ? void 0 : Ds({
|
|
10671
10699
|
llm: He?.llm ?? e.llm,
|
|
10672
10700
|
allTools: () => J.agent?.allTools ?? H,
|
|
10673
10701
|
allowedTools: Ue.length ? Ue : void 0,
|
|
@@ -10691,7 +10719,7 @@ function ef(e, n) {
|
|
|
10691
10719
|
timeoutMs: He?.timeoutMs
|
|
10692
10720
|
}), Je = te?.map((e) => {
|
|
10693
10721
|
if (!e._codeAsset) return e;
|
|
10694
|
-
let t = e._codeAsset, n =
|
|
10722
|
+
let t = e._codeAsset, n = Ic({
|
|
10695
10723
|
writablePaths: t.writablePaths,
|
|
10696
10724
|
codeVfsPrefix: t.codeVfsPrefix,
|
|
10697
10725
|
ext: t.ext,
|
|
@@ -10706,12 +10734,16 @@ function ef(e, n) {
|
|
|
10706
10734
|
...e,
|
|
10707
10735
|
middleware: r
|
|
10708
10736
|
};
|
|
10709
|
-
}), Ye = N && Ie ?
|
|
10737
|
+
}), Ye = N && Ie ? Lc() : void 0, Xe = Ye ? Wc({
|
|
10710
10738
|
getBind: () => R()?.bind,
|
|
10711
10739
|
writablePaths: P,
|
|
10712
10740
|
getLocked: () => Ye.locked(),
|
|
10713
|
-
tools: H
|
|
10714
|
-
|
|
10741
|
+
tools: H,
|
|
10742
|
+
getCodeFieldPaths: () => Hc(R()?.bind, M.map((e) => ({
|
|
10743
|
+
writablePaths: e._codeAsset.writablePaths,
|
|
10744
|
+
codeField: e._codeAsset.codeField
|
|
10745
|
+
})))
|
|
10746
|
+
}) : void 0, Ze = Ie && Je !== void 0 ? As(Je, {
|
|
10715
10747
|
llm: e.llm,
|
|
10716
10748
|
allTools: () => J.agent?.allTools ?? H,
|
|
10717
10749
|
debug: e.debug,
|
|
@@ -10729,15 +10761,15 @@ function ef(e, n) {
|
|
|
10729
10761
|
timeoutMs: e.subagent?.timeoutMs,
|
|
10730
10762
|
...Ye ? {
|
|
10731
10763
|
componentLock: Ye,
|
|
10732
|
-
resolveComponents: (e) =>
|
|
10764
|
+
resolveComponents: (e) => Rc(e, Mc(R()?.bind, P))
|
|
10733
10765
|
} : {}
|
|
10734
10766
|
}) : void 0, Qe = Ze ? Ze.controller : null, $e = [
|
|
10735
10767
|
"get_data",
|
|
10736
10768
|
"describe_data",
|
|
10737
10769
|
"read",
|
|
10738
10770
|
"fetch_document"
|
|
10739
|
-
], et = H.filter((e) => $e.includes(e.name)), tt = Be ?
|
|
10740
|
-
check: e.verify.check ??
|
|
10771
|
+
], et = H.filter((e) => $e.includes(e.name)), tt = Be ? js({
|
|
10772
|
+
check: e.verify.check ?? Ls({
|
|
10741
10773
|
schemas: () => R() ? { "": R().schema } : {},
|
|
10742
10774
|
root: () => R()?.bind
|
|
10743
10775
|
}),
|
|
@@ -10745,10 +10777,10 @@ function ef(e, n) {
|
|
|
10745
10777
|
llm: e.llm,
|
|
10746
10778
|
tools: et
|
|
10747
10779
|
} : void 0
|
|
10748
|
-
}) : void 0, nt = Ve ?
|
|
10780
|
+
}) : void 0, nt = Ve ? Zs({
|
|
10749
10781
|
contextWindow: f.contextWindow,
|
|
10750
|
-
thresholdRatio:
|
|
10751
|
-
}) : void 0, rt =
|
|
10782
|
+
thresholdRatio: Kl(e, f.contextWindow).summaryThresholdRatio
|
|
10783
|
+
}) : void 0, rt = Sd({
|
|
10752
10784
|
...I,
|
|
10753
10785
|
humanConfirm: ve,
|
|
10754
10786
|
subagents: te?.map((e) => ({
|
|
@@ -10758,7 +10790,7 @@ function ef(e, n) {
|
|
|
10758
10790
|
}))
|
|
10759
10791
|
}, oe && !!O, e.toolMode, !!O?.resources?.length, { promptSoftCap: as(f.contextWindow, h.promptSoftCapTokens) }), it = O ? {
|
|
10760
10792
|
name: "dataHint",
|
|
10761
|
-
augmentPrompt: () =>
|
|
10793
|
+
augmentPrompt: () => ac(R(), e.schemaHint) || void 0
|
|
10762
10794
|
} : null, at = e.augmentSystem ? {
|
|
10763
10795
|
name: "augmentSystem",
|
|
10764
10796
|
augmentPrompt: (t) => {
|
|
@@ -10772,7 +10804,7 @@ function ef(e, n) {
|
|
|
10772
10804
|
return;
|
|
10773
10805
|
}
|
|
10774
10806
|
}
|
|
10775
|
-
} : null, ot =
|
|
10807
|
+
} : null, ot = Ul(e.onEvent), G = ot.emit, st, ct = [], lt = (e) => ({
|
|
10776
10808
|
name: e.name,
|
|
10777
10809
|
description: e.description,
|
|
10778
10810
|
content: typeof e.getContent == "function" ? e.getContent() : ""
|
|
@@ -10780,13 +10812,13 @@ function ef(e, n) {
|
|
|
10780
10812
|
name: e.name,
|
|
10781
10813
|
description: e.description,
|
|
10782
10814
|
getContent: () => e.content
|
|
10783
|
-
}), dt = e.skillStorage === !1 ? null :
|
|
10815
|
+
}), dt = e.skillStorage === !1 ? null : Od({
|
|
10784
10816
|
...typeof e.skillStorage == "object" ? e.skillStorage : {},
|
|
10785
10817
|
id: e.skillStorage && typeof e.skillStorage == "object" && e.skillStorage.id ? e.skillStorage.id : `agent::${n}`
|
|
10786
|
-
}), ft = I.preferences, pt = ft && e.preferenceStorage !== !1 ?
|
|
10818
|
+
}), ft = I.preferences, pt = ft && e.preferenceStorage !== !1 ? Fd({
|
|
10787
10819
|
...typeof e.preferenceStorage == "object" ? e.preferenceStorage : {},
|
|
10788
10820
|
id: e.preferenceStorage && typeof e.preferenceStorage == "object" && e.preferenceStorage.id ? e.preferenceStorage.id : `agent::${n}`
|
|
10789
|
-
}) : null, mt = pt ?
|
|
10821
|
+
}) : null, mt = pt ? Kd({
|
|
10790
10822
|
store: pt,
|
|
10791
10823
|
llmInvoke: l,
|
|
10792
10824
|
getSessionId: () => J.sessionId,
|
|
@@ -10827,13 +10859,13 @@ function ef(e, n) {
|
|
|
10827
10859
|
decideInvoke: d,
|
|
10828
10860
|
getSnapshot: () => nt?.getSnapshot()
|
|
10829
10861
|
} : {}
|
|
10830
|
-
}) : void 0, vt =
|
|
10862
|
+
}) : void 0, vt = Jl([
|
|
10831
10863
|
...it ? [it] : [],
|
|
10832
10864
|
rt,
|
|
10833
10865
|
...ke ? [C] : [],
|
|
10834
10866
|
...mt ? [mt] : [],
|
|
10835
10867
|
...Oe ? [S] : [],
|
|
10836
|
-
...je ? [st = xo([...I.domInspect && !(e.skills || []).some((e) => e.name ===
|
|
10868
|
+
...je ? [st = xo([...I.domInspect && !(e.skills || []).some((e) => e.name === id.name) ? [id] : [], ...e.skills || []], {
|
|
10837
10869
|
readVfs: Me ? (e) => x.files[e]?.content : void 0,
|
|
10838
10870
|
hostScriptEnabled: I.skillHostScript,
|
|
10839
10871
|
onToolsReady: (e, t) => {
|
|
@@ -10844,7 +10876,7 @@ function ef(e, n) {
|
|
|
10844
10876
|
H = U(), J.agent && J.agent.setTools(H), J.infoTick.value++;
|
|
10845
10877
|
}
|
|
10846
10878
|
})] : [],
|
|
10847
|
-
...Me ? [
|
|
10879
|
+
...Me ? [yc(x)] : [],
|
|
10848
10880
|
..._t ? [_t] : [],
|
|
10849
10881
|
...Ae ? [T] : [],
|
|
10850
10882
|
...V ? [w] : [],
|
|
@@ -10861,12 +10893,12 @@ function ef(e, n) {
|
|
|
10861
10893
|
...at ? [at] : [],
|
|
10862
10894
|
...nt ? [nt] : [],
|
|
10863
10895
|
...e.middleware || [],
|
|
10864
|
-
...le ? [
|
|
10896
|
+
...le ? [fd(i, {
|
|
10865
10897
|
tokenBudget: e.tokenBudget,
|
|
10866
10898
|
timeBudgetMs: e.timeBudgetMs
|
|
10867
10899
|
}, G)] : [],
|
|
10868
|
-
|
|
10869
|
-
]), yt = e.maxMemoryRounds ??
|
|
10900
|
+
tf(G, b, R, i)
|
|
10901
|
+
]), yt = e.maxMemoryRounds ?? Zd, xt = e.approval?.timeoutMs, St = xt === void 0 || xt === 0 ? 3e4 : !Number.isFinite(xt) || xt < 0 ? 0 : xt;
|
|
10870
10902
|
function Ct(e) {
|
|
10871
10903
|
if (St) return (t) => {
|
|
10872
10904
|
if (t.type !== "approval_request") return;
|
|
@@ -10899,7 +10931,7 @@ function ef(e, n) {
|
|
|
10899
10931
|
e.debug && console.warn("[page-agent-sdk][persist] refreshSessions 失败(已吞):", t);
|
|
10900
10932
|
}
|
|
10901
10933
|
}
|
|
10902
|
-
let Et =
|
|
10934
|
+
let Et = Xd(), q = /* @__PURE__ */ new Set();
|
|
10903
10935
|
function Dt(e) {
|
|
10904
10936
|
let t = new AbortController(), n = () => t.abort();
|
|
10905
10937
|
return e && (e.aborted ? t.abort() : e.addEventListener("abort", n, { once: !0 })), q.add(t), {
|
|
@@ -11157,7 +11189,7 @@ function ef(e, n) {
|
|
|
11157
11189
|
})), e.memory && zt({ memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }), K(), It = void 0, Lt = !1, J.infoTick.value++, r;
|
|
11158
11190
|
},
|
|
11159
11191
|
resetSession: () => {
|
|
11160
|
-
Ot(), a.resolve("keep_external"), J.sessionId =
|
|
11192
|
+
Ot(), a.resolve("keep_external"), J.sessionId = ml(), b.splice(0, b.length), x.clear?.(), S.reset([]), e.memory || E.reset(""), C.reset(), T.reset(), w.reset(), mt?.resetScanCursor(), F && F.importStack([]), J.agent && (J.agent.debugLogs.value = []), s && s.createSession(J.agentId, e.session?.title, J.sessionId).catch((t) => {
|
|
11161
11193
|
e.debug && console.warn("[page-agent-sdk][persist] createSession 失败(已吞):", t);
|
|
11162
11194
|
}), G({
|
|
11163
11195
|
type: "session_restored",
|
|
@@ -11167,7 +11199,7 @@ function ef(e, n) {
|
|
|
11167
11199
|
},
|
|
11168
11200
|
stream: (e, t, n) => {
|
|
11169
11201
|
if (!J.agent) throw Error("page-agent-sdk: agent 尚未初始化完成,请先 await mount()");
|
|
11170
|
-
x?.setProtectedRefs?.(
|
|
11202
|
+
x?.setProtectedRefs?.(Jd(e));
|
|
11171
11203
|
let r = (e) => {
|
|
11172
11204
|
t?.(e), G(e), e.type === "subagent" && (e.kind === "tool_call" || e.kind === "tool_result") && J.infoTick.value++;
|
|
11173
11205
|
};
|
|
@@ -11182,7 +11214,7 @@ function ef(e, n) {
|
|
|
11182
11214
|
if (J.refCount--, J.refCount <= 0) {
|
|
11183
11215
|
Ot(), _e = !0, s && (x.flush?.(), s.flush(), s.dispose()), dt && dt.dispose();
|
|
11184
11216
|
let e = J.mcpClosers.splice(0);
|
|
11185
|
-
e.length && Promise.allSettled(e.map((e) => e())),
|
|
11217
|
+
e.length && Promise.allSettled(e.map((e) => e())), Qd.delete(n);
|
|
11186
11218
|
}
|
|
11187
11219
|
},
|
|
11188
11220
|
resolveConflict: a.resolve,
|
|
@@ -11202,14 +11234,14 @@ function ef(e, n) {
|
|
|
11202
11234
|
},
|
|
11203
11235
|
setLlm(t) {
|
|
11204
11236
|
let n;
|
|
11205
|
-
if (
|
|
11237
|
+
if (rl(t)) n = t;
|
|
11206
11238
|
else {
|
|
11207
11239
|
let e = t;
|
|
11208
11240
|
if ((e.provider ?? "openai") === "anthropic") throw Error("[page-agent-sdk][setLlm] 切换到 Anthropic 需传 BaseChatModel 实例(动态 import 无法同步);请先 const { ChatAnthropic } = await import(\"@langchain/anthropic\") 构造实例后传入");
|
|
11209
11241
|
n = p(e);
|
|
11210
11242
|
}
|
|
11211
11243
|
typeof n.bindTools != "function" && e.debug && console.warn("[page-agent-sdk][setLlm] 新模型不支持 bindTools(tool calling 会失效)"), y = t;
|
|
11212
|
-
let r =
|
|
11244
|
+
let r = rl(t) ? void 0 : t;
|
|
11213
11245
|
if (f = oi({
|
|
11214
11246
|
model: r?.model ?? t.model ?? t.modelName,
|
|
11215
11247
|
contextWindow: e.contextWindow ?? r?.contextWindow,
|
|
@@ -11252,8 +11284,8 @@ function ef(e, n) {
|
|
|
11252
11284
|
return {
|
|
11253
11285
|
id: n,
|
|
11254
11286
|
sessionId: J.sessionId,
|
|
11255
|
-
model:
|
|
11256
|
-
systemPrompt: J.agent?.getEffectiveSystemPrompt?.() ?? ue +
|
|
11287
|
+
model: rl(y) ? y.model ?? y.modelName : y.model,
|
|
11288
|
+
systemPrompt: J.agent?.getEffectiveSystemPrompt?.() ?? ue + ac(R(), e.schemaHint),
|
|
11257
11289
|
tools: (J.agent?.allTools ?? H).map((e) => ({
|
|
11258
11290
|
name: e.name,
|
|
11259
11291
|
description: e.description,
|
|
@@ -11295,7 +11327,7 @@ function ef(e, n) {
|
|
|
11295
11327
|
spans: J.agent.spans.value,
|
|
11296
11328
|
metrics: li(J.agent.spans.value)
|
|
11297
11329
|
} : void 0,
|
|
11298
|
-
actions:
|
|
11330
|
+
actions: hd(e.actions ?? {}),
|
|
11299
11331
|
subagent: {
|
|
11300
11332
|
enabled: !!qe,
|
|
11301
11333
|
maxDepth: e.subagent?.maxDepth ?? 1,
|
|
@@ -11359,11 +11391,11 @@ function ef(e, n) {
|
|
|
11359
11391
|
return V ? w.getFocuses() : [];
|
|
11360
11392
|
},
|
|
11361
11393
|
setFocus(t) {
|
|
11362
|
-
let n =
|
|
11394
|
+
let n = nf(t, "setFocus", V, () => R()?.schema, e.debug);
|
|
11363
11395
|
return n.ok ? (w.setFocus(t), J.infoTick.value++, { ok: !0 }) : n;
|
|
11364
11396
|
},
|
|
11365
11397
|
addFocus(t) {
|
|
11366
|
-
let n =
|
|
11398
|
+
let n = nf(t, "addFocus", V, () => R()?.schema, e.debug);
|
|
11367
11399
|
return n.ok ? w.getFocuses().length >= 8 ? (e.debug && console.warn("[page-agent-sdk][focus] addFocus 拒绝:焦点数已达上限 8(augmentPrompt 注入每焦点子树 schema,过多致 system prompt 超预算)"), {
|
|
11368
11400
|
ok: !1,
|
|
11369
11401
|
error: "焦点数上限 8(避免 system prompt 撑爆)"
|
|
@@ -11407,14 +11439,14 @@ function ef(e, n) {
|
|
|
11407
11439
|
}
|
|
11408
11440
|
function Mt(e) {
|
|
11409
11441
|
let t = {};
|
|
11410
|
-
for (let n of
|
|
11442
|
+
for (let n of Jd(e)) {
|
|
11411
11443
|
let e = x.files[n];
|
|
11412
11444
|
e && (t[n] = e.content);
|
|
11413
11445
|
}
|
|
11414
11446
|
return t;
|
|
11415
11447
|
}
|
|
11416
11448
|
function Nt() {
|
|
11417
|
-
let e =
|
|
11449
|
+
let e = Yd(x.files, Jd(b));
|
|
11418
11450
|
for (let t of e) delete x.files[t];
|
|
11419
11451
|
}
|
|
11420
11452
|
function Ft() {
|
|
@@ -11478,7 +11510,7 @@ function ef(e, n) {
|
|
|
11478
11510
|
zt({ focus: e.length ? e : null });
|
|
11479
11511
|
}
|
|
11480
11512
|
le && F && (zt({ checkpoints: F.exportStack() }), zt({ usage: i }));
|
|
11481
|
-
let t =
|
|
11513
|
+
let t = nl(b);
|
|
11482
11514
|
if (t && t !== It && (It = t, Bt(J.sessionId, t)), e.autoTitle !== !1 && u && !Lt && b.some((e) => e.role === "user") && b.some((e) => e.role === "assistant")) {
|
|
11483
11515
|
Lt = !0;
|
|
11484
11516
|
let e = J.sessionId;
|
|
@@ -11500,7 +11532,7 @@ function ef(e, n) {
|
|
|
11500
11532
|
}
|
|
11501
11533
|
return J.initDone = (async () => {
|
|
11502
11534
|
await kt(), await jt(), mt && await mt.preload(), e.mcp?.length && (async () => {
|
|
11503
|
-
let t = await Promise.allSettled(e.mcp.map((e) =>
|
|
11535
|
+
let t = await Promise.allSettled(e.mcp.map((e) => nc(e))), n = t.flatMap((e) => e.status === "fulfilled" ? [e.value.close] : []);
|
|
11504
11536
|
if (_e) {
|
|
11505
11537
|
Promise.allSettled(n.map((e) => e()));
|
|
11506
11538
|
return;
|
|
@@ -11544,7 +11576,7 @@ function ef(e, n) {
|
|
|
11544
11576
|
}
|
|
11545
11577
|
}), ge.length && (H = U(), J.agent && J.agent.setTools(H), J.infoTick.value++), e.debug && console.log(`[page-agent-sdk][mcp] 注入 ${ge.length} 个工具,${J.mcpServers.length} 个 server`);
|
|
11546
11578
|
})();
|
|
11547
|
-
let t =
|
|
11579
|
+
let t = rl(e.llm) ? e.llm : await m(e.llm);
|
|
11548
11580
|
J.agent = Wi({
|
|
11549
11581
|
llm: t,
|
|
11550
11582
|
systemPrompt: ue,
|
|
@@ -11576,12 +11608,12 @@ function ef(e, n) {
|
|
|
11576
11608
|
});
|
|
11577
11609
|
})(), J;
|
|
11578
11610
|
}
|
|
11579
|
-
function
|
|
11580
|
-
let n = e.id ??
|
|
11611
|
+
function af(e, t) {
|
|
11612
|
+
let n = e.id ?? ml();
|
|
11581
11613
|
e.id || console.warn(`[page-agent-sdk] 未传 options.id,已生成随机 id "${n}"。刷新后持久化数据无法恢复,请传稳定 id。`);
|
|
11582
|
-
let r = e.streaming ?? !0, i = e.ui ?? "default", a, o = e.shareContext ?
|
|
11583
|
-
o ? a = o : (a =
|
|
11584
|
-
let s = null, c =
|
|
11614
|
+
let r = e.streaming ?? !0, i = e.ui ?? "default", a, o = e.shareContext ? Qd.get(n) : void 0;
|
|
11615
|
+
o ? a = o : (a = rf(e, n), e.shareContext && Qd.set(n, a)), a.refCount++;
|
|
11616
|
+
let s = null, c = Bl(e), l = null, u = null;
|
|
11585
11617
|
async function d(n) {
|
|
11586
11618
|
if (await a.initDone, s) {
|
|
11587
11619
|
s.show();
|
|
@@ -11757,12 +11789,12 @@ function tf(e, t) {
|
|
|
11757
11789
|
},
|
|
11758
11790
|
vfsWrite: (e, t) => {
|
|
11759
11791
|
let n = typeof t == "string" ? t : JSON.stringify(t);
|
|
11760
|
-
a.vfsStore.files[
|
|
11792
|
+
a.vfsStore.files[mc(e)] = {
|
|
11761
11793
|
content: n,
|
|
11762
11794
|
updatedAt: Date.now()
|
|
11763
11795
|
};
|
|
11764
11796
|
},
|
|
11765
|
-
vfsRead: (e) => a.vfsStore.files[
|
|
11797
|
+
vfsRead: (e) => a.vfsStore.files[mc(e)]?.content,
|
|
11766
11798
|
createResource: (e, t) => {
|
|
11767
11799
|
let n = a.dataOpsController;
|
|
11768
11800
|
if (!n?.createResource) throw Error("[page-agent-sdk] createResource 不可用:需配 data.resources + vfsStore(capabilities.vfs 默认开)");
|
|
@@ -11801,7 +11833,7 @@ function tf(e, t) {
|
|
|
11801
11833
|
}
|
|
11802
11834
|
//#endregion
|
|
11803
11835
|
//#region src/core/sdk/ragSubagent.ts
|
|
11804
|
-
function
|
|
11836
|
+
function of(e, t, n, r, i) {
|
|
11805
11837
|
let a = [];
|
|
11806
11838
|
e && a.push("vfs_grep + vfs_read(搜预注入文档)"), t && a.push(`${r}(语义检索)`), n && a.push(`${i}(按 source 加载)`), a.push("fetch_document(公网 URL)");
|
|
11807
11839
|
let o = [];
|
|
@@ -11816,7 +11848,7 @@ function nf(e, t, n, r, i) {
|
|
|
11816
11848
|
|
|
11817
11849
|
你是只读检索角色,不要尝试修改任何数据。不要尝试上面未列出的工具。`;
|
|
11818
11850
|
}
|
|
11819
|
-
function
|
|
11851
|
+
function sf(e, t, n, r, i) {
|
|
11820
11852
|
let a = [], o = [];
|
|
11821
11853
|
return e && (a.push("- vfs_grep / vfs_read:搜集成方预注入 vfs 的文档(组件文档 / UI 规范)—— 快、静态,先查"), o.push("- 静态文档(组件库文档 / UI 规范):vfs_grep")), t && (a.push(`- ${r}:语义检索(retriever 向量库)—— 模糊匹配,关键词不确定 / 语义相似时用`), o.push(`- 语义相似(「瀑布流组件」「倒计时」「拼团」):${r}`)), n && (a.push(`- ${i}:按 source 精确加载(已知文档 id / URL / key)—— 精确取特定文档`), o.push(`- 已知文档 id / URL:${i}`)), a.push("- fetch_document:公网 URL —— 查公开资料"), o.push("- 公开 URL(设计规范网站 / 第三方文档):fetch_document"), `# 知识检索策略(RAG)
|
|
11822
11854
|
|
|
@@ -11833,12 +11865,12 @@ ${a.join("\n")}
|
|
|
11833
11865
|
## 何时用何源
|
|
11834
11866
|
${o.join("\n")}`;
|
|
11835
11867
|
}
|
|
11836
|
-
var
|
|
11868
|
+
var cf = {
|
|
11837
11869
|
name: "rag-search",
|
|
11838
11870
|
description: "多源知识检索策略:vfs 预注入文档 → 语义检索 → 指定文档加载 → 公网;综合结构化结论 + 溯源",
|
|
11839
|
-
getContent: () =>
|
|
11871
|
+
getContent: () => sf(!0, !0, !0, "search_docs", "load_doc")
|
|
11840
11872
|
};
|
|
11841
|
-
function
|
|
11873
|
+
function lf(e, n, i) {
|
|
11842
11874
|
return r(async ({ query: e, topK: t }) => {
|
|
11843
11875
|
try {
|
|
11844
11876
|
let r = await n(e, { topK: t ?? i });
|
|
@@ -11855,7 +11887,7 @@ function of(e, n, i) {
|
|
|
11855
11887
|
})
|
|
11856
11888
|
});
|
|
11857
11889
|
}
|
|
11858
|
-
function
|
|
11890
|
+
function uf(e, n) {
|
|
11859
11891
|
return r(async ({ source: e }) => {
|
|
11860
11892
|
try {
|
|
11861
11893
|
let t = await n(e), r = Array.isArray(t) ? t : [t];
|
|
@@ -11869,19 +11901,19 @@ function sf(e, n) {
|
|
|
11869
11901
|
schema: t.object({ source: t.string().describe("文档标识(id/URL/key)") })
|
|
11870
11902
|
});
|
|
11871
11903
|
}
|
|
11872
|
-
function
|
|
11904
|
+
function df(e) {
|
|
11873
11905
|
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;
|
|
11874
11906
|
if (!t && !n && r === !1) throw Error("[page-agent-sdk][createRagSubagent] 至少配一种知识源:retriever / loader / useVfs(true)");
|
|
11875
11907
|
let p = [];
|
|
11876
|
-
t && p.push(
|
|
11908
|
+
t && p.push(lf(s, t, o)), n && p.push(uf(c, n)), f && p.push(...f);
|
|
11877
11909
|
let m = r ? [
|
|
11878
11910
|
"vfs_grep",
|
|
11879
11911
|
"vfs_read",
|
|
11880
11912
|
"vfs_json_read"
|
|
11881
|
-
] : void 0, h =
|
|
11913
|
+
] : void 0, h = of(r, !!t, !!n, s, c), g = {
|
|
11882
11914
|
name: "rag-search",
|
|
11883
|
-
description:
|
|
11884
|
-
getContent: () =>
|
|
11915
|
+
description: cf.description,
|
|
11916
|
+
getContent: () => sf(r, !!t, !!n, s, c)
|
|
11885
11917
|
};
|
|
11886
11918
|
return {
|
|
11887
11919
|
id: i,
|
|
@@ -11896,7 +11928,7 @@ function cf(e) {
|
|
|
11896
11928
|
}
|
|
11897
11929
|
//#endregion
|
|
11898
11930
|
//#region src/core/utils/clipboard.ts
|
|
11899
|
-
async function
|
|
11931
|
+
async function ff(e) {
|
|
11900
11932
|
try {
|
|
11901
11933
|
let t = globalThis.navigator?.clipboard;
|
|
11902
11934
|
if (t && typeof t.writeText == "function") return await t.writeText(e), !0;
|
|
@@ -11914,8 +11946,8 @@ async function lf(e) {
|
|
|
11914
11946
|
}
|
|
11915
11947
|
//#endregion
|
|
11916
11948
|
//#region src/core/composables/useChat.ts
|
|
11917
|
-
var
|
|
11918
|
-
function
|
|
11949
|
+
var pf = 4e3;
|
|
11950
|
+
function mf(e = {}) {
|
|
11919
11951
|
let { fetchResponse: t, fetchStream: n, onPersist: r, onClear: i, onQueuedCleared: a } = e, o = /* @__PURE__ */ bt({
|
|
11920
11952
|
messages: e.messages ?? [],
|
|
11921
11953
|
loading: !1,
|
|
@@ -11993,7 +12025,7 @@ function df(e = {}) {
|
|
|
11993
12025
|
let t = e.delta || "";
|
|
11994
12026
|
n.subReasonFull = (n.subReasonFull || "") + t;
|
|
11995
12027
|
let r = (n.subReason || "") + t;
|
|
11996
|
-
n.subReason = r.length >
|
|
12028
|
+
n.subReason = r.length > pf ? r.slice(-4e3) : r;
|
|
11997
12029
|
break;
|
|
11998
12030
|
}
|
|
11999
12031
|
n.children ||= [];
|
|
@@ -12122,7 +12154,7 @@ function df(e = {}) {
|
|
|
12122
12154
|
}
|
|
12123
12155
|
//#endregion
|
|
12124
12156
|
//#region src/core/components/icons.ts
|
|
12125
|
-
var
|
|
12157
|
+
var hf = {
|
|
12126
12158
|
header: "🤖",
|
|
12127
12159
|
subagent: "🤖",
|
|
12128
12160
|
subagentProgress: "🧬",
|
|
@@ -12133,10 +12165,10 @@ var ff = {
|
|
|
12133
12165
|
recommend: "💡",
|
|
12134
12166
|
conflict: "⚠️"
|
|
12135
12167
|
};
|
|
12136
|
-
function
|
|
12137
|
-
let t = { ...
|
|
12168
|
+
function gf(e) {
|
|
12169
|
+
let t = { ...hf };
|
|
12138
12170
|
if (!e) return t;
|
|
12139
|
-
let n = Object.keys(
|
|
12171
|
+
let n = Object.keys(hf);
|
|
12140
12172
|
for (let r of n) {
|
|
12141
12173
|
let n = e[r];
|
|
12142
12174
|
typeof n == "string" && (t[r] = n);
|
|
@@ -12145,7 +12177,7 @@ function pf(e) {
|
|
|
12145
12177
|
}
|
|
12146
12178
|
//#endregion
|
|
12147
12179
|
//#region src/core/components/messages.ts
|
|
12148
|
-
var
|
|
12180
|
+
var _f = {
|
|
12149
12181
|
defaultTitle: "AI 助手",
|
|
12150
12182
|
inputPlaceholder: "输入消息,Enter 发送...",
|
|
12151
12183
|
newSession: "新建会话",
|
|
@@ -12374,8 +12406,8 @@ var mf = {
|
|
|
12374
12406
|
codeDemoText: "这是一段示例文字,用于展示 CSS 效果。",
|
|
12375
12407
|
codeDemoButton: "按钮",
|
|
12376
12408
|
codeDemoInput: "输入框"
|
|
12377
|
-
},
|
|
12378
|
-
"zh-CN":
|
|
12409
|
+
}, vf = {
|
|
12410
|
+
"zh-CN": _f,
|
|
12379
12411
|
"en-US": {
|
|
12380
12412
|
defaultTitle: "AI Assistant",
|
|
12381
12413
|
inputPlaceholder: "Type a message, Enter to send...",
|
|
@@ -12607,10 +12639,10 @@ var mf = {
|
|
|
12607
12639
|
codeDemoInput: "Input"
|
|
12608
12640
|
}
|
|
12609
12641
|
};
|
|
12610
|
-
function
|
|
12642
|
+
function yf(e = "zh-CN", t) {
|
|
12611
12643
|
let n = {
|
|
12612
|
-
...
|
|
12613
|
-
...
|
|
12644
|
+
..._f,
|
|
12645
|
+
...vf[e]
|
|
12614
12646
|
};
|
|
12615
12647
|
if (!t) return n;
|
|
12616
12648
|
let r = { ...n };
|
|
@@ -12622,9 +12654,9 @@ function gf(e = "zh-CN", t) {
|
|
|
12622
12654
|
}
|
|
12623
12655
|
//#endregion
|
|
12624
12656
|
//#region src/core/composables/chatContext.ts
|
|
12625
|
-
var
|
|
12626
|
-
function
|
|
12627
|
-
let t =
|
|
12657
|
+
var bf = Symbol("chatContext");
|
|
12658
|
+
function xf(e = {}) {
|
|
12659
|
+
let t = mf({
|
|
12628
12660
|
fetchResponse: e.fetchResponse,
|
|
12629
12661
|
fetchStream: e.fetchStream,
|
|
12630
12662
|
messages: e.messages,
|
|
@@ -12644,7 +12676,7 @@ function vf(e = {}) {
|
|
|
12644
12676
|
}, h = /* @__PURE__ */ At({}), g = (e) => h.value[e] === !0, _ = (e) => {
|
|
12645
12677
|
h.value[e] = !g(e);
|
|
12646
12678
|
}, v = /* @__PURE__ */ At(!1), y = (e) => {
|
|
12647
|
-
|
|
12679
|
+
ff(e).then((e) => {
|
|
12648
12680
|
e && (v.value = !0, setTimeout(() => {
|
|
12649
12681
|
v.value = !1;
|
|
12650
12682
|
}, 1500));
|
|
@@ -12680,7 +12712,7 @@ function vf(e = {}) {
|
|
|
12680
12712
|
e.onClearFocus?.();
|
|
12681
12713
|
}, j = (t) => {
|
|
12682
12714
|
e.onFocusChipClick?.(t);
|
|
12683
|
-
}, M =
|
|
12715
|
+
}, M = gf(e.icons), te = e.locale ?? "zh-CN";
|
|
12684
12716
|
return {
|
|
12685
12717
|
chat: t,
|
|
12686
12718
|
inputText: o,
|
|
@@ -12712,18 +12744,18 @@ function vf(e = {}) {
|
|
|
12712
12744
|
focusChipClick: j,
|
|
12713
12745
|
icons: M,
|
|
12714
12746
|
locale: te,
|
|
12715
|
-
messages:
|
|
12747
|
+
messages: yf(te, e.dialogMessages)
|
|
12716
12748
|
};
|
|
12717
12749
|
}
|
|
12718
|
-
function
|
|
12719
|
-
let e = Rn(
|
|
12750
|
+
function Sf() {
|
|
12751
|
+
let e = Rn(bf);
|
|
12720
12752
|
if (!e) throw Error("useChatContext 必须在 provide(chatContextKey) 的组件子树内调用");
|
|
12721
12753
|
return e;
|
|
12722
12754
|
}
|
|
12723
12755
|
//#endregion
|
|
12724
12756
|
//#region src/core/index.headless.ts
|
|
12725
|
-
function
|
|
12726
|
-
return
|
|
12757
|
+
function Cf(e) {
|
|
12758
|
+
return af(e);
|
|
12727
12759
|
}
|
|
12728
12760
|
//#endregion
|
|
12729
|
-
export {
|
|
12761
|
+
export { Vl as CAPABILITIES, Wl as CONTEXT_PRESETS, tl as CompressDecisionSchema, qu as DEFAULT_COMPUTED_STYLES, is as DEFAULT_PROMPT_SOFT_CAP, rc as DEFAULT_SYSTEM_PROMPT, bc as HTML_VOID_TAGS, Ao as HUMAN_CONFIRM_TOOL_NAME, ai as MIN_CONTEXT_WINDOW, rs as SOFT_CAP_MIN_WINDOW, Zo as STOP_WORDS, Aa as UNSAFE_KEYS, hd as actionsToInspectInfo, md as actionsToTools, Qr as agentError, Xs as analyzeContext, Ba as applyPatchToClone, Ua as applyPatchToLive, Zr as asAgentError, Qu as buildCssPath, ac as buildDataPrompt, oc as buildSystemPrompt, bf as chatContextKey, Au as commitSetToBind, nc as connectMcp, m as constructLlmFromConfig, p as constructOpenLlmSync, ff as copyText, Wi as createAgent, ko as createApprovalMiddleware, xf as createChatContext, Cf as createChatSdk, Bo as createCheckpointManager, Vo as createCheckpointMiddleware, pl as createConflictManager, Zs as createContextInspectorMiddleware, Ru as createDataOps, Jc as createHtmlFormatCheck, Zc as createHtmlSubagent, No as createHumanConfirmMiddleware, Mo as createHumanConfirmTool, Pl as createMemoryBackend, So as createMemoryMiddleware, u as createProxyLlm, df as createRagSubagent, ao as createSandboxRunner, Ul as createSdkEvents, Xd as createSerialRunner, Rl as createSessionStore, Od as createSkillStore, Ds as createSubagentMiddleware, us as createSubagentTracker, As as createSubagentsMiddleware, Sd as createUsageHintsMiddleware, js as createVerifyMiddleware, uc as createVfs, Il as createWebStorageBackend, Ls as createWriteBackCheck, Fa as deepClone, vd as defineDataToolset, so as defineSkill, Qc as defineTool, Pa as deleteByPath, nl as deriveTitle, sa as describeSchemaNode, Oi as detectGarbledToolCall, qa as diffObjects, rd as domInfoTool, id as domInspectSkill, nd as domSearchTool, Wu as domToStructure, Ku as domTools, _d as domToolsStatic, Xu as ensureDomListenerRecorder, $o as estimateMessageTokens, es as estimateRoundTokens, X as estimateTokens, g as extractReasoningDelta, ba as extractSchemaHint, Qs as extractText, h as extractTextDelta, _ as extractUsage, Bu as fetchDocTools, gd as fetchTools, ku as filterByToolMode, Ka as findStrippedKeys, ca as formatConstraints, qr as formatZodIssues, Z as getByPath, Gu as getDomTool, td as getElementInfo, sd as getEnvSummary, Zu as getRecordedListeners, Ji as getSchemaAtPath, Gi as getSchemaTopKeys, li as getTraceMetrics, $ as hashValue, ha as htmlOrchestratorPrompt, ts as indexSummarize, ud as inspectEnvTool, dd as inspectTools, rl as isChatModel, yi as isContextLengthError, Ki as isPathAllowed, El as isQuotaError, ja as isUnsafePath, iu as jpEval, Yr as jsonParseError, Ra as limitDepth, Ia as maybeParseValue, y as normalizeUsage, ci as offloadPassThroughChars, si as offloadThresholdChars, ma as presets, ta as projectBySchema, ea as projectBySchemaDeep, La as projectFields, ns as recallRounds, la as renderSchemaHint, ua as renderSchemaOverview, pa as renderSchemaShallow, Hl as resolveCapabilities, Kl as resolveContextOptions, Bl as resolveDialogConfig, fl as resolveLlm, oi as resolveModelCaps, as as resolvePromptSoftCap, zl as resolveStorage, Ga as restoreInPlace, Wa as restoreLive, Xr as routeError, oo as runHostScript, cu as runSandboxedScript, Ma as safeMerge, od as safeSerialize, Q as safeStringify, $u as searchDom, ou as searchJson, yd as selectBuiltinTools, Na as setByPath, os as shouldTriggerCompression, ga as systemPromptHelpers, Qo as tokenize, Y as toolError, qi as unwrapSchema, mf as useChat, Sf as useChatContext, Sc as validateHtmlFormat, e as z, Jr as zodError };
|