page-agent-sdk 3.7.0 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3638,22 +3638,55 @@ function Ia(e, t, n, r) {
3638
3638
  let t = n ? Z(e, n) : e;
3639
3639
  return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (Oa(t, r), null);
3640
3640
  }
3641
+ if (t === "move") return Ra(e, n, r);
3641
3642
  let i = n ? Z(e, n) : e;
3642
3643
  return Array.isArray(i) ? (Array.isArray(r) ? i.push(...r) : i.push(r), null) : `append 目标${n ? `(${n})` : "(根)"}不是数组`;
3643
3644
  }
3644
- function La(e, t, n, r) {
3645
+ function La(e, t) {
3646
+ let n = t.split("."), r = e;
3647
+ for (let e = 0; e < n.length - 1; e++) {
3648
+ if (r == null) return null;
3649
+ r = r[n[e]];
3650
+ }
3651
+ return [r, n[n.length - 1]];
3652
+ }
3653
+ function Ra(e, t, n) {
3654
+ if (!t) return "move 操作需要 jsonPath(源数组元素路径,如 components.2)";
3655
+ if (typeof n != "string" || !n) return "move 的 value 必须是目标路径字符串(数组本身=追加,如 \"sections.1.children\";数组内下标=插入,如 \"components.0\")";
3656
+ if (Da(n)) return `move 目标路径 "${n}" 含非法段`;
3657
+ let r = La(e, t);
3658
+ if (!r || !Array.isArray(r[0])) return "move 源的父级不是数组(仅支持数组元素移动,jsonPath 应指向数组下标,如 components.2)";
3659
+ let i = Number(r[1]);
3660
+ if (!Number.isInteger(i) || i < 0 || i >= r[0].length) return `move 源下标越界:${t}(父数组长度 ${r[0].length})`;
3661
+ let a = r[0][i];
3662
+ r[0].splice(i, 1);
3663
+ let o = Z(e, n);
3664
+ if (Array.isArray(o)) return o.push(a), null;
3665
+ if (o === void 0) {
3666
+ let t = La(e, n);
3667
+ if (t && t[0] != null && typeof t[0] == "object" && !/^\d+$/.test(t[1])) return t[0][t[1]] = [a], null;
3668
+ }
3669
+ let s = La(e, n);
3670
+ if (s && Array.isArray(s[0]) && /^\d+$/.test(s[1])) {
3671
+ let e = Math.min(Number(s[1]), s[0].length);
3672
+ return s[0].splice(e, 0, a), null;
3673
+ }
3674
+ return `move 目标 "${n}" 不是数组(目标须为数组本身(追加)或数组内某下标(插入))`;
3675
+ }
3676
+ function za(e, t, n, r) {
3645
3677
  if (t === "set") ka(e, n, r);
3646
3678
  else if (t === "remove") Aa(e, n);
3647
3679
  else if (t === "merge") Oa(n ? Z(e, n) : e, r);
3680
+ else if (t === "move") Ra(e, n, r);
3648
3681
  else {
3649
3682
  let t = n ? Z(e, n) : e;
3650
3683
  Array.isArray(r) ? t.push(...r) : t.push(r);
3651
3684
  }
3652
3685
  }
3653
- function Ra(e, t) {
3654
- typeof e == "object" && e && za(e, t);
3686
+ function Ba(e, t) {
3687
+ typeof e == "object" && e && Va(e, t);
3655
3688
  }
3656
- function za(e, t) {
3689
+ function Va(e, t) {
3657
3690
  if (Array.isArray(e)) {
3658
3691
  e.length = 0, Array.isArray(t) && e.push(...t);
3659
3692
  return;
@@ -3662,7 +3695,7 @@ function za(e, t) {
3662
3695
  for (let t of Object.keys(e)) t in n || delete e[t];
3663
3696
  for (let t of Object.keys(n)) e[t] = n[t];
3664
3697
  }
3665
- function Ba(e, t, n = "") {
3698
+ function Ha(e, t, n = "") {
3666
3699
  let r = [];
3667
3700
  if (!(typeof e == "object" && e) || !(typeof t == "object" && t) || Array.isArray(e) !== Array.isArray(t)) return e !== t && r.push({
3668
3701
  path: n || "(root)",
@@ -3681,14 +3714,14 @@ function Ba(e, t, n = "") {
3681
3714
  path: i,
3682
3715
  from: e[a],
3683
3716
  to: void 0
3684
- }) : r.push(...Ba(e[a], t[a], i));
3717
+ }) : r.push(...Ha(e[a], t[a], i));
3685
3718
  }
3686
3719
  return r;
3687
3720
  }
3688
3721
  let i = e, a = t, o = /* @__PURE__ */ new Set([...Object.keys(i), ...Object.keys(a)]);
3689
3722
  for (let e of o) {
3690
3723
  let t = n ? `${n}.${e}` : e;
3691
- e in i ? e in a ? r.push(...Ba(i[e], a[e], t)) : r.push({
3724
+ e in i ? e in a ? r.push(...Ha(i[e], a[e], t)) : r.push({
3692
3725
  path: t,
3693
3726
  from: i[e],
3694
3727
  to: void 0
@@ -3702,9 +3735,9 @@ function Ba(e, t, n = "") {
3702
3735
  }
3703
3736
  //#endregion
3704
3737
  //#region src/core/sdk/htmlSubagent.ts
3705
- function Va(e) {
3738
+ function Ua(e) {
3706
3739
  let t = "html";
3707
- return `你是纯代码组件生成专家。可用工具:vfs_write / vfs_edit / vfs_rm(写/改/删代码工作副本 vfs ${e}) / vfs_read + vfs_grep(读 vfs) / validate_code(代码格式自检) / write + set(写 data,writablePaths 限定) / read / write_todos + update_todo(规划)。
3740
+ return `你是纯代码组件生成专家。可用工具:vfs_write / vfs_edit / vfs_rm(写/改/删代码工作副本 vfs ${e}) / vfs_read + vfs_grep(读 vfs) / validate_code(代码格式自检) / write(写 data,writablePaths 限定;set/patch 增量或整体) / read / write_todos + update_todo(规划)。
3708
3741
 
3709
3742
  收 task 规格照做(减少你自己的思考纠结):task 含视觉(配色/质感)+ 内容(文案/数据)+ 交互(动效/触发)规格时,**照规格实现**(技术实现 SVG vs CSS / keyframes vs transition 自行选成熟模式,不穷举);task 缺规格(主 agent 漏写)时,按字面意图选**一个简单方案**直接实现,不纠结「该用什么风格」—— 主 agent 掌整页主题协调,你负责落地。
3710
3743
 
@@ -3753,12 +3786,12 @@ ${`- 输出形态:完整、自包含的 HTML 页面(.${t},可独立成页)`}
3753
3786
  - **代码字符串不纠结转义**:code / content 字段就是普通字符串,直接写完整代码文本(换行、引号照常写),不要纠结「\n」转义、单双引号、字面换行会不会被拒 —— 框架自动序列化,反复权衡纯属浪费 token。
3754
3787
  - 一次想清楚 → 动手 → 验证 → 收口。**思考是手段不是目的,产出代码才是**。`;
3755
3788
  }
3756
- var Ha = "# HTML 完整页面生成规范\n\n## 代码资产模型(重要)\n- 代码正文是 data 的 code 字段(资产,随 data json 进服务端 DB);UI 绑 data.code 渲染\n- vfs 是编辑工作副本:框架自动 checkout(data.code→vfs)/ commit(vfs→data.code),你只改 vfs\n- __pgId 框架管(read 看不到、write 写不进),别碰\n\n## 两条工作路径\n- 修改已有组件:必经 vfs —— 按上下文「组件代码文件地图」(name → vfs 路径)定位文件,vfs_edit 增量改 → validate_code;勿直接 write data.code;文件未检出先 vfs_write 创建\n- 新建组件:write({patch:{op:'set',jsonPath:'components.N',value:{...}}}) —— value 按 schema 全字段写(必填字段如 type 不能漏;先 read 看现有组件结构照抄字段名),框架补 __pgId。固定流程 write → validate_code({jsonPath:'components.N.code'})(零重传 content)→ read 确认,**不手动 vfs_write 建副本**(框架下次委派自动 checkout)。code 字段直接写完整代码字符串,换行/引号照常写,无需手工 JSON 转义\n\n## 焦点精修(继承主 agent 焦点时)\n- 上下文提示「当前精修目标」(如 components.2(banner))→ 只改该焦点组件的代码文件;改其他组件会被 PATH_DENIED 硬拦\n- 聚焦模式不能新建组件(数据写被拦),要新建先反馈主 agent 取消焦点\n\n## 输出:完整、自包含、能独立成页的 HTML\n- 产物是**完整、自包含的 HTML 页面**(结构完整、标签闭合),能独立正确渲染。下游改造(抽 body / 包组件 / 片段化)由插件或 tool 做,不是你的事\n- **交互逻辑默认用 <script> 实现**(完整页面含 script 是常态);仅当用户明确要求「纯 CSS / 不要 script」时不写\n- **CSS 用 <style> 块、script 用 <script> 块集中放置**(如 <head> 内),不散落内联 —— 便于下游工具提取成独立 html/css/js\n- 可引入外部 JS / CSS(CDN 组件库、字体、外链样式)按需使用;class 统一加前缀防冲突(如 .pg-hero-…)\n\n## 标签闭合(必须)\n- 非自闭合标签必须成对闭合(<img> / <br> / <input> 等 void 元素除外)\n- 每次生成/修改后调 validate_code 自检(只校验结构合法性),报错用 vfs_edit 修正直到通过\n\n## 何时写代码组件\n- 组件库无对应类型(高度定制布局 / 一次性专题页 / 特殊视觉效果)→ 写完整 HTML 页面\n- 组件库已有(按钮 / 卡片 / 列表)→ 用现有组件配置,不重造\n\n## 安全底线(必须)\n- 禁 eval / new Function / Function 构造器\n- 禁访问 window 敏感属性(document.cookie / apiKey / token)\n\n## 可访问性 + 语义化\n- 语义化标签(button / nav / section);图片 alt;交互可键盘聚焦\n- 颜色对比达标;不只用颜色传达信息", Ua = {
3789
+ var Wa = "# HTML 完整页面生成规范\n\n## 代码资产模型(重要)\n- 代码正文是 data 的 code 字段(资产,随 data json 进服务端 DB);UI 绑 data.code 渲染\n- vfs 是编辑工作副本:框架自动 checkout(data.code→vfs)/ commit(vfs→data.code),你只改 vfs\n- __pgId 框架管(read 看不到、write 写不进),别碰\n\n## 两条工作路径\n- 修改已有组件:必经 vfs —— 按上下文「组件代码文件地图」(name → vfs 路径)定位文件,vfs_edit 增量改 → validate_code;勿直接 write data.code;文件未检出先 vfs_write 创建\n- 新建组件:write({patch:{op:'set',jsonPath:'components.N',value:{...}}}) —— value 按 schema 全字段写(必填字段如 type 不能漏;先 read 看现有组件结构照抄字段名),框架补 __pgId。固定流程 write → validate_code({jsonPath:'components.N.code'})(零重传 content)→ read 确认,**不手动 vfs_write 建副本**(框架下次委派自动 checkout)。code 字段直接写完整代码字符串,换行/引号照常写,无需手工 JSON 转义\n\n## 焦点精修(继承主 agent 焦点时)\n- 上下文提示「当前精修目标」(如 components.2(banner))→ 只改该焦点组件的代码文件;改其他组件会被 PATH_DENIED 硬拦\n- 聚焦模式不能新建组件(数据写被拦),要新建先反馈主 agent 取消焦点\n\n## 输出:完整、自包含、能独立成页的 HTML\n- 产物是**完整、自包含的 HTML 页面**(结构完整、标签闭合),能独立正确渲染。下游改造(抽 body / 包组件 / 片段化)由插件或 tool 做,不是你的事\n- **交互逻辑默认用 <script> 实现**(完整页面含 script 是常态);仅当用户明确要求「纯 CSS / 不要 script」时不写\n- **CSS 用 <style> 块、script 用 <script> 块集中放置**(如 <head> 内),不散落内联 —— 便于下游工具提取成独立 html/css/js\n- 可引入外部 JS / CSS(CDN 组件库、字体、外链样式)按需使用;class 统一加前缀防冲突(如 .pg-hero-…)\n\n## 标签闭合(必须)\n- 非自闭合标签必须成对闭合(<img> / <br> / <input> 等 void 元素除外)\n- 每次生成/修改后调 validate_code 自检(只校验结构合法性),报错用 vfs_edit 修正直到通过\n\n## 何时写代码组件\n- 组件库无对应类型(高度定制布局 / 一次性专题页 / 特殊视觉效果)→ 写完整 HTML 页面\n- 组件库已有(按钮 / 卡片 / 列表)→ 用现有组件配置,不重造\n\n## 安全底线(必须)\n- 禁 eval / new Function / Function 构造器\n- 禁访问 window 敏感属性(document.cookie / apiKey / token)\n\n## 可访问性 + 语义化\n- 语义化标签(button / nav / section);图片 alt;交互可键盘聚焦\n- 颜色对比达标;不只用颜色传达信息", Ga = {
3757
3790
  name: "html-fragment",
3758
3791
  description: "完整 HTML 页面生成规范:代码作为 data 资产 / vfs 工作副本 / 完整自包含可独立成页 / script+CSS 集中放置 / 可引外部 JS/CSS / validate_code 自检 / 安全底线 / 可访问性",
3759
- getContent: () => Ha
3792
+ getContent: () => Wa
3760
3793
  };
3761
- function Wa(e = {}) {
3794
+ function Ka(e = {}) {
3762
3795
  let t = e.vfsPrefix ?? "html/";
3763
3796
  return ({ state: e }) => {
3764
3797
  let n = e.files;
@@ -3775,7 +3808,7 @@ function Wa(e = {}) {
3775
3808
  } : { ok: !0 };
3776
3809
  };
3777
3810
  }
3778
- function Ga(e) {
3811
+ function qa(e) {
3779
3812
  let n, i, a = {
3780
3813
  name: "html-validate-tools",
3781
3814
  beforeAgent: (e) => {
@@ -3828,17 +3861,17 @@ function Ga(e) {
3828
3861
  i = e;
3829
3862
  }, a;
3830
3863
  }
3831
- var Ka = 2;
3832
- function qa(e = {}) {
3864
+ var Ja = 2;
3865
+ function Ya(e = {}) {
3833
3866
  let { writablePaths: t, codeVfsPrefix: n = "html/", id: r = "html", description: i, planning: a = !0, summarization: o = !0, maxToolRounds: s = 12, temperature: c = .4, skills: l, extraTools: u, formatCheck: d = !0, codeField: f = "code", orchestratorPrompt: p = !0, craftNotes: m = !0 } = e;
3834
3867
  if (t !== void 0 && !Array.isArray(t)) throw Error("[page-agent-sdk][createHtmlSubagent] writablePaths 须为字符串数组(代码组件 data 区,如 [\"components\"])/ 省略以从 schema 自动推断");
3835
3868
  let h = [];
3836
- a && h.push(la()), d && (h.push(Ga(n)), h.push(ua({ check: Wa({ vfsPrefix: n }) })));
3869
+ a && h.push(la()), d && (h.push(qa(n)), h.push(ua({ check: Ka({ vfsPrefix: n }) })));
3837
3870
  let g = u ?? [];
3838
3871
  return {
3839
3872
  id: r,
3840
3873
  description: i ?? "生成/修改纯代码组件(custom 代码)。代码作为 data 资产(code 字段进 DB),vfs 作工作副本;能规划(write_todos)+ 执行。需写代码组件或灵活定制时委派",
3841
- systemPrompt: Va(n),
3874
+ systemPrompt: Ua(n),
3842
3875
  writablePaths: t ?? [],
3843
3876
  allowedTools: [
3844
3877
  "vfs_write",
@@ -3849,9 +3882,9 @@ function qa(e = {}) {
3849
3882
  ],
3850
3883
  middleware: h.length ? h : void 0,
3851
3884
  summarization: o === !1 ? void 0 : o,
3852
- maxVerifyAttempts: d ? Ka : void 0,
3885
+ maxVerifyAttempts: d ? Ja : void 0,
3853
3886
  temperature: c,
3854
- skills: l ?? [Ua],
3887
+ skills: l ?? [Ga],
3855
3888
  maxToolRounds: s,
3856
3889
  tools: g.length ? g : void 0,
3857
3890
  _codeAsset: {
@@ -3860,17 +3893,17 @@ function qa(e = {}) {
3860
3893
  ext: "html",
3861
3894
  codeField: f,
3862
3895
  craftNotes: m,
3863
- ...p ? { orchestratorPrompt: Ya(r) } : {}
3896
+ ...p ? { orchestratorPrompt: Za(r) } : {}
3864
3897
  }
3865
3898
  };
3866
3899
  }
3867
3900
  //#endregion
3868
3901
  //#region src/core/presets.ts
3869
- var Ja = {
3902
+ var Xa = {
3870
3903
  pageBuilder: {
3871
3904
  systemPrompt: "你是页面构建助手。按用户意图读写主数据(经 data 声明 + schema 校验),改完页面实时更新。",
3872
3905
  get subagents() {
3873
- return [qa()];
3906
+ return [Ya()];
3874
3907
  }
3875
3908
  },
3876
3909
  researcher: {
@@ -3886,7 +3919,7 @@ var Ja = {
3886
3919
  subagent: !1
3887
3920
  } }
3888
3921
  };
3889
- function Ya(e) {
3922
+ function Za(e) {
3890
3923
  let t = `use_${e}`;
3891
3924
  return [
3892
3925
  "【产物形态】每个组件是完整、自包含的 HTML 页面(含 style/script,可独立成页);你只负责委派和收尾,不关心宿主如何渲染(v-html / iframe / SFC 是集成方的事)。",
@@ -3897,16 +3930,17 @@ function Ya(e) {
3897
3930
  "【预算将尽暂停】组件很多、接近工具轮次上限不要硬扛:完成手头这个后报告「已生成 K/N,还剩 M 个」,等用户确认后从 todos 剩余项继续(勿重复已完成)。"
3898
3931
  ].join("\n");
3899
3932
  }
3900
- var Xa = {
3933
+ var Qa = {
3901
3934
  reliableWriteRules: [
3902
3935
  "【可靠写入规则】",
3903
3936
  "1. 改任何字段前,先用 read({ jsonPath }) 读其当前真实值,基于真实值改,不要凭记忆;",
3904
3937
  "2. 若不确定可操作哪些字段,先 read() 不传 jsonPath 查看主数据说明 + schema 声明字段(集成方可经 sdk.setData 运行时替换 schema,以工具返回为准,勿凭旧记忆);",
3905
3938
  "3. 不确定某字段结构时,read({ jsonPath }) 返回含格式说明,字段以返回为准;",
3906
3939
  "4. 写入若被 schema 校验拒绝(返回结构化错误含字段名与期望类型),按错误修正后重试,不要放弃;",
3907
- "5. 优先用 write 的 patch 增量改(只发改动,如 write({ value, patch:{ op, jsonPath } })),避免整体重传大 JSON 被截断。"
3940
+ "5. 优先用 write 的 patch 增量改(只发改动,如 write({ value, patch:{ op, jsonPath } })),避免整体重传大 JSON 被截断;",
3941
+ "6. 写入若触发乐观锁冲突(返回 VERSION_CONFLICT 或工具挂起等用户决定):等工具返回结果后按其指示继续(保留外部值 → 重新 read 再改;已覆盖/已回退 → 基于结果重写),不要放弃任务。"
3908
3942
  ].join("\n"),
3909
- htmlPageOrchestrator: Ya("html"),
3943
+ htmlPageOrchestrator: Za("html"),
3910
3944
  htmlPageProposeFirst: ["【新建/创意类请求】先用简短文字给出 2~3 套方案(每套一两句风格/配色/结构要点),询问用户选哪套;选定前不要委派生成代码、不要写 components。", "【方案切换】已生成某套方案后改选另一套:不重新罗列,直接依据之前描述委派 use_html 重新生成并覆盖相应组件。"].join("\n"),
3911
3945
  htmlDirectWriteFallback: [
3912
3946
  "【纯代码组件 · 你直接写】当前未配备 html 子 agent,纯代码组件的 code 字段由你直接 write(普通字段,经 schema 校验 + 乐观锁 + 快照栈,与改其他字段无异;无 vfs 工作副本 / 无格式校验门禁)。",
@@ -3914,24 +3948,24 @@ var Xa = {
3914
3948
  "【修改而非重写】改已有 code:先 read({jsonPath}) 取当前 code → 基于当前值增量改(只动要改的部分,如换配色/文案/某段结构),不要整体重写整个 code(易丢已有内容、token 浪费)。",
3915
3949
  "【质量自检】无格式校验门禁,写完自查标签闭合 / 结构完整;code 进 data 由集成方渲染层(v-html/iframe)呈现。如需代码资产机制(vfs 工作副本 + 格式校验 + 增量 commit),注册 createHtmlSubagent。"
3916
3950
  ].join("\n")
3917
- }, Za = 15, Qa = 4e3, $a = /* @__PURE__ */ new WeakMap();
3918
- function eo(e, t) {
3951
+ }, $a = 15, eo = 4e3, to = /* @__PURE__ */ new WeakMap();
3952
+ function no(e, t) {
3919
3953
  if (!e) return "";
3920
3954
  let n = t ? `${t.maxKeys ?? ""}|${t.maxChars ?? ""}` : "";
3921
3955
  if (typeof e == "object") {
3922
- let t = $a.get(e);
3956
+ let t = to.get(e);
3923
3957
  if (t && t.optsKey === n) return t.hint;
3924
3958
  }
3925
- let r = to(e, t);
3926
- return typeof e == "object" && $a.set(e, {
3959
+ let r = ro(e, t);
3960
+ return typeof e == "object" && to.set(e, {
3927
3961
  optsKey: n,
3928
3962
  hint: r
3929
3963
  }), r;
3930
3964
  }
3931
- function to(e, t) {
3965
+ function ro(e, t) {
3932
3966
  let n = na(e);
3933
3967
  if (n) {
3934
- let r = t?.maxKeys ?? Za, i = t?.maxChars ?? Qa;
3968
+ let r = t?.maxKeys ?? $a, i = t?.maxChars ?? eo;
3935
3969
  if (n.split("\n").filter((e) => e.trim().startsWith("- ")).length > r || n.length > i) {
3936
3970
  let t = aa(e);
3937
3971
  if (t) return "## 可操作数据(顶层概览;深层约束查 schema_data)\n" + t + "\n提示:改某组件深层字段前,先 schema_data({jsonPath}) 查完整约束(advanced);或 read 子路径见实际值。";
@@ -3942,15 +3976,15 @@ function to(e, t) {
3942
3976
  }
3943
3977
  //#endregion
3944
3978
  //#region src/core/harness/mission.ts
3945
- var no = /(?:改|加|删|生成|查询|分析|创建|修改|配置|实现|检查|对比|整理|转换|设计|搭建|编排|布局|调整|更新)/;
3946
- function ro(e) {
3947
- return !e || e.trim().length < 8 || /^(你好|hi|hello|ok|好的|继续|嗯|谢谢|hey|哈喽|收到|明白)/i.test(e.trim()) || e.length > 2e3 ? !1 : no.test(e);
3979
+ var io = /(?:改|加|删|生成|查询|分析|创建|修改|配置|实现|检查|对比|整理|转换|设计|搭建|编排|布局|调整|更新)/;
3980
+ function ao(e) {
3981
+ return !e || e.trim().length < 8 || /^(你好|hi|hello|ok|好的|继续|嗯|谢谢|hey|哈喽|收到|明白)/i.test(e.trim()) || e.length > 2e3 ? !1 : io.test(e);
3948
3982
  }
3949
- function io(e) {
3983
+ function oo(e) {
3950
3984
  for (let t = 0; t < e.length; t++) {
3951
3985
  if (e[t].role !== "user") continue;
3952
3986
  let n = e[t].content;
3953
- if (ro(n)) return {
3987
+ if (ao(n)) return {
3954
3988
  goal: n.length > 200 ? n.slice(0, 200) + "…" : n,
3955
3989
  sourceMessageIdx: t,
3956
3990
  capturedAt: Date.now(),
@@ -3958,11 +3992,11 @@ function io(e) {
3958
3992
  };
3959
3993
  }
3960
3994
  }
3961
- function ao() {
3995
+ function so() {
3962
3996
  let e, t = !1;
3963
3997
  return {
3964
3998
  name: "mission",
3965
- beforeAgent: (n) => (!e && !t && (e = io(n.messages)), e ? { mission: e } : {}),
3999
+ beforeAgent: (n) => (!e && !t && (e = oo(n.messages)), e ? { mission: e } : {}),
3966
4000
  augmentPrompt: () => {
3967
4001
  if (!e) return;
3968
4002
  let t = ["## 当前主线目标", e.goal];
@@ -3989,22 +4023,22 @@ function ao() {
3989
4023
  }
3990
4024
  //#endregion
3991
4025
  //#region src/core/harness/focus.ts
3992
- var oo = /* @__PURE__ */ new Set([
4026
+ var co = /* @__PURE__ */ new Set([
3993
4027
  "set_data",
3994
4028
  "edit_data",
3995
4029
  "delete_data",
3996
4030
  "write",
3997
4031
  "draft_commit"
3998
4032
  ]);
3999
- function so(e) {
4033
+ function lo(e) {
4000
4034
  let t = e ?? {}, n = /* @__PURE__ */ new Set();
4001
4035
  if (typeof t.jsonPath == "string" && t.jsonPath && n.add(t.jsonPath), typeof t.path == "string" && t.path && n.add(t.path), t.patch && typeof t.patch.jsonPath == "string" && t.patch.jsonPath && n.add(t.patch.jsonPath), Array.isArray(t.patches)) for (let e of t.patches) e && typeof e.jsonPath == "string" && e.jsonPath && n.add(e.jsonPath);
4002
4036
  return [...n];
4003
4037
  }
4004
- function co(e, t) {
4038
+ function uo(e, t) {
4005
4039
  return e === t || e.startsWith(t + ".");
4006
4040
  }
4007
- function lo(e, t) {
4041
+ function fo(e, t) {
4008
4042
  if (!t || typeof t != "object") return !1;
4009
4043
  let n = e.lastIndexOf(".");
4010
4044
  if (n < 0) return !1;
@@ -4013,7 +4047,7 @@ function lo(e, t) {
4013
4047
  let a = Z(t, r);
4014
4048
  return Array.isArray(a) && Number(i) >= a.length;
4015
4049
  }
4016
- function uo(e) {
4050
+ function po(e) {
4017
4051
  let t = e.initialFocuses ? [...e.initialFocuses] : [], n = () => e.onChange?.([...t]);
4018
4052
  return {
4019
4053
  name: "focus",
@@ -4031,7 +4065,7 @@ function uo(e) {
4031
4065
  if (r) {
4032
4066
  let e = t.map((e) => {
4033
4067
  let t = Bi(r, e.path);
4034
- return t ? eo(t) : null;
4068
+ return t ? no(t) : null;
4035
4069
  }).filter((e) => !!e);
4036
4070
  e.length && n.push("", "## 焦点子树结构(仅此范围可操作)", ...e);
4037
4071
  }
@@ -4045,15 +4079,15 @@ function uo(e) {
4045
4079
  });
4046
4080
  if (n.name === "eval_script") {
4047
4081
  if (n.args?.mode !== "transform") return r(n);
4048
- let i = so(n.args);
4082
+ let i = lo(n.args);
4049
4083
  if (!i.length) return a("(整体数据)");
4050
- for (let n of i) if (!t.some((e) => co(n, e.path)) && !lo(n, e.getBind?.())) return a(n);
4084
+ for (let n of i) if (!t.some((e) => uo(n, e.path)) && !fo(n, e.getBind?.())) return a(n);
4051
4085
  return r(n);
4052
4086
  }
4053
- if (oo.has(n.name)) {
4054
- let r = so(n.args);
4087
+ if (co.has(n.name)) {
4088
+ let r = lo(n.args);
4055
4089
  if (!r.length) return a("(整体数据)");
4056
- for (let n of r) if (!t.some((e) => co(n, e.path)) && !lo(n, e.getBind?.())) return a(n);
4090
+ for (let n of r) if (!t.some((e) => uo(n, e.path)) && !fo(n, e.getBind?.())) return a(n);
4057
4091
  }
4058
4092
  }
4059
4093
  return r(n);
@@ -4080,12 +4114,12 @@ function uo(e) {
4080
4114
  }
4081
4115
  //#endregion
4082
4116
  //#region src/core/harness/workingMemory.ts
4083
- var fo = 10, po = /* @__PURE__ */ new Set([
4117
+ var mo = 10, ho = /* @__PURE__ */ new Set([
4084
4118
  "read",
4085
4119
  "query_data",
4086
4120
  "search_data"
4087
4121
  ]);
4088
- function mo() {
4122
+ function go() {
4089
4123
  let e = [], t = {}, n = () => e.length === 0 && Object.keys(t).length === 0, r = () => ({
4090
4124
  locatedPaths: [...e],
4091
4125
  lastHashes: { ...t }
@@ -4093,13 +4127,13 @@ function mo() {
4093
4127
  function i(t) {
4094
4128
  if (!t) return;
4095
4129
  let n = e.indexOf(t);
4096
- for (n >= 0 && e.splice(n, 1), e.unshift(t); e.length > fo;) e.pop();
4130
+ for (n >= 0 && e.splice(n, 1), e.unshift(t); e.length > mo;) e.pop();
4097
4131
  }
4098
4132
  function a(e, n) {
4099
4133
  if (t[e] === n) return;
4100
4134
  delete t[e], t[e] = n;
4101
4135
  let r = Object.keys(t);
4102
- for (; r.length > fo;) {
4136
+ for (; r.length > mo;) {
4103
4137
  let e = r.shift();
4104
4138
  delete t[e];
4105
4139
  }
@@ -4110,7 +4144,7 @@ function mo() {
4110
4144
  beforeModel: () => n() ? void 0 : { workingMemory: r() },
4111
4145
  wrapToolCall: async (e, t) => {
4112
4146
  let n = await t(e);
4113
- if (n.status === "done" && po.has(e.name)) {
4147
+ if (n.status === "done" && ho.has(e.name)) {
4114
4148
  let t = typeof n.content == "string" ? n.content : "";
4115
4149
  if (e.name === "read") {
4116
4150
  let n = e.args?.jsonPath || "(root)";
@@ -4138,7 +4172,7 @@ function mo() {
4138
4172
  for (let e of Object.keys(t)) delete t[e];
4139
4173
  },
4140
4174
  restore: (n) => {
4141
- e.length = 0, Array.isArray(n?.locatedPaths) && e.push(...n.locatedPaths.slice(0, fo));
4175
+ e.length = 0, Array.isArray(n?.locatedPaths) && e.push(...n.locatedPaths.slice(0, mo));
4142
4176
  for (let e of Object.keys(t)) delete t[e];
4143
4177
  n?.lastHashes && typeof n.lastHashes == "object" && Object.assign(t, n.lastHashes);
4144
4178
  }
@@ -4146,7 +4180,7 @@ function mo() {
4146
4180
  }
4147
4181
  //#endregion
4148
4182
  //#region src/core/tools/sandbox.ts
4149
- function ho(e) {
4183
+ function _o(e) {
4150
4184
  let t = (t, n) => {
4151
4185
  try {
4152
4186
  Object.defineProperty(e, t, {
@@ -4174,7 +4208,7 @@ function ho(e) {
4174
4208
  });
4175
4209
  } catch {}
4176
4210
  }
4177
- var go = `(${ho.toString()})(self);`, _o = [
4211
+ var vo = `(${_o.toString()})(self);`, yo = [
4178
4212
  {
4179
4213
  re: /\bimport\s*\(/,
4180
4214
  msg: "动态 import() 拉外网模块"
@@ -4200,9 +4234,9 @@ var go = `(${ho.toString()})(self);`, _o = [
4200
4234
  msg: "require() 拉模块"
4201
4235
  }
4202
4236
  ];
4203
- function vo(e, t = 3e3) {
4237
+ function bo(e, t = 3e3) {
4204
4238
  return async (n) => {
4205
- for (let { re: t, msg: n } of _o) if (t.test(e)) return {
4239
+ for (let { re: t, msg: n } of yo) if (t.test(e)) return {
4206
4240
  ok: !1,
4207
4241
  error: `沙箱拒绝执行:脚本含禁用模式(${n})`,
4208
4242
  elapsedMs: 0
@@ -4219,7 +4253,7 @@ function vo(e, t = 3e3) {
4219
4253
  elapsedMs: Date.now() - i
4220
4254
  });
4221
4255
  }
4222
- }, s = go + "\nself.onmessage = async (e) => {\n try {\n const fn = new Function(\"data\", e.data.script);\n try { self.eval = undefined; self.Function = undefined; } catch {}\n let result = fn(e.data.data);\n if (result && typeof result.then === \"function\") result = await result;\n self.postMessage({ ok: true, result });\n } catch (err) {\n self.postMessage({ ok: false, error: String((err && err.message) || err) });\n }\n};", c = "", l;
4256
+ }, s = vo + "\nself.onmessage = async (e) => {\n try {\n const fn = new Function(\"data\", e.data.script);\n try { self.eval = undefined; self.Function = undefined; } catch {}\n let result = fn(e.data.data);\n if (result && typeof result.then === \"function\") result = await result;\n self.postMessage({ ok: true, result });\n } catch (err) {\n self.postMessage({ ok: false, error: String((err && err.message) || err) });\n }\n};", c = "", l;
4223
4257
  try {
4224
4258
  let e = new Blob([s], { type: "application/javascript" });
4225
4259
  c = URL.createObjectURL(e), l = new Worker(c);
@@ -4255,7 +4289,7 @@ function vo(e, t = 3e3) {
4255
4289
  }
4256
4290
  //#endregion
4257
4291
  //#region src/core/tools/hostScript.ts
4258
- async function yo(e, t = 3e3) {
4292
+ async function xo(e, t = 3e3) {
4259
4293
  let n = Date.now(), r;
4260
4294
  try {
4261
4295
  let i = Object.getPrototypeOf(async function() {}).constructor, a = new i(e), o = Promise.resolve(a());
@@ -4278,28 +4312,28 @@ async function yo(e, t = 3e3) {
4278
4312
  }
4279
4313
  //#endregion
4280
4314
  //#region src/core/harness/skills.ts
4281
- function bo(e) {
4315
+ function So(e) {
4282
4316
  return e;
4283
4317
  }
4284
- var xo = /^https?:\/\//i;
4285
- function So(e) {
4286
- return xo.test(e) || e.startsWith("//") ? "http" : "vfs";
4318
+ var Co = /^https?:\/\//i;
4319
+ function wo(e) {
4320
+ return Co.test(e) || e.startsWith("//") ? "http" : "vfs";
4287
4321
  }
4288
- function Co(e) {
4322
+ function To(e) {
4289
4323
  return e.replace(/^vfs:\/\//, "").replace(/^\/+/, "").replace(/\/+/g, "/");
4290
4324
  }
4291
- var wo = 3e4;
4292
- async function To(e) {
4293
- let t = new AbortController(), n = setTimeout(() => t.abort(), wo);
4325
+ var Eo = 3e4;
4326
+ async function Do(e) {
4327
+ let t = new AbortController(), n = setTimeout(() => t.abort(), Eo);
4294
4328
  try {
4295
4329
  return await fetch(e, { signal: t.signal });
4296
4330
  } finally {
4297
4331
  clearTimeout(n);
4298
4332
  }
4299
4333
  }
4300
- async function Eo(e, t) {
4301
- if (So(e) === "http") try {
4302
- let t = await To(e);
4334
+ async function Oo(e, t) {
4335
+ if (wo(e) === "http") try {
4336
+ let t = await Do(e);
4303
4337
  return t.ok ? {
4304
4338
  ok: !0,
4305
4339
  content: await t.text()
@@ -4310,7 +4344,7 @@ async function Eo(e, t) {
4310
4344
  } catch (t) {
4311
4345
  if (t?.name === "AbortError") return {
4312
4346
  ok: !1,
4313
- error: `读取超时(${wo / 1e3}s):${e}`
4347
+ error: `读取超时(${Eo / 1e3}s):${e}`
4314
4348
  };
4315
4349
  let n = t?.message || String(t);
4316
4350
  return /Failed to fetch|NetworkError|CORS|blocked/i.test(n) ? {
@@ -4325,7 +4359,7 @@ async function Eo(e, t) {
4325
4359
  ok: !1,
4326
4360
  error: `skill 文档 ${e} 是 vfs 路径,但 vfs 未启用`
4327
4361
  };
4328
- let n = t(Co(e));
4362
+ let n = t(To(e));
4329
4363
  return n == null ? {
4330
4364
  ok: !1,
4331
4365
  error: `未找到 vfs 文档 ${e}(可用 vfs_ls 查看)`
@@ -4334,14 +4368,14 @@ async function Eo(e, t) {
4334
4368
  content: n
4335
4369
  };
4336
4370
  }
4337
- function Do(e) {
4371
+ function ko(e) {
4338
4372
  if (e.length) return [
4339
4373
  "## 可用 Skills(渐进式披露)",
4340
4374
  e.map((e) => `- ${e.name}: ${e.description}`).join("\n"),
4341
4375
  "当某 skill 适用时,先调用 load_skill(name) 加载其完整指令,再按指令执行。不要凭记忆猜测 skill 内容。"
4342
4376
  ].join("\n");
4343
4377
  }
4344
- function Oo(e) {
4378
+ function Ao(e) {
4345
4379
  if (typeof e == "string") return e;
4346
4380
  if (e == null) return "";
4347
4381
  try {
@@ -4350,15 +4384,15 @@ function Oo(e) {
4350
4384
  return String(e);
4351
4385
  }
4352
4386
  }
4353
- async function ko(e) {
4387
+ async function jo(e) {
4354
4388
  try {
4355
- let t = await To(e);
4389
+ let t = await Do(e);
4356
4390
  return t.ok ? await t.text() : null;
4357
4391
  } catch {
4358
4392
  return null;
4359
4393
  }
4360
4394
  }
4361
- async function Ao(e, t) {
4395
+ async function Mo(e, t) {
4362
4396
  let n = e.context ?? "sandbox", r = !!e.code, i = !!e.url;
4363
4397
  if (!r && !i) return {
4364
4398
  ok: !1,
@@ -4377,10 +4411,10 @@ async function Ao(e, t) {
4377
4411
  ok: !1,
4378
4412
  error: "skill 含宿主权限脚本(context:\"host\"),需 capabilities.skillHostScript:true 开启"
4379
4413
  };
4380
- let n = await yo(e.code);
4414
+ let n = await xo(e.code);
4381
4415
  return n.ok ? {
4382
4416
  ok: !0,
4383
- text: Oo(n.result)
4417
+ text: Ao(n.result)
4384
4418
  } : {
4385
4419
  ok: !1,
4386
4420
  error: n.error || "宿主脚本执行失败"
@@ -4388,31 +4422,31 @@ async function Ao(e, t) {
4388
4422
  }
4389
4423
  let a;
4390
4424
  if (i) {
4391
- let t = await ko(e.url);
4425
+ let t = await jo(e.url);
4392
4426
  if (t == null) return {
4393
4427
  ok: !1,
4394
4428
  error: `远程脚本拉取失败(${e.url};CORS/网络错误)`
4395
4429
  };
4396
4430
  a = t;
4397
4431
  } else a = e.code;
4398
- let o = await vo(a)(void 0);
4432
+ let o = await bo(a)(void 0);
4399
4433
  return o.ok ? {
4400
4434
  ok: !0,
4401
- text: Oo(o.result)
4435
+ text: Ao(o.result)
4402
4436
  } : {
4403
4437
  ok: !1,
4404
4438
  error: o.error || "沙箱脚本执行失败"
4405
4439
  };
4406
4440
  }
4407
- async function jo(e, t) {
4441
+ async function No(e, t) {
4408
4442
  let n = null;
4409
4443
  if (e.doc) {
4410
- let r = await Eo(e.doc, t?.readVfs);
4444
+ let r = await Oo(e.doc, t?.readVfs);
4411
4445
  r.ok && (n = r.content);
4412
4446
  } else e.getContent && (n = await e.getContent());
4413
4447
  let r = n ?? "", i = !0;
4414
4448
  if (e.exec) {
4415
- let n = await Ao(e.exec, t?.hostScriptEnabled);
4449
+ let n = await Mo(e.exec, t?.hostScriptEnabled);
4416
4450
  n.ok && n.text ? r = e.exec.inject === "prepend" ? n.text + "\n\n" + r : (r ? r + "\n\n" : "") + n.text : (n.ok || (r = (r ? r + "\n\n" : "") + `(skill 脚本执行失败:${n.error})`), i = !1);
4417
4451
  }
4418
4452
  return {
@@ -4420,7 +4454,7 @@ async function jo(e, t) {
4420
4454
  cacheable: i
4421
4455
  };
4422
4456
  }
4423
- async function Mo(e) {
4457
+ async function Po(e) {
4424
4458
  if (!e.tools?.length) return [];
4425
4459
  let t = [];
4426
4460
  for (let n of e.tools) try {
@@ -4431,7 +4465,7 @@ async function Mo(e) {
4431
4465
  }
4432
4466
  return t;
4433
4467
  }
4434
- function No(e, n) {
4468
+ function Fo(e, n) {
4435
4469
  let i = [...e], a = new Map(i.map((e) => [e.name, e])), o = /* @__PURE__ */ new Set(), s = /* @__PURE__ */ new Map(), c = {
4436
4470
  set(e) {
4437
4471
  i = [...e], a = new Map(i.map((e) => [e.name, e])), s.clear(), o.clear();
@@ -4447,7 +4481,7 @@ function No(e, n) {
4447
4481
  if (!t) return null;
4448
4482
  let r = s.get(e);
4449
4483
  if (r != null) return r;
4450
- let i = await jo(t, n);
4484
+ let i = await No(t, n);
4451
4485
  return r = i.content, i.cacheable && s.set(e, r), r;
4452
4486
  }
4453
4487
  }, l = {
@@ -4458,12 +4492,12 @@ function No(e, n) {
4458
4492
  if (o.has(e)) return `skill "${e}" 已在本轮加载,无需重复。`;
4459
4493
  let r = s.get(e);
4460
4494
  if (r == null) {
4461
- let i = await jo(t, n);
4495
+ let i = await No(t, n);
4462
4496
  if (r = i.content, !r) return `skill "${e}" 未配置内容(doc / getContent / exec 任选其一)。`;
4463
4497
  i.cacheable && s.set(e, r);
4464
4498
  }
4465
4499
  if (o.add(e), t.tools?.length && n?.onToolsReady && a.get(e) === t) try {
4466
- let e = await Mo(t);
4500
+ let e = await Po(t);
4467
4501
  e.length && n.onToolsReady(t.name, e);
4468
4502
  } catch (t) {
4469
4503
  console.warn(`skill "${e}" 工具加载失败:`, t);
@@ -4481,7 +4515,7 @@ function No(e, n) {
4481
4515
  })),
4482
4516
  skillsLoaded: []
4483
4517
  }),
4484
- augmentPrompt: () => Do(i),
4518
+ augmentPrompt: () => ko(i),
4485
4519
  afterModel: () => ({ skillsLoaded: [...o] })
4486
4520
  };
4487
4521
  return Object.defineProperty(l, "controller", {
@@ -4493,7 +4527,7 @@ function No(e, n) {
4493
4527
  }
4494
4528
  //#endregion
4495
4529
  //#region src/core/harness/memory.ts
4496
- function Po(e = "") {
4530
+ function Io(e = "") {
4497
4531
  let t = e, n = typeof e == "string" ? e : void 0;
4498
4532
  async function r() {
4499
4533
  if (typeof t == "string") return n = t, t;
@@ -4517,7 +4551,7 @@ function Po(e = "") {
4517
4551
  }
4518
4552
  //#endregion
4519
4553
  //#region src/core/harness/permissions.ts
4520
- var Fo = /* @__PURE__ */ new Set([
4554
+ var Lo = /* @__PURE__ */ new Set([
4521
4555
  "set_data",
4522
4556
  "edit_data",
4523
4557
  "delete_data",
@@ -4526,7 +4560,7 @@ var Fo = /* @__PURE__ */ new Set([
4526
4560
  "vfs_edit",
4527
4561
  "draft_commit",
4528
4562
  "eval_script"
4529
- ]), Io = /* @__PURE__ */ new Set([
4563
+ ]), Ro = /* @__PURE__ */ new Set([
4530
4564
  "get_data",
4531
4565
  "describe_data",
4532
4566
  "read",
@@ -4537,7 +4571,7 @@ var Fo = /* @__PURE__ */ new Set([
4537
4571
  "vfs_glob",
4538
4572
  "vfs_grep"
4539
4573
  ]);
4540
- function Lo(e) {
4574
+ function zo(e) {
4541
4575
  let t = "";
4542
4576
  for (let n = 0; n < e.length; n++) {
4543
4577
  let r = e[n];
@@ -4545,24 +4579,24 @@ function Lo(e) {
4545
4579
  }
4546
4580
  return RegExp("^" + t + "$");
4547
4581
  }
4548
- function Ro(e, t, n) {
4549
- for (let r of e) if (r.operations.includes(t) && r.scopes.some((e) => Lo(e).test(n))) return r.mode;
4582
+ function Bo(e, t, n) {
4583
+ for (let r of e) if (r.operations.includes(t) && r.scopes.some((e) => zo(e).test(n))) return r.mode;
4550
4584
  return "allow";
4551
4585
  }
4552
- function zo(e) {
4586
+ function Vo(e) {
4553
4587
  let t = e ?? {}, n = /* @__PURE__ */ new Set();
4554
4588
  if (typeof t.jsonPath == "string" && t.jsonPath && n.add(t.jsonPath), typeof t.path == "string" && t.path && n.add(t.path), t.patch && typeof t.patch.jsonPath == "string" && t.patch.jsonPath && n.add(t.patch.jsonPath), Array.isArray(t.patches)) for (let e of t.patches) e && typeof e.jsonPath == "string" && e.jsonPath && n.add(e.jsonPath);
4555
4589
  return [...n];
4556
4590
  }
4557
- function Bo(e) {
4591
+ function Ho(e) {
4558
4592
  return {
4559
4593
  name: "permissions",
4560
4594
  wrapToolCall: async (t, n) => {
4561
- let r = Fo.has(t.name) ? "write" : Io.has(t.name) ? "read" : null;
4595
+ let r = Lo.has(t.name) ? "write" : Ro.has(t.name) ? "read" : null;
4562
4596
  t.name === "eval_script" && t.args?.mode !== "transform" && (r = null);
4563
- let i = zo(t.args);
4597
+ let i = Vo(t.args);
4564
4598
  if (r === "write" && !i.length && (i = [""]), r && i.length) {
4565
- for (let t of i) if (Ro(e, r, t) === "deny") return {
4599
+ for (let t of i) if (Bo(e, r, t) === "deny") return {
4566
4600
  content: `权限拒绝:${r} 操作 "${t}" 被 permissions 规则禁止。`,
4567
4601
  status: "error"
4568
4602
  };
@@ -4573,7 +4607,7 @@ function Bo(e) {
4573
4607
  }
4574
4608
  //#endregion
4575
4609
  //#region src/core/harness/approval.ts
4576
- function Vo(e = {}) {
4610
+ function Uo(e = {}) {
4577
4611
  let t = (t, n) => e.confirm ? !!e.confirm(t, n) : e.tools === void 0 || e.tools.includes(t);
4578
4612
  return {
4579
4613
  name: "approval",
@@ -4610,15 +4644,15 @@ function Vo(e = {}) {
4610
4644
  }
4611
4645
  //#endregion
4612
4646
  //#region src/core/harness/humanConfirm.ts
4613
- var Ho = "request_human_confirmation", Uo = t.object({
4647
+ var Wo = "request_human_confirmation", Go = t.object({
4614
4648
  question: t.string().describe("要征询用户的问题/方案描述。清晰具体:说明当前情况、为什么需要确认、确认什么。"),
4615
4649
  options: t.array(t.string()).optional().describe("可选方案列表(2-4 个)。用户从中选一个。不传则用户只回答允许/拒绝。"),
4616
4650
  recommendation: t.string().optional().describe("你推荐的方案(优先在 options 中选一个)及推荐理由,帮用户快速决策。"),
4617
4651
  context: t.string().optional().describe("补充上下文:已做了什么、约束、影响范围等,帮用户判断。")
4618
4652
  });
4619
- function Wo() {
4653
+ function Ko() {
4620
4654
  return r(async () => "人工确认中间件未装载,无法征询用户。请直接向用户说明情况并等待回复。", {
4621
- name: Ho,
4655
+ name: Wo,
4622
4656
  description: [
4623
4657
  "当遇到以下情况时,主动调用本工具征询用户确认后再继续(不要默默猜测后直接执行高风险动作):",
4624
4658
  "1) 不确定用户意图、需求有歧义;",
@@ -4628,10 +4662,10 @@ function Wo() {
4628
4662
  "入参:question=问题/方案描述;options=可选方案列表(多方案时给);recommendation=你推荐的方案及理由。",
4629
4663
  "用户选择后,据其回答继续;若用户拒绝,停止当前操作并询问如何调整。"
4630
4664
  ].join(""),
4631
- schema: Uo
4665
+ schema: Go
4632
4666
  });
4633
4667
  }
4634
- function Go() {
4668
+ function qo() {
4635
4669
  return {
4636
4670
  name: "humanConfirm",
4637
4671
  wrapToolCall: async (e, t) => e.name === "request_human_confirmation" ? new Promise((t) => {
@@ -4663,14 +4697,14 @@ function Go() {
4663
4697
  }
4664
4698
  //#endregion
4665
4699
  //#region src/core/harness/checkpoint.ts
4666
- function Ko(e) {
4700
+ function Jo(e) {
4667
4701
  if (typeof e != "object" || !e) return e;
4668
4702
  if (typeof structuredClone == "function") try {
4669
4703
  return structuredClone(e);
4670
4704
  } catch {}
4671
4705
  return JSON.parse(JSON.stringify(e));
4672
4706
  }
4673
- function qo(e, t) {
4707
+ function Yo(e, t) {
4674
4708
  let n = t.split("."), r = e;
4675
4709
  for (let e of n) {
4676
4710
  if (r == null) return;
@@ -4678,12 +4712,12 @@ function qo(e, t) {
4678
4712
  }
4679
4713
  return r;
4680
4714
  }
4681
- function Jo(e, t, n) {
4715
+ function Xo(e, t, n) {
4682
4716
  let r = t.split("."), i = e;
4683
4717
  for (let e = 0; e < r.length - 1; e++) i[r[e]] ?? (i[r[e]] = {}), i = i[r[e]];
4684
4718
  i[r[r.length - 1]] = n;
4685
4719
  }
4686
- function Yo(e, t) {
4720
+ function Zo(e, t) {
4687
4721
  if (Array.isArray(e)) {
4688
4722
  e.length = 0, Array.isArray(t) && e.push(...t);
4689
4723
  return;
@@ -4692,11 +4726,11 @@ function Yo(e, t) {
4692
4726
  for (let t of Object.keys(e)) t in n || delete e[t];
4693
4727
  for (let t of Object.keys(n)) e[t] = n[t];
4694
4728
  }
4695
- function Xo(e, t) {
4696
- let n = qo(window, e);
4697
- typeof n == "object" && n ? Yo(n, t) : Jo(window, e, t);
4729
+ function Qo(e, t) {
4730
+ let n = Yo(window, e);
4731
+ typeof n == "object" && n ? Zo(n, t) : Xo(window, e, t);
4698
4732
  }
4699
- function Zo(e) {
4733
+ function $o(e) {
4700
4734
  let t = e.slice();
4701
4735
  for (; t.length;) {
4702
4736
  let e = t[t.length - 1];
@@ -4705,22 +4739,22 @@ function Zo(e) {
4705
4739
  }
4706
4740
  return t;
4707
4741
  }
4708
- function Qo(e) {
4742
+ function es(e) {
4709
4743
  let t = [], n = e.maxCheckpoints ?? 5, r = 1, i, a;
4710
4744
  return {
4711
4745
  save(o) {
4712
- let s = Zo(e.messages), c = {};
4713
- if (e.getData) ((e.consumeDataDirty?.() ?? !0) || a === void 0) && (a = Ko(e.getData())), c[""] = a;
4714
- else for (let t of e.slotPaths ?? []) c[t] = Ko(qo(window, t));
4715
- ((e.vfsStore.consumeDirty?.() ?? !0) || i === void 0) && (i = Ko(e.vfsStore.files));
4746
+ let s = $o(e.messages), c = {};
4747
+ if (e.getData) ((e.consumeDataDirty?.() ?? !0) || a === void 0) && (a = Jo(e.getData())), c[""] = a;
4748
+ else for (let t of e.slotPaths ?? []) c[t] = Jo(Yo(window, t));
4749
+ ((e.vfsStore.consumeDirty?.() ?? !0) || i === void 0) && (i = Jo(e.vfsStore.files));
4716
4750
  let l = {
4717
4751
  id: r++,
4718
4752
  label: o,
4719
4753
  timestamp: Date.now(),
4720
- messages: Ko(s),
4754
+ messages: Jo(s),
4721
4755
  windowVals: c,
4722
4756
  vfs: i,
4723
- todos: Ko(e.getTodos()),
4757
+ todos: Jo(e.getTodos()),
4724
4758
  messageCount: s.length
4725
4759
  };
4726
4760
  for (t.push(l); t.length > n;) t.shift();
@@ -4740,19 +4774,19 @@ function Qo(e) {
4740
4774
  restore(n) {
4741
4775
  let r = n == null ? t[t.length - 1] : t.find((e) => e.id === n);
4742
4776
  if (!r) return !1;
4743
- if (e.messages.splice(0, e.messages.length, ...Ko(r.messages)), e.getData) {
4777
+ if (e.messages.splice(0, e.messages.length, ...Jo(r.messages)), e.getData) {
4744
4778
  let t = r.windowVals[""];
4745
4779
  if (t !== void 0) {
4746
4780
  let n = e.getData();
4747
- typeof n == "object" && n && Yo(n, Ko(t));
4781
+ typeof n == "object" && n && Zo(n, Jo(t));
4748
4782
  }
4749
- } else for (let [e, t] of Object.entries(r.windowVals)) Xo(e, Ko(t));
4783
+ } else for (let [e, t] of Object.entries(r.windowVals)) Qo(e, Jo(t));
4750
4784
  let o = e.vfsStore.files;
4751
4785
  for (let e of Object.keys(o)) delete o[e];
4752
- return Object.assign(o, Ko(r.vfs)), e.todosMw.reset(Ko(r.todos)), a = void 0, i = void 0, !0;
4786
+ return Object.assign(o, Jo(r.vfs)), e.todosMw.reset(Jo(r.todos)), a = void 0, i = void 0, !0;
4753
4787
  },
4754
4788
  exportStack() {
4755
- return Ko(t);
4789
+ return Jo(t);
4756
4790
  },
4757
4791
  importStack(e) {
4758
4792
  t.length = 0, i = void 0, a = void 0;
@@ -4762,7 +4796,7 @@ function Qo(e) {
4762
4796
  }
4763
4797
  };
4764
4798
  }
4765
- function $o(e) {
4799
+ function ts(e) {
4766
4800
  let t = !1;
4767
4801
  return {
4768
4802
  name: "checkpoint",
@@ -4776,7 +4810,7 @@ function $o(e) {
4776
4810
  }
4777
4811
  //#endregion
4778
4812
  //#region src/core/utils/rounds.ts
4779
- function es(e) {
4813
+ function ns(e) {
4780
4814
  let t = [], n = null, r = 0;
4781
4815
  for (let i = 0; i < e.length; i++) {
4782
4816
  let a = e[i];
@@ -4790,43 +4824,43 @@ function es(e) {
4790
4824
  }
4791
4825
  return n && t.push(n), t;
4792
4826
  }
4793
- function ts(e, t) {
4827
+ function rs(e, t) {
4794
4828
  let n = (e || "").replace(/```[\s\S]*?```/g, "[代码]").replace(/`([^`]+)`/g, "$1").replace(/[#*_>\-]\s?/g, "").replace(/\[(代码)\]/g, "「代码」").replace(/\s+/g, " ").trim();
4795
4829
  return n.length > t ? n.slice(0, t) + "…" : n;
4796
4830
  }
4797
- function ns(e) {
4831
+ function is(e) {
4798
4832
  let t = [];
4799
4833
  for (let n of e.assistantMsgs) for (let e of n.steps || []) t.push(e.name);
4800
4834
  return t;
4801
4835
  }
4802
- var rs = "【更早对话摘要";
4803
- function is(e, t) {
4836
+ var as = "【更早对话摘要";
4837
+ function os(e, t) {
4804
4838
  return !t || !t.body ? e : {
4805
4839
  body: `${t.body}\n【续】\n${e.body}`,
4806
4840
  rounds: (t.rounds ?? 0) + (e.rounds ?? 0),
4807
4841
  cumulative: !0
4808
4842
  };
4809
4843
  }
4810
- function as(e) {
4844
+ function ss(e) {
4811
4845
  return typeof e != "string" || !e.startsWith("【更早对话摘要") ? null : { body: e.replace(/^【[^】]*】\n?/, "") };
4812
4846
  }
4813
- function os(e) {
4814
- return `${rs}${e.cumulative ? `(${e.rounds ?? 0} 轮,含累积)` : e.rounds ? `(${e.rounds} 轮)` : ""}】\n${e.body}`;
4847
+ function cs(e) {
4848
+ return `${as}${e.cumulative ? `(${e.rounds ?? 0} 轮,含累积)` : e.rounds ? `(${e.rounds} 轮)` : ""}】\n${e.body}`;
4815
4849
  }
4816
- function ss(e, t, n) {
4817
- return os(is({
4850
+ function ls(e, t, n) {
4851
+ return cs(os({
4818
4852
  body: n,
4819
4853
  rounds: e.length
4820
4854
  }, t ?? void 0));
4821
4855
  }
4822
- function cs(e, t) {
4856
+ function us(e, t) {
4823
4857
  if (t <= 0) return { trimmed: !1 };
4824
- let n = es(e);
4858
+ let n = ns(e);
4825
4859
  if (n.length <= t) return { trimmed: !1 };
4826
4860
  let r = n[n.length - t].startIdx, i = n.slice(0, n.length - t), a = n[0].startIdx, o = null;
4827
4861
  for (let t = 0; t < a; t++) {
4828
4862
  let n = e[t];
4829
- if (n.role === "system" && (o = as(n.content), o)) break;
4863
+ if (n.role === "system" && (o = ss(n.content), o)) break;
4830
4864
  }
4831
4865
  return {
4832
4866
  trimmed: !0,
@@ -4834,9 +4868,9 @@ function cs(e, t) {
4834
4868
  deleteCount: r,
4835
4869
  summary: {
4836
4870
  role: "system",
4837
- content: os(is({
4871
+ content: cs(os({
4838
4872
  body: i.map((e) => {
4839
- let t = ts(e.userMsg.content, 60) || "(空)", n = e.assistantMsgs[0] ? ts(e.assistantMsgs[0].content, 80) : "(无回复)";
4873
+ let t = rs(e.userMsg.content, 60) || "(空)", n = e.assistantMsgs[0] ? rs(e.assistantMsgs[0].content, 80) : "(无回复)";
4840
4874
  return `- 第${e.round}轮:${t} → ${n}`;
4841
4875
  }).join("\n"),
4842
4876
  rounds: i.length
@@ -4849,35 +4883,35 @@ function cs(e, t) {
4849
4883
  }
4850
4884
  //#endregion
4851
4885
  //#region src/core/composables/contextIndex.ts
4852
- var ls = /* @__PURE__ */ new Set(/* @__PURE__ */ "的.了.是.在.我.你.他.她.它.这.那.和.与.及.或.一个.什么.怎么.如何.为什么.可以.能.请.帮.一下.需要.想要.the.a.an.is.are.of.to.in.on".split("."));
4853
- function us(e) {
4854
- return e.toLowerCase().split(/[^a-z0-9一-龥]+/i).map((e) => e.trim()).filter((e) => e.length >= 2 && !ls.has(e));
4886
+ var ds = /* @__PURE__ */ new Set(/* @__PURE__ */ "的.了.是.在.我.你.他.她.它.这.那.和.与.及.或.一个.什么.怎么.如何.为什么.可以.能.请.帮.一下.需要.想要.the.a.an.is.are.of.to.in.on".split("."));
4887
+ function fs(e) {
4888
+ return e.toLowerCase().split(/[^a-z0-9一-龥]+/i).map((e) => e.trim()).filter((e) => e.length >= 2 && !ds.has(e));
4855
4889
  }
4856
- function ds(e) {
4890
+ function ps(e) {
4857
4891
  let t = typeof e.content == "string" ? e.content : "";
4858
4892
  if (e.reasoning && (t += e.reasoning), e.steps) for (let n of e.steps) t += " " + (n.name || ""), n.args != null && (t += " " + (typeof n.args == "string" ? n.args : JSON.stringify(n.args))), n.result && (t += " " + n.result);
4859
4893
  return X(t);
4860
4894
  }
4861
- function fs(e) {
4862
- let t = ds(e.userMsg);
4863
- for (let n of e.assistantMsgs) t += ds(n);
4895
+ function ms(e) {
4896
+ let t = ps(e.userMsg);
4897
+ for (let n of e.assistantMsgs) t += ps(n);
4864
4898
  return t;
4865
4899
  }
4866
- function ps(e, t) {
4900
+ function hs(e, t) {
4867
4901
  return e.map((e) => {
4868
- let n = ts(e.userMsg.content, 60) || "(空)", r = e.assistantMsgs[0] ? ts(e.assistantMsgs[0].content, 80) : "(无回复)", i = e.assistantMsgs.flatMap((e) => (e.steps || []).map((e) => e.name)), a = i.length ? ` [工具: ${i.join(", ")}]` : "", o = "";
4902
+ let n = rs(e.userMsg.content, 60) || "(空)", r = e.assistantMsgs[0] ? rs(e.assistantMsgs[0].content, 80) : "(无回复)", i = e.assistantMsgs.flatMap((e) => (e.steps || []).map((e) => e.name)), a = i.length ? ` [工具: ${i.join(", ")}]` : "", o = "";
4869
4903
  if (t && t.size) {
4870
4904
  let n = [];
4871
- for (let r of e.assistantMsgs) for (let e of r.steps || []) e.name && t.has(e.name) && e.result && n.push(`${e.name}: ${ts(e.result, 120)}`);
4905
+ for (let r of e.assistantMsgs) for (let e of r.steps || []) e.name && t.has(e.name) && e.result && n.push(`${e.name}: ${rs(e.result, 120)}`);
4872
4906
  n.length && (o = `\n 字段提示: ${n.join(" | ")}`);
4873
4907
  }
4874
4908
  return `- 第${e.round}轮:${n} → ${r}${a}${o}`;
4875
4909
  }).join("\n");
4876
4910
  }
4877
- function ms(e, t, n) {
4878
- let r = us(t);
4911
+ function gs(e, t, n) {
4912
+ let r = fs(t);
4879
4913
  return r.length === 0 ? [] : e.map((e) => {
4880
- let t = (e.userMsg.content + " " + e.assistantMsgs.map((e) => e.content).join(" ") + " " + e.assistantMsgs.flatMap((e) => (e.steps || []).map((e) => ts(e.result || "", 120))).join(" ")).toLowerCase(), n = 0;
4914
+ let t = (e.userMsg.content + " " + e.assistantMsgs.map((e) => e.content).join(" ") + " " + e.assistantMsgs.flatMap((e) => (e.steps || []).map((e) => rs(e.result || "", 120))).join(" ")).toLowerCase(), n = 0;
4881
4915
  for (let e of r) t.includes(e) && n++;
4882
4916
  return {
4883
4917
  r: e,
@@ -4885,12 +4919,12 @@ function ms(e, t, n) {
4885
4919
  };
4886
4920
  }).filter((e) => e.score > 0).sort((e, t) => t.score - e.score).slice(0, n).map((e) => e.r);
4887
4921
  }
4888
- function hs(e, t) {
4889
- return t.contextWindow && t.contextWindow > 0 ? e.reduce((e, t) => e + fs(t), 0) > t.contextWindow * (t.summaryThresholdRatio ?? .5) : e.length > (t.summaryThresholdRounds ?? 8);
4922
+ function _s(e, t) {
4923
+ return t.contextWindow && t.contextWindow > 0 ? e.reduce((e, t) => e + ms(t), 0) > t.contextWindow * (t.summaryThresholdRatio ?? .5) : e.length > (t.summaryThresholdRounds ?? 8);
4890
4924
  }
4891
4925
  //#endregion
4892
4926
  //#region src/core/composables/useContextManager.ts
4893
- var gs = {
4927
+ var vs = {
4894
4928
  windowRounds: 6,
4895
4929
  summaryThresholdRounds: 8,
4896
4930
  toolResultMaxChars: 800,
@@ -4898,9 +4932,9 @@ var gs = {
4898
4932
  recallTopK: 3,
4899
4933
  enableLLMSummary: !1
4900
4934
  };
4901
- function _s(e = {}) {
4935
+ function ys(e = {}) {
4902
4936
  let t = {
4903
- ...gs,
4937
+ ...vs,
4904
4938
  ...e
4905
4939
  }, n = null, r = !1;
4906
4940
  function i(e, i) {
@@ -4914,13 +4948,13 @@ function _s(e = {}) {
4914
4948
  }));
4915
4949
  }
4916
4950
  async function a(e, r) {
4917
- let a = es(e), o = e.length, s = "";
4951
+ let a = ns(e), o = e.length, s = "";
4918
4952
  if (a.length) {
4919
4953
  let t = a[0].startIdx;
4920
4954
  for (let n = 0; n < t; n++) {
4921
4955
  let t = e[n];
4922
4956
  if (t.role === "system") {
4923
- let e = as(t.content);
4957
+ let e = ss(t.content);
4924
4958
  if (e) {
4925
4959
  s = e.body;
4926
4960
  break;
@@ -4940,11 +4974,11 @@ function _s(e = {}) {
4940
4974
  strategy: t
4941
4975
  }
4942
4976
  });
4943
- if (!hs(a, t)) return c("none");
4977
+ if (!_s(a, t)) return c("none");
4944
4978
  let l, u, d;
4945
4979
  if (t.contextWindow && t.contextWindow > 0) {
4946
4980
  let e = t.contextWindow * (r?.windowRatio ?? t.windowRatio ?? .4), n = 0, i = 0;
4947
- for (let t = a.length - 1; t >= 0; t--) if (n += fs(a[t]), n >= e) {
4981
+ for (let t = a.length - 1; t >= 0; t--) if (n += ms(a[t]), n >= e) {
4948
4982
  i = t + 1;
4949
4983
  break;
4950
4984
  }
@@ -4957,10 +4991,10 @@ function _s(e = {}) {
4957
4991
  }
4958
4992
  let f = [...e].reverse().find((e) => e.role === "user")?.content || "", p = r?.summarize?.mode ?? (t.enableLLMSummary ? "llm" : "index"), m = /* @__PURE__ */ new Set([...t.preserveLastToolResults ?? [], ...r?.preserveTools ?? []]), h = m.size ? m : void 0, g, _;
4959
4993
  if (p === "llm" && t.llmInvoke) {
4960
- let e = ps(u, h), t = u.length;
4961
- n && n.coveredCount >= t ? (g = n.text, _ = d + "llm_summary(cached)") : n && n.coveredCount > 0 ? (g = n.text + "\n" + ps(u.slice(n.coveredCount), h), _ = d + "llm_summary(prefix)+index_tail", i(t, e)) : (g = e, _ = d + "index_summary(llm_background)", i(t, e));
4962
- } else g = ps(u, h), _ = d + "index_summary";
4963
- let v = r?.recallTopK == null ? t.enableRecall ? t.recallTopK : 0 : r.recallTopK, y = v > 0 ? ms(u, f, v) : [], b = y.length ? y.map((e) => `- 第${e.round}轮:${ts(e.userMsg.content, 60)} → ${e.assistantMsgs[0] ? ts(e.assistantMsgs[0].content, 80) : ""}`).join("\n") : "", x = s ? `${g}\n【更早累积摘要】\n${s}` : g, S = [`【对话历史摘要】以下是之前 ${u.length} 轮对话的要点(最新 ${l.length} 轮已完整保留):`, x];
4994
+ let e = hs(u, h), t = u.length;
4995
+ n && n.coveredCount >= t ? (g = n.text, _ = d + "llm_summary(cached)") : n && n.coveredCount > 0 ? (g = n.text + "\n" + hs(u.slice(n.coveredCount), h), _ = d + "llm_summary(prefix)+index_tail", i(t, e)) : (g = e, _ = d + "index_summary(llm_background)", i(t, e));
4996
+ } else g = hs(u, h), _ = d + "index_summary";
4997
+ let v = r?.recallTopK == null ? t.enableRecall ? t.recallTopK : 0 : r.recallTopK, y = v > 0 ? gs(u, f, v) : [], b = y.length ? y.map((e) => `- 第${e.round}轮:${rs(e.userMsg.content, 60)} → ${e.assistantMsgs[0] ? rs(e.assistantMsgs[0].content, 80) : ""}`).join("\n") : "", x = s ? `${g}\n【更早累积摘要】\n${s}` : g, S = [`【对话历史摘要】以下是之前 ${u.length} 轮对话的要点(最新 ${l.length} 轮已完整保留):`, x];
4964
4998
  if (r) {
4965
4999
  let e = t.contextWindow && t.contextWindow > 0 ? `windowRatio=${r.windowRatio ?? t.windowRatio}` : `keepRounds=${r.keepRounds ?? t.windowRounds}`;
4966
5000
  S.push(`\n(压缩决策:${e} · 摘要=${r.summarize.mode} · 召回=${v}${r.reason ? " · " + r.reason : ""})`);
@@ -5002,15 +5036,15 @@ function _s(e = {}) {
5002
5036
  }
5003
5037
  //#endregion
5004
5038
  //#region src/core/harness/summarization.ts
5005
- function vs(e = {}) {
5006
- let t = _s(e);
5039
+ function bs(e = {}) {
5040
+ let t = ys(e);
5007
5041
  return Object.assign({
5008
5042
  name: "summarization",
5009
5043
  compressInput: async (n) => {
5010
5044
  let r;
5011
5045
  if (e.decideInvoke) {
5012
- let i = es(n);
5013
- if (hs(i, t.config)) {
5046
+ let i = ns(n);
5047
+ if (_s(i, t.config)) {
5014
5048
  let a = t.config.contextWindow && t.config.contextWindow > 0 ? "token" : "rounds", o = a === "token" ? `历史 token 超阈值 ${Math.round((t.config.contextWindow ?? 0) * (t.config.summaryThresholdRatio ?? .5))}` : `轮数 ${i.length} 超阈值 ${t.config.summaryThresholdRounds}`;
5015
5049
  try {
5016
5050
  r = await e.decideInvoke({
@@ -5038,7 +5072,7 @@ function vs(e = {}) {
5038
5072
  }
5039
5073
  //#endregion
5040
5074
  //#region src/core/harness/subagent.ts
5041
- function ys(e = 20) {
5075
+ function xs(e = 20) {
5042
5076
  let t = /* @__PURE__ */ new Map(), n = [];
5043
5077
  return {
5044
5078
  start(e, n, r, i) {
@@ -5067,17 +5101,17 @@ function ys(e = 20) {
5067
5101
  }
5068
5102
  };
5069
5103
  }
5070
- function bs(e) {
5104
+ function Ss(e) {
5071
5105
  return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
5072
5106
  }
5073
- var xs = [
5107
+ var Cs = [
5074
5108
  "describe_data",
5075
5109
  "get_data",
5076
5110
  "read",
5077
5111
  "query_data",
5078
5112
  "search_data",
5079
5113
  "fetch_document"
5080
- ], Ss = 1, Cs = 4, ws = 6, Ts = ["spawn_agent", "spawn_agents"], Es = [
5114
+ ], ws = 1, Ts = 4, Es = 6, Ds = ["spawn_agent", "spawn_agents"], Os = [
5081
5115
  "load_skill",
5082
5116
  "write_todos",
5083
5117
  "update_todo",
@@ -5088,40 +5122,40 @@ var xs = [
5088
5122
  "remove_focus",
5089
5123
  "clear_focus"
5090
5124
  ];
5091
- function Ds(e) {
5092
- return Ts.includes(e) || Es.includes(e) || e.startsWith("use_");
5125
+ function ks(e) {
5126
+ return Ds.includes(e) || Os.includes(e) || e.startsWith("use_");
5093
5127
  }
5094
- function Os(e, t, n = []) {
5095
- return [...e.filter((e) => t.has(e.name) && !Ds(e.name)), ...n];
5128
+ function As(e, t, n = []) {
5129
+ return [...e.filter((e) => t.has(e.name) && !ks(e.name)), ...n];
5096
5130
  }
5097
- var ks = [
5131
+ var js = [
5098
5132
  "write",
5099
5133
  "set_data",
5100
5134
  "edit_data",
5101
5135
  "delete_data",
5102
5136
  "draft_commit"
5103
5137
  ];
5104
- function As(e) {
5138
+ function Ms(e) {
5105
5139
  let t = [];
5106
5140
  if (typeof e.jsonPath == "string" && e.jsonPath && t.push(e.jsonPath), typeof e.path == "string" && e.path && t.push(e.path), e.patch && typeof e.patch.jsonPath == "string" && t.push(e.patch.jsonPath), Array.isArray(e.patches)) for (let n of e.patches) n && typeof n.jsonPath == "string" && t.push(n.jsonPath);
5107
5141
  return t;
5108
5142
  }
5109
- function js(e, t) {
5143
+ function Ns(e, t) {
5110
5144
  return t.some((t) => e === t || e.startsWith(t + ".") || e.startsWith(t + "["));
5111
5145
  }
5112
- function Ms(e, t) {
5146
+ function Ps(e, t) {
5113
5147
  let n = e.invoke.bind(e), r = async (e) => {
5114
5148
  if (Array.isArray(e?.patches) && e.patches.some((e) => !e || typeof e.jsonPath != "string" || !e.jsonPath)) return `PATH_OUT_OF_SCOPE:patches 含无 jsonPath 项(作用于根),子 agent 仅可写 ${t.join(", ")} 范围内子路径。请为每个 patch 指定 jsonPath。`;
5115
- let r = As(e);
5149
+ let r = Ms(e);
5116
5150
  if (!r.length) return `PATH_OUT_OF_SCOPE:子 agent 仅可增量 patch(writablePaths: ${t.join(", ")}),不能整体替换(无 jsonPath)。用 write({patch:{jsonPath,...}}) 增量改。`;
5117
- for (let e of r) if (!js(e, t)) return `PATH_OUT_OF_SCOPE:子 agent 写 "${e}" 越界(仅可写 ${t.join(", ")})。`;
5151
+ for (let e of r) if (!Ns(e, t)) return `PATH_OUT_OF_SCOPE:子 agent 写 "${e}" 越界(仅可写 ${t.join(", ")})。`;
5118
5152
  return n(e);
5119
5153
  };
5120
5154
  return new Proxy(e, { get(e, t, n) {
5121
5155
  return t === "invoke" ? r : Reflect.get(e, t, n);
5122
5156
  } });
5123
5157
  }
5124
- function Ns(e, t, n) {
5158
+ function Fs(e, t, n) {
5125
5159
  return new Proxy(e, { get(e, r, i) {
5126
5160
  return r === "invoke" ? async (r, i) => {
5127
5161
  let a = n(t);
@@ -5139,19 +5173,19 @@ function Ns(e, t, n) {
5139
5173
  } : Reflect.get(e, r, i);
5140
5174
  } });
5141
5175
  }
5142
- async function Ps(e, t, n, r, i, a) {
5143
- let o = t.depth ?? 0, s = t.maxDepth ?? Ss, c = /* @__PURE__ */ new Set([...xs, ...t.allowedTools ?? []]), l = () => typeof t.allTools == "function" ? t.allTools() : t.allTools, u = Os(l(), c, t.extraTools ?? []);
5176
+ async function Is(e, t, n, r, i, a) {
5177
+ let o = t.depth ?? 0, s = t.maxDepth ?? ws, c = /* @__PURE__ */ new Set([...Cs, ...t.allowedTools ?? []]), l = () => typeof t.allTools == "function" ? t.allTools() : t.allTools, u = As(l(), c, t.extraTools ?? []);
5144
5178
  if (t.writablePaths?.length) {
5145
- u = u.filter((e) => !ks.includes(e.name));
5146
- let e = l().filter((e) => ks.includes(e.name) && !Ds(e.name)).map((e) => Ms(e, t.writablePaths));
5179
+ u = u.filter((e) => !js.includes(e.name));
5180
+ let e = l().filter((e) => js.includes(e.name) && !ks(e.name)).map((e) => Ps(e, t.writablePaths));
5147
5181
  u = [...u, ...e];
5148
5182
  }
5149
5183
  let d = `sub-${o}-${Math.random().toString(36).slice(2, 10)}`;
5150
- t.enterDataScope && (u = u.map((e) => e.__dataOpsScoped ? Ns(e, d, t.enterDataScope) : e));
5151
- let f = o + 1 < s ? [Fs({
5184
+ t.enterDataScope && (u = u.map((e) => e.__dataOpsScoped ? Fs(e, d, t.enterDataScope) : e));
5185
+ let f = o + 1 < s ? [Ls({
5152
5186
  ...t,
5153
5187
  depth: o + 1
5154
- })] : [], p = t.getFocuses?.() ?? [], m = p.length ? uo({
5188
+ })] : [], p = t.getFocuses?.() ?? [], m = p.length ? po({
5155
5189
  getSchema: t.getSchema ?? (() => null),
5156
5190
  getBind: t.getBind,
5157
5191
  initialFocuses: p
@@ -5159,12 +5193,12 @@ async function Ps(e, t, n, r, i, a) {
5159
5193
  name: "vfs-bridge",
5160
5194
  beforeAgent: () => ({ files: t.getVfsFiles() })
5161
5195
  } : void 0, g = ii({
5162
- model: bs(t.llm) ? t.llm.model ?? t.llm.modelName : e.model ?? t.llm.model,
5196
+ model: Ss(t.llm) ? t.llm.model ?? t.llm.modelName : e.model ?? t.llm.model,
5163
5197
  contextWindow: t.llm.contextWindow,
5164
5198
  maxOutputTokens: t.llm.maxOutputTokens
5165
5199
  });
5166
5200
  if (g.contextWindow < 2e5) throw Error(`[page-agent-sdk][subagent] 子 agent 模型上下文窗口 ${g.contextWindow} 小于最小支持 ${ri}(需 ≥200K 窗口模型)`);
5167
- let v = t.summarization === void 0 ? void 0 : vs(typeof t.summarization == "object" ? {
5201
+ let v = t.summarization === void 0 ? void 0 : bs(typeof t.summarization == "object" ? {
5168
5202
  contextWindow: g.contextWindow,
5169
5203
  ...t.summarization
5170
5204
  } : { contextWindow: g.contextWindow }), y = t.onUsage ? {
@@ -5176,7 +5210,7 @@ async function Ps(e, t, n, r, i, a) {
5176
5210
  } : void 0, b = Ii({
5177
5211
  contextWindow: g.contextWindow,
5178
5212
  maxOutputTokens: g.maxOutputTokens,
5179
- ...bs(t.llm) ? { llm: t.llm } : {
5213
+ ...Ss(t.llm) ? { llm: t.llm } : {
5180
5214
  apiKey: t.llm.apiKey,
5181
5215
  baseUrl: t.llm.baseUrl,
5182
5216
  model: e.model ?? t.llm.model,
@@ -5188,7 +5222,7 @@ async function Ps(e, t, n, r, i, a) {
5188
5222
  systemPrompt: e.role?.trim() || t.systemPrompt || "你是一个专注的子任务执行者。你只有只读工具(读主数据 / 抓文档),用它们完成给定任务,给出简洁结论,不要展开多余解释。",
5189
5223
  tools: u,
5190
5224
  middleware: [
5191
- ...t.skills?.length ? [No(t.skills)] : [],
5225
+ ...t.skills?.length ? [Fo(t.skills)] : [],
5192
5226
  ...v ? [v] : [],
5193
5227
  ...h ? [h] : [],
5194
5228
  ...f,
@@ -5197,7 +5231,7 @@ async function Ps(e, t, n, r, i, a) {
5197
5231
  ...t.guardMiddleware ?? [],
5198
5232
  ...t.middleware ?? []
5199
5233
  ],
5200
- maxToolRounds: t.maxToolRounds ?? ws,
5234
+ maxToolRounds: t.maxToolRounds ?? Es,
5201
5235
  maxVerifyAttempts: t.maxVerifyAttempts ?? 0,
5202
5236
  onLog: i,
5203
5237
  debug: t.debug
@@ -5235,8 +5269,8 @@ async function Ps(e, t, n, r, i, a) {
5235
5269
  clearTimeout(T), C();
5236
5270
  }
5237
5271
  }
5238
- function Fs(e) {
5239
- let n = e.maxParallel ?? Cs, i, a, o, s = (e) => e?.configurable?.__pgSubagentCall ?? {
5272
+ function Ls(e) {
5273
+ let n = e.maxParallel ?? Ts, i, a, o, s = (e) => e?.configurable?.__pgSubagentCall ?? {
5240
5274
  signal: i,
5241
5275
  emit: a,
5242
5276
  logSink: o
@@ -5270,7 +5304,7 @@ function Fs(e) {
5270
5304
  return {
5271
5305
  name: "subagent",
5272
5306
  tools: [r(async ({ prompt: t, role: n, tools: r, writablePaths: i, model: a }, o) => {
5273
- let l = s(o), u = (r ?? []).filter((e) => !ks.includes(e)), d = u.length || i?.length ? {
5307
+ let l = s(o), u = (r ?? []).filter((e) => !js.includes(e)), d = u.length || i?.length ? {
5274
5308
  ...e,
5275
5309
  ...u.length ? { allowedTools: u } : {},
5276
5310
  ...i?.length ? { writablePaths: i } : {}
@@ -5280,7 +5314,7 @@ function Fs(e) {
5280
5314
  }), h = Date.now();
5281
5315
  e.tracker?.start(f, t, p, h);
5282
5316
  try {
5283
- let r = await Ps({
5317
+ let r = await Is({
5284
5318
  prompt: t,
5285
5319
  role: n,
5286
5320
  model: a
@@ -5308,7 +5342,7 @@ function Fs(e) {
5308
5342
  }), s = Date.now();
5309
5343
  e.tracker?.start(r, t.prompt, a, s);
5310
5344
  try {
5311
- let n = await Ps(t, e, i.signal, c(r, a, i.emit), o, i.emit);
5345
+ let n = await Is(t, e, i.signal, c(r, a, i.emit), o, i.emit);
5312
5346
  return e.tracker?.finish(r, "done", n ?? "(未完成)"), {
5313
5347
  ok: !0,
5314
5348
  text: n ?? "(未完成)"
@@ -5339,8 +5373,8 @@ function Fs(e) {
5339
5373
  }, t(e))
5340
5374
  };
5341
5375
  }
5342
- var Is = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
5343
- function Ls(e, t) {
5376
+ var Rs = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
5377
+ function zs(e, t) {
5344
5378
  let n = e.tools ?? [];
5345
5379
  return {
5346
5380
  llm: e.llm ?? t.llm,
@@ -5368,7 +5402,7 @@ function Ls(e, t) {
5368
5402
  ...t.timeoutMs === void 0 ? {} : { timeoutMs: t.timeoutMs }
5369
5403
  };
5370
5404
  }
5371
- function Rs(e, n) {
5405
+ function Bs(e, n) {
5372
5406
  let i, a, o, s = (e) => e?.configurable?.__pgSubagentCall ?? {
5373
5407
  signal: i,
5374
5408
  emit: a,
@@ -5399,7 +5433,7 @@ function Rs(e, n) {
5399
5433
  function f(e) {
5400
5434
  let i = /* @__PURE__ */ new Set(), a = [], o = [];
5401
5435
  for (let l of e) {
5402
- if (!Is.test(l.id)) {
5436
+ if (!Rs.test(l.id)) {
5403
5437
  console.warn(`[subagents] id "${l.id}" 非合法工具名(须 [a-zA-Z_][a-zA-Z0-9_]*),已跳过`);
5404
5438
  continue;
5405
5439
  }
@@ -5409,7 +5443,7 @@ function Rs(e, n) {
5409
5443
  continue;
5410
5444
  }
5411
5445
  i.add(e), a.push(l), o.push(r(async ({ task: e }, t) => {
5412
- let r = s(t), i = Ls(l, n), a = (e) => r.logSink?.({
5446
+ let r = s(t), i = zs(l, n), a = (e) => r.logSink?.({
5413
5447
  ...e,
5414
5448
  source: `子:${l.id}`
5415
5449
  }), o = n.tracker, u = o ? `use_${l.id}-${Math.random().toString(36).slice(2, 6)}` : `use_${l.id}`, d = c(`use_${l.id}`, l.id, r.emit), f = o ? (e) => {
@@ -5421,7 +5455,7 @@ function Rs(e, n) {
5421
5455
  } : d, p = Date.now();
5422
5456
  o?.start(u, e, l.id, p);
5423
5457
  try {
5424
- let t = await Ps({ prompt: e }, i, r.signal, f, a, r.emit);
5458
+ let t = await Is({ prompt: e }, i, r.signal, f, a, r.emit);
5425
5459
  return o?.finish(u, "done", t), t;
5426
5460
  } catch (e) {
5427
5461
  throw o?.finish(u, "error", String(e?.message ?? e)), e;
@@ -5489,7 +5523,7 @@ function Rs(e, n) {
5489
5523
  }
5490
5524
  //#endregion
5491
5525
  //#region src/core/utils/contextAnalysis.ts
5492
- var zs = [
5526
+ var Vs = [
5493
5527
  {
5494
5528
  prefix: "## 可操作数据",
5495
5529
  key: "dataHint"
@@ -5518,7 +5552,7 @@ var zs = [
5518
5552
  prefix: "【与当前问题可能相关的早期对话】",
5519
5553
  key: "recall"
5520
5554
  }
5521
- ], Bs = [
5555
+ ], Hs = [
5522
5556
  {
5523
5557
  key: "systemPrompt",
5524
5558
  label: "系统提示词(身份/规则)"
@@ -5572,9 +5606,9 @@ var zs = [
5572
5606
  label: "其他"
5573
5607
  }
5574
5608
  ];
5575
- function Vs() {
5609
+ function Us() {
5576
5610
  let e = {};
5577
- for (let t of Bs) e[t.key] = {
5611
+ for (let t of Hs) e[t.key] = {
5578
5612
  key: t.key,
5579
5613
  label: t.label,
5580
5614
  tokens: 0,
@@ -5583,16 +5617,16 @@ function Vs() {
5583
5617
  };
5584
5618
  return e;
5585
5619
  }
5586
- function Hs(e, t) {
5620
+ function Ws(e, t) {
5587
5621
  e.tokens += t, e.msgCount += 1;
5588
5622
  }
5589
- function Us(e) {
5623
+ function Gs(e) {
5590
5624
  let t = e.content;
5591
5625
  return typeof t == "string" ? t : JSON.stringify(t ?? "");
5592
5626
  }
5593
- function Ws(e, t) {
5627
+ function Ks(e, t) {
5594
5628
  let n = [];
5595
- for (let t of zs) {
5629
+ for (let t of Vs) {
5596
5630
  let r = 0;
5597
5631
  for (;;) {
5598
5632
  let i = e.indexOf(t.prefix, r);
@@ -5605,35 +5639,35 @@ function Ws(e, t) {
5605
5639
  }
5606
5640
  if (n.sort((e, t) => e.idx - t.idx), !n.length) {
5607
5641
  let n = e.trim();
5608
- n && Hs(t.systemPrompt, X(n));
5642
+ n && Ws(t.systemPrompt, X(n));
5609
5643
  return;
5610
5644
  }
5611
5645
  if (n[0].idx > 0) {
5612
5646
  let r = e.slice(0, n[0].idx).trim();
5613
- r && Hs(t.systemPrompt, X(r));
5647
+ r && Ws(t.systemPrompt, X(r));
5614
5648
  }
5615
5649
  for (let r = 0; r < n.length; r++) {
5616
5650
  let i = n[r].idx, a = r + 1 < n.length ? n[r + 1].idx : e.length, o = e.slice(i, a).trim();
5617
- o && Hs(t[n[r].key], X(o));
5651
+ o && Ws(t[n[r].key], X(o));
5618
5652
  }
5619
5653
  }
5620
- function Gs(e, t = {}) {
5621
- let n = Vs(), r = -1;
5654
+ function qs(e, t = {}) {
5655
+ let n = Us(), r = -1;
5622
5656
  for (let t = e.length - 1; t >= 0; t--) if (e[t] instanceof a) {
5623
5657
  r = t;
5624
5658
  break;
5625
5659
  }
5626
5660
  for (let t = 0; t < e.length; t++) {
5627
5661
  let c = e[t];
5628
- if (c instanceof o) Ws(Us(c), n);
5629
- else if (c instanceof a) Hs(n[t === r ? "current" : "history"], X(Us(c)));
5662
+ if (c instanceof o) Ks(Gs(c), n);
5663
+ else if (c instanceof a) Ws(n[t === r ? "current" : "history"], X(Gs(c)));
5630
5664
  else if (c instanceof i) {
5631
5665
  let e = c.tool_calls ?? [];
5632
5666
  if (e.length) {
5633
5667
  let t = e.map((e) => JSON.stringify(e.args ?? {})).join(" ");
5634
- Hs(n.toolResults, X(t));
5635
- } else Hs(n.assistant, X(Us(c)));
5636
- } else c instanceof s ? Hs(n.toolResults, X(Us(c))) : Hs(n.other, X(Us(c)));
5668
+ Ws(n.toolResults, X(t));
5669
+ } else Ws(n.assistant, X(Gs(c)));
5670
+ } else c instanceof s ? Ws(n.toolResults, X(Gs(c))) : Ws(n.other, X(Gs(c)));
5637
5671
  }
5638
5672
  let c = Object.values(n).filter((e) => e.tokens > 0);
5639
5673
  c.sort((e, t) => t.tokens - e.tokens);
@@ -5650,12 +5684,12 @@ function Gs(e, t = {}) {
5650
5684
  }
5651
5685
  //#endregion
5652
5686
  //#region src/core/harness/contextInspector.ts
5653
- function Ks(e = {}) {
5687
+ function Js(e = {}) {
5654
5688
  let t, n = e.contextWindow;
5655
5689
  return {
5656
5690
  name: "context-inspector",
5657
5691
  async wrapModelCall(r, i) {
5658
- return t = Gs(r.messages, {
5692
+ return t = qs(r.messages, {
5659
5693
  contextWindow: n,
5660
5694
  thresholdRatio: e.thresholdRatio
5661
5695
  }), i(r);
@@ -5666,13 +5700,13 @@ function Ks(e = {}) {
5666
5700
  }
5667
5701
  };
5668
5702
  }
5669
- function qs(e) {
5703
+ function Ys(e) {
5670
5704
  let t = e?.content;
5671
5705
  if (!Array.isArray(t) || !t.length) return "";
5672
5706
  let n = t.map((e) => e.type === "text" && e.text ? e.text : e.type === "image" && e.data ? `[image:${String(e.data).slice(0, 32)}…]` : e.type === "audio" && e.data ? "[audio]" : e.type === "resource" && e.resource ? e.resource.text ?? e.resource.blob ?? "" : "").filter(Boolean).join("\n");
5673
5707
  return e?.isError ? `工具错误:${n}` : n;
5674
5708
  }
5675
- async function Js(e) {
5709
+ async function Xs(e) {
5676
5710
  let t = new URL(e.url), n = e.requestInit;
5677
5711
  if (e.transport === "http") {
5678
5712
  let { StreamableHTTPClientTransport: e } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
@@ -5685,7 +5719,7 @@ async function Js(e) {
5685
5719
  let { WebSocketClientTransport: r } = await import("@modelcontextprotocol/sdk/client/websocket.js");
5686
5720
  return new r(t);
5687
5721
  }
5688
- async function Ys(e, t, n) {
5722
+ async function Zs(e, t, n) {
5689
5723
  let r;
5690
5724
  try {
5691
5725
  return await Promise.race([e, new Promise((e, i) => {
@@ -5695,8 +5729,8 @@ async function Ys(e, t, n) {
5695
5729
  clearTimeout(r);
5696
5730
  }
5697
5731
  }
5698
- function Xs(e, t, n) {
5699
- return r(async (r) => qs(await Ys(t.callTool({
5732
+ function Qs(e, t, n) {
5733
+ return r(async (r) => Ys(await Zs(t.callTool({
5700
5734
  name: e.name,
5701
5735
  arguments: r
5702
5736
  }), e.name, n)), {
@@ -5705,8 +5739,8 @@ function Xs(e, t, n) {
5705
5739
  schema: e.inputSchema
5706
5740
  });
5707
5741
  }
5708
- async function Zs(e) {
5709
- let { Client: t } = await import("@modelcontextprotocol/sdk/client"), n = await Js(e), r = new t({
5742
+ async function $s(e) {
5743
+ let { Client: t } = await import("@modelcontextprotocol/sdk/client"), n = await Xs(e), r = new t({
5710
5744
  name: "page-agent-sdk",
5711
5745
  version: "1.0"
5712
5746
  }, { capabilities: {} }), i = e.timeoutMs ?? 15e3, a;
@@ -5724,70 +5758,70 @@ async function Zs(e) {
5724
5758
  }
5725
5759
  let { tools: o } = await r.listTools();
5726
5760
  return {
5727
- tools: o.map((t) => Xs(t, r, e.callTimeoutMs ?? 6e4)),
5761
+ tools: o.map((t) => Qs(t, r, e.callTimeoutMs ?? 6e4)),
5728
5762
  close: () => r.close()
5729
5763
  };
5730
5764
  }
5731
5765
  //#endregion
5732
5766
  //#region src/core/sdk/promptBuilder.ts
5733
- var Qs = [
5767
+ var ec = [
5734
5768
  "你是一个 JSON 操作助手。集成方声明了一个主数据对象(含 zod schema 校验),你通过专用工具安全地读写它来完成任务。",
5735
5769
  "所有写操作都经范围控制(仅 schema 声明字段内)与 schema 校验(不合法会返回结构化错误而非写入),并自动留快照可回退。",
5736
5770
  "大对象/数组优先用增量 patch(只发改动)而非整体重传,避免输出被截断。",
5737
5771
  "---",
5738
- Xa.reliableWriteRules
5772
+ Qa.reliableWriteRules
5739
5773
  ].join("\n\n");
5740
- function $s(e, t) {
5774
+ function tc(e, t) {
5741
5775
  if (!e) return "";
5742
- let n = eo(e.schema, t);
5776
+ let n = no(e.schema, t);
5743
5777
  return `\n\n## 可操作数据(字段以 read 工具返回的实际值为准)\n${e.description ? e.description + "\n" : ""}${n}`;
5744
5778
  }
5745
- function ec(e) {
5779
+ function nc(e) {
5746
5780
  let t = e.appendReliableWriteRules !== !1;
5747
- return e.systemPrompt ? t ? e.systemPrompt + "\n\n---\n\n" + Xa.reliableWriteRules : e.systemPrompt : Qs;
5781
+ return e.systemPrompt ? t ? e.systemPrompt + "\n\n---\n\n" + Qa.reliableWriteRules : e.systemPrompt : ec;
5748
5782
  }
5749
- var tc = {
5783
+ var rc = {
5750
5784
  largeResults: 4 * 1024 * 1024,
5751
5785
  drafts: 2 * 1024 * 1024,
5752
5786
  userFiles: 2 * 1024 * 1024,
5753
5787
  resources: 4 * 1024 * 1024
5754
- }, nc = [
5788
+ }, ic = [
5755
5789
  "largeResults",
5756
5790
  "drafts",
5757
5791
  "userFiles",
5758
5792
  "resources"
5759
- ], rc = .9;
5760
- function ic(e, t = {}) {
5793
+ ], ac = .9;
5794
+ function oc(e, t = {}) {
5761
5795
  let n = Object.create(null);
5762
- if (e) for (let [t, r] of Object.entries(e)) n[cc(t)] = {
5796
+ if (e) for (let [t, r] of Object.entries(e)) n[uc(t)] = {
5763
5797
  content: r,
5764
- updatedAt: uc()
5798
+ updatedAt: fc()
5765
5799
  };
5766
5800
  let { persist: r } = t, i = t.maxBytes ?? 8388608, a = {
5767
- ...tc,
5801
+ ...rc,
5768
5802
  ...t.poolBytes ?? {}
5769
5803
  };
5770
5804
  function o(e) {
5771
- let t = cc(e);
5805
+ let t = uc(e);
5772
5806
  return t.startsWith("large_results/") ? "largeResults" : t.startsWith("drafts/") ? "drafts" : t.startsWith("resources/") ? "resources" : "userFiles";
5773
5807
  }
5774
5808
  function s(e) {
5775
5809
  let t = 0;
5776
- for (let [r, i] of Object.entries(n)) o(r) === e && (t += oc(i.content));
5810
+ for (let [r, i] of Object.entries(n)) o(r) === e && (t += cc(i.content));
5777
5811
  return t;
5778
5812
  }
5779
5813
  function c() {
5780
- for (let e of nc) {
5814
+ for (let e of ic) {
5781
5815
  let t = a[e];
5782
5816
  if (s(e) <= t) continue;
5783
- let r = t * rc, i = e === "largeResults", c = i && s(e) > t * 1.5;
5817
+ let r = t * ac, i = e === "largeResults", c = i && s(e) > t * 1.5;
5784
5818
  c && console.warn(`[page-agent-sdk] vfs large_results 池 ${s(e)} > ${Math.round(t * 1.5)}(被引用撑爆)→ 无视 protectedRefs 强制删`);
5785
5819
  let l = Object.entries(n).filter(([t]) => o(t) === e).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
5786
5820
  for (let [t] of l) if (!(i && !c && u.has(t)) && (delete n[t], s(e) <= r)) break;
5787
5821
  }
5788
- if (sc(n) > i) {
5789
- let e = i * rc, t = sc(n) > i * 1.5, r = Object.entries(n).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
5790
- for (let [i] of r) if (!(o(i) === "largeResults" && !t && u.has(i)) && (delete n[i], sc(n) <= e)) break;
5822
+ if (lc(n) > i) {
5823
+ let e = i * ac, t = lc(n) > i * 1.5, r = Object.entries(n).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
5824
+ for (let [i] of r) if (!(o(i) === "largeResults" && !t && u.has(i)) && (delete n[i], lc(n) <= e)) break;
5791
5825
  }
5792
5826
  }
5793
5827
  let l = !0, u = /* @__PURE__ */ new Set(), d = null;
@@ -5823,7 +5857,7 @@ function ic(e, t = {}) {
5823
5857
  }
5824
5858
  };
5825
5859
  return r && (m.hydrate = (e) => {
5826
- for (let [t, r] of Object.entries(e)) n[cc(t)] = r;
5860
+ for (let [t, r] of Object.entries(e)) n[uc(t)] = r;
5827
5861
  c(), l = !0;
5828
5862
  }, m.flush = () => {
5829
5863
  d &&= (clearTimeout(d), null), f();
@@ -5832,19 +5866,19 @@ function ic(e, t = {}) {
5832
5866
  p(), l = !0;
5833
5867
  }), m;
5834
5868
  }
5835
- var ac = null;
5836
- function oc(e) {
5837
- return ac ||= new TextEncoder(), ac.encode(e).length;
5869
+ var sc = null;
5870
+ function cc(e) {
5871
+ return sc ||= new TextEncoder(), sc.encode(e).length;
5838
5872
  }
5839
- function sc(e) {
5873
+ function lc(e) {
5840
5874
  let t = 0;
5841
- for (let n of Object.values(e)) t += oc(n.content);
5875
+ for (let n of Object.values(e)) t += cc(n.content);
5842
5876
  return t;
5843
5877
  }
5844
- function cc(e) {
5878
+ function uc(e) {
5845
5879
  return e.replace(/^\/+/, "").replace(/\/+/g, "/");
5846
5880
  }
5847
- function lc(e) {
5881
+ function dc(e) {
5848
5882
  let t = "";
5849
5883
  for (let n = 0; n < e.length; n++) {
5850
5884
  let r = e[n];
@@ -5852,10 +5886,10 @@ function lc(e) {
5852
5886
  }
5853
5887
  return RegExp("^" + t + "$");
5854
5888
  }
5855
- function uc() {
5889
+ function fc() {
5856
5890
  return Date.now();
5857
5891
  }
5858
- var dc = [
5892
+ var pc = [
5859
5893
  "vfs_read",
5860
5894
  "vfs_write",
5861
5895
  "vfs_edit",
@@ -5866,10 +5900,10 @@ var dc = [
5866
5900
  "vfs_json_patch",
5867
5901
  "vfs_rm"
5868
5902
  ];
5869
- function fc(e) {
5903
+ function mc(e) {
5870
5904
  return [
5871
5905
  r(async ({ path: t, offset: n, limit: r }) => {
5872
- let i = e.files[cc(t)];
5906
+ let i = e.files[uc(t)];
5873
5907
  if (!i) return Y({
5874
5908
  code: "NOT_FOUND",
5875
5909
  path: t,
@@ -5898,9 +5932,9 @@ function fc(e) {
5898
5932
  hint: "jsonString=true 要求 content 是合法 JSON;检查引号/逗号/括号配对;或省略 jsonString 写纯文本"
5899
5933
  });
5900
5934
  }
5901
- return e.files[cc(t)] = {
5935
+ return e.files[uc(t)] = {
5902
5936
  content: n,
5903
- updatedAt: uc()
5937
+ updatedAt: fc()
5904
5938
  }, `已写入 ${t}(${n.length} 字符)${r ? "(JSON 校验通过)" : ""}`;
5905
5939
  }, {
5906
5940
  name: "vfs_write",
@@ -5912,7 +5946,7 @@ function fc(e) {
5912
5946
  })
5913
5947
  }),
5914
5948
  r(async ({ path: t, oldString: n, newString: r }) => {
5915
- let i = cc(t), a = e.files[i];
5949
+ let i = uc(t), a = e.files[i];
5916
5950
  if (!a) return Y({
5917
5951
  code: "NOT_FOUND",
5918
5952
  path: t,
@@ -5942,7 +5976,7 @@ function fc(e) {
5942
5976
  }
5943
5977
  return e.files[i] = {
5944
5978
  content: a.content.replace(n, r),
5945
- updatedAt: uc()
5979
+ updatedAt: fc()
5946
5980
  }, `已替换 ${t} 中 1 处。`;
5947
5981
  }, {
5948
5982
  name: "vfs_edit",
@@ -5964,7 +5998,7 @@ function fc(e) {
5964
5998
  r(async ({ pattern: t }) => {
5965
5999
  let n;
5966
6000
  try {
5967
- n = lc(t);
6001
+ n = dc(t);
5968
6002
  } catch (e) {
5969
6003
  return Y({
5970
6004
  code: "GLOB_INVALID",
@@ -5993,7 +6027,7 @@ function fc(e) {
5993
6027
  details: { pattern: t }
5994
6028
  });
5995
6029
  }
5996
- let i = n ? [cc(n)] : Object.keys(e.files), a = [];
6030
+ let i = n ? [uc(n)] : Object.keys(e.files), a = [];
5997
6031
  for (let t of i) {
5998
6032
  let n = e.files[t];
5999
6033
  n && n.content.split("\n").forEach((e, n) => {
@@ -6010,7 +6044,7 @@ function fc(e) {
6010
6044
  })
6011
6045
  }),
6012
6046
  r(async ({ path: t, jsonPath: n }) => {
6013
- let r = cc(t), i = e.files[r];
6047
+ let r = uc(t), i = e.files[r];
6014
6048
  if (!i) return Y({
6015
6049
  code: "NOT_FOUND",
6016
6050
  path: t,
@@ -6047,7 +6081,7 @@ function fc(e) {
6047
6081
  })
6048
6082
  }),
6049
6083
  r(async ({ path: t, patches: n }) => {
6050
- let r = cc(t), i = e.files[r];
6084
+ let r = uc(t), i = e.files[r];
6051
6085
  if (!i) return Y({
6052
6086
  code: "NOT_FOUND",
6053
6087
  path: t,
@@ -6080,7 +6114,7 @@ function fc(e) {
6080
6114
  let c = JSON.stringify(o);
6081
6115
  return e.files[r] = {
6082
6116
  content: c,
6083
- updatedAt: uc()
6117
+ updatedAt: fc()
6084
6118
  }, `已对 ${t} 应用 ${n.length} 个 patch(影响 ${s.length} 处:${s.join(", ")}),文件现 ${c.length} 字符`;
6085
6119
  }, {
6086
6120
  name: "vfs_json_patch",
@@ -6100,7 +6134,7 @@ function fc(e) {
6100
6134
  })
6101
6135
  }),
6102
6136
  r(async ({ path: t }) => {
6103
- let n = cc(t);
6137
+ let n = uc(t);
6104
6138
  return e.files[n] ? (delete e.files[n], `已删除 ${t}`) : Y({
6105
6139
  code: "NOT_FOUND",
6106
6140
  path: t,
@@ -6114,17 +6148,17 @@ function fc(e) {
6114
6148
  })
6115
6149
  ];
6116
6150
  }
6117
- function pc(e) {
6151
+ function hc(e) {
6118
6152
  return {
6119
6153
  name: "vfs",
6120
- tools: fc(e),
6154
+ tools: mc(e),
6121
6155
  beforeAgent: () => ({ files: e.files })
6122
6156
  };
6123
6157
  }
6124
6158
  //#endregion
6125
6159
  //#region src/core/sdk/codeAssetMiddleware.ts
6126
- var mc = "__pgTouched", hc = "__pgFinalText", gc = "__pgNotes", _c = 200;
6127
- function vc(e) {
6160
+ var gc = "__pgTouched", _c = "__pgFinalText", vc = "__pgNotes", yc = 200;
6161
+ function bc(e) {
6128
6162
  let t = [];
6129
6163
  for (let n of e.split("\n")) {
6130
6164
  let e = n.match(/^\s*[-*]?\s*\[note\]\s*(.*)$/i);
@@ -6132,16 +6166,16 @@ function vc(e) {
6132
6166
  }
6133
6167
  return [...new Set(t)];
6134
6168
  }
6135
- function yc(e, t) {
6136
- let n = Array.isArray(e[gc]) ? e[gc].filter((e) => typeof e == "string") : [];
6137
- e[gc] = [.../* @__PURE__ */ new Set([...n, ...t])].map((e) => e.length > _c ? e.slice(0, _c) + "…" : e).slice(-5);
6169
+ function xc(e, t) {
6170
+ let n = Array.isArray(e[vc]) ? e[vc].filter((e) => typeof e == "string") : [];
6171
+ e[vc] = [.../* @__PURE__ */ new Set([...n, ...t])].map((e) => e.length > yc ? e.slice(0, yc) + "…" : e).slice(-5);
6138
6172
  }
6139
- function bc(e, t) {
6173
+ function Sc(e, t) {
6140
6174
  if (!e.startsWith(t)) return null;
6141
6175
  let n = e.slice(t.length), r = n.lastIndexOf(".");
6142
6176
  return (r > 0 ? n.slice(0, r) : r === 0 ? "" : n) || null;
6143
6177
  }
6144
- function xc(e, t, n) {
6178
+ function Cc(e, t, n) {
6145
6179
  if (!(!e || typeof e != "object")) for (let r of t) {
6146
6180
  let t = Z(e, r);
6147
6181
  if (Array.isArray(t)) for (let e = 0; e < t.length; e++) {
@@ -6150,7 +6184,7 @@ function xc(e, t, n) {
6150
6184
  }
6151
6185
  }
6152
6186
  }
6153
- function Sc(e, t, n) {
6187
+ function wc(e, t, n) {
6154
6188
  let r = /* @__PURE__ */ new Set();
6155
6189
  if (!e || typeof e != "object") return r;
6156
6190
  for (let i of t) {
@@ -6169,13 +6203,13 @@ function Sc(e, t, n) {
6169
6203
  }
6170
6204
  return r;
6171
6205
  }
6172
- function Cc(e) {
6206
+ function Tc(e) {
6173
6207
  let { writablePaths: t, codeVfsPrefix: n, ext: r, codeField: i = "code", onWarning: a, getController: o, vfsStore: s, craftNotes: c = !0 } = e;
6174
6208
  return {
6175
6209
  name: "code-asset-checkout-commit",
6176
6210
  beforeAgent: (e) => {
6177
6211
  let c = o()?.get?.().bind, l = 0, u = 0;
6178
- if (xc(c, t, (e) => {
6212
+ if (Cc(c, t, (e) => {
6179
6213
  l++;
6180
6214
  let t = Z(e, i);
6181
6215
  if (typeof t == "string") {
@@ -6199,21 +6233,21 @@ function Cc(e) {
6199
6233
  }
6200
6234
  return {
6201
6235
  files: s.files,
6202
- [mc]: /* @__PURE__ */ new Set(),
6203
- [hc]: { text: "" }
6236
+ [gc]: /* @__PURE__ */ new Set(),
6237
+ [_c]: { text: "" }
6204
6238
  };
6205
6239
  },
6206
6240
  wrapModelCall: async (e, t) => {
6207
- let n = await t(e), r = e.state[hc];
6241
+ let n = await t(e), r = e.state[_c];
6208
6242
  return r && !(n.toolCalls && n.toolCalls.length) && typeof n.content == "string" && n.content && (r.text = n.content), n;
6209
6243
  },
6210
6244
  augmentPrompt: () => {
6211
6245
  let e = o()?.get?.().bind, i = [], a = 0;
6212
- if (xc(e, t, (e, t, o) => {
6246
+ if (Cc(e, t, (e, t, o) => {
6213
6247
  a++;
6214
6248
  let l = typeof e.name == "string" && e.name ? e.name : "", u = l ? `${l} [${o}]` : `(未命名 [${o}])`, d = `${n}${e.__pgId}.${r}`, f = !!s.files[d];
6215
6249
  if (i.push(`- ${u} → ${d}${f ? "" : "(尚未检出,先 vfs_write 创建)"}`), c) {
6216
- let t = Array.isArray(e[gc]) ? e[gc].filter((e) => typeof e == "string") : [];
6250
+ let t = Array.isArray(e[vc]) ? e[vc].filter((e) => typeof e == "string") : [];
6217
6251
  if (t.length) {
6218
6252
  let e = t[t.length - 1];
6219
6253
  i.push(` 📝 笔记×${t.length}(最近):${e.length > 120 ? e.slice(0, 120) + "…" : e}`);
@@ -6231,13 +6265,13 @@ function Cc(e) {
6231
6265
  return `## 组件代码文件地图(改组件时按 name 直接改对应 vfs 文件;框架自动 checkout/commit)${c ? "\n📝 笔记 = 前任维护者交接(设计决策/用户反馈/踩坑),改该组件时遵循" : ""}\n${i.join("\n")}${l}`;
6232
6266
  },
6233
6267
  wrapToolCall: async (e, i) => {
6234
- let a = e.name === "vfs_write" || e.name === "vfs_edit" || e.name === "vfs_rm" ? e.args?.path : void 0, s = typeof a == "string" ? cc(a) : void 0, c = typeof s == "string" && s.startsWith(n);
6268
+ let a = e.name === "vfs_write" || e.name === "vfs_edit" || e.name === "vfs_rm" ? e.args?.path : void 0, s = typeof a == "string" ? uc(a) : void 0, c = typeof s == "string" && s.startsWith(n);
6235
6269
  if (c) {
6236
6270
  let i = e.state.focuses;
6237
6271
  if (i && i.length) {
6238
- let e = Sc(o()?.get?.().bind, t, i);
6272
+ let e = wc(o()?.get?.().bind, t, i);
6239
6273
  if (e.size) {
6240
- let t = bc(s, n);
6274
+ let t = Sc(s, n);
6241
6275
  if (t && !e.has(t)) return {
6242
6276
  content: `PATH_DENIED · vfs 越界:当前聚焦代码文件 [${[...e].map((e) => `${n}${e}.${r}`).join(", ")}],你要改的 "${s}" 不在其中。请只改焦点组件的代码文件;如需改其他组件,请让主 agent clear_focus / 换焦点后重试。`,
6243
6277
  status: "error"
@@ -6247,7 +6281,7 @@ function Cc(e) {
6247
6281
  }
6248
6282
  let l = await i(e);
6249
6283
  if (c) {
6250
- let t = e.state[mc];
6284
+ let t = e.state[gc];
6251
6285
  t && t.add(s);
6252
6286
  }
6253
6287
  return l;
@@ -6255,10 +6289,10 @@ function Cc(e) {
6255
6289
  afterAgent: (e) => {
6256
6290
  let a = o(), l = a?.get?.().bind;
6257
6291
  if (!l) return;
6258
- let u = e[mc] ?? /* @__PURE__ */ new Set();
6292
+ let u = e[gc] ?? /* @__PURE__ */ new Set();
6259
6293
  if (u.size) {
6260
6294
  let e = /* @__PURE__ */ new Set();
6261
- xc(l, t, (t) => {
6295
+ Cc(l, t, (t) => {
6262
6296
  let a = t.__pgId;
6263
6297
  e.add(a);
6264
6298
  let o = `${n}${a}.${r}`;
@@ -6275,22 +6309,22 @@ function Cc(e) {
6275
6309
  }
6276
6310
  });
6277
6311
  for (let t of u) {
6278
- let r = bc(t, n);
6312
+ let r = Sc(t, n);
6279
6313
  r && !e.has(r) && delete s.files[t];
6280
6314
  }
6281
6315
  a?.markDataDirty?.(), a?.recomputeBaseline?.();
6282
6316
  }
6283
6317
  if (!c) return;
6284
- let d = vc(e[hc]?.text ?? "");
6318
+ let d = bc(e[_c]?.text ?? "");
6285
6319
  if (!d.length) return;
6286
6320
  let f = [];
6287
- if (xc(l, t, (e) => {
6321
+ if (Cc(l, t, (e) => {
6288
6322
  (u.size === 0 || u.has(`${n}${e.__pgId}.${r}`)) && f.push(e);
6289
6323
  }), !f.length) return;
6290
6324
  let p = !1;
6291
6325
  for (let e of d) {
6292
6326
  let t = f.length === 1 ? f[0] : f.find((t) => typeof t.name == "string" && !!t.name && e.includes(t.name));
6293
- t && (yc(t, [e]), p = !0);
6327
+ t && (xc(t, [e]), p = !0);
6294
6328
  }
6295
6329
  p && a?.markDataDirty?.();
6296
6330
  }
@@ -6298,7 +6332,7 @@ function Cc(e) {
6298
6332
  }
6299
6333
  //#endregion
6300
6334
  //#region src/core/sdk/defineTool.ts
6301
- function wc(e) {
6335
+ function Ec(e) {
6302
6336
  return r(async (t) => {
6303
6337
  let n = await e.handler(t);
6304
6338
  return typeof n == "string" ? n : JSON.stringify(n);
@@ -6310,7 +6344,7 @@ function wc(e) {
6310
6344
  }
6311
6345
  //#endregion
6312
6346
  //#region src/core/sdk/inspectContextTool.ts
6313
- var Tc = t.object({
6347
+ var Dc = t.object({
6314
6348
  path: t.string().optional().describe("分类 key 过滤(如 toolResults/history/systemPrompt/dataHint);不传=全部分类"),
6315
6349
  role: t.enum([
6316
6350
  "user",
@@ -6320,14 +6354,14 @@ var Tc = t.object({
6320
6354
  ]).optional().describe("聚焦每轮首句的角色(assistant→回复摘要,user→问题摘要);不影响工具列表"),
6321
6355
  limit: t.number().int().min(1).max(50).optional().describe("返回最近 N 轮(默认全部;超 50 自动截最近 50 防返回过大)")
6322
6356
  });
6323
- function Ec(e) {
6324
- return wc({
6357
+ function Oc(e) {
6358
+ return Ec({
6325
6359
  name: "inspect_context",
6326
6360
  description: "查看当前对话上下文的构成(供压缩决策)。返回:totalTokens(历史轮次 token 总和,与触发判断同口径)、occupancy(窗口占用比)、contextWindow、categories(分类占用)、rounds(每轮 token/工具/首句)。先调用本工具查看构成,再决定压缩策略。",
6327
- schema: Tc,
6361
+ schema: Dc,
6328
6362
  handler: (t) => {
6329
- let n = es(e.getMessages()), r = n.length > 50 ? n.slice(n.length - 50) : n, i = (t.limit && r.length > t.limit ? r.slice(r.length - t.limit) : r).map((e) => {
6330
- let n = fs(e), r = ns(e), i = t.role === "assistant" ? e.assistantMsgs[0] ?? e.userMsg : e.userMsg, a = ts(typeof i.content == "string" ? i.content : "", 60);
6363
+ let n = ns(e.getMessages()), r = n.length > 50 ? n.slice(n.length - 50) : n, i = (t.limit && r.length > t.limit ? r.slice(r.length - t.limit) : r).map((e) => {
6364
+ let n = ms(e), r = is(e), i = t.role === "assistant" ? e.assistantMsgs[0] ?? e.userMsg : e.userMsg, a = rs(typeof i.content == "string" ? i.content : "", 60);
6331
6365
  return {
6332
6366
  round: e.round,
6333
6367
  tokens: n,
@@ -6347,7 +6381,7 @@ function Ec(e) {
6347
6381
  }
6348
6382
  //#endregion
6349
6383
  //#region src/core/sdk/compressDecision.ts
6350
- var Dc = t.object({
6384
+ var kc = t.object({
6351
6385
  keepRounds: t.number().int().min(0).max(50).optional(),
6352
6386
  windowRatio: t.number().min(0).max(1).optional(),
6353
6387
  summarize: t.object({ mode: t.enum(["index", "llm"]) }),
@@ -6357,23 +6391,23 @@ var Dc = t.object({
6357
6391
  }).refine((e) => e.keepRounds !== void 0 || e.windowRatio !== void 0, { message: "keepRounds 与 windowRatio 至少填一个(按当前触发模式)" });
6358
6392
  //#endregion
6359
6393
  //#region src/core/sdk/llmResolver.ts
6360
- function Oc(e) {
6394
+ function Ac(e) {
6361
6395
  let t = e.find((e) => e.role === "user");
6362
6396
  if (!t) return;
6363
6397
  let n = t.content, r = (typeof n == "string" ? n : Array.isArray(n) ? n.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(n ?? "")).trim().replace(/[\n\r]+/g, " ");
6364
6398
  if (r) return r.length > 30 ? r.slice(0, 30) + "…" : r;
6365
6399
  }
6366
- function kc(e) {
6400
+ function jc(e) {
6367
6401
  return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
6368
6402
  }
6369
- function Ac(e) {
6403
+ function Mc(e) {
6370
6404
  let t = e.content;
6371
6405
  return typeof t == "string" ? t : Array.isArray(t) ? t.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(t ?? "");
6372
6406
  }
6373
- function jc(e) {
6407
+ function Nc(e) {
6374
6408
  let t = e.summaryLlm ?? e.llm;
6375
6409
  if (!t) return;
6376
- let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, i = e.summaryTimeoutMs ?? 15e3, s = kc(t) ? t : null, c = kc(t) ? null : t;
6410
+ let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, i = e.summaryTimeoutMs ?? 15e3, s = jc(t) ? t : null, c = jc(t) ? null : t;
6377
6411
  if (c && !c.apiKey) {
6378
6412
  e.summaryLlm && console.warn("[page-agent-sdk][summarization] summaryLlm 已配置但缺 apiKey,摘要回退主 agent 模型或零成本索引摘要");
6379
6413
  return;
@@ -6385,16 +6419,16 @@ function jc(e) {
6385
6419
  return !l && c && (l = await p(c, {
6386
6420
  temperature: n,
6387
6421
  maxTokens: r
6388
- })), Ac(await l.invoke([new o("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new a(e)], { signal: t.signal })).trim();
6422
+ })), Mc(await l.invoke([new o("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new a(e)], { signal: t.signal })).trim();
6389
6423
  } finally {
6390
6424
  clearTimeout(s);
6391
6425
  }
6392
6426
  };
6393
6427
  }
6394
- function Mc(e) {
6428
+ function Pc(e) {
6395
6429
  let t = e.titleLlm ?? e.summaryLlm ?? e.llm;
6396
6430
  if (!t) return;
6397
- let n = kc(t) ? t : null, r = kc(t) ? null : t;
6431
+ let n = jc(t) ? t : null, r = jc(t) ? null : t;
6398
6432
  if (r && !r.apiKey) return;
6399
6433
  let i = n;
6400
6434
  return async (e) => {
@@ -6403,7 +6437,7 @@ function Mc(e) {
6403
6437
  return !i && r && (i = await p(r, {
6404
6438
  temperature: 0,
6405
6439
  maxTokens: 30
6406
- })), Ac(await i.invoke([new o("根据以下对话的主旨,生成一个简短的中文标题(不超过15个字,不要标点和引号,直接输出标题文字)。"), new a(t)], { signal: n.signal })).trim().replace(/^["'""「『]|["'""」』]$/g, "").split("\n")[0].slice(0, 20);
6440
+ })), Mc(await i.invoke([new o("根据以下对话的主旨,生成一个简短的中文标题(不超过15个字,不要标点和引号,直接输出标题文字)。"), new a(t)], { signal: n.signal })).trim().replace(/^["'""「『]|["'""」』]$/g, "").split("\n")[0].slice(0, 20);
6407
6441
  } catch {
6408
6442
  return "";
6409
6443
  } finally {
@@ -6411,10 +6445,10 @@ function Mc(e) {
6411
6445
  }
6412
6446
  };
6413
6447
  }
6414
- function Nc() {
6448
+ function Fc() {
6415
6449
  return `call_dec_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
6416
6450
  }
6417
- function Pc(e) {
6451
+ function Ic(e) {
6418
6452
  let t = e.match(/```(?:json)?\s*([\s\S]*?)```/), n = t ? t[1] : e, r = n.indexOf("{"), i = n.lastIndexOf("}");
6419
6453
  if (r < 0 || i < 0 || i <= r) return null;
6420
6454
  try {
@@ -6423,21 +6457,21 @@ function Pc(e) {
6423
6457
  return null;
6424
6458
  }
6425
6459
  }
6426
- function Fc(e) {
6460
+ function Lc(e) {
6427
6461
  if (!e) return null;
6428
- let t = Pc(e);
6462
+ let t = Ic(e);
6429
6463
  if (t == null) return null;
6430
- let n = Dc.safeParse(t);
6464
+ let n = kc.safeParse(t);
6431
6465
  return n.success ? n.data : null;
6432
6466
  }
6433
- async function Ic(e, t, n, r) {
6467
+ async function Rc(e, t, n, r) {
6434
6468
  let i = [...n];
6435
6469
  for (let n = 0; n < 3; n++) {
6436
6470
  let n = await e.invoke(i, { signal: r }), a = n?.tool_calls ?? [];
6437
- if (!a.length) return Ac(n).trim();
6471
+ if (!a.length) return Mc(n).trim();
6438
6472
  i = [...i, n];
6439
6473
  for (let e of a) {
6440
- let n = e.id ?? Nc();
6474
+ let n = e.id ?? Fc();
6441
6475
  try {
6442
6476
  let r = await t.invoke(e.args ?? {}), a = typeof r == "string" ? r : r?.content ?? JSON.stringify(r);
6443
6477
  i = [...i, new s({
@@ -6454,10 +6488,10 @@ async function Ic(e, t, n, r) {
6454
6488
  }
6455
6489
  return "";
6456
6490
  }
6457
- function Lc(e) {
6491
+ function zc(e) {
6458
6492
  let t = e.summaryLlm ?? e.llm;
6459
6493
  if (!t) return;
6460
- let n = kc(t) ? t : null, r = kc(t) ? null : t;
6494
+ let n = jc(t) ? t : null, r = jc(t) ? null : t;
6461
6495
  if (r && !r.apiKey) return;
6462
6496
  let i = e.decisionTimeoutMs ?? 6e3, s = e.decisionMaxTokens ?? 2048, c = n;
6463
6497
  return async (e) => {
@@ -6469,12 +6503,12 @@ function Lc(e) {
6469
6503
  }));
6470
6504
  let n = c;
6471
6505
  if (typeof n.bindTools != "function") return null;
6472
- let i = Ec({
6506
+ let i = Oc({
6473
6507
  getMessages: e.getMessages,
6474
6508
  getSnapshot: e.getSnapshot,
6475
6509
  contextWindow: e.contextWindow
6476
6510
  }), l = n.bindTools([i]), u = e.triggerMode === "token" ? "token 模式:必填 windowRatio(0~1 保留窗口预算比例,如 0.4);keepRounds 可选" : "轮数模式:必填 keepRounds(保留最近几轮,如 6);windowRatio 可选", d = [new o(`你是对话历史压缩决策助手。当前触发模式 = ${e.triggerMode}(${e.triggerReason})。先调用 inspect_context 查看上下文构成,再输出压缩决策 JSON。${u}。仅输出 JSON,不要多余文字/markdown。schema:{keepRounds?(int 0-50), windowRatio?(0-1), summarize:{mode:"index"|"llm"}, recallTopK?(int 0-10), preserveTools?(string[]≤10), reason?(≤200字)}。keepRounds/windowRatio 至少填一个。`), new a(`触发原因:${e.triggerReason}\n上下文窗口:${e.contextWindow ?? "未知"} tokens\n阈值比例:${e.thresholdRatio ?? "未知"}\n\n请决策压缩策略(先 inspect_context 查看,再输出 JSON)。`)];
6477
- return Fc(await Ic(l, i, d, t.signal)) || Fc(await Ic(l, i, [...d, new a("上一次输出无效(JSON 解析失败或 schema 校验不通过)。请只输出符合 schema 的压缩决策 JSON,不要多余文字/markdown 代码块。")], t.signal));
6511
+ return Lc(await Rc(l, i, d, t.signal)) || Lc(await Rc(l, i, [...d, new a("上一次输出无效(JSON 解析失败或 schema 校验不通过)。请只输出符合 schema 的压缩决策 JSON,不要多余文字/markdown 代码块。")], t.signal));
6478
6512
  } catch {
6479
6513
  return null;
6480
6514
  } finally {
@@ -6482,22 +6516,22 @@ function Lc(e) {
6482
6516
  }
6483
6517
  };
6484
6518
  }
6485
- function Rc(e) {
6486
- let t = e.llm, n = kc(e.llm) ? void 0 : e.llm;
6519
+ function Bc(e) {
6520
+ let t = e.llm, n = jc(e.llm) ? void 0 : e.llm;
6487
6521
  return {
6488
6522
  modelCaps: ii({
6489
6523
  model: n?.model ?? t?.model ?? t?.modelName,
6490
6524
  contextWindow: e.contextWindow ?? n?.contextWindow ?? t?.contextWindow,
6491
6525
  maxOutputTokens: e.maxOutputTokens ?? n?.maxOutputTokens ?? t?.maxOutputTokens
6492
6526
  }),
6493
- summaryLlmInvoke: jc(e),
6494
- titleLlmInvoke: Mc(e),
6495
- compressDecisionInvoke: Lc(e)
6527
+ summaryLlmInvoke: Nc(e),
6528
+ titleLlmInvoke: Pc(e),
6529
+ compressDecisionInvoke: zc(e)
6496
6530
  };
6497
6531
  }
6498
6532
  //#endregion
6499
6533
  //#region src/core/sdk/conflictManager.ts
6500
- function zc(e) {
6534
+ function Vc(e) {
6501
6535
  let t = /* @__PURE__ */ kt(null), n = 0;
6502
6536
  function r(r) {
6503
6537
  return new Promise((i) => {
@@ -6528,7 +6562,7 @@ function zc(e) {
6528
6562
  }
6529
6563
  //#endregion
6530
6564
  //#region src/core/utils/id.ts
6531
- function Bc() {
6565
+ function Hc() {
6532
6566
  try {
6533
6567
  if (typeof crypto < "u" && typeof crypto.randomUUID == "function") return crypto.randomUUID();
6534
6568
  } catch {}
@@ -6536,7 +6570,7 @@ function Bc() {
6536
6570
  }
6537
6571
  //#endregion
6538
6572
  //#region src/core/backends/storage.ts
6539
- var Vc = "chat-sdk", Hc = 50 * 1024 * 1024, Uc = 4 * 1024 * 1024, Wc = 10 * 1024 * 1024, Gc = .9, Kc = 500, qc = 300, Jc = "__meta__", Yc = "v:1", Xc = [
6573
+ var Uc = "chat-sdk", Wc = 50 * 1024 * 1024, Gc = 4 * 1024 * 1024, Kc = 10 * 1024 * 1024, qc = .9, Jc = 500, Yc = 300, Xc = "__meta__", Zc = "v:1", Qc = [
6540
6574
  "messages",
6541
6575
  "vfs",
6542
6576
  "todos",
@@ -6547,51 +6581,51 @@ var Vc = "chat-sdk", Hc = 50 * 1024 * 1024, Uc = 4 * 1024 * 1024, Wc = 10 * 1024
6547
6581
  "workingMemory",
6548
6582
  "focus"
6549
6583
  ];
6550
- function Zc(e) {
6551
- return e === "local" || e === "session" ? Uc : Hc;
6584
+ function $c(e) {
6585
+ return e === "local" || e === "session" ? Gc : Wc;
6552
6586
  }
6553
- function Qc(e) {
6587
+ function el(e) {
6554
6588
  if (typeof e != "object" || !e) return !1;
6555
6589
  let t = e;
6556
6590
  return t.name === "QuotaExceededError" || t.name === "NS_ERROR_DOM_QUOTA_REACHED" || t.code === 22 || t.code === 1014;
6557
6591
  }
6558
- function $c(e, t, n, r) {
6592
+ function tl(e, t, n, r) {
6559
6593
  return [
6560
- Yc,
6594
+ Zc,
6561
6595
  e,
6562
6596
  t,
6563
6597
  n,
6564
6598
  r
6565
6599
  ].join("::");
6566
6600
  }
6567
- function el(e, t, n) {
6601
+ function nl(e, t, n) {
6568
6602
  return [
6569
- Yc,
6603
+ Zc,
6570
6604
  e,
6571
6605
  t,
6572
6606
  n
6573
6607
  ].join("::") + "::";
6574
6608
  }
6575
- function tl(e, t) {
6609
+ function rl(e, t) {
6576
6610
  return [
6577
- Yc,
6611
+ Zc,
6578
6612
  e,
6579
6613
  t
6580
6614
  ].join("::") + "::";
6581
6615
  }
6582
- function nl(e) {
6583
- return [Yc, e].join("::") + "::";
6584
- }
6585
- var rl = null;
6586
6616
  function il(e) {
6587
- rl ||= new TextEncoder();
6617
+ return [Zc, e].join("::") + "::";
6618
+ }
6619
+ var al = null;
6620
+ function ol(e) {
6621
+ al ||= new TextEncoder();
6588
6622
  try {
6589
- return rl.encode(JSON.stringify(e)).length;
6623
+ return al.encode(JSON.stringify(e)).length;
6590
6624
  } catch {
6591
6625
  return 0;
6592
6626
  }
6593
6627
  }
6594
- function al(e, t, n) {
6628
+ function sl(e, t, n) {
6595
6629
  let r = e.reduce((e, t) => e + t.bytes, 0);
6596
6630
  if (r <= t) return [];
6597
6631
  let i = t * n, a = [...e].sort((e, t) => e.lastAccessed - t.lastAccessed), o = [];
@@ -6601,7 +6635,7 @@ function al(e, t, n) {
6601
6635
  }
6602
6636
  return o;
6603
6637
  }
6604
- function ol() {
6638
+ function cl() {
6605
6639
  let e = /* @__PURE__ */ new Map();
6606
6640
  return {
6607
6641
  async get(t) {
@@ -6621,7 +6655,7 @@ function ol() {
6621
6655
  }
6622
6656
  };
6623
6657
  }
6624
- function sl(e) {
6658
+ function ll(e) {
6625
6659
  return new Promise((t, n) => {
6626
6660
  if (typeof indexedDB > "u") {
6627
6661
  n(/* @__PURE__ */ Error("indexedDB 不可用"));
@@ -6682,7 +6716,7 @@ function sl(e) {
6682
6716
  }, r.onerror = () => n(r.error);
6683
6717
  });
6684
6718
  }
6685
- function cl(e) {
6719
+ function ul(e) {
6686
6720
  return {
6687
6721
  async get(t) {
6688
6722
  let n = e.getItem(t);
@@ -6727,12 +6761,12 @@ function cl(e) {
6727
6761
  }
6728
6762
  };
6729
6763
  }
6730
- function ll(e, t, n) {
6764
+ function dl(e, t, n) {
6731
6765
  let r = (e.get(t) ?? Promise.resolve()).then(n, n);
6732
6766
  return e.set(t, r.then(() => void 0, () => void 0)), r;
6733
6767
  }
6734
- function ul(e = {}) {
6735
- let t = e.dbName ?? Vc, n = e.backend ?? "indexed", r = e.maxBytes ?? Zc(n), i = e.maxBytesPerSession ?? Wc, a = e.evictionWatermark ?? Gc, o = e.debounceMs ?? Kc, s = /* @__PURE__ */ new Set();
6768
+ function fl(e = {}) {
6769
+ let t = e.dbName ?? Uc, n = e.backend ?? "indexed", r = e.maxBytes ?? $c(n), i = e.maxBytesPerSession ?? Kc, a = e.evictionWatermark ?? qc, o = e.debounceMs ?? Jc, s = /* @__PURE__ */ new Set();
6736
6770
  function c(e) {
6737
6771
  for (let t of s) try {
6738
6772
  t(e);
@@ -6745,16 +6779,16 @@ function ul(e = {}) {
6745
6779
  try {
6746
6780
  if (n === "indexed") {
6747
6781
  if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
6748
- l = await sl(t), d(!0);
6782
+ l = await ll(t), d(!0);
6749
6783
  } else if (n === "session") {
6750
6784
  if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
6751
- l = cl(sessionStorage), d(!0);
6785
+ l = ul(sessionStorage), d(!0);
6752
6786
  } else if (n === "local") {
6753
6787
  if (typeof localStorage > "u") throw Error("localStorage 不可用");
6754
- l = cl(localStorage), d(!0);
6755
- } else l = ol(), d(!1);
6788
+ l = ul(localStorage), d(!0);
6789
+ } else l = cl(), d(!1);
6756
6790
  } catch (e) {
6757
- l = ol();
6791
+ l = cl();
6758
6792
  let t = e instanceof Error ? e.message : String(e);
6759
6793
  d(!1), Promise.resolve().then(() => c({
6760
6794
  type: "degraded",
@@ -6764,10 +6798,10 @@ function ul(e = {}) {
6764
6798
  })();
6765
6799
  let p = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map();
6766
6800
  function g(e, n, r, a) {
6767
- let o = $c(t, r, a, Jc);
6768
- return ll(h, o, async () => {
6801
+ let o = tl(t, r, a, Xc);
6802
+ return dl(h, o, async () => {
6769
6803
  let t = async () => {
6770
- let t = await l.get(o), s = await l.get(e), u = s == null ? 0 : il(s), d = il(n), f = (t?.bytes ?? 0) + (d - u);
6804
+ let t = await l.get(o), s = await l.get(e), u = s == null ? 0 : ol(s), d = ol(n), f = (t?.bytes ?? 0) + (d - u);
6771
6805
  if (f > i) {
6772
6806
  c({
6773
6807
  type: "quota",
@@ -6789,12 +6823,12 @@ function ul(e = {}) {
6789
6823
  try {
6790
6824
  await t();
6791
6825
  } catch (e) {
6792
- if (Qc(e) && !u) {
6826
+ if (el(e) && !u) {
6793
6827
  u = !0;
6794
6828
  try {
6795
6829
  await b();
6796
6830
  } catch {}
6797
- l = ol(), Promise.resolve().then(() => c({
6831
+ l = cl(), Promise.resolve().then(() => c({
6798
6832
  type: "degraded",
6799
6833
  reason: "存储配额超限(QuotaExceededError),已淘汰最旧会话并降级内存"
6800
6834
  }));
@@ -6806,7 +6840,7 @@ function ul(e = {}) {
6806
6840
  });
6807
6841
  }
6808
6842
  function _(e, n, r, i) {
6809
- let a = $c(t, e, n, r), s = p.get(a);
6843
+ let a = tl(t, e, n, r), s = p.get(a);
6810
6844
  s && s.resolve();
6811
6845
  let c = m.get(a);
6812
6846
  return c && clearTimeout(c), new Promise((t) => {
@@ -6833,15 +6867,15 @@ function ul(e = {}) {
6833
6867
  function y() {
6834
6868
  v ||= setTimeout(() => {
6835
6869
  v = null, b();
6836
- }, qc);
6870
+ }, Yc);
6837
6871
  }
6838
6872
  async function b() {
6839
6873
  let e = [];
6840
- await l.scan(nl(t), (t, n) => {
6874
+ await l.scan(il(t), (t, n) => {
6841
6875
  t.endsWith("::__meta__") && e.push(n);
6842
6876
  });
6843
- let n = al(e, r, a);
6844
- for (let e of n) await l.clearPrefix(el(t, e.agentId, e.sessionId)), c({
6877
+ let n = sl(e, r, a);
6878
+ for (let e of n) await l.clearPrefix(nl(t, e.agentId, e.sessionId)), c({
6845
6879
  type: "evicted",
6846
6880
  agentId: e.agentId,
6847
6881
  sessionId: e.sessionId,
@@ -6852,13 +6886,13 @@ function ul(e = {}) {
6852
6886
  ready: f,
6853
6887
  async listSessions(e) {
6854
6888
  let n = [];
6855
- return await l.scan(tl(t, e), (e, t) => {
6889
+ return await l.scan(rl(t, e), (e, t) => {
6856
6890
  e.endsWith("::__meta__") && n.push(t);
6857
6891
  }), n.sort((e, t) => t.lastAccessed - e.lastAccessed);
6858
6892
  },
6859
6893
  async load(e, n) {
6860
- let r = $c(t, e, n, Jc);
6861
- return await ll(h, r, async () => {
6894
+ let r = tl(t, e, n, Xc);
6895
+ return await dl(h, r, async () => {
6862
6896
  let i = await l.get(r);
6863
6897
  if (!i) return;
6864
6898
  let a = {
@@ -6867,8 +6901,8 @@ function ul(e = {}) {
6867
6901
  todos: [],
6868
6902
  memory: ""
6869
6903
  };
6870
- for (let r of Xc) {
6871
- let i = await l.get($c(t, e, n, r));
6904
+ for (let r of Qc) {
6905
+ let i = await l.get(tl(t, e, n, r));
6872
6906
  i != null && (a[r] = i);
6873
6907
  }
6874
6908
  return i.lastAccessed = Date.now(), await l.set(r, i), a;
@@ -6876,12 +6910,12 @@ function ul(e = {}) {
6876
6910
  },
6877
6911
  async save(e, t, n) {
6878
6912
  let r = [];
6879
- for (let i of Xc) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
6913
+ for (let i of Qc) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
6880
6914
  await Promise.all(r);
6881
6915
  },
6882
6916
  async updateTitle(e, n, r) {
6883
- let i = $c(t, e, n, Jc);
6884
- return ll(h, i, async () => {
6917
+ let i = tl(t, e, n, Xc);
6918
+ return dl(h, i, async () => {
6885
6919
  let e = await l.get(i);
6886
6920
  e && (e.title = r, e.lastAccessed = Date.now(), await l.set(i, e));
6887
6921
  });
@@ -6897,10 +6931,10 @@ function ul(e = {}) {
6897
6931
  })), c({ type: "flush" }), await b();
6898
6932
  },
6899
6933
  async deleteSession(e, n) {
6900
- await l.clearPrefix(el(t, e, n));
6934
+ await l.clearPrefix(nl(t, e, n));
6901
6935
  },
6902
6936
  async createSession(e, n, r) {
6903
- let i = r ?? Bc(), a = Date.now(), o = {
6937
+ let i = r ?? Hc(), a = Date.now(), o = {
6904
6938
  agentId: e,
6905
6939
  sessionId: i,
6906
6940
  createdAt: a,
@@ -6908,7 +6942,7 @@ function ul(e = {}) {
6908
6942
  bytes: 0,
6909
6943
  title: n
6910
6944
  };
6911
- return await l.set($c(t, e, i, Jc), o), i;
6945
+ return await l.set(tl(t, e, i, Xc), o), i;
6912
6946
  },
6913
6947
  onEvent(e) {
6914
6948
  s.add(e);
@@ -6923,15 +6957,15 @@ function ul(e = {}) {
6923
6957
  }
6924
6958
  //#endregion
6925
6959
  //#region src/core/sdk/optionsResolver.ts
6926
- function dl(e) {
6927
- return e === void 0 || e === !1 ? null : typeof e == "string" ? ul({ backend: e }) : e.enabled === !1 ? null : ul(e);
6960
+ function pl(e) {
6961
+ return e === void 0 || e === !1 ? null : typeof e == "string" ? fl({ backend: e }) : e.enabled === !1 ? null : fl(e);
6928
6962
  }
6929
- function fl(e) {
6963
+ function ml(e) {
6930
6964
  return e.dialog ?? {};
6931
6965
  }
6932
6966
  //#endregion
6933
6967
  //#region src/core/capabilities.ts
6934
- var pl = [
6968
+ var hl = [
6935
6969
  {
6936
6970
  name: "dataOps",
6937
6971
  defaultOn: !0
@@ -7020,13 +7054,13 @@ var pl = [
7020
7054
  requires: ["summarization"]
7021
7055
  }
7022
7056
  ];
7023
- function ml(e) {
7057
+ function gl(e) {
7024
7058
  let t = {};
7025
- for (let n of pl) {
7059
+ for (let n of hl) {
7026
7060
  let r = e?.[n.name];
7027
7061
  t[n.name] = n.defaultOn ? r !== !1 : r === !0;
7028
7062
  }
7029
- for (let e of pl) if (e.requires && t[e.name]) {
7063
+ for (let e of hl) if (e.requires && t[e.name]) {
7030
7064
  for (let n of e.requires) if (!t[n]) {
7031
7065
  t[e.name] = !1;
7032
7066
  break;
@@ -7036,7 +7070,7 @@ function ml(e) {
7036
7070
  }
7037
7071
  //#endregion
7038
7072
  //#region src/core/sdk/events.ts
7039
- function hl(e) {
7073
+ function _l(e) {
7040
7074
  let t = /* @__PURE__ */ new Set(), n = (n) => {
7041
7075
  if (n.type !== "approval_request") {
7042
7076
  if (e) try {
@@ -7062,7 +7096,7 @@ function hl(e) {
7062
7096
  }
7063
7097
  //#endregion
7064
7098
  //#region src/core/sdk/contextPreset.ts
7065
- var gl = {
7099
+ var vl = {
7066
7100
  auto: {
7067
7101
  summaryThresholdRatio: .5,
7068
7102
  windowRatio: .4,
@@ -7090,7 +7124,7 @@ var gl = {
7090
7124
  enableRecall: !0,
7091
7125
  enableLLMSummary: !0
7092
7126
  }
7093
- }, _l = {
7127
+ }, yl = {
7094
7128
  auto: ["describe_data", "read"],
7095
7129
  conservative: ["describe_data"],
7096
7130
  aggressive: ["describe_data", "read"],
@@ -7101,8 +7135,8 @@ var gl = {
7101
7135
  "search_data"
7102
7136
  ]
7103
7137
  };
7104
- function vl(e, t) {
7105
- let n = gl[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
7138
+ function bl(e, t) {
7139
+ let n = vl[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
7106
7140
  return {
7107
7141
  ...n,
7108
7142
  ...r,
@@ -7112,7 +7146,7 @@ function vl(e, t) {
7112
7146
  }
7113
7147
  //#endregion
7114
7148
  //#region src/core/sdk/middlewareStack.ts
7115
- var yl = {
7149
+ var xl = {
7116
7150
  dataHint: 10,
7117
7151
  usageHints: 20,
7118
7152
  todos: 30,
@@ -7129,17 +7163,17 @@ var yl = {
7129
7163
  subagents: 140,
7130
7164
  augmentSystem: 150
7131
7165
  };
7132
- function bl(e) {
7166
+ function Sl(e) {
7133
7167
  return e.map((e, t) => ({
7134
7168
  m: e,
7135
7169
  i: t,
7136
- p: yl[e.name] ?? Infinity
7170
+ p: xl[e.name] ?? Infinity
7137
7171
  })).sort((e, t) => e.p - t.p || e.i - t.i).map((e) => e.m);
7138
7172
  }
7139
7173
  //#endregion
7140
7174
  //#region src/core/tools/dataSlotQuery.ts
7141
- var xl = /[\w$-]/;
7142
- function Sl(e) {
7175
+ var Cl = /[\w$-]/;
7176
+ function wl(e) {
7143
7177
  let t = [], n = e.trim(), r = +(n[0] === "$");
7144
7178
  for (; r < n.length;) {
7145
7179
  let e = n[r];
@@ -7150,7 +7184,7 @@ function Sl(e) {
7150
7184
  continue;
7151
7185
  }
7152
7186
  let e = "";
7153
- for (; r < n.length && xl.test(n[r]);) e += n[r++];
7187
+ for (; r < n.length && Cl.test(n[r]);) e += n[r++];
7154
7188
  if (!e) throw Error("JSONPath: .. 后缺属性名");
7155
7189
  t.push({
7156
7190
  type: "descendKey",
@@ -7163,7 +7197,7 @@ function Sl(e) {
7163
7197
  continue;
7164
7198
  }
7165
7199
  let e = "";
7166
- for (; r < n.length && xl.test(n[r]);) e += n[r++];
7200
+ for (; r < n.length && Cl.test(n[r]);) e += n[r++];
7167
7201
  if (!e) throw Error("JSONPath: . 后缺属性名");
7168
7202
  t.push({
7169
7203
  type: "key",
@@ -7219,7 +7253,7 @@ function Sl(e) {
7219
7253
  }
7220
7254
  return t;
7221
7255
  }
7222
- function Cl(e) {
7256
+ function Tl(e) {
7223
7257
  let t = [], n = 0, r = e.trim();
7224
7258
  for (; n < r.length;) {
7225
7259
  let e = r[n];
@@ -7264,7 +7298,7 @@ function Cl(e) {
7264
7298
  }
7265
7299
  return t;
7266
7300
  }
7267
- var wl = class {
7301
+ var El = class {
7268
7302
  toks;
7269
7303
  item;
7270
7304
  pos = 0;
@@ -7300,12 +7334,12 @@ var wl = class {
7300
7334
  return this.next(), e;
7301
7335
  }
7302
7336
  let e = this.operand(), t = this.peek();
7303
- return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), Dl(t, e, this.operand())) : Tl(e);
7337
+ return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), kl(t, e, this.operand())) : Dl(e);
7304
7338
  }
7305
7339
  operand() {
7306
7340
  let e = this.next();
7307
7341
  if (e === void 0) throw Error("过滤表达式:缺操作数");
7308
- if (e.startsWith("@")) return El(e, this.item);
7342
+ if (e.startsWith("@")) return Ol(e, this.item);
7309
7343
  if (e[0] === "'" || e[0] === "\"") return e.slice(1, -1);
7310
7344
  if (e === "true") return !0;
7311
7345
  if (e === "false") return !1;
@@ -7315,10 +7349,10 @@ var wl = class {
7315
7349
  throw Error(`过滤表达式:未知操作数 '${e}'`);
7316
7350
  }
7317
7351
  };
7318
- function Tl(e) {
7352
+ function Dl(e) {
7319
7353
  return !!e && e !== 0 && e !== "" && e !== null;
7320
7354
  }
7321
- function El(e, t) {
7355
+ function Ol(e, t) {
7322
7356
  let n = e.split(".").filter((e) => e && e !== "@"), r = t;
7323
7357
  for (let e of n) {
7324
7358
  if (typeof r != "object" || !r) return;
@@ -7326,7 +7360,7 @@ function El(e, t) {
7326
7360
  }
7327
7361
  return r;
7328
7362
  }
7329
- function Dl(e, t, n) {
7363
+ function kl(e, t, n) {
7330
7364
  switch (e) {
7331
7365
  case "==": return t === n;
7332
7366
  case "!=": return t !== n;
@@ -7337,47 +7371,47 @@ function Dl(e, t, n) {
7337
7371
  default: return !1;
7338
7372
  }
7339
7373
  }
7340
- function Ol(e, t) {
7341
- return new wl(Cl(e), t).parse();
7374
+ function Al(e, t) {
7375
+ return new El(Tl(e), t).parse();
7342
7376
  }
7343
- function kl(e, t) {
7377
+ function jl(e, t) {
7344
7378
  return e ? `${e}.${t}` : String(t);
7345
7379
  }
7346
- function Al(e, t) {
7380
+ function Ml(e, t) {
7347
7381
  let n = [{
7348
7382
  path: "",
7349
7383
  value: e
7350
7384
  }];
7351
- for (let e of Sl(t)) {
7385
+ for (let e of wl(t)) {
7352
7386
  let t = [];
7353
7387
  if (e.type === "key") for (let r of n) r.value != null && typeof r.value == "object" && e.key in r.value && t.push({
7354
- path: kl(r.path, e.key),
7388
+ path: jl(r.path, e.key),
7355
7389
  value: r.value[e.key]
7356
7390
  });
7357
7391
  else if (e.type === "index") {
7358
7392
  for (let r of n) if (Array.isArray(r.value)) {
7359
7393
  let n = r.value[e.index];
7360
7394
  e.index >= 0 && e.index < r.value.length && t.push({
7361
- path: kl(r.path, e.index),
7395
+ path: jl(r.path, e.index),
7362
7396
  value: n,
7363
7397
  index: e.index
7364
7398
  });
7365
7399
  }
7366
7400
  } else if (e.type === "wildcard") {
7367
7401
  for (let e of n) if (Array.isArray(e.value)) e.value.forEach((n, r) => t.push({
7368
- path: kl(e.path, r),
7402
+ path: jl(e.path, r),
7369
7403
  value: n,
7370
7404
  index: r
7371
7405
  }));
7372
7406
  else if (e.value != null && typeof e.value == "object") for (let n of Object.keys(e.value)) t.push({
7373
- path: kl(e.path, n),
7407
+ path: jl(e.path, n),
7374
7408
  value: e.value[n]
7375
7409
  });
7376
7410
  } else if (e.type === "descendKey") {
7377
7411
  let r = e.key, i = (e) => {
7378
7412
  if (!(e.value == null || typeof e.value != "object")) for (let n of Object.keys(e.value)) {
7379
7413
  let a = {
7380
- path: kl(e.path, n),
7414
+ path: jl(e.path, n),
7381
7415
  value: e.value[n]
7382
7416
  };
7383
7417
  n === r && t.push(a), i(a);
@@ -7388,7 +7422,7 @@ function Al(e, t) {
7388
7422
  let e = (n) => {
7389
7423
  if (!(n.value == null || typeof n.value != "object")) for (let r of Object.keys(n.value)) {
7390
7424
  let i = {
7391
- path: kl(n.path, r),
7425
+ path: jl(n.path, r),
7392
7426
  value: n.value[r]
7393
7427
  };
7394
7428
  t.push(i), e(i);
@@ -7397,16 +7431,16 @@ function Al(e, t) {
7397
7431
  for (let t of n) e(t);
7398
7432
  } else if (e.type === "filter") {
7399
7433
  for (let r of n) if (Array.isArray(r.value)) r.value.forEach((n, i) => {
7400
- Ol(e.filter, n) && t.push({
7401
- path: kl(r.path, i),
7434
+ Al(e.filter, n) && t.push({
7435
+ path: jl(r.path, i),
7402
7436
  value: n,
7403
7437
  index: i
7404
7438
  });
7405
7439
  });
7406
7440
  else if (r.value != null && typeof r.value == "object") for (let n of Object.keys(r.value)) {
7407
7441
  let i = r.value[n];
7408
- Ol(e.filter, i) && t.push({
7409
- path: kl(r.path, n),
7442
+ Al(e.filter, i) && t.push({
7443
+ path: jl(r.path, n),
7410
7444
  value: i
7411
7445
  });
7412
7446
  }
@@ -7415,7 +7449,7 @@ function Al(e, t) {
7415
7449
  }
7416
7450
  return n;
7417
7451
  }
7418
- function jl(e, t) {
7452
+ function Nl(e, t) {
7419
7453
  let n = e.length, r = t.length;
7420
7454
  if (!n) return r;
7421
7455
  if (!r) return n;
@@ -7431,7 +7465,7 @@ function jl(e, t) {
7431
7465
  }
7432
7466
  return i[r];
7433
7467
  }
7434
- function Ml(e, t, n = {}) {
7468
+ function Pl(e, t, n = {}) {
7435
7469
  let r = n.mode || "substring", i = n.limit ?? 50, a = n.matchKey !== !1, o = [], s = null;
7436
7470
  if (r === "regex") try {
7437
7471
  s = new RegExp(t, "i");
@@ -7441,11 +7475,11 @@ function Ml(e, t, n = {}) {
7441
7475
  let c = (e, l, u) => {
7442
7476
  if (o.length >= i || e == null) return;
7443
7477
  if (typeof e == "object") {
7444
- if (Array.isArray(e)) e.forEach((e, t) => c(e, kl(l, t), String(t)));
7445
- else for (let t of Object.keys(e)) c(e[t], kl(l, t), t);
7478
+ if (Array.isArray(e)) e.forEach((e, t) => c(e, jl(l, t), String(t)));
7479
+ else for (let t of Object.keys(e)) c(e[t], jl(l, t), t);
7446
7480
  return;
7447
7481
  }
7448
- let d = String(e), f = Nl(d, t, r, n.fuzzyThreshold ?? 2, s);
7482
+ let d = String(e), f = Fl(d, t, r, n.fuzzyThreshold ?? 2, s);
7449
7483
  if (f) {
7450
7484
  o.push({
7451
7485
  path: l,
@@ -7456,7 +7490,7 @@ function Ml(e, t, n = {}) {
7456
7490
  return;
7457
7491
  }
7458
7492
  if (a && u) {
7459
- let e = Nl(u, t, r, n.fuzzyThreshold ?? 2, s);
7493
+ let e = Fl(u, t, r, n.fuzzyThreshold ?? 2, s);
7460
7494
  e && o.push({
7461
7495
  path: l,
7462
7496
  key: u,
@@ -7467,51 +7501,51 @@ function Ml(e, t, n = {}) {
7467
7501
  };
7468
7502
  return c(e, ""), o;
7469
7503
  }
7470
- function Nl(e, t, n, r, i) {
7504
+ function Fl(e, t, n, r, i) {
7471
7505
  let a = e.toLowerCase(), o = t.toLowerCase();
7472
7506
  if (n === "substring") return a.includes(o) ? 1 : null;
7473
7507
  if (n === "regex") return i && i.test(e) ? 1 : null;
7474
7508
  if (n === "fuzzy") {
7475
7509
  if (a.includes(o)) return 2;
7476
- let e = jl(a, o);
7510
+ let e = Nl(a, o);
7477
7511
  return e <= r ? r - e + 1 : null;
7478
7512
  }
7479
7513
  return null;
7480
7514
  }
7481
- function Pl(e, t, n = 3e3) {
7482
- return vo(t, n)(e);
7515
+ function Il(e, t, n = 3e3) {
7516
+ return bo(t, n)(e);
7483
7517
  }
7484
7518
  //#endregion
7485
7519
  //#region src/core/tools/resources.ts
7486
- var Fl = "⟦frozen:", Il = "⟦res:", Ll = "⟧";
7487
- function Rl(e) {
7488
- return `${Fl}${e}${Ll}`;
7520
+ var Ll = "⟦frozen:", Rl = "⟦res:", zl = "⟧";
7521
+ function Bl(e) {
7522
+ return `${Ll}${e}${zl}`;
7489
7523
  }
7490
- function zl(e) {
7491
- return `${Il}${e}${Ll}`;
7524
+ function Vl(e) {
7525
+ return `${Rl}${e}${zl}`;
7492
7526
  }
7493
- function Bl(e) {
7494
- return typeof e == "string" ? e.startsWith(Fl) && e.endsWith(Ll) ? {
7527
+ function Hl(e) {
7528
+ return typeof e == "string" ? e.startsWith(Ll) && e.endsWith(zl) ? {
7495
7529
  type: "frozen",
7496
7530
  path: e.slice(8, e.length - 1)
7497
- } : e.startsWith(Il) && e.endsWith(Ll) ? {
7531
+ } : e.startsWith(Rl) && e.endsWith(zl) ? {
7498
7532
  type: "res",
7499
7533
  handle: e.slice(5, e.length - 1)
7500
7534
  } : null : null;
7501
7535
  }
7502
- function Vl(e) {
7536
+ function Ul(e) {
7503
7537
  return String(e ?? "").trim().replace(/^\.+/, "");
7504
7538
  }
7505
- function Hl(e) {
7539
+ function Wl(e) {
7506
7540
  let t = 5381;
7507
7541
  for (let n = 0; n < e.length; n++) t = (t * 33 ^ e.charCodeAt(n)) >>> 0;
7508
7542
  return (t >>> 0).toString(16).padStart(8, "0").slice(0, 8);
7509
7543
  }
7510
- function Ul(e, t) {
7544
+ function Gl(e, t) {
7511
7545
  return e === t ? !0 : e && t && typeof e == "object" && typeof t == "object" ? JSON.stringify(e) === JSON.stringify(t) : !1;
7512
7546
  }
7513
- function Wl(e, t) {
7514
- let n = Vl(e);
7547
+ function Kl(e, t) {
7548
+ let n = Ul(e);
7515
7549
  if (!n) return;
7516
7550
  let r = t.get(n);
7517
7551
  if (r) return {
@@ -7531,7 +7565,7 @@ function Wl(e, t) {
7531
7565
  }));
7532
7566
  return i;
7533
7567
  }
7534
- var Gl = class {
7568
+ var ql = class {
7535
7569
  vfs;
7536
7570
  constructor(e) {
7537
7571
  this.vfs = e;
@@ -7540,7 +7574,7 @@ var Gl = class {
7540
7574
  return `resources/${e}.json`;
7541
7575
  }
7542
7576
  ensure(e, t, n) {
7543
- let r = Hl(e), i = {
7577
+ let r = Wl(e), i = {
7544
7578
  path: e,
7545
7579
  mode: n,
7546
7580
  value: t,
@@ -7552,7 +7586,7 @@ var Gl = class {
7552
7586
  }, r;
7553
7587
  }
7554
7588
  get(e) {
7555
- return this.readEntry(this.key(e)) || this.readEntry(this.key(Hl(e)));
7589
+ return this.readEntry(this.key(e)) || this.readEntry(this.key(Wl(e)));
7556
7590
  }
7557
7591
  readEntry(e) {
7558
7592
  let t = this.vfs.files[e];
@@ -7568,7 +7602,7 @@ var Gl = class {
7568
7602
  this.ensure(e, t, n?.mode ?? "verbatim");
7569
7603
  }
7570
7604
  delete(e) {
7571
- let t = this.get(e)?.handle ?? Hl(e), n = this.key(t), r = !!this.vfs.files[n];
7605
+ let t = this.get(e)?.handle ?? Wl(e), n = this.key(t), r = !!this.vfs.files[n];
7572
7606
  return r && delete this.vfs.files[n], r;
7573
7607
  }
7574
7608
  list() {
@@ -7588,7 +7622,7 @@ var Gl = class {
7588
7622
  for (let e of Object.keys(this.vfs.files)) e.startsWith("resources/") && delete this.vfs.files[e];
7589
7623
  }
7590
7624
  };
7591
- function Kl(e) {
7625
+ function Jl(e) {
7592
7626
  let { jp: t, resolved: n, resourcesByPath: r, resourceStore: i } = e;
7593
7627
  if (!r.size) return n;
7594
7628
  let a = !1;
@@ -7602,14 +7636,14 @@ function Kl(e) {
7602
7636
  if (t !== "" && e !== t && !e.startsWith(t + ".")) continue;
7603
7637
  if (e === t) {
7604
7638
  if (o === void 0) continue;
7605
- return n.mode === "freeze" ? Rl(e) : i ? zl(i.ensure(e, o, "verbatim")) : o;
7639
+ return n.mode === "freeze" ? Bl(e) : i ? Vl(i.ensure(e, o, "verbatim")) : o;
7606
7640
  }
7607
7641
  let r = t === "" ? e : e.slice(t.length + 1), a = Z(o, r);
7608
- a !== void 0 && (n.mode === "freeze" ? ka(o, r, Rl(e)) : i && ka(o, r, zl(i.ensure(e, a, "verbatim"))));
7642
+ a !== void 0 && (n.mode === "freeze" ? ka(o, r, Bl(e)) : i && ka(o, r, Vl(i.ensure(e, a, "verbatim"))));
7609
7643
  }
7610
7644
  return o;
7611
7645
  }
7612
- function ql(e, t, n, r) {
7646
+ function Yl(e, t, n, r) {
7613
7647
  if (!r) return {
7614
7648
  code: "RESOURCE_NOT_FOUND",
7615
7649
  message: `句柄 "${e}" 无法展开(资源池未启用)`,
@@ -7620,7 +7654,7 @@ function ql(e, t, n, r) {
7620
7654
  code: "RESOURCE_NOT_FOUND",
7621
7655
  message: `字段 "${t}" 在 bind 中已不存在,无法展开句柄 "${e}"`,
7622
7656
  hint: "该字段可能已被删除或 restore 到不含此字段的快照;重新 read 确认当前结构"
7623
- } : Ul(i.value, n) ? { value: i.value } : (r.update(t, n), { value: n }) : n === void 0 ? {
7657
+ } : Gl(i.value, n) ? { value: i.value } : (r.update(t, n), { value: n }) : n === void 0 ? {
7624
7658
  code: "RESOURCE_NOT_FOUND",
7625
7659
  message: `句柄 "${e}" 不存在(字段 "${t}" 可能未注册或已被删除)`,
7626
7660
  hint: "重新 read 该字段触发懒注册"
@@ -7630,7 +7664,7 @@ function ql(e, t, n, r) {
7630
7664
  hint: "重新 read 该字段触发懒注册重建句柄,再写回新句柄 ⟦res:<handle>⟧"
7631
7665
  };
7632
7666
  }
7633
- function Jl(e, t) {
7667
+ function Xl(e, t) {
7634
7668
  let n = t.getBind();
7635
7669
  for (let [r, i] of t.resourcesByPath) {
7636
7670
  let a = Z(n, r), o = Z(e, r);
@@ -7639,11 +7673,11 @@ function Jl(e, t) {
7639
7673
  continue;
7640
7674
  }
7641
7675
  if (i.mode === "freeze") {
7642
- if (o === Rl(r)) {
7676
+ if (o === Bl(r)) {
7643
7677
  ka(e, r, a);
7644
7678
  continue;
7645
7679
  }
7646
- if (!Ul(o, a)) return {
7680
+ if (!Gl(o, a)) return {
7647
7681
  ok: !1,
7648
7682
  code: "FROZEN_FIELD",
7649
7683
  path: r,
@@ -7651,9 +7685,9 @@ function Jl(e, t) {
7651
7685
  hint: "该字段由系统/集成方维护,LLM 不得改动。如需展示其值用 resource_get({path}) 取真值"
7652
7686
  };
7653
7687
  } else {
7654
- let n = Bl(o);
7688
+ let n = Hl(o);
7655
7689
  if (n && n.type === "res") {
7656
- let i = ql(n.handle, r, a, t.resourceStore);
7690
+ let i = Yl(n.handle, r, a, t.resourceStore);
7657
7691
  if ("value" in i) {
7658
7692
  ka(e, r, i.value);
7659
7693
  continue;
@@ -7666,7 +7700,7 @@ function Jl(e, t) {
7666
7700
  hint: i.hint
7667
7701
  };
7668
7702
  }
7669
- if (!Ul(o, a)) return {
7703
+ if (!Gl(o, a)) return {
7670
7704
  ok: !1,
7671
7705
  code: "VERBATIM_MISMATCH",
7672
7706
  path: r,
@@ -7677,7 +7711,7 @@ function Jl(e, t) {
7677
7711
  }
7678
7712
  return { ok: !0 };
7679
7713
  }
7680
- function Yl(e, t, n) {
7714
+ function Zl(e, t, n) {
7681
7715
  let r = t === void 0 ? e.message : `patches[${t}]${n ? ` @ "${n}"` : ""}: ${e.message}`;
7682
7716
  return Y({
7683
7717
  code: e.code,
@@ -7690,28 +7724,28 @@ function Yl(e, t, n) {
7690
7724
  } }
7691
7725
  });
7692
7726
  }
7693
- function Xl(e) {
7727
+ function Ql(e) {
7694
7728
  let { value: t, ctx: n } = e;
7695
7729
  if (!n || !n.resourcesByPath.size) return {
7696
7730
  ok: !0,
7697
7731
  value: t
7698
7732
  };
7699
- let r = ja(t), i = Jl(r, n);
7733
+ let r = ja(t), i = Xl(r, n);
7700
7734
  return i.ok ? {
7701
7735
  ok: !0,
7702
7736
  value: r
7703
7737
  } : {
7704
7738
  ok: !1,
7705
- error: Yl(i)
7739
+ error: Zl(i)
7706
7740
  };
7707
7741
  }
7708
- function Zl(e) {
7742
+ function $l(e) {
7709
7743
  let { patches: t, clone: n, ctx: r } = e;
7710
7744
  if (!r || !r.resourcesByPath.size) return { ok: !0 };
7711
7745
  for (let e = 0; e < t.length; e++) {
7712
7746
  let n = t[e];
7713
7747
  if (n.op === "remove") {
7714
- let t = Wl(n.jsonPath || "", r.resourcesByPath);
7748
+ let t = Kl(n.jsonPath || "", r.resourcesByPath);
7715
7749
  if (t) {
7716
7750
  let r = t.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED", i = t.spec.mode === "freeze" ? "冻结字段不可删。如需移除请联系集成方调整 data.resources 配置" : "verbatim 字段不可直接删;先 resource_delete({path}) 释放资源保护后再删";
7717
7751
  return {
@@ -7730,27 +7764,27 @@ function Zl(e) {
7730
7764
  }
7731
7765
  }
7732
7766
  }
7733
- let i = Jl(n, r);
7767
+ let i = Xl(n, r);
7734
7768
  if (!i.ok) {
7735
- let e = Ql(i.path, t);
7769
+ let e = eu(i.path, t);
7736
7770
  return {
7737
7771
  ok: !1,
7738
- error: Yl(i, e >= 0 ? e : void 0, e >= 0 ? t[e].jsonPath : void 0)
7772
+ error: Zl(i, e >= 0 ? e : void 0, e >= 0 ? t[e].jsonPath : void 0)
7739
7773
  };
7740
7774
  }
7741
7775
  return { ok: !0 };
7742
7776
  }
7743
- function Ql(e, t) {
7744
- let n = Vl(e);
7777
+ function eu(e, t) {
7778
+ let n = Ul(e);
7745
7779
  for (let e = 0; e < t.length; e++) {
7746
- let r = Vl(t[e].jsonPath || "");
7780
+ let r = Ul(t[e].jsonPath || "");
7747
7781
  if (r && (r === n || n.startsWith(r + ".") || r.startsWith(n + "."))) return e;
7748
7782
  }
7749
7783
  return -1;
7750
7784
  }
7751
7785
  //#endregion
7752
7786
  //#region src/core/tools/dataOps.ts
7753
- var $l = /* @__PURE__ */ new Set([
7787
+ var tu = /* @__PURE__ */ new Set([
7754
7788
  "describe_data",
7755
7789
  "get_data",
7756
7790
  "set_data",
@@ -7764,14 +7798,14 @@ var $l = /* @__PURE__ */ new Set([
7764
7798
  "resource_update",
7765
7799
  "resource_list",
7766
7800
  "resource_delete"
7767
- ]), eu = /* @__PURE__ */ new Set(["read", "write"]);
7768
- function tu(e, t = "simple") {
7769
- return t === "advanced" ? e : t === "minimal" ? e.filter((e) => eu.has(e.name)) : e.filter((e) => !$l.has(e.name));
7801
+ ]), nu = /* @__PURE__ */ new Set(["read", "write"]);
7802
+ function ru(e, t = "simple") {
7803
+ return t === "advanced" ? e : t === "minimal" ? e.filter((e) => nu.has(e.name)) : e.filter((e) => !tu.has(e.name));
7770
7804
  }
7771
- function nu(e) {
7805
+ function iu(e) {
7772
7806
  let { bindRef: t, schema: n, allowKeys: r, snapshots: i, maxSnapshots: a, audit: o, dryRun: s, op: c = "set", protectedCtx: l } = e, u = e.value;
7773
7807
  if (l) {
7774
- let e = Xl({
7808
+ let e = Ql({
7775
7809
  value: u,
7776
7810
  ctx: l
7777
7811
  });
@@ -7806,7 +7840,7 @@ function nu(e) {
7806
7840
  op: c,
7807
7841
  value: f
7808
7842
  }); i.length > a;) i.shift();
7809
- return d.data !== null && typeof d.data == "object" && (r ? Oa(t, d.data) : za(t, d.data)), o({
7843
+ return d.data !== null && typeof d.data == "object" && (r ? Oa(t, d.data) : Va(t, d.data)), o({
7810
7844
  op: c,
7811
7845
  value: d.data,
7812
7846
  timestamp: Date.now()
@@ -7816,7 +7850,7 @@ function nu(e) {
7816
7850
  data: d.data
7817
7851
  };
7818
7852
  }
7819
- function ru(e) {
7853
+ function au(e) {
7820
7854
  let { bindRef: t, patches: n, schema: r, allowKeys: i, snapshots: a, maxSnapshots: o, markDataDirty: s, schemaErrorMode: c = "zod", snapshotLabel: l, dryRun: u, protectedCtx: d } = e, f = ja(t), p = [];
7821
7855
  for (let e = 0; e < n.length; e++) {
7822
7856
  let t = n[e], a = t.jsonPath || "";
@@ -7851,7 +7885,14 @@ function ru(e) {
7851
7885
  ok: !1,
7852
7886
  error: qr(`patches[${e}]`, t.value, n.parseError)
7853
7887
  };
7854
- s = n.parsed;
7888
+ if (s = n.parsed, o === "move" && typeof s == "string" && !Ri(s, r, i)) return {
7889
+ ok: !1,
7890
+ error: Y({
7891
+ code: "PATH_DENIED",
7892
+ message: `patches[${e}] move 目标 "${s}" 不在 schema 声明字段内`,
7893
+ hint: "move 的 value(目标路径)也须在 schema 声明字段内"
7894
+ })
7895
+ };
7855
7896
  }
7856
7897
  let c = Ia(f, o, a, s);
7857
7898
  if (c) return {
@@ -7869,7 +7910,7 @@ function ru(e) {
7869
7910
  });
7870
7911
  }
7871
7912
  if (d) {
7872
- let e = Zl({
7913
+ let e = $l({
7873
7914
  patches: n,
7874
7915
  clone: f,
7875
7916
  ctx: d
@@ -7903,47 +7944,47 @@ function ru(e) {
7903
7944
  ...l ? { label: l } : {}
7904
7945
  }); a.length > o;) a.shift();
7905
7946
  for (let e of p) e.op === "remove" && Aa(t, e.jp);
7906
- return m.data !== null && typeof m.data == "object" && (i ? Oa(t, m.data) : za(t, m.data)), s?.(), {
7947
+ return m.data !== null && typeof m.data == "object" && (i ? Oa(t, m.data) : Va(t, m.data)), s?.(), {
7907
7948
  ok: !0,
7908
7949
  applied: p,
7909
7950
  clone: f
7910
7951
  };
7911
7952
  }
7912
- function iu(e) {
7953
+ function ou(e) {
7913
7954
  return e < 1024 ? `${e}B` : e < 1024 * 1024 ? `${(e / 1024).toFixed(1)}KB` : `${(e / (1024 * 1024)).toFixed(1)}MB`;
7914
7955
  }
7915
- function au(e, t, n, r) {
7956
+ function su(e, t, n, r) {
7916
7957
  if (!t || !n.length || typeof e != "object" || !e) return e;
7917
7958
  let i = new Set(n.map((e) => e.field)), a = ja(e);
7918
7959
  return (function e(t) {
7919
7960
  if (Array.isArray(t)) for (let n of t) e(n);
7920
7961
  else if (t && typeof t == "object") for (let n of Object.keys(t)) {
7921
7962
  let a = t[n];
7922
- typeof a == "string" && i.has(n) && a.length >= r ? t[n] = `<${n} ${iu(a.length)}>` : e(a);
7963
+ typeof a == "string" && i.has(n) && a.length >= r ? t[n] = `<${n} ${ou(a.length)}>` : e(a);
7923
7964
  }
7924
7965
  })(a), a;
7925
7966
  }
7926
- var ou = 0;
7927
- function su() {
7928
- return ou++, "c_" + Math.random().toString(36).slice(2, 8) + ou.toString(36);
7967
+ var cu = 0;
7968
+ function lu() {
7969
+ return cu++, "c_" + Math.random().toString(36).slice(2, 8) + cu.toString(36);
7929
7970
  }
7930
- function cu(e, t) {
7971
+ function uu(e, t) {
7931
7972
  if (!(!e || typeof e != "object")) for (let n of t) {
7932
7973
  let t = Z(e, n);
7933
- if (Array.isArray(t)) for (let e of t) e && typeof e == "object" && !("__pgId" in e) && (e.__pgId = su());
7974
+ if (Array.isArray(t)) for (let e of t) e && typeof e == "object" && !("__pgId" in e) && (e.__pgId = lu());
7934
7975
  }
7935
7976
  }
7936
- function lu(e) {
7977
+ function du(e) {
7937
7978
  (function e(t) {
7938
7979
  if (Array.isArray(t)) t.forEach(e);
7939
7980
  else if (t && typeof t == "object") for (let n of Object.keys(t)) n.startsWith("__pg") ? delete t[n] : e(t[n]);
7940
7981
  })(e);
7941
7982
  }
7942
- function uu(e, n = {}) {
7943
- let i = n.pgIdPaths ?? [], a = i.length ? (e) => cu(e, i) : void 0, o = i.length ? ia(e.schema, i).schema : e.schema, s = e.bind, c = e.description ?? "主数据对象", l = Li(o), u = /* @__PURE__ */ new Map(), d = n.vfsStore ? new Gl(n.vfsStore) : void 0;
7983
+ function fu(e, n = {}) {
7984
+ let i = n.pgIdPaths ?? [], a = i.length ? (e) => uu(e, i) : void 0, o = i.length ? ia(e.schema, i).schema : e.schema, s = e.bind, c = e.description ?? "主数据对象", l = Li(o), u = /* @__PURE__ */ new Map(), d = n.vfsStore ? new ql(n.vfsStore) : void 0;
7944
7985
  function f(e) {
7945
7986
  if (u.clear(), e) for (let t of e) {
7946
- let e = Vl(t.path);
7987
+ let e = Ul(t.path);
7947
7988
  u.set(e, {
7948
7989
  path: e,
7949
7990
  mode: t.mode
@@ -8016,7 +8057,7 @@ function uu(e, n = {}) {
8016
8057
  return e;
8017
8058
  },
8018
8059
  createResource: d ? (e, t) => {
8019
- let n = Vl(e), r = u.get(n), i = t === void 0 ? Z(s, n) : t;
8060
+ let n = Ul(e), r = u.get(n), i = t === void 0 ? Z(s, n) : t;
8020
8061
  return d.ensure(n, i, r?.mode ?? "verbatim");
8021
8062
  } : void 0,
8022
8063
  getResource: d ? (e) => {
@@ -8029,7 +8070,7 @@ function uu(e, n = {}) {
8029
8070
  } : void 0;
8030
8071
  } : void 0,
8031
8072
  updateResource: d ? (e, t) => {
8032
- let n = Vl(e);
8073
+ let n = Ul(e);
8033
8074
  d.update(n, t), ka(s, n, t), T();
8034
8075
  } : void 0,
8035
8076
  deleteResource: d ? (e) => d.delete(e) : void 0,
@@ -8069,7 +8110,7 @@ function uu(e, n = {}) {
8069
8110
  if (a.action === "restore") {
8070
8111
  if (!m.length) return `无历史快照可回退(本次为首次操作)。当前值:${Q(s, 400)} (hash=${i})。请重新 read 再改或选「强制覆盖」。`;
8071
8112
  let e = m[m.length - 1];
8072
- return Ra(s, ja(e.value)), T(), `已回退主数据到历史快照 #${e.id}[${e.op}]。当前值:${Q(s, 400)} (hash=${$(s)})。请基于回退后的值重写或停止。`;
8113
+ return Ba(s, ja(e.value)), T(), `已回退主数据到历史快照 #${e.id}[${e.op}]。当前值:${Q(s, 400)} (hash=${$(s)})。请基于回退后的值重写或停止。`;
8073
8114
  }
8074
8115
  return null;
8075
8116
  }
@@ -8090,7 +8131,7 @@ function uu(e, n = {}) {
8090
8131
  hint: "主数据仅暴露 schema 声明的字段;若需操作该字段,集成方需在 schema 中声明它"
8091
8132
  });
8092
8133
  let i = r ? Z(s, r) : s;
8093
- !r && l && (i = Ki(i, o)), p && (i = Kl({
8134
+ !r && l && (i = Ki(i, o)), p && (i = Jl({
8094
8135
  jp: r,
8095
8136
  resolved: i,
8096
8137
  resourcesByPath: p.resourcesByPath,
@@ -8107,7 +8148,7 @@ function uu(e, n = {}) {
8107
8148
  if (i !== null) return i;
8108
8149
  let a = Ma(e);
8109
8150
  if (a.parseError) return qr("", e, a.parseError);
8110
- let c = nu({
8151
+ let c = iu({
8111
8152
  bindRef: s,
8112
8153
  value: a.parsed,
8113
8154
  schema: o,
@@ -8151,7 +8192,7 @@ function uu(e, n = {}) {
8151
8192
  message: `edit 仅适用于对象/数组主数据,当前是 ${s === void 0 ? "undefined" : typeof s}`,
8152
8193
  hint: "叶子(原始类型)请用 set_data 整体设置"
8153
8194
  });
8154
- let f = ru({
8195
+ let f = au({
8155
8196
  bindRef: s,
8156
8197
  patches: [{
8157
8198
  op: r,
@@ -8182,8 +8223,9 @@ function uu(e, n = {}) {
8182
8223
  "set",
8183
8224
  "remove",
8184
8225
  "merge",
8185
- "append"
8186
- ]).optional().describe("增量操作(顶层或 patch.op 至少一个):set/remove/merge/append"),
8226
+ "append",
8227
+ "move"
8228
+ ]).optional().describe("增量操作(顶层或 patch.op 至少一个):set 设值/remove 删/merge 合并/append 追加/move 移动数组元素(value=目标路径字符串,数组本身=追加/数组内下标=插入;同数组即重排,目标下标按移除源后解释)"),
8187
8229
  jsonPath: t.string().optional().describe("相对主数据根的点号路径(如 components.0.text);顶层或 patch.jsonPath。set/remove 必填,merge/append 不填则作用于根"),
8188
8230
  value: t.unknown().optional().describe("JSON 对象(推荐直传,如 {text:\"x\"})或 JSON 字符串;顶层或 patch.value(set/merge/append 必填)"),
8189
8231
  expectedHash: t.string().optional().describe("乐观锁:改前 read/get 返回的 hash;传入则校验,不一致拒绝写入防覆盖。不传则自动用你最后读到的 hash(autoLock)"),
@@ -8216,7 +8258,7 @@ function uu(e, n = {}) {
8216
8258
  hint: "仅 schema 声明的 key 可删"
8217
8259
  });
8218
8260
  if (p) {
8219
- let t = Wl(e, p.resourcesByPath);
8261
+ let t = Kl(e, p.resourcesByPath);
8220
8262
  if (t) return Y({
8221
8263
  code: t.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED",
8222
8264
  message: `delete_data @ "${e}" 命中受保护字段 "${t.protectedPath}"(${t.spec.mode}),不可删除`,
@@ -8253,7 +8295,7 @@ function uu(e, n = {}) {
8253
8295
  hint: "用 history_data({list:true}) 查看可用快照序号"
8254
8296
  });
8255
8297
  let i = o.safeParse(r.value);
8256
- return i.success ? (Ra(s, ja(r.value)), T(), D({
8298
+ return i.success ? (Ba(s, ja(r.value)), T(), D({
8257
8299
  op: "restore",
8258
8300
  detail: `#${r.id}`,
8259
8301
  timestamp: Date.now()
@@ -8320,7 +8362,7 @@ function uu(e, n = {}) {
8320
8362
  });
8321
8363
  let n = l ? Ki(s, o) : s, r;
8322
8364
  try {
8323
- r = Al(n, e);
8365
+ r = Ml(n, e);
8324
8366
  } catch (t) {
8325
8367
  return Y({
8326
8368
  code: "JSONPATH_SYNTAX",
@@ -8344,7 +8386,7 @@ function uu(e, n = {}) {
8344
8386
  message: "主数据为空,无可搜索内容"
8345
8387
  });
8346
8388
  try {
8347
- let a = Ml(l ? Ki(s, o) : s, e, {
8389
+ let a = Pl(l ? Ki(s, o) : s, e, {
8348
8390
  mode: t,
8349
8391
  fuzzyThreshold: n,
8350
8392
  matchKey: r,
@@ -8395,7 +8437,7 @@ function uu(e, n = {}) {
8395
8437
  e && (c = Ki(c, e));
8396
8438
  }
8397
8439
  } else c = l ? Ki(s, o) : s;
8398
- let u = ja(c), d = await Pl(u, e, a && JSON.stringify(u).length > 1e5 ? 8e3 : 3e3);
8440
+ let u = ja(c), d = await Il(u, e, a && JSON.stringify(u).length > 1e5 ? 8e3 : 3e3);
8399
8441
  if (!d.ok) {
8400
8442
  let t = /超时/.test(d.error || "");
8401
8443
  return Y({
@@ -8411,7 +8453,7 @@ function uu(e, n = {}) {
8411
8453
  if (t === "transform") {
8412
8454
  let e = d.result;
8413
8455
  if (a) {
8414
- let t = ru({
8456
+ let t = au({
8415
8457
  bindRef: s,
8416
8458
  patches: [{
8417
8459
  op: "set",
@@ -8439,7 +8481,7 @@ function uu(e, n = {}) {
8439
8481
  message: `主数据 bind 为原始类型(${s === null ? "null" : typeof s}),eval transform(patches) 无法就地替换`,
8440
8482
  hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
8441
8483
  });
8442
- let t = ru({
8484
+ let t = au({
8443
8485
  bindRef: s,
8444
8486
  patches: e.patches,
8445
8487
  schema: o,
@@ -8459,7 +8501,7 @@ function uu(e, n = {}) {
8459
8501
  }
8460
8502
  let t = e;
8461
8503
  if (p) {
8462
- let e = Xl({
8504
+ let e = Ql({
8463
8505
  value: t,
8464
8506
  ctx: p
8465
8507
  });
@@ -8471,7 +8513,7 @@ function uu(e, n = {}) {
8471
8513
  code: "LEAF_BIND",
8472
8514
  message: `主数据 bind 为原始类型(${s === null ? "null" : typeof s}),eval transform 无法就地替换外部持有的值引用`,
8473
8515
  hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
8474
- }) : (O("edit", "eval_transform"), n.data !== null && typeof n.data == "object" && (l ? Oa(s, n.data) : za(s, n.data)), T(), D({
8516
+ }) : (O("edit", "eval_transform"), n.data !== null && typeof n.data == "object" && (l ? Oa(s, n.data) : Va(s, n.data)), T(), D({
8475
8517
  op: "edit",
8476
8518
  detail: "eval_transform",
8477
8519
  timestamp: Date.now()
@@ -8508,7 +8550,7 @@ function uu(e, n = {}) {
8508
8550
  e && (a = Ki(a, e));
8509
8551
  }
8510
8552
  let c = a;
8511
- if (p && (c = Kl({
8553
+ if (p && (c = Jl({
8512
8554
  jp: t,
8513
8555
  resolved: c,
8514
8556
  resourcesByPath: p.resourcesByPath,
@@ -8518,7 +8560,7 @@ function uu(e, n = {}) {
8518
8560
  } catch (e) {
8519
8561
  return `- ${t}: [READ_INTERCEPT: ${e.message}]`;
8520
8562
  }
8521
- return r && r.length && (c = Na(c, r)), i != null && (c = Pa(c, i)), c = au(c, f === "", C, S), c === void 0 ? `- ${t} = (undefined)` : `- ${t} = ${Q(c)}`;
8563
+ return r && r.length && (c = Na(c, r)), i != null && (c = Pa(c, i)), c = su(c, f === "", C, S), c === void 0 ? `- ${t} = (undefined)` : `- ${t} = ${Q(c)}`;
8522
8564
  });
8523
8565
  return `多路径读取(共 ${t.length} 项,hash=${m}):\n${e.join("\n")}`;
8524
8566
  }
@@ -8540,7 +8582,7 @@ function uu(e, n = {}) {
8540
8582
  e && (g = Ki(g, e));
8541
8583
  }
8542
8584
  let _ = g;
8543
- if (p && (_ = Kl({
8585
+ if (p && (_ = Jl({
8544
8586
  jp: h,
8545
8587
  resolved: _,
8546
8588
  resourcesByPath: p.resourcesByPath,
@@ -8553,7 +8595,7 @@ function uu(e, n = {}) {
8553
8595
  message: `read 拦截器抛错: ${e.message}`
8554
8596
  });
8555
8597
  }
8556
- r && r.length && (_ = Na(_, r)), i != null && (_ = Pa(_, i)), _ = au(_, f === "", C, S);
8598
+ r && r.length && (_ = Na(_, r)), i != null && (_ = Pa(_, i)), _ = su(_, f === "", C, S);
8557
8599
  let y = e ? "" : `主数据说明: ${c}\n格式: 写入值需为 JSON,且通过声明的 schema 校验(校验失败时 write 会返回结构化错误)。字段约束(类型/min/max/enum/必填/默认)见 systemPrompt「可操作数据」段,或用 schema_data({ jsonPath }) 按需查。\n\n`, x = r && r.length ? `(字段裁剪:${r.join(",")})` : "", w = i == null ? "" : `(深度≤${i})`, T = x || w ? ` ${x}${w}` : "";
8558
8600
  if ((a !== void 0 || u !== void 0) && Array.isArray(_)) {
8559
8601
  let e = _.length, t = Math.max(0, a ?? 0), n = Math.min(200, Math.max(1, u ?? 50)), r = _.slice(t, t + n), i = t + n < e;
@@ -8626,7 +8668,7 @@ function uu(e, n = {}) {
8626
8668
  hint: "仅 schema 声明的 key 可删"
8627
8669
  });
8628
8670
  if (p) {
8629
- let e = Wl(t.jsonPath, p.resourcesByPath);
8671
+ let e = Kl(t.jsonPath, p.resourcesByPath);
8630
8672
  if (e) return Y({
8631
8673
  code: e.spec.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED",
8632
8674
  message: `write delete @ "${t.jsonPath}" 命中受保护字段 "${e.protectedPath}"(${e.spec.mode}),不可删除`,
@@ -8659,7 +8701,7 @@ function uu(e, n = {}) {
8659
8701
  op: t.op ?? "set",
8660
8702
  jsonPath: t.jsonPath || "",
8661
8703
  value: g
8662
- }]), i = ru({
8704
+ }]), i = au({
8663
8705
  bindRef: s,
8664
8706
  patches: n,
8665
8707
  schema: o,
@@ -8676,13 +8718,13 @@ function uu(e, n = {}) {
8676
8718
  detail: `${i.applied.length} 个 patch${i.applied.length > 1 ? "(批量)" : ""}`,
8677
8719
  value: i.applied.map((e) => `${e.op}@${e.jp}`),
8678
8720
  timestamp: Date.now()
8679
- }), a && (a(s), T()), b($(s), d), lu(i.clone), `已 write(edit) 主数据(${i.applied.length} 个 patch)。当前值:${Q(i.clone, 600)} (新 hash=${$(s)})`) : i.error;
8721
+ }), a && (a(s), T()), b($(s), d), du(i.clone), `已 write(edit) 主数据(${i.applied.length} 个 patch)。当前值:${Q(i.clone, 600)} (新 hash=${$(s)})`) : i.error;
8680
8722
  }
8681
8723
  let C = Ma(g);
8682
8724
  if (C.parseError) return qr("", g, C.parseError);
8683
8725
  let w = await ee("set", S);
8684
8726
  if (w !== null) return w;
8685
- let E = nu({
8727
+ let E = iu({
8686
8728
  bindRef: s,
8687
8729
  value: C.parsed,
8688
8730
  schema: o,
@@ -8698,7 +8740,7 @@ function uu(e, n = {}) {
8698
8740
  if (c) return `dryRun(set): schema 校验通过。预览新值:${Q(E.data, 600)}。未实际写入、未入快照。`;
8699
8741
  a && (a(s), T());
8700
8742
  let k = $(s);
8701
- return b(k, d), lu(E.data), `已 write(set) 主数据 = ${Q(E.data, 600)} (新 hash=${k})${l ? "(白名单模式:仅更新 schema 声明字段,未声明字段保留)" : ""}`;
8743
+ return b(k, d), du(E.data), `已 write(set) 主数据 = ${Q(E.data, 600)} (新 hash=${k})${l ? "(白名单模式:仅更新 schema 声明字段,未声明字段保留)" : ""}`;
8702
8744
  }, {
8703
8745
  name: "write",
8704
8746
  description: "写入主数据(高层入口,合并 set/edit/delete + 自动乐观锁 + 自动快照)。四种意图:① 整体替换 write({ value }) value 为整个 JSON 对象(推荐)或字符串;② 单个增量 patch write({ patch:{op,jsonPath,value} }) op=set/remove/merge/append,jsonPath 相对主数据根(如 components.0.props.title),patch.value 是该 patch 的值(自带,与 patches 一致——string/number 直传该字段新值,勿包成 {字段:值} 对象);也兼容 write({ value, patch:{op,jsonPath} }) 顶层 value 形式(向后兼容,但优先用 patch.value 避免与①整体 set 的 value 语义混淆);③ 批量增量 write({ patches:[{op,jsonPath,value},...] }) 一次原子应用多个 patch(任一失败整体不写入,适合一次改多处);④ 删除 write({ patch:{jsonPath}, del:true })。写入自动经 schema 校验(失败不写)+ 自动存快照(可 restore_data 回退)+ 自动乐观锁(autoLock,用你最后 read 到的 hash 比对,冲突则 VERSION_CONFLICT)。集成方可能经 write 拦截器校验/转换/拒绝(批量模式拦截器收到 {patches},返回新 patches 数组或 {error})。dryRun(可选):预检模式,走完整校验链(schema + 白名单 + patch 应用到 clone)但不落盘/入快照,返回预览(四意图均支持,复杂改动先看会改成啥、能否过 schema)。",
@@ -8709,8 +8751,9 @@ function uu(e, n = {}) {
8709
8751
  "set",
8710
8752
  "remove",
8711
8753
  "merge",
8712
- "append"
8713
- ]).optional().describe("增量操作:set 设值/remove 删/merge 合并对象/append 追加数组。单 patch edit 缺省按 set;del 模式(write({patch:{jsonPath},del:true}))不读 op 可省略"),
8754
+ "append",
8755
+ "move"
8756
+ ]).optional().describe("增量操作:set 设值/remove 删/merge 合并对象/append 追加数组/move 移动数组元素(value=目标路径字符串)。单 patch edit 缺省按 set;del 模式(write({patch:{jsonPath},del:true}))不读 op 可省略"),
8714
8757
  jsonPath: t.string().optional().describe("相对主数据根的点号路径(如 components.0.text);set/remove 必填,merge/append 不填则作用于根"),
8715
8758
  value: t.unknown().optional().describe("该 patch 的值(JSON 直传或 JSON 字符串);set/merge/append 必填,remove 不需。与顶层 value 二选一:优先 patch.value,未填则回退顶层 value(向后兼容)。推荐用 patch.value(自带,与 patches 元素一致,无歧义)")
8716
8759
  }).optional().describe("单个增量编辑(自带 value,与 patches 元素一致);传 patch(无 patches)走单 patch edit 语义"),
@@ -8719,7 +8762,8 @@ function uu(e, n = {}) {
8719
8762
  "set",
8720
8763
  "remove",
8721
8764
  "merge",
8722
- "append"
8765
+ "append",
8766
+ "move"
8723
8767
  ]),
8724
8768
  jsonPath: t.string().optional().describe("相对主数据根的点号路径;set/remove 必填,merge/append 不填则作用于根"),
8725
8769
  value: t.unknown().optional().describe("JSON 值(推荐直传)或 JSON 字符串;set/merge/append 必填,remove 不需")
@@ -8761,7 +8805,7 @@ function uu(e, n = {}) {
8761
8805
  });
8762
8806
  r = t.value, i = `快照 #${t.id}`;
8763
8807
  }
8764
- let a = l ? Ki(s, o) : s, c = Ba(r, ja(a));
8808
+ let a = l ? Ki(s, o) : s, c = Ha(r, ja(a));
8765
8809
  return c.length ? `差异(当前 vs ${i},共 ${c.length} 处):\n${c.map((e) => ` ${e.path}: ${Q(e.from)} → ${Q(e.to)}`).join("\n")}` : `无差异:当前主数据与 ${i} 完全相同。`;
8766
8810
  }, {
8767
8811
  name: "diff_data",
@@ -8813,7 +8857,7 @@ function uu(e, n = {}) {
8813
8857
  }
8814
8858
  let f = await ee("set", n || (x ? y(a) : void 0));
8815
8859
  if (f !== null) return f;
8816
- let g = nu({
8860
+ let g = iu({
8817
8861
  bindRef: s,
8818
8862
  value: d,
8819
8863
  schema: o,
@@ -8845,7 +8889,7 @@ function uu(e, n = {}) {
8845
8889
  message: "未提供 path 或有效 handle",
8846
8890
  hint: "传 path(受保护字段)或 handle(占位符 ⟦res:handle⟧ 里的句柄)"
8847
8891
  });
8848
- let r = Vl(n);
8892
+ let r = Ul(n);
8849
8893
  if (!u.has(r)) return Y({
8850
8894
  code: "RESOURCE_NOT_FOUND",
8851
8895
  message: `"${n}" 不是受保护字段`,
@@ -8885,7 +8929,7 @@ function uu(e, n = {}) {
8885
8929
  message: "resource_update 需要 path",
8886
8930
  hint: "传要更新的 verbatim 受保护字段路径"
8887
8931
  });
8888
- let i = Vl(e), a = u.get(i);
8932
+ let i = Ul(e), a = u.get(i);
8889
8933
  if (!a) return Y({
8890
8934
  code: "RESOURCE_NOT_FOUND",
8891
8935
  message: `"${e}" 不是受保护字段`,
@@ -8973,8 +9017,8 @@ function uu(e, n = {}) {
8973
9017
  }
8974
9018
  //#endregion
8975
9019
  //#region src/core/tools/fetchDoc.ts
8976
- var du = 3e4, fu = [r(async ({ url: e, as: t }) => {
8977
- let n = new AbortController(), r = setTimeout(() => n.abort(), du);
9020
+ var pu = 3e4, mu = [r(async ({ url: e, as: t }) => {
9021
+ let n = new AbortController(), r = setTimeout(() => n.abort(), pu);
8978
9022
  try {
8979
9023
  let r = await fetch(e, {
8980
9024
  method: "GET",
@@ -8991,7 +9035,7 @@ var du = 3e4, fu = [r(async ({ url: e, as: t }) => {
8991
9035
  ].join("\n");
8992
9036
  } catch (t) {
8993
9037
  let r = t?.message || String(t);
8994
- return n.signal.aborted ? `获取失败:请求超时(${du}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
9038
+ return n.signal.aborted ? `获取失败:请求超时(${pu}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
8995
9039
  } finally {
8996
9040
  clearTimeout(r);
8997
9041
  }
@@ -9002,7 +9046,7 @@ var du = 3e4, fu = [r(async ({ url: e, as: t }) => {
9002
9046
  url: t.string().describe("要抓取的 URL(同源或已配 CORS)"),
9003
9047
  as: t.enum(["text", "markdown"]).optional().describe("返回格式标签,默认 text")
9004
9048
  })
9005
- })], pu = [
9049
+ })], hu = [
9006
9050
  "id",
9007
9051
  "class",
9008
9052
  "href",
@@ -9014,12 +9058,12 @@ var du = 3e4, fu = [r(async ({ url: e, as: t }) => {
9014
9058
  "aria-label",
9015
9059
  "name",
9016
9060
  "type"
9017
- ], mu = /^(value|srcdoc|formaction|on\w+)$/i, hu = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session/i;
9018
- function gu(e, t) {
9061
+ ], gu = /^(value|srcdoc|formaction|on\w+)$/i, _u = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session/i;
9062
+ function vu(e, t) {
9019
9063
  if (!e) return null;
9020
- let { depth: n, attrs: r, includeText: i = !0 } = t, a = r !== void 0, o = r ?? pu, s = (e) => {
9064
+ let { depth: n, attrs: r, includeText: i = !0 } = t, a = r !== void 0, o = r ?? hu, s = (e) => {
9021
9065
  let t = {};
9022
- for (let n of Array.from(e.attributes)) (a ? o.includes(n.name) : o.includes(n.name) || n.name.startsWith("data-")) && (mu.test(n.name) || hu.test(n.name) || (t[n.name] = n.value));
9066
+ for (let n of Array.from(e.attributes)) (a ? o.includes(n.name) : o.includes(n.name) || n.name.startsWith("data-")) && (gu.test(n.name) || _u.test(n.name) || (t[n.name] = n.value));
9023
9067
  return t;
9024
9068
  }, c = (e, t) => {
9025
9069
  let n = {
@@ -9035,10 +9079,10 @@ function gu(e, t) {
9035
9079
  };
9036
9080
  return c(e, n);
9037
9081
  }
9038
- var _u = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
9082
+ var yu = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
9039
9083
  let i = e ? document.querySelector(e) : document.body;
9040
9084
  if (!i) return `未找到匹配元素:selector="${e}"`;
9041
- let a = gu(i, {
9085
+ let a = vu(i, {
9042
9086
  depth: t ?? 3,
9043
9087
  attrs: n,
9044
9088
  includeText: r ?? !0
@@ -9053,14 +9097,14 @@ var _u = r(({ selector: e, depth: t, attrs: n, includeText: r }) => {
9053
9097
  attrs: t.array(t.string()).optional().describe("属性白名单(传了 = 严格白名单;不传 = 默认常用 + data-*)"),
9054
9098
  includeText: t.boolean().optional().describe("是否包含直接文本(默认 true)")
9055
9099
  })
9056
- }), vu = [_u];
9100
+ }), bu = [yu];
9057
9101
  //#endregion
9058
9102
  //#region src/core/tools/envTool.ts
9059
- function yu(e) {
9103
+ function xu(e) {
9060
9104
  let t = e;
9061
9105
  return typeof t.tagName == "string" || typeof t.nodeType == "number" && typeof t.nodeName == "string";
9062
9106
  }
9063
- function bu(e, t = 3, n = 2e3, r) {
9107
+ function Su(e, t = 3, n = 2e3, r) {
9064
9108
  if (e == null) return e;
9065
9109
  if (typeof e == "string") return e.length > n ? e.slice(0, n) + "…(已截断)" : e;
9066
9110
  if (typeof e == "number" || typeof e == "boolean") return e;
@@ -9069,14 +9113,14 @@ function bu(e, t = 3, n = 2e3, r) {
9069
9113
  if (typeof e == "bigint") return `${e.toString()}n`;
9070
9114
  if (typeof e != "object") return String(e);
9071
9115
  let i = e;
9072
- if (yu(i)) {
9116
+ if (xu(i)) {
9073
9117
  let e = i;
9074
9118
  return e.tagName ? `[Element: <${e.tagName.toLowerCase()}>]` : `[Node: ${e.nodeName}]`;
9075
9119
  }
9076
9120
  if (r?.has(i)) return "[Circular]";
9077
9121
  let a = r ?? /* @__PURE__ */ new WeakSet();
9078
9122
  if (a.add(i), Array.isArray(e)) {
9079
- let r = e.slice(0, 100).map((e) => bu(e, t - 1, n, a));
9123
+ let r = e.slice(0, 100).map((e) => Su(e, t - 1, n, a));
9080
9124
  return e.length > 100 && r.push(`…(共 ${e.length} 项,已截断)`), r;
9081
9125
  }
9082
9126
  if (t < 0) return "(对象,已截断)";
@@ -9088,14 +9132,14 @@ function bu(e, t = 3, n = 2e3, r) {
9088
9132
  break;
9089
9133
  }
9090
9134
  try {
9091
- o[r] = bu(i[r], t - 1, n, a);
9135
+ o[r] = Su(i[r], t - 1, n, a);
9092
9136
  } catch {
9093
9137
  o[r] = "(getter 抛错)";
9094
9138
  }
9095
9139
  }
9096
9140
  return o;
9097
9141
  }
9098
- function xu(e) {
9142
+ function Cu(e) {
9099
9143
  let t = e ?? (typeof window < "u" ? window : {}), n = t.navigator, r = t.location, i = t.document;
9100
9144
  return {
9101
9145
  location: {
@@ -9128,9 +9172,9 @@ function xu(e) {
9128
9172
  } : "(无 document)"
9129
9173
  };
9130
9174
  }
9131
- var Su = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|opener|parent|top|self|window|globalThis|closed|history|navigation|trustedTypes|origin|crossOriginIsolated)$/, Cu = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session|ticket/i, wu = r(({ key: e }) => {
9175
+ var wu = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|opener|parent|top|self|window|globalThis|closed|history|navigation|trustedTypes|origin|crossOriginIsolated)$/, Tu = /token|secret|password|passwd|api[-_]?key|auth|cred|csrf|session|ticket/i, Eu = r(({ key: e }) => {
9132
9176
  if (e) {
9133
- if (Su.test(e) || Cu.test(e)) return JSON.stringify({
9177
+ if (wu.test(e) || Tu.test(e)) return JSON.stringify({
9134
9178
  key: e,
9135
9179
  denied: !0,
9136
9180
  reason: "安全:该 key 在 denylist(localStorage/sessionStorage/cookie/document 或敏感命名 token/secret/key/auth),不读取防泄漏"
@@ -9140,18 +9184,18 @@ var Su = /^(localStorage|sessionStorage|cookie|document|frames|frameElement|open
9140
9184
  key: e,
9141
9185
  exists: t !== void 0,
9142
9186
  type: typeof t,
9143
- value: bu(t)
9187
+ value: Su(t)
9144
9188
  }, null, 2);
9145
9189
  }
9146
- return JSON.stringify(xu(), null, 2);
9190
+ return JSON.stringify(Cu(), null, 2);
9147
9191
  }, {
9148
9192
  name: "inspect_env",
9149
9193
  description: "读取宿主页面环境信息(排查调试用,默认开启)。不传参 = 返回环境摘要(location 的 URL/origin/path、navigator 的浏览器/语言、viewport 视口尺寸、document 的 title/readyState);传 key = 读取指定 window 属性值(如 inspect_env({key:\"appConfig\"}) 读集成方挂的调试变量 window.appConfig)。用于排查「当前页面在哪/什么浏览器/视口多大/调试变量值是什么」。轻量只读,大结果自动外存 vfs。",
9150
9194
  schema: t.object({ key: t.string().optional().describe("要读取的 window 属性名(如 \"appConfig\"/\"__DEBUG__\");不传 = 返回环境摘要") })
9151
- }), Tu = [wu];
9195
+ }), Du = [Eu];
9152
9196
  //#endregion
9153
9197
  //#region src/core/harness/budget.ts
9154
- function Eu(e, t, n) {
9198
+ function Ou(e, t, n) {
9155
9199
  let r = 0;
9156
9200
  return {
9157
9201
  name: "budget",
@@ -9176,12 +9220,12 @@ function Eu(e, t, n) {
9176
9220
  }
9177
9221
  //#endregion
9178
9222
  //#region src/core/sdk/actions.ts
9179
- var Du = /^[a-zA-Z][a-zA-Z0-9_]*$/;
9180
- function Ou(e) {
9223
+ var ku = /^[a-zA-Z][a-zA-Z0-9_]*$/;
9224
+ function Au(e) {
9181
9225
  let n = [];
9182
9226
  for (let [i, a] of Object.entries(e)) {
9183
- if (!Du.test(i)) {
9184
- console.warn(`[page-agent-sdk][actions] 动作名 "${i}" 非法(须匹配 ${Du}),已跳过`);
9227
+ if (!ku.test(i)) {
9228
+ console.warn(`[page-agent-sdk][actions] 动作名 "${i}" 非法(须匹配 ${ku}),已跳过`);
9185
9229
  continue;
9186
9230
  }
9187
9231
  let e = a.description || `宿主动作 ${i}`;
@@ -9201,9 +9245,9 @@ function Ou(e) {
9201
9245
  }
9202
9246
  return n;
9203
9247
  }
9204
- function ku(e) {
9248
+ function ju(e) {
9205
9249
  let t = {};
9206
- for (let [n, r] of Object.entries(e)) Du.test(n) && (t[n] = {
9250
+ for (let [n, r] of Object.entries(e)) ku.test(n) && (t[n] = {
9207
9251
  description: r.description,
9208
9252
  hasParams: !!r.params
9209
9253
  });
@@ -9211,12 +9255,12 @@ function ku(e) {
9211
9255
  }
9212
9256
  //#endregion
9213
9257
  //#region src/core/toolsets.ts
9214
- var Au = fu, ju = vu;
9215
- function Mu(e, t) {
9216
- return uu(e, t);
9258
+ var Mu = mu, Nu = bu;
9259
+ function Pu(e, t) {
9260
+ return fu(e, t);
9217
9261
  }
9218
- function Nu(e, t, n, r, i) {
9219
- let a = ml(e);
9262
+ function Fu(e, t, n, r, i) {
9263
+ let a = gl(e);
9220
9264
  return [
9221
9265
  ...a.dataOps ? t : [],
9222
9266
  ...a.fetch ? n : [],
@@ -9226,7 +9270,7 @@ function Nu(e, t, n, r, i) {
9226
9270
  }
9227
9271
  //#endregion
9228
9272
  //#region src/core/sdk/toolRegistry.ts
9229
- function Pu(e) {
9273
+ function Iu(e) {
9230
9274
  let t = /* @__PURE__ */ new Map(), n = [];
9231
9275
  for (let r of e) for (let e of r.tools) {
9232
9276
  let i = t.get(e.name);
@@ -9246,15 +9290,15 @@ function Pu(e) {
9246
9290
  }
9247
9291
  //#endregion
9248
9292
  //#region src/core/harness/usageHints.ts
9249
- var Fu = .7;
9250
- function Iu(e, t, n = "simple", r = !1) {
9251
- let i = ml(e), a = n !== "advanced";
9293
+ var Lu = .7;
9294
+ function Ru(e, t, n = "simple", r = !1) {
9295
+ let i = gl(e), a = n !== "advanced";
9252
9296
  return {
9253
9297
  name: "usageHints",
9254
9298
  augmentPrompt: () => {
9255
9299
  let n = [];
9256
- if (i.planning && (n.push("【自适应规划】按任务复杂度决定是否先规划,不要对简单任务过度编排:"), n.push(" · 简单/明确任务(改单字段、调样式、查值)→ 直接 read/write 执行,不必 write_todos。"), n.push(" · 复杂任务(多步、大改、有歧义、不可逆)→ 先 write_todos 拆解,首个任务标 in_progress,逐项推进。"), n.push(" · 执行中发现步骤要改/补/细分 → 用 update_todo({id, content?, status?}) 按 id 增量改单项,不必重传整个清单。"), n.push(" · 规划出多步方案若需用户拍板 → 先 request_human_confirmation 给方案选项,确认后再执行。"), n.push(" · 规划阶段有轮次预算(maxPlanRevisions,默认 5):勿反复调研/改计划而不执行,规划充分后即开始 write 落地。")), t && (a ? (n.push("读写主数据用 read/write(高层入口,自动乐观锁 + 自动快照)。read({jsonPath}) 读子路径当前值(返回含 hash,write 时自动比对,无需手动传);read() 不传读整个主数据 + 说明。write 改值两姿势:① 改单个字段/子路径用 write({patch:{op:\"set\", jsonPath:\"路径.字段\", value:新值}})——patch.value 就是该字段的新值(类型匹配:string 直传字符串、number 传数字、对象传对象),不要包成 {字段:值} 对象(字段名已在 jsonPath);也兼容 write({value:新值, patch:{op,jsonPath}}) 顶层 value(向后兼容,但优先 patch.value,避免与整体 set 的 value 混淆);② 替换整个对象用 write({value:{整个新对象}})。op:set 设值 / remove 删 / merge 合并对象 / append 追加数组;批量多改动 write({patches:[{op,jsonPath,value},...]});删子路径 write({patch:{jsonPath:\"路径\"}, del:true})。写入自动经 schema 校验(失败不写,按错误提示改值类型/形状后重试)+ 自动存快照(出错可用 restore_data 回退)。"), n.push("修改大对象/数组优先用 write 的 patch 增量(只发改动部分),避免整体重传被 max_tokens 截断致 JSON 不完整。"), n.push("读大数组(read 返回 hasMore=true)用 read({jsonPath,offset,limit}) 分页(offset+=limit 续读,默认 limit=50);一次读多个不相关子路径用 read({jsonPaths:[...]}) 省轮次;复杂 patches 改动先 write({patches,dryRun:true}) 预检(走完整校验不落盘)。"), n.push("read/describe 返回按 schema 投影:仅 schema 声明的字段可见(未声明字段自动隐藏,防误操作);要操作某字段需集成方在 schema 声明,查任意路径完整约束用 schema_data({jsonPath})。"), n.push("查历史快照值(看上一版长啥样 / 冲突诊断 / 用户问\"刚才改了啥\")用 history_data({id?,jsonPath?})(只读不改当前);对比当前与历史快照的差异需切 advanced 用 diff_data(返回结构化 path→from/to)。"), n.push("在大数组里按条件筛选用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素 path/index;定位后用 write patch 改。找名字记不清的元素用 search_data(substring/regex/fuzzy)。批量过滤/映射/聚合/重写大数组用 eval_script(沙箱脚本,mode=query 只读/transform 落地)。")) : (n.push("改主数据前先 get_data({jsonPath}) 读其当前真实值与 hash(返回末尾 hash=xxx),基于真实值改,不要凭记忆。写入(set/edit/delete)时回传 expectedHash=该 hash 启用乐观锁——若主数据在你 get 之后被外部代码/其他 agent/用户手动改过,会触发冲突:集成方若开启人工介入,工具会挂起等用户决定(保留外部/强制覆盖/回退),你应等待工具返回后按结果继续(保留外部→重新 get 再改;强制覆盖→已写入,继续;回退→已回退到历史快照,基于回退值重写);未开启人工介入时返回 VERSION_CONFLICT 不写入,重新 get 拿最新值与 hash 再改。"), n.push("不确定主数据字段结构时用 describe_data 查看说明。"), n.push("修改大对象/数组优先用 edit_data 增量 patch(只发改动部分),避免 set_data 整体重传被 max_tokens 截断导致 JSON 不完整、校验失败。"), n.push("修改主数据出错时可用 restore_data 回退最近一次。"), n.push("在大数组里按条件筛选元素用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素的 path/index;定位后再 edit_data 改。"), n.push("找名字记不清的元素用 search_data(支持 substring/regex/fuzzy 模糊搜索)。"), n.push("需要过滤/映射/聚合/批量重写大数组时用 eval_script(沙箱脚本,入参 data);只读探查用 mode=query,批量重写用 mode=transform(返回值经校验后落地)。"), n.push("读大数组用 read({jsonPath,offset,limit}) 分页(返回 hasMore=true 时 offset+=limit 续读);一次读多个不相关子路径用 read({jsonPaths});复杂改动先 write({...,dryRun:true}) 预检不落盘。"), n.push("对比当前与历史快照(或一段 JSON against)的差异用 diff_data({snapshotId?,against?})(返回结构化 path→from/to,verify 自纠/操作审计/\"刚才改了啥\");只读查历史快照值用 history_data({id?,jsonPath?})。"))), i.subagent && n.push("独立子任务可 spawn_agent 委派(只读工具,过程不占主上下文)。"), i.inspectEnv && n.push("排查页面环境(当前 URL/浏览器/视口/集成方调试变量)用 inspect_env——不传参返回环境摘要(location/navigator/viewport/document),传 key 读特定 window 属性(如 inspect_env({key:\"appConfig\"}) 读 window.appConfig)。改完数据看渲染、定位\"为何没生效\"时用它(只读,不改数据)。"), i.domInspect && n.push("改完数据想确认渲染是否生效(或定位元素/辅助 UI 设计问答)用 get_dom({selector?,depth?}) 读渲染后 DOM(结构化返回 tag/attrs/text/children,depth 控制深度防爆炸,只读)。配合宿主 actions(save_draft/publish 等)形成\"改数据→get_dom 看渲染→触发动作\"闭环。"), i.draftWrite && n.push("生成超大 JSON(如 50+ 组件页面,单次 write 受 max_tokens 限制装不下)用 draft_write 分块构建 → draft_commit 原子提交:draft_write({draftId, chunk, mode}) mode:\"start\" 新建/\"append\" 追加(拼 JSON 片段到 drafts 池);累积完 draft_commit({draftId}) 合并 + schema 校验 + 写主数据(失败草稿保留可修后重试,成功自动清草稿)。小改仍用 write patch,只在大 JSON 从零生成时用 draft。"), i.draftWrite && n.push("⚠️ 大 JSON 分块构建是典型多轮工具调用(draft_write×N + draft_commit + read 确认 + 调研 read/query),默认 maxToolRounds=10 可能触顶被 while 截断导致草稿写不完;目标组件数大时集成方应在 createChatSdk 配 maxToolRounds ≥ 20(或按 N+5 估算)。draft_commit 提交同样走乐观锁(改前 read 拿 hash,bind 被改过会触发冲突介入,不静默覆盖)。"), i.todoDeps && n.push("复杂任务可用 todos 层级依赖:write_todos 时给 todo 传 parentId(父任务 id,表达层级)+ deps(依赖的 todo id 数组,必须先完成)。有依赖的任务,deps 全 completed 后再标 in_progress;完成时 update_todo({id, status:\"completed\", evidence:\"完成证据\"}) 记证据。无依赖关系的任务不传 parentId/deps(扁平)。"), i.focus && !a && (n.push("【上下文聚焦】判断任务范围,用 set_focus/add_focus/remove_focus/clear_focus 自动收敛工作范围:"), n.push(" · 局部任务(只改某一组件/区域,如「调导航栏」「改 components.3 样式」)→ 先 read 定位 jsonPath,再 set_focus({path:\"该子树路径\"}) 聚焦;聚焦后每轮只看该子树结构,写其他位置会被 PATH_DENIED 拒绝。"), n.push(" · 多个相关组件(如「同时改导航栏和页脚」)→ set_focus 聚焦首个后用 add_focus({path}) 追加其余;聚焦后可写任一焦点子树,越界仍被拒;移除单个用 remove_focus({path})。"), n.push(" · 全局任务(多处/整体结构,如「重排所有组件」「换主题」)→ 不要聚焦,保持全量视野直接写。"), n.push(" · 完成局部精修、要转向其他区域或做整体改动 → 调 clear_focus 退出聚焦(清空全部焦点),恢复全部读写权限。"), n.push(" · set_focus/add_focus 的 path 必须在 schema 内(类型校验);不确定路径先 read/describe_data 查。")), r && (n.push("【受保护资源·精确值保护】部分字段被 freeze/verbatim 保护(集成方在 data.resources 声明):"), n.push(" · read 受保护路径返回占位符 ⟦frozen:path⟧(freeze,精确值不入消息流)或 ⟦res:handle⟧(verbatim,原值在资源池),非真值。"), n.push(" · 确需真值用 resource_get({path})(仅受保护路径);freeze 字段完全不可改,撞 FROZEN_FIELD 即放弃该字段改动。"), n.push(" · verbatim 字段改新值:先 resource_update({path,value}) 更新资源池(同步 bind),再 write 写回句柄 ⟦res:handle⟧;直接写新值 → VERBATIM_MISMATCH。"), n.push(" · 撞 RESOURCE_EVICTED(资源被池淘汰)→ 重新 read 该字段懒注册重建句柄;撞 RESOURCE_NOT_FOUND → 重新 read。")), e?.subagents?.length) {
9257
- let t = e.subagents.filter((e) => (e.temperature ?? 0) >= Fu || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), r = e.subagents.filter((e) => (e.temperature ?? 0) < Fu && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
9300
+ if (i.planning && (n.push("【自适应规划】按任务复杂度决定是否先规划,不要对简单任务过度编排:"), n.push(" · 简单/明确任务(改单字段、调样式、查值)→ 直接 read/write 执行,不必 write_todos。"), n.push(" · 复杂任务(多步、大改、有歧义、不可逆)→ 先 write_todos 拆解,首个任务标 in_progress,逐项推进。"), n.push(" · 执行中发现步骤要改/补/细分 → 用 update_todo({id, content?, status?}) 按 id 增量改单项,不必重传整个清单。"), n.push(" · 规划出多步方案若需用户拍板 → 先 request_human_confirmation 给方案选项,确认后再执行。"), n.push(" · 规划阶段有轮次预算(maxPlanRevisions,默认 5):勿反复调研/改计划而不执行,规划充分后即开始 write 落地。")), t && (a ? (n.push("读写主数据用 read/write(高层入口,自动乐观锁 + 自动快照)。read({jsonPath}) 读子路径当前值(返回含 hash,write 时自动比对,无需手动传);read() 不传读整个主数据 + 说明。write 改值两姿势:① 改单个字段/子路径用 write({patch:{op:\"set\", jsonPath:\"路径.字段\", value:新值}})——patch.value 就是该字段的新值(类型匹配:string 直传字符串、number 传数字、对象传对象),不要包成 {字段:值} 对象(字段名已在 jsonPath);也兼容 write({value:新值, patch:{op,jsonPath}}) 顶层 value(向后兼容,但优先 patch.value,避免与整体 set 的 value 混淆);② 替换整个对象用 write({value:{整个新对象}})。op:set 设值 / remove 删 / merge 合并对象 / append 追加数组 / move 移动数组元素(value=目标路径字符串:数组本身=追加到末尾、数组内下标=插到该位置;同数组即重排如组件调序,目标下标按移除源后解释,一步完成免双 set 交换);批量多改动 write({patches:[{op,jsonPath,value},...]});删子路径 write({patch:{jsonPath:\"路径\"}, del:true})。写入自动经 schema 校验(失败不写,按错误提示改值类型/形状后重试)+ 自动存快照(出错可用 restore_data 回退)。"), n.push("修改大对象/数组优先用 write 的 patch 增量(只发改动部分),避免整体重传被 max_tokens 截断致 JSON 不完整。"), n.push("读大数组(read 返回 hasMore=true)用 read({jsonPath,offset,limit}) 分页(offset+=limit 续读,默认 limit=50);一次读多个不相关子路径用 read({jsonPaths:[...]}) 省轮次;复杂 patches 改动先 write({patches,dryRun:true}) 预检(走完整校验不落盘)。"), n.push("read/describe 返回按 schema 投影:仅 schema 声明的字段可见(未声明字段自动隐藏,防误操作);要操作某字段需集成方在 schema 声明,查任意路径完整约束用 schema_data({jsonPath})。"), n.push("查历史快照值(看上一版长啥样 / 冲突诊断 / 用户问\"刚才改了啥\")用 history_data({id?,jsonPath?})(只读不改当前);对比当前与历史快照的差异需切 advanced 用 diff_data(返回结构化 path→from/to)。"), n.push("在大数组里按条件筛选用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素 path/index;定位后用 write patch 改。找名字记不清的元素用 search_data(substring/regex/fuzzy)。批量过滤/映射/聚合/重写大数组用 eval_script(沙箱脚本,mode=query 只读/transform 落地)。")) : (n.push("改主数据前先 get_data({jsonPath}) 读其当前真实值与 hash(返回末尾 hash=xxx),基于真实值改,不要凭记忆。写入(set/edit/delete)时回传 expectedHash=该 hash 启用乐观锁——若主数据在你 get 之后被外部代码/其他 agent/用户手动改过,会触发冲突:集成方若开启人工介入,工具会挂起等用户决定(保留外部/强制覆盖/回退),你应等待工具返回后按结果继续(保留外部→重新 get 再改;强制覆盖→已写入,继续;回退→已回退到历史快照,基于回退值重写);未开启人工介入时返回 VERSION_CONFLICT 不写入,重新 get 拿最新值与 hash 再改。"), n.push("不确定主数据字段结构时用 describe_data 查看说明。"), n.push("修改大对象/数组优先用 edit_data 增量 patch(只发改动部分),避免 set_data 整体重传被 max_tokens 截断导致 JSON 不完整、校验失败。"), n.push("修改主数据出错时可用 restore_data 回退最近一次。"), n.push("在大数组里按条件筛选元素用 query_data(JSONPath,如 $.components[?(@.type==\"card\" && @.price<100)]),返回匹配元素的 path/index;定位后再 edit_data 改。"), n.push("找名字记不清的元素用 search_data(支持 substring/regex/fuzzy 模糊搜索)。"), n.push("需要过滤/映射/聚合/批量重写大数组时用 eval_script(沙箱脚本,入参 data);只读探查用 mode=query,批量重写用 mode=transform(返回值经校验后落地)。"), n.push("读大数组用 read({jsonPath,offset,limit}) 分页(返回 hasMore=true 时 offset+=limit 续读);一次读多个不相关子路径用 read({jsonPaths});复杂改动先 write({...,dryRun:true}) 预检不落盘。"), n.push("对比当前与历史快照(或一段 JSON against)的差异用 diff_data({snapshotId?,against?})(返回结构化 path→from/to,verify 自纠/操作审计/\"刚才改了啥\");只读查历史快照值用 history_data({id?,jsonPath?})。"))), i.subagent && n.push("独立子任务可 spawn_agent 委派(过程隔离,不占主上下文):默认只读,需要子 agent 写数据时传 writablePaths(路径前缀白名单,越界 PATH_OUT_OF_SCOPE)。多个独立子任务可 spawn_agents 并行委派(各子互不通信,结论由你汇总;并行委派不可授写权限,写操作由你收尾执行)。"), i.inspectEnv && n.push("排查页面环境(当前 URL/浏览器/视口/集成方调试变量)用 inspect_env——不传参返回环境摘要(location/navigator/viewport/document),传 key 读特定 window 属性(如 inspect_env({key:\"appConfig\"}) 读 window.appConfig)。改完数据看渲染、定位\"为何没生效\"时用它(只读,不改数据)。"), i.domInspect && n.push("改完数据想确认渲染是否生效(或定位元素/辅助 UI 设计问答)用 get_dom({selector?,depth?}) 读渲染后 DOM(结构化返回 tag/attrs/text/children,depth 控制深度防爆炸,只读)。配合宿主 actions(save_draft/publish 等)形成\"改数据→get_dom 看渲染→触发动作\"闭环。"), i.draftWrite && !a && (n.push("生成超大 JSON(如 50+ 组件页面,单次 write 受 max_tokens 限制装不下)用 draft_write 分块构建 → draft_commit 原子提交:draft_write({draftId, chunk, mode}) mode:\"start\" 新建/\"append\" 追加(拼 JSON 片段到 drafts 池);累积完 draft_commit({draftId}) 合并 + schema 校验 + 写主数据(失败草稿保留可修后重试,成功自动清草稿)。小改仍用 write patch,只在大 JSON 从零生成时用 draft。"), n.push("⚠️ 大 JSON 分块构建是典型多轮工具调用(draft_write×N + draft_commit + read 确认 + 调研 read/query),默认 maxToolRounds=10 可能触顶被 while 截断导致草稿写不完;目标组件数大时集成方应在 createChatSdk 配 maxToolRounds ≥ 20(或按 N+5 估算)。draft_commit 提交同样走乐观锁(改前 read 拿 hash,bind 被改过会触发冲突介入,不静默覆盖)。")), i.todoDeps && n.push("复杂任务可用 todos 层级依赖:write_todos 时给 todo 传 parentId(父任务 id,表达层级)+ deps(依赖的 todo id 数组,必须先完成)。有依赖的任务,deps 全 completed 后再标 in_progress;完成时 update_todo({id, status:\"completed\", evidence:\"完成证据\"}) 记证据。无依赖关系的任务不传 parentId/deps(扁平)。"), i.focus && !a && (n.push("【上下文聚焦】判断任务范围,用 set_focus/add_focus/remove_focus/clear_focus 自动收敛工作范围:"), n.push(" · 局部任务(只改某一组件/区域,如「调导航栏」「改 components.3 样式」)→ 先 read 定位 jsonPath,再 set_focus({path:\"该子树路径\"}) 聚焦;聚焦后每轮只看该子树结构,写其他位置会被 PATH_DENIED 拒绝。"), n.push(" · 多个相关组件(如「同时改导航栏和页脚」)→ set_focus 聚焦首个后用 add_focus({path}) 追加其余;聚焦后可写任一焦点子树,越界仍被拒;移除单个用 remove_focus({path})。"), n.push(" · 全局任务(多处/整体结构,如「重排所有组件」「换主题」)→ 不要聚焦,保持全量视野直接写。"), n.push(" · 完成局部精修、要转向其他区域或做整体改动 → 调 clear_focus 退出聚焦(清空全部焦点),恢复全部读写权限。"), n.push(" · set_focus/add_focus 的 path 必须在 schema 内(类型校验);不确定路径先 read/describe_data 查。")), r && (n.push("【受保护资源·精确值保护】部分字段被 freeze/verbatim 保护(集成方在 data.resources 声明):"), n.push(" · read 受保护路径返回占位符 ⟦frozen:path⟧(freeze,精确值不入消息流)或 ⟦res:handle⟧(verbatim,原值在资源池),非真值。"), n.push(" · 确需真值用 resource_get({path})(仅受保护路径);freeze 字段完全不可改,撞 FROZEN_FIELD 即放弃该字段改动。"), n.push(" · verbatim 字段改新值:先 resource_update({path,value}) 更新资源池(同步 bind),再 write 写回句柄 ⟦res:handle⟧;直接写新值 → VERBATIM_MISMATCH。"), n.push(" · 撞 RESOURCE_EVICTED(资源被池淘汰)→ 重新 read 该字段懒注册重建句柄;撞 RESOURCE_NOT_FOUND → 重新 read。")), e?.subagents?.length) {
9301
+ let t = e.subagents.filter((e) => (e.temperature ?? 0) >= Lu || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), r = e.subagents.filter((e) => (e.temperature ?? 0) < Lu && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
9258
9302
  n.push("【规划-反思-执行·路由】按任务性质选模式,不要对简单任务过度编排:"), t.length && (n.push(` · 创作/设计/开放性需求(如"设计主题风格""换个感觉")→ 先调 ${t.map((e) => "use_" + e.id).join("/")} 出 2-3 套方案(高温创意),`), n.push(" 不要自己拍板;拿到方案后,若需用户拍板用 request_human_confirmation 弹选项。")), r.length && n.push(` · 严谨/易错/校验类 → 可先调 ${r.map((e) => "use_" + e.id).join("/")} 反思挑刺(低温审查),据反馈修订。`), n.push(a ? " · 方案定稿后,由你(主 agent)用 write 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。" : " · 方案定稿后,由你(主 agent)用 edit_data 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。"), n.push(" · 简单/明确任务(如\"标题改红色\")直接执行,不必走规划-反思。");
9259
9303
  }
9260
9304
  return e?.humanConfirm && (n.push("【人工确认·必读】以下情形必须先调 request_human_confirmation 征询用户、拿到答复后再继续,不要自行拍板:"), n.push(" 1) 用户让你「给方案/列选项/我来选/挑一个」时:把每个方案作为一个 option,调 request_human_confirmation(question=简述, options=[方案A,方案B,...], recommendation=你推荐的)。不要只回文字罗列方案让用户自己回复——要用工具把选项做成可点选按钮。"), n.push(" 2) 需求有歧义/不确定时:调工具问清楚(options 不传则用户答同意或拒绝)。"), n.push(" 3) 即将执行高风险不可逆操作(删除/覆盖/批量改动)前:调工具确认。"), n.push(" 4) 规划出多步方案需用户确认时:把整个方案(或关键分步)作为 option 调 request_human_confirmation,确认后再执行。"), n.push("用户在选项里选了哪个,就按那个方案继续;选「拒绝」则停止并询问如何调整。")), n.length && n.unshift("调用工具务必用标准 function calling(工具调用)格式发起,不要在回复正文里输出伪 XML/标签(如 deepseek 的 tool_calls 标签、invoke、function_call、tool_call 等)或 JSON 文本——那不会被识别为工具调用,会被当普通文字,工具不执行。"), n.length ? "## 能力使用提示\n" + n.join("\n") : void 0;
@@ -9263,7 +9307,7 @@ function Iu(e, t, n = "simple", r = !1) {
9263
9307
  }
9264
9308
  //#endregion
9265
9309
  //#region src/core/harness/resourcesPin.ts
9266
- function Lu(e) {
9310
+ function zu(e) {
9267
9311
  return {
9268
9312
  name: "resourcesPin",
9269
9313
  augmentPrompt: () => {
@@ -9277,78 +9321,78 @@ function Lu(e) {
9277
9321
  }
9278
9322
  //#endregion
9279
9323
  //#region src/core/backends/skillStore.ts
9280
- var Ru = "v:1::skill-store", zu = "chat-sdk";
9281
- function Bu(e, t, n) {
9282
- return `${Ru}::${e}::${t}::${n}`;
9324
+ var Bu = "v:1::skill-store", Vu = "chat-sdk";
9325
+ function Hu(e, t, n) {
9326
+ return `${Bu}::${e}::${t}::${n}`;
9283
9327
  }
9284
- function Vu(e, t) {
9285
- return `${Ru}::${e}::${t}::`;
9328
+ function Uu(e, t) {
9329
+ return `${Bu}::${e}::${t}::`;
9286
9330
  }
9287
- function Hu(e = {}) {
9288
- let t = e.dbName ?? zu, n = e.backend ?? "indexed", r = e.id ?? "", i, a, o = new Promise((e) => {
9331
+ function Wu(e = {}) {
9332
+ let t = e.dbName ?? Vu, n = e.backend ?? "indexed", r = e.id ?? "", i, a, o = new Promise((e) => {
9289
9333
  a = e;
9290
9334
  });
9291
9335
  return (async () => {
9292
9336
  try {
9293
9337
  if (n === "indexed") {
9294
9338
  if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
9295
- i = await sl(t), a(!0);
9339
+ i = await ll(t), a(!0);
9296
9340
  } else if (n === "session") {
9297
9341
  if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
9298
- i = cl(sessionStorage), a(!0);
9342
+ i = ul(sessionStorage), a(!0);
9299
9343
  } else if (n === "local") {
9300
9344
  if (typeof localStorage > "u") throw Error("localStorage 不可用");
9301
- i = cl(localStorage), a(!0);
9302
- } else i = ol(), a(!1);
9345
+ i = ul(localStorage), a(!0);
9346
+ } else i = cl(), a(!1);
9303
9347
  } catch {
9304
- i = ol(), a(!1);
9348
+ i = cl(), a(!1);
9305
9349
  }
9306
9350
  })(), {
9307
9351
  ready: o,
9308
9352
  async list() {
9309
9353
  let e = [];
9310
- return await i.scan(Vu(t, r), (t, n) => {
9354
+ return await i.scan(Uu(t, r), (t, n) => {
9311
9355
  e.push(n);
9312
9356
  }), e;
9313
9357
  },
9314
9358
  async get(e) {
9315
- return await i.get(Bu(t, r, e));
9359
+ return await i.get(Hu(t, r, e));
9316
9360
  },
9317
9361
  async put(e) {
9318
9362
  try {
9319
- await i.set(Bu(t, r, e.name), e);
9363
+ await i.set(Hu(t, r, e.name), e);
9320
9364
  } catch (e) {
9321
- Qc(e) && (i = ol());
9365
+ el(e) && (i = cl());
9322
9366
  }
9323
9367
  },
9324
9368
  async remove(e) {
9325
- let n = Bu(t, r, e);
9369
+ let n = Hu(t, r, e);
9326
9370
  return await i.get(n) == null ? !1 : (await i.del(n), !0);
9327
9371
  },
9328
9372
  async clear() {
9329
- await i.clearPrefix(Vu(t, r));
9373
+ await i.clearPrefix(Uu(t, r));
9330
9374
  },
9331
9375
  dispose() {}
9332
9376
  };
9333
9377
  }
9334
- var Uu = /large_results\/[^\s"'`),]+\.txt/g;
9335
- function Wu(e) {
9378
+ var Gu = /large_results\/[^\s"'`),]+\.txt/g;
9379
+ function Ku(e) {
9336
9380
  let t = /* @__PURE__ */ new Set(), n = (e) => {
9337
9381
  if (typeof e != "string" || !e) return;
9338
9382
  let n;
9339
- for (Uu.lastIndex = 0; (n = Uu.exec(e)) !== null;) t.add(n[0]);
9383
+ for (Gu.lastIndex = 0; (n = Gu.exec(e)) !== null;) t.add(n[0]);
9340
9384
  };
9341
9385
  for (let t of e) if (n(t.content), t.steps) for (let e of t.steps) n(e.result);
9342
9386
  return t;
9343
9387
  }
9344
- function Gu(e, t) {
9388
+ function qu(e, t) {
9345
9389
  let n = [];
9346
9390
  for (let r of Object.keys(e)) r.startsWith("large_results/") && !t.has(r) && n.push(r);
9347
9391
  return n;
9348
9392
  }
9349
9393
  //#endregion
9350
9394
  //#region src/core/utils/serialRunner.ts
9351
- function Ku() {
9395
+ function Ju() {
9352
9396
  let e = Promise.resolve();
9353
9397
  return function(t) {
9354
9398
  let n = e.then(t, t);
@@ -9357,16 +9401,16 @@ function Ku() {
9357
9401
  }
9358
9402
  //#endregion
9359
9403
  //#region src/core/sdk/createChatSdk.ts
9360
- var qu = 30, Ju = /* @__PURE__ */ new Map();
9361
- function Yu(e, t) {
9404
+ var Yu = 30, Xu = /* @__PURE__ */ new Map();
9405
+ function Zu(e, t) {
9362
9406
  return e === "set_data" ? "set" : e === "edit_data" ? "edit" : e === "delete_data" ? "delete" : e === "restore_data" ? "restore" : e === "write" ? t?.del ? "delete" : t?.patch ? "edit" : "set" : null;
9363
9407
  }
9364
- function Xu(e, t, n, r) {
9408
+ function Qu(e, t, n, r) {
9365
9409
  let i = 0;
9366
9410
  return {
9367
9411
  name: "sdk-events",
9368
9412
  wrapToolCall: async (t, r) => {
9369
- let i = await r(t), a = Yu(t.name, t.args);
9413
+ let i = await r(t), a = Zu(t.name, t.args);
9370
9414
  return a && e({
9371
9415
  type: "data_change",
9372
9416
  operation: a,
@@ -9394,7 +9438,7 @@ function Xu(e, t, n, r) {
9394
9438
  }
9395
9439
  };
9396
9440
  }
9397
- function Zu(e, t, n, r, i) {
9441
+ function $u(e, t, n, r, i) {
9398
9442
  if (!n) return i && console.warn(`[page-agent-sdk][focus] capabilities.focus 关闭,${t} 忽略`), {
9399
9443
  ok: !1,
9400
9444
  error: "capabilities.focus 关闭"
@@ -9412,31 +9456,31 @@ function Zu(e, t, n, r, i) {
9412
9456
  error: "当前无主数据 schema,无法聚焦"
9413
9457
  });
9414
9458
  }
9415
- function Qu(e, n) {
9459
+ function ed(e, n) {
9416
9460
  let i = {
9417
9461
  prompt_tokens: 0,
9418
9462
  completion_tokens: 0,
9419
9463
  total_tokens: 0
9420
- }, a = zc(() => G), o = /* @__PURE__ */ kt(0), s = dl(e.storage);
9464
+ }, a = Vc(() => G), o = /* @__PURE__ */ kt(0), s = pl(e.storage);
9421
9465
  e.debug && s && s.onEvent((e) => console.log("[page-agent-sdk][storage]", e));
9422
- let { modelCaps: c, summaryLlmInvoke: l, titleLlmInvoke: u, compressDecisionInvoke: d } = Rc(e), m = c;
9466
+ let { modelCaps: c, summaryLlmInvoke: l, titleLlmInvoke: u, compressDecisionInvoke: d } = Bc(e), m = c;
9423
9467
  if (e.debug && console.log("[page-agent-sdk][modelCaps]", m), m.contextWindow < 2e5) throw Error(`[page-agent-sdk] 模型上下文窗口 ${m.contextWindow} 小于最小支持 ${ri}(需 ≥200K 窗口模型,如 GLM-5.2/Claude/Kimi/Qwen-1M/DeepSeek-v4)`);
9424
- let h = vl(e, m.contextWindow), g = h.enableLLMSummary !== !1, _ = (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? _l[e.contextPreset ?? "auto"], v = new Set(_), y = e.llm;
9468
+ let h = bl(e, m.contextWindow), g = h.enableLLMSummary !== !1, _ = (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? yl[e.contextPreset ?? "auto"], v = new Set(_), y = e.llm;
9425
9469
  e.debug && !l && console.warn("[page-agent-sdk][summarization] 未构造 llmInvoke(apiKey 缺失?),摘要回退零成本索引摘要");
9426
- let b = /* @__PURE__ */ vt([]), x = ic(e.vfs?.initialFiles, {
9470
+ let b = /* @__PURE__ */ vt([]), x = oc(e.vfs?.initialFiles, {
9427
9471
  persist: s ? { save: (e) => {
9428
9472
  K.sessionId && s && s.save(n, K.sessionId, { vfs: e });
9429
9473
  } } : void 0,
9430
9474
  maxBytes: e.vfs?.maxBytes,
9431
9475
  poolBytes: e.vfs?.poolBytes
9432
- }), S = la([], { maxPlanRevisions: e.maxPlanRevisions }), C = ao(), w = uo({
9476
+ }), S = la([], { maxPlanRevisions: e.maxPlanRevisions }), C = so(), w = po({
9433
9477
  getSchema: () => R()?.schema,
9434
9478
  getBind: () => R()?.bind,
9435
9479
  onChange: (e) => G({
9436
9480
  type: "focus_change",
9437
9481
  focuses: e
9438
9482
  })
9439
- }), T = mo(), E = Po(e.memory || "");
9483
+ }), T = go(), E = Io(e.memory || "");
9440
9484
  typeof e.memory == "function" && E.refresh();
9441
9485
  let D = { current: null }, O = e.data ? {
9442
9486
  ...e.data,
@@ -9447,7 +9491,7 @@ function Qu(e, n) {
9447
9491
  let t = Gi(O?.schema, e._codeAsset.codeField);
9448
9492
  t.length ? (e._codeAsset.writablePaths = t, Array.isArray(e.writablePaths) && (e.writablePaths = t), console.info(`[page-agent-sdk][createHtmlSubagent] 未传 writablePaths,已从 schema 推断: [${t.map((e) => `'${e}'`).join(", ")}]`)) : (console.warn("[page-agent-sdk][createHtmlSubagent] 未能从 schema 推断 writablePaths(开放 schema(z.any()/z.record())/嵌套容器(如 sections[].children[])/点路径 codeField(如 props.html_code)不支持自动推断),已跳过该 html 子 agent(整体不受影响);如确需代码资产机制(vfs + 格式校验 + 增量 commit),请显式传 writablePaths(代码组件 data 区,如 ['components'])"), k.add(e));
9449
9493
  }
9450
- let A = k.size ? ee.filter((e) => !k.has(e)) : ee, te = k.size ? (e.subagents ?? []).filter((e) => !k.has(e)) : e.subagents, j = A.length > 0, ne = A.flatMap((e) => e._codeAsset.writablePaths), re = A.flatMap((e) => e._codeAsset.writablePaths.map((t) => `${t}.${e._codeAsset.codeField}`)), ie = e.checkpoint, ae = ie !== void 0 && ie !== !1, M = ae ? Qo({
9494
+ let A = k.size ? ee.filter((e) => !k.has(e)) : ee, te = k.size ? (e.subagents ?? []).filter((e) => !k.has(e)) : e.subagents, j = A.length > 0, ne = A.flatMap((e) => e._codeAsset.writablePaths), re = A.flatMap((e) => e._codeAsset.writablePaths.map((t) => `${t}.${e._codeAsset.codeField}`)), ie = e.checkpoint, ae = ie !== void 0 && ie !== !1, M = ae ? es({
9451
9495
  getData: () => R()?.bind,
9452
9496
  consumeDataDirty: () => L?.consumeDataDirty?.() ?? !0,
9453
9497
  slotPaths: O ? [""] : [],
@@ -9456,12 +9500,12 @@ function Qu(e, n) {
9456
9500
  getTodos: () => D.current?.getState?.()?.todos ?? [],
9457
9501
  messages: b,
9458
9502
  maxCheckpoints: ie && typeof ie == "object" ? ie.maxCheckpoints : void 0
9459
- }) : null, N = !ie || typeof ie != "object" || ie.auto !== !1, P = ml(e.capabilities), F = P.dataOps, oe = P.draftWrite, se = P.tracing, ce = P.automation, le = ec(e);
9503
+ }) : null, N = !ie || typeof ie != "object" || ie.auto !== !1, P = gl(e.capabilities), F = P.dataOps, oe = P.draftWrite, se = P.tracing, ce = P.automation, le = nc(e);
9460
9504
  if (j) {
9461
9505
  let e = A.map((e) => e._codeAsset.orchestratorPrompt).filter(Boolean).join("\n\n");
9462
9506
  e && (le += "\n\n" + e);
9463
- } else O?.schema && Wi(O.schema) && (le += "\n\n" + Xa.htmlDirectWriteFallback, console.warn("[page-agent-sdk] 检测到 schema 含 code 字段但未注册 html 子 agent:已自动注入「主 agent 自己写 HTML」编排(code 作普通字段直接 write,无 vfs 工作副本 / 无格式校验门禁)。如需代码资产机制(vfs + 格式校验 + 增量 commit + 主上下文 code 摘要),注册 createHtmlSubagent;若确为降级意图可忽略。"));
9464
- let I = F && O ? uu(O, {
9507
+ } else O?.schema && Wi(O.schema) && (le += "\n\n" + Qa.htmlDirectWriteFallback, console.warn("[page-agent-sdk] 检测到 schema 含 code 字段但未注册 html 子 agent:已自动注入「主 agent 自己写 HTML」编排(code 作普通字段直接 write,无 vfs 工作副本 / 无格式校验门禁)。如需代码资产机制(vfs + 格式校验 + 增量 commit + 主上下文 code 摘要),注册 createHtmlSubagent;若确为降级意图可忽略。"));
9508
+ let I = F && O ? fu(O, {
9465
9509
  onAudit: e.onAudit ?? (e.debug ? (e) => console.log("[page-agent-sdk][data audit]", e) : void 0),
9466
9510
  maxSnapshots: e.maxSnapshots,
9467
9511
  onConflict: a.set,
@@ -9470,14 +9514,14 @@ function Qu(e, n) {
9470
9514
  vfsStore: oe || O?.resources?.length ? x : void 0,
9471
9515
  ...ne.length ? { pgIdPaths: ne } : {},
9472
9516
  ...re.length ? { largeTextPaths: re } : {}
9473
- }) : [], ue = F ? tu(I, e.toolMode) : [], L = F && O ? I.controller ?? null : null, de = F && O?.resources?.length && L?.getResourcesSnapshot ? Lu({ getResourcesSnapshot: () => L?.getResourcesSnapshot?.() ?? [] }) : void 0, R = () => L?.get() ?? O, z = /* @__PURE__ */ new Map(), fe = Nu(P, ue, fu, vu, Tu);
9517
+ }) : [], ue = F ? ru(I, e.toolMode) : [], L = F && O ? I.controller ?? null : null, de = F && O?.resources?.length && L?.getResourcesSnapshot ? zu({ getResourcesSnapshot: () => L?.getResourcesSnapshot?.() ?? [] }) : void 0, R = () => L?.get() ?? O, z = /* @__PURE__ */ new Map(), fe = Fu(P, ue, mu, bu, Du);
9474
9518
  fe.forEach((e) => z.set(e.name, "builtin"));
9475
9519
  let pe = [...e.tools || []];
9476
9520
  pe.forEach((e) => z.set(e.name, "user"));
9477
- let B = Ou(e.actions ?? {});
9521
+ let B = Au(e.actions ?? {});
9478
9522
  B.forEach((e) => z.set(e.name, "action"));
9479
- let me = [], he = e.humanConfirm !== !1 && (!e.approval || e.approval.humanConfirmTool !== !1), ge = he ? Wo() : null;
9480
- ge && z.set(Ho, "builtin");
9523
+ let me = [], he = e.humanConfirm !== !1 && (!e.approval || e.approval.humanConfirmTool !== !1), ge = he ? Ko() : null;
9524
+ ge && z.set(Wo, "builtin");
9481
9525
  let _e = ae && M ? [r(async () => {
9482
9526
  let e = M.list();
9483
9527
  return e.length ? M.restore() ? `已回退到最近一次正常状态(checkpoint #${e[e.length - 1].id})。对话历史、主数据、vfs、todos 已整体还原。请基于回退后的状态重新判断并继续。` : "回退失败:无可用 checkpoint。" : "无可用 checkpoint,无法回退。";
@@ -9546,7 +9590,7 @@ function Qu(e, n) {
9546
9590
  Se.forEach((e) => z.set(e.name, "builtin"));
9547
9591
  let Ce = [], we = /* @__PURE__ */ new Map(), H = Te();
9548
9592
  function Te() {
9549
- let { tools: e, collisions: t } = Pu([
9593
+ let { tools: e, collisions: t } = Iu([
9550
9594
  {
9551
9595
  label: "builtin",
9552
9596
  tools: fe
@@ -9583,13 +9627,13 @@ function Qu(e, n) {
9583
9627
  return t.length && console.warn("[page-agent-sdk] 工具重名,后注册覆盖先注册:", t.map((e) => `${e.name}(${e.loser}→${e.winner})`).join(", ")), e;
9584
9628
  }
9585
9629
  let Ee = P.planning, De = P.missionAnchor, Oe = P.workingMemory, ke = P.skills, Ae = P.vfs || j;
9586
- if (Ae) for (let e of dc) z.set(e, "builtin");
9630
+ if (Ae) for (let e of pc) z.set(e, "builtin");
9587
9631
  if (Ee) for (let e of S.tools ?? []) z.set(e.name, "builtin");
9588
9632
  let je = P.summarization, Me = P.agentCompression && !!d;
9589
9633
  e.debug && P.agentCompression && !d && console.warn("[page-agent-sdk][agentCompression] agentCompression 开启但 summaryLlm 不可用(或缺 apiKey / 模型不支持工具),压缩决策不启用,回退静态压缩");
9590
- let Ne = P.memory, Pe = P.subagent, Fe = Pe ? ys() : void 0, Ie = e.verify?.maxAttempts ?? 2, Le = P.verify && e.verify?.enabled !== !1 && Ie > 0, Re = P.contextInspector;
9634
+ let Ne = P.memory, Pe = P.subagent, Fe = Pe ? xs() : void 0, Ie = e.verify?.maxAttempts ?? 2, Le = P.verify && e.verify?.enabled !== !1 && Ie > 0, Re = P.contextInspector;
9591
9635
  e.verify?.check && !P.verify && console.warn("[page-agent-sdk][verify] 检测到 verify.check 但 capabilities.verify 未开启,verify 未装载");
9592
- let U = e.subagent, ze = U?.allowedTools ?? [], Be = e.permissions?.length ? Bo(e.permissions) : void 0, Ve = e.approval && (e.approval.tools !== void 0 || e.approval.confirm) ? Vo(e.approval) : void 0, He = [...Be ? [Be] : [], ...Ve ? [Ve] : []], Ue = !Pe || U?.enabled === !1 ? void 0 : Fs({
9636
+ let U = e.subagent, ze = U?.allowedTools ?? [], Be = e.permissions?.length ? Ho(e.permissions) : void 0, Ve = e.approval && (e.approval.tools !== void 0 || e.approval.confirm) ? Uo(e.approval) : void 0, He = [...Be ? [Be] : [], ...Ve ? [Ve] : []], Ue = !Pe || U?.enabled === !1 ? void 0 : Ls({
9593
9637
  llm: U?.llm ?? e.llm,
9594
9638
  allTools: () => K.agent?.allTools ?? H,
9595
9639
  allowedTools: ze.length ? ze : void 0,
@@ -9613,7 +9657,7 @@ function Qu(e, n) {
9613
9657
  timeoutMs: U?.timeoutMs
9614
9658
  }), We = te?.map((e) => {
9615
9659
  if (!e._codeAsset) return e;
9616
- let t = e._codeAsset, n = Cc({
9660
+ let t = e._codeAsset, n = Tc({
9617
9661
  writablePaths: t.writablePaths,
9618
9662
  codeVfsPrefix: t.codeVfsPrefix,
9619
9663
  ext: t.ext,
@@ -9628,7 +9672,7 @@ function Qu(e, n) {
9628
9672
  ...e,
9629
9673
  middleware: r
9630
9674
  };
9631
- }), Ge = Pe && We !== void 0 ? Rs(We, {
9675
+ }), Ge = Pe && We !== void 0 ? Bs(We, {
9632
9676
  llm: e.llm,
9633
9677
  allTools: () => K.agent?.allTools ?? H,
9634
9678
  debug: e.debug,
@@ -9658,10 +9702,10 @@ function Qu(e, n) {
9658
9702
  llm: e.llm,
9659
9703
  tools: qe
9660
9704
  } : void 0
9661
- }) : void 0, Ye = Re ? Ks({
9705
+ }) : void 0, Ye = Re ? Js({
9662
9706
  contextWindow: m.contextWindow,
9663
- thresholdRatio: vl(e, m.contextWindow).summaryThresholdRatio
9664
- }) : void 0, Xe = Iu({
9707
+ thresholdRatio: bl(e, m.contextWindow).summaryThresholdRatio
9708
+ }) : void 0, Xe = Ru({
9665
9709
  ...P,
9666
9710
  humanConfirm: he,
9667
9711
  subagents: te?.map((e) => ({
@@ -9671,7 +9715,7 @@ function Qu(e, n) {
9671
9715
  }))
9672
9716
  }, F && !!O, e.toolMode, !!O?.resources?.length), Ze = O ? {
9673
9717
  name: "dataHint",
9674
- augmentPrompt: () => $s(R(), e.schemaHint) || void 0
9718
+ augmentPrompt: () => tc(R(), e.schemaHint) || void 0
9675
9719
  } : null, Qe = e.augmentSystem ? {
9676
9720
  name: "augmentSystem",
9677
9721
  augmentPrompt: (t) => {
@@ -9685,7 +9729,7 @@ function Qu(e, n) {
9685
9729
  return;
9686
9730
  }
9687
9731
  }
9688
- } : null, $e = hl(e.onEvent), G = $e.emit, et, tt = [], nt = (e) => ({
9732
+ } : null, $e = _l(e.onEvent), G = $e.emit, et, tt = [], nt = (e) => ({
9689
9733
  name: e.name,
9690
9734
  description: e.description,
9691
9735
  content: typeof e.getContent == "function" ? e.getContent() : ""
@@ -9693,7 +9737,7 @@ function Qu(e, n) {
9693
9737
  name: e.name,
9694
9738
  description: e.description,
9695
9739
  getContent: () => e.content
9696
- }), it = e.skillStorage === !1 ? null : Hu({
9740
+ }), it = e.skillStorage === !1 ? null : Wu({
9697
9741
  ...typeof e.skillStorage == "object" ? e.skillStorage : {},
9698
9742
  id: e.skillStorage && typeof e.skillStorage == "object" && e.skillStorage.id ? e.skillStorage.id : `agent::${n}`
9699
9743
  }), at = () => {
@@ -9716,7 +9760,7 @@ function Qu(e, n) {
9716
9760
  K.infoTick.value++;
9717
9761
  }
9718
9762
  } catch {}
9719
- }, st = je ? vs({
9763
+ }, st = je ? bs({
9720
9764
  ...h,
9721
9765
  llmInvoke: l,
9722
9766
  getRegisteredData: () => R() ? [{ description: R().description ?? "主数据对象" }] : [],
@@ -9725,12 +9769,12 @@ function Qu(e, n) {
9725
9769
  decideInvoke: d,
9726
9770
  getSnapshot: () => Ye?.getSnapshot()
9727
9771
  } : {}
9728
- }) : void 0, ct = bl([
9772
+ }) : void 0, ct = Sl([
9729
9773
  ...Ze ? [Ze] : [],
9730
9774
  Xe,
9731
9775
  ...De ? [C] : [],
9732
9776
  ...Ee ? [S] : [],
9733
- ...ke ? [et = No(e.skills || [], {
9777
+ ...ke ? [et = Fo(e.skills || [], {
9734
9778
  readVfs: Ae ? (e) => x.files[e]?.content : void 0,
9735
9779
  hostScriptEnabled: P.skillHostScript,
9736
9780
  onToolsReady: (e, t) => {
@@ -9741,15 +9785,15 @@ function Qu(e, n) {
9741
9785
  H = Te(), K.agent && K.agent.setTools(H), K.infoTick.value++;
9742
9786
  }
9743
9787
  })] : [],
9744
- ...Ae ? [pc(x)] : [],
9788
+ ...Ae ? [hc(x)] : [],
9745
9789
  ...st ? [st] : [],
9746
9790
  ...Oe ? [T] : [],
9747
9791
  ...V ? [w] : [],
9748
9792
  ...de ? [de] : [],
9749
9793
  ...Ne ? [E] : [],
9750
9794
  ...Be ? [Be] : [],
9751
- ...ae && N && M ? [$o(M)] : [],
9752
- ...he ? [Go()] : [],
9795
+ ...ae && N && M ? [ts(M)] : [],
9796
+ ...he ? [qo()] : [],
9753
9797
  ...Ve ? [Ve] : [],
9754
9798
  ...Je ? [Je] : [],
9755
9799
  ...Ue ? [Ue] : [],
@@ -9757,12 +9801,12 @@ function Qu(e, n) {
9757
9801
  ...Qe ? [Qe] : [],
9758
9802
  ...Ye ? [Ye] : [],
9759
9803
  ...e.middleware || [],
9760
- ...ce ? [Eu(i, {
9804
+ ...ce ? [Ou(i, {
9761
9805
  tokenBudget: e.tokenBudget,
9762
9806
  timeBudgetMs: e.timeBudgetMs
9763
9807
  }, G)] : [],
9764
- Xu(G, b, R, i)
9765
- ]), lt = e.maxMemoryRounds ?? qu, ut = e.approval?.timeoutMs, dt = ut === void 0 || ut === 0 ? 3e4 : !Number.isFinite(ut) || ut < 0 ? 0 : ut;
9808
+ Qu(G, b, R, i)
9809
+ ]), lt = e.maxMemoryRounds ?? Yu, ut = e.approval?.timeoutMs, dt = ut === void 0 || ut === 0 ? 3e4 : !Number.isFinite(ut) || ut < 0 ? 0 : ut;
9766
9810
  function ft(e) {
9767
9811
  if (dt) return (t) => {
9768
9812
  if (t.type !== "approval_request") return;
@@ -9785,7 +9829,7 @@ function Qu(e, n) {
9785
9829
  async function mt() {
9786
9830
  s && (pt.value = (await s.listSessions(n)).sort((e, t) => t.lastAccessed - e.lastAccessed));
9787
9831
  }
9788
- let ht = Ku(), gt = /* @__PURE__ */ new Set();
9832
+ let ht = Ju(), gt = /* @__PURE__ */ new Set();
9789
9833
  function _t(e) {
9790
9834
  let t = new AbortController();
9791
9835
  return e && (e.aborted ? t.abort() : e.addEventListener("abort", () => t.abort(), { once: !0 })), gt.add(t), {
@@ -10028,7 +10072,7 @@ function Qu(e, n) {
10028
10072
  })), e.memory && s.save(n, K.sessionId, { memory: E.get() || (typeof e.memory == "string" ? e.memory : "") }), mt(), q = void 0, Tt = !1, r;
10029
10073
  },
10030
10074
  resetSession: () => {
10031
- yt(), a.resolve("keep_external"), K.sessionId = Bc(), b.splice(0, b.length), x.clear?.(), S.reset([]), e.memory || E.reset(""), C.reset(), T.reset(), w.reset(), M && M.importStack([]), K.agent && (K.agent.debugLogs.value = []), s && s.createSession(K.agentId, e.session?.title, K.sessionId), G({
10075
+ yt(), a.resolve("keep_external"), K.sessionId = Hc(), b.splice(0, b.length), x.clear?.(), S.reset([]), e.memory || E.reset(""), C.reset(), T.reset(), w.reset(), M && M.importStack([]), K.agent && (K.agent.debugLogs.value = []), s && s.createSession(K.agentId, e.session?.title, K.sessionId), G({
10032
10076
  type: "session_restored",
10033
10077
  sessionId: K.sessionId,
10034
10078
  rounds: 0
@@ -10036,7 +10080,7 @@ function Qu(e, n) {
10036
10080
  },
10037
10081
  stream: (e, t, n) => {
10038
10082
  if (!K.agent) throw Error("page-agent-sdk: agent 尚未初始化完成,请先 await mount()");
10039
- x?.setProtectedRefs?.(Wu(e));
10083
+ x?.setProtectedRefs?.(Ku(e));
10040
10084
  let r = (e) => {
10041
10085
  t?.(e), G(e), e.type === "subagent" && (e.kind === "tool_call" || e.kind === "tool_result") && K.infoTick.value++;
10042
10086
  };
@@ -10051,7 +10095,7 @@ function Qu(e, n) {
10051
10095
  if (K.refCount--, K.refCount <= 0) {
10052
10096
  yt(), s && (x.flush?.(), s.flush(), s.dispose()), it && it.dispose();
10053
10097
  let e = K.mcpClosers.splice(0);
10054
- e.length && Promise.allSettled(e.map((e) => e())), Ju.delete(n);
10098
+ e.length && Promise.allSettled(e.map((e) => e())), Xu.delete(n);
10055
10099
  }
10056
10100
  },
10057
10101
  resolveConflict: a.resolve,
@@ -10071,14 +10115,14 @@ function Qu(e, n) {
10071
10115
  },
10072
10116
  setLlm(t) {
10073
10117
  let n;
10074
- if (kc(t)) n = t;
10118
+ if (jc(t)) n = t;
10075
10119
  else {
10076
10120
  let e = t;
10077
10121
  if ((e.provider ?? "openai") === "anthropic") throw Error("[page-agent-sdk][setLlm] 切换到 Anthropic 需传 BaseChatModel 实例(动态 import 无法同步);请先 const { ChatAnthropic } = await import(\"@langchain/anthropic\") 构造实例后传入");
10078
10122
  n = f(e);
10079
10123
  }
10080
10124
  typeof n.bindTools != "function" && e.debug && console.warn("[page-agent-sdk][setLlm] 新模型不支持 bindTools(tool calling 会失效)"), y = t;
10081
- let r = kc(t) ? void 0 : t;
10125
+ let r = jc(t) ? void 0 : t;
10082
10126
  if (m = ii({
10083
10127
  model: r?.model ?? t.model ?? t.modelName,
10084
10128
  contextWindow: e.contextWindow ?? r?.contextWindow,
@@ -10121,8 +10165,8 @@ function Qu(e, n) {
10121
10165
  return {
10122
10166
  id: n,
10123
10167
  sessionId: K.sessionId,
10124
- model: kc(y) ? y.model ?? y.modelName : y.model,
10125
- systemPrompt: K.agent?.getEffectiveSystemPrompt?.() ?? le + $s(R(), e.schemaHint),
10168
+ model: jc(y) ? y.model ?? y.modelName : y.model,
10169
+ systemPrompt: K.agent?.getEffectiveSystemPrompt?.() ?? le + tc(R(), e.schemaHint),
10126
10170
  tools: (K.agent?.allTools ?? H).map((e) => ({
10127
10171
  name: e.name,
10128
10172
  description: e.description,
@@ -10158,7 +10202,7 @@ function Qu(e, n) {
10158
10202
  spans: K.agent.spans.value,
10159
10203
  metrics: si(K.agent.spans.value)
10160
10204
  } : void 0,
10161
- actions: ku(e.actions ?? {}),
10205
+ actions: ju(e.actions ?? {}),
10162
10206
  subagent: {
10163
10207
  enabled: !!Ue,
10164
10208
  maxDepth: e.subagent?.maxDepth ?? 1,
@@ -10207,11 +10251,11 @@ function Qu(e, n) {
10207
10251
  return V ? w.getFocuses() : [];
10208
10252
  },
10209
10253
  setFocus(t) {
10210
- let n = Zu(t, "setFocus", V, () => R()?.schema, e.debug);
10254
+ let n = $u(t, "setFocus", V, () => R()?.schema, e.debug);
10211
10255
  return n.ok ? (w.setFocus(t), K.infoTick.value++, { ok: !0 }) : n;
10212
10256
  },
10213
10257
  addFocus(t) {
10214
- let n = Zu(t, "addFocus", V, () => R()?.schema, e.debug);
10258
+ let n = $u(t, "addFocus", V, () => R()?.schema, e.debug);
10215
10259
  return n.ok ? w.getFocuses().length >= 8 ? (e.debug && console.warn("[page-agent-sdk][focus] addFocus 拒绝:焦点数已达上限 8(augmentPrompt 注入每焦点子树 schema,过多致 system prompt 超预算)"), {
10216
10260
  ok: !1,
10217
10261
  error: "焦点数上限 8(避免 system prompt 撑爆)"
@@ -10255,18 +10299,18 @@ function Qu(e, n) {
10255
10299
  }
10256
10300
  function St(e) {
10257
10301
  let t = {};
10258
- for (let n of Wu(e)) {
10302
+ for (let n of Ku(e)) {
10259
10303
  let e = x.files[n];
10260
10304
  e && (t[n] = e.content);
10261
10305
  }
10262
10306
  return t;
10263
10307
  }
10264
10308
  function Ct() {
10265
- let e = Gu(x.files, Wu(b));
10309
+ let e = qu(x.files, Ku(b));
10266
10310
  for (let t of e) delete x.files[t];
10267
10311
  }
10268
10312
  function wt() {
10269
- let e = cs(b, lt);
10313
+ let e = us(b, lt);
10270
10314
  if (!e.trimmed) return;
10271
10315
  let { older: t, summary: n } = e;
10272
10316
  if (G({
@@ -10284,9 +10328,9 @@ function Qu(e, n) {
10284
10328
  let n = e.summary, { prevSeg: r } = e;
10285
10329
  (async () => {
10286
10330
  try {
10287
- let e = await l(ps(t, v)), i = b.indexOf(n);
10331
+ let e = await l(hs(t, v)), i = b.indexOf(n);
10288
10332
  if (i < 0) return;
10289
- b[i].content = ss(t, r, e), Et();
10333
+ b[i].content = ls(t, r, e), Et();
10290
10334
  } catch {}
10291
10335
  })();
10292
10336
  }
@@ -10310,7 +10354,7 @@ function Qu(e, n) {
10310
10354
  s.save(n, K.sessionId, { focus: e.length ? e : null });
10311
10355
  }
10312
10356
  ce && M && (s.save(n, K.sessionId, { checkpoints: M.exportStack() }), s.save(n, K.sessionId, { usage: i }));
10313
- let a = Oc(b);
10357
+ let a = Ac(b);
10314
10358
  a && a !== q && (q = a, s.updateTitle(n, K.sessionId, a)), e.autoTitle !== !1 && u && !Tt && b.some((e) => e.role === "user") && b.some((e) => e.role === "assistant") && (Tt = !0, (async () => {
10315
10359
  let e = await u(b);
10316
10360
  e && (await s.updateTitle(n, K.sessionId, e), await mt());
@@ -10318,7 +10362,7 @@ function Qu(e, n) {
10318
10362
  }
10319
10363
  return K.initDone = (async () => {
10320
10364
  if (await bt(), await xt(), e.mcp?.length) {
10321
- let t = await Promise.allSettled(e.mcp.map((e) => Zs(e)));
10365
+ let t = await Promise.allSettled(e.mcp.map((e) => $s(e)));
10322
10366
  K.mcpClosers = t.flatMap((e) => e.status === "fulfilled" ? [e.value.close] : []), K.mcpServers = [], t.forEach((t, n) => {
10323
10367
  let r = e.mcp[n], i = r.name ?? r.url;
10324
10368
  t.status === "fulfilled" ? (K.mcpServers.push({
@@ -10328,7 +10372,7 @@ function Qu(e, n) {
10328
10372
  }), t.value.tools.forEach((e) => z.set(e.name, `mcp:${i}`)), me.push(...t.value.tools)) : console.warn(`[page-agent-sdk][mcp] server ${i} 连接失败:`, t.reason);
10329
10373
  }), H = Te(), e.debug && console.log(`[page-agent-sdk][mcp] 注入 ${me.length} 个工具,${K.mcpServers.length} 个 server`);
10330
10374
  }
10331
- let t = kc(e.llm) ? e.llm : await p(e.llm);
10375
+ let t = jc(e.llm) ? e.llm : await p(e.llm);
10332
10376
  K.agent = Ii({
10333
10377
  llm: t,
10334
10378
  systemPrompt: le,
@@ -10359,12 +10403,12 @@ function Qu(e, n) {
10359
10403
  });
10360
10404
  })(), K;
10361
10405
  }
10362
- function $u(e, t) {
10363
- let n = e.id ?? Bc();
10406
+ function td(e, t) {
10407
+ let n = e.id ?? Hc();
10364
10408
  e.id || console.warn(`[page-agent-sdk] 未传 options.id,已生成随机 id "${n}"。刷新后持久化数据无法恢复,请传稳定 id。`);
10365
- let r = e.streaming ?? !0, i = e.ui ?? "default", a, o = e.shareContext ? Ju.get(n) : void 0;
10366
- o ? a = o : (a = Qu(e, n), e.shareContext && Ju.set(n, a)), a.refCount++;
10367
- let s = null, c = fl(e), l = null, u = null;
10409
+ let r = e.streaming ?? !0, i = e.ui ?? "default", a, o = e.shareContext ? Xu.get(n) : void 0;
10410
+ o ? a = o : (a = ed(e, n), e.shareContext && Xu.set(n, a)), a.refCount++;
10411
+ let s = null, c = ml(e), l = null, u = null;
10368
10412
  async function d(n) {
10369
10413
  if (await a.initDone, s) {
10370
10414
  s.show();
@@ -10528,7 +10572,7 @@ function $u(e, t) {
10528
10572
  error: "schema 校验失败:" + (t.error?.message ?? "未知错误")
10529
10573
  };
10530
10574
  }
10531
- return Yo(r, e), a.dataOpsController?.markDataDirty?.(), t?.emit !== !1 && a.emit({
10575
+ return Zo(r, e), a.dataOpsController?.markDataDirty?.(), t?.emit !== !1 && a.emit({
10532
10576
  type: "data_change",
10533
10577
  operation: "set",
10534
10578
  value: r
@@ -10536,12 +10580,12 @@ function $u(e, t) {
10536
10580
  },
10537
10581
  vfsWrite: (e, t) => {
10538
10582
  let n = typeof t == "string" ? t : JSON.stringify(t);
10539
- a.vfsStore.files[cc(e)] = {
10583
+ a.vfsStore.files[uc(e)] = {
10540
10584
  content: n,
10541
10585
  updatedAt: Date.now()
10542
10586
  };
10543
10587
  },
10544
- vfsRead: (e) => a.vfsStore.files[cc(e)]?.content,
10588
+ vfsRead: (e) => a.vfsStore.files[uc(e)]?.content,
10545
10589
  createResource: (e, t) => {
10546
10590
  let n = a.dataOpsController;
10547
10591
  if (!n?.createResource) throw Error("[page-agent-sdk] createResource 不可用:需配 data.resources + vfsStore(capabilities.vfs 默认开)");
@@ -10580,12 +10624,12 @@ function $u(e, t) {
10580
10624
  }
10581
10625
  //#endregion
10582
10626
  //#region src/core/sdk/ragSubagent.ts
10583
- var ed = "你是知识检索专家。可用工具:search_docs(语义检索)/ load_doc(按 source 加载)/ vfs_grep+vfs_read(搜预注入文档)/ fetch_document(公网 URL)。\n\n工作方式:\n1. 分析任务,拆出需查证的要点(如:需要哪些组件、各自的 props 约束、UI 规范要求);\n2. 多源检索:先 vfs_grep 搜预注入文档(快、静态)→ 不够用 search_docs 语义检索 → 需特定文档用 load_doc → 公网用 fetch_document;\n3. 检索结果不足时换关键词、扩大 topK、或换源重试;\n4. 综合成结构化、可执行结论(不堆原文,提炼成可直接用于决策/配置的信息);\n5. 标注关键信息来源(文档名/段落),便于溯源;检索不到明确说「未检索到」,不编造。\n\n你是只读检索角色,不要尝试修改任何数据。", td = "# 知识检索策略(RAG)\n\n## 多源决策树\n- vfs_grep / vfs_read:搜集成方预注入 vfs 的文档(组件文档 / UI 规范)—— 快、静态,先查\n- search_docs:语义检索(retriever 向量库)—— 模糊匹配,关键词不确定 / 语义相似时用\n- load_doc:按 source 精确加载(已知文档 id / URL / key)—— 精确取特定文档\n- fetch_document:公网 URL —— 查公开资料\n\n## 综合规范\n- 多源交叉验证(关键结论优先 ≥2 源印证,或单一权威源)\n- 标注来源(文档名 / URL / 段落),便于溯源\n- 结构化、可执行结论(组件清单 + 各自 props 约束 + 适用场景),不堆原文\n- 未检索到明确说「未检索到」,不编造;建议替代方案(改关键词 / 建议写代码组件等)\n\n## 何时用何源\n- 静态文档(组件库文档 / UI 规范):vfs_grep\n- 语义相似(「瀑布流组件」「倒计时」「拼团」):search_docs\n- 已知文档 id / URL:load_doc\n- 公开 URL(设计规范网站 / 第三方文档):fetch_document", nd = {
10627
+ var nd = "你是知识检索专家。可用工具:search_docs(语义检索)/ load_doc(按 source 加载)/ vfs_grep+vfs_read(搜预注入文档)/ fetch_document(公网 URL)。\n\n工作方式:\n1. 分析任务,拆出需查证的要点(如:需要哪些组件、各自的 props 约束、UI 规范要求);\n2. 多源检索:先 vfs_grep 搜预注入文档(快、静态)→ 不够用 search_docs 语义检索 → 需特定文档用 load_doc → 公网用 fetch_document;\n3. 检索结果不足时换关键词、扩大 topK、或换源重试;\n4. 综合成结构化、可执行结论(不堆原文,提炼成可直接用于决策/配置的信息);\n5. 标注关键信息来源(文档名/段落),便于溯源;检索不到明确说「未检索到」,不编造。\n\n你是只读检索角色,不要尝试修改任何数据。", rd = "# 知识检索策略(RAG)\n\n## 多源决策树\n- vfs_grep / vfs_read:搜集成方预注入 vfs 的文档(组件文档 / UI 规范)—— 快、静态,先查\n- search_docs:语义检索(retriever 向量库)—— 模糊匹配,关键词不确定 / 语义相似时用\n- load_doc:按 source 精确加载(已知文档 id / URL / key)—— 精确取特定文档\n- fetch_document:公网 URL —— 查公开资料\n\n## 综合规范\n- 多源交叉验证(关键结论优先 ≥2 源印证,或单一权威源)\n- 标注来源(文档名 / URL / 段落),便于溯源\n- 结构化、可执行结论(组件清单 + 各自 props 约束 + 适用场景),不堆原文\n- 未检索到明确说「未检索到」,不编造;建议替代方案(改关键词 / 建议写代码组件等)\n\n## 何时用何源\n- 静态文档(组件库文档 / UI 规范):vfs_grep\n- 语义相似(「瀑布流组件」「倒计时」「拼团」):search_docs\n- 已知文档 id / URL:load_doc\n- 公开 URL(设计规范网站 / 第三方文档):fetch_document", id = {
10584
10628
  name: "rag-search",
10585
10629
  description: "多源知识检索策略:vfs 预注入文档 → 语义检索 → 指定文档加载 → 公网;综合结构化结论 + 溯源",
10586
- getContent: () => td
10630
+ getContent: () => rd
10587
10631
  };
10588
- function rd(e, n, i) {
10632
+ function ad(e, n, i) {
10589
10633
  return r(async ({ query: e, topK: t }) => {
10590
10634
  try {
10591
10635
  let r = await n(e, { topK: t ?? i });
@@ -10602,7 +10646,7 @@ function rd(e, n, i) {
10602
10646
  })
10603
10647
  });
10604
10648
  }
10605
- function id(e, n) {
10649
+ function od(e, n) {
10606
10650
  return r(async ({ source: e }) => {
10607
10651
  try {
10608
10652
  let t = await n(e), r = Array.isArray(t) ? t : [t];
@@ -10616,11 +10660,11 @@ function id(e, n) {
10616
10660
  schema: t.object({ source: t.string().describe("文档标识(id/URL/key)") })
10617
10661
  });
10618
10662
  }
10619
- function ad(e) {
10663
+ function sd(e) {
10620
10664
  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;
10621
10665
  if (!t && !n && r === !1) throw Error("[page-agent-sdk][createRagSubagent] 至少配一种知识源:retriever / loader / useVfs(true)");
10622
10666
  let p = [];
10623
- t && p.push(rd(s, t, o)), n && p.push(id(c, n)), f && p.push(...f);
10667
+ t && p.push(ad(s, t, o)), n && p.push(od(c, n)), f && p.push(...f);
10624
10668
  let m = r ? [
10625
10669
  "vfs_grep",
10626
10670
  "vfs_read",
@@ -10629,17 +10673,17 @@ function ad(e) {
10629
10673
  return {
10630
10674
  id: i,
10631
10675
  description: a ?? "检索知识库(组件文档/UI 规范/业务规则),返回有依据的结构化结论。需要查阅文档才能回答或决定如何配置时委派",
10632
- systemPrompt: ed,
10676
+ systemPrompt: nd,
10633
10677
  tools: p.length ? p : void 0,
10634
10678
  allowedTools: m,
10635
- skills: d ?? [nd],
10679
+ skills: d ?? [id],
10636
10680
  maxToolRounds: l,
10637
10681
  ...u === void 0 ? {} : { summarization: u }
10638
10682
  };
10639
10683
  }
10640
10684
  //#endregion
10641
10685
  //#region src/core/utils/clipboard.ts
10642
- async function od(e) {
10686
+ async function cd(e) {
10643
10687
  try {
10644
10688
  let t = globalThis.navigator?.clipboard;
10645
10689
  if (t && typeof t.writeText == "function") return await t.writeText(e), !0;
@@ -10657,8 +10701,8 @@ async function od(e) {
10657
10701
  }
10658
10702
  //#endregion
10659
10703
  //#region src/core/composables/useChat.ts
10660
- var sd = 4e3;
10661
- function cd(e = {}) {
10704
+ var ld = 4e3;
10705
+ function ud(e = {}) {
10662
10706
  let { fetchResponse: t, fetchStream: n, onPersist: r, onClear: i, onQueuedCleared: a } = e, o = /* @__PURE__ */ vt({
10663
10707
  messages: e.messages ?? [],
10664
10708
  loading: !1,
@@ -10727,7 +10771,7 @@ function cd(e = {}) {
10727
10771
  let t = e.delta || "";
10728
10772
  n.subReasonFull = (n.subReasonFull || "") + t;
10729
10773
  let r = (n.subReason || "") + t;
10730
- n.subReason = r.length > sd ? r.slice(-4e3) : r;
10774
+ n.subReason = r.length > ld ? r.slice(-4e3) : r;
10731
10775
  break;
10732
10776
  }
10733
10777
  n.children ||= [];
@@ -10846,9 +10890,9 @@ function cd(e = {}) {
10846
10890
  }
10847
10891
  //#endregion
10848
10892
  //#region src/core/composables/chatContext.ts
10849
- var ld = Symbol("chatContext");
10850
- function ud(e = {}) {
10851
- let t = cd({
10893
+ var dd = Symbol("chatContext");
10894
+ function fd(e = {}) {
10895
+ let t = ud({
10852
10896
  fetchResponse: e.fetchResponse,
10853
10897
  fetchStream: e.fetchStream,
10854
10898
  messages: e.messages,
@@ -10868,7 +10912,7 @@ function ud(e = {}) {
10868
10912
  }, h = /* @__PURE__ */ kt({}), g = (e) => h.value[e] === !0, _ = (e) => {
10869
10913
  h.value[e] = !g(e);
10870
10914
  }, v = /* @__PURE__ */ kt(!1), y = (e) => {
10871
- od(e).then((e) => {
10915
+ cd(e).then((e) => {
10872
10916
  e && (v.value = !0, setTimeout(() => {
10873
10917
  v.value = !1;
10874
10918
  }, 1500));
@@ -10936,15 +10980,15 @@ function ud(e = {}) {
10936
10980
  }
10937
10981
  };
10938
10982
  }
10939
- function dd() {
10940
- let e = In(ld);
10983
+ function pd() {
10984
+ let e = In(dd);
10941
10985
  if (!e) throw Error("useChatContext 必须在 provide(chatContextKey) 的组件子树内调用");
10942
10986
  return e;
10943
10987
  }
10944
10988
  //#endregion
10945
10989
  //#region src/core/index.headless.ts
10946
- function fd(e) {
10947
- return $u(e);
10990
+ function md(e) {
10991
+ return td(e);
10948
10992
  }
10949
10993
  //#endregion
10950
- export { pl as CAPABILITIES, gl as CONTEXT_PRESETS, Dc as CompressDecisionSchema, Qs as DEFAULT_SYSTEM_PROMPT, Ca as HTML_VOID_TAGS, Ho as HUMAN_CONFIRM_TOOL_NAME, ri as MIN_CONTEXT_WINDOW, ls as STOP_WORDS, Ea as UNSAFE_KEYS, ku as actionsToInspectInfo, Ou as actionsToTools, Xr as agentError, Gs as analyzeContext, Ia as applyPatchToClone, La as applyPatchToLive, Yr as asAgentError, $s as buildDataPrompt, ec as buildSystemPrompt, ld as chatContextKey, nu as commitSetToBind, Zs as connectMcp, p as constructLlmFromConfig, f as constructOpenLlmSync, od as copyText, Ii as createAgent, Vo as createApprovalMiddleware, ud as createChatContext, fd as createChatSdk, Qo as createCheckpointManager, $o as createCheckpointMiddleware, zc as createConflictManager, Ks as createContextInspectorMiddleware, uu as createDataOps, Wa as createHtmlFormatCheck, qa as createHtmlSubagent, Go as createHumanConfirmMiddleware, Wo as createHumanConfirmTool, ol as createMemoryBackend, Po as createMemoryMiddleware, u as createProxyLlm, ad as createRagSubagent, vo as createSandboxRunner, hl as createSdkEvents, Ku as createSerialRunner, ul as createSessionStore, Hu as createSkillStore, Fs as createSubagentMiddleware, ys as createSubagentTracker, Rs as createSubagentsMiddleware, Iu as createUsageHintsMiddleware, ua as createVerifyMiddleware, ic as createVfs, cl as createWebStorageBackend, ga as createWriteBackCheck, ja as deepClone, Mu as defineDataToolset, bo as defineSkill, wc as defineTool, Aa as deleteByPath, Oc as deriveTitle, $i as describeSchemaNode, Ei as detectGarbledToolCall, Ba as diffObjects, gu as domToStructure, vu as domTools, ju as domToolsStatic, ds as estimateMessageTokens, fs as estimateRoundTokens, X as estimateTokens, h as extractReasoningDelta, eo as extractSchemaHint, qs as extractText, m as extractTextDelta, g as extractUsage, fu as fetchDocTools, Au as fetchTools, tu as filterByToolMode, ea as formatConstraints, Gr as formatZodIssues, Z as getByPath, _u as getDomTool, xu as getEnvSummary, Bi as getSchemaAtPath, Li as getSchemaTopKeys, si as getTraceMetrics, $ as hashValue, Ya as htmlOrchestratorPrompt, ps as indexSummarize, wu as inspectEnvTool, Tu as inspectTools, kc as isChatModel, _i as isContextLengthError, Ri as isPathAllowed, Qc as isQuotaError, Da as isUnsafePath, Al as jpEval, qr as jsonParseError, Pa as limitDepth, Ma as maybeParseValue, _ as normalizeUsage, oi as offloadPassThroughChars, ai as offloadThresholdChars, Ja as presets, qi as projectBySchema, Ki as projectBySchemaDeep, Na as projectFields, ms as recallRounds, ta as renderSchemaHint, na as renderSchemaOverview, aa as renderSchemaShallow, ml as resolveCapabilities, vl as resolveContextOptions, fl as resolveDialogConfig, Rc as resolveLlm, ii as resolveModelCaps, dl as resolveStorage, za as restoreInPlace, Ra as restoreLive, Jr as routeError, yo as runHostScript, Pl as runSandboxedScript, Oa as safeMerge, bu as safeSerialize, Q as safeStringify, Ml as searchJson, Nu as selectBuiltinTools, ka as setByPath, hs as shouldTriggerCompression, Xa as systemPromptHelpers, us as tokenize, Y as toolError, zi as unwrapSchema, cd as useChat, dd as useChatContext, Ta as validateHtmlFormat, e as z, Kr as zodError };
10994
+ export { hl as CAPABILITIES, vl as CONTEXT_PRESETS, kc as CompressDecisionSchema, ec as DEFAULT_SYSTEM_PROMPT, Ca as HTML_VOID_TAGS, Wo as HUMAN_CONFIRM_TOOL_NAME, ri as MIN_CONTEXT_WINDOW, ds as STOP_WORDS, Ea as UNSAFE_KEYS, ju as actionsToInspectInfo, Au as actionsToTools, Xr as agentError, qs as analyzeContext, Ia as applyPatchToClone, za as applyPatchToLive, Yr as asAgentError, tc as buildDataPrompt, nc as buildSystemPrompt, dd as chatContextKey, iu as commitSetToBind, $s as connectMcp, p as constructLlmFromConfig, f as constructOpenLlmSync, cd as copyText, Ii as createAgent, Uo as createApprovalMiddleware, fd as createChatContext, md as createChatSdk, es as createCheckpointManager, ts as createCheckpointMiddleware, Vc as createConflictManager, Js as createContextInspectorMiddleware, fu as createDataOps, Ka as createHtmlFormatCheck, Ya as createHtmlSubagent, qo as createHumanConfirmMiddleware, Ko as createHumanConfirmTool, cl as createMemoryBackend, Io as createMemoryMiddleware, u as createProxyLlm, sd as createRagSubagent, bo as createSandboxRunner, _l as createSdkEvents, Ju as createSerialRunner, fl as createSessionStore, Wu as createSkillStore, Ls as createSubagentMiddleware, xs as createSubagentTracker, Bs as createSubagentsMiddleware, Ru as createUsageHintsMiddleware, ua as createVerifyMiddleware, oc as createVfs, ul as createWebStorageBackend, ga as createWriteBackCheck, ja as deepClone, Pu as defineDataToolset, So as defineSkill, Ec as defineTool, Aa as deleteByPath, Ac as deriveTitle, $i as describeSchemaNode, Ei as detectGarbledToolCall, Ha as diffObjects, vu as domToStructure, bu as domTools, Nu as domToolsStatic, ps as estimateMessageTokens, ms as estimateRoundTokens, X as estimateTokens, h as extractReasoningDelta, no as extractSchemaHint, Ys as extractText, m as extractTextDelta, g as extractUsage, mu as fetchDocTools, Mu as fetchTools, ru as filterByToolMode, ea as formatConstraints, Gr as formatZodIssues, Z as getByPath, yu as getDomTool, Cu as getEnvSummary, Bi as getSchemaAtPath, Li as getSchemaTopKeys, si as getTraceMetrics, $ as hashValue, Za as htmlOrchestratorPrompt, hs as indexSummarize, Eu as inspectEnvTool, Du as inspectTools, jc as isChatModel, _i as isContextLengthError, Ri as isPathAllowed, el as isQuotaError, Da as isUnsafePath, Ml as jpEval, qr as jsonParseError, Pa as limitDepth, Ma as maybeParseValue, _ as normalizeUsage, oi as offloadPassThroughChars, ai as offloadThresholdChars, Xa as presets, qi as projectBySchema, Ki as projectBySchemaDeep, Na as projectFields, gs as recallRounds, ta as renderSchemaHint, na as renderSchemaOverview, aa as renderSchemaShallow, gl as resolveCapabilities, bl as resolveContextOptions, ml as resolveDialogConfig, Bc as resolveLlm, ii as resolveModelCaps, pl as resolveStorage, Va as restoreInPlace, Ba as restoreLive, Jr as routeError, xo as runHostScript, Il as runSandboxedScript, Oa as safeMerge, Su as safeSerialize, Q as safeStringify, Pl as searchJson, Fu as selectBuiltinTools, ka as setByPath, _s as shouldTriggerCompression, Qa as systemPromptHelpers, fs as tokenize, Y as toolError, zi as unwrapSchema, ud as useChat, pd as useChatContext, Ta as validateHtmlFormat, e as z, Kr as zodError };