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.
- package/README.md +3 -3
- package/README.zh-CN.md +3 -3
- package/dist/page-agent-sdk.headless.js +742 -698
- package/dist/page-agent-sdk.iife.js +131 -131
- package/dist/page-agent-sdk.js +1517 -1473
- package/dist/page-agent-sdk.umd.cjs +77 -77
- package/package.json +1 -1
- package/types/index.d.ts +3 -1
|
@@ -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
|
|
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
|
|
3654
|
-
typeof e == "object" && e &&
|
|
3686
|
+
function Ba(e, t) {
|
|
3687
|
+
typeof e == "object" && e && Va(e, t);
|
|
3655
3688
|
}
|
|
3656
|
-
function
|
|
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
|
|
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(...
|
|
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(...
|
|
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
|
|
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
|
|
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
|
|
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: () =>
|
|
3792
|
+
getContent: () => Wa
|
|
3760
3793
|
};
|
|
3761
|
-
function
|
|
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
|
|
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
|
|
3832
|
-
function
|
|
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(
|
|
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:
|
|
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 ?
|
|
3885
|
+
maxVerifyAttempts: d ? Ja : void 0,
|
|
3853
3886
|
temperature: c,
|
|
3854
|
-
skills: l ?? [
|
|
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:
|
|
3896
|
+
...p ? { orchestratorPrompt: Za(r) } : {}
|
|
3864
3897
|
}
|
|
3865
3898
|
};
|
|
3866
3899
|
}
|
|
3867
3900
|
//#endregion
|
|
3868
3901
|
//#region src/core/presets.ts
|
|
3869
|
-
var
|
|
3902
|
+
var Xa = {
|
|
3870
3903
|
pageBuilder: {
|
|
3871
3904
|
systemPrompt: "你是页面构建助手。按用户意图读写主数据(经 data 声明 + schema 校验),改完页面实时更新。",
|
|
3872
3905
|
get subagents() {
|
|
3873
|
-
return [
|
|
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
|
|
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
|
|
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:
|
|
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
|
-
},
|
|
3918
|
-
function
|
|
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 =
|
|
3956
|
+
let t = to.get(e);
|
|
3923
3957
|
if (t && t.optsKey === n) return t.hint;
|
|
3924
3958
|
}
|
|
3925
|
-
let r =
|
|
3926
|
-
return typeof e == "object" &&
|
|
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
|
|
3965
|
+
function ro(e, t) {
|
|
3932
3966
|
let n = na(e);
|
|
3933
3967
|
if (n) {
|
|
3934
|
-
let r = t?.maxKeys ??
|
|
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
|
|
3946
|
-
function
|
|
3947
|
-
return !e || e.trim().length < 8 || /^(你好|hi|hello|ok|好的|继续|嗯|谢谢|hey|哈喽|收到|明白)/i.test(e.trim()) || e.length > 2e3 ? !1 :
|
|
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
|
|
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 (
|
|
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
|
|
3995
|
+
function so() {
|
|
3962
3996
|
let e, t = !1;
|
|
3963
3997
|
return {
|
|
3964
3998
|
name: "mission",
|
|
3965
|
-
beforeAgent: (n) => (!e && !t && (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
|
|
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
|
|
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
|
|
4038
|
+
function uo(e, t) {
|
|
4005
4039
|
return e === t || e.startsWith(t + ".");
|
|
4006
4040
|
}
|
|
4007
|
-
function
|
|
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
|
|
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 ?
|
|
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 =
|
|
4082
|
+
let i = lo(n.args);
|
|
4049
4083
|
if (!i.length) return a("(整体数据)");
|
|
4050
|
-
for (let n of i) if (!t.some((e) =>
|
|
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 (
|
|
4054
|
-
let r =
|
|
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) =>
|
|
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
|
|
4117
|
+
var mo = 10, ho = /* @__PURE__ */ new Set([
|
|
4084
4118
|
"read",
|
|
4085
4119
|
"query_data",
|
|
4086
4120
|
"search_data"
|
|
4087
4121
|
]);
|
|
4088
|
-
function
|
|
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 >
|
|
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 >
|
|
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" &&
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
4237
|
+
function bo(e, t = 3e3) {
|
|
4204
4238
|
return async (n) => {
|
|
4205
|
-
for (let { re: t, msg: n } of
|
|
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 =
|
|
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
|
|
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
|
|
4315
|
+
function So(e) {
|
|
4282
4316
|
return e;
|
|
4283
4317
|
}
|
|
4284
|
-
var
|
|
4285
|
-
function
|
|
4286
|
-
return
|
|
4318
|
+
var Co = /^https?:\/\//i;
|
|
4319
|
+
function wo(e) {
|
|
4320
|
+
return Co.test(e) || e.startsWith("//") ? "http" : "vfs";
|
|
4287
4321
|
}
|
|
4288
|
-
function
|
|
4322
|
+
function To(e) {
|
|
4289
4323
|
return e.replace(/^vfs:\/\//, "").replace(/^\/+/, "").replace(/\/+/g, "/");
|
|
4290
4324
|
}
|
|
4291
|
-
var
|
|
4292
|
-
async function
|
|
4293
|
-
let t = new AbortController(), n = setTimeout(() => t.abort(),
|
|
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
|
|
4301
|
-
if (
|
|
4302
|
-
let t = await
|
|
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: `读取超时(${
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
4387
|
+
async function jo(e) {
|
|
4354
4388
|
try {
|
|
4355
|
-
let t = await
|
|
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
|
|
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
|
|
4414
|
+
let n = await xo(e.code);
|
|
4381
4415
|
return n.ok ? {
|
|
4382
4416
|
ok: !0,
|
|
4383
|
-
text:
|
|
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
|
|
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
|
|
4432
|
+
let o = await bo(a)(void 0);
|
|
4399
4433
|
return o.ok ? {
|
|
4400
4434
|
ok: !0,
|
|
4401
|
-
text:
|
|
4435
|
+
text: Ao(o.result)
|
|
4402
4436
|
} : {
|
|
4403
4437
|
ok: !1,
|
|
4404
4438
|
error: o.error || "沙箱脚本执行失败"
|
|
4405
4439
|
};
|
|
4406
4440
|
}
|
|
4407
|
-
async function
|
|
4441
|
+
async function No(e, t) {
|
|
4408
4442
|
let n = null;
|
|
4409
4443
|
if (e.doc) {
|
|
4410
|
-
let r = await
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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: () =>
|
|
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
|
|
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
|
|
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
|
-
]),
|
|
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
|
|
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
|
|
4549
|
-
for (let r of e) if (r.operations.includes(t) && r.scopes.some((e) =>
|
|
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
|
|
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
|
|
4591
|
+
function Ho(e) {
|
|
4558
4592
|
return {
|
|
4559
4593
|
name: "permissions",
|
|
4560
4594
|
wrapToolCall: async (t, n) => {
|
|
4561
|
-
let r =
|
|
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 =
|
|
4597
|
+
let i = Vo(t.args);
|
|
4564
4598
|
if (r === "write" && !i.length && (i = [""]), r && i.length) {
|
|
4565
|
-
for (let t of i) if (
|
|
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
|
|
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
|
|
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
|
|
4653
|
+
function Ko() {
|
|
4620
4654
|
return r(async () => "人工确认中间件未装载,无法征询用户。请直接向用户说明情况并等待回复。", {
|
|
4621
|
-
name:
|
|
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:
|
|
4665
|
+
schema: Go
|
|
4632
4666
|
});
|
|
4633
4667
|
}
|
|
4634
|
-
function
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
4696
|
-
let n =
|
|
4697
|
-
typeof n == "object" && n ?
|
|
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
|
|
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
|
|
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 =
|
|
4713
|
-
if (e.getData) ((e.consumeDataDirty?.() ?? !0) || a === void 0) && (a =
|
|
4714
|
-
else for (let t of e.slotPaths ?? []) c[t] =
|
|
4715
|
-
((e.vfsStore.consumeDirty?.() ?? !0) || i === void 0) && (i =
|
|
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:
|
|
4754
|
+
messages: Jo(s),
|
|
4721
4755
|
windowVals: c,
|
|
4722
4756
|
vfs: i,
|
|
4723
|
-
todos:
|
|
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, ...
|
|
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 &&
|
|
4781
|
+
typeof n == "object" && n && Zo(n, Jo(t));
|
|
4748
4782
|
}
|
|
4749
|
-
} else for (let [e, t] of Object.entries(r.windowVals))
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
4803
|
-
function
|
|
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
|
|
4844
|
+
function ss(e) {
|
|
4811
4845
|
return typeof e != "string" || !e.startsWith("【更早对话摘要") ? null : { body: e.replace(/^【[^】]*】\n?/, "") };
|
|
4812
4846
|
}
|
|
4813
|
-
function
|
|
4814
|
-
return `${
|
|
4847
|
+
function cs(e) {
|
|
4848
|
+
return `${as}${e.cumulative ? `(${e.rounds ?? 0} 轮,含累积)` : e.rounds ? `(${e.rounds} 轮)` : ""}】\n${e.body}`;
|
|
4815
4849
|
}
|
|
4816
|
-
function
|
|
4817
|
-
return os(
|
|
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
|
|
4856
|
+
function us(e, t) {
|
|
4823
4857
|
if (t <= 0) return { trimmed: !1 };
|
|
4824
|
-
let n =
|
|
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 =
|
|
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(
|
|
4871
|
+
content: cs(os({
|
|
4838
4872
|
body: i.map((e) => {
|
|
4839
|
-
let t =
|
|
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
|
|
4853
|
-
function
|
|
4854
|
-
return e.toLowerCase().split(/[^a-z0-9一-龥]+/i).map((e) => e.trim()).filter((e) => e.length >= 2 && !
|
|
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
|
|
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
|
|
4862
|
-
let t =
|
|
4863
|
-
for (let n of e.assistantMsgs) t +=
|
|
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
|
|
4900
|
+
function hs(e, t) {
|
|
4867
4901
|
return e.map((e) => {
|
|
4868
|
-
let n =
|
|
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}: ${
|
|
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
|
|
4878
|
-
let r =
|
|
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) =>
|
|
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
|
|
4889
|
-
return t.contextWindow && t.contextWindow > 0 ? e.reduce((e, t) => e +
|
|
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
|
|
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
|
|
4935
|
+
function ys(e = {}) {
|
|
4902
4936
|
let t = {
|
|
4903
|
-
...
|
|
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 =
|
|
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 =
|
|
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 (!
|
|
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 +=
|
|
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 =
|
|
4961
|
-
n && n.coveredCount >= t ? (g = n.text, _ = d + "llm_summary(cached)") : n && n.coveredCount > 0 ? (g = n.text + "\n" +
|
|
4962
|
-
} else g =
|
|
4963
|
-
let v = r?.recallTopK == null ? t.enableRecall ? t.recallTopK : 0 : r.recallTopK, y = v > 0 ?
|
|
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
|
|
5006
|
-
let t =
|
|
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 =
|
|
5013
|
-
if (
|
|
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
|
|
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
|
|
5104
|
+
function Ss(e) {
|
|
5071
5105
|
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
5072
5106
|
}
|
|
5073
|
-
var
|
|
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
|
-
],
|
|
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
|
|
5092
|
-
return
|
|
5125
|
+
function ks(e) {
|
|
5126
|
+
return Ds.includes(e) || Os.includes(e) || e.startsWith("use_");
|
|
5093
5127
|
}
|
|
5094
|
-
function
|
|
5095
|
-
return [...e.filter((e) => t.has(e.name) && !
|
|
5128
|
+
function As(e, t, n = []) {
|
|
5129
|
+
return [...e.filter((e) => t.has(e.name) && !ks(e.name)), ...n];
|
|
5096
5130
|
}
|
|
5097
|
-
var
|
|
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
|
|
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
|
|
5143
|
+
function Ns(e, t) {
|
|
5110
5144
|
return t.some((t) => e === t || e.startsWith(t + ".") || e.startsWith(t + "["));
|
|
5111
5145
|
}
|
|
5112
|
-
function
|
|
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 =
|
|
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 (!
|
|
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
|
|
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
|
|
5143
|
-
let o = t.depth ?? 0, s = t.maxDepth ??
|
|
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) => !
|
|
5146
|
-
let e = l().filter((e) =>
|
|
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 ?
|
|
5151
|
-
let f = o + 1 < s ? [
|
|
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 ?
|
|
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:
|
|
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 :
|
|
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
|
-
...
|
|
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 ? [
|
|
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 ??
|
|
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
|
|
5239
|
-
let n = e.maxParallel ??
|
|
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) => !
|
|
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
|
|
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
|
|
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
|
|
5343
|
-
function
|
|
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
|
|
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 (!
|
|
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 =
|
|
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
|
|
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
|
|
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
|
-
],
|
|
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
|
|
5609
|
+
function Us() {
|
|
5576
5610
|
let e = {};
|
|
5577
|
-
for (let t of
|
|
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
|
|
5620
|
+
function Ws(e, t) {
|
|
5587
5621
|
e.tokens += t, e.msgCount += 1;
|
|
5588
5622
|
}
|
|
5589
|
-
function
|
|
5623
|
+
function Gs(e) {
|
|
5590
5624
|
let t = e.content;
|
|
5591
5625
|
return typeof t == "string" ? t : JSON.stringify(t ?? "");
|
|
5592
5626
|
}
|
|
5593
|
-
function
|
|
5627
|
+
function Ks(e, t) {
|
|
5594
5628
|
let n = [];
|
|
5595
|
-
for (let t of
|
|
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 &&
|
|
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 &&
|
|
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 &&
|
|
5651
|
+
o && Ws(t[n[r].key], X(o));
|
|
5618
5652
|
}
|
|
5619
5653
|
}
|
|
5620
|
-
function
|
|
5621
|
-
let n =
|
|
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)
|
|
5629
|
-
else if (c instanceof a)
|
|
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
|
-
|
|
5635
|
-
} else
|
|
5636
|
-
} else c instanceof s ?
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
5699
|
-
return r(async (r) =>
|
|
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
|
|
5709
|
-
let { Client: t } = await import("@modelcontextprotocol/sdk/client"), n = await
|
|
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) =>
|
|
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
|
|
5767
|
+
var ec = [
|
|
5734
5768
|
"你是一个 JSON 操作助手。集成方声明了一个主数据对象(含 zod schema 校验),你通过专用工具安全地读写它来完成任务。",
|
|
5735
5769
|
"所有写操作都经范围控制(仅 schema 声明字段内)与 schema 校验(不合法会返回结构化错误而非写入),并自动留快照可回退。",
|
|
5736
5770
|
"大对象/数组优先用增量 patch(只发改动)而非整体重传,避免输出被截断。",
|
|
5737
5771
|
"---",
|
|
5738
|
-
|
|
5772
|
+
Qa.reliableWriteRules
|
|
5739
5773
|
].join("\n\n");
|
|
5740
|
-
function
|
|
5774
|
+
function tc(e, t) {
|
|
5741
5775
|
if (!e) return "";
|
|
5742
|
-
let n =
|
|
5776
|
+
let n = no(e.schema, t);
|
|
5743
5777
|
return `\n\n## 可操作数据(字段以 read 工具返回的实际值为准)\n${e.description ? e.description + "\n" : ""}${n}`;
|
|
5744
5778
|
}
|
|
5745
|
-
function
|
|
5779
|
+
function nc(e) {
|
|
5746
5780
|
let t = e.appendReliableWriteRules !== !1;
|
|
5747
|
-
return e.systemPrompt ? t ? e.systemPrompt + "\n\n---\n\n" +
|
|
5781
|
+
return e.systemPrompt ? t ? e.systemPrompt + "\n\n---\n\n" + Qa.reliableWriteRules : e.systemPrompt : ec;
|
|
5748
5782
|
}
|
|
5749
|
-
var
|
|
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
|
-
},
|
|
5788
|
+
}, ic = [
|
|
5755
5789
|
"largeResults",
|
|
5756
5790
|
"drafts",
|
|
5757
5791
|
"userFiles",
|
|
5758
5792
|
"resources"
|
|
5759
|
-
],
|
|
5760
|
-
function
|
|
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[
|
|
5796
|
+
if (e) for (let [t, r] of Object.entries(e)) n[uc(t)] = {
|
|
5763
5797
|
content: r,
|
|
5764
|
-
updatedAt:
|
|
5798
|
+
updatedAt: fc()
|
|
5765
5799
|
};
|
|
5766
5800
|
let { persist: r } = t, i = t.maxBytes ?? 8388608, a = {
|
|
5767
|
-
...
|
|
5801
|
+
...rc,
|
|
5768
5802
|
...t.poolBytes ?? {}
|
|
5769
5803
|
};
|
|
5770
5804
|
function o(e) {
|
|
5771
|
-
let t =
|
|
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 +=
|
|
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
|
|
5814
|
+
for (let e of ic) {
|
|
5781
5815
|
let t = a[e];
|
|
5782
5816
|
if (s(e) <= t) continue;
|
|
5783
|
-
let r = t *
|
|
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 (
|
|
5789
|
-
let e = i *
|
|
5790
|
-
for (let [i] of r) if (!(o(i) === "largeResults" && !t && u.has(i)) && (delete n[i],
|
|
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[
|
|
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
|
|
5836
|
-
function
|
|
5837
|
-
return
|
|
5869
|
+
var sc = null;
|
|
5870
|
+
function cc(e) {
|
|
5871
|
+
return sc ||= new TextEncoder(), sc.encode(e).length;
|
|
5838
5872
|
}
|
|
5839
|
-
function
|
|
5873
|
+
function lc(e) {
|
|
5840
5874
|
let t = 0;
|
|
5841
|
-
for (let n of Object.values(e)) t +=
|
|
5875
|
+
for (let n of Object.values(e)) t += cc(n.content);
|
|
5842
5876
|
return t;
|
|
5843
5877
|
}
|
|
5844
|
-
function
|
|
5878
|
+
function uc(e) {
|
|
5845
5879
|
return e.replace(/^\/+/, "").replace(/\/+/g, "/");
|
|
5846
5880
|
}
|
|
5847
|
-
function
|
|
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
|
|
5889
|
+
function fc() {
|
|
5856
5890
|
return Date.now();
|
|
5857
5891
|
}
|
|
5858
|
-
var
|
|
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
|
|
5903
|
+
function mc(e) {
|
|
5870
5904
|
return [
|
|
5871
5905
|
r(async ({ path: t, offset: n, limit: r }) => {
|
|
5872
|
-
let i = e.files[
|
|
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[
|
|
5935
|
+
return e.files[uc(t)] = {
|
|
5902
5936
|
content: n,
|
|
5903
|
-
updatedAt:
|
|
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 =
|
|
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:
|
|
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 =
|
|
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 ? [
|
|
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 =
|
|
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 =
|
|
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:
|
|
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 =
|
|
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
|
|
6151
|
+
function hc(e) {
|
|
6118
6152
|
return {
|
|
6119
6153
|
name: "vfs",
|
|
6120
|
-
tools:
|
|
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
|
|
6127
|
-
function
|
|
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
|
|
6136
|
-
let n = Array.isArray(e[
|
|
6137
|
-
e[
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 (
|
|
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
|
-
[
|
|
6203
|
-
[
|
|
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[
|
|
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 (
|
|
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[
|
|
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" ?
|
|
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 =
|
|
6272
|
+
let e = wc(o()?.get?.().bind, t, i);
|
|
6239
6273
|
if (e.size) {
|
|
6240
|
-
let t =
|
|
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[
|
|
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[
|
|
6292
|
+
let u = e[gc] ?? /* @__PURE__ */ new Set();
|
|
6259
6293
|
if (u.size) {
|
|
6260
6294
|
let e = /* @__PURE__ */ new Set();
|
|
6261
|
-
|
|
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 =
|
|
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 =
|
|
6318
|
+
let d = bc(e[_c]?.text ?? "");
|
|
6285
6319
|
if (!d.length) return;
|
|
6286
6320
|
let f = [];
|
|
6287
|
-
if (
|
|
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 && (
|
|
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
|
|
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
|
|
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
|
|
6324
|
-
return
|
|
6357
|
+
function Oc(e) {
|
|
6358
|
+
return Ec({
|
|
6325
6359
|
name: "inspect_context",
|
|
6326
6360
|
description: "查看当前对话上下文的构成(供压缩决策)。返回:totalTokens(历史轮次 token 总和,与触发判断同口径)、occupancy(窗口占用比)、contextWindow、categories(分类占用)、rounds(每轮 token/工具/首句)。先调用本工具查看构成,再决定压缩策略。",
|
|
6327
|
-
schema:
|
|
6361
|
+
schema: Dc,
|
|
6328
6362
|
handler: (t) => {
|
|
6329
|
-
let n =
|
|
6330
|
-
let n =
|
|
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
|
|
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
|
|
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
|
|
6400
|
+
function jc(e) {
|
|
6367
6401
|
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
6368
6402
|
}
|
|
6369
|
-
function
|
|
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
|
|
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 =
|
|
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
|
-
})),
|
|
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
|
|
6428
|
+
function Pc(e) {
|
|
6395
6429
|
let t = e.titleLlm ?? e.summaryLlm ?? e.llm;
|
|
6396
6430
|
if (!t) return;
|
|
6397
|
-
let n =
|
|
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
|
-
})),
|
|
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
|
|
6448
|
+
function Fc() {
|
|
6415
6449
|
return `call_dec_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
6416
6450
|
}
|
|
6417
|
-
function
|
|
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
|
|
6460
|
+
function Lc(e) {
|
|
6427
6461
|
if (!e) return null;
|
|
6428
|
-
let t =
|
|
6462
|
+
let t = Ic(e);
|
|
6429
6463
|
if (t == null) return null;
|
|
6430
|
-
let n =
|
|
6464
|
+
let n = kc.safeParse(t);
|
|
6431
6465
|
return n.success ? n.data : null;
|
|
6432
6466
|
}
|
|
6433
|
-
async function
|
|
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
|
|
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 ??
|
|
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
|
|
6491
|
+
function zc(e) {
|
|
6458
6492
|
let t = e.summaryLlm ?? e.llm;
|
|
6459
6493
|
if (!t) return;
|
|
6460
|
-
let n =
|
|
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 =
|
|
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
|
|
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
|
|
6486
|
-
let t = e.llm, n =
|
|
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:
|
|
6494
|
-
titleLlmInvoke:
|
|
6495
|
-
compressDecisionInvoke:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
6551
|
-
return e === "local" || e === "session" ?
|
|
6584
|
+
function $c(e) {
|
|
6585
|
+
return e === "local" || e === "session" ? Gc : Wc;
|
|
6552
6586
|
}
|
|
6553
|
-
function
|
|
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
|
|
6592
|
+
function tl(e, t, n, r) {
|
|
6559
6593
|
return [
|
|
6560
|
-
|
|
6594
|
+
Zc,
|
|
6561
6595
|
e,
|
|
6562
6596
|
t,
|
|
6563
6597
|
n,
|
|
6564
6598
|
r
|
|
6565
6599
|
].join("::");
|
|
6566
6600
|
}
|
|
6567
|
-
function
|
|
6601
|
+
function nl(e, t, n) {
|
|
6568
6602
|
return [
|
|
6569
|
-
|
|
6603
|
+
Zc,
|
|
6570
6604
|
e,
|
|
6571
6605
|
t,
|
|
6572
6606
|
n
|
|
6573
6607
|
].join("::") + "::";
|
|
6574
6608
|
}
|
|
6575
|
-
function
|
|
6609
|
+
function rl(e, t) {
|
|
6576
6610
|
return [
|
|
6577
|
-
|
|
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
|
-
|
|
6617
|
+
return [Zc, e].join("::") + "::";
|
|
6618
|
+
}
|
|
6619
|
+
var al = null;
|
|
6620
|
+
function ol(e) {
|
|
6621
|
+
al ||= new TextEncoder();
|
|
6588
6622
|
try {
|
|
6589
|
-
return
|
|
6623
|
+
return al.encode(JSON.stringify(e)).length;
|
|
6590
6624
|
} catch {
|
|
6591
6625
|
return 0;
|
|
6592
6626
|
}
|
|
6593
6627
|
}
|
|
6594
|
-
function
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
6735
|
-
let t = e.dbName ??
|
|
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
|
|
6782
|
+
l = await ll(t), d(!0);
|
|
6749
6783
|
} else if (n === "session") {
|
|
6750
6784
|
if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
|
|
6751
|
-
l =
|
|
6785
|
+
l = ul(sessionStorage), d(!0);
|
|
6752
6786
|
} else if (n === "local") {
|
|
6753
6787
|
if (typeof localStorage > "u") throw Error("localStorage 不可用");
|
|
6754
|
-
l =
|
|
6755
|
-
} else l =
|
|
6788
|
+
l = ul(localStorage), d(!0);
|
|
6789
|
+
} else l = cl(), d(!1);
|
|
6756
6790
|
} catch (e) {
|
|
6757
|
-
l =
|
|
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 =
|
|
6768
|
-
return
|
|
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 :
|
|
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 (
|
|
6826
|
+
if (el(e) && !u) {
|
|
6793
6827
|
u = !0;
|
|
6794
6828
|
try {
|
|
6795
6829
|
await b();
|
|
6796
6830
|
} catch {}
|
|
6797
|
-
l =
|
|
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 =
|
|
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
|
-
},
|
|
6870
|
+
}, Yc);
|
|
6837
6871
|
}
|
|
6838
6872
|
async function b() {
|
|
6839
6873
|
let e = [];
|
|
6840
|
-
await l.scan(
|
|
6874
|
+
await l.scan(il(t), (t, n) => {
|
|
6841
6875
|
t.endsWith("::__meta__") && e.push(n);
|
|
6842
6876
|
});
|
|
6843
|
-
let n =
|
|
6844
|
-
for (let e of n) await l.clearPrefix(
|
|
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(
|
|
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 =
|
|
6861
|
-
return await
|
|
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
|
|
6871
|
-
let i = await l.get(
|
|
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
|
|
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 =
|
|
6884
|
-
return
|
|
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(
|
|
6934
|
+
await l.clearPrefix(nl(t, e, n));
|
|
6901
6935
|
},
|
|
6902
6936
|
async createSession(e, n, r) {
|
|
6903
|
-
let i = r ??
|
|
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(
|
|
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
|
|
6927
|
-
return e === void 0 || e === !1 ? null : typeof e == "string" ?
|
|
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
|
|
6963
|
+
function ml(e) {
|
|
6930
6964
|
return e.dialog ?? {};
|
|
6931
6965
|
}
|
|
6932
6966
|
//#endregion
|
|
6933
6967
|
//#region src/core/capabilities.ts
|
|
6934
|
-
var
|
|
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
|
|
7057
|
+
function gl(e) {
|
|
7024
7058
|
let t = {};
|
|
7025
|
-
for (let n of
|
|
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
|
|
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
|
|
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
|
|
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
|
-
},
|
|
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
|
|
7105
|
-
let n =
|
|
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
|
|
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
|
|
7166
|
+
function Sl(e) {
|
|
7133
7167
|
return e.map((e, t) => ({
|
|
7134
7168
|
m: e,
|
|
7135
7169
|
i: t,
|
|
7136
|
-
p:
|
|
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
|
|
7142
|
-
function
|
|
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 &&
|
|
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 &&
|
|
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
|
|
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
|
|
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(),
|
|
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
|
|
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
|
|
7352
|
+
function Dl(e) {
|
|
7319
7353
|
return !!e && e !== 0 && e !== "" && e !== null;
|
|
7320
7354
|
}
|
|
7321
|
-
function
|
|
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
|
|
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
|
|
7341
|
-
return new
|
|
7374
|
+
function Al(e, t) {
|
|
7375
|
+
return new El(Tl(e), t).parse();
|
|
7342
7376
|
}
|
|
7343
|
-
function
|
|
7377
|
+
function jl(e, t) {
|
|
7344
7378
|
return e ? `${e}.${t}` : String(t);
|
|
7345
7379
|
}
|
|
7346
|
-
function
|
|
7380
|
+
function Ml(e, t) {
|
|
7347
7381
|
let n = [{
|
|
7348
7382
|
path: "",
|
|
7349
7383
|
value: e
|
|
7350
7384
|
}];
|
|
7351
|
-
for (let e of
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
7401
|
-
path:
|
|
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
|
-
|
|
7409
|
-
path:
|
|
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
|
|
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
|
|
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,
|
|
7445
|
-
else for (let t of Object.keys(e)) c(e[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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
7482
|
-
return
|
|
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
|
|
7487
|
-
function
|
|
7488
|
-
return `${
|
|
7520
|
+
var Ll = "⟦frozen:", Rl = "⟦res:", zl = "⟧";
|
|
7521
|
+
function Bl(e) {
|
|
7522
|
+
return `${Ll}${e}${zl}`;
|
|
7489
7523
|
}
|
|
7490
|
-
function
|
|
7491
|
-
return `${
|
|
7524
|
+
function Vl(e) {
|
|
7525
|
+
return `${Rl}${e}${zl}`;
|
|
7492
7526
|
}
|
|
7493
|
-
function
|
|
7494
|
-
return typeof e == "string" ? e.startsWith(
|
|
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(
|
|
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
|
|
7536
|
+
function Ul(e) {
|
|
7503
7537
|
return String(e ?? "").trim().replace(/^\.+/, "");
|
|
7504
7538
|
}
|
|
7505
|
-
function
|
|
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
|
|
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
|
|
7514
|
-
let n =
|
|
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
|
|
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 =
|
|
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(
|
|
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 ??
|
|
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
|
|
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" ?
|
|
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,
|
|
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
|
|
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
|
-
} :
|
|
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
|
|
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 ===
|
|
7676
|
+
if (o === Bl(r)) {
|
|
7643
7677
|
ka(e, r, a);
|
|
7644
7678
|
continue;
|
|
7645
7679
|
}
|
|
7646
|
-
if (!
|
|
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 =
|
|
7688
|
+
let n = Hl(o);
|
|
7655
7689
|
if (n && n.type === "res") {
|
|
7656
|
-
let i =
|
|
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 (!
|
|
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
|
|
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
|
|
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 =
|
|
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:
|
|
7739
|
+
error: Zl(i)
|
|
7706
7740
|
};
|
|
7707
7741
|
}
|
|
7708
|
-
function
|
|
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 =
|
|
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 =
|
|
7767
|
+
let i = Xl(n, r);
|
|
7734
7768
|
if (!i.ok) {
|
|
7735
|
-
let e =
|
|
7769
|
+
let e = eu(i.path, t);
|
|
7736
7770
|
return {
|
|
7737
7771
|
ok: !1,
|
|
7738
|
-
error:
|
|
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
|
|
7744
|
-
let n =
|
|
7777
|
+
function eu(e, t) {
|
|
7778
|
+
let n = Ul(e);
|
|
7745
7779
|
for (let e = 0; e < t.length; e++) {
|
|
7746
|
-
let r =
|
|
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
|
|
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
|
-
]),
|
|
7768
|
-
function
|
|
7769
|
-
return t === "advanced" ? e : t === "minimal" ? e.filter((e) =>
|
|
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
|
|
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 =
|
|
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) :
|
|
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
|
|
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 =
|
|
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) :
|
|
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
|
|
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
|
|
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} ${
|
|
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
|
|
7927
|
-
function
|
|
7928
|
-
return
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
7943
|
-
let i = n.pgIdPaths ?? [], a = i.length ? (e) =>
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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 ? (
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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) :
|
|
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 =
|
|
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 =
|
|
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 && (_ =
|
|
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)), _ =
|
|
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 =
|
|
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 =
|
|
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),
|
|
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 =
|
|
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),
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
8977
|
-
let n = new AbortController(), r = setTimeout(() => n.abort(),
|
|
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 ? `获取失败:请求超时(${
|
|
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
|
-
})],
|
|
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
|
-
],
|
|
9018
|
-
function
|
|
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 ??
|
|
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-")) && (
|
|
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
|
|
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 =
|
|
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
|
-
}),
|
|
9100
|
+
}), bu = [yu];
|
|
9057
9101
|
//#endregion
|
|
9058
9102
|
//#region src/core/tools/envTool.ts
|
|
9059
|
-
function
|
|
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
|
|
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 (
|
|
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) =>
|
|
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] =
|
|
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
|
|
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
|
|
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 (
|
|
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:
|
|
9187
|
+
value: Su(t)
|
|
9144
9188
|
}, null, 2);
|
|
9145
9189
|
}
|
|
9146
|
-
return JSON.stringify(
|
|
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
|
-
}),
|
|
9195
|
+
}), Du = [Eu];
|
|
9152
9196
|
//#endregion
|
|
9153
9197
|
//#region src/core/harness/budget.ts
|
|
9154
|
-
function
|
|
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
|
|
9180
|
-
function
|
|
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 (!
|
|
9184
|
-
console.warn(`[page-agent-sdk][actions] 动作名 "${i}" 非法(须匹配 ${
|
|
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
|
|
9248
|
+
function ju(e) {
|
|
9205
9249
|
let t = {};
|
|
9206
|
-
for (let [n, r] of Object.entries(e))
|
|
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
|
|
9215
|
-
function
|
|
9216
|
-
return
|
|
9258
|
+
var Mu = mu, Nu = bu;
|
|
9259
|
+
function Pu(e, t) {
|
|
9260
|
+
return fu(e, t);
|
|
9217
9261
|
}
|
|
9218
|
-
function
|
|
9219
|
-
let a =
|
|
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
|
|
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
|
|
9250
|
-
function
|
|
9251
|
-
let i =
|
|
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
|
|
9257
|
-
let t = e.subagents.filter((e) => (e.temperature ?? 0) >=
|
|
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
|
|
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
|
|
9281
|
-
function
|
|
9282
|
-
return `${
|
|
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
|
|
9285
|
-
return `${
|
|
9328
|
+
function Uu(e, t) {
|
|
9329
|
+
return `${Bu}::${e}::${t}::`;
|
|
9286
9330
|
}
|
|
9287
|
-
function
|
|
9288
|
-
let t = e.dbName ??
|
|
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
|
|
9339
|
+
i = await ll(t), a(!0);
|
|
9296
9340
|
} else if (n === "session") {
|
|
9297
9341
|
if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
|
|
9298
|
-
i =
|
|
9342
|
+
i = ul(sessionStorage), a(!0);
|
|
9299
9343
|
} else if (n === "local") {
|
|
9300
9344
|
if (typeof localStorage > "u") throw Error("localStorage 不可用");
|
|
9301
|
-
i =
|
|
9302
|
-
} else i =
|
|
9345
|
+
i = ul(localStorage), a(!0);
|
|
9346
|
+
} else i = cl(), a(!1);
|
|
9303
9347
|
} catch {
|
|
9304
|
-
i =
|
|
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(
|
|
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(
|
|
9359
|
+
return await i.get(Hu(t, r, e));
|
|
9316
9360
|
},
|
|
9317
9361
|
async put(e) {
|
|
9318
9362
|
try {
|
|
9319
|
-
await i.set(
|
|
9363
|
+
await i.set(Hu(t, r, e.name), e);
|
|
9320
9364
|
} catch (e) {
|
|
9321
|
-
|
|
9365
|
+
el(e) && (i = cl());
|
|
9322
9366
|
}
|
|
9323
9367
|
},
|
|
9324
9368
|
async remove(e) {
|
|
9325
|
-
let n =
|
|
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(
|
|
9373
|
+
await i.clearPrefix(Uu(t, r));
|
|
9330
9374
|
},
|
|
9331
9375
|
dispose() {}
|
|
9332
9376
|
};
|
|
9333
9377
|
}
|
|
9334
|
-
var
|
|
9335
|
-
function
|
|
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 (
|
|
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
|
|
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
|
|
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
|
|
9361
|
-
function
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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 } =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 ?
|
|
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 =
|
|
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" +
|
|
9464
|
-
let I = F && 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 ?
|
|
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 =
|
|
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 ?
|
|
9480
|
-
ge && z.set(
|
|
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 } =
|
|
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
|
|
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 ?
|
|
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 ?
|
|
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 =
|
|
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 ?
|
|
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 ?
|
|
9705
|
+
}) : void 0, Ye = Re ? Js({
|
|
9662
9706
|
contextWindow: m.contextWindow,
|
|
9663
|
-
thresholdRatio:
|
|
9664
|
-
}) : void 0, Xe =
|
|
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: () =>
|
|
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 =
|
|
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 :
|
|
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 ?
|
|
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 =
|
|
9772
|
+
}) : void 0, ct = Sl([
|
|
9729
9773
|
...Ze ? [Ze] : [],
|
|
9730
9774
|
Xe,
|
|
9731
9775
|
...De ? [C] : [],
|
|
9732
9776
|
...Ee ? [S] : [],
|
|
9733
|
-
...ke ? [et =
|
|
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 ? [
|
|
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 ? [
|
|
9752
|
-
...he ? [
|
|
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 ? [
|
|
9804
|
+
...ce ? [Ou(i, {
|
|
9761
9805
|
tokenBudget: e.tokenBudget,
|
|
9762
9806
|
timeBudgetMs: e.timeBudgetMs
|
|
9763
9807
|
}, G)] : [],
|
|
9764
|
-
|
|
9765
|
-
]), lt = e.maxMemoryRounds ??
|
|
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 =
|
|
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 =
|
|
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?.(
|
|
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())),
|
|
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 (
|
|
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 =
|
|
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:
|
|
10125
|
-
systemPrompt: K.agent?.getEffectiveSystemPrompt?.() ?? le +
|
|
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:
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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(
|
|
10331
|
+
let e = await l(hs(t, v)), i = b.indexOf(n);
|
|
10288
10332
|
if (i < 0) return;
|
|
10289
|
-
b[i].content =
|
|
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 =
|
|
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) =>
|
|
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 =
|
|
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
|
|
10363
|
-
let n = e.id ??
|
|
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 ?
|
|
10366
|
-
o ? a = o : (a =
|
|
10367
|
-
let s = null, c =
|
|
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
|
|
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[
|
|
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[
|
|
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
|
|
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: () =>
|
|
10630
|
+
getContent: () => rd
|
|
10587
10631
|
};
|
|
10588
|
-
function
|
|
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
|
|
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
|
|
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(
|
|
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:
|
|
10676
|
+
systemPrompt: nd,
|
|
10633
10677
|
tools: p.length ? p : void 0,
|
|
10634
10678
|
allowedTools: m,
|
|
10635
|
-
skills: d ?? [
|
|
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
|
|
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
|
|
10661
|
-
function
|
|
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 >
|
|
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
|
|
10850
|
-
function
|
|
10851
|
-
let t =
|
|
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
|
-
|
|
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
|
|
10940
|
-
let e = In(
|
|
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
|
|
10947
|
-
return
|
|
10990
|
+
function md(e) {
|
|
10991
|
+
return td(e);
|
|
10948
10992
|
}
|
|
10949
10993
|
//#endregion
|
|
10950
|
-
export {
|
|
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 };
|