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.
@@ -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 rg(e, t, n) {
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 ig(e) {
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 = rg(document, typeof window < "u" ? window : {}, i);
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
- s = {
13541
+ l = {
13535
13542
  width: a.width,
13536
13543
  height: e
13537
13544
  };
13538
13545
  }
13539
- let c;
13546
+ let u;
13540
13547
  try {
13541
- c = await n(o, s);
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 l;
13552
+ let d;
13546
13553
  try {
13547
- l = await Ei(ng(c), { name: `screenshot-${a.mode}.png` });
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 u = e.stow?.(l), d = {
13558
+ let f = e.stow?.(d), p = {
13552
13559
  mode: a.mode,
13553
13560
  ...i.selector ? { selector: i.selector } : {}
13554
- }, f = e.getVision();
13555
- f && e.onShot?.(l, d);
13556
- let p;
13557
- if (!f) {
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
- p = await e.describe(l, { text: `页面截图(${a.mode}${t.selector ? ` ${t.selector}` : ""})` });
13567
+ h = await e.describe(d, { text: `页面截图(${a.mode}${t.selector ? ` ${t.selector}` : ""})` });
13561
13568
  } catch {
13562
- p = void 0;
13569
+ h = void 0;
13563
13570
  }
13564
13571
  }
13565
- let m = f ? "vision-image(随后的图片消息)" : p ? "describe-text(转述如下)" : "none", h = [
13566
- `截图完成(${a.mode}${i.selector ? ` selector="${i.selector}"` : ""}):${l.width}x${l.height},${Math.round((l.bytes ?? 0) / 1024)}KB(jpeg 压缩后)${r}`,
13567
- u ? `原图已存 vfs:${u}` : "vfs 未开启,原图仅本轮内存",
13568
- `投递形态:${m}`
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 p && h.push(`识图转述:${p}`), h.join("\n");
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 ag(e) {
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 og(e) {
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 ag(t));
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 sg = "data-pg-snap", cg = 20, lg = 256 * 1024, ug = t.enum([
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
- ]), dg = /* @__PURE__ */ new Set([
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
- ]), fg = /^on\w+$/i, pg = /* @__PURE__ */ new Set([
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 mg(e) {
13658
+ function hg(e) {
13652
13659
  return /^\s*(javascript|vbscript)\s*:/i.test(e);
13653
13660
  }
13654
- function hg(e) {
13655
- return !e || !/^[a-zA-Z_:][-a-zA-Z0-9_:.]*$/.test(e) ? `非法属性名 "${e}"` : fg.test(e) ? `事件属性 ${e} 被拒(on* 内联脚本防误执行)` : null;
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 gg(e, t) {
13664
+ function _g(e, t) {
13658
13665
  let n = [];
13659
- dg.has(e.toLowerCase()) && n.push(`标签 <${e}> 被拒(可执行/页面行为面;文档标注场景请用常规内容标签)`);
13666
+ fg.has(e.toLowerCase()) && n.push(`标签 <${e}> 被拒(可执行/页面行为面;文档标注场景请用常规内容标签)`);
13660
13667
  for (let [e, r] of Object.entries(t ?? {})) {
13661
- let t = hg(e);
13662
- t ? n.push(t) : pg.has(e.toLowerCase()) && mg(String(r)) && n.push(`${e} 的 javascript:/vbscript: 协议被拒`);
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 _g = t.discriminatedUnion("op", [
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: ug.describe("before/after = 锚前后兄弟;prepend/append = 锚首尾子;replace = 换掉锚本身"),
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 vg(e) {
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 = hg(r.name);
13741
- e ? t.push(`${i}: ${e}`) : pg.has(r.name.toLowerCase()) && mg(r.value) && t.push(`${i}: ${r.name} 的 javascript:/vbscript: 协议被拒`);
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(...gg(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 或颜色名`);
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 yg(e = {}) {
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 > lg) return `快照超限:受影响子树 ${(n.length / 1024).toFixed(0)}KB > ${lg / 1024}KB。缩小 selector 到更深的子树再改(快照是回滚安全网,巨树快照爆内存)`;
13760
- let i = e.getAttribute?.(sg) ?? "";
13761
- return i || (i = `pg${++r}`, e.setAttribute?.(sg, i)), t.some((e) => e.id === i) || t.push({
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 = vg(t);
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 > cg && n.shift()), e.onEdit?.({
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(_g).min(1).max(20).describe("批量操作(原子;顺序应用)"),
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(`[${sg}="${n}"]`);
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 bg = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e;
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" ? 0 : 1;
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 && Sg(f) >= Sg(e) ? f : e, d === null && (d = setTimeout(() => {
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 wg = 4e6;
14003
- function Tg(e, t) {
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 Eg(e, t) {
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 > wg ? [...Tg("del", s), ...Tg("add", c)] : Dg(s, c), u = [
14015
- ...Tg("same", n.slice(0, i)),
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
- ...Tg("same", n.slice(a))
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 Dg(e, t) {
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 Og(e, t) {
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 kg(e, t) {
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 = Og(n, r.find);
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 = Og(n, r.anchor);
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 Ag(e) {
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 jg(e) {
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 Mg(e) {
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 Ng = t.discriminatedUnion("op", [
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 Pg(e, n) {
14145
- let r = jg(e), i = {
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 Mg(r);
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 = Ag(t.content);
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(Ng).min(1).max(50).optional().describe("增量操作(顺序应用,原子;推荐 —— token 只花在改动上,勿全量重发)"),
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 Mg(r);
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 = Ag(o);
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 ? kg(o, e.ops) : {
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: Eg(o, u),
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 Fg = 3e4, Ig = [s(async ({ url: e, as: t }) => {
14277
- let n = new AbortController(), r = setTimeout(() => n.abort(), Fg);
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 ? `获取失败:请求超时(${Fg}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
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
- })], Lg = [
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
- ], Rg = /^(value|srcdoc|formaction|on\w+)$/i, zg = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session/i;
14318
- function Bg(e, t) {
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 ?? Lg, s = (e) => {
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-")) && (Rg.test(n.name) || zg.test(n.name) || (t[n.name] = n.value));
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 Vg = s(({ selector: e, depth: t, attrs: n, includeText: r }) => {
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 = Bg(i, {
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
- }), Hg = [
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
- ], Ug = /* @__PURE__ */ new Set([
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
- ]), Wg = "script,style,noscript,template,svg,iframe,canvas";
14375
- function Gg(e) {
14376
- for (let t of Hg) try {
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 Kg(e, t, n) {
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) || Ug.has(o))) {
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 qg(e) {
14408
+ function Jg(e) {
14402
14409
  try {
14403
- return e.querySelector?.(Wg) != null || e.querySelector?.(".chat-dialog, .chat-mask, .debug-drawer, .skill-mask, .skill-panel, .chat-selection-menu") != null;
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 Jg = [Vg, s(({ selector: e, offset: t, limit: n }) => {
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 = Gg(document), i = r ? r.tagName.toLowerCase() : "body";
14415
- let a = Kg(r, ji, qg), o = t ?? 0, s = n ?? 4e3;
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
- })], Yg = /* @__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("."), Xg = /* @__PURE__ */ new WeakMap(), Zg = !1;
14435
- function Qg() {
14436
- if (Zg) return;
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
- Zg = !0;
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 = Xg.get(this);
14444
- t || (t = /* @__PURE__ */ new Map(), Xg.set(this, t)), t.set(String(e), (t.get(String(e)) ?? 0) + 1);
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 = Xg.get(this);
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 $g(e) {
14459
- return [...Xg.get(e)?.entries() ?? []].filter(([, e]) => e > 0).map(([e]) => e);
14465
+ function e_(e) {
14466
+ return [...Zg.get(e)?.entries() ?? []].filter(([, e]) => e > 0).map(([e]) => e);
14460
14467
  }
14461
- function e_(e, t = 12) {
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 t_(e, t, n = {}) {
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: e_(e),
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 n_ = [
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 r_(e, t = {}) {
14544
+ function i_(e, t = {}) {
14538
14545
  if (!e) return null;
14539
14546
  let n = {
14540
- selector: e_(e),
14547
+ selector: t_(e),
14541
14548
  tag: e.tagName.toLowerCase(),
14542
14549
  attrs: {}
14543
14550
  };
14544
- for (let t of Array.from(e.attributes)) !(Lg.includes(t.name) || t.name.startsWith("data-")) || Rg.test(t.name) || zg.test(t.name) || (n.attrs[t.name] = t.value);
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 ? n_ : t.styles ?? Yg) {
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: $g(e)
14591
+ captured: e_(e)
14585
14592
  };
14586
14593
  }
14587
14594
  return n;
14588
14595
  }
14589
- var i_ = s(({ query: e, mode: t, limit: n, root: r }) => {
14590
- Qg();
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 = t_(i, e, {
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
- }), a_ = s(({ selector: e, styles: t, includeHtml: n, htmlLimit: r, includeEvents: i, includeRect: a, pseudo: o }) => {
14611
- Qg();
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 = r_(s, {
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
- }), o_ = "dom-inspect";
14636
- function s_(e = {}) {
14642
+ }), s_ = "dom-inspect";
14643
+ function c_(e = {}) {
14637
14644
  return {
14638
- name: o_,
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: [() => [i_, a_]]
14676
+ tools: [() => [a_, o_]]
14670
14677
  };
14671
14678
  }
14672
- var c_ = "page-analysis";
14673
- function l_(e = {}) {
14679
+ var l_ = "page-analysis";
14680
+ function u_(e = {}) {
14674
14681
  return {
14675
- name: c_,
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 u_ = s_();
14711
+ var d_ = c_();
14705
14712
  //#endregion
14706
14713
  //#region src/core/tools/envTool.ts
14707
- function d_(e) {
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 f_(e, t = 3, n = 2e3, r, i) {
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 (d_(a)) {
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) => f_(e, t - 1, n, o, i));
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] = f_(e, t - 1, n, o, i);
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 p_(e) {
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 m_ = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|opener|parent|top|self|window|globalThis|closed|history|navigation|trustedTypes|origin|crossOriginIsolated)$/, h_ = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session|ticket/i, g_ = s(({ key: e }) => {
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 (m_.test(e) || h_.test(e)) return JSON.stringify({
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: f_(t, 3, 2e3, void 0, h_)
14799
+ value: p_(t, 3, 2e3, void 0, g_)
14793
14800
  }, null, 2);
14794
14801
  }
14795
- return JSON.stringify(p_(), null, 2);
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
- }), __ = [g_];
14807
+ }), v_ = [__];
14801
14808
  //#endregion
14802
14809
  //#region src/core/harness/budget.ts
14803
- function v_(e, t, n) {
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 y_ = /^[a-zA-Z][a-zA-Z0-9_]*$/;
14829
- function b_(e) {
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 (!y_.test(r)) {
14833
- console.warn(`[page-agent-sdk][actions] 动作名 "${r}" 非法(须匹配 ${y_}),已跳过`);
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 x_(e) {
14860
+ function S_(e) {
14854
14861
  let t = {};
14855
- for (let [n, r] of Object.entries(e)) y_.test(n) && (t[n] = {
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 S_ = Ig, C_ = Jg;
14866
- function w_(e, t) {
14872
+ var C_ = Lg, w_ = Yg;
14873
+ function T_(e, t) {
14867
14874
  return hf(e, t);
14868
14875
  }
14869
- function T_(e, t, n, r, i) {
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 E_ = .7, D_ = .5, O_ = .85;
14881
- function k_(e, t) {
14882
- if (!Number.isFinite(t) || t <= 0 || e <= 0 || e < t * D_) return "";
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 * O_ ? `⏳ 预算告急:本任务累计约 ${n}K prompt tokens(已达 softCap 上限的 ${Math.round(O_ * 100)}%)。立即停止扩展性操作(新查询/重读/优化),完成手头最关键一步后基于已有工具结果给出结论,并如实汇报剩余未完成项。轮次预算吃紧时系统会另行注入轮次提示段。` : `⏳ 预算提示:本任务累计约 ${n}K prompt tokens(已过 softCap 半程)。若已接近目标请收敛并给出总结;尚未接近请向用户汇报进度与剩余计划,勿默默继续。轮次预算吃紧时系统会另行注入轮次提示段。`;
14891
+ return e >= t * k_ ? `⏳ 预算告急:本任务累计约 ${n}K prompt tokens(已达 softCap 上限的 ${Math.round(k_ * 100)}%)。立即停止扩展性操作(新查询/重读/优化),完成手头最关键一步后基于已有工具结果给出结论,并如实汇报剩余未完成项。轮次预算吃紧时系统会另行注入轮次提示段。` : `⏳ 预算提示:本任务累计约 ${n}K prompt tokens(已过 softCap 半程)。若已接近目标请收敛并给出总结;尚未接近请向用户汇报进度与剩余计划,勿默默继续。轮次预算吃紧时系统会另行注入轮次提示段。`;
14885
14892
  }
14886
- function A_(e, t, n) {
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) >= E_ || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), n = e.subagents.filter((e) => (e.temperature ?? 0) < E_ && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
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 = k_(o.invokeUsage.prompt_tokens || o.invokeUsage.total_tokens, n?.promptSoftCap ?? Infinity);
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 j_(e, t) {
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 M_(e) {
14933
+ function N_(e) {
14927
14934
  return {
14928
14935
  name: "pageContext",
14929
14936
  augmentPrompt: () => {
14930
14937
  let t = e.getPageInfo();
14931
- if (t) return j_(t, e.canReadPage);
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 N_(e) {
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 P_ = "v:1::skill-store", F_ = "chat-sdk";
14952
- function I_(e, t, n) {
14953
- return `${P_}::${e}::${t}::${n}`;
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 L_(e, t) {
14956
- return `${P_}::${e}::${t}::`;
14962
+ function R_(e, t) {
14963
+ return `${F_}::${e}::${t}::`;
14957
14964
  }
14958
- function R_(e = {}) {
14959
- let t = e.dbName ?? F_, n = e.backend ?? "indexed", r = e.id ?? "", i, a, o = new Promise((e) => {
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(L_(t, r), (t, n) => {
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(I_(t, r, e));
14993
+ return await i.get(L_(t, r, e));
14987
14994
  },
14988
14995
  async put(e) {
14989
14996
  try {
14990
- await i.set(I_(t, r, e.name), e);
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 = I_(t, r, e);
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(L_(t, r));
15007
+ await i.clearPrefix(R_(t, r));
15001
15008
  },
15002
15009
  dispose() {}
15003
15010
  };
15004
15011
  }
15005
- var z_ = /large_results\/[^\s"'`),]+\.txt/g;
15006
- function B_(e) {
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 (z_.lastIndex = 0; (n = z_.exec(e)) !== null;) t.add(n[0]);
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 V_(e, t) {
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 H_() {
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 U_ = 30, W_ = /* @__PURE__ */ new Map();
15035
- function G_(e, t) {
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 K_(e) {
15045
+ function q_(e) {
15039
15046
  return e === "spawn_agent" || e === "spawn_agents" || e.startsWith("use_");
15040
15047
  }
15041
- function q_(e, t, n, r) {
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 = G_(t.name, t.args), o = typeof i.content == "string" && i.content.startsWith("ERROR:");
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 && K_(t.name) && e({
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 J_(e, t, n, r, i) {
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 Y_(e, n, r) {
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 ? N_({ 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({
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" ? og({
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 ? ig({
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 ? yg({
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 = [...T_(B, xe, Ig, B.domInspect ? [
15308
- ...Jg,
15314
+ }) : [], Ie = [...E_(B, xe, Lg, B.domInspect ? [
15315
+ ...Yg,
15309
15316
  ...Fe,
15310
15317
  ...je ? [je] : [],
15311
- ...B.skills ? [] : [i_, a_]
15312
- ] : [], __), ...Ae ? [Ae] : []];
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 ? Pg(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 = b_(e.actions ?? {});
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 = A_({
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 ? M_({
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 : R_({
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") ? [s_({
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") ? [l_({
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 ? [v_(a, {
15716
+ ...ve ? [y_(a, {
15710
15717
  tokenBudget: e.tokenBudget,
15711
15718
  timeBudgetMs: e.timeBudgetMs
15712
15719
  }, J)] : [],
15713
- q_(J, w, U, a)
15714
- ]), tn = e.maxMemoryRounds ?? U_;
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 = H_(), on = /* @__PURE__ */ new Set();
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?.(B_(w));
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?.(B_(w)), n) {
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?.(B_(e));
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())), W_.delete(n);
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: x_(e.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 = J_(t, "setFocus", Ye, () => U()?.schema, e.debug);
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 = J_(t, "addFocus", Ye, () => U()?.schema, e.debug);
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 B_(e)) {
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 = V_(T.files, B_(w));
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 X_(e, t) {
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 ? W_.get(n) : void 0;
16491
- l ? c = l : (c = Y_(e, n, a ? o : void 0), e.shareContext && W_.set(n, c)), c.refCount++;
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 = Cg({
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: xg(e) });
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 Z_(e, t, n, r, i) {
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 Q_(e, t, n, r, i) {
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: () => Q_(!0, !0, !0, "search_docs", "load_doc")
16793
+ getContent: () => $_(!0, !0, !0, "search_docs", "load_doc")
16787
16794
  };
16788
- function ev(e, n, r) {
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 tv(e, n) {
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 nv(e) {
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(ev(s, t, o)), n && p.push(tv(c, n)), f && p.push(...f);
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 = Z_(r, !!t, !!n, s, c), g = {
16837
+ ] : void 0, h = Q_(r, !!t, !!n, s, c), g = {
16831
16838
  name: "rag-search",
16832
- description: $_.description,
16833
- getContent: () => Q_(r, !!t, !!n, s, c)
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 rv(e = {}) {
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 iv = /* @__PURE__ */ new Set(["elapsedSec"]);
16860
- function av(e, t, n = {}) {
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
- iv.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({
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 ov(e) {
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 = rv(o), c = Date.now();
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 sv(e) {
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 cv = 4e3;
16941
- function lv(e = {}) {
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 > cv ? r.slice(-4e3) : r;
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 uv = {
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 dv(e) {
17165
- let t = { ...uv };
17171
+ function fv(e) {
17172
+ let t = { ...dv };
17166
17173
  if (!e) return t;
17167
- let n = Object.keys(uv);
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 fv = {
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
- }, pv = {
17409
- "zh-CN": fv,
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 mv(e = "zh-CN", t) {
17651
+ function hv(e = "zh-CN", t) {
17645
17652
  let n = {
17646
- ...fv,
17647
- ...pv[e]
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 hv = Symbol("chatContext");
17660
- function gv(e = {}) {
17661
- let t = lv({
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
- sv(e).then((e) => {
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 = dv(e.icons), ce = e.locale ?? "zh-CN", L = mv(ce, e.dialogMessages);
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 _v() {
17795
- let e = Zn(hv);
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 vv(e) {
17802
- return X_(e);
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, Yg 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, x_ as actionsToInspectInfo, b_ as actionsToTools, di as agentError, ed as analyzeContext, Ic as applyPatchToClone, zc as applyPatchToLive, rf as applyPatchesToBind, kg as applyProposalOps, Hs as arrayMinLength, ui as asAgentError, sp as buildCollectorJs, e_ as buildCssPath, gd as buildDataPrompt, $f as buildDiagnosticsReport, _p as buildHtmlFragmentSkill, cp as buildSandboxSrcdoc, _d as buildSystemPrompt, Ji as captureSelectionQuote, hv as chatContextKey, nf as commitSetToBind, mp as composeStructureThenRender, Ei as compressImage, od as connectMcp, k as constructLlmFromConfig, E as constructOpenLlmSync, sv as copyText, Og as countOccurrences, Ms as createAgent, bu as createApprovalMiddleware, gv as createChatContext, vv as createChatSdk, Mu as createCheckpointManager, Nu as createCheckpointMiddleware, Hp as createConflictManager, td as createContextInspectorMiddleware, xp as createCraftNoteCheck, hf as createDataOps, ov as createEvalHarness, yp as createHtmlFormatCheck, pp as createHtmlRenderCheck, Cp as createHtmlSubagent, wu as createHumanConfirmMiddleware, Cu as createHumanConfirmTool, rv as createIdleDetector, um as createMemoryBackend, pu as createMemoryMiddleware, u as createProxyLlm, nv as createRagSubagent, wa as createSandboxRunner, xm as createSdkEvents, H_ as createSerialRunner, mm as createSessionStore, hm as createSessionStoreWithBackend, R_ as createSkillStore, iu as createSubagentMiddleware, Rl as createSubagentTracker, su as createSubagentsMiddleware, A_ as createUsageHintsMiddleware, Fu as createVerifyMiddleware, xd as createVfs, fm as createWebStorageBackend, Vu as createWriteBackCheck, ya as decorateModelUnavailable, Oc as deepClone, w_ 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, av as diffReport, a_ as domInfoTool, u_ as domInspectSkill, i_ as domSearchTool, Bg as domToStructure, Jg as domTools, C_ as domToolsStatic, Us as elementSchemaCandidates, Qg 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, Ig as fetchDocTools, S_ as fetchTools, Hc as findStrippedKeys, rc as formatConstraints, oi as formatZodIssues, Q as getByPath, Vg as getDomTool, r_ as getElementInfo, p_ as getEnvSummary, $g as getRecordedListeners, dp as getSandboxLifecycle, Is as getSchemaAtPath, Ns as getSchemaTopKeys, Ag as hashContent, Pc as hashValue, vp as htmlFragmentSkill, uc as htmlOrchestratorPrompt, Ol as indexSummarize, g_ as inspectEnvTool, __ 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, Eg 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, f_ as safeSerialize, $ as safeStringify, gs as sanitizeGarbledContent, Vs as schemaHasRefinement, t_ as searchDom, Ia as searchJson, T_ 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, lv as useChat, _v as useChatContext, Bs as validateAtPath, vf as validateHtmlFormat, ef as validateRootValueLocally, tf as validateWriteLocally, Fc as watchFieldsHash, e as z, si as zodError };
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 };