page-agent-sdk 4.23.2 → 4.23.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.zh-CN.md +1 -1
- package/dist/page-agent-sdk.headless.js +272 -265
- package/dist/page-agent-sdk.iife.js +33 -33
- package/dist/page-agent-sdk.js +1700 -1693
- package/dist/page-agent-sdk.legacy.js +1116 -1109
- package/dist/page-agent-sdk.umd.cjs +47 -47
- package/package.json +1 -1
|
@@ -13472,11 +13472,18 @@ function tg(e) {
|
|
|
13472
13472
|
return `[data-path="${String(e ?? "").replace(/\\/g, "\\\\").replace(/"/g, "\\\"")}"]`;
|
|
13473
13473
|
}
|
|
13474
13474
|
function ng(e) {
|
|
13475
|
+
try {
|
|
13476
|
+
return !e || typeof e.querySelectorAll != "function" ? 0 : e.querySelectorAll("iframe").length;
|
|
13477
|
+
} catch {
|
|
13478
|
+
return 0;
|
|
13479
|
+
}
|
|
13480
|
+
}
|
|
13481
|
+
function rg(e) {
|
|
13475
13482
|
let [t, n] = e.split(",", 2), r = /:(.*?);/.exec(t)?.[1] ?? "image/png", i = atob(n ?? ""), a = new Uint8Array(i.length);
|
|
13476
13483
|
for (let e = 0; e < i.length; e++) a[e] = i.charCodeAt(e);
|
|
13477
13484
|
return new Blob([a], { type: r });
|
|
13478
13485
|
}
|
|
13479
|
-
function
|
|
13486
|
+
function ig(e, t, n) {
|
|
13480
13487
|
if (n.selector) {
|
|
13481
13488
|
let t = null;
|
|
13482
13489
|
try {
|
|
@@ -13502,7 +13509,7 @@ function rg(e, t, n) {
|
|
|
13502
13509
|
height: i
|
|
13503
13510
|
};
|
|
13504
13511
|
}
|
|
13505
|
-
function
|
|
13512
|
+
function ag(e) {
|
|
13506
13513
|
let n = e.render ?? eg;
|
|
13507
13514
|
return s(async (t) => {
|
|
13508
13515
|
if (typeof document > "u") return "ERROR: take_screenshot 仅在浏览器环境可用(当前运行在 node/服务端,无 DOM)。";
|
|
@@ -13522,52 +13529,52 @@ function ig(e) {
|
|
|
13522
13529
|
}, r = `(取景=聚焦组件 ${n.path},data-path 锚定)`) : r = `(当前聚焦 ${n.path},但未在 DOM 找到对应锚点,已回退视口;要精确截取可传 selector)`;
|
|
13523
13530
|
}
|
|
13524
13531
|
}
|
|
13525
|
-
let a =
|
|
13532
|
+
let a = ig(document, typeof window < "u" ? window : {}, i);
|
|
13526
13533
|
if (!a.ok) return `ERROR: ${a.error}`;
|
|
13527
|
-
let o = a.el ?? e.getRootEl?.() ?? document.documentElement, s = {
|
|
13534
|
+
let o = a.el ?? e.getRootEl?.() ?? document.documentElement, s = ng(o), c = s > 0 ? `⚠️ 取景范围内含 ${s} 个 iframe:跨 frame 内容(如代码组件沙箱)截图捕获不到,图里只会是其外壳/空白区域 —— 验证 iframe 内部请走数据侧核对(read/validate_code/get_dom),勿再对同一区域重复截图。` : "", l = {
|
|
13528
13535
|
width: a.width,
|
|
13529
13536
|
height: a.height
|
|
13530
13537
|
};
|
|
13531
13538
|
if (a.mode === "fullPage") {
|
|
13532
13539
|
let e = Math.max(document.documentElement?.scrollHeight ?? 0, document.body?.scrollHeight ?? 0);
|
|
13533
13540
|
if (e > 32768) return `ERROR: 整页高度 ${e}px 超上限 ${$h}(超长文档渲染会卡死页面)。请改用 selector 分段截取关键区域。`;
|
|
13534
|
-
|
|
13541
|
+
l = {
|
|
13535
13542
|
width: a.width,
|
|
13536
13543
|
height: e
|
|
13537
13544
|
};
|
|
13538
13545
|
}
|
|
13539
|
-
let
|
|
13546
|
+
let u;
|
|
13540
13547
|
try {
|
|
13541
|
-
|
|
13548
|
+
u = await n(o, l);
|
|
13542
13549
|
} catch (e) {
|
|
13543
|
-
return `ERROR: 截图渲染失败(${e instanceof Error ? e.message : String(e)})${r}.常见原因:宿主页面 CSP 禁止 SVG data URL / 跨域图片污染画布 / 元素含无法克隆的内容。建议:① 改用 selector 缩小到目标区域;② 结构验证可改用 get_dom / dom_info(rect+styles);③ 宿主可配 screenshot.renderer
|
|
13550
|
+
return `ERROR: 截图渲染失败(${e instanceof Error ? e.message : String(e)})${r}.常见原因:宿主页面 CSP 禁止 SVG data URL / 跨域图片污染画布 / 元素含无法克隆的内容。建议:① 改用 selector 缩小到目标区域;② 结构验证可改用 get_dom / dom_info(rect+styles);③ 宿主可配 screenshot.renderer 自定义渲染器绕过。${c}`;
|
|
13544
13551
|
}
|
|
13545
|
-
let
|
|
13552
|
+
let d;
|
|
13546
13553
|
try {
|
|
13547
|
-
|
|
13554
|
+
d = await Ei(rg(u), { name: `screenshot-${a.mode}.png` });
|
|
13548
13555
|
} catch (e) {
|
|
13549
|
-
return `ERROR: 截图压缩失败(${e instanceof Error ? e.message : String(e)})
|
|
13556
|
+
return `ERROR: 截图压缩失败(${e instanceof Error ? e.message : String(e)}),未投递。${c}`;
|
|
13550
13557
|
}
|
|
13551
|
-
let
|
|
13558
|
+
let f = e.stow?.(d), p = {
|
|
13552
13559
|
mode: a.mode,
|
|
13553
13560
|
...i.selector ? { selector: i.selector } : {}
|
|
13554
|
-
},
|
|
13555
|
-
|
|
13556
|
-
let
|
|
13557
|
-
if (!
|
|
13561
|
+
}, m = e.getVision();
|
|
13562
|
+
m && e.onShot?.(d, p);
|
|
13563
|
+
let h;
|
|
13564
|
+
if (!m) {
|
|
13558
13565
|
if (!e.describe) return "ERROR: 截图已生成但主模型不支持图片(vision=false)且未配置 images.describe,无处投递。请换多模态模型 / LLMConfig.vision:true / 配置 images.describe(集成方识图旁路)。";
|
|
13559
13566
|
try {
|
|
13560
|
-
|
|
13567
|
+
h = await e.describe(d, { text: `页面截图(${a.mode}${t.selector ? ` ${t.selector}` : ""})` });
|
|
13561
13568
|
} catch {
|
|
13562
|
-
|
|
13569
|
+
h = void 0;
|
|
13563
13570
|
}
|
|
13564
13571
|
}
|
|
13565
|
-
let
|
|
13566
|
-
`截图完成(${a.mode}${i.selector ? ` selector="${i.selector}"` : ""}):${
|
|
13567
|
-
|
|
13568
|
-
`投递形态:${
|
|
13572
|
+
let g = m ? "vision-image(随后的图片消息)" : h ? "describe-text(转述如下)" : "none", _ = [
|
|
13573
|
+
`截图完成(${a.mode}${i.selector ? ` selector="${i.selector}"` : ""}):${d.width}x${d.height},${Math.round((d.bytes ?? 0) / 1024)}KB(jpeg 压缩后)${r}`,
|
|
13574
|
+
f ? `原图已存 vfs:${f}` : "vfs 未开启,原图仅本轮内存",
|
|
13575
|
+
`投递形态:${g}`
|
|
13569
13576
|
];
|
|
13570
|
-
return
|
|
13577
|
+
return c && _.push(c), h && _.push(`识图转述:${h}`), _.join("\n");
|
|
13571
13578
|
}, {
|
|
13572
13579
|
name: "take_screenshot",
|
|
13573
13580
|
description: "截取当前页面图像查看(视觉验证:布局/样式/渲染效果)。聚焦态下**不传 selector 默认截取聚焦组件**(宿主 data-path 锚定 —— 指代问句「这是啥/这里画的是啥」优先此取景,整页截图仅在用户明确要求时用)。selector 截取指定元素区域;fullPage 截整页(超长文档会被拒,改用 selector 分段);都不传且无聚焦截当前视口。只读;截图经压缩后投递(多模态主模型直看图,纯文本模型自动走识图转述)。",
|
|
@@ -13577,7 +13584,7 @@ function ig(e) {
|
|
|
13577
13584
|
})
|
|
13578
13585
|
});
|
|
13579
13586
|
}
|
|
13580
|
-
async function
|
|
13587
|
+
async function og(e) {
|
|
13581
13588
|
if (typeof FileReader < "u") return new Promise((t, n) => {
|
|
13582
13589
|
let r = new FileReader();
|
|
13583
13590
|
r.onload = () => t(String(r.result)), r.onerror = () => n(/* @__PURE__ */ Error("FileReader 读取失败")), r.readAsDataURL(e);
|
|
@@ -13586,7 +13593,7 @@ async function ag(e) {
|
|
|
13586
13593
|
for (let e = 0; e < t.length; e += 8192) n += String.fromCharCode(...t.subarray(e, e + 8192));
|
|
13587
13594
|
return `data:${e.type || "image/png"};base64,${btoa(n)}`;
|
|
13588
13595
|
}
|
|
13589
|
-
function
|
|
13596
|
+
function sg(e) {
|
|
13590
13597
|
let n = e.clientFetch ?? (async (e) => {
|
|
13591
13598
|
try {
|
|
13592
13599
|
return await fetch(e, { mode: "cors" });
|
|
@@ -13602,7 +13609,7 @@ function og(e) {
|
|
|
13602
13609
|
let e = await n(r);
|
|
13603
13610
|
if (e?.ok) {
|
|
13604
13611
|
let t = await e.blob();
|
|
13605
|
-
t.size > 0 && t.size <= 20 * 1024 * 1024 && String(t.type).startsWith("image/") && (i = await
|
|
13612
|
+
t.size > 0 && t.size <= 20 * 1024 * 1024 && String(t.type).startsWith("image/") && (i = await og(t));
|
|
13606
13613
|
}
|
|
13607
13614
|
} catch {}
|
|
13608
13615
|
let a = {
|
|
@@ -13626,13 +13633,13 @@ function og(e) {
|
|
|
13626
13633
|
}
|
|
13627
13634
|
//#endregion
|
|
13628
13635
|
//#region src/core/tools/domEdit.ts
|
|
13629
|
-
var
|
|
13636
|
+
var cg = "data-pg-snap", lg = 20, ug = 256 * 1024, dg = t.enum([
|
|
13630
13637
|
"before",
|
|
13631
13638
|
"after",
|
|
13632
13639
|
"prepend",
|
|
13633
13640
|
"append",
|
|
13634
13641
|
"replace"
|
|
13635
|
-
]),
|
|
13642
|
+
]), fg = /* @__PURE__ */ new Set([
|
|
13636
13643
|
"script",
|
|
13637
13644
|
"iframe",
|
|
13638
13645
|
"object",
|
|
@@ -13640,7 +13647,7 @@ var sg = "data-pg-snap", cg = 20, lg = 256 * 1024, ug = t.enum([
|
|
|
13640
13647
|
"link",
|
|
13641
13648
|
"meta",
|
|
13642
13649
|
"base"
|
|
13643
|
-
]),
|
|
13650
|
+
]), pg = /^on\w+$/i, mg = /* @__PURE__ */ new Set([
|
|
13644
13651
|
"href",
|
|
13645
13652
|
"src",
|
|
13646
13653
|
"action",
|
|
@@ -13648,22 +13655,22 @@ var sg = "data-pg-snap", cg = 20, lg = 256 * 1024, ug = t.enum([
|
|
|
13648
13655
|
"xlink:href",
|
|
13649
13656
|
"data"
|
|
13650
13657
|
]);
|
|
13651
|
-
function
|
|
13658
|
+
function hg(e) {
|
|
13652
13659
|
return /^\s*(javascript|vbscript)\s*:/i.test(e);
|
|
13653
13660
|
}
|
|
13654
|
-
function
|
|
13655
|
-
return !e || !/^[a-zA-Z_:][-a-zA-Z0-9_:.]*$/.test(e) ? `非法属性名 "${e}"` :
|
|
13661
|
+
function gg(e) {
|
|
13662
|
+
return !e || !/^[a-zA-Z_:][-a-zA-Z0-9_:.]*$/.test(e) ? `非法属性名 "${e}"` : pg.test(e) ? `事件属性 ${e} 被拒(on* 内联脚本防误执行)` : null;
|
|
13656
13663
|
}
|
|
13657
|
-
function
|
|
13664
|
+
function _g(e, t) {
|
|
13658
13665
|
let n = [];
|
|
13659
|
-
|
|
13666
|
+
fg.has(e.toLowerCase()) && n.push(`标签 <${e}> 被拒(可执行/页面行为面;文档标注场景请用常规内容标签)`);
|
|
13660
13667
|
for (let [e, r] of Object.entries(t ?? {})) {
|
|
13661
|
-
let t =
|
|
13662
|
-
t ? n.push(t) :
|
|
13668
|
+
let t = gg(e);
|
|
13669
|
+
t ? n.push(t) : mg.has(e.toLowerCase()) && hg(String(r)) && n.push(`${e} 的 javascript:/vbscript: 协议被拒`);
|
|
13663
13670
|
}
|
|
13664
13671
|
return n;
|
|
13665
13672
|
}
|
|
13666
|
-
var
|
|
13673
|
+
var vg = t.discriminatedUnion("op", [
|
|
13667
13674
|
t.object({
|
|
13668
13675
|
op: t.literal("set_text"),
|
|
13669
13676
|
selector: t.string().min(1),
|
|
@@ -13703,7 +13710,7 @@ var _g = t.discriminatedUnion("op", [
|
|
|
13703
13710
|
t.object({
|
|
13704
13711
|
op: t.literal("insert"),
|
|
13705
13712
|
anchor: t.string().min(1).describe("锚元素 selector"),
|
|
13706
|
-
position:
|
|
13713
|
+
position: dg.describe("before/after = 锚前后兄弟;prepend/append = 锚首尾子;replace = 换掉锚本身"),
|
|
13707
13714
|
tag: t.string().min(1).describe("新元素标签名,如 div/span/mark"),
|
|
13708
13715
|
attrs: t.record(t.string(), t.string()).optional(),
|
|
13709
13716
|
text: t.string().optional(),
|
|
@@ -13732,19 +13739,19 @@ var _g = t.discriminatedUnion("op", [
|
|
|
13732
13739
|
note: t.string().optional().describe("可选浮注文案")
|
|
13733
13740
|
})
|
|
13734
13741
|
]);
|
|
13735
|
-
function
|
|
13742
|
+
function yg(e) {
|
|
13736
13743
|
let t = [];
|
|
13737
13744
|
for (let n = 0; n < e.length; n++) {
|
|
13738
13745
|
let r = e[n], i = `patches[${n}](${r.op})`;
|
|
13739
13746
|
if (r.op === "set_attr") {
|
|
13740
|
-
let e =
|
|
13741
|
-
e ? t.push(`${i}: ${e}`) :
|
|
13747
|
+
let e = gg(r.name);
|
|
13748
|
+
e ? t.push(`${i}: ${e}`) : mg.has(r.name.toLowerCase()) && hg(r.value) && t.push(`${i}: ${r.name} 的 javascript:/vbscript: 协议被拒`);
|
|
13742
13749
|
}
|
|
13743
|
-
r.op === "insert" && (t.push(...
|
|
13750
|
+
r.op === "insert" && (t.push(..._g(r.tag, r.attrs).map((e) => `${i}: ${e}`)), r.text !== void 0 && r.html !== void 0 && t.push(`${i}: text 与 html 二选一`)), r.op === "highlight" && r.color && !/^#[0-9a-fA-F]{3,8}$|^[a-zA-Z]+$/.test(r.color) && t.push(`${i}: color 仅接受 hex 或颜色名`);
|
|
13744
13751
|
}
|
|
13745
13752
|
return t;
|
|
13746
13753
|
}
|
|
13747
|
-
function
|
|
13754
|
+
function bg(e = {}) {
|
|
13748
13755
|
let n = [], r = 0, i = () => e.getDocument?.() ?? (typeof document < "u" ? document : null), a = (e, t, n) => {
|
|
13749
13756
|
let r = [];
|
|
13750
13757
|
try {
|
|
@@ -13756,9 +13763,9 @@ function yg(e = {}) {
|
|
|
13756
13763
|
}, o = (e) => ji(e) ? "目标元素位于 SDK 对话框自身 DOM 内,写操作被拒(防 agent 改坏自己的 UI)。请操作宿主页面内容区域" : null, c = (e, t) => {
|
|
13757
13764
|
if (!e) return null;
|
|
13758
13765
|
let n = e.outerHTML;
|
|
13759
|
-
if (n.length >
|
|
13760
|
-
let i = e.getAttribute?.(
|
|
13761
|
-
return i || (i = `pg${++r}`, e.setAttribute?.(
|
|
13766
|
+
if (n.length > ug) return `快照超限:受影响子树 ${(n.length / 1024).toFixed(0)}KB > ${ug / 1024}KB。缩小 selector 到更深的子树再改(快照是回滚安全网,巨树快照爆内存)`;
|
|
13767
|
+
let i = e.getAttribute?.(cg) ?? "";
|
|
13768
|
+
return i || (i = `pg${++r}`, e.setAttribute?.(cg, i)), t.some((e) => e.id === i) || t.push({
|
|
13762
13769
|
id: i,
|
|
13763
13770
|
html: n
|
|
13764
13771
|
}), null;
|
|
@@ -13844,7 +13851,7 @@ function yg(e = {}) {
|
|
|
13844
13851
|
let s = i();
|
|
13845
13852
|
if (!s) return "ERROR: dom_edit 仅在浏览器环境可用(当前运行在 node/服务端,无 DOM)。改数据请用 write 工具。";
|
|
13846
13853
|
if (!t?.length) return "ERROR: patches 不能为空。支持 op:set_text/set_html/set_attr/remove_attr/add_class/remove_class/set_style/insert/remove/move/highlight";
|
|
13847
|
-
let c =
|
|
13854
|
+
let c = yg(t);
|
|
13848
13855
|
if (c.length) return `ERROR: 校验失败(整批拒绝,零改动):\n- ${c.join("\n- ")}`;
|
|
13849
13856
|
let u = (e, t) => {
|
|
13850
13857
|
let n = a(s, e, t);
|
|
@@ -13872,7 +13879,7 @@ function yg(e = {}) {
|
|
|
13872
13879
|
return f.length && (n.push({
|
|
13873
13880
|
snips: f,
|
|
13874
13881
|
ops: d
|
|
13875
|
-
}), n.length >
|
|
13882
|
+
}), n.length > lg && n.shift()), e.onEdit?.({
|
|
13876
13883
|
ops: d,
|
|
13877
13884
|
applied: t.length,
|
|
13878
13885
|
dryRun: !1
|
|
@@ -13881,7 +13888,7 @@ function yg(e = {}) {
|
|
|
13881
13888
|
name: "dom_edit",
|
|
13882
13889
|
description: "修改宿主页面元素(标注/内容/结构):patches 批量原子操作(任一失败整批拒绝)。op 集:set_text/set_html(内容)、set_attr/remove_attr、add_class/remove_class、set_style(样式)、insert(新建元素,before/after/prepend/append/replace)、remove、move(层级调整)、highlight(高亮+滚动定位)。纪律:selector 必须唯一命中(先 get_dom/dom_search 定位);改前自动快照,dom_restore 回滚;数据驱动页面请改数据而非 DOM。",
|
|
13883
13890
|
schema: t.object({
|
|
13884
|
-
patches: t.array(
|
|
13891
|
+
patches: t.array(vg).min(1).max(20).describe("批量操作(原子;顺序应用)"),
|
|
13885
13892
|
dryRun: t.boolean().optional().describe("只校验不落地(预检)")
|
|
13886
13893
|
})
|
|
13887
13894
|
}), d = s(async () => {
|
|
@@ -13891,7 +13898,7 @@ function yg(e = {}) {
|
|
|
13891
13898
|
if (!r) return "无可用快照(栈空)。";
|
|
13892
13899
|
let a = 0, o = [];
|
|
13893
13900
|
for (let e = r.snips.length - 1; e >= 0; e--) {
|
|
13894
|
-
let { id: n, html: i } = r.snips[e], s = t.querySelector(`[${
|
|
13901
|
+
let { id: n, html: i } = r.snips[e], s = t.querySelector(`[${cg}="${n}"]`);
|
|
13895
13902
|
if (!s) {
|
|
13896
13903
|
o.push(n);
|
|
13897
13904
|
continue;
|
|
@@ -13918,14 +13925,14 @@ function yg(e = {}) {
|
|
|
13918
13925
|
}
|
|
13919
13926
|
//#endregion
|
|
13920
13927
|
//#region src/core/sdk/hostWatcher.ts
|
|
13921
|
-
var
|
|
13922
|
-
function xg(e) {
|
|
13923
|
-
return e.kind === "title" ? `页面标题已变更:${bg(e.to, 60)}` : `页面导航:${bg(e.from, 80)} → ${bg(e.to, 80)}`;
|
|
13924
|
-
}
|
|
13928
|
+
var xg = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e;
|
|
13925
13929
|
function Sg(e) {
|
|
13926
|
-
return e.kind === "title" ?
|
|
13930
|
+
return e.kind === "title" ? `页面标题已变更:${xg(e.to, 60)}` : `页面导航:${xg(e.from, 80)} → ${xg(e.to, 80)}`;
|
|
13927
13931
|
}
|
|
13928
13932
|
function Cg(e) {
|
|
13933
|
+
return e.kind === "title" ? 0 : 1;
|
|
13934
|
+
}
|
|
13935
|
+
function wg(e) {
|
|
13929
13936
|
let { target: t, history: n, document: r, MutationObserver: i, onReport: a } = e, o = e.options ?? {}, s = Math.max(0, o.debounceMs ?? 300), c = () => String(t?.location?.href ?? ""), l = () => String(r?.title ?? ""), u = !1, d = null, f = null, p = [], m = c(), h = l(), g = (e) => {
|
|
13930
13937
|
if (u) return;
|
|
13931
13938
|
let t = c();
|
|
@@ -13947,7 +13954,7 @@ function Cg(e) {
|
|
|
13947
13954
|
};
|
|
13948
13955
|
h = e, v(t);
|
|
13949
13956
|
}, v = (e) => {
|
|
13950
|
-
f = f &&
|
|
13957
|
+
f = f && Cg(f) >= Cg(e) ? f : e, d === null && (d = setTimeout(() => {
|
|
13951
13958
|
d = null;
|
|
13952
13959
|
let e = f;
|
|
13953
13960
|
f = null, !(u || !e) && o.ignore?.(e) !== !0 && a(e);
|
|
@@ -13999,22 +14006,22 @@ function Cg(e) {
|
|
|
13999
14006
|
}
|
|
14000
14007
|
//#endregion
|
|
14001
14008
|
//#region src/core/tools/proposalOps.ts
|
|
14002
|
-
var
|
|
14003
|
-
function
|
|
14009
|
+
var Tg = 4e6;
|
|
14010
|
+
function Eg(e, t) {
|
|
14004
14011
|
return t.map((t) => ({
|
|
14005
14012
|
type: e,
|
|
14006
14013
|
text: t
|
|
14007
14014
|
}));
|
|
14008
14015
|
}
|
|
14009
|
-
function
|
|
14016
|
+
function Dg(e, t) {
|
|
14010
14017
|
let n = e ? String(e).split("\n") : [], r = t ? String(t).split("\n") : [], i = 0;
|
|
14011
14018
|
for (; i < n.length && i < r.length && n[i] === r[i];) i += 1;
|
|
14012
14019
|
let a = n.length, o = r.length;
|
|
14013
14020
|
for (; a > i && o > i && n[a - 1] === r[o - 1];) --a, --o;
|
|
14014
|
-
let s = n.slice(i, a), c = r.slice(i, o), l = s.length * c.length >
|
|
14015
|
-
...
|
|
14021
|
+
let s = n.slice(i, a), c = r.slice(i, o), l = s.length * c.length > Tg ? [...Eg("del", s), ...Eg("add", c)] : Og(s, c), u = [
|
|
14022
|
+
...Eg("same", n.slice(0, i)),
|
|
14016
14023
|
...l,
|
|
14017
|
-
...
|
|
14024
|
+
...Eg("same", n.slice(a))
|
|
14018
14025
|
];
|
|
14019
14026
|
return {
|
|
14020
14027
|
rows: u,
|
|
@@ -14024,7 +14031,7 @@ function Eg(e, t) {
|
|
|
14024
14031
|
}
|
|
14025
14032
|
};
|
|
14026
14033
|
}
|
|
14027
|
-
function
|
|
14034
|
+
function Og(e, t) {
|
|
14028
14035
|
let n = e.length, r = t.length, i = new Uint32Array((n + 1) * (r + 1)), a = (e, t) => e * (r + 1) + t;
|
|
14029
14036
|
for (let o = n - 1; o >= 0; --o) for (let n = r - 1; n >= 0; --n) i[a(o, n)] = e[o] === t[n] ? i[a(o + 1, n + 1)] + 1 : Math.max(i[a(o + 1, n)], i[a(o, n + 1)]);
|
|
14030
14037
|
let o = [], s = 0, c = 0;
|
|
@@ -14048,13 +14055,13 @@ function Dg(e, t) {
|
|
|
14048
14055
|
}), c += 1;
|
|
14049
14056
|
return o;
|
|
14050
14057
|
}
|
|
14051
|
-
function
|
|
14058
|
+
function kg(e, t) {
|
|
14052
14059
|
if (!t) return 0;
|
|
14053
14060
|
let n = 0, r = e.indexOf(t);
|
|
14054
14061
|
for (; r !== -1;) n += 1, r = e.indexOf(t, r + t.length);
|
|
14055
14062
|
return n;
|
|
14056
14063
|
}
|
|
14057
|
-
function
|
|
14064
|
+
function Ag(e, t) {
|
|
14058
14065
|
let n = String(e ?? "");
|
|
14059
14066
|
for (let e = 0; e < t.length; e += 1) {
|
|
14060
14067
|
let r = t[e];
|
|
@@ -14063,7 +14070,7 @@ function kg(e, t) {
|
|
|
14063
14070
|
error: `第 ${e + 1} 个 op 格式无效`
|
|
14064
14071
|
};
|
|
14065
14072
|
if (r.op === "replace") {
|
|
14066
|
-
let t =
|
|
14073
|
+
let t = kg(n, r.find);
|
|
14067
14074
|
if (t === 0) return {
|
|
14068
14075
|
ok: !1,
|
|
14069
14076
|
error: `第 ${e + 1} 个 op(replace)锚点未命中 —— 锚文本在当前内容中不存在(可能锚写错或基底已变),请核对 read_content 的原文后重试`
|
|
@@ -14074,7 +14081,7 @@ function kg(e, t) {
|
|
|
14074
14081
|
};
|
|
14075
14082
|
n = n.replace(r.find, r.with);
|
|
14076
14083
|
} else if (r.op === "insertAfter" || r.op === "insertBefore") {
|
|
14077
|
-
let t =
|
|
14084
|
+
let t = kg(n, r.anchor);
|
|
14078
14085
|
if (t === 0) return {
|
|
14079
14086
|
ok: !1,
|
|
14080
14087
|
error: `第 ${e + 1} 个 op(${r.op})锚点未命中 —— 请核对 read_content 的原文后重试`
|
|
@@ -14096,14 +14103,14 @@ function kg(e, t) {
|
|
|
14096
14103
|
content: n
|
|
14097
14104
|
};
|
|
14098
14105
|
}
|
|
14099
|
-
function
|
|
14106
|
+
function jg(e) {
|
|
14100
14107
|
let t = String(e ?? ""), n = 2166136261;
|
|
14101
14108
|
for (let e = 0; e < t.length; e += 1) n ^= t.charCodeAt(e), n = Math.imul(n, 16777619);
|
|
14102
14109
|
return (n >>> 0).toString(36);
|
|
14103
14110
|
}
|
|
14104
14111
|
//#endregion
|
|
14105
14112
|
//#region src/core/sdk/proposals.ts
|
|
14106
|
-
function
|
|
14113
|
+
function Mg(e) {
|
|
14107
14114
|
return {
|
|
14108
14115
|
read: e.read,
|
|
14109
14116
|
onProposal: e.onProposal,
|
|
@@ -14113,14 +14120,14 @@ function jg(e) {
|
|
|
14113
14120
|
maxPending: Math.max(1, e.maxPending ?? 1)
|
|
14114
14121
|
};
|
|
14115
14122
|
}
|
|
14116
|
-
async function
|
|
14123
|
+
async function Ng(e) {
|
|
14117
14124
|
try {
|
|
14118
14125
|
return await e.read();
|
|
14119
14126
|
} catch (e) {
|
|
14120
14127
|
return { __err: e };
|
|
14121
14128
|
}
|
|
14122
14129
|
}
|
|
14123
|
-
var
|
|
14130
|
+
var Pg = t.discriminatedUnion("op", [
|
|
14124
14131
|
t.object({
|
|
14125
14132
|
op: t.literal("replace"),
|
|
14126
14133
|
find: t.string().min(1).describe("要替换的原文片段(字面匹配,须在全文唯一 —— 多带上下文保唯一)"),
|
|
@@ -14141,8 +14148,8 @@ var Ng = t.discriminatedUnion("op", [
|
|
|
14141
14148
|
text: t.string().describe("追加到全文末尾的文本")
|
|
14142
14149
|
})
|
|
14143
14150
|
]);
|
|
14144
|
-
function
|
|
14145
|
-
let r =
|
|
14151
|
+
function Fg(e, n) {
|
|
14152
|
+
let r = Mg(e), i = {
|
|
14146
14153
|
pending: [],
|
|
14147
14154
|
applied: 0,
|
|
14148
14155
|
discarded: 0,
|
|
@@ -14183,11 +14190,11 @@ function Pg(e, n) {
|
|
|
14183
14190
|
summary: o.summary
|
|
14184
14191
|
}), !0;
|
|
14185
14192
|
}, c = s(async () => {
|
|
14186
|
-
let e = await
|
|
14193
|
+
let e = await Ng(r);
|
|
14187
14194
|
if (e && typeof e == "object" && "__err" in e) return `读取失败:${String(e.__err ?? "未知错误")}。请如实告知用户,不要编造内容。`;
|
|
14188
14195
|
let t = e;
|
|
14189
14196
|
if (!t || typeof t.content != "string") return "当前没有可编辑的内容对象(宿主 read 返回空)。请如实告知用户,不要编造内容。";
|
|
14190
|
-
let i =
|
|
14197
|
+
let i = jg(t.content);
|
|
14191
14198
|
return n.log("read", {
|
|
14192
14199
|
hash: i,
|
|
14193
14200
|
chars: t.content.length
|
|
@@ -14199,7 +14206,7 @@ function Pg(e, n) {
|
|
|
14199
14206
|
}), l = t.object({
|
|
14200
14207
|
summary: t.string().describe("一句话修改说明(展示在评审面板):改了什么、为什么"),
|
|
14201
14208
|
baseHash: t.string().describe("read_content 返回的 hash(基底锚定;基底已变会被拒,须重读)"),
|
|
14202
|
-
ops: t.array(
|
|
14209
|
+
ops: t.array(Pg).min(1).max(50).optional().describe("增量操作(顺序应用,原子;推荐 —— token 只花在改动上,勿全量重发)"),
|
|
14203
14210
|
content: t.string().optional().describe(`修改后的完整${r.contentKind}(小改动可直发;与 ops 二选一)`)
|
|
14204
14211
|
}).superRefine((e, n) => {
|
|
14205
14212
|
(Array.isArray(e.ops) && e.ops.length > 0) === (typeof e.content == "string" && e.content.length > 0) && n.addIssue({
|
|
@@ -14207,13 +14214,13 @@ function Pg(e, n) {
|
|
|
14207
14214
|
message: "ops 与 content 必须二选一(且只给一个)"
|
|
14208
14215
|
});
|
|
14209
14216
|
}), u = [c, s(async (e) => {
|
|
14210
|
-
let t = await
|
|
14217
|
+
let t = await Ng(r);
|
|
14211
14218
|
if (t && typeof t == "object" && "__err" in t) return `提案被拒:读取当前内容失败(${String(t.__err ?? "未知错误")})。`;
|
|
14212
14219
|
let a = t;
|
|
14213
14220
|
if (!a || typeof a.content != "string") return "提案被拒:当前没有可编辑的内容对象。";
|
|
14214
|
-
let o = a.content, s = typeof a.label == "string" ? a.label : void 0, c =
|
|
14221
|
+
let o = a.content, s = typeof a.label == "string" ? a.label : void 0, c = jg(o);
|
|
14215
14222
|
if (e.baseHash !== c) return n.log("rejected", { reason: "base_hash_mismatch" }), `提案被拒:基底已变(read_content 之后内容被修改,hash 不匹配)。请重新 ${r.readToolName} 取当前原文与 hash 后基于新基底重提 —— 不要在旧印象上猜测改动。`;
|
|
14216
|
-
let l = Array.isArray(e.ops) && e.ops.length > 0 ?
|
|
14223
|
+
let l = Array.isArray(e.ops) && e.ops.length > 0 ? Ag(o, e.ops) : {
|
|
14217
14224
|
ok: !0,
|
|
14218
14225
|
content: String(e.content ?? "")
|
|
14219
14226
|
};
|
|
@@ -14236,7 +14243,7 @@ function Pg(e, n) {
|
|
|
14236
14243
|
baseHash: c,
|
|
14237
14244
|
baseContent: o,
|
|
14238
14245
|
content: u,
|
|
14239
|
-
diff:
|
|
14246
|
+
diff: Dg(o, u),
|
|
14240
14247
|
createdAt: Date.now()
|
|
14241
14248
|
};
|
|
14242
14249
|
i.pending.push(d), n.log("pending", {
|
|
@@ -14273,8 +14280,8 @@ function Pg(e, n) {
|
|
|
14273
14280
|
}
|
|
14274
14281
|
//#endregion
|
|
14275
14282
|
//#region src/core/tools/fetchDoc.ts
|
|
14276
|
-
var
|
|
14277
|
-
let n = new AbortController(), r = setTimeout(() => n.abort(),
|
|
14283
|
+
var Ig = 3e4, Lg = [s(async ({ url: e, as: t }) => {
|
|
14284
|
+
let n = new AbortController(), r = setTimeout(() => n.abort(), Ig);
|
|
14278
14285
|
try {
|
|
14279
14286
|
let r = await fetch(e, {
|
|
14280
14287
|
method: "GET",
|
|
@@ -14291,7 +14298,7 @@ var Fg = 3e4, Ig = [s(async ({ url: e, as: t }) => {
|
|
|
14291
14298
|
].join("\n");
|
|
14292
14299
|
} catch (t) {
|
|
14293
14300
|
let r = t?.message || String(t);
|
|
14294
|
-
return n.signal.aborted ? `获取失败:请求超时(${
|
|
14301
|
+
return n.signal.aborted ? `获取失败:请求超时(${Ig}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
|
|
14295
14302
|
} finally {
|
|
14296
14303
|
clearTimeout(r);
|
|
14297
14304
|
}
|
|
@@ -14302,7 +14309,7 @@ var Fg = 3e4, Ig = [s(async ({ url: e, as: t }) => {
|
|
|
14302
14309
|
url: t.string().describe("要抓取的 URL(同源或已配 CORS)"),
|
|
14303
14310
|
as: t.enum(["text", "markdown"]).optional().describe("返回格式标签,默认 text")
|
|
14304
14311
|
})
|
|
14305
|
-
})],
|
|
14312
|
+
})], Rg = [
|
|
14306
14313
|
"id",
|
|
14307
14314
|
"class",
|
|
14308
14315
|
"href",
|
|
@@ -14314,12 +14321,12 @@ var Fg = 3e4, Ig = [s(async ({ url: e, as: t }) => {
|
|
|
14314
14321
|
"aria-label",
|
|
14315
14322
|
"name",
|
|
14316
14323
|
"type"
|
|
14317
|
-
],
|
|
14318
|
-
function
|
|
14324
|
+
], zg = /^(value|srcdoc|formaction|on\w+)$/i, Bg = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session/i;
|
|
14325
|
+
function Vg(e, t) {
|
|
14319
14326
|
if (!e) return null;
|
|
14320
|
-
let { depth: n, attrs: r, includeText: i = !0 } = t, a = r !== void 0, o = r ??
|
|
14327
|
+
let { depth: n, attrs: r, includeText: i = !0 } = t, a = r !== void 0, o = r ?? Rg, s = (e) => {
|
|
14321
14328
|
let t = {};
|
|
14322
|
-
for (let n of Array.from(e.attributes)) (a ? o.includes(n.name) : o.includes(n.name) || n.name.startsWith("data-")) && (
|
|
14329
|
+
for (let n of Array.from(e.attributes)) (a ? o.includes(n.name) : o.includes(n.name) || n.name.startsWith("data-")) && (zg.test(n.name) || Bg.test(n.name) || (t[n.name] = n.value));
|
|
14323
14330
|
return t;
|
|
14324
14331
|
}, c = (e, t) => {
|
|
14325
14332
|
let n = {
|
|
@@ -14335,11 +14342,11 @@ function Bg(e, t) {
|
|
|
14335
14342
|
};
|
|
14336
14343
|
return c(e, n);
|
|
14337
14344
|
}
|
|
14338
|
-
var
|
|
14345
|
+
var Hg = s(({ selector: e, depth: t, attrs: n, includeText: r }) => {
|
|
14339
14346
|
if (typeof document > "u") return "ERROR: get_dom 仅在浏览器环境可用(当前运行在 node/服务端,无 DOM)。请改用数据工具(read/schema_data)排查结构。";
|
|
14340
14347
|
let i = e ? document.querySelector(e) : document.body;
|
|
14341
14348
|
if (!i) return `未找到匹配元素:selector="${e}"`;
|
|
14342
|
-
let a =
|
|
14349
|
+
let a = Vg(i, {
|
|
14343
14350
|
depth: t ?? 3,
|
|
14344
14351
|
attrs: n,
|
|
14345
14352
|
includeText: r ?? !0
|
|
@@ -14354,7 +14361,7 @@ var Vg = s(({ selector: e, depth: t, attrs: n, includeText: r }) => {
|
|
|
14354
14361
|
attrs: t.array(t.string()).optional().describe("属性白名单(传了 = 严格白名单;不传 = 默认常用 + data-*)"),
|
|
14355
14362
|
includeText: t.boolean().optional().describe("是否包含直接文本(默认 true)")
|
|
14356
14363
|
})
|
|
14357
|
-
}),
|
|
14364
|
+
}), Ug = [
|
|
14358
14365
|
"article",
|
|
14359
14366
|
"main",
|
|
14360
14367
|
"[role=\"main\"]",
|
|
@@ -14363,7 +14370,7 @@ var Vg = s(({ selector: e, depth: t, attrs: n, includeText: r }) => {
|
|
|
14363
14370
|
".post-content",
|
|
14364
14371
|
".markdown-body",
|
|
14365
14372
|
"#content"
|
|
14366
|
-
],
|
|
14373
|
+
], Wg = /* @__PURE__ */ new Set([
|
|
14367
14374
|
"script",
|
|
14368
14375
|
"style",
|
|
14369
14376
|
"noscript",
|
|
@@ -14371,15 +14378,15 @@ var Vg = s(({ selector: e, depth: t, attrs: n, includeText: r }) => {
|
|
|
14371
14378
|
"svg",
|
|
14372
14379
|
"iframe",
|
|
14373
14380
|
"canvas"
|
|
14374
|
-
]),
|
|
14375
|
-
function
|
|
14376
|
-
for (let t of
|
|
14381
|
+
]), Gg = "script,style,noscript,template,svg,iframe,canvas";
|
|
14382
|
+
function Kg(e) {
|
|
14383
|
+
for (let t of Ug) try {
|
|
14377
14384
|
let n = e.querySelector?.(t);
|
|
14378
14385
|
if (n) return n;
|
|
14379
14386
|
} catch {}
|
|
14380
14387
|
return e.body ?? null;
|
|
14381
14388
|
}
|
|
14382
|
-
function
|
|
14389
|
+
function qg(e, t, n) {
|
|
14383
14390
|
if (!e) return "";
|
|
14384
14391
|
let r = [], i = (e) => {
|
|
14385
14392
|
let t = (e.innerText ?? e.textContent ?? "").replace(/\r\n/g, "\n").replace(/\n{3,}/g, "\n\n").trim();
|
|
@@ -14387,7 +14394,7 @@ function Kg(e, t, n) {
|
|
|
14387
14394
|
}, a = (e) => {
|
|
14388
14395
|
for (let r of Array.from(e.children ?? [])) {
|
|
14389
14396
|
let e = r, o = String(e.tagName ?? "").toLowerCase();
|
|
14390
|
-
if (!(t(e) ||
|
|
14397
|
+
if (!(t(e) || Wg.has(o))) {
|
|
14391
14398
|
if (!n(e)) {
|
|
14392
14399
|
i(e);
|
|
14393
14400
|
continue;
|
|
@@ -14398,21 +14405,21 @@ function Kg(e, t, n) {
|
|
|
14398
14405
|
};
|
|
14399
14406
|
return a(e), r.join("\n\n").trim();
|
|
14400
14407
|
}
|
|
14401
|
-
function
|
|
14408
|
+
function Jg(e) {
|
|
14402
14409
|
try {
|
|
14403
|
-
return e.querySelector?.(
|
|
14410
|
+
return e.querySelector?.(Gg) != null || e.querySelector?.(".chat-dialog, .chat-mask, .debug-drawer, .skill-mask, .skill-panel, .chat-selection-menu") != null;
|
|
14404
14411
|
} catch {
|
|
14405
14412
|
return !0;
|
|
14406
14413
|
}
|
|
14407
14414
|
}
|
|
14408
|
-
var
|
|
14415
|
+
var Yg = [Hg, s(({ selector: e, offset: t, limit: n }) => {
|
|
14409
14416
|
if (typeof document > "u") return "ERROR: read_page 仅在浏览器环境可用(当前运行在 node/服务端,无 DOM)。请基于用户消息中的引用原文回答。";
|
|
14410
14417
|
let r, i;
|
|
14411
14418
|
if (e) {
|
|
14412
14419
|
if (r = document.querySelector(e), !r) return `未找到匹配元素:selector="${e}"`;
|
|
14413
14420
|
i = e;
|
|
14414
|
-
} else r =
|
|
14415
|
-
let a =
|
|
14421
|
+
} else r = Kg(document), i = r ? r.tagName.toLowerCase() : "body";
|
|
14422
|
+
let a = qg(r, ji, Jg), o = t ?? 0, s = n ?? 4e3;
|
|
14416
14423
|
if (o > a.length) return `offset=${o} 超出正文长度 ${a.length}(先从 offset=0 读,按 hasMore 续读)`;
|
|
14417
14424
|
let c = a.slice(o, o + s);
|
|
14418
14425
|
return JSON.stringify({
|
|
@@ -14431,22 +14438,22 @@ var Jg = [Vg, s(({ selector: e, offset: t, limit: n }) => {
|
|
|
14431
14438
|
offset: t.number().int().min(0).optional().describe("起始字符偏移(默认 0;续读传上次 offset + 返回 text 长度)"),
|
|
14432
14439
|
limit: t.number().int().min(200).max(2e4).optional().describe("本次返回字符上限(默认 4000,上限 20000)")
|
|
14433
14440
|
})
|
|
14434
|
-
})],
|
|
14435
|
-
function
|
|
14436
|
-
if (
|
|
14441
|
+
})], Xg = /* @__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("."), Zg = /* @__PURE__ */ new WeakMap(), Qg = !1;
|
|
14442
|
+
function $g() {
|
|
14443
|
+
if (Qg) return;
|
|
14437
14444
|
let e = globalThis.EventTarget;
|
|
14438
14445
|
if (!e?.prototype?.addEventListener) return;
|
|
14439
|
-
|
|
14446
|
+
Qg = !0;
|
|
14440
14447
|
let t = e.prototype.addEventListener, n = e.prototype.removeEventListener;
|
|
14441
14448
|
e.prototype.addEventListener = function(e, ...n) {
|
|
14442
14449
|
try {
|
|
14443
|
-
let t =
|
|
14444
|
-
t || (t = /* @__PURE__ */ new Map(),
|
|
14450
|
+
let t = Zg.get(this);
|
|
14451
|
+
t || (t = /* @__PURE__ */ new Map(), Zg.set(this, t)), t.set(String(e), (t.get(String(e)) ?? 0) + 1);
|
|
14445
14452
|
} catch {}
|
|
14446
14453
|
return t.call(this, e, ...n);
|
|
14447
14454
|
}, e.prototype.removeEventListener = function(e, ...t) {
|
|
14448
14455
|
try {
|
|
14449
|
-
let t =
|
|
14456
|
+
let t = Zg.get(this);
|
|
14450
14457
|
if (t) {
|
|
14451
14458
|
let n = (t.get(String(e)) ?? 1) - 1;
|
|
14452
14459
|
n <= 0 ? t.delete(String(e)) : t.set(String(e), n);
|
|
@@ -14455,10 +14462,10 @@ function Qg() {
|
|
|
14455
14462
|
return n.call(this, e, ...t);
|
|
14456
14463
|
};
|
|
14457
14464
|
}
|
|
14458
|
-
function
|
|
14459
|
-
return [...
|
|
14465
|
+
function e_(e) {
|
|
14466
|
+
return [...Zg.get(e)?.entries() ?? []].filter(([, e]) => e > 0).map(([e]) => e);
|
|
14460
14467
|
}
|
|
14461
|
-
function
|
|
14468
|
+
function t_(e, t = 12) {
|
|
14462
14469
|
let n = [], r = e, i = 0;
|
|
14463
14470
|
for (; r && r.tagName && i < t;) {
|
|
14464
14471
|
let e = r.tagName.toLowerCase(), t = r.id;
|
|
@@ -14479,7 +14486,7 @@ function e_(e, t = 12) {
|
|
|
14479
14486
|
}
|
|
14480
14487
|
return n.join(" > ");
|
|
14481
14488
|
}
|
|
14482
|
-
function
|
|
14489
|
+
function n_(e, t, n = {}) {
|
|
14483
14490
|
if (!e) return {
|
|
14484
14491
|
hits: [],
|
|
14485
14492
|
total: 0,
|
|
@@ -14517,7 +14524,7 @@ function t_(e, t, n = {}) {
|
|
|
14517
14524
|
n = r.slice(Math.max(0, i - 20), i + t.length + 40);
|
|
14518
14525
|
}
|
|
14519
14526
|
return {
|
|
14520
|
-
selector:
|
|
14527
|
+
selector: t_(e),
|
|
14521
14528
|
tag: e.tagName.toLowerCase(),
|
|
14522
14529
|
text: n.slice(0, 120)
|
|
14523
14530
|
};
|
|
@@ -14526,7 +14533,7 @@ function t_(e, t, n = {}) {
|
|
|
14526
14533
|
truncated: a.length > o
|
|
14527
14534
|
};
|
|
14528
14535
|
}
|
|
14529
|
-
var
|
|
14536
|
+
var r_ = [
|
|
14530
14537
|
"content",
|
|
14531
14538
|
"display",
|
|
14532
14539
|
"width",
|
|
@@ -14534,14 +14541,14 @@ var n_ = [
|
|
|
14534
14541
|
"background-color",
|
|
14535
14542
|
"position"
|
|
14536
14543
|
];
|
|
14537
|
-
function
|
|
14544
|
+
function i_(e, t = {}) {
|
|
14538
14545
|
if (!e) return null;
|
|
14539
14546
|
let n = {
|
|
14540
|
-
selector:
|
|
14547
|
+
selector: t_(e),
|
|
14541
14548
|
tag: e.tagName.toLowerCase(),
|
|
14542
14549
|
attrs: {}
|
|
14543
14550
|
};
|
|
14544
|
-
for (let t of Array.from(e.attributes)) !(
|
|
14551
|
+
for (let t of Array.from(e.attributes)) !(Rg.includes(t.name) || t.name.startsWith("data-")) || zg.test(t.name) || Bg.test(t.name) || (n.attrs[t.name] = t.value);
|
|
14545
14552
|
let r = Array.from(e.childNodes).filter((e) => e.nodeType === 3).map((e) => e.textContent || "").join("").trim();
|
|
14546
14553
|
r && (n.text = r.slice(0, 400));
|
|
14547
14554
|
let i = String(e.innerText ?? e.textContent ?? "").trim();
|
|
@@ -14563,7 +14570,7 @@ function r_(e, t = {}) {
|
|
|
14563
14570
|
if (typeof a != "function") return r;
|
|
14564
14571
|
try {
|
|
14565
14572
|
let i = a(e, n ?? null);
|
|
14566
|
-
for (let e of n ?
|
|
14573
|
+
for (let e of n ? r_ : t.styles ?? Xg) {
|
|
14567
14574
|
let t = typeof i.getPropertyValue == "function" ? i.getPropertyValue(e) : i[e];
|
|
14568
14575
|
t && (r[e] = String(t).slice(0, 200));
|
|
14569
14576
|
}
|
|
@@ -14581,16 +14588,16 @@ function r_(e, t = {}) {
|
|
|
14581
14588
|
n.events = {
|
|
14582
14589
|
inline: t,
|
|
14583
14590
|
vue: r ? Object.keys(r).filter((e) => /^on[A-Z]/.test(e)).map((e) => e.slice(2).toLowerCase()) : [],
|
|
14584
|
-
captured:
|
|
14591
|
+
captured: e_(e)
|
|
14585
14592
|
};
|
|
14586
14593
|
}
|
|
14587
14594
|
return n;
|
|
14588
14595
|
}
|
|
14589
|
-
var
|
|
14590
|
-
|
|
14596
|
+
var a_ = s(({ query: e, mode: t, limit: n, root: r }) => {
|
|
14597
|
+
$g();
|
|
14591
14598
|
let i = r ? document.querySelector(r) : document;
|
|
14592
14599
|
if (r && !i) return `未找到 root 元素:selector="${r}"`;
|
|
14593
|
-
let a =
|
|
14600
|
+
let a = n_(i, e, {
|
|
14594
14601
|
mode: t,
|
|
14595
14602
|
limit: n
|
|
14596
14603
|
});
|
|
@@ -14607,11 +14614,11 @@ var i_ = s(({ query: e, mode: t, limit: n, root: r }) => {
|
|
|
14607
14614
|
limit: t.number().int().min(1).max(20).optional().describe("返回上限(默认 10)"),
|
|
14608
14615
|
root: t.string().optional().describe("限定搜索范围的容器选择器(默认整页)")
|
|
14609
14616
|
})
|
|
14610
|
-
}),
|
|
14611
|
-
|
|
14617
|
+
}), o_ = s(({ selector: e, styles: t, includeHtml: n, htmlLimit: r, includeEvents: i, includeRect: a, pseudo: o }) => {
|
|
14618
|
+
$g();
|
|
14612
14619
|
let s = document.querySelector(e);
|
|
14613
14620
|
if (!s) return `未找到匹配元素:selector="${e}"(可先用 dom_search 定位)`;
|
|
14614
|
-
let c =
|
|
14621
|
+
let c = i_(s, {
|
|
14615
14622
|
styles: t,
|
|
14616
14623
|
includeHtml: n,
|
|
14617
14624
|
htmlLimit: r,
|
|
@@ -14632,10 +14639,10 @@ var i_ = s(({ query: e, mode: t, limit: n, root: r }) => {
|
|
|
14632
14639
|
includeRect: t.boolean().optional().describe("是否含几何位置(默认 true)"),
|
|
14633
14640
|
pseudo: t.boolean().optional().describe("是否含 ::before/::after 伪元素摘要(默认 false)")
|
|
14634
14641
|
})
|
|
14635
|
-
}),
|
|
14636
|
-
function
|
|
14642
|
+
}), s_ = "dom-inspect";
|
|
14643
|
+
function c_(e = {}) {
|
|
14637
14644
|
return {
|
|
14638
|
-
name:
|
|
14645
|
+
name: s_,
|
|
14639
14646
|
description: "页面 DOM 深度检视工具(dom_search 搜索元素 / dom_info 读内容·计算样式·事件绑定·几何)。定位元素、验证样式落地、排查交互绑定时加载",
|
|
14640
14647
|
getContent: () => [
|
|
14641
14648
|
"# DOM 检视工具用法",
|
|
@@ -14666,13 +14673,13 @@ function s_(e = {}) {
|
|
|
14666
14673
|
"## 排障套路",
|
|
14667
14674
|
...e.withScreenshot ? ["1. dom_search(mode:\"text\", query:按钮文案) 定位 → 2. 视觉验证 take_screenshot / 结构验证 dom_info(styles) → 3. " + (e.withDataOps ? "不符则改数据(write 修正后再验证)" : "不符则如实报告差异(页面为真值;本页面无数据写通道,调整预期或告知用户)")] : ["1. dom_search(mode:\"text\", query:按钮文案) 定位 → 2. dom_info(styles:[\"display\",\"background-color\",\"pointer-events\"]) 验证样式/点击性 → 3. " + (e.withDataOps ? "不符则改数据(write 修正后再验证)" : "不符则如实报告差异(页面为真值;本页面无数据写通道,调整预期或告知用户)")]
|
|
14668
14675
|
].join("\n"),
|
|
14669
|
-
tools: [() => [
|
|
14676
|
+
tools: [() => [a_, o_]]
|
|
14670
14677
|
};
|
|
14671
14678
|
}
|
|
14672
|
-
var
|
|
14673
|
-
function
|
|
14679
|
+
var l_ = "page-analysis";
|
|
14680
|
+
function u_(e = {}) {
|
|
14674
14681
|
return {
|
|
14675
|
-
name:
|
|
14682
|
+
name: l_,
|
|
14676
14683
|
description: "页面内容分析策略:按问题类型选工具(引用原文/整页理解/定位/结构/视觉/页面操作),含分页探索纪律与基于页面实料的回答纪律。回答用户关于当前页面的问题时加载",
|
|
14677
14684
|
getContent: () => [
|
|
14678
14685
|
"# 页面内容分析策略",
|
|
@@ -14701,14 +14708,14 @@ function l_(e = {}) {
|
|
|
14701
14708
|
].join("\n")
|
|
14702
14709
|
};
|
|
14703
14710
|
}
|
|
14704
|
-
var
|
|
14711
|
+
var d_ = c_();
|
|
14705
14712
|
//#endregion
|
|
14706
14713
|
//#region src/core/tools/envTool.ts
|
|
14707
|
-
function
|
|
14714
|
+
function f_(e) {
|
|
14708
14715
|
let t = e;
|
|
14709
14716
|
return typeof t.tagName == "string" || typeof t.nodeType == "number" && typeof t.nodeName == "string";
|
|
14710
14717
|
}
|
|
14711
|
-
function
|
|
14718
|
+
function p_(e, t = 3, n = 2e3, r, i) {
|
|
14712
14719
|
if (e == null) return e;
|
|
14713
14720
|
if (typeof e == "string") return e.length > n ? e.slice(0, n) + "…(已截断)" : e;
|
|
14714
14721
|
if (typeof e == "number" || typeof e == "boolean") return e;
|
|
@@ -14717,14 +14724,14 @@ function f_(e, t = 3, n = 2e3, r, i) {
|
|
|
14717
14724
|
if (typeof e == "bigint") return `${e.toString()}n`;
|
|
14718
14725
|
if (typeof e != "object") return String(e);
|
|
14719
14726
|
let a = e;
|
|
14720
|
-
if (
|
|
14727
|
+
if (f_(a)) {
|
|
14721
14728
|
let e = a;
|
|
14722
14729
|
return e.tagName ? `[Element: <${e.tagName.toLowerCase()}>]` : `[Node: ${e.nodeName}]`;
|
|
14723
14730
|
}
|
|
14724
14731
|
if (r?.has(a)) return "[Circular]";
|
|
14725
14732
|
let o = r ?? /* @__PURE__ */ new WeakSet();
|
|
14726
14733
|
if (o.add(a), Array.isArray(e)) {
|
|
14727
|
-
let r = e.slice(0, 100).map((e) =>
|
|
14734
|
+
let r = e.slice(0, 100).map((e) => p_(e, t - 1, n, o, i));
|
|
14728
14735
|
return e.length > 100 && r.push(`…(共 ${e.length} 项,已截断)`), r;
|
|
14729
14736
|
}
|
|
14730
14737
|
if (t < 0) return "(对象,已截断)";
|
|
@@ -14737,14 +14744,14 @@ function f_(e, t = 3, n = 2e3, r, i) {
|
|
|
14737
14744
|
}
|
|
14738
14745
|
try {
|
|
14739
14746
|
let e = a[r];
|
|
14740
|
-
i?.test(r) ? s[r] = "[REDACTED]" : s[r] =
|
|
14747
|
+
i?.test(r) ? s[r] = "[REDACTED]" : s[r] = p_(e, t - 1, n, o, i);
|
|
14741
14748
|
} catch {
|
|
14742
14749
|
s[r] = "(getter 抛错)";
|
|
14743
14750
|
}
|
|
14744
14751
|
}
|
|
14745
14752
|
return s;
|
|
14746
14753
|
}
|
|
14747
|
-
function
|
|
14754
|
+
function m_(e) {
|
|
14748
14755
|
let t = e ?? (typeof window < "u" ? window : {}), n = t.navigator, r = t.location, i = t.document;
|
|
14749
14756
|
return {
|
|
14750
14757
|
location: {
|
|
@@ -14777,9 +14784,9 @@ function p_(e) {
|
|
|
14777
14784
|
} : "(无 document)"
|
|
14778
14785
|
};
|
|
14779
14786
|
}
|
|
14780
|
-
var
|
|
14787
|
+
var h_ = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|opener|parent|top|self|window|globalThis|closed|history|navigation|trustedTypes|origin|crossOriginIsolated)$/, g_ = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session|ticket/i, __ = s(({ key: e }) => {
|
|
14781
14788
|
if (e) {
|
|
14782
|
-
if (
|
|
14789
|
+
if (h_.test(e) || g_.test(e)) return JSON.stringify({
|
|
14783
14790
|
key: e,
|
|
14784
14791
|
denied: !0,
|
|
14785
14792
|
reason: "安全:该 key 在 denylist(localStorage/sessionStorage/cookie/document 或敏感命名 token/secret/key/auth),不读取防泄漏"
|
|
@@ -14789,18 +14796,18 @@ var m_ = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|open
|
|
|
14789
14796
|
key: e,
|
|
14790
14797
|
exists: t !== void 0,
|
|
14791
14798
|
type: typeof t,
|
|
14792
|
-
value:
|
|
14799
|
+
value: p_(t, 3, 2e3, void 0, g_)
|
|
14793
14800
|
}, null, 2);
|
|
14794
14801
|
}
|
|
14795
|
-
return JSON.stringify(
|
|
14802
|
+
return JSON.stringify(m_(), null, 2);
|
|
14796
14803
|
}, {
|
|
14797
14804
|
name: "inspect_env",
|
|
14798
14805
|
description: "读宿主页面环境信息(排查调试)。不传参返回摘要(URL/origin、浏览器/语言、viewport、title/readyState);传 key 读指定 window 属性值(如 key:\"appConfig\")。只读,大结果自动外存 vfs。",
|
|
14799
14806
|
schema: t.object({ key: t.string().optional().describe("要读取的 window 属性名(如 \"appConfig\"/\"__DEBUG__\");不传 = 返回环境摘要") })
|
|
14800
|
-
}),
|
|
14807
|
+
}), v_ = [__];
|
|
14801
14808
|
//#endregion
|
|
14802
14809
|
//#region src/core/harness/budget.ts
|
|
14803
|
-
function
|
|
14810
|
+
function y_(e, t, n) {
|
|
14804
14811
|
let i = 0;
|
|
14805
14812
|
return {
|
|
14806
14813
|
name: "budget",
|
|
@@ -14825,12 +14832,12 @@ function v_(e, t, n) {
|
|
|
14825
14832
|
}
|
|
14826
14833
|
//#endregion
|
|
14827
14834
|
//#region src/core/sdk/actions.ts
|
|
14828
|
-
var
|
|
14829
|
-
function
|
|
14835
|
+
var b_ = /^[a-zA-Z][a-zA-Z0-9_]*$/;
|
|
14836
|
+
function x_(e) {
|
|
14830
14837
|
let n = [];
|
|
14831
14838
|
for (let [r, i] of Object.entries(e)) {
|
|
14832
|
-
if (!
|
|
14833
|
-
console.warn(`[page-agent-sdk][actions] 动作名 "${r}" 非法(须匹配 ${
|
|
14839
|
+
if (!b_.test(r)) {
|
|
14840
|
+
console.warn(`[page-agent-sdk][actions] 动作名 "${r}" 非法(须匹配 ${b_}),已跳过`);
|
|
14834
14841
|
continue;
|
|
14835
14842
|
}
|
|
14836
14843
|
let e = i.description || `宿主动作 ${r}`;
|
|
@@ -14850,9 +14857,9 @@ function b_(e) {
|
|
|
14850
14857
|
}
|
|
14851
14858
|
return n;
|
|
14852
14859
|
}
|
|
14853
|
-
function
|
|
14860
|
+
function S_(e) {
|
|
14854
14861
|
let t = {};
|
|
14855
|
-
for (let [n, r] of Object.entries(e))
|
|
14862
|
+
for (let [n, r] of Object.entries(e)) b_.test(n) && (t[n] = {
|
|
14856
14863
|
description: r.description,
|
|
14857
14864
|
hasParams: !!r.params,
|
|
14858
14865
|
readsHostState: r.readsHostState === !0,
|
|
@@ -14862,11 +14869,11 @@ function x_(e) {
|
|
|
14862
14869
|
}
|
|
14863
14870
|
//#endregion
|
|
14864
14871
|
//#region src/core/toolsets.ts
|
|
14865
|
-
var
|
|
14866
|
-
function
|
|
14872
|
+
var C_ = Lg, w_ = Yg;
|
|
14873
|
+
function T_(e, t) {
|
|
14867
14874
|
return hf(e, t);
|
|
14868
14875
|
}
|
|
14869
|
-
function
|
|
14876
|
+
function E_(e, t, n, r, i) {
|
|
14870
14877
|
let a = bm(e);
|
|
14871
14878
|
return [
|
|
14872
14879
|
...a.dataOps ? t : [],
|
|
@@ -14877,13 +14884,13 @@ function T_(e, t, n, r, i) {
|
|
|
14877
14884
|
}
|
|
14878
14885
|
//#endregion
|
|
14879
14886
|
//#region src/core/harness/usageHints.ts
|
|
14880
|
-
var
|
|
14881
|
-
function
|
|
14882
|
-
if (!Number.isFinite(t) || t <= 0 || e <= 0 || e < t *
|
|
14887
|
+
var D_ = .7, O_ = .5, k_ = .85;
|
|
14888
|
+
function A_(e, t) {
|
|
14889
|
+
if (!Number.isFinite(t) || t <= 0 || e <= 0 || e < t * O_) return "";
|
|
14883
14890
|
let n = Math.max(1, Math.round(e / 1e3));
|
|
14884
|
-
return e >= t *
|
|
14891
|
+
return e >= t * k_ ? `⏳ 预算告急:本任务累计约 ${n}K prompt tokens(已达 softCap 上限的 ${Math.round(k_ * 100)}%)。立即停止扩展性操作(新查询/重读/优化),完成手头最关键一步后基于已有工具结果给出结论,并如实汇报剩余未完成项。轮次预算吃紧时系统会另行注入轮次提示段。` : `⏳ 预算提示:本任务累计约 ${n}K prompt tokens(已过 softCap 半程)。若已接近目标请收敛并给出总结;尚未接近请向用户汇报进度与剩余计划,勿默默继续。轮次预算吃紧时系统会另行注入轮次提示段。`;
|
|
14885
14892
|
}
|
|
14886
|
-
function
|
|
14893
|
+
function j_(e, t, n) {
|
|
14887
14894
|
let r = bm(e);
|
|
14888
14895
|
return {
|
|
14889
14896
|
name: "usageHints",
|
|
@@ -14894,13 +14901,13 @@ function A_(e, t, n) {
|
|
|
14894
14901
|
a.push(`回答用户关于当前页面/文档的问题时优先用 read_page({selector?,offset?,limit?}) 读页面正文纯文本(长文按 hasMore 分页续读;自动排除本对话框自身);需要页面结构(检查渲染是否生效/定位元素/辅助 UI 设计问答)再用 get_dom({selector?,depth?}) 读渲染后 DOM(结构化返回 tag/attrs/text/children,depth 控制深度防爆炸,只读)。${n}`);
|
|
14895
14902
|
}
|
|
14896
14903
|
if (e?.screenshot && a.push("视觉验证(看布局/样式/渲染效果像不像、对不对)用 take_screenshot({selector?, fullPage?}) 截图查看:selector 截指定元素、fullPage 截整页、默认当前视口;截图自动压缩投递(多模态直看图/纯文本模型走识图转述)。优先级:视觉问题先截图,结构/属性问题用 dom_info。"), e?.domEdit && a.push("修改宿主页面元素(高亮/改文案/调样式/插删移元素)用 dom_edit({patches:[{op,selector,...}],dryRun?}) 批量原子操作(op:set_text/set_html/set_attr/add_class/remove_class/set_style/insert/remove/move/highlight);selector 必须唯一命中(先 get_dom/dom_search 定位);改前自动快照,dom_restore 回滚最近一批;改动为会话临时态(刷新即失)——数据驱动页面改数据(write)不要改 DOM。"), e?.viewImage && a.push("看「页面数据里的某张图」(轮播第 N 帧/商品图/封面,read 结果里有其 URL)用 view_image({url}) 原图直投 —— 问特定帧时勿截当前渲染帧(自动轮播可能已切帧);要看渲染后的组件(布局/叠加文案)才用 take_screenshot。"), e?.hasProposals && a.push("【内容修改(提案制)】修改当前内容(文章/笔记/文档)只有一条通道:①先 read_content 取真实原文与 hash;②propose_content 带 baseHash 提案 —— 优先 ops 增量操作(replace/insertAfter/insertBefore/append,find/anchor 用原文字面片段且须唯一命中,多带上下文保唯一),勿全量重发整篇(token 只花在改动上);③提案仅送达:评审面板打开、用户点「应用」才会写回 —— 提案后如实告知用户待确认,勿声称已修改;用户裁决结果会在下一轮告知你,以裁决为准作答。"), r.draftWrite && (a.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。"), a.push("⚠️ 大 JSON 分块构建是典型多轮工具调用(draft_write×N + draft_commit + read 确认 + 调研 read/query),默认 maxToolRounds=30(3.43 起;轮次预算吃紧时 system 会注入预算提示段,按提示优先收口);目标组件数很大时集成方仍可在 createChatSdk 显式上调 maxToolRounds(按 N+10 估算)。draft_commit 提交同样走乐观锁(改前 read 拿 hash,bind 被改过会触发冲突介入,不静默覆盖)。")), r.focus && (a.push("【上下文聚焦】判断任务范围,用 set_focus/add_focus/remove_focus/clear_focus 自动收敛工作范围:"), a.push(" · 局部任务(只改某一组件/区域,如「调导航栏」「改 components.3 样式」)→ 先 read 定位 jsonPath,再 set_focus({path:\"该子树路径\"}) 聚焦;聚焦后每轮只看该子树结构,写其他位置会被 PATH_DENIED 拒绝。"), a.push(" · 多个相关组件(如「同时改导航栏和页脚」)→ set_focus 聚焦首个后用 add_focus({path}) 追加其余;聚焦后可写任一焦点子树,越界仍被拒;移除单个用 remove_focus({path})。"), a.push(" · 全局任务(多处/整体结构,如「重排所有组件」「换主题」)→ 不要聚焦,保持全量视野直接写。"), a.push(" · 完成局部精修、要转向其他区域或做整体改动 → 调 clear_focus 退出聚焦(清空全部焦点),恢复全部读写权限。"), a.push(" · set_focus/add_focus 的 path 必须在 schema 内(类型校验);不确定路径先 read 查。")), e?.subagents?.length) {
|
|
14897
|
-
let t = e.subagents.filter((e) => (e.temperature ?? 0) >=
|
|
14904
|
+
let t = e.subagents.filter((e) => (e.temperature ?? 0) >= D_ || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), n = e.subagents.filter((e) => (e.temperature ?? 0) < D_ && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
|
|
14898
14905
|
a.push("【规划-反思-执行·路由】按任务性质选模式,不要对简单任务过度编排:"), t.length && (a.push(` · 创作/设计/开放性需求(如"设计主题风格""换个感觉")→ 先调 ${t.map((e) => "use_" + e.id).join("/")} 出 2-3 套方案(高温创意),`), a.push(e?.humanConfirm ? " 不要自己拍板;拿到方案后,若需用户拍板用 request_human_confirmation 弹选项。" : " 不要自己拍板;拿到方案后以文字列出选项等用户回复(humanConfirm 未开,勿调不存在工具)。")), n.length && a.push(` · 严谨/易错/校验类 → 可先调 ${n.map((e) => "use_" + e.id).join("/")} 反思挑刺(低温审查),据反馈修订。`), a.push(" · 方案定稿后,由你(主 agent)用 write 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。"), a.push(" · 简单/明确任务(如\"标题改红色\")直接执行,不必走规划-反思。");
|
|
14899
14906
|
}
|
|
14900
14907
|
e?.humanConfirm && (a.push("【人工确认·必读】以下情形必须先调 request_human_confirmation 征询用户、拿到答复后再继续,不要自行拍板:"), a.push(" 1) 用户让你「给方案/列选项/我来选/挑一个」时:把每个方案作为一个 option,调 request_human_confirmation(question=简述, options=[方案A,方案B,...], recommendation=你推荐的)。不要只回文字罗列方案让用户自己回复——要用工具把选项做成可点选按钮。"), a.push(" 2) 需求有歧义/不确定时:调工具问清楚(options 不传则用户答同意或拒绝)。"), a.push(" 3) 即将执行高风险不可逆操作(删除/覆盖/批量改动)前:调工具确认。"), a.push(" 4) 规划出多步方案需用户确认时:把整个方案(或关键分步)作为 option 调 request_human_confirmation,确认后再执行。"), a.push("用户在选项里选了哪个,就按那个方案继续;选「拒绝」则停止并询问如何调整。"));
|
|
14901
14908
|
let o = i?.loopProgress;
|
|
14902
14909
|
if (o) {
|
|
14903
|
-
let e =
|
|
14910
|
+
let e = A_(o.invokeUsage.prompt_tokens || o.invokeUsage.total_tokens, n?.promptSoftCap ?? Infinity);
|
|
14904
14911
|
e && a.push(e);
|
|
14905
14912
|
let t = Object.entries(o.writeFailures).filter(([, e]) => e >= 2);
|
|
14906
14913
|
if (t.length) {
|
|
@@ -14914,7 +14921,7 @@ function A_(e, t, n) {
|
|
|
14914
14921
|
}
|
|
14915
14922
|
//#endregion
|
|
14916
14923
|
//#region src/core/harness/pageContext.ts
|
|
14917
|
-
function
|
|
14924
|
+
function M_(e, t) {
|
|
14918
14925
|
let n = [
|
|
14919
14926
|
"[当前页面] 用户正在浏览:",
|
|
14920
14927
|
`- 标题:${e.title}`,
|
|
@@ -14923,18 +14930,18 @@ function j_(e, t) {
|
|
|
14923
14930
|
];
|
|
14924
14931
|
return t && n.push("需要页面正文时用 read_page 读取纯文本(长文按 hasMore 分页续读);读结构用 get_dom。"), n.join("\n");
|
|
14925
14932
|
}
|
|
14926
|
-
function
|
|
14933
|
+
function N_(e) {
|
|
14927
14934
|
return {
|
|
14928
14935
|
name: "pageContext",
|
|
14929
14936
|
augmentPrompt: () => {
|
|
14930
14937
|
let t = e.getPageInfo();
|
|
14931
|
-
if (t) return
|
|
14938
|
+
if (t) return M_(t, e.canReadPage);
|
|
14932
14939
|
}
|
|
14933
14940
|
};
|
|
14934
14941
|
}
|
|
14935
14942
|
//#endregion
|
|
14936
14943
|
//#region src/core/harness/resourcesPin.ts
|
|
14937
|
-
function
|
|
14944
|
+
function P_(e) {
|
|
14938
14945
|
return {
|
|
14939
14946
|
name: "resourcesPin",
|
|
14940
14947
|
augmentPrompt: () => {
|
|
@@ -14948,15 +14955,15 @@ function N_(e) {
|
|
|
14948
14955
|
}
|
|
14949
14956
|
//#endregion
|
|
14950
14957
|
//#region src/core/backends/skillStore.ts
|
|
14951
|
-
var
|
|
14952
|
-
function
|
|
14953
|
-
return `${
|
|
14958
|
+
var F_ = "v:1::skill-store", I_ = "chat-sdk";
|
|
14959
|
+
function L_(e, t, n) {
|
|
14960
|
+
return `${F_}::${e}::${t}::${n}`;
|
|
14954
14961
|
}
|
|
14955
|
-
function
|
|
14956
|
-
return `${
|
|
14962
|
+
function R_(e, t) {
|
|
14963
|
+
return `${F_}::${e}::${t}::`;
|
|
14957
14964
|
}
|
|
14958
|
-
function
|
|
14959
|
-
let t = e.dbName ??
|
|
14965
|
+
function z_(e = {}) {
|
|
14966
|
+
let t = e.dbName ?? I_, n = e.backend ?? "indexed", r = e.id ?? "", i, a, o = new Promise((e) => {
|
|
14960
14967
|
a = e;
|
|
14961
14968
|
});
|
|
14962
14969
|
return (async () => {
|
|
@@ -14978,36 +14985,36 @@ function R_(e = {}) {
|
|
|
14978
14985
|
ready: o,
|
|
14979
14986
|
async list() {
|
|
14980
14987
|
let e = [];
|
|
14981
|
-
return await i.scan(
|
|
14988
|
+
return await i.scan(R_(t, r), (t, n) => {
|
|
14982
14989
|
e.push(n);
|
|
14983
14990
|
}), e;
|
|
14984
14991
|
},
|
|
14985
14992
|
async get(e) {
|
|
14986
|
-
return await i.get(
|
|
14993
|
+
return await i.get(L_(t, r, e));
|
|
14987
14994
|
},
|
|
14988
14995
|
async put(e) {
|
|
14989
14996
|
try {
|
|
14990
|
-
await i.set(
|
|
14997
|
+
await i.set(L_(t, r, e.name), e);
|
|
14991
14998
|
} catch (e) {
|
|
14992
14999
|
nm(e) && (i = um());
|
|
14993
15000
|
}
|
|
14994
15001
|
},
|
|
14995
15002
|
async remove(e) {
|
|
14996
|
-
let n =
|
|
15003
|
+
let n = L_(t, r, e);
|
|
14997
15004
|
return await i.get(n) == null ? !1 : (await i.del(n), !0);
|
|
14998
15005
|
},
|
|
14999
15006
|
async clear() {
|
|
15000
|
-
await i.clearPrefix(
|
|
15007
|
+
await i.clearPrefix(R_(t, r));
|
|
15001
15008
|
},
|
|
15002
15009
|
dispose() {}
|
|
15003
15010
|
};
|
|
15004
15011
|
}
|
|
15005
|
-
var
|
|
15006
|
-
function
|
|
15012
|
+
var B_ = /large_results\/[^\s"'`),]+\.txt/g;
|
|
15013
|
+
function V_(e) {
|
|
15007
15014
|
let t = /* @__PURE__ */ new Set(), n = (e) => {
|
|
15008
15015
|
if (typeof e != "string" || !e) return;
|
|
15009
15016
|
let n;
|
|
15010
|
-
for (
|
|
15017
|
+
for (B_.lastIndex = 0; (n = B_.exec(e)) !== null;) t.add(n[0]);
|
|
15011
15018
|
};
|
|
15012
15019
|
for (let r of e) {
|
|
15013
15020
|
if (n(r.content), r.steps) for (let e of r.steps) n(e.result);
|
|
@@ -15015,14 +15022,14 @@ function B_(e) {
|
|
|
15015
15022
|
}
|
|
15016
15023
|
return t;
|
|
15017
15024
|
}
|
|
15018
|
-
function
|
|
15025
|
+
function H_(e, t) {
|
|
15019
15026
|
let n = [];
|
|
15020
15027
|
for (let r of Object.keys(e)) r.startsWith("large_results/") && !t.has(r) && n.push(r);
|
|
15021
15028
|
return n;
|
|
15022
15029
|
}
|
|
15023
15030
|
//#endregion
|
|
15024
15031
|
//#region src/core/utils/serialRunner.ts
|
|
15025
|
-
function
|
|
15032
|
+
function U_() {
|
|
15026
15033
|
let e = Promise.resolve();
|
|
15027
15034
|
return function(t) {
|
|
15028
15035
|
let n = e.then(t, t);
|
|
@@ -15031,24 +15038,24 @@ function H_() {
|
|
|
15031
15038
|
}
|
|
15032
15039
|
//#endregion
|
|
15033
15040
|
//#region src/core/sdk/createChatSdk.ts
|
|
15034
|
-
var
|
|
15035
|
-
function
|
|
15041
|
+
var W_ = 30, G_ = /* @__PURE__ */ new Map();
|
|
15042
|
+
function K_(e, t) {
|
|
15036
15043
|
return e === "restore_data" ? "restore" : e === "write" ? t?.dryRun ? null : t?.del ? "delete" : t?.patch || t?.patches ? "edit" : "set" : e === "eval_script" ? t?.mode === "transform" ? "edit" : null : e === "draft_commit" || e === "resource_update" ? "edit" : null;
|
|
15037
15044
|
}
|
|
15038
|
-
function
|
|
15045
|
+
function q_(e) {
|
|
15039
15046
|
return e === "spawn_agent" || e === "spawn_agents" || e.startsWith("use_");
|
|
15040
15047
|
}
|
|
15041
|
-
function
|
|
15048
|
+
function J_(e, t, n, r) {
|
|
15042
15049
|
let i = 0;
|
|
15043
15050
|
return {
|
|
15044
15051
|
name: "sdk-events",
|
|
15045
15052
|
wrapToolCall: async (t, r) => {
|
|
15046
|
-
let i = await r(t), a =
|
|
15053
|
+
let i = await r(t), a = K_(t.name, t.args), o = typeof i.content == "string" && i.content.startsWith("ERROR:");
|
|
15047
15054
|
return a && !o ? e({
|
|
15048
15055
|
type: "data_change",
|
|
15049
15056
|
operation: a,
|
|
15050
15057
|
value: n()?.bind
|
|
15051
|
-
}) : i.status === "done" && !o &&
|
|
15058
|
+
}) : i.status === "done" && !o && q_(t.name) && e({
|
|
15052
15059
|
type: "data_change",
|
|
15053
15060
|
operation: "edit",
|
|
15054
15061
|
value: n()?.bind
|
|
@@ -15076,7 +15083,7 @@ function q_(e, t, n, r) {
|
|
|
15076
15083
|
}
|
|
15077
15084
|
};
|
|
15078
15085
|
}
|
|
15079
|
-
function
|
|
15086
|
+
function Y_(e, t, n, r, i) {
|
|
15080
15087
|
if (!n) return i && console.warn(`[page-agent-sdk][focus] capabilities.focus 关闭,${t} 忽略`), {
|
|
15081
15088
|
ok: !1,
|
|
15082
15089
|
error: "capabilities.focus 关闭"
|
|
@@ -15094,7 +15101,7 @@ function J_(e, t, n, r, i) {
|
|
|
15094
15101
|
error: "当前无主数据 schema,无法聚焦"
|
|
15095
15102
|
});
|
|
15096
15103
|
}
|
|
15097
|
-
function
|
|
15104
|
+
function X_(e, n, r) {
|
|
15098
15105
|
let a = {
|
|
15099
15106
|
prompt_tokens: 0,
|
|
15100
15107
|
completion_tokens: 0,
|
|
@@ -15216,7 +15223,7 @@ function Y_(e, n, r) {
|
|
|
15216
15223
|
vfsStore: _e || P?.resources?.length ? T : void 0,
|
|
15217
15224
|
...de.length ? { pgIdPaths: de } : {},
|
|
15218
15225
|
...fe.length ? { largeTextPaths: fe } : {}
|
|
15219
|
-
}) : [], xe = ge ? V : [], H = ge && P ? V.controller ?? null : null, Se = ge && P ? V.previewWrite : void 0, Ce = ge && P?.resources?.length && H?.getResourcesSnapshot ?
|
|
15226
|
+
}) : [], xe = ge ? V : [], H = ge && P ? V.controller ?? null : null, Se = ge && P ? V.previewWrite : void 0, Ce = ge && P?.resources?.length && H?.getResourcesSnapshot ? P_({ getResourcesSnapshot: () => H?.getResourcesSnapshot?.() ?? [] }) : void 0, U = () => H?.get() ?? P, we = new Set(V.map((e) => e.name)), Te = e.conflictWatchFields ?? [], Ee = !Te.includes("*") && Te.length ? new Set(Te) : void 0, W = H ? Jf({
|
|
15220
15227
|
getBind: () => U()?.bind,
|
|
15221
15228
|
recomputeAll: () => H.recomputeAllBaselines?.(),
|
|
15222
15229
|
hasBaselines: () => H.hasBaselines?.() ?? !1,
|
|
@@ -15244,7 +15251,7 @@ function Y_(e, n, r) {
|
|
|
15244
15251
|
} });
|
|
15245
15252
|
}
|
|
15246
15253
|
return e;
|
|
15247
|
-
}, Ae = g.vision === !0 || typeof e.images?.describe == "function" ?
|
|
15254
|
+
}, Ae = g.vision === !0 || typeof e.images?.describe == "function" ? sg({
|
|
15248
15255
|
getVision: () => g.vision === !0,
|
|
15249
15256
|
describe: e.images?.describe,
|
|
15250
15257
|
onShot: (e, t) => {
|
|
@@ -15253,7 +15260,7 @@ function Y_(e, n, r) {
|
|
|
15253
15260
|
meta: t
|
|
15254
15261
|
});
|
|
15255
15262
|
}
|
|
15256
|
-
}) : void 0, je = ye ?
|
|
15263
|
+
}) : void 0, je = ye ? ag({
|
|
15257
15264
|
render: e.screenshot?.renderer,
|
|
15258
15265
|
getActiveFocus: () => X.getFocus(),
|
|
15259
15266
|
focusSelector: e.screenshot?.focusSelector,
|
|
@@ -15288,7 +15295,7 @@ function Y_(e, n, r) {
|
|
|
15288
15295
|
}
|
|
15289
15296
|
return t(e);
|
|
15290
15297
|
}
|
|
15291
|
-
} : null, Pe = !1, Fe = B.domEdit ?
|
|
15298
|
+
} : null, Pe = !1, Fe = B.domEdit ? bg({
|
|
15292
15299
|
onEdit: (e) => {
|
|
15293
15300
|
X.agent?.debugLogs?.value?.push({
|
|
15294
15301
|
timestamp: Date.now(),
|
|
@@ -15304,14 +15311,14 @@ function Y_(e, n, r) {
|
|
|
15304
15311
|
onRestore: (e) => {
|
|
15305
15312
|
e.restored > 0 && (Pe = !0);
|
|
15306
15313
|
}
|
|
15307
|
-
}) : [], Ie = [...
|
|
15308
|
-
...
|
|
15314
|
+
}) : [], Ie = [...E_(B, xe, Lg, B.domInspect ? [
|
|
15315
|
+
...Yg,
|
|
15309
15316
|
...Fe,
|
|
15310
15317
|
...je ? [je] : [],
|
|
15311
|
-
...B.skills ? [] : [
|
|
15312
|
-
] : [],
|
|
15318
|
+
...B.skills ? [] : [a_, o_]
|
|
15319
|
+
] : [], v_), ...Ae ? [Ae] : []];
|
|
15313
15320
|
Ae && De.set("view_image", "builtin"), Ie.forEach((e) => De.set(e.name, "builtin"));
|
|
15314
|
-
let Le = e.proposals ?
|
|
15321
|
+
let Le = e.proposals ? Fg(e.proposals, {
|
|
15315
15322
|
emit: (e) => {
|
|
15316
15323
|
try {
|
|
15317
15324
|
J(e);
|
|
@@ -15330,7 +15337,7 @@ function Y_(e, n, r) {
|
|
|
15330
15337
|
}
|
|
15331
15338
|
}) : null, Re = [...e.tools || [], ...Le?.tools ?? []];
|
|
15332
15339
|
Re.forEach((e) => De.set(e.name, "user"));
|
|
15333
|
-
let ze =
|
|
15340
|
+
let ze = x_(e.actions ?? {});
|
|
15334
15341
|
ze.forEach((e) => De.set(e.name, "action"));
|
|
15335
15342
|
let Be = Le ? e.proposals?.readToolName || "read_content" : null, Ve = Le ? e.proposals?.toolName || "propose_content" : null, He = /* @__PURE__ */ new Set([...Object.entries(e.actions ?? {}).filter(([, e]) => e?.readsHostState === !0).map(([e]) => e), ...Be ? [Be] : []]), Ue = /* @__PURE__ */ new Set([...Object.entries(e.actions ?? {}).filter(([, e]) => e?.deferredWrite === !0).map(([e]) => e), ...Ve ? [Ve] : []]), We = [], Ge = !1, Ke = e.humanConfirm !== !1 && (!e.approval || e.approval.humanConfirmTool !== !1), qe = Ke ? Cu() : null;
|
|
15336
15343
|
qe && De.set(xu, "builtin");
|
|
@@ -15519,7 +15526,7 @@ function Y_(e, n, r) {
|
|
|
15519
15526
|
}) : void 0, It = vt ? td({
|
|
15520
15527
|
contextWindow: g.contextWindow,
|
|
15521
15528
|
thresholdRatio: wm(e, g.contextWindow).summaryThresholdRatio
|
|
15522
|
-
}) : void 0, Lt =
|
|
15529
|
+
}) : void 0, Lt = j_({
|
|
15523
15530
|
...B,
|
|
15524
15531
|
humanConfirm: Ke,
|
|
15525
15532
|
screenshot: !!je,
|
|
@@ -15528,7 +15535,7 @@ function Y_(e, n, r) {
|
|
|
15528
15535
|
hasProposals: !!e.proposals,
|
|
15529
15536
|
viewImage: !!Ae,
|
|
15530
15537
|
subagents: le?.map(jt)
|
|
15531
|
-
}, ge && !!P, { promptSoftCap: Nl(g.contextWindow, y.promptSoftCapTokens) }), Rt = B.pageContext ?
|
|
15538
|
+
}, ge && !!P, { promptSoftCap: Nl(g.contextWindow, y.promptSoftCapTokens) }), Rt = B.pageContext ? N_({
|
|
15532
15539
|
getPageInfo: () => typeof document < "u" && typeof location < "u" ? {
|
|
15533
15540
|
title: document.title || "",
|
|
15534
15541
|
url: location.href
|
|
@@ -15616,7 +15623,7 @@ function Y_(e, n, r) {
|
|
|
15616
15623
|
name: e.name,
|
|
15617
15624
|
description: e.description,
|
|
15618
15625
|
getContent: () => e.content
|
|
15619
|
-
}), Yt = e.skillStorage === !1 ? null :
|
|
15626
|
+
}), Yt = e.skillStorage === !1 ? null : z_({
|
|
15620
15627
|
...typeof e.skillStorage == "object" ? e.skillStorage : {},
|
|
15621
15628
|
id: e.skillStorage && typeof e.skillStorage == "object" && e.skillStorage.id ? e.skillStorage.id : `agent::${n}`
|
|
15622
15629
|
}), Xt = () => {
|
|
@@ -15649,12 +15656,12 @@ function Y_(e, n, r) {
|
|
|
15649
15656
|
getSnapshot: () => It?.getSnapshot()
|
|
15650
15657
|
} : {}
|
|
15651
15658
|
}) : void 0, $t = st ? fl([
|
|
15652
|
-
...B.domInspect && !(e.skills || []).some((e) => e.name === "dom-inspect") ? [
|
|
15659
|
+
...B.domInspect && !(e.skills || []).some((e) => e.name === "dom-inspect") ? [c_({
|
|
15653
15660
|
withScreenshot: !!je,
|
|
15654
15661
|
withDomEdit: B.domEdit,
|
|
15655
15662
|
withDataOps: ge && !!P
|
|
15656
15663
|
})] : [],
|
|
15657
|
-
...B.domInspect && !(e.skills || []).some((e) => e.name === "page-analysis") ? [
|
|
15664
|
+
...B.domInspect && !(e.skills || []).some((e) => e.name === "page-analysis") ? [u_({
|
|
15658
15665
|
withScreenshot: !!je,
|
|
15659
15666
|
withDomEdit: B.domEdit,
|
|
15660
15667
|
withVfs: ct
|
|
@@ -15706,18 +15713,18 @@ function Y_(e, n, r) {
|
|
|
15706
15713
|
...It ? [It] : [],
|
|
15707
15714
|
...Ne ? [Ne] : [],
|
|
15708
15715
|
...e.middleware || [],
|
|
15709
|
-
...ve ? [
|
|
15716
|
+
...ve ? [y_(a, {
|
|
15710
15717
|
tokenBudget: e.tokenBudget,
|
|
15711
15718
|
timeBudgetMs: e.timeBudgetMs
|
|
15712
15719
|
}, J)] : [],
|
|
15713
|
-
|
|
15714
|
-
]), tn = e.maxMemoryRounds ??
|
|
15720
|
+
J_(J, w, U, a)
|
|
15721
|
+
]), tn = e.maxMemoryRounds ?? W_;
|
|
15715
15722
|
function nn(e) {
|
|
15716
15723
|
return (e) => {
|
|
15717
15724
|
e.type !== "approval_request" && J(ke(e));
|
|
15718
15725
|
};
|
|
15719
15726
|
}
|
|
15720
|
-
let rn = /* @__PURE__ */ Wt([]), an =
|
|
15727
|
+
let rn = /* @__PURE__ */ Wt([]), an = U_(), on = /* @__PURE__ */ new Set();
|
|
15721
15728
|
function sn(e) {
|
|
15722
15729
|
let t = new AbortController(), n = () => t.abort();
|
|
15723
15730
|
return e && (e.aborted ? t.abort() : e.addEventListener("abort", n, { once: !0 })), on.add(t), {
|
|
@@ -15827,7 +15834,7 @@ function Y_(e, n, r) {
|
|
|
15827
15834
|
code: "IMAGE_UNSUPPORTED_MODEL"
|
|
15828
15835
|
}), Error(`[page-agent-sdk] ${e}`);
|
|
15829
15836
|
}
|
|
15830
|
-
T?.setProtectedRefs?.(
|
|
15837
|
+
T?.setProtectedRefs?.(V_(w));
|
|
15831
15838
|
let i = ve ? t.maxAutoRetries ?? 1 : 0, a = 0, s = !1, c = nn(t.signal);
|
|
15832
15839
|
if (t.signal) {
|
|
15833
15840
|
let e = () => o.resolve("keep_external");
|
|
@@ -15915,7 +15922,7 @@ function Y_(e, n, r) {
|
|
|
15915
15922
|
if (await X.initDone, !e.length) return [];
|
|
15916
15923
|
if (X.refCount <= 0) throw Error("page-agent-sdk: agent 已释放(unmount),拒绝排队中的 batch");
|
|
15917
15924
|
let r = [], i = nn(n);
|
|
15918
|
-
if (T?.setProtectedRefs?.(
|
|
15925
|
+
if (T?.setProtectedRefs?.(V_(w)), n) {
|
|
15919
15926
|
let e = () => o.resolve("keep_external");
|
|
15920
15927
|
n.aborted ? e() : n.addEventListener("abort", e, { once: !0 });
|
|
15921
15928
|
}
|
|
@@ -16022,7 +16029,7 @@ function Y_(e, n, r) {
|
|
|
16022
16029
|
code: "IMAGE_UNSUPPORTED_MODEL"
|
|
16023
16030
|
}), Error(`[page-agent-sdk] ${e}`);
|
|
16024
16031
|
}
|
|
16025
|
-
T?.setProtectedRefs?.(
|
|
16032
|
+
T?.setProtectedRefs?.(V_(e));
|
|
16026
16033
|
let i = (e) => {
|
|
16027
16034
|
t?.(ke(e)), J(ke(e)), e.type === "subagent" && (e.kind === "tool_call" || e.kind === "tool_result") && X.infoTick.value++;
|
|
16028
16035
|
};
|
|
@@ -16037,7 +16044,7 @@ function Y_(e, n, r) {
|
|
|
16037
16044
|
if (X.refCount--, X.refCount <= 0) {
|
|
16038
16045
|
cn(), Ge = !0, l && (T.flush?.(), l.flush(), l.dispose()), Yt && Yt.dispose();
|
|
16039
16046
|
let e = X.mcpClosers.splice(0);
|
|
16040
|
-
e.length && Promise.allSettled(e.map((e) => e())),
|
|
16047
|
+
e.length && Promise.allSettled(e.map((e) => e())), G_.delete(n);
|
|
16041
16048
|
}
|
|
16042
16049
|
},
|
|
16043
16050
|
resolveConflict: o.resolve,
|
|
@@ -16155,7 +16162,7 @@ function Y_(e, n, r) {
|
|
|
16155
16162
|
workingMemory: ot ? se.getWorkingMemory() : void 0,
|
|
16156
16163
|
focus: Ye ? A.getFocus() : void 0,
|
|
16157
16164
|
focuses: Ye ? A.getFocuses() : [],
|
|
16158
|
-
actions:
|
|
16165
|
+
actions: S_(e.actions ?? {}),
|
|
16159
16166
|
subagent: {
|
|
16160
16167
|
enabled: !!wt,
|
|
16161
16168
|
maxDepth: e.subagent?.maxDepth ?? 1,
|
|
@@ -16242,11 +16249,11 @@ function Y_(e, n, r) {
|
|
|
16242
16249
|
return Ye ? A.getFocuses() : [];
|
|
16243
16250
|
},
|
|
16244
16251
|
setFocus(t) {
|
|
16245
|
-
let n =
|
|
16252
|
+
let n = Y_(t, "setFocus", Ye, () => U()?.schema, e.debug);
|
|
16246
16253
|
return n.ok ? (A.setFocus(j(t)), e.debug && A.isInvokeActive() && console.info("[page-agent-sdk][focus] 在途流程进行中,聚焦将在下一次输入生效(当前流程不受影响)"), X.infoTick.value++, { ok: !0 }) : n;
|
|
16247
16254
|
},
|
|
16248
16255
|
addFocus(t) {
|
|
16249
|
-
let n =
|
|
16256
|
+
let n = Y_(t, "addFocus", Ye, () => U()?.schema, e.debug);
|
|
16250
16257
|
return n.ok ? A.getFocuses().length >= 8 ? (e.debug && console.warn("[page-agent-sdk][focus] addFocus 拒绝:焦点数已达上限 8(augmentPrompt 注入每焦点子树 schema,过多致 system prompt 超预算)"), {
|
|
16251
16258
|
ok: !1,
|
|
16252
16259
|
error: "焦点数上限 8(避免 system prompt 撑爆)"
|
|
@@ -16350,14 +16357,14 @@ function Y_(e, n, r) {
|
|
|
16350
16357
|
}
|
|
16351
16358
|
function fn(e) {
|
|
16352
16359
|
let t = {};
|
|
16353
|
-
for (let n of
|
|
16360
|
+
for (let n of V_(e)) {
|
|
16354
16361
|
let e = T.files[n];
|
|
16355
16362
|
e && (t[n] = e.content);
|
|
16356
16363
|
}
|
|
16357
16364
|
return t;
|
|
16358
16365
|
}
|
|
16359
16366
|
function pn() {
|
|
16360
|
-
let e =
|
|
16367
|
+
let e = H_(T.files, V_(w));
|
|
16361
16368
|
for (let t of e) delete T.files[t];
|
|
16362
16369
|
}
|
|
16363
16370
|
function mn() {
|
|
@@ -16478,7 +16485,7 @@ function Y_(e, n, r) {
|
|
|
16478
16485
|
});
|
|
16479
16486
|
})(), X;
|
|
16480
16487
|
}
|
|
16481
|
-
function
|
|
16488
|
+
function Z_(e, t) {
|
|
16482
16489
|
let n = e.id ?? Up();
|
|
16483
16490
|
e.id || console.warn(`[page-agent-sdk] 未传 options.id,已生成随机 id "${n}"。刷新后持久化数据无法恢复,请传稳定 id。`);
|
|
16484
16491
|
let r = e.streaming ?? !0, i = e.ui ?? "default", a = e.hostWatch === !0 ? { url: !0 } : e.hostWatch && typeof e.hostWatch == "object" ? e.hostWatch : null, o = {
|
|
@@ -16487,8 +16494,8 @@ function X_(e, t) {
|
|
|
16487
16494
|
pushState: !1,
|
|
16488
16495
|
title: !1,
|
|
16489
16496
|
autoNotified: 0
|
|
16490
|
-
}, s = null, c, l = e.shareContext ?
|
|
16491
|
-
l ? c = l : (c =
|
|
16497
|
+
}, s = null, c, l = e.shareContext ? G_.get(n) : void 0;
|
|
16498
|
+
l ? c = l : (c = X_(e, n, a ? o : void 0), e.shareContext && G_.set(n, c)), c.refCount++;
|
|
16492
16499
|
let u = null, d = vm(e), f = null, p = null;
|
|
16493
16500
|
async function m(n) {
|
|
16494
16501
|
if (await c.initDone, u) {
|
|
@@ -16506,7 +16513,7 @@ function X_(e, t) {
|
|
|
16506
16513
|
if (!a) return;
|
|
16507
16514
|
s?.dispose(), s = null;
|
|
16508
16515
|
let e = typeof window < "u" ? window : void 0;
|
|
16509
|
-
s =
|
|
16516
|
+
s = wg({
|
|
16510
16517
|
target: e,
|
|
16511
16518
|
history: typeof history < "u" ? history : e?.history,
|
|
16512
16519
|
document: typeof document < "u" ? document : void 0,
|
|
@@ -16522,7 +16529,7 @@ function X_(e, t) {
|
|
|
16522
16529
|
from: e.from.slice(0, 120),
|
|
16523
16530
|
to: e.to.slice(0, 120)
|
|
16524
16531
|
}
|
|
16525
|
-
}), c.notifyHostChange({ reason:
|
|
16532
|
+
}), c.notifyHostChange({ reason: Sg(e) });
|
|
16526
16533
|
}
|
|
16527
16534
|
}), s && (o.enabled = !0, o.url = s.info.url, o.pushState = s.info.pushState, o.title = s.info.title);
|
|
16528
16535
|
})(), i === !1 || !t) {
|
|
@@ -16748,7 +16755,7 @@ function X_(e, t) {
|
|
|
16748
16755
|
}
|
|
16749
16756
|
//#endregion
|
|
16750
16757
|
//#region src/core/sdk/ragSubagent.ts
|
|
16751
|
-
function
|
|
16758
|
+
function Q_(e, t, n, r, i) {
|
|
16752
16759
|
let a = [];
|
|
16753
16760
|
e && a.push("vfs_grep + vfs_read(搜预注入文档)"), t && a.push(`${r}(语义检索)`), n && a.push(`${i}(按 source 加载)`), a.push("fetch_document(公网 URL)");
|
|
16754
16761
|
let o = [];
|
|
@@ -16763,7 +16770,7 @@ function Z_(e, t, n, r, i) {
|
|
|
16763
16770
|
|
|
16764
16771
|
你是只读检索角色,不要尝试修改任何数据。不要尝试上面未列出的工具。`;
|
|
16765
16772
|
}
|
|
16766
|
-
function
|
|
16773
|
+
function $_(e, t, n, r, i) {
|
|
16767
16774
|
let a = [], o = [];
|
|
16768
16775
|
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)
|
|
16769
16776
|
|
|
@@ -16780,12 +16787,12 @@ ${a.join("\n")}
|
|
|
16780
16787
|
## 何时用何源
|
|
16781
16788
|
${o.join("\n")}`;
|
|
16782
16789
|
}
|
|
16783
|
-
var
|
|
16790
|
+
var ev = {
|
|
16784
16791
|
name: "rag-search",
|
|
16785
16792
|
description: "多源知识检索策略:vfs 预注入文档 → 语义检索 → 指定文档加载 → 公网;综合结构化结论 + 溯源",
|
|
16786
|
-
getContent: () =>
|
|
16793
|
+
getContent: () => $_(!0, !0, !0, "search_docs", "load_doc")
|
|
16787
16794
|
};
|
|
16788
|
-
function
|
|
16795
|
+
function tv(e, n, r) {
|
|
16789
16796
|
let i = s(async ({ query: e, topK: t }) => {
|
|
16790
16797
|
try {
|
|
16791
16798
|
let i = await n(e, { topK: t ?? r });
|
|
@@ -16803,7 +16810,7 @@ function ev(e, n, r) {
|
|
|
16803
16810
|
});
|
|
16804
16811
|
return ta([i]), i;
|
|
16805
16812
|
}
|
|
16806
|
-
function
|
|
16813
|
+
function nv(e, n) {
|
|
16807
16814
|
let r = s(async ({ source: e }) => {
|
|
16808
16815
|
try {
|
|
16809
16816
|
let t = await n(e), r = Array.isArray(t) ? t : [t];
|
|
@@ -16818,19 +16825,19 @@ function tv(e, n) {
|
|
|
16818
16825
|
});
|
|
16819
16826
|
return ta([r]), r;
|
|
16820
16827
|
}
|
|
16821
|
-
function
|
|
16828
|
+
function rv(e) {
|
|
16822
16829
|
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;
|
|
16823
16830
|
if (!t && !n && r === !1) throw Error("[page-agent-sdk][createRagSubagent] 至少配一种知识源:retriever / loader / useVfs(true)");
|
|
16824
16831
|
let p = [];
|
|
16825
|
-
t && p.push(
|
|
16832
|
+
t && p.push(tv(s, t, o)), n && p.push(nv(c, n)), f && p.push(...f);
|
|
16826
16833
|
let m = r ? [
|
|
16827
16834
|
"vfs_grep",
|
|
16828
16835
|
"vfs_read",
|
|
16829
16836
|
"vfs_json_read"
|
|
16830
|
-
] : void 0, h =
|
|
16837
|
+
] : void 0, h = Q_(r, !!t, !!n, s, c), g = {
|
|
16831
16838
|
name: "rag-search",
|
|
16832
|
-
description:
|
|
16833
|
-
getContent: () =>
|
|
16839
|
+
description: ev.description,
|
|
16840
|
+
getContent: () => $_(r, !!t, !!n, s, c)
|
|
16834
16841
|
};
|
|
16835
16842
|
return {
|
|
16836
16843
|
id: i,
|
|
@@ -16845,7 +16852,7 @@ function nv(e) {
|
|
|
16845
16852
|
}
|
|
16846
16853
|
//#endregion
|
|
16847
16854
|
//#region src/core/sdk/evalToolkit.ts
|
|
16848
|
-
function
|
|
16855
|
+
function iv(e = {}) {
|
|
16849
16856
|
let t = e.quietMs ?? 9e4, n = e.confirmSamples ?? 3, r = e.baselineMessageCount ?? 0, i = 0;
|
|
16850
16857
|
return {
|
|
16851
16858
|
push(e) {
|
|
@@ -16856,12 +16863,12 @@ function rv(e = {}) {
|
|
|
16856
16863
|
}
|
|
16857
16864
|
};
|
|
16858
16865
|
}
|
|
16859
|
-
var
|
|
16860
|
-
function
|
|
16866
|
+
var av = /* @__PURE__ */ new Set(["elapsedSec"]);
|
|
16867
|
+
function ov(e, t, n = {}) {
|
|
16861
16868
|
let r = n.tokenAbs ?? 2e3, i = n.tokenPct ?? 15, a = n.toolCountAbs ?? 3, o = [], s = 0, c = 0, l = 0, u = /* @__PURE__ */ new Set([...Object.keys(e ?? {}), ...Object.keys(t ?? {})]);
|
|
16862
16869
|
for (let n of u) {
|
|
16863
16870
|
let u = Number(e?.[n] ?? 0), d = Number(t?.[n] ?? 0), f = u - d, p = d > 0 ? Math.round(f / d * 100) : 0, m = "";
|
|
16864
|
-
|
|
16871
|
+
av.has(n) || (n === "toolCount" ? Math.abs(f) > a : Math.abs(f) > r && Math.abs(p) >= i) && (m = f > 0 ? "up" : "down", m === "up" ? (s++, c++) : l++), o.push({
|
|
16865
16872
|
key: n,
|
|
16866
16873
|
prev: d,
|
|
16867
16874
|
cur: u,
|
|
@@ -16876,7 +16883,7 @@ function av(e, t, n = {}) {
|
|
|
16876
16883
|
fields: o
|
|
16877
16884
|
};
|
|
16878
16885
|
}
|
|
16879
|
-
function
|
|
16886
|
+
function sv(e) {
|
|
16880
16887
|
let { sdk: t } = e, n = () => {
|
|
16881
16888
|
let e = t.debugLogs.value ?? [], n = e.length ? e[e.length - 1].timestamp : 0;
|
|
16882
16889
|
return {
|
|
@@ -16889,7 +16896,7 @@ function ov(e) {
|
|
|
16889
16896
|
};
|
|
16890
16897
|
return {
|
|
16891
16898
|
async waitForIdle(e = {}) {
|
|
16892
|
-
let { timeoutMs: r = 6e5, sampleMs: i = 2500, onSample: a, ...o } = e, s =
|
|
16899
|
+
let { timeoutMs: r = 6e5, sampleMs: i = 2500, onSample: a, ...o } = e, s = iv(o), c = Date.now();
|
|
16893
16900
|
for (;;) {
|
|
16894
16901
|
let e = n(), o = s.push(e);
|
|
16895
16902
|
if (a?.(e), o === "done") return e;
|
|
@@ -16919,7 +16926,7 @@ function ov(e) {
|
|
|
16919
16926
|
}
|
|
16920
16927
|
//#endregion
|
|
16921
16928
|
//#region src/core/utils/clipboard.ts
|
|
16922
|
-
async function
|
|
16929
|
+
async function cv(e) {
|
|
16923
16930
|
try {
|
|
16924
16931
|
let t = globalThis.navigator?.clipboard;
|
|
16925
16932
|
if (t && typeof t.writeText == "function") return await t.writeText(e), !0;
|
|
@@ -16937,8 +16944,8 @@ async function sv(e) {
|
|
|
16937
16944
|
}
|
|
16938
16945
|
//#endregion
|
|
16939
16946
|
//#region src/core/composables/useChat.ts
|
|
16940
|
-
var
|
|
16941
|
-
function
|
|
16947
|
+
var lv = 4e3;
|
|
16948
|
+
function uv(e = {}) {
|
|
16942
16949
|
let { fetchResponse: t, fetchStream: n, onPersist: r, onClear: i, onQueuedCleared: a, onBeforeRegenerate: o } = e, s = /* @__PURE__ */ Ft({
|
|
16943
16950
|
messages: e.messages ?? [],
|
|
16944
16951
|
loading: !1,
|
|
@@ -17019,7 +17026,7 @@ function lv(e = {}) {
|
|
|
17019
17026
|
let t = e.delta || "";
|
|
17020
17027
|
n.subReasonFull = (n.subReasonFull || "") + t;
|
|
17021
17028
|
let r = (n.subReason || "") + t;
|
|
17022
|
-
n.subReason = r.length >
|
|
17029
|
+
n.subReason = r.length > lv ? r.slice(-4e3) : r;
|
|
17023
17030
|
break;
|
|
17024
17031
|
}
|
|
17025
17032
|
n.children ||= [];
|
|
@@ -17150,7 +17157,7 @@ function lv(e = {}) {
|
|
|
17150
17157
|
}
|
|
17151
17158
|
//#endregion
|
|
17152
17159
|
//#region src/core/components/icons.ts
|
|
17153
|
-
var
|
|
17160
|
+
var dv = {
|
|
17154
17161
|
header: "🤖",
|
|
17155
17162
|
subagent: "🤖",
|
|
17156
17163
|
subagentProgress: "🧬",
|
|
@@ -17161,10 +17168,10 @@ var uv = {
|
|
|
17161
17168
|
recommend: "💡",
|
|
17162
17169
|
conflict: "⚠️"
|
|
17163
17170
|
};
|
|
17164
|
-
function
|
|
17165
|
-
let t = { ...
|
|
17171
|
+
function fv(e) {
|
|
17172
|
+
let t = { ...dv };
|
|
17166
17173
|
if (!e) return t;
|
|
17167
|
-
let n = Object.keys(
|
|
17174
|
+
let n = Object.keys(dv);
|
|
17168
17175
|
for (let r of n) {
|
|
17169
17176
|
let n = e[r];
|
|
17170
17177
|
typeof n == "string" && (t[r] = n);
|
|
@@ -17173,7 +17180,7 @@ function dv(e) {
|
|
|
17173
17180
|
}
|
|
17174
17181
|
//#endregion
|
|
17175
17182
|
//#region src/core/components/messages.ts
|
|
17176
|
-
var
|
|
17183
|
+
var pv = {
|
|
17177
17184
|
defaultTitle: "AI 助手",
|
|
17178
17185
|
inputPlaceholder: "输入消息,Enter 发送...",
|
|
17179
17186
|
newSession: "新建会话",
|
|
@@ -17405,8 +17412,8 @@ var fv = {
|
|
|
17405
17412
|
codeDemoText: "这是一段示例文字,用于展示 CSS 效果。",
|
|
17406
17413
|
codeDemoButton: "按钮",
|
|
17407
17414
|
codeDemoInput: "输入框"
|
|
17408
|
-
},
|
|
17409
|
-
"zh-CN":
|
|
17415
|
+
}, mv = {
|
|
17416
|
+
"zh-CN": pv,
|
|
17410
17417
|
"en-US": {
|
|
17411
17418
|
defaultTitle: "AI Assistant",
|
|
17412
17419
|
inputPlaceholder: "Type a message, Enter to send...",
|
|
@@ -17641,10 +17648,10 @@ var fv = {
|
|
|
17641
17648
|
codeDemoInput: "Input"
|
|
17642
17649
|
}
|
|
17643
17650
|
};
|
|
17644
|
-
function
|
|
17651
|
+
function hv(e = "zh-CN", t) {
|
|
17645
17652
|
let n = {
|
|
17646
|
-
...
|
|
17647
|
-
...
|
|
17653
|
+
...pv,
|
|
17654
|
+
...mv[e]
|
|
17648
17655
|
};
|
|
17649
17656
|
if (!t) return n;
|
|
17650
17657
|
let r = { ...n };
|
|
@@ -17656,9 +17663,9 @@ function mv(e = "zh-CN", t) {
|
|
|
17656
17663
|
}
|
|
17657
17664
|
//#endregion
|
|
17658
17665
|
//#region src/core/composables/chatContext.ts
|
|
17659
|
-
var
|
|
17660
|
-
function
|
|
17661
|
-
let t =
|
|
17666
|
+
var gv = Symbol("chatContext");
|
|
17667
|
+
function _v(e = {}) {
|
|
17668
|
+
let t = uv({
|
|
17662
17669
|
fetchResponse: e.fetchResponse,
|
|
17663
17670
|
fetchStream: e.fetchStream,
|
|
17664
17671
|
messages: e.messages,
|
|
@@ -17680,7 +17687,7 @@ function gv(e = {}) {
|
|
|
17680
17687
|
}, h = /* @__PURE__ */ Wt({}), g = (e) => h.value[e] === !0, _ = (e) => {
|
|
17681
17688
|
h.value[e] = !g(e);
|
|
17682
17689
|
}, v = /* @__PURE__ */ Wt(!1), y = (e) => {
|
|
17683
|
-
|
|
17690
|
+
cv(e).then((e) => {
|
|
17684
17691
|
e && (v.value = !0, setTimeout(() => {
|
|
17685
17692
|
v.value = !1;
|
|
17686
17693
|
}, 1500));
|
|
@@ -17746,7 +17753,7 @@ function gv(e = {}) {
|
|
|
17746
17753
|
e.onClearFocus?.();
|
|
17747
17754
|
}, F = (t) => {
|
|
17748
17755
|
e.onFocusChipClick?.(t);
|
|
17749
|
-
}, I =
|
|
17756
|
+
}, I = fv(e.icons), ce = e.locale ?? "zh-CN", L = hv(ce, e.dialogMessages);
|
|
17750
17757
|
return {
|
|
17751
17758
|
chat: t,
|
|
17752
17759
|
inputText: o,
|
|
@@ -17791,15 +17798,15 @@ function gv(e = {}) {
|
|
|
17791
17798
|
toolStepView: e.toolStepView
|
|
17792
17799
|
};
|
|
17793
17800
|
}
|
|
17794
|
-
function
|
|
17795
|
-
let e = Zn(
|
|
17801
|
+
function vv() {
|
|
17802
|
+
let e = Zn(gv);
|
|
17796
17803
|
if (!e) throw Error("useChatContext 必须在 provide(chatContextKey) 的组件子树内调用");
|
|
17797
17804
|
return e;
|
|
17798
17805
|
}
|
|
17799
17806
|
//#endregion
|
|
17800
17807
|
//#region src/core/index.headless.ts
|
|
17801
|
-
function
|
|
17802
|
-
return
|
|
17808
|
+
function yv(e) {
|
|
17809
|
+
return Z_(e);
|
|
17803
17810
|
}
|
|
17804
17811
|
//#endregion
|
|
17805
|
-
export { ym as CAPABILITIES, Sm as CONTEXT_PRESETS, Dp as CompressDecisionSchema,
|
|
17812
|
+
export { ym as CAPABILITIES, Sm as CONTEXT_PRESETS, Dp as CompressDecisionSchema, Xg as DEFAULT_COMPUTED_STYLES, jl as DEFAULT_PROMPT_SOFT_CAP, cd as DEFAULT_SYSTEM_PROMPT, ld as DEFAULT_SYSTEM_PROMPT_EN, gf as HTML_VOID_TAGS, xu as HUMAN_CONFIRM_TOOL_NAME, hi as ImageInputError, g as LOW_CAPS_HINT_BASELINE, p as MIN_CONTEXT_WINDOW, va as MODEL_UNAVAILABLE_GUIDANCE, Al as SOFT_CAP_MIN_WINDOW, Sl as STOP_WORDS, Cc as UNSAFE_KEYS, S_ as actionsToInspectInfo, x_ as actionsToTools, di as agentError, ed as analyzeContext, Ic as applyPatchToClone, zc as applyPatchToLive, rf as applyPatchesToBind, Ag as applyProposalOps, Hs as arrayMinLength, ui as asAgentError, sp as buildCollectorJs, t_ as buildCssPath, gd as buildDataPrompt, $f as buildDiagnosticsReport, _p as buildHtmlFragmentSkill, cp as buildSandboxSrcdoc, _d as buildSystemPrompt, Ji as captureSelectionQuote, gv as chatContextKey, nf as commitSetToBind, mp as composeStructureThenRender, Ei as compressImage, od as connectMcp, k as constructLlmFromConfig, E as constructOpenLlmSync, cv as copyText, kg as countOccurrences, Ms as createAgent, bu as createApprovalMiddleware, _v as createChatContext, yv as createChatSdk, Mu as createCheckpointManager, Nu as createCheckpointMiddleware, Hp as createConflictManager, td as createContextInspectorMiddleware, xp as createCraftNoteCheck, hf as createDataOps, sv as createEvalHarness, yp as createHtmlFormatCheck, pp as createHtmlRenderCheck, Cp as createHtmlSubagent, wu as createHumanConfirmMiddleware, Cu as createHumanConfirmTool, iv as createIdleDetector, um as createMemoryBackend, pu as createMemoryMiddleware, u as createProxyLlm, rv as createRagSubagent, wa as createSandboxRunner, xm as createSdkEvents, U_ as createSerialRunner, mm as createSessionStore, hm as createSessionStoreWithBackend, z_ as createSkillStore, iu as createSubagentMiddleware, Rl as createSubagentTracker, su as createSubagentsMiddleware, j_ as createUsageHintsMiddleware, Fu as createVerifyMiddleware, xd as createVfs, fm as createWebStorageBackend, Vu as createWriteBackCheck, ya as decorateModelUnavailable, Oc as deepClone, T_ as defineDataToolset, Qc as defineSkill, wp as defineTool, Dc as deleteByPath, Op as deriveTitle, nc as describeSchemaNode, hs as detectGarbledToolCall, To as detectTransitionalReply, Uc as diffObjects, ov as diffReport, o_ as domInfoTool, d_ as domInspectSkill, a_ as domSearchTool, Vg as domToStructure, Yg as domTools, w_ as domToolsStatic, Us as elementSchemaCandidates, $g as ensureDomListenerRecorder, wl as estimateMessageTokens, Dl as estimateRoundTokens, y as estimateTokens, te as extractReasoningDelta, hc as extractSchemaHint, nd as extractText, ee as extractTextDelta, ne as extractUsage, Lg as fetchDocTools, C_ as fetchTools, Hc as findStrippedKeys, rc as formatConstraints, oi as formatZodIssues, Q as getByPath, Hg as getDomTool, i_ as getElementInfo, m_ as getEnvSummary, e_ as getRecordedListeners, dp as getSandboxLifecycle, Is as getSchemaAtPath, Ns as getSchemaTopKeys, jg as hashContent, Pc as hashValue, vp as htmlFragmentSkill, uc as htmlOrchestratorPrompt, Ol as indexSummarize, __ as inspectEnvTool, v_ as inspectTools, Ap as isChatModel, ga as isContextLengthError, _a as isModelUnavailableError, Ps as isPathAllowed, nm as isQuotaError, wc as isUnsafePath, Pa as jpEval, ci as jsonParseError, Mc as limitDepth, Dg as lineDiff, _ as lowCapsHint, Zf as maskUrlCredentials, Ac as maybeParseValue, Gf as measureWriteScale, Rc as moveByPath, T as normalizeBaseUrl, op as normalizeRenderResult, ie as normalizeUsage, x as offloadPassThroughChars, b as offloadThresholdChars, lc as presets, Xs as projectBySchema, Ys as projectBySchemaDeep, jc as projectFields, kl as recallRounds, fp as renderInSandbox, ic as renderSchemaHint, ac as renderSchemaOverview, cc as renderSchemaShallow, bm as resolveCapabilities, wm as resolveContextOptions, vm as resolveDialogConfig, Vp as resolveLlm, v as resolveModelCaps, Nl as resolvePromptSoftCap, zs as resolveSchemaPath, _m as resolveStorage, Vc as restoreInPlace, Bc as restoreLive, li as routeError, Ra as runSandboxedScript, Tc as safeMerge, p_ as safeSerialize, $ as safeStringify, gs as sanitizeGarbledContent, Vs as schemaHasRefinement, n_ as searchDom, Ia as searchJson, E_ as selectBuiltinTools, Ec as setByPath, Pl as shouldTriggerCompression, ep as stringifyDiagnosticsReport, w as stripStainlessFetch, dc as systemPromptHelpers, h as tableMaxOutputTokens, Cl as tokenize, Z as toolError, Fs as unwrapSchema, uv as useChat, vv as useChatContext, Bs as validateAtPath, vf as validateHtmlFormat, ef as validateRootValueLocally, tf as validateWriteLocally, Fc as watchFieldsHash, e as z, si as zodError };
|