page-agent-sdk 1.4.2 → 2.1.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 +29 -29
- package/README.zh-CN.md +27 -27
- package/dist/page-agent-sdk.css +1 -1
- package/dist/page-agent-sdk.iife.js +79 -79
- package/dist/page-agent-sdk.js +181 -176
- package/dist/page-agent-sdk.umd.cjs +17 -17
- package/package.json +2 -2
- package/skills/page-agent-sdk-integrate/SKILL.md +18 -18
- package/skills/page-agent-sdk-integrate/references/advanced.md +29 -29
- package/skills/page-agent-sdk-integrate/references/api.md +24 -24
- package/skills/page-agent-sdk-integrate/references/options.md +8 -8
- package/skills/page-agent-sdk-integrate/references/quickstart.md +14 -14
- package/skills/page-agent-sdk-integrate/references/use-cases.md +27 -27
- package/types/index.d.ts +46 -36
package/dist/page-agent-sdk.js
CHANGED
|
@@ -13082,7 +13082,7 @@ app.mount('#app');
|
|
|
13082
13082
|
key: e.name,
|
|
13083
13083
|
class: "info-item"
|
|
13084
13084
|
}, [Y("div", Gp, V(e.name), 1), Y("div", Kp, V(e.description), 1)]))), 128))])) : X("", !0),
|
|
13085
|
-
b.value.
|
|
13085
|
+
b.value.dataSlots.length ? (q(), J("div", qp, [Y("div", Jp, "🪟 可操作属性 (" + V(b.value.dataSlots.length) + ")", 1), (q(!0), J(K, null, Xi(b.value.dataSlots, (e) => (q(), J("div", {
|
|
13086
13086
|
key: e.path,
|
|
13087
13087
|
class: "info-item"
|
|
13088
13088
|
}, [Y("div", Yp, V(e.path), 1), Y("div", Xp, V(e.description), 1)]))), 128))])) : X("", !0),
|
|
@@ -13125,7 +13125,7 @@ app.mount('#app');
|
|
|
13125
13125
|
_: 1
|
|
13126
13126
|
})]));
|
|
13127
13127
|
}
|
|
13128
|
-
}), [["__scopeId", "data-v-
|
|
13128
|
+
}), [["__scopeId", "data-v-2a895152"]]), zm = { class: "chat-header" }, Bm = { class: "header-left" }, Vm = { class: "header-title" }, Hm = {
|
|
13129
13129
|
key: 0,
|
|
13130
13130
|
class: "status-dot pulse"
|
|
13131
13131
|
}, Um = { class: "header-actions" }, Wm = {
|
|
@@ -13591,7 +13591,7 @@ app.mount('#app');
|
|
|
13591
13591
|
])
|
|
13592
13592
|
], 2));
|
|
13593
13593
|
}
|
|
13594
|
-
}), [["__scopeId", "data-v-
|
|
13594
|
+
}), [["__scopeId", "data-v-5bd12eb9"]]);
|
|
13595
13595
|
function Zh(e) {
|
|
13596
13596
|
return e.replace(/^\/+/, "").replace(/\/+/g, "/");
|
|
13597
13597
|
}
|
|
@@ -14357,14 +14357,14 @@ function Ag(e = "") {
|
|
|
14357
14357
|
//#endregion
|
|
14358
14358
|
//#region src/core/harness/permissions.ts
|
|
14359
14359
|
var jg = /* @__PURE__ */ new Set([
|
|
14360
|
-
"
|
|
14361
|
-
"
|
|
14360
|
+
"set_data_slot",
|
|
14361
|
+
"delete_data_slot",
|
|
14362
14362
|
"vfs_write",
|
|
14363
14363
|
"vfs_edit"
|
|
14364
14364
|
]), Mg = /* @__PURE__ */ new Set([
|
|
14365
|
-
"
|
|
14366
|
-
"
|
|
14367
|
-
"
|
|
14365
|
+
"get_data_slot",
|
|
14366
|
+
"describe_data_slot",
|
|
14367
|
+
"list_data_slots",
|
|
14368
14368
|
"vfs_read",
|
|
14369
14369
|
"vfs_ls",
|
|
14370
14370
|
"vfs_glob",
|
|
@@ -14530,7 +14530,7 @@ function qg(e) {
|
|
|
14530
14530
|
return {
|
|
14531
14531
|
save(i) {
|
|
14532
14532
|
let a = Kg(e.messages), o = {};
|
|
14533
|
-
for (let t of e.
|
|
14533
|
+
for (let t of e.slotPaths) o[t] = Vg(Hg(window, t));
|
|
14534
14534
|
let s = {
|
|
14535
14535
|
id: r++,
|
|
14536
14536
|
label: i,
|
|
@@ -14584,10 +14584,10 @@ function Yg(e) {
|
|
|
14584
14584
|
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
14585
14585
|
}
|
|
14586
14586
|
var Xg = [
|
|
14587
|
-
"
|
|
14588
|
-
"
|
|
14589
|
-
"
|
|
14590
|
-
"
|
|
14587
|
+
"get_data_slot",
|
|
14588
|
+
"get_slot_paths",
|
|
14589
|
+
"list_data_slots",
|
|
14590
|
+
"describe_data_slot",
|
|
14591
14591
|
"fetch_document"
|
|
14592
14592
|
], Zg = 1, Qg = 4, $g = 6, e_ = ["spawn_agent", "spawn_agents"];
|
|
14593
14593
|
async function t_(e, t, n, r, i) {
|
|
@@ -14753,9 +14753,9 @@ function o_(e) {
|
|
|
14753
14753
|
};
|
|
14754
14754
|
}
|
|
14755
14755
|
var s_ = /* @__PURE__ */ new Set([
|
|
14756
|
-
"
|
|
14757
|
-
"
|
|
14758
|
-
"
|
|
14756
|
+
"set_data_slot",
|
|
14757
|
+
"edit_data_slot",
|
|
14758
|
+
"delete_data_slot"
|
|
14759
14759
|
]), c_ = /校验失败|未在注册表中声明|未注册|不存在|仅支持|必须是/;
|
|
14760
14760
|
function l_(e) {
|
|
14761
14761
|
let t = /* @__PURE__ */ new Map();
|
|
@@ -14796,7 +14796,7 @@ function f_(e = {}) {
|
|
|
14796
14796
|
let r = s ? i.get(s) : void 0;
|
|
14797
14797
|
if (r && c_.test(r)) continue;
|
|
14798
14798
|
let c = d_(t, e);
|
|
14799
|
-
if (n === "
|
|
14799
|
+
if (n === "delete_data_slot") c !== void 0 && o.push(`${e} 删除后读回仍有值,疑似未生效`);
|
|
14800
14800
|
else if (c == null) o.push(`写入 ${e} 后读回为空,疑似未生效`);
|
|
14801
14801
|
else if (a[e]) {
|
|
14802
14802
|
let t = a[e].safeParse(c);
|
|
@@ -14834,7 +14834,7 @@ async function v_(e, t, n, r) {
|
|
|
14834
14834
|
"你是严格的对抗式审查者,目标是找出以下 AI 助手回复的错误并证明它有问题(事实错误 / 遗漏 / 逻辑矛盾 / 与需求不符)。",
|
|
14835
14835
|
`用户需求:${i || "(未明确)"}`,
|
|
14836
14836
|
`助手回复:${a}`,
|
|
14837
|
-
o ? "重点检查 window 修改:① 属性路径是否正确(是否误写未注册路径);② 值类型是否符合该属性 schema;③ 语义是否符合属性 description。可用只读工具(
|
|
14837
|
+
o ? "重点检查 window 修改:① 属性路径是否正确(是否误写未注册路径);② 值类型是否符合该属性 schema;③ 语义是否符合属性 description。可用只读工具(get_data_slot / list_data_slots 等)读回实际值实证。" : "只报告具体、可验证的问题。",
|
|
14838
14838
|
"若确实无问题,只回复\"无问题\"。"
|
|
14839
14839
|
].join("\n"), c = "你是严格的对抗式审查者,只找问题不赞美。目标是反驳,不是改进。", l = n ? (e) => n(e.type, {
|
|
14840
14840
|
...e.data,
|
|
@@ -15042,11 +15042,11 @@ function P_(e = {}) {
|
|
|
15042
15042
|
}
|
|
15043
15043
|
else u = M_(o, l), d = s + "index_summary";
|
|
15044
15044
|
let f = t.enableRecall ? N_(o, c, t.recallTopK) : [], p = f.length ? f.map((e) => `- 第${e.round}轮:${w_(e.userMsg.content, 60)} → ${e.assistantMsgs[0] ? w_(e.assistantMsgs[0].content, 80) : ""}`).join("\n") : "", m = [`【对话历史摘要】以下是之前 ${o.length} 轮对话的要点(最新 ${a.length} 轮已完整保留):`, u];
|
|
15045
|
-
if (p && m.push("\n【与当前问题可能相关的早期对话】", p), t.
|
|
15046
|
-
let e = t.
|
|
15045
|
+
if (p && m.push("\n【与当前问题可能相关的早期对话】", p), t.getRegisteredSlots) try {
|
|
15046
|
+
let e = t.getRegisteredSlots();
|
|
15047
15047
|
if (e.length) {
|
|
15048
15048
|
let t = e.map((e) => `- ${e.path}: ${e.description}`).join("\n");
|
|
15049
|
-
m.push("\n
|
|
15049
|
+
m.push("\n【当前可操作数据槽 属性(动态增删后的最新状态,操作前以 list_data_slots 为准)】", t);
|
|
15050
15050
|
}
|
|
15051
15051
|
} catch {}
|
|
15052
15052
|
let h = {
|
|
@@ -15110,7 +15110,7 @@ function I_(e = {}) {
|
|
|
15110
15110
|
//#endregion
|
|
15111
15111
|
//#region src/core/presets.ts
|
|
15112
15112
|
var L_ = {
|
|
15113
|
-
pageBuilder: { systemPrompt: "你是页面构建助手。流程:
|
|
15113
|
+
pageBuilder: { systemPrompt: "你是页面构建助手。流程:get_data_slot 读取当前页面结构 → set_data_slot / edit_data_slot 修改属性 → 页面实时更新。多步任务先用 write_todos 拆解,逐步推进。" },
|
|
15114
15114
|
researcher: {
|
|
15115
15115
|
systemPrompt: "你是调研助手。多路调研用 spawn_agents 并行委派子 agent(各负责一个方向);单份资料用 fetch_document 抓取;最后结构化汇总,给出结论与依据。",
|
|
15116
15116
|
subagent: { maxParallel: 4 }
|
|
@@ -15125,11 +15125,11 @@ var L_ = {
|
|
|
15125
15125
|
} }
|
|
15126
15126
|
}, R_ = { reliableWriteRules: [
|
|
15127
15127
|
"【可靠写入规则】",
|
|
15128
|
-
"1. 改任何属性前,先用
|
|
15129
|
-
"2. 若不确定可操作哪些属性,先
|
|
15130
|
-
"3. 不确定某属性字段结构时,先
|
|
15128
|
+
"1. 改任何属性前,先用 get_data_slot 读其当前真实值,基于真实值改,不要凭记忆;",
|
|
15129
|
+
"2. 若不确定可操作哪些属性,先 list_data_slots 查看当前注册项(动态组件场景下注册表会增删,以工具返回为准,勿凭旧记忆);",
|
|
15130
|
+
"3. 不确定某属性字段结构时,先 describe_data_slot 看其说明,字段以 describe 返回为准;",
|
|
15131
15131
|
"4. 写入若被 schema 校验拒绝(返回结构化错误含字段名与期望类型),按错误修正后重试,不要放弃;",
|
|
15132
|
-
"5. 优先用
|
|
15132
|
+
"5. 优先用 edit_data_slot 增量 patch(只发改动),避免 set 整体重传大 JSON 被截断。"
|
|
15133
15133
|
].join("\n") }, z_ = {
|
|
15134
15134
|
auto: {
|
|
15135
15135
|
summaryThresholdRatio: .5,
|
|
@@ -15184,7 +15184,7 @@ function H_(e, t) {
|
|
|
15184
15184
|
code: "SCHEMA_INVALID",
|
|
15185
15185
|
path: e,
|
|
15186
15186
|
message: `值不符合 "${e}" 的 schema(${t.length} 处问题)`,
|
|
15187
|
-
hint: `按
|
|
15187
|
+
hint: `按 describe_data_slot("${e}") 查看格式,修正后重试;改大对象优先用 edit_data_slot 增量 patch(只发改动部分)`,
|
|
15188
15188
|
details: V_(t)
|
|
15189
15189
|
});
|
|
15190
15190
|
}
|
|
@@ -15403,7 +15403,7 @@ function Q_(e) {
|
|
|
15403
15403
|
};
|
|
15404
15404
|
}
|
|
15405
15405
|
//#endregion
|
|
15406
|
-
//#region src/core/tools/
|
|
15406
|
+
//#region src/core/tools/dataSlotQuery.ts
|
|
15407
15407
|
var $_ = /[\w$-]/;
|
|
15408
15408
|
function ev(e) {
|
|
15409
15409
|
let t = [], n = e.trim(), r = +(n[0] === "$");
|
|
@@ -15804,7 +15804,7 @@ function pv(e, t, n = 3e3) {
|
|
|
15804
15804
|
});
|
|
15805
15805
|
}
|
|
15806
15806
|
//#endregion
|
|
15807
|
-
//#region src/core/tools/
|
|
15807
|
+
//#region src/core/tools/dataSlotOps.ts
|
|
15808
15808
|
var mv = /* @__PURE__ */ new Set([
|
|
15809
15809
|
"__proto__",
|
|
15810
15810
|
"constructor",
|
|
@@ -15872,7 +15872,7 @@ function Sv(e) {
|
|
|
15872
15872
|
return n.toString(36);
|
|
15873
15873
|
}
|
|
15874
15874
|
function Cv(e, t, n, r) {
|
|
15875
|
-
if (t === "set") return n ? (vv(e, n, r), null) : "set 操作需要 jsonPath(整体替换请用
|
|
15875
|
+
if (t === "set") return n ? (vv(e, n, r), null) : "set 操作需要 jsonPath(整体替换请用 set_data_slot)";
|
|
15876
15876
|
if (t === "remove") return n ? (yv(e, n), null) : "remove 操作需要 jsonPath";
|
|
15877
15877
|
if (t === "merge") {
|
|
15878
15878
|
let t = n ? _v(e, n) : e;
|
|
@@ -15906,7 +15906,7 @@ function Ev(e, t) {
|
|
|
15906
15906
|
function Dv(e, r = {}) {
|
|
15907
15907
|
let i = /* @__PURE__ */ new Map();
|
|
15908
15908
|
for (let t of e) i.set(t.path, t);
|
|
15909
|
-
let a = /* @__PURE__ */ new Map(), o = r.maxSnapshots ?? 20, s = {
|
|
15909
|
+
let a = /* @__PURE__ */ new Map(), o = r.maxSnapshots ?? 20, s = /* @__PURE__ */ new Map(), c = r.autoLock !== !1, l = {
|
|
15910
15910
|
add: (e) => {
|
|
15911
15911
|
i.set(e.path, e);
|
|
15912
15912
|
},
|
|
@@ -15916,20 +15916,20 @@ function Dv(e, r = {}) {
|
|
|
15916
15916
|
},
|
|
15917
15917
|
list: () => [...i.values()],
|
|
15918
15918
|
has: (e) => i.has(e)
|
|
15919
|
-
},
|
|
15919
|
+
}, u = (e) => {
|
|
15920
15920
|
r.onAudit?.(e);
|
|
15921
15921
|
};
|
|
15922
|
-
function
|
|
15922
|
+
function d() {
|
|
15923
15923
|
let e = [...i.keys()];
|
|
15924
15924
|
if (!e.length) return "";
|
|
15925
15925
|
let t = e.join(", ");
|
|
15926
|
-
return e.length > 8 || t.length > 240 ? `\n(当前可操作属性共 ${e.length} 项,用
|
|
15926
|
+
return e.length > 8 || t.length > 240 ? `\n(当前可操作属性共 ${e.length} 项,用 list_data_slots 查看)` : `\n(当前可操作 path: ${t})`;
|
|
15927
15927
|
}
|
|
15928
|
-
let
|
|
15929
|
-
function
|
|
15930
|
-
return r.allowRawRead ? !0 : [...i.keys()].some((t) => e === t || e.startsWith(t + ".") ||
|
|
15928
|
+
let f = (r.whitelist ?? !0) === !1;
|
|
15929
|
+
function p(e) {
|
|
15930
|
+
return r.allowRawRead ? !0 : [...i.keys()].some((t) => e === t || e.startsWith(t + ".") || f && t.startsWith(e + "."));
|
|
15931
15931
|
}
|
|
15932
|
-
function
|
|
15932
|
+
function m(e, t, n) {
|
|
15933
15933
|
let r = bv(_v(window, e)), i = a.get(e) || [], s = i.length ? i[i.length - 1].id + 1 : 1;
|
|
15934
15934
|
for (i.push({
|
|
15935
15935
|
id: s,
|
|
@@ -15940,7 +15940,7 @@ function Dv(e, r = {}) {
|
|
|
15940
15940
|
}); i.length > o;) i.shift();
|
|
15941
15941
|
return a.set(e, i), s;
|
|
15942
15942
|
}
|
|
15943
|
-
async function
|
|
15943
|
+
async function h(e, t, n, i) {
|
|
15944
15944
|
if (!n || n === "") return null;
|
|
15945
15945
|
let o = _v(window, e), s = Sv(o);
|
|
15946
15946
|
if (s === n) return null;
|
|
@@ -15948,7 +15948,7 @@ function Dv(e, r = {}) {
|
|
|
15948
15948
|
code: "VERSION_CONFLICT",
|
|
15949
15949
|
path: e,
|
|
15950
15950
|
message: `乐观锁冲突:expectedHash=${n} 但当前 hash=${s}。属性 "${e}" 在你 get 之后已被修改(外部代码/其他 agent/用户手动改)。`,
|
|
15951
|
-
hint: `重新
|
|
15951
|
+
hint: `重新 get_data_slot("${e}") 拿最新值与 hash,基于最新值修改后再写入(传新的 expectedHash)。当前值:${xv(o, 400)}`
|
|
15952
15952
|
});
|
|
15953
15953
|
let c = await r.onConflict({
|
|
15954
15954
|
path: e,
|
|
@@ -15959,7 +15959,7 @@ function Dv(e, r = {}) {
|
|
|
15959
15959
|
expectedHash: n,
|
|
15960
15960
|
snapshotId: 0
|
|
15961
15961
|
});
|
|
15962
|
-
if (c.action === "keep_external") return `已保留外部修改(未写入)。当前值:${xv(o, 400)} (hash=${s})。请重新
|
|
15962
|
+
if (c.action === "keep_external") return `已保留外部修改(未写入)。当前值:${xv(o, 400)} (hash=${s})。请重新 get_data_slot("${e}") 拿最新值与 hash 再改。`;
|
|
15963
15963
|
if (c.action === "restore") {
|
|
15964
15964
|
let t = a.get(e) || [];
|
|
15965
15965
|
if (!t.length) return `无历史快照可回退(本次为首次操作)。当前值:${xv(o, 400)} (hash=${s})。请重新 get 再改或选「强制覆盖」。`;
|
|
@@ -15970,132 +15970,136 @@ function Dv(e, r = {}) {
|
|
|
15970
15970
|
}
|
|
15971
15971
|
return null;
|
|
15972
15972
|
}
|
|
15973
|
-
let
|
|
15974
|
-
if (!i.size) return "当前没有已注册的可操作
|
|
15973
|
+
let g = n(async () => {
|
|
15974
|
+
if (!i.size) return "当前没有已注册的可操作 数据槽。";
|
|
15975
15975
|
let e = [...i.values()].map((e) => `- ${e.path}: ${e.description}`);
|
|
15976
|
-
return `可操作的
|
|
15976
|
+
return `可操作的 数据槽(共 ${i.size} 项):\n${e.join("\n")}`;
|
|
15977
15977
|
}, {
|
|
15978
|
-
name: "
|
|
15979
|
-
description: "列出所有已注册、可操作的
|
|
15978
|
+
name: "list_data_slots",
|
|
15979
|
+
description: "列出所有已注册、可操作的 数据槽(path + 说明)。操作数据槽前先调用此工具了解可用范围。",
|
|
15980
15980
|
schema: t.object({})
|
|
15981
|
-
}),
|
|
15981
|
+
}), _ = n(async ({ path: e }) => {
|
|
15982
15982
|
let t = i.get(e);
|
|
15983
15983
|
return t ? [
|
|
15984
15984
|
`路径: ${t.path}`,
|
|
15985
15985
|
`说明: ${t.description}`,
|
|
15986
|
-
"格式: 写入值需为 JSON,且通过注册时声明的 schema 校验(校验失败时
|
|
15986
|
+
"格式: 写入值需为 JSON,且通过注册时声明的 schema 校验(校验失败时 set_data_slot/edit_data_slot 会返回结构化错误,含具体字段与期望类型)。"
|
|
15987
15987
|
].join("\n") : $({
|
|
15988
15988
|
code: "NOT_REGISTERED",
|
|
15989
15989
|
path: e,
|
|
15990
15990
|
message: `属性 "${e}" 未注册`,
|
|
15991
|
-
hint: "用
|
|
15991
|
+
hint: "用 list_data_slots 查看可用属性"
|
|
15992
15992
|
});
|
|
15993
15993
|
}, {
|
|
15994
|
-
name: "
|
|
15995
|
-
description: "获取单个已注册
|
|
15994
|
+
name: "describe_data_slot",
|
|
15995
|
+
description: "获取单个已注册 数据槽的说明与格式要求。",
|
|
15996
15996
|
schema: t.object({ path: t.string().describe("属性路径,如 app.theme") })
|
|
15997
|
-
}),
|
|
15998
|
-
if (!
|
|
15997
|
+
}), v = n(async ({ path: e }) => {
|
|
15998
|
+
if (!p(e)) return $({
|
|
15999
15999
|
code: "NOT_REGISTERED",
|
|
16000
16000
|
path: e,
|
|
16001
16001
|
message: `属性 "${e}" 不可读取(未注册,且非已注册路径的后代)`,
|
|
16002
|
-
hint: "用
|
|
16002
|
+
hint: "用 list_data_slots 查看可操作字段;字段白名单读模式下未注册的祖先(整体大 JSON)不暴露,需读其声明子路径"
|
|
16003
16003
|
});
|
|
16004
16004
|
let t = _v(window, e);
|
|
16005
|
-
|
|
16005
|
+
if (t === void 0) return `${e} = (undefined)`;
|
|
16006
|
+
let n = Sv(t);
|
|
16007
|
+
return s.set(e, n), `${e} = ${xv(t)} (hash=${n})`;
|
|
16006
16008
|
}, {
|
|
16007
|
-
name: "
|
|
16008
|
-
description: "读取一个已注册
|
|
16009
|
+
name: "get_data_slot",
|
|
16010
|
+
description: "读取一个已注册 数据槽的当前值(安全序列化:函数/DOM/循环引用做摘要;大结果由系统自动外存,提示用 vfs_read 回读)。返回含 hash(乐观锁):改属性前先 get 拿 hash,写入时(set/edit/delete)传 expectedHash 回传,系统对比当前 hash 防\"基于过期值覆盖\"(外部代码/其他 agent/用户手动改过会 CONFLICT,需重新 get 再改)。字段白名单读模式(默认)下仅可读注册 path 自身/后代;未注册祖先(整体大 JSON)不可读,避免大 JSON 拉进上下文。",
|
|
16009
16011
|
schema: t.object({ path: t.string().describe("已注册的属性路径或其后代") })
|
|
16010
|
-
}),
|
|
16012
|
+
}), y = n(async ({ path: e, value: t, expectedHash: n }) => {
|
|
16011
16013
|
let r = i.get(e);
|
|
16012
16014
|
if (!r) return $({
|
|
16013
16015
|
code: "NOT_REGISTERED",
|
|
16014
16016
|
path: e,
|
|
16015
16017
|
message: `属性 "${e}" 未在注册表中声明,不可写`,
|
|
16016
|
-
hint: "用
|
|
16018
|
+
hint: "用 list_data_slots 查看可用属性;集成方需先在 dataSlots 声明该 path"
|
|
16017
16019
|
});
|
|
16018
|
-
let a = await
|
|
16020
|
+
let a = await h(e, "set", n || (c ? s.get(e) : void 0));
|
|
16019
16021
|
if (a !== null) return a;
|
|
16020
16022
|
let o;
|
|
16021
|
-
try {
|
|
16023
|
+
if (typeof t == "string") try {
|
|
16022
16024
|
o = JSON.parse(t);
|
|
16023
16025
|
} catch (n) {
|
|
16024
16026
|
return U_(e, t, n);
|
|
16025
16027
|
}
|
|
16026
|
-
|
|
16027
|
-
|
|
16028
|
-
|
|
16029
|
-
|
|
16030
|
-
|
|
16028
|
+
else o = t;
|
|
16029
|
+
let l = r.schema.safeParse(o);
|
|
16030
|
+
if (!l.success) return H_(e, l.error.issues);
|
|
16031
|
+
m(e, "set");
|
|
16032
|
+
let f = _v(window, e);
|
|
16033
|
+
return typeof f == "object" && f && l.data !== null && typeof l.data == "object" ? Ev(f, l.data) : vv(window, e, l.data), u({
|
|
16031
16034
|
op: "set",
|
|
16032
16035
|
path: e,
|
|
16033
|
-
value:
|
|
16036
|
+
value: l.data,
|
|
16034
16037
|
timestamp: Date.now()
|
|
16035
|
-
}), `已设置 ${e} = ${xv(
|
|
16038
|
+
}), `已设置 ${e} = ${xv(l.data, 600)} (新 hash=${Sv(_v(window, e))})${d()}`;
|
|
16036
16039
|
}, {
|
|
16037
|
-
name: "
|
|
16038
|
-
description: "设置一个已注册
|
|
16040
|
+
name: "set_data_slot",
|
|
16041
|
+
description: "设置一个已注册 数据槽的值(整体替换)。仅能操作注册表内声明的属性;value 为 JSON 对象(或 JSON 字符串),需通过该属性声明的 schema 校验。校验失败会返回错误而非写入。expectedHash(可选):改前 get_data_slot 返回的 hash,传入则启用乐观锁;不传时系统自动用你最后一次 get 读到的 hash 比对(autoLock,默认开)——若属性已被改过(外部代码/其他 agent/用户手动)则返回 VERSION_CONFLICT 不写入,需重新 get 再改,防\"基于过期值覆盖\"。大对象/数组强烈建议改用 edit_data_slot 增量 patch。",
|
|
16039
16042
|
schema: t.object({
|
|
16040
16043
|
path: t.string().describe("已注册的属性路径"),
|
|
16041
|
-
value: t.
|
|
16042
|
-
expectedHash: t.string().optional().describe("乐观锁:改前
|
|
16044
|
+
value: t.unknown().describe("JSON 对象(推荐直传,如 {title:\"x\"}),或 JSON 字符串;需符合该属性 schema"),
|
|
16045
|
+
expectedHash: t.string().optional().describe("乐观锁:改前 get_data_slot 返回的 hash;传入则校验,不一致拒绝写入防覆盖。不传则自动用你最后 get 到的 hash(autoLock)")
|
|
16043
16046
|
})
|
|
16044
|
-
}),
|
|
16047
|
+
}), b = n(async ({ path: e, op: t, jsonPath: n, value: r, expectedHash: a }) => {
|
|
16045
16048
|
let o = i.get(e);
|
|
16046
16049
|
if (!o) return $({
|
|
16047
16050
|
code: "NOT_REGISTERED",
|
|
16048
16051
|
path: e,
|
|
16049
16052
|
message: `属性 "${e}" 未在注册表中声明,不可写`,
|
|
16050
|
-
hint: "用
|
|
16053
|
+
hint: "用 list_data_slots 查看可用属性"
|
|
16051
16054
|
});
|
|
16052
|
-
let
|
|
16053
|
-
if (hv(
|
|
16055
|
+
let l = n || "";
|
|
16056
|
+
if (hv(l)) return $({
|
|
16054
16057
|
code: "PATH_UNSAFE",
|
|
16055
16058
|
path: e,
|
|
16056
|
-
message: `jsonPath "${
|
|
16059
|
+
message: `jsonPath "${l}" 含非法段(__proto__/constructor/prototype)`,
|
|
16057
16060
|
hint: "使用正常的属性路径,如 components.0.text(数组索引用数字)"
|
|
16058
16061
|
});
|
|
16059
|
-
let
|
|
16060
|
-
if (
|
|
16061
|
-
if (typeof
|
|
16062
|
+
let f = _v(window, e), p = await h(e, "edit", a || (c ? s.get(e) : void 0));
|
|
16063
|
+
if (p !== null) return p;
|
|
16064
|
+
if (typeof f != "object" || !f) return $({
|
|
16062
16065
|
code: "NOT_OBJECT",
|
|
16063
16066
|
path: e,
|
|
16064
|
-
message: `edit 仅适用于对象/数组属性,"${e}" 当前是 ${
|
|
16065
|
-
hint: "叶子属性(原始类型)请用
|
|
16067
|
+
message: `edit 仅适用于对象/数组属性,"${e}" 当前是 ${f === void 0 ? "undefined" : typeof f}`,
|
|
16068
|
+
hint: "叶子属性(原始类型)请用 set_data_slot 整体设置"
|
|
16066
16069
|
});
|
|
16067
|
-
let
|
|
16070
|
+
let g;
|
|
16068
16071
|
if (t !== "remove") {
|
|
16069
16072
|
if (r === void 0 || r === "") return $({
|
|
16070
16073
|
code: "MISSING_VALUE",
|
|
16071
16074
|
path: e,
|
|
16072
|
-
message: `${t} 操作需要 value(JSON
|
|
16075
|
+
message: `${t} 操作需要 value(JSON 对象或字符串)`,
|
|
16073
16076
|
hint: `op 为 ${t} 时 value 必填;若想删除请用 op:'remove'`
|
|
16074
16077
|
});
|
|
16075
|
-
try {
|
|
16076
|
-
|
|
16078
|
+
if (typeof r == "string") try {
|
|
16079
|
+
g = JSON.parse(r);
|
|
16077
16080
|
} catch (t) {
|
|
16078
16081
|
return U_(e, r, t);
|
|
16079
16082
|
}
|
|
16083
|
+
else g = r;
|
|
16080
16084
|
}
|
|
16081
|
-
let
|
|
16082
|
-
if (
|
|
16085
|
+
let _ = bv(f), v = Cv(_, t, l, g);
|
|
16086
|
+
if (v) return $({
|
|
16083
16087
|
code: "PATCH_FAILED",
|
|
16084
16088
|
path: e,
|
|
16085
|
-
message:
|
|
16089
|
+
message: v,
|
|
16086
16090
|
hint: "检查 op 与目标类型:merge 需目标为对象,append 需目标为数组;jsonPath 指向需存在"
|
|
16087
16091
|
});
|
|
16088
|
-
let
|
|
16089
|
-
return
|
|
16092
|
+
let y = o.schema.safeParse(_);
|
|
16093
|
+
return y.success ? (m(e, "edit"), wv(e, t, l, g), u({
|
|
16090
16094
|
op: "edit",
|
|
16091
16095
|
path: e,
|
|
16092
|
-
detail: `${t}${
|
|
16093
|
-
value:
|
|
16096
|
+
detail: `${t}${l ? "@" + l : ""}`,
|
|
16097
|
+
value: g,
|
|
16094
16098
|
timestamp: Date.now()
|
|
16095
|
-
}), `已 edit ${e}(${t}${
|
|
16099
|
+
}), `已 edit ${e}(${t}${l ? " @ " + l : ""})。当前值:${xv(_v(window, e), 600)} (新 hash=${Sv(_v(window, e))})${d()}`) : H_(e, y.error.issues);
|
|
16096
16100
|
}, {
|
|
16097
|
-
name: "
|
|
16098
|
-
description: "
|
|
16101
|
+
name: "edit_data_slot",
|
|
16102
|
+
description: "增量编辑一个已注册的「对象/数组」数据槽,只发改动的 patch,无需重传整个大对象。op:set(在 jsonPath 设值)、remove(删 jsonPath)、merge(把 value 合并到 jsonPath 指向的对象,默认根)、append(把 value 追加到 jsonPath 指向的数组,默认根)。jsonPath 为相对属性根的点号路径(数组索引用数字,如 components.0.text);value 为 JSON 对象(推荐直传)或 JSON 字符串。整体仍经 schema 校验,失败不写入。expectedHash(可选):改前 get_data_slot 返回的 hash;不传时自动用你最后 get 到的 hash(autoLock,默认开)防\"基于过期值覆盖\"。",
|
|
16099
16103
|
schema: t.object({
|
|
16100
16104
|
path: t.string().describe("已注册的对象/数组属性路径"),
|
|
16101
16105
|
op: t.enum([
|
|
@@ -16105,51 +16109,51 @@ function Dv(e, r = {}) {
|
|
|
16105
16109
|
"append"
|
|
16106
16110
|
]),
|
|
16107
16111
|
jsonPath: t.string().optional().describe("相对属性根的点号路径(数组索引用数字,如 components.0.text)。set/remove 必填;merge/append 不填则作用于根"),
|
|
16108
|
-
value: t.
|
|
16109
|
-
expectedHash: t.string().optional().describe("乐观锁:改前
|
|
16112
|
+
value: t.unknown().optional().describe("JSON 对象(推荐直传,如 {text:\"x\"})或 JSON 字符串(set/merge/append 必填)"),
|
|
16113
|
+
expectedHash: t.string().optional().describe("乐观锁:改前 get_data_slot 返回的 hash;传入则校验,不一致拒绝写入防覆盖。不传则自动用你最后 get 到的 hash(autoLock)")
|
|
16110
16114
|
})
|
|
16111
|
-
}),
|
|
16115
|
+
}), x = n(async ({ path: e, expectedHash: t }) => {
|
|
16112
16116
|
if (!i.has(e)) return $({
|
|
16113
16117
|
code: "NOT_REGISTERED",
|
|
16114
16118
|
path: e,
|
|
16115
16119
|
message: `属性 "${e}" 未在注册表中声明,不可删除`,
|
|
16116
|
-
hint: "用
|
|
16120
|
+
hint: "用 list_data_slots 查看可用属性"
|
|
16117
16121
|
});
|
|
16118
|
-
let n = await
|
|
16122
|
+
let n = await h(e, "delete", t || (c ? s.get(e) : void 0));
|
|
16119
16123
|
if (n !== null) return n;
|
|
16120
|
-
|
|
16124
|
+
m(e, "delete");
|
|
16121
16125
|
let r = yv(window, e);
|
|
16122
|
-
return
|
|
16126
|
+
return u({
|
|
16123
16127
|
op: "delete",
|
|
16124
16128
|
path: e,
|
|
16125
16129
|
timestamp: Date.now()
|
|
16126
|
-
}), r ? `已删除 ${e}${
|
|
16130
|
+
}), r ? `已删除 ${e}${d()}` : `${e} 不存在(无需删除)${d()}`;
|
|
16127
16131
|
}, {
|
|
16128
|
-
name: "
|
|
16129
|
-
description: "删除一个已注册
|
|
16132
|
+
name: "delete_data_slot",
|
|
16133
|
+
description: "删除一个已注册 数据槽。expectedHash(可选):改前 get_data_slot 返回的 hash;不传时自动用你最后 get 到的 hash(autoLock,默认开)防\"基于过期值删除\"。",
|
|
16130
16134
|
schema: t.object({
|
|
16131
16135
|
path: t.string().describe("已注册的属性路径"),
|
|
16132
|
-
expectedHash: t.string().optional().describe("乐观锁:改前
|
|
16136
|
+
expectedHash: t.string().optional().describe("乐观锁:改前 get_data_slot 返回的 hash;传入则校验,不一致拒绝删除防覆盖。不传则自动用你最后 get 到的 hash(autoLock)")
|
|
16133
16137
|
})
|
|
16134
|
-
}),
|
|
16138
|
+
}), S = n(async ({ path: e, label: t }) => i.has(e) ? `已为 ${e} 创建快照 #${m(e, "manual", t)}${t ? `(${t})` : ""}。可用 list_data_snapshots 查看、restore_data_snapshot 回退。` : $({
|
|
16135
16139
|
code: "NOT_REGISTERED",
|
|
16136
16140
|
path: e,
|
|
16137
16141
|
message: `属性 "${e}" 未注册,无法打快照`,
|
|
16138
|
-
hint: "用
|
|
16142
|
+
hint: "用 list_data_slots 查看可用属性"
|
|
16139
16143
|
}), {
|
|
16140
|
-
name: "
|
|
16141
|
-
description: "为已注册
|
|
16144
|
+
name: "snapshot_data_slot",
|
|
16145
|
+
description: "为已注册 数据槽手动创建一个命名快照(检查点)。set/edit/delete 也会自动存快照。",
|
|
16142
16146
|
schema: t.object({
|
|
16143
16147
|
path: t.string().describe("已注册的属性路径"),
|
|
16144
16148
|
label: t.string().optional().describe("可选的快照标签,便于识别")
|
|
16145
16149
|
})
|
|
16146
|
-
}),
|
|
16150
|
+
}), C = n(async ({ path: e }) => {
|
|
16147
16151
|
let t = e ? [e] : [...i.keys()];
|
|
16148
16152
|
if (e && !i.has(e)) return $({
|
|
16149
16153
|
code: "NOT_REGISTERED",
|
|
16150
16154
|
path: e,
|
|
16151
16155
|
message: `属性 "${e}" 未注册`,
|
|
16152
|
-
hint: "用
|
|
16156
|
+
hint: "用 list_data_slots 查看可用属性"
|
|
16153
16157
|
});
|
|
16154
16158
|
let n = [];
|
|
16155
16159
|
for (let r of t) {
|
|
@@ -16164,35 +16168,35 @@ function Dv(e, r = {}) {
|
|
|
16164
16168
|
n.push(` #${e.id} [${e.op}]${e.label ? ` "${e.label}"` : ""} ${r} 修改前≈${t}字符`);
|
|
16165
16169
|
}
|
|
16166
16170
|
}
|
|
16167
|
-
return n.join("\n") || "无快照。set/edit/delete 会自动存快照,也可用
|
|
16171
|
+
return n.join("\n") || "无快照。set/edit/delete 会自动存快照,也可用 snapshot_data_slot 手动创建检查点。";
|
|
16168
16172
|
}, {
|
|
16169
|
-
name: "
|
|
16170
|
-
description: "列出
|
|
16173
|
+
name: "list_data_snapshots",
|
|
16174
|
+
description: "列出 数据槽的快照时间线(序号、操作类型、标签、大小)。不传 path 列出所有属性。",
|
|
16171
16175
|
schema: t.object({ path: t.string().optional().describe("限定单个属性,不传则列出全部") })
|
|
16172
|
-
}),
|
|
16176
|
+
}), w = n(async ({ path: e, id: t }) => {
|
|
16173
16177
|
let n = i.get(e);
|
|
16174
16178
|
if (!n) return $({
|
|
16175
16179
|
code: "NOT_REGISTERED",
|
|
16176
16180
|
path: e,
|
|
16177
16181
|
message: `属性 "${e}" 未注册`,
|
|
16178
|
-
hint: "用
|
|
16182
|
+
hint: "用 list_data_slots 查看可用属性"
|
|
16179
16183
|
});
|
|
16180
16184
|
let r = a.get(e) || [];
|
|
16181
16185
|
if (!r.length) return $({
|
|
16182
16186
|
code: "NO_SNAPSHOT",
|
|
16183
16187
|
path: e,
|
|
16184
16188
|
message: `"${e}" 无快照可回退`,
|
|
16185
|
-
hint: "set/edit/delete 会自动存快照;也可先
|
|
16189
|
+
hint: "set/edit/delete 会自动存快照;也可先 snapshot_data_slot 手动创建检查点"
|
|
16186
16190
|
});
|
|
16187
16191
|
let o = t === void 0 ? r[r.length - 1] : r.find((e) => e.id === t);
|
|
16188
16192
|
if (!o) return $({
|
|
16189
16193
|
code: "SNAPSHOT_NOT_FOUND",
|
|
16190
16194
|
path: e,
|
|
16191
16195
|
message: `未找到快照 #${t}`,
|
|
16192
|
-
hint: "用
|
|
16196
|
+
hint: "用 list_data_snapshots 查看可用快照序号"
|
|
16193
16197
|
});
|
|
16194
16198
|
let s = n.schema.safeParse(o.value);
|
|
16195
|
-
return s.success ? (Tv(e, bv(o.value)),
|
|
16199
|
+
return s.success ? (Tv(e, bv(o.value)), u({
|
|
16196
16200
|
op: "restore",
|
|
16197
16201
|
path: e,
|
|
16198
16202
|
detail: `#${o.id}`,
|
|
@@ -16205,25 +16209,25 @@ function Dv(e, r = {}) {
|
|
|
16205
16209
|
details: V_(s.error.issues)
|
|
16206
16210
|
});
|
|
16207
16211
|
}, {
|
|
16208
|
-
name: "
|
|
16209
|
-
description: "把已注册
|
|
16212
|
+
name: "restore_data_snapshot",
|
|
16213
|
+
description: "把已注册 数据槽回退到某个快照(就地还原,保留响应式)。不传 id 则回退最近一次(快速回退)。可用 list_data_snapshots 查看快照列表。",
|
|
16210
16214
|
schema: t.object({
|
|
16211
16215
|
path: t.string().describe("已注册的属性路径"),
|
|
16212
16216
|
id: t.number().int().optional().describe("指定快照序号;不传则回退最近一次")
|
|
16213
16217
|
})
|
|
16214
|
-
}),
|
|
16215
|
-
m,
|
|
16216
|
-
h,
|
|
16218
|
+
}), T = [
|
|
16217
16219
|
g,
|
|
16220
|
+
_,
|
|
16221
|
+
v,
|
|
16218
16222
|
n(async ({ paths: e }) => {
|
|
16219
16223
|
let t = [];
|
|
16220
16224
|
for (let n of e) {
|
|
16221
|
-
if (!
|
|
16225
|
+
if (!p(n)) {
|
|
16222
16226
|
t.push(`- ${n} = ERROR: ${$({
|
|
16223
16227
|
code: "NOT_REGISTERED",
|
|
16224
16228
|
path: n,
|
|
16225
16229
|
message: "不可读取(未注册,且非已注册路径的后代)",
|
|
16226
|
-
hint: "用
|
|
16230
|
+
hint: "用 list_data_slots 查看可操作字段"
|
|
16227
16231
|
})}`);
|
|
16228
16232
|
continue;
|
|
16229
16233
|
}
|
|
@@ -16232,29 +16236,29 @@ function Dv(e, r = {}) {
|
|
|
16232
16236
|
}
|
|
16233
16237
|
return t.join("\n");
|
|
16234
16238
|
}, {
|
|
16235
|
-
name: "
|
|
16236
|
-
description: "批量按路径读取
|
|
16239
|
+
name: "get_slot_paths",
|
|
16240
|
+
description: "批量按路径读取 数据槽的局部或多个字段(避免对大 JSON 整体读取)。paths 支持注册属性的任意后代路径(如 page.components.0.text)、自身。字段白名单读模式(默认)下未注册祖先不可读。逐行返回 path = value;单个值过大仍由系统自动外存 vfs。",
|
|
16237
16241
|
schema: t.object({ paths: t.array(t.string().describe("路径,如 page.components.0.text")).min(1).max(20) })
|
|
16238
16242
|
}),
|
|
16239
|
-
_,
|
|
16240
|
-
v,
|
|
16241
16243
|
y,
|
|
16242
16244
|
b,
|
|
16243
16245
|
x,
|
|
16244
16246
|
S,
|
|
16247
|
+
C,
|
|
16248
|
+
w,
|
|
16245
16249
|
n(async ({ path: e, expr: t, limit: n }) => {
|
|
16246
16250
|
if (!i.get(e)) return $({
|
|
16247
16251
|
code: "NOT_REGISTERED",
|
|
16248
16252
|
path: e,
|
|
16249
16253
|
message: `属性 "${e}" 未注册`,
|
|
16250
|
-
hint: "用
|
|
16254
|
+
hint: "用 list_data_slots 查看可用属性"
|
|
16251
16255
|
});
|
|
16252
16256
|
let r = _v(window, e);
|
|
16253
16257
|
if (typeof r != "object" || !r) return $({
|
|
16254
16258
|
code: "NOT_OBJECT",
|
|
16255
16259
|
path: e,
|
|
16256
16260
|
message: `"${e}" 不是对象/数组,无法查询(当前为 ${r === void 0 ? "undefined" : typeof r})`,
|
|
16257
|
-
hint: "query 仅适用于对象/数组;叶子属性用
|
|
16261
|
+
hint: "query 仅适用于对象/数组;叶子属性用 get_data_slot 读"
|
|
16258
16262
|
});
|
|
16259
16263
|
let a;
|
|
16260
16264
|
try {
|
|
@@ -16271,8 +16275,8 @@ function Dv(e, r = {}) {
|
|
|
16271
16275
|
let o = n ?? 50, s = a.slice(0, o), c = s.map((e) => `{"path":${JSON.stringify(e.path)},"index":${e.index === void 0 ? "null" : e.index},"value":${xv(e.value)}}`);
|
|
16272
16276
|
return `{"matched":${a.length},"returned":${s.length},"truncated":${a.length > o},"results":[${c.join(",")}]}`;
|
|
16273
16277
|
}, {
|
|
16274
|
-
name: "
|
|
16275
|
-
description: "用 JSONPath 表达式对一个已注册的对象/数组属性做结构化查询(只读,无副作用)。语法子集:$ 根、.key、[n]、[\"key\"]、[*] 通配、[?(filter)] 过滤、..key 递归找后代、..* 全后代。过滤表达式:@.field op literal(op:==/!=/</<=/>/>=),&&/||/() 连接;@ 指当前元素。注意过滤作用于\"当前节点的子元素数组\",若注册属性是对象需先点出数组字段再过滤,如 $.components[?(@.type==\"card\" && @.price<100)]。返回匹配元素的 path(相对属性根,数组索引可作后续
|
|
16278
|
+
name: "query_data_slot",
|
|
16279
|
+
description: "用 JSONPath 表达式对一个已注册的对象/数组属性做结构化查询(只读,无副作用)。语法子集:$ 根、.key、[n]、[\"key\"]、[*] 通配、[?(filter)] 过滤、..key 递归找后代、..* 全后代。过滤表达式:@.field op literal(op:==/!=/</<=/>/>=),&&/||/() 连接;@ 指当前元素。注意过滤作用于\"当前节点的子元素数组\",若注册属性是对象需先点出数组字段再过滤,如 $.components[?(@.type==\"card\" && @.price<100)]。返回匹配元素的 path(相对属性根,数组索引可作后续 edit_data_slot 的 jsonPath)+ index(若父为数组)+ value。适合在大数组里按条件筛选元素,定位后再用 edit_data_slot 增量改。",
|
|
16276
16280
|
schema: t.object({
|
|
16277
16281
|
path: t.string().describe("已注册的对象/数组属性路径"),
|
|
16278
16282
|
expr: t.string().describe("JSONPath 表达式,如 $[?(@.type==\"card\" && @.price<100)] 或 $..title(递归找所有 title)"),
|
|
@@ -16284,7 +16288,7 @@ function Dv(e, r = {}) {
|
|
|
16284
16288
|
code: "NOT_REGISTERED",
|
|
16285
16289
|
path: e,
|
|
16286
16290
|
message: `属性 "${e}" 未注册`,
|
|
16287
|
-
hint: "用
|
|
16291
|
+
hint: "用 list_data_slots 查看可用属性"
|
|
16288
16292
|
});
|
|
16289
16293
|
let s = _v(window, e);
|
|
16290
16294
|
if (s == null) return $({
|
|
@@ -16313,8 +16317,8 @@ function Dv(e, r = {}) {
|
|
|
16313
16317
|
});
|
|
16314
16318
|
}
|
|
16315
16319
|
}, {
|
|
16316
|
-
name: "
|
|
16317
|
-
description: "在一个已注册
|
|
16320
|
+
name: "search_data_slot",
|
|
16321
|
+
description: "在一个已注册 数据槽内做文本搜索(只读,无副作用)。mode:substring(子串,默认,大小写不敏感)、regex(正则,i 标志)、fuzzy(模糊:子串命中或 Levenshtein 距离 ≤ fuzzyThreshold)。递归遍历所有叶子值(及可选 key),返回命中元素的 path + value(超 200 字符截断)。适合在大 JSON 里找名字近似、记不清的元素,定位 path 后用 edit_data_slot 改。",
|
|
16318
16322
|
schema: t.object({
|
|
16319
16323
|
path: t.string().describe("已注册的属性路径(在它的子树内搜索)"),
|
|
16320
16324
|
query: t.string().describe("搜索词(substring/regex/fuzzy 共用)"),
|
|
@@ -16334,7 +16338,7 @@ function Dv(e, r = {}) {
|
|
|
16334
16338
|
code: "NOT_REGISTERED",
|
|
16335
16339
|
path: e,
|
|
16336
16340
|
message: `属性 "${e}" 未注册`,
|
|
16337
|
-
hint: "用
|
|
16341
|
+
hint: "用 list_data_slots 查看可用属性"
|
|
16338
16342
|
});
|
|
16339
16343
|
if (t.length > 8e3) return $({
|
|
16340
16344
|
code: "SCRIPT_TOO_LARGE",
|
|
@@ -16362,12 +16366,12 @@ function Dv(e, r = {}) {
|
|
|
16362
16366
|
code: "SCHEMA_INVALID",
|
|
16363
16367
|
path: e,
|
|
16364
16368
|
message: "脚本返回值校验失败,未写入(transform 模式要求返回该属性的完整新值且符合 schema)",
|
|
16365
|
-
hint: `确认脚本 return 了完整新值(非部分);按
|
|
16369
|
+
hint: `确认脚本 return 了完整新值(非部分);按 describe_data_slot("${e}") 查看格式`,
|
|
16366
16370
|
details: V_(t.error.issues)
|
|
16367
16371
|
});
|
|
16368
|
-
|
|
16372
|
+
m(e, "edit", "eval_transform");
|
|
16369
16373
|
let n = _v(window, e);
|
|
16370
|
-
return typeof n == "object" && n && t.data !== null && typeof t.data == "object" ? Ev(n, t.data) : vv(window, e, t.data),
|
|
16374
|
+
return typeof n == "object" && n && t.data !== null && typeof t.data == "object" ? Ev(n, t.data) : vv(window, e, t.data), u({
|
|
16371
16375
|
op: "edit",
|
|
16372
16376
|
path: e,
|
|
16373
16377
|
detail: "eval_transform",
|
|
@@ -16380,8 +16384,8 @@ function Dv(e, r = {}) {
|
|
|
16380
16384
|
elapsedMs: a.elapsedMs
|
|
16381
16385
|
});
|
|
16382
16386
|
}, {
|
|
16383
|
-
name: "
|
|
16384
|
-
description: "在隔离的 Web Worker 沙箱里对一个已注册
|
|
16387
|
+
name: "eval_script",
|
|
16388
|
+
description: "在隔离的 Web Worker 沙箱里对一个已注册 数据槽跑自定义 JS 脚本(无 window/document 访问,fetch/XHR/WebSocket/importScripts 已禁用,超时 3s 可终止)。脚本以 `data` 为入参(该属性的深拷贝),返回值即结果。mode:query(默认,只读,把返回值回给 LLM,适合过滤/映射/聚合/统计大数组)、transform(把返回值作为该属性的新整体值,经 schema 校验后就地落地,适合批量重写)。注意:transform 需返回完整新值;query 不改 window。脚本内可用标准 JS(Array/Object/JSON/Math 等)与 async/await。",
|
|
16385
16389
|
schema: t.object({
|
|
16386
16390
|
path: t.string().describe("已注册的属性路径,其深拷贝作为脚本的 data 入参"),
|
|
16387
16391
|
script: t.string().describe("JS 脚本体,如 data.filter(c=>c.stock>0).map(c=>c.id);入参名 data;末尾表达式或 return 即返回值"),
|
|
@@ -16389,12 +16393,12 @@ function Dv(e, r = {}) {
|
|
|
16389
16393
|
})
|
|
16390
16394
|
})
|
|
16391
16395
|
];
|
|
16392
|
-
return Object.defineProperty(
|
|
16393
|
-
value:
|
|
16396
|
+
return Object.defineProperty(T, "controller", {
|
|
16397
|
+
value: l,
|
|
16394
16398
|
enumerable: !1,
|
|
16395
16399
|
configurable: !1,
|
|
16396
16400
|
writable: !1
|
|
16397
|
-
}),
|
|
16401
|
+
}), T;
|
|
16398
16402
|
}
|
|
16399
16403
|
//#endregion
|
|
16400
16404
|
//#region src/core/tools/fetchDoc.ts
|
|
@@ -16432,7 +16436,7 @@ function jv(e, t) {
|
|
|
16432
16436
|
return Dv(e, t);
|
|
16433
16437
|
}
|
|
16434
16438
|
function Mv(e, t, n) {
|
|
16435
|
-
let r = e?.
|
|
16439
|
+
let r = e?.dataSlotOps !== !1, i = e?.fetch !== !1;
|
|
16436
16440
|
return [...r ? t : [], ...i ? n : []];
|
|
16437
16441
|
}
|
|
16438
16442
|
//#endregion
|
|
@@ -16443,9 +16447,9 @@ function Pv(e, t) {
|
|
|
16443
16447
|
name: "usageHints",
|
|
16444
16448
|
augmentPrompt: () => {
|
|
16445
16449
|
let n = [];
|
|
16446
|
-
if (e?.planning !== !1 && n.push("多步任务建议先 write_todos 拆解为步骤并逐步推进。"), t && (n.push("改属性前先
|
|
16450
|
+
if (e?.planning !== !1 && n.push("多步任务建议先 write_todos 拆解为步骤并逐步推进。"), t && (n.push("改属性前先 get_data_slot(path) 读其当前真实值与 hash(返回末尾 hash=xxx),基于真实值改,不要凭记忆。写入(set/edit/delete)时回传 expectedHash=该 hash 启用乐观锁——若属性在你 get 之后被外部代码/其他 agent/用户手动改过,会触发冲突:集成方若开启人工介入,工具会挂起等用户决定(保留外部/强制覆盖/回退),你应等待工具返回后按结果继续(保留外部→重新 get 再改;强制覆盖→已写入,继续;回退→已回退到历史快照,基于回退值重写);未开启人工介入时返回 VERSION_CONFLICT 不写入,重新 get 拿最新值与 hash 再改。"), n.push("不确定可操作哪些属性时用 list_data_slots 查看(动态组件场景下注册表会增删,以工具返回为准,勿凭旧记忆);不确定某属性字段结构时用 describe_data_slot。"), n.push("修改大对象/数组属性优先用 edit_data_slot 增量 patch(只发改动部分),避免 set 整体重传被 max_tokens 截断导致 JSON 不完整、校验失败。"), n.push("修改属性出错时可用 restore_data_snapshot(path) 回退最近一次。"), n.push("在大数组里按条件筛选元素用 query_data_slot(JSONPath,如 $[?(@.type==\"card\" && @.price<100)]),返回匹配元素的 path/index;定位后再 edit_data_slot 改。"), n.push("找名字记不清的元素用 search_data_slot(支持 substring/regex/fuzzy 模糊搜索)。"), n.push("需要过滤/映射/聚合/批量重写大数组时用 eval_script(沙箱脚本,入参 data);只读探查用 mode=query,批量重写用 mode=transform(返回值经校验后落地)。")), e?.subagent !== !1 && n.push("独立子任务可 spawn_agent 委派(只读工具,过程不占主上下文)。"), e?.subagents?.length) {
|
|
16447
16451
|
let t = e.subagents.filter((e) => (e.temperature ?? 0) >= Nv || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), r = e.subagents.filter((e) => (e.temperature ?? 0) < Nv && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
|
|
16448
|
-
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(" · 方案定稿后,由你(主 agent)用
|
|
16452
|
+
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(" · 方案定稿后,由你(主 agent)用 edit_data_slot 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。"), n.push(" · 简单/明确任务(如\"标题改红色\")直接执行,不必走规划-反思。");
|
|
16449
16453
|
}
|
|
16450
16454
|
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("用户在选项里选了哪个,就按那个方案继续;选「拒绝」则停止并询问如何调整。")), n.length && n.unshift("调用工具务必用标准 function calling(工具调用)格式发起,不要在回复正文里输出伪 XML/标签(如 deepseek 的 tool_calls 标签、invoke、function_call、tool_call 等)或 JSON 文本——那不会被识别为工具调用,会被当普通文字,工具不执行。"), n.length ? "## 能力使用提示\n" + n.join("\n") : void 0;
|
|
16451
16455
|
}
|
|
@@ -16871,7 +16875,7 @@ function fy(e) {
|
|
|
16871
16875
|
};
|
|
16872
16876
|
}
|
|
16873
16877
|
function py(e) {
|
|
16874
|
-
return e === "
|
|
16878
|
+
return e === "set_data_slot" ? "set" : e === "edit_data_slot" ? "edit" : e === "delete_data_slot" ? "delete" : e === "restore_data_snapshot" ? "restore" : null;
|
|
16875
16879
|
}
|
|
16876
16880
|
function my(e) {
|
|
16877
16881
|
let t = e.split("."), n = globalThis.window;
|
|
@@ -16889,7 +16893,7 @@ function hy(e, t) {
|
|
|
16889
16893
|
if (i) {
|
|
16890
16894
|
let n = String(t.args?.path ?? "");
|
|
16891
16895
|
e({
|
|
16892
|
-
type: "
|
|
16896
|
+
type: "data_slot_change",
|
|
16893
16897
|
path: n,
|
|
16894
16898
|
operation: i,
|
|
16895
16899
|
value: n ? my(n) : void 0
|
|
@@ -16942,17 +16946,18 @@ function gy(e, r) {
|
|
|
16942
16946
|
} } : void 0,
|
|
16943
16947
|
maxBytes: e.vfs?.maxBytes
|
|
16944
16948
|
}), m = Sg(), h = Ag(e.memory || ""), g = { current: null }, _ = e.checkpoint, v = _ !== void 0 && _ !== !1, y = v ? qg({
|
|
16945
|
-
|
|
16949
|
+
slotPaths: (e.dataSlots ?? []).map((e) => e.path),
|
|
16946
16950
|
vfsStore: p,
|
|
16947
16951
|
todosMw: m,
|
|
16948
16952
|
getTodos: () => g.current?.getState?.()?.todos ?? [],
|
|
16949
16953
|
messages: f,
|
|
16950
16954
|
maxCheckpoints: _ && typeof _ == "object" ? _.maxCheckpoints : void 0
|
|
16951
|
-
}) : null, b = !_ || typeof _ != "object" || _.auto !== !1, x = e.capabilities, S = x?.
|
|
16955
|
+
}) : null, b = !_ || typeof _ != "object" || _.auto !== !1, x = e.capabilities, S = x?.dataSlotOps !== !1, C = S ? Dv(e.dataSlots || [], {
|
|
16952
16956
|
onAudit: e.debug ? (e) => console.log("[page-agent-sdk][window audit]", e) : void 0,
|
|
16953
16957
|
maxSnapshots: e.maxSnapshots,
|
|
16954
|
-
onConflict: o
|
|
16955
|
-
|
|
16958
|
+
onConflict: o,
|
|
16959
|
+
autoLock: e.autoLock
|
|
16960
|
+
}) : [], w = S ? C.controller ?? null : null, T = () => w?.list() ?? e.dataSlots ?? [], E = /* @__PURE__ */ new Map(), D = Mv(x, C, kv);
|
|
16956
16961
|
D.forEach((e) => E.set(e.name, "builtin"));
|
|
16957
16962
|
let O = [...e.tools || []];
|
|
16958
16963
|
O.forEach((e) => E.set(e.name, "user"));
|
|
@@ -16960,10 +16965,10 @@ function gy(e, r) {
|
|
|
16960
16965
|
A && E.set(Lg, "builtin");
|
|
16961
16966
|
let j = v && y ? [n(async () => {
|
|
16962
16967
|
let e = y.list();
|
|
16963
|
-
return e.length ? y.restore() ? `已回退到最近一次正常状态(checkpoint #${e[e.length - 1].id})
|
|
16968
|
+
return e.length ? y.restore() ? `已回退到最近一次正常状态(checkpoint #${e[e.length - 1].id})。对话历史、数据槽注册项、vfs、todos 已整体还原。请基于回退后的状态重新判断并继续。` : "回退失败:无可用 checkpoint。" : "无可用 checkpoint,无法回退。";
|
|
16964
16969
|
}, {
|
|
16965
16970
|
name: "restore_last_checkpoint",
|
|
16966
|
-
description: "回退到最近一次正常状态(整体还原对话历史 +
|
|
16971
|
+
description: "回退到最近一次正常状态(整体还原对话历史 + 数据槽注册项 + vfs + todos)。当本轮操作出错、页面被改坏、或走偏时调用,回到本轮起点重新来过。不传参数即回退最近一次。",
|
|
16967
16972
|
schema: t.object({}).optional()
|
|
16968
16973
|
}), n(async () => {
|
|
16969
16974
|
let e = y.list();
|
|
@@ -16997,10 +17002,10 @@ function gy(e, r) {
|
|
|
16997
17002
|
allTools: M,
|
|
16998
17003
|
debug: e.debug
|
|
16999
17004
|
}) : void 0, ae = [
|
|
17000
|
-
"
|
|
17001
|
-
"
|
|
17002
|
-
"
|
|
17003
|
-
"
|
|
17005
|
+
"get_data_slot",
|
|
17006
|
+
"get_slot_paths",
|
|
17007
|
+
"list_data_slots",
|
|
17008
|
+
"describe_data_slot",
|
|
17004
17009
|
"fetch_document"
|
|
17005
17010
|
], oe = M.filter((e) => ae.includes(e.name)), se = z ? o_({
|
|
17006
17011
|
check: e.verify.check ?? f_({ schemas: () => Object.fromEntries(T().map((e) => [e.path, e.schema])) }),
|
|
@@ -17016,7 +17021,7 @@ function gy(e, r) {
|
|
|
17016
17021
|
description: e.description,
|
|
17017
17022
|
temperature: e.temperature
|
|
17018
17023
|
}))
|
|
17019
|
-
}, S && !!e.
|
|
17024
|
+
}, S && !!e.dataSlots?.length), le = e.onEvent, ue = /* @__PURE__ */ new Set(), de = (e) => {
|
|
17020
17025
|
if (e.type !== "approval_request") {
|
|
17021
17026
|
if (le) try {
|
|
17022
17027
|
le(e);
|
|
@@ -17033,11 +17038,11 @@ function gy(e, r) {
|
|
|
17033
17038
|
...I ? [I_({
|
|
17034
17039
|
...B_(e, u.contextWindow),
|
|
17035
17040
|
llmInvoke: d,
|
|
17036
|
-
|
|
17041
|
+
getRegisteredSlots: () => T().map((e) => ({
|
|
17037
17042
|
path: e.path,
|
|
17038
17043
|
description: e.description
|
|
17039
17044
|
})),
|
|
17040
|
-
preserveLastToolResults: (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? ["
|
|
17045
|
+
preserveLastToolResults: (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? ["describe_data_slot", "list_data_slots"]
|
|
17041
17046
|
})] : [],
|
|
17042
17047
|
...L ? [h] : [],
|
|
17043
17048
|
...e.permissions?.length ? [Fg(e.permissions)] : [],
|
|
@@ -17064,9 +17069,9 @@ function gy(e, r) {
|
|
|
17064
17069
|
mcpClosers: [],
|
|
17065
17070
|
mcpServers: [],
|
|
17066
17071
|
checkpoint: y,
|
|
17067
|
-
|
|
17072
|
+
dataSlotOpsController: w,
|
|
17068
17073
|
pendingConflict: i,
|
|
17069
|
-
|
|
17074
|
+
liveDataSlots: T,
|
|
17070
17075
|
applySnapshot(t) {
|
|
17071
17076
|
t.messages?.length && f.push(...t.messages), t.vfs && p.hydrate && p.hydrate(t.vfs), t.todos?.length && m.reset(t.todos), t.memory && !e.memory && h.reset(t.memory);
|
|
17072
17077
|
},
|
|
@@ -17133,7 +17138,7 @@ function gy(e, r) {
|
|
|
17133
17138
|
name: e.name,
|
|
17134
17139
|
description: e.description
|
|
17135
17140
|
})),
|
|
17136
|
-
|
|
17141
|
+
dataSlots: T().map((e) => ({
|
|
17137
17142
|
path: e.path,
|
|
17138
17143
|
description: e.description,
|
|
17139
17144
|
schema: e.schema
|
|
@@ -17293,15 +17298,15 @@ function _y(e) {
|
|
|
17293
17298
|
restoreLastCheckpoint: () => i.checkpoint?.restore() ?? !1,
|
|
17294
17299
|
listCheckpoints: () => i.checkpoint?.list() ?? [],
|
|
17295
17300
|
hook: (e) => (i.listeners.add(e), () => i.listeners.delete(e)),
|
|
17296
|
-
|
|
17297
|
-
if (!i.
|
|
17298
|
-
console.warn("[page-agent-sdk]
|
|
17301
|
+
addDataSlot: (e) => {
|
|
17302
|
+
if (!i.dataSlotOpsController) {
|
|
17303
|
+
console.warn("[page-agent-sdk] addDataSlot 忽略:dataSlotOps 已关闭(capabilities.dataSlotOps:false)");
|
|
17299
17304
|
return;
|
|
17300
17305
|
}
|
|
17301
|
-
i.
|
|
17306
|
+
i.dataSlotOpsController.add(e);
|
|
17302
17307
|
},
|
|
17303
|
-
|
|
17304
|
-
|
|
17308
|
+
removeDataSlot: (e) => i.dataSlotOpsController ? i.dataSlotOpsController.remove(e) : !1,
|
|
17309
|
+
listDataSlots: () => i.liveDataSlots(),
|
|
17305
17310
|
pendingConflict: i.pendingConflict,
|
|
17306
17311
|
resolveConflict: (e) => i.resolveConflict(e)
|
|
17307
17312
|
};
|
|
@@ -17319,4 +17324,4 @@ function vy(e) {
|
|
|
17319
17324
|
});
|
|
17320
17325
|
}
|
|
17321
17326
|
//#endregion
|
|
17322
|
-
export { z_ as CONTEXT_PRESETS, Xh as ChatDialog, ef as CodePreview, Lg as HUMAN_CONFIRM_TOOL_NAME, nf as MessageContent, S_ as connectMcp, Sl as copyText, bg as createAgent, Ig as createApprovalMiddleware, _y as createChatSdk, qg as createCheckpointManager, Jg as createCheckpointMiddleware, Bg as createHumanConfirmMiddleware, zg as createHumanConfirmTool, ty as createMemoryBackend, ay as createSessionStore, n_ as createSubagentMiddleware, a_ as createSubagentsMiddleware, Pv as createUsageHintsMiddleware, o_ as createVerifyMiddleware, G_ as createVfs, ry as createWebStorageBackend,
|
|
17327
|
+
export { z_ as CONTEXT_PRESETS, Xh as ChatDialog, ef as CodePreview, Lg as HUMAN_CONFIRM_TOOL_NAME, nf as MessageContent, S_ as connectMcp, Sl as copyText, bg as createAgent, Ig as createApprovalMiddleware, _y as createChatSdk, qg as createCheckpointManager, Jg as createCheckpointMiddleware, Dv as createDataSlotOps, Bg as createHumanConfirmMiddleware, zg as createHumanConfirmTool, ty as createMemoryBackend, ay as createSessionStore, n_ as createSubagentMiddleware, a_ as createSubagentsMiddleware, Pv as createUsageHintsMiddleware, o_ as createVerifyMiddleware, G_ as createVfs, ry as createWebStorageBackend, f_ as createWriteBackCheck, jv as defineDataSlotToolset, Cg as defineSkill, vy as defineTool, hg as detectGarbledToolCall, rg as estimateTokens, y_ as extractText, kv as fetchDocTools, Av as fetchTools, V_ as formatZodIssues, qv as isQuotaError, cv as jpEval, U_ as jsonParseError, ag as offloadPassThroughChars, ig as offloadThresholdChars, L_ as presets, B_ as resolveContextOptions, ng as resolveModelCaps, pv as runSandboxedScript, uv as searchJson, Mv as selectBuiltinTools, R_ as systemPromptHelpers, $ as toolError, xl as useChat, e as z, H_ as zodError };
|