page-agent-sdk 2.4.1 → 2.5.1
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 +15 -14
- package/README.zh-CN.md +11 -10
- package/dist/page-agent-sdk.iife.js +117 -117
- package/dist/page-agent-sdk.js +620 -426
- package/dist/page-agent-sdk.umd.cjs +35 -35
- package/package.json +1 -1
- package/skills/page-agent-sdk-integrate/SKILL.md +39 -30
- package/skills/page-agent-sdk-integrate/references/advanced.md +37 -41
- package/skills/page-agent-sdk-integrate/references/api.md +38 -40
- package/skills/page-agent-sdk-integrate/references/options.md +17 -14
- package/skills/page-agent-sdk-integrate/references/quickstart.md +43 -43
- package/skills/page-agent-sdk-integrate/references/use-cases.md +66 -62
- package/types/index.d.ts +7 -1
package/dist/page-agent-sdk.js
CHANGED
|
@@ -14531,7 +14531,8 @@ function qg(e) {
|
|
|
14531
14531
|
return {
|
|
14532
14532
|
save(i) {
|
|
14533
14533
|
let a = Kg(e.messages), o = {};
|
|
14534
|
-
|
|
14534
|
+
if (e.getData) o[""] = Vg(e.getData());
|
|
14535
|
+
else for (let t of e.slotPaths ?? []) o[t] = Vg(Hg(window, t));
|
|
14535
14536
|
let s = {
|
|
14536
14537
|
id: r++,
|
|
14537
14538
|
label: i,
|
|
@@ -14559,8 +14560,13 @@ function qg(e) {
|
|
|
14559
14560
|
restore(n) {
|
|
14560
14561
|
let r = n == null ? t[t.length - 1] : t.find((e) => e.id === n);
|
|
14561
14562
|
if (!r) return !1;
|
|
14562
|
-
e.messages.splice(0, e.messages.length, ...Vg(r.messages))
|
|
14563
|
-
|
|
14563
|
+
if (e.messages.splice(0, e.messages.length, ...Vg(r.messages)), e.getData) {
|
|
14564
|
+
let t = r.windowVals[""];
|
|
14565
|
+
if (t !== void 0) {
|
|
14566
|
+
let n = e.getData();
|
|
14567
|
+
typeof n == "object" && n && Wg(n, Vg(t));
|
|
14568
|
+
}
|
|
14569
|
+
} else for (let [e, t] of Object.entries(r.windowVals)) Gg(e, Vg(t));
|
|
14564
14570
|
let i = e.vfsStore.files;
|
|
14565
14571
|
for (let e of Object.keys(i)) delete i[e];
|
|
14566
14572
|
return Object.assign(i, Vg(r.vfs)), e.todosMw.reset(Vg(r.todos)), !0;
|
|
@@ -14604,7 +14610,7 @@ async function t_(e, t, n, r, i) {
|
|
|
14604
14610
|
temperature: t.temperature ?? t.llm.temperature,
|
|
14605
14611
|
maxTokens: t.maxTokens ?? t.llm.maxTokens
|
|
14606
14612
|
},
|
|
14607
|
-
systemPrompt: e.role?.trim() || t.systemPrompt || "你是一个专注的子任务执行者。你只有只读工具(
|
|
14613
|
+
systemPrompt: e.role?.trim() || t.systemPrompt || "你是一个专注的子任务执行者。你只有只读工具(读主数据 / 抓文档),用它们完成给定任务,给出简洁结论,不要展开多余解释。",
|
|
14608
14614
|
tools: c,
|
|
14609
14615
|
middleware: [...t.skills?.length ? [kg(t.skills)] : [], ...l],
|
|
14610
14616
|
maxToolRounds: t.maxToolRounds ?? $g,
|
|
@@ -14653,7 +14659,7 @@ function n_(e) {
|
|
|
14653
14659
|
schema: t.object({
|
|
14654
14660
|
prompt: t.string().describe("子任务描述(子 agent 的唯一输入)"),
|
|
14655
14661
|
role: t.string().optional().describe("子 agent 身份(如\"你是代码审查专家\")"),
|
|
14656
|
-
tools: t.array(t.string()).optional().describe("子 agent 可用工具名白名单(
|
|
14662
|
+
tools: t.array(t.string()).optional().describe("子 agent 可用工具名白名单(默认只读主数据 + fetch)"),
|
|
14657
14663
|
model: t.string().optional().describe("覆盖模型(默认同主)")
|
|
14658
14664
|
})
|
|
14659
14665
|
}), n(async ({ tasks: t }) => (await $h(t, r, async (t, n) => {
|
|
@@ -14796,25 +14802,25 @@ function d_(e, t) {
|
|
|
14796
14802
|
return n;
|
|
14797
14803
|
}
|
|
14798
14804
|
function f_(e = {}) {
|
|
14799
|
-
let t = e.window ?? globalThis.window, n = typeof e.schemas == "function" ? e.schemas : () => e.schemas ?? {};
|
|
14805
|
+
let t = typeof e.root == "function" ? e.root : e.root === void 0 ? () => e.window ?? globalThis.window : () => e.root, n = typeof e.schemas == "function" ? e.schemas : () => e.schemas ?? {};
|
|
14800
14806
|
return async ({ messages: e }) => {
|
|
14801
14807
|
let r = l_(e);
|
|
14802
14808
|
if (!r.length) return { ok: !0 };
|
|
14803
|
-
let i = u_(e), a = n()[""], o = [];
|
|
14804
|
-
for (let { path: e, op:
|
|
14805
|
-
let r =
|
|
14809
|
+
let i = u_(e), a = n()[""], o = t(), s = [];
|
|
14810
|
+
for (let { path: e, op: t, callId: n } of r) {
|
|
14811
|
+
let r = n ? i.get(n) : void 0;
|
|
14806
14812
|
if (r && c_.test(r)) continue;
|
|
14807
|
-
let c = d_(
|
|
14808
|
-
if (
|
|
14809
|
-
else if (c == null)
|
|
14813
|
+
let c = d_(o, e);
|
|
14814
|
+
if (t === "delete_data") c !== void 0 && s.push(`${e} 删除后读回仍有值,疑似未生效`);
|
|
14815
|
+
else if (c == null) s.push(`写入 ${e} 后读回为空,疑似未生效`);
|
|
14810
14816
|
else if (a) {
|
|
14811
|
-
let
|
|
14812
|
-
|
|
14817
|
+
let t = a.safeParse(o);
|
|
14818
|
+
t.success || s.push(`${e} 读回值不符合 schema:${t.error.issues?.[0]?.message ?? "校验失败"}`);
|
|
14813
14819
|
}
|
|
14814
14820
|
}
|
|
14815
|
-
return
|
|
14821
|
+
return s.length ? {
|
|
14816
14822
|
ok: !1,
|
|
14817
|
-
feedback:
|
|
14823
|
+
feedback: s.join(";\n")
|
|
14818
14824
|
} : { ok: !0 };
|
|
14819
14825
|
};
|
|
14820
14826
|
}
|
|
@@ -15017,7 +15023,18 @@ function P_(e = {}) {
|
|
|
15017
15023
|
...e
|
|
15018
15024
|
};
|
|
15019
15025
|
async function n(e) {
|
|
15020
|
-
let n = C_(e), r = e.length, i =
|
|
15026
|
+
let n = C_(e), r = e.length, i = "";
|
|
15027
|
+
if (n.length) {
|
|
15028
|
+
let t = n[0].startIdx;
|
|
15029
|
+
for (let n = 0; n < t; n++) {
|
|
15030
|
+
let t = e[n];
|
|
15031
|
+
if (t.role === "system" && typeof t.content == "string" && t.content.startsWith("【更早对话摘要")) {
|
|
15032
|
+
i = t.content.replace(/^【[^】]*】\n?/, "");
|
|
15033
|
+
break;
|
|
15034
|
+
}
|
|
15035
|
+
}
|
|
15036
|
+
}
|
|
15037
|
+
let a = (t) => ({
|
|
15021
15038
|
messages: e,
|
|
15022
15039
|
stats: {
|
|
15023
15040
|
triggered: !1,
|
|
@@ -15028,82 +15045,66 @@ function P_(e = {}) {
|
|
|
15028
15045
|
compressedMessages: r,
|
|
15029
15046
|
strategy: t
|
|
15030
15047
|
}
|
|
15031
|
-
}),
|
|
15048
|
+
}), o, s, c;
|
|
15032
15049
|
if (t.contextWindow && t.contextWindow > 0) {
|
|
15033
|
-
if (n.reduce((e, t) => e + j_(t), 0) <= t.contextWindow * (t.summaryThresholdRatio ?? .5)) return
|
|
15034
|
-
let e = t.contextWindow * (t.windowRatio ?? .4), r = 0,
|
|
15050
|
+
if (n.reduce((e, t) => e + j_(t), 0) <= t.contextWindow * (t.summaryThresholdRatio ?? .5)) return a("none");
|
|
15051
|
+
let e = t.contextWindow * (t.windowRatio ?? .4), r = 0, i = 0;
|
|
15035
15052
|
for (let t = n.length - 1; t >= 0; t--) if (r += j_(n[t]), r >= e) {
|
|
15036
|
-
|
|
15053
|
+
i = t + 1;
|
|
15037
15054
|
break;
|
|
15038
15055
|
}
|
|
15039
|
-
if (
|
|
15040
|
-
|
|
15056
|
+
if (i > n.length - 1 && (i = n.length - 1), i < 0 && (i = 0), o = n.slice(i), s = n.slice(0, i), !s.length) return a("none");
|
|
15057
|
+
c = "token-window+";
|
|
15041
15058
|
} else {
|
|
15042
|
-
if (n.length <= t.summaryThresholdRounds) return
|
|
15059
|
+
if (n.length <= t.summaryThresholdRounds) return a("none");
|
|
15043
15060
|
let e = Math.min(t.windowRounds, n.length);
|
|
15044
|
-
|
|
15061
|
+
o = n.slice(n.length - e), s = n.slice(0, n.length - e), c = "window+";
|
|
15045
15062
|
}
|
|
15046
|
-
let
|
|
15063
|
+
let l = [...e].reverse().find((e) => e.role === "user")?.content || "", u = t.preserveLastToolResults?.length ? new Set(t.preserveLastToolResults) : void 0, d, f;
|
|
15047
15064
|
if (t.enableLLMSummary && t.llmInvoke) try {
|
|
15048
|
-
|
|
15065
|
+
d = await t.llmInvoke(M_(s, u)), f = c + "llm_summary";
|
|
15049
15066
|
} catch {
|
|
15050
|
-
|
|
15051
|
-
}
|
|
15052
|
-
else
|
|
15053
|
-
let
|
|
15054
|
-
|
|
15055
|
-
|
|
15067
|
+
d = M_(s, u), f = c + "index_summary(llm_fallback)";
|
|
15068
|
+
}
|
|
15069
|
+
else d = M_(s, u), f = c + "index_summary";
|
|
15070
|
+
let p = t.enableRecall ? N_(s, l, t.recallTopK) : [], m = p.length ? p.map((e) => `- 第${e.round}轮:${w_(e.userMsg.content, 60)} → ${e.assistantMsgs[0] ? w_(e.assistantMsgs[0].content, 80) : ""}`).join("\n") : "", h = i ? `${d}\n【更早累积摘要】\n${i}` : d, g = [`【对话历史摘要】以下是之前 ${s.length} 轮对话的要点(最新 ${o.length} 轮已完整保留):`, h];
|
|
15071
|
+
m && g.push("\n【与当前问题可能相关的早期对话】", m);
|
|
15072
|
+
let _ = t.getRegisteredData ?? t.getRegisteredSlots;
|
|
15073
|
+
if (_) try {
|
|
15074
|
+
let e = _();
|
|
15056
15075
|
if (e.length) {
|
|
15057
15076
|
let t = e.map((e) => `- ${e.path ? e.path + ": " : ""}${e.description}`).join("\n");
|
|
15058
|
-
|
|
15077
|
+
g.push("\n【当前可操作数据(动态增删后的最新状态,操作前以 describe_data / read 为准)】", t);
|
|
15059
15078
|
}
|
|
15060
15079
|
} catch {}
|
|
15061
|
-
let
|
|
15080
|
+
let v = {
|
|
15062
15081
|
role: "system",
|
|
15063
|
-
content:
|
|
15082
|
+
content: g.join("\n"),
|
|
15064
15083
|
timestamp: Date.now()
|
|
15065
|
-
},
|
|
15066
|
-
for (let e of
|
|
15067
|
-
let
|
|
15084
|
+
}, y = [];
|
|
15085
|
+
for (let e of o) y.push(e.userMsg), y.push(...e.assistantMsgs);
|
|
15086
|
+
let b = [v, ...y];
|
|
15068
15087
|
return {
|
|
15069
|
-
messages:
|
|
15088
|
+
messages: b,
|
|
15070
15089
|
stats: {
|
|
15071
15090
|
triggered: !0,
|
|
15072
15091
|
roundsTotal: n.length,
|
|
15073
|
-
roundsSummarized:
|
|
15074
|
-
roundsRecalled:
|
|
15092
|
+
roundsSummarized: s.length,
|
|
15093
|
+
roundsRecalled: p.length,
|
|
15075
15094
|
originalMessages: r,
|
|
15076
|
-
compressedMessages:
|
|
15077
|
-
strategy:
|
|
15095
|
+
compressedMessages: b.length,
|
|
15096
|
+
strategy: f
|
|
15078
15097
|
}
|
|
15079
15098
|
};
|
|
15080
15099
|
}
|
|
15081
15100
|
return {
|
|
15082
15101
|
compress: n,
|
|
15083
|
-
config: t
|
|
15084
|
-
trimToolResults: F_
|
|
15102
|
+
config: t
|
|
15085
15103
|
};
|
|
15086
15104
|
}
|
|
15087
|
-
function F_(e, t) {
|
|
15088
|
-
let n = [];
|
|
15089
|
-
if (e.forEach((e, t) => {
|
|
15090
|
-
e instanceof o && n.push(t);
|
|
15091
|
-
}), n.length <= 2) return e;
|
|
15092
|
-
let r = new Set(n.slice(-2));
|
|
15093
|
-
return e.map((e, n) => {
|
|
15094
|
-
if (!(e instanceof o) || r.has(n)) return e;
|
|
15095
|
-
let i = typeof e.content == "string" ? e.content : JSON.stringify(e.content);
|
|
15096
|
-
if (i.length <= t) return e;
|
|
15097
|
-
let a = i.slice(0, t) + `\n…[已截断,原长度 ${i.length}]`;
|
|
15098
|
-
return new o({
|
|
15099
|
-
tool_call_id: e.tool_call_id || e.lc_id || "trimmed",
|
|
15100
|
-
content: a
|
|
15101
|
-
});
|
|
15102
|
-
});
|
|
15103
|
-
}
|
|
15104
15105
|
//#endregion
|
|
15105
15106
|
//#region src/core/harness/summarization.ts
|
|
15106
|
-
function
|
|
15107
|
+
function F_(e = {}) {
|
|
15107
15108
|
let t = P_(e);
|
|
15108
15109
|
return {
|
|
15109
15110
|
name: "summarization",
|
|
@@ -15118,7 +15119,7 @@ function I_(e = {}) {
|
|
|
15118
15119
|
}
|
|
15119
15120
|
//#endregion
|
|
15120
15121
|
//#region src/core/presets.ts
|
|
15121
|
-
var
|
|
15122
|
+
var I_ = {
|
|
15122
15123
|
pageBuilder: { systemPrompt: "你是页面构建助手。按用户意图读写主数据(经 data 声明 + schema 校验),改完页面实时更新。" },
|
|
15123
15124
|
researcher: {
|
|
15124
15125
|
systemPrompt: "你是调研助手。多路调研用 spawn_agents 并行委派子 agent(各负责一个方向);单份资料用 fetch_document 抓取;最后结构化汇总,给出结论与依据。",
|
|
@@ -15132,15 +15133,15 @@ var L_ = {
|
|
|
15132
15133
|
memory: !1,
|
|
15133
15134
|
subagent: !1
|
|
15134
15135
|
} }
|
|
15135
|
-
},
|
|
15136
|
+
}, L_ = { reliableWriteRules: [
|
|
15136
15137
|
"【可靠写入规则】",
|
|
15137
|
-
"1.
|
|
15138
|
-
"2.
|
|
15139
|
-
"3.
|
|
15138
|
+
"1. 改任何字段前,先用 read({ jsonPath }) 读其当前真实值,基于真实值改,不要凭记忆;",
|
|
15139
|
+
"2. 若不确定可操作哪些字段,先 read() 不传 jsonPath 查看主数据说明 + schema 声明字段(集成方可经 sdk.setData 运行时替换 schema,以工具返回为准,勿凭旧记忆);",
|
|
15140
|
+
"3. 不确定某字段结构时,read({ jsonPath }) 返回含格式说明,字段以返回为准;",
|
|
15140
15141
|
"4. 写入若被 schema 校验拒绝(返回结构化错误含字段名与期望类型),按错误修正后重试,不要放弃;",
|
|
15141
|
-
"5. 优先用 write 的 patch 增量改(只发改动,如 write({
|
|
15142
|
+
"5. 优先用 write 的 patch 增量改(只发改动,如 write({ value, patch:{ op, jsonPath } })),避免整体重传大 JSON 被截断。"
|
|
15142
15143
|
].join("\n") };
|
|
15143
|
-
function
|
|
15144
|
+
function R_(e) {
|
|
15144
15145
|
if (!e) return "";
|
|
15145
15146
|
try {
|
|
15146
15147
|
let t = e.shape ?? (e._def?.shape ? typeof e._def.shape == "function" ? e._def.shape() : e._def.shape : null);
|
|
@@ -15153,7 +15154,7 @@ function z_(e) {
|
|
|
15153
15154
|
}
|
|
15154
15155
|
//#endregion
|
|
15155
15156
|
//#region src/core/sdk/contextPreset.ts
|
|
15156
|
-
var
|
|
15157
|
+
var z_ = {
|
|
15157
15158
|
auto: {
|
|
15158
15159
|
summaryThresholdRatio: .5,
|
|
15159
15160
|
windowRatio: .4,
|
|
@@ -15175,8 +15176,8 @@ var B_ = {
|
|
|
15175
15176
|
enableLLMSummary: !0
|
|
15176
15177
|
}
|
|
15177
15178
|
};
|
|
15178
|
-
function
|
|
15179
|
-
let n =
|
|
15179
|
+
function B_(e, t) {
|
|
15180
|
+
let n = z_[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
|
|
15180
15181
|
return {
|
|
15181
15182
|
...n,
|
|
15182
15183
|
...r,
|
|
@@ -15193,7 +15194,7 @@ function $(e) {
|
|
|
15193
15194
|
};
|
|
15194
15195
|
return e.path !== void 0 && (t.path = e.path), e.hint && (t.hint = e.hint), e.details !== void 0 && (t.details = e.details), `ERROR: ${JSON.stringify(t)}`;
|
|
15195
15196
|
}
|
|
15196
|
-
function
|
|
15197
|
+
function V_(e) {
|
|
15197
15198
|
return e.slice(0, 10).map((e) => {
|
|
15198
15199
|
let t = e, n = {
|
|
15199
15200
|
path: (Array.isArray(t.path) ? t.path.join(".") : String(t.path ?? "")) || "(root)",
|
|
@@ -15202,16 +15203,16 @@ function H_(e) {
|
|
|
15202
15203
|
return t.expected !== void 0 && (n.expected = t.expected), t.received !== void 0 && (n.received = t.received), t.code !== void 0 && (n.code = t.code), n;
|
|
15203
15204
|
});
|
|
15204
15205
|
}
|
|
15205
|
-
function
|
|
15206
|
+
function H_(e, t) {
|
|
15206
15207
|
return $({
|
|
15207
15208
|
code: "SCHEMA_INVALID",
|
|
15208
15209
|
path: e,
|
|
15209
15210
|
message: `值不符合 "${e}" 的 schema(${t.length} 处问题)`,
|
|
15210
15211
|
hint: `用 read({jsonPath:"${e}"}) 查看当前值,按 describe_data() 查看主数据 schema,修正后重试;改大对象优先用 write 的 patch 增量(只发改动部分)`,
|
|
15211
|
-
details:
|
|
15212
|
+
details: V_(t)
|
|
15212
15213
|
});
|
|
15213
15214
|
}
|
|
15214
|
-
function
|
|
15215
|
+
function U_(e, t, n) {
|
|
15215
15216
|
let r = n?.message || String(n);
|
|
15216
15217
|
return $({
|
|
15217
15218
|
code: "JSON_PARSE",
|
|
@@ -15220,18 +15221,18 @@ function W_(e, t, n) {
|
|
|
15220
15221
|
hint: `检查引号/逗号/括号是否闭合;字符串值需双引号包裹(如 '"dark"' 表示字符串 dark,数字直接写如 5);预览前 80 字符:${t.slice(0, 80)}`
|
|
15221
15222
|
});
|
|
15222
15223
|
}
|
|
15223
|
-
var
|
|
15224
|
-
function
|
|
15224
|
+
var W_ = .9;
|
|
15225
|
+
function G_(e, t = {}) {
|
|
15225
15226
|
let n = Object.create(null);
|
|
15226
|
-
if (e) for (let [t, r] of Object.entries(e)) n[
|
|
15227
|
+
if (e) for (let [t, r] of Object.entries(e)) n[J_(t)] = {
|
|
15227
15228
|
content: r,
|
|
15228
|
-
updatedAt:
|
|
15229
|
+
updatedAt: X_()
|
|
15229
15230
|
};
|
|
15230
15231
|
let { persist: r } = t, i = t.maxBytes ?? 4194304;
|
|
15231
15232
|
function a() {
|
|
15232
|
-
if (
|
|
15233
|
-
let e = i *
|
|
15234
|
-
for (let [r] of t) if (delete n[r],
|
|
15233
|
+
if (q_(n) <= i) return;
|
|
15234
|
+
let e = i * W_, t = Object.entries(n).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
|
|
15235
|
+
for (let [r] of t) if (delete n[r], q_(n) <= e) break;
|
|
15235
15236
|
}
|
|
15236
15237
|
let o = null;
|
|
15237
15238
|
function s() {
|
|
@@ -15256,7 +15257,7 @@ function K_(e, t = {}) {
|
|
|
15256
15257
|
}
|
|
15257
15258
|
}) };
|
|
15258
15259
|
return r && (l.hydrate = (e) => {
|
|
15259
|
-
for (let [t, r] of Object.entries(e)) n[
|
|
15260
|
+
for (let [t, r] of Object.entries(e)) n[J_(t)] = r;
|
|
15260
15261
|
a();
|
|
15261
15262
|
}, l.flush = () => {
|
|
15262
15263
|
o &&= (clearTimeout(o), null), s();
|
|
@@ -15265,17 +15266,17 @@ function K_(e, t = {}) {
|
|
|
15265
15266
|
c();
|
|
15266
15267
|
}), l;
|
|
15267
15268
|
}
|
|
15268
|
-
var
|
|
15269
|
-
function
|
|
15270
|
-
|
|
15269
|
+
var K_ = null;
|
|
15270
|
+
function q_(e) {
|
|
15271
|
+
K_ ||= new TextEncoder();
|
|
15271
15272
|
let t = 0;
|
|
15272
|
-
for (let n of Object.values(e)) t +=
|
|
15273
|
+
for (let n of Object.values(e)) t += K_.encode(n.content).length;
|
|
15273
15274
|
return t;
|
|
15274
15275
|
}
|
|
15275
|
-
function
|
|
15276
|
+
function J_(e) {
|
|
15276
15277
|
return e.replace(/^\/+/, "").replace(/\/+/g, "/");
|
|
15277
15278
|
}
|
|
15278
|
-
function
|
|
15279
|
+
function Y_(e) {
|
|
15279
15280
|
let t = "";
|
|
15280
15281
|
for (let n = 0; n < e.length; n++) {
|
|
15281
15282
|
let r = e[n];
|
|
@@ -15283,13 +15284,13 @@ function X_(e) {
|
|
|
15283
15284
|
}
|
|
15284
15285
|
return RegExp("^" + t + "$");
|
|
15285
15286
|
}
|
|
15286
|
-
function
|
|
15287
|
+
function X_() {
|
|
15287
15288
|
return Date.now();
|
|
15288
15289
|
}
|
|
15289
|
-
function
|
|
15290
|
+
function Z_(e) {
|
|
15290
15291
|
return [
|
|
15291
15292
|
n(async ({ path: t, offset: n, limit: r }) => {
|
|
15292
|
-
let i = e.files[
|
|
15293
|
+
let i = e.files[J_(t)];
|
|
15293
15294
|
if (!i) return $({
|
|
15294
15295
|
code: "NOT_FOUND",
|
|
15295
15296
|
path: t,
|
|
@@ -15307,9 +15308,9 @@ function Q_(e) {
|
|
|
15307
15308
|
limit: t.number().int().min(1).default(2e3).describe("读取行数")
|
|
15308
15309
|
})
|
|
15309
15310
|
}),
|
|
15310
|
-
n(async ({ path: t, content: n }) => (e.files[
|
|
15311
|
+
n(async ({ path: t, content: n }) => (e.files[J_(t)] = {
|
|
15311
15312
|
content: n,
|
|
15312
|
-
updatedAt:
|
|
15313
|
+
updatedAt: X_()
|
|
15313
15314
|
}, `已写入 ${t}(${n.length} 字符)`), {
|
|
15314
15315
|
name: "vfs_write",
|
|
15315
15316
|
description: "写入/覆盖虚拟工作区文件,作为中间工作记忆。",
|
|
@@ -15319,7 +15320,7 @@ function Q_(e) {
|
|
|
15319
15320
|
})
|
|
15320
15321
|
}),
|
|
15321
15322
|
n(async ({ path: t, oldString: n, newString: r }) => {
|
|
15322
|
-
let i =
|
|
15323
|
+
let i = J_(t), a = e.files[i];
|
|
15323
15324
|
if (!a) return $({
|
|
15324
15325
|
code: "NOT_FOUND",
|
|
15325
15326
|
path: t,
|
|
@@ -15349,7 +15350,7 @@ function Q_(e) {
|
|
|
15349
15350
|
}
|
|
15350
15351
|
return e.files[i] = {
|
|
15351
15352
|
content: a.content.replace(n, r),
|
|
15352
|
-
updatedAt:
|
|
15353
|
+
updatedAt: X_()
|
|
15353
15354
|
}, `已替换 ${t} 中 1 处。`;
|
|
15354
15355
|
}, {
|
|
15355
15356
|
name: "vfs_edit",
|
|
@@ -15371,7 +15372,7 @@ function Q_(e) {
|
|
|
15371
15372
|
n(async ({ pattern: t }) => {
|
|
15372
15373
|
let n;
|
|
15373
15374
|
try {
|
|
15374
|
-
n =
|
|
15375
|
+
n = Y_(t);
|
|
15375
15376
|
} catch (e) {
|
|
15376
15377
|
return $({
|
|
15377
15378
|
code: "GLOB_INVALID",
|
|
@@ -15400,7 +15401,7 @@ function Q_(e) {
|
|
|
15400
15401
|
details: { pattern: t }
|
|
15401
15402
|
});
|
|
15402
15403
|
}
|
|
15403
|
-
let i = n ? [
|
|
15404
|
+
let i = n ? [J_(n)] : Object.keys(e.files), a = [];
|
|
15404
15405
|
for (let t of i) {
|
|
15405
15406
|
let n = e.files[t];
|
|
15406
15407
|
n && n.content.split("\n").forEach((e, n) => {
|
|
@@ -15418,17 +15419,17 @@ function Q_(e) {
|
|
|
15418
15419
|
})
|
|
15419
15420
|
];
|
|
15420
15421
|
}
|
|
15421
|
-
function
|
|
15422
|
+
function Q_(e) {
|
|
15422
15423
|
return {
|
|
15423
15424
|
name: "vfs",
|
|
15424
|
-
tools:
|
|
15425
|
+
tools: Z_(e),
|
|
15425
15426
|
beforeAgent: () => ({ files: e.files })
|
|
15426
15427
|
};
|
|
15427
15428
|
}
|
|
15428
15429
|
//#endregion
|
|
15429
15430
|
//#region src/core/tools/dataSlotQuery.ts
|
|
15430
|
-
var
|
|
15431
|
-
function
|
|
15431
|
+
var $_ = /[\w$-]/;
|
|
15432
|
+
function ev(e) {
|
|
15432
15433
|
let t = [], n = e.trim(), r = +(n[0] === "$");
|
|
15433
15434
|
for (; r < n.length;) {
|
|
15434
15435
|
let e = n[r];
|
|
@@ -15439,7 +15440,7 @@ function tv(e) {
|
|
|
15439
15440
|
continue;
|
|
15440
15441
|
}
|
|
15441
15442
|
let e = "";
|
|
15442
|
-
for (; r < n.length &&
|
|
15443
|
+
for (; r < n.length && $_.test(n[r]);) e += n[r++];
|
|
15443
15444
|
if (!e) throw Error("JSONPath: .. 后缺属性名");
|
|
15444
15445
|
t.push({
|
|
15445
15446
|
type: "descendKey",
|
|
@@ -15452,7 +15453,7 @@ function tv(e) {
|
|
|
15452
15453
|
continue;
|
|
15453
15454
|
}
|
|
15454
15455
|
let e = "";
|
|
15455
|
-
for (; r < n.length &&
|
|
15456
|
+
for (; r < n.length && $_.test(n[r]);) e += n[r++];
|
|
15456
15457
|
if (!e) throw Error("JSONPath: . 后缺属性名");
|
|
15457
15458
|
t.push({
|
|
15458
15459
|
type: "key",
|
|
@@ -15508,7 +15509,7 @@ function tv(e) {
|
|
|
15508
15509
|
}
|
|
15509
15510
|
return t;
|
|
15510
15511
|
}
|
|
15511
|
-
function
|
|
15512
|
+
function tv(e) {
|
|
15512
15513
|
let t = [], n = 0, r = e.trim();
|
|
15513
15514
|
for (; n < r.length;) {
|
|
15514
15515
|
let e = r[n];
|
|
@@ -15553,7 +15554,7 @@ function nv(e) {
|
|
|
15553
15554
|
}
|
|
15554
15555
|
return t;
|
|
15555
15556
|
}
|
|
15556
|
-
var
|
|
15557
|
+
var nv = class {
|
|
15557
15558
|
toks;
|
|
15558
15559
|
item;
|
|
15559
15560
|
pos = 0;
|
|
@@ -15589,12 +15590,12 @@ var rv = class {
|
|
|
15589
15590
|
return this.next(), e;
|
|
15590
15591
|
}
|
|
15591
15592
|
let e = this.operand(), t = this.peek();
|
|
15592
|
-
return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(),
|
|
15593
|
+
return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), av(t, e, this.operand())) : rv(e);
|
|
15593
15594
|
}
|
|
15594
15595
|
operand() {
|
|
15595
15596
|
let e = this.next();
|
|
15596
15597
|
if (e === void 0) throw Error("过滤表达式:缺操作数");
|
|
15597
|
-
if (e.startsWith("@")) return
|
|
15598
|
+
if (e.startsWith("@")) return iv(e, this.item);
|
|
15598
15599
|
if (e[0] === "'" || e[0] === "\"") return e.slice(1, -1);
|
|
15599
15600
|
if (e === "true") return !0;
|
|
15600
15601
|
if (e === "false") return !1;
|
|
@@ -15604,10 +15605,10 @@ var rv = class {
|
|
|
15604
15605
|
throw Error(`过滤表达式:未知操作数 '${e}'`);
|
|
15605
15606
|
}
|
|
15606
15607
|
};
|
|
15607
|
-
function
|
|
15608
|
+
function rv(e) {
|
|
15608
15609
|
return !!e && e !== 0 && e !== "" && e !== null;
|
|
15609
15610
|
}
|
|
15610
|
-
function
|
|
15611
|
+
function iv(e, t) {
|
|
15611
15612
|
let n = e.split(".").filter((e) => e && e !== "@"), r = t;
|
|
15612
15613
|
for (let e of n) {
|
|
15613
15614
|
if (typeof r != "object" || !r) return;
|
|
@@ -15615,7 +15616,7 @@ function av(e, t) {
|
|
|
15615
15616
|
}
|
|
15616
15617
|
return r;
|
|
15617
15618
|
}
|
|
15618
|
-
function
|
|
15619
|
+
function av(e, t, n) {
|
|
15619
15620
|
switch (e) {
|
|
15620
15621
|
case "==": return t === n;
|
|
15621
15622
|
case "!=": return t !== n;
|
|
@@ -15626,47 +15627,47 @@ function ov(e, t, n) {
|
|
|
15626
15627
|
default: return !1;
|
|
15627
15628
|
}
|
|
15628
15629
|
}
|
|
15629
|
-
function
|
|
15630
|
-
return new
|
|
15630
|
+
function ov(e, t) {
|
|
15631
|
+
return new nv(tv(e), t).parse();
|
|
15631
15632
|
}
|
|
15632
|
-
function
|
|
15633
|
+
function sv(e, t) {
|
|
15633
15634
|
return e ? `${e}.${t}` : String(t);
|
|
15634
15635
|
}
|
|
15635
|
-
function
|
|
15636
|
+
function cv(e, t) {
|
|
15636
15637
|
let n = [{
|
|
15637
15638
|
path: "",
|
|
15638
15639
|
value: e
|
|
15639
15640
|
}];
|
|
15640
|
-
for (let e of
|
|
15641
|
+
for (let e of ev(t)) {
|
|
15641
15642
|
let t = [];
|
|
15642
15643
|
if (e.type === "key") for (let r of n) r.value != null && typeof r.value == "object" && e.key in r.value && t.push({
|
|
15643
|
-
path:
|
|
15644
|
+
path: sv(r.path, e.key),
|
|
15644
15645
|
value: r.value[e.key]
|
|
15645
15646
|
});
|
|
15646
15647
|
else if (e.type === "index") {
|
|
15647
15648
|
for (let r of n) if (Array.isArray(r.value)) {
|
|
15648
15649
|
let n = r.value[e.index];
|
|
15649
15650
|
e.index >= 0 && e.index < r.value.length && t.push({
|
|
15650
|
-
path:
|
|
15651
|
+
path: sv(r.path, e.index),
|
|
15651
15652
|
value: n,
|
|
15652
15653
|
index: e.index
|
|
15653
15654
|
});
|
|
15654
15655
|
}
|
|
15655
15656
|
} else if (e.type === "wildcard") {
|
|
15656
15657
|
for (let e of n) if (Array.isArray(e.value)) e.value.forEach((n, r) => t.push({
|
|
15657
|
-
path:
|
|
15658
|
+
path: sv(e.path, r),
|
|
15658
15659
|
value: n,
|
|
15659
15660
|
index: r
|
|
15660
15661
|
}));
|
|
15661
15662
|
else if (e.value != null && typeof e.value == "object") for (let n of Object.keys(e.value)) t.push({
|
|
15662
|
-
path:
|
|
15663
|
+
path: sv(e.path, n),
|
|
15663
15664
|
value: e.value[n]
|
|
15664
15665
|
});
|
|
15665
15666
|
} else if (e.type === "descendKey") {
|
|
15666
15667
|
let r = e.key, i = (e) => {
|
|
15667
15668
|
if (!(e.value == null || typeof e.value != "object")) for (let n of Object.keys(e.value)) {
|
|
15668
15669
|
let a = {
|
|
15669
|
-
path:
|
|
15670
|
+
path: sv(e.path, n),
|
|
15670
15671
|
value: e.value[n]
|
|
15671
15672
|
};
|
|
15672
15673
|
n === r && t.push(a), i(a);
|
|
@@ -15677,7 +15678,7 @@ function lv(e, t) {
|
|
|
15677
15678
|
let e = (n) => {
|
|
15678
15679
|
if (!(n.value == null || typeof n.value != "object")) for (let r of Object.keys(n.value)) {
|
|
15679
15680
|
let i = {
|
|
15680
|
-
path:
|
|
15681
|
+
path: sv(n.path, r),
|
|
15681
15682
|
value: n.value[r]
|
|
15682
15683
|
};
|
|
15683
15684
|
t.push(i), e(i);
|
|
@@ -15686,16 +15687,16 @@ function lv(e, t) {
|
|
|
15686
15687
|
for (let t of n) e(t);
|
|
15687
15688
|
} else if (e.type === "filter") {
|
|
15688
15689
|
for (let r of n) if (Array.isArray(r.value)) r.value.forEach((n, i) => {
|
|
15689
|
-
|
|
15690
|
-
path:
|
|
15690
|
+
ov(e.filter, n) && t.push({
|
|
15691
|
+
path: sv(r.path, i),
|
|
15691
15692
|
value: n,
|
|
15692
15693
|
index: i
|
|
15693
15694
|
});
|
|
15694
15695
|
});
|
|
15695
15696
|
else if (r.value != null && typeof r.value == "object") for (let n of Object.keys(r.value)) {
|
|
15696
15697
|
let i = r.value[n];
|
|
15697
|
-
|
|
15698
|
-
path:
|
|
15698
|
+
ov(e.filter, i) && t.push({
|
|
15699
|
+
path: sv(r.path, n),
|
|
15699
15700
|
value: i
|
|
15700
15701
|
});
|
|
15701
15702
|
}
|
|
@@ -15704,7 +15705,7 @@ function lv(e, t) {
|
|
|
15704
15705
|
}
|
|
15705
15706
|
return n;
|
|
15706
15707
|
}
|
|
15707
|
-
function
|
|
15708
|
+
function lv(e, t) {
|
|
15708
15709
|
let n = e.length, r = t.length;
|
|
15709
15710
|
if (!n) return r;
|
|
15710
15711
|
if (!r) return n;
|
|
@@ -15720,7 +15721,7 @@ function uv(e, t) {
|
|
|
15720
15721
|
}
|
|
15721
15722
|
return i[r];
|
|
15722
15723
|
}
|
|
15723
|
-
function
|
|
15724
|
+
function uv(e, t, n = {}) {
|
|
15724
15725
|
let r = n.mode || "substring", i = n.limit ?? 50, a = n.matchKey !== !1, o = [], s = null;
|
|
15725
15726
|
if (r === "regex") try {
|
|
15726
15727
|
s = new RegExp(t, "i");
|
|
@@ -15730,11 +15731,11 @@ function dv(e, t, n = {}) {
|
|
|
15730
15731
|
let c = (e, l, u) => {
|
|
15731
15732
|
if (o.length >= i || e == null) return;
|
|
15732
15733
|
if (typeof e == "object") {
|
|
15733
|
-
if (Array.isArray(e)) e.forEach((e, t) => c(e,
|
|
15734
|
-
else for (let t of Object.keys(e)) c(e[t],
|
|
15734
|
+
if (Array.isArray(e)) e.forEach((e, t) => c(e, sv(l, t), String(t)));
|
|
15735
|
+
else for (let t of Object.keys(e)) c(e[t], sv(l, t), t);
|
|
15735
15736
|
return;
|
|
15736
15737
|
}
|
|
15737
|
-
let d = String(e), f =
|
|
15738
|
+
let d = String(e), f = dv(d, t, r, n.fuzzyThreshold ?? 2, s);
|
|
15738
15739
|
if (f) {
|
|
15739
15740
|
o.push({
|
|
15740
15741
|
path: l,
|
|
@@ -15745,7 +15746,7 @@ function dv(e, t, n = {}) {
|
|
|
15745
15746
|
return;
|
|
15746
15747
|
}
|
|
15747
15748
|
if (a && u) {
|
|
15748
|
-
let e =
|
|
15749
|
+
let e = dv(u, t, r, n.fuzzyThreshold ?? 2, s);
|
|
15749
15750
|
e && o.push({
|
|
15750
15751
|
path: l,
|
|
15751
15752
|
key: u,
|
|
@@ -15756,18 +15757,18 @@ function dv(e, t, n = {}) {
|
|
|
15756
15757
|
};
|
|
15757
15758
|
return c(e, ""), o;
|
|
15758
15759
|
}
|
|
15759
|
-
function
|
|
15760
|
+
function dv(e, t, n, r, i) {
|
|
15760
15761
|
let a = e.toLowerCase(), o = t.toLowerCase();
|
|
15761
15762
|
if (n === "substring") return a.includes(o) ? 1 : null;
|
|
15762
15763
|
if (n === "regex") return i && i.test(e) ? 1 : null;
|
|
15763
15764
|
if (n === "fuzzy") {
|
|
15764
15765
|
if (a.includes(o)) return 2;
|
|
15765
|
-
let e =
|
|
15766
|
+
let e = lv(a, o);
|
|
15766
15767
|
return e <= r ? r - e + 1 : null;
|
|
15767
15768
|
}
|
|
15768
15769
|
return null;
|
|
15769
15770
|
}
|
|
15770
|
-
var
|
|
15771
|
+
var fv = [
|
|
15771
15772
|
"self.fetch = () => { throw new Error('fetch 已被沙箱禁用') }",
|
|
15772
15773
|
"self.XMLHttpRequest = function(){ throw new Error('XMLHttpRequest 已被沙箱禁用') }",
|
|
15773
15774
|
"self.importScripts = () => { throw new Error('importScripts 已被沙箱禁用') }",
|
|
@@ -15780,7 +15781,7 @@ var pv = [
|
|
|
15780
15781
|
"try { self.BroadcastChannel = undefined } catch {}",
|
|
15781
15782
|
"if (self.navigator && self.navigator.sendBeacon) self.navigator.sendBeacon = () => { throw new Error('sendBeacon 已被沙箱禁用') }"
|
|
15782
15783
|
].join("\n");
|
|
15783
|
-
function
|
|
15784
|
+
function pv(e, t, n = 3e3) {
|
|
15784
15785
|
return new Promise((r) => {
|
|
15785
15786
|
let i = Date.now(), a = !1, o = (e) => {
|
|
15786
15787
|
if (!a) {
|
|
@@ -15793,7 +15794,7 @@ function mv(e, t, n = 3e3) {
|
|
|
15793
15794
|
elapsedMs: Date.now() - i
|
|
15794
15795
|
});
|
|
15795
15796
|
}
|
|
15796
|
-
}, s =
|
|
15797
|
+
}, s = fv + "\nself.onmessage = async (e) => {\n try {\n const fn = new Function(\"data\", e.data.script);\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;
|
|
15797
15798
|
try {
|
|
15798
15799
|
let e = new Blob([s], { type: "application/javascript" });
|
|
15799
15800
|
c = URL.createObjectURL(e), l = new Worker(c);
|
|
@@ -15828,20 +15829,20 @@ function mv(e, t, n = 3e3) {
|
|
|
15828
15829
|
}
|
|
15829
15830
|
//#endregion
|
|
15830
15831
|
//#region src/core/tools/dataOps.ts
|
|
15831
|
-
var
|
|
15832
|
+
var mv = /* @__PURE__ */ new Set([
|
|
15832
15833
|
"__proto__",
|
|
15833
15834
|
"constructor",
|
|
15834
15835
|
"prototype"
|
|
15835
15836
|
]);
|
|
15836
|
-
function
|
|
15837
|
-
return e.split(".").some((e) =>
|
|
15837
|
+
function hv(e) {
|
|
15838
|
+
return e.split(".").some((e) => mv.has(e));
|
|
15838
15839
|
}
|
|
15839
|
-
function
|
|
15840
|
-
if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t))
|
|
15840
|
+
function gv(e, t) {
|
|
15841
|
+
if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t)) mv.has(n) || (e[n] = t[n]);
|
|
15841
15842
|
}
|
|
15842
|
-
function
|
|
15843
|
+
function _v(e, t) {
|
|
15843
15844
|
if (!t) return e;
|
|
15844
|
-
if (
|
|
15845
|
+
if (hv(t)) return;
|
|
15845
15846
|
let n = t.split("."), r = e;
|
|
15846
15847
|
for (let e of n) {
|
|
15847
15848
|
if (r == null) return;
|
|
@@ -15849,8 +15850,8 @@ function vv(e, t) {
|
|
|
15849
15850
|
}
|
|
15850
15851
|
return r;
|
|
15851
15852
|
}
|
|
15852
|
-
function
|
|
15853
|
-
if (!t ||
|
|
15853
|
+
function vv(e, t, n) {
|
|
15854
|
+
if (!t || hv(t)) return;
|
|
15854
15855
|
let r = t.split("."), i = e;
|
|
15855
15856
|
for (let e = 0; e < r.length - 1; e++) {
|
|
15856
15857
|
let t = r[e];
|
|
@@ -15858,8 +15859,8 @@ function yv(e, t, n) {
|
|
|
15858
15859
|
}
|
|
15859
15860
|
i[r[r.length - 1]] = n;
|
|
15860
15861
|
}
|
|
15861
|
-
function
|
|
15862
|
-
if (!t ||
|
|
15862
|
+
function yv(e, t) {
|
|
15863
|
+
if (!t || hv(t)) return !1;
|
|
15863
15864
|
let n = t.split("."), r = e;
|
|
15864
15865
|
for (let e = 0; e < n.length - 1; e++) {
|
|
15865
15866
|
if (r == null) return !1;
|
|
@@ -15868,10 +15869,37 @@ function bv(e, t) {
|
|
|
15868
15869
|
let i = n[n.length - 1];
|
|
15869
15870
|
return r == null || !(i in r) ? !1 : (delete r[i], !0);
|
|
15870
15871
|
}
|
|
15871
|
-
function
|
|
15872
|
+
function bv(e) {
|
|
15872
15873
|
return e === void 0 ? void 0 : JSON.parse(JSON.stringify(e));
|
|
15873
15874
|
}
|
|
15874
|
-
function
|
|
15875
|
+
function xv(e) {
|
|
15876
|
+
if (typeof e != "string") return { parsed: e };
|
|
15877
|
+
let t = e.trim();
|
|
15878
|
+
if (!t) return { parsed: e };
|
|
15879
|
+
let n = t[0] === "{" || t[0] === "[";
|
|
15880
|
+
try {
|
|
15881
|
+
return { parsed: JSON.parse(t) };
|
|
15882
|
+
} catch (t) {
|
|
15883
|
+
return n ? { parseError: t } : { parsed: e };
|
|
15884
|
+
}
|
|
15885
|
+
}
|
|
15886
|
+
function Sv(e, t) {
|
|
15887
|
+
if (typeof e != "object" || !e) return e;
|
|
15888
|
+
let n = new Set(t);
|
|
15889
|
+
if (Array.isArray(e)) return e.map((e) => Sv(e, t));
|
|
15890
|
+
let r = {};
|
|
15891
|
+
for (let t of Object.keys(e)) n.has(t) && (r[t] = e[t]);
|
|
15892
|
+
return r;
|
|
15893
|
+
}
|
|
15894
|
+
function Cv(e, t) {
|
|
15895
|
+
if (typeof e != "object" || !e) return e;
|
|
15896
|
+
if (t <= 0) return Array.isArray(e) ? `[...${e.length}]` : "{...}";
|
|
15897
|
+
if (Array.isArray(e)) return e.map((e) => Cv(e, t - 1));
|
|
15898
|
+
let n = {};
|
|
15899
|
+
for (let r of Object.keys(e)) n[r] = Cv(e[r], t - 1);
|
|
15900
|
+
return n;
|
|
15901
|
+
}
|
|
15902
|
+
function wv(e, t = Infinity) {
|
|
15875
15903
|
let n = /* @__PURE__ */ new WeakSet(), r;
|
|
15876
15904
|
try {
|
|
15877
15905
|
r = JSON.stringify(e, (e, t) => {
|
|
@@ -15890,34 +15918,62 @@ function Sv(e, t = Infinity) {
|
|
|
15890
15918
|
}
|
|
15891
15919
|
return r.length > t && (r = r.slice(0, t) + `\n…[已截断,原长度 ${r.length}]`), r;
|
|
15892
15920
|
}
|
|
15893
|
-
function
|
|
15894
|
-
let t =
|
|
15921
|
+
function Tv(e) {
|
|
15922
|
+
let t = wv(e), n = 5381;
|
|
15895
15923
|
for (let e = 0; e < t.length; e++) n = (n << 5) + n + t.charCodeAt(e) >>> 0;
|
|
15896
15924
|
return n.toString(36);
|
|
15897
15925
|
}
|
|
15898
|
-
function
|
|
15899
|
-
|
|
15900
|
-
|
|
15926
|
+
function Ev(e) {
|
|
15927
|
+
let t = e;
|
|
15928
|
+
for (let e = 0; e < 5 && t && t._def; e++) {
|
|
15929
|
+
if (t._def.innerType) {
|
|
15930
|
+
t = t._def.innerType;
|
|
15931
|
+
continue;
|
|
15932
|
+
}
|
|
15933
|
+
break;
|
|
15934
|
+
}
|
|
15935
|
+
if (!t || !t.shape || typeof t.shape != "object") return null;
|
|
15936
|
+
try {
|
|
15937
|
+
let e = typeof t.shape == "function" ? t.shape() : t.shape;
|
|
15938
|
+
return Object.keys(e);
|
|
15939
|
+
} catch {
|
|
15940
|
+
return null;
|
|
15941
|
+
}
|
|
15942
|
+
}
|
|
15943
|
+
function Dv(e, t) {
|
|
15944
|
+
if (!t || !e) return !0;
|
|
15945
|
+
let n = e.split(".")[0];
|
|
15946
|
+
return t.includes(n);
|
|
15947
|
+
}
|
|
15948
|
+
function Ov(e, t) {
|
|
15949
|
+
if (!t || typeof e != "object" || !e || Array.isArray(e)) return e;
|
|
15950
|
+
let n = new Set(t), r = {};
|
|
15951
|
+
for (let t of Object.keys(e)) n.has(t) && (r[t] = e[t]);
|
|
15952
|
+
return r;
|
|
15953
|
+
}
|
|
15954
|
+
function kv(e, t, n, r) {
|
|
15955
|
+
if (t === "set") return n ? (vv(e, n, r), null) : "set 操作需要 jsonPath(整体替换请用 set_data)";
|
|
15956
|
+
if (t === "remove") return n ? (yv(e, n), null) : "remove 操作需要 jsonPath";
|
|
15901
15957
|
if (t === "merge") {
|
|
15902
|
-
let t = n ?
|
|
15903
|
-
return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (
|
|
15958
|
+
let t = n ? _v(e, n) : e;
|
|
15959
|
+
return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (gv(t, r), null);
|
|
15904
15960
|
}
|
|
15905
|
-
let i = n ?
|
|
15961
|
+
let i = n ? _v(e, n) : e;
|
|
15906
15962
|
return Array.isArray(i) ? (Array.isArray(r) ? i.push(...r) : i.push(r), null) : `append 目标${n ? `(${n})` : "(根)"}不是数组`;
|
|
15907
15963
|
}
|
|
15908
|
-
function
|
|
15909
|
-
if (t === "set")
|
|
15910
|
-
else if (t === "remove")
|
|
15911
|
-
else if (t === "merge")
|
|
15964
|
+
function Av(e, t, n, r) {
|
|
15965
|
+
if (t === "set") vv(e, n, r);
|
|
15966
|
+
else if (t === "remove") yv(e, n);
|
|
15967
|
+
else if (t === "merge") gv(n ? _v(e, n) : e, r);
|
|
15912
15968
|
else {
|
|
15913
|
-
let t = n ?
|
|
15969
|
+
let t = n ? _v(e, n) : e;
|
|
15914
15970
|
Array.isArray(r) ? t.push(...r) : t.push(r);
|
|
15915
15971
|
}
|
|
15916
15972
|
}
|
|
15917
|
-
function
|
|
15918
|
-
typeof e == "object" && e &&
|
|
15973
|
+
function jv(e, t) {
|
|
15974
|
+
typeof e == "object" && e && Mv(e, t);
|
|
15919
15975
|
}
|
|
15920
|
-
function
|
|
15976
|
+
function Mv(e, t) {
|
|
15921
15977
|
if (Array.isArray(e)) {
|
|
15922
15978
|
e.length = 0, Array.isArray(t) && e.push(...t);
|
|
15923
15979
|
return;
|
|
@@ -15926,51 +15982,51 @@ function Dv(e, t) {
|
|
|
15926
15982
|
for (let t of Object.keys(e)) t in n || delete e[t];
|
|
15927
15983
|
for (let t of Object.keys(n)) e[t] = n[t];
|
|
15928
15984
|
}
|
|
15929
|
-
var
|
|
15985
|
+
var Nv = /* @__PURE__ */ new Set([
|
|
15930
15986
|
"describe_data",
|
|
15931
15987
|
"get_data",
|
|
15932
15988
|
"set_data",
|
|
15933
15989
|
"edit_data",
|
|
15934
15990
|
"delete_data"
|
|
15935
|
-
]),
|
|
15936
|
-
function
|
|
15937
|
-
return t === "advanced" ? e : t === "minimal" ? e.filter((e) =>
|
|
15991
|
+
]), Pv = /* @__PURE__ */ new Set(["read", "write"]);
|
|
15992
|
+
function Fv(e, t = "simple") {
|
|
15993
|
+
return t === "advanced" ? e : t === "minimal" ? e.filter((e) => Pv.has(e.name)) : e.filter((e) => !Nv.has(e.name));
|
|
15938
15994
|
}
|
|
15939
|
-
function
|
|
15940
|
-
let i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s = [],
|
|
15995
|
+
function Iv(e, r = {}) {
|
|
15996
|
+
let i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s = Ev(i), c = [], l = r.maxSnapshots ?? 20, u, d = r.autoLock !== !1, f = {
|
|
15941
15997
|
get: () => ({
|
|
15942
15998
|
schema: i,
|
|
15943
15999
|
bind: a,
|
|
15944
16000
|
description: o
|
|
15945
16001
|
}),
|
|
15946
16002
|
set: (e) => {
|
|
15947
|
-
i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s.length = 0,
|
|
16003
|
+
i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s = Ev(i), c.length = 0, u = void 0;
|
|
15948
16004
|
},
|
|
15949
16005
|
update: (e) => {
|
|
15950
|
-
a = e,
|
|
16006
|
+
a = e, c.length = 0, u = void 0;
|
|
15951
16007
|
}
|
|
15952
|
-
},
|
|
16008
|
+
}, p = (e) => {
|
|
15953
16009
|
r.onAudit?.(e);
|
|
15954
16010
|
};
|
|
15955
|
-
function
|
|
15956
|
-
let n =
|
|
15957
|
-
for (
|
|
16011
|
+
function m(e, t) {
|
|
16012
|
+
let n = bv(a), r = c.length ? c[c.length - 1].id + 1 : 1;
|
|
16013
|
+
for (c.push({
|
|
15958
16014
|
id: r,
|
|
15959
16015
|
ts: Date.now(),
|
|
15960
16016
|
op: e,
|
|
15961
16017
|
label: t,
|
|
15962
16018
|
value: n
|
|
15963
|
-
});
|
|
16019
|
+
}); c.length > l;) c.shift();
|
|
15964
16020
|
return r;
|
|
15965
16021
|
}
|
|
15966
|
-
async function
|
|
16022
|
+
async function h(e, t, n) {
|
|
15967
16023
|
if (!t || t === "") return null;
|
|
15968
|
-
let i =
|
|
16024
|
+
let i = Tv(a);
|
|
15969
16025
|
if (i === t) return null;
|
|
15970
16026
|
if (!r.onConflict) return $({
|
|
15971
16027
|
code: "VERSION_CONFLICT",
|
|
15972
16028
|
message: `乐观锁冲突:expectedHash=${t} 但当前 hash=${i}。主数据在你 read 之后已被修改(外部代码/其他 agent/用户手动改)。`,
|
|
15973
|
-
hint: `重新 read 拿最新值与 hash,基于最新值修改后再写入(传新的 expectedHash)。当前值:${
|
|
16029
|
+
hint: `重新 read 拿最新值与 hash,基于最新值修改后再写入(传新的 expectedHash)。当前值:${wv(a, 400)}`
|
|
15974
16030
|
});
|
|
15975
16031
|
let o = await r.onConflict({
|
|
15976
16032
|
op: e,
|
|
@@ -15980,44 +16036,52 @@ function jv(e, r = {}) {
|
|
|
15980
16036
|
expectedHash: t,
|
|
15981
16037
|
snapshotId: 0
|
|
15982
16038
|
});
|
|
15983
|
-
if (o.action === "keep_external") return `已保留外部修改(未写入)。当前值:${
|
|
16039
|
+
if (o.action === "keep_external") return `已保留外部修改(未写入)。当前值:${wv(a, 400)} (hash=${i})。请重新 read 拿最新值与 hash 再改。`;
|
|
15984
16040
|
if (o.action === "restore") {
|
|
15985
|
-
if (!
|
|
15986
|
-
let e =
|
|
15987
|
-
return
|
|
16041
|
+
if (!c.length) return `无历史快照可回退(本次为首次操作)。当前值:${wv(a, 400)} (hash=${i})。请重新 read 再改或选「强制覆盖」。`;
|
|
16042
|
+
let e = c[c.length - 1];
|
|
16043
|
+
return jv(a, bv(e.value)), `已回退主数据到历史快照 #${e.id}[${e.op}]。当前值:${wv(a, 400)} (hash=${Tv(a)})。请基于回退后的值重写或停止。`;
|
|
15988
16044
|
}
|
|
15989
16045
|
return null;
|
|
15990
16046
|
}
|
|
15991
|
-
let
|
|
16047
|
+
let g = [
|
|
15992
16048
|
n(async () => [`说明: ${o}`, "格式: 写入值需为 JSON,且通过声明的 schema 校验(校验失败时 set_data/edit_data 会返回结构化错误,含具体字段与期望类型)。"].join("\n"), {
|
|
15993
16049
|
name: "describe_data",
|
|
15994
16050
|
description: "获取主数据的说明与格式要求。",
|
|
15995
16051
|
schema: t.object({})
|
|
15996
16052
|
}),
|
|
15997
16053
|
n(async ({ jsonPath: e }) => {
|
|
15998
|
-
let t =
|
|
15999
|
-
|
|
16054
|
+
let t = e || "";
|
|
16055
|
+
if (!Dv(t, s)) return $({
|
|
16056
|
+
code: "PATH_DENIED",
|
|
16057
|
+
message: `get_data @ "${t}" 不在 schema 声明字段内(仅 schema 声明的 key 可读)`,
|
|
16058
|
+
hint: "主数据仅暴露 schema 声明的字段;若需操作该字段,集成方需在 schema 中声明它"
|
|
16059
|
+
});
|
|
16060
|
+
let n = t ? _v(a, t) : a;
|
|
16061
|
+
t || (n = Ov(n, s));
|
|
16062
|
+
let r = Tv(a);
|
|
16063
|
+
return u = r, n === void 0 ? `主数据${t ? ` @ ${t}` : ""} = (undefined) (hash=${r})` : `主数据${t ? ` @ ${t}` : ""} = ${wv(n)} (hash=${r})`;
|
|
16000
16064
|
}, {
|
|
16001
16065
|
name: "get_data",
|
|
16002
16066
|
description: "读取主数据的当前值(安全序列化:函数/DOM/循环引用做摘要;大结果由系统自动外存,提示用 vfs_read 回读)。返回含 hash(乐观锁):改前先 read/get 拿 hash,写入时传 expectedHash 回传,系统对比当前 hash 防\"基于过期值覆盖\"。jsonPath 可选:读整个主数据不传,读子路径传(如 components.0.text)。",
|
|
16003
16067
|
schema: t.object({ jsonPath: t.string().optional().describe("相对主数据根的点号路径(如 components.0.text);不传则读整个主数据") })
|
|
16004
16068
|
}),
|
|
16005
16069
|
n(async ({ value: e, expectedHash: t }) => {
|
|
16006
|
-
let n = await
|
|
16070
|
+
let n = await h("set", t || (d ? u : void 0));
|
|
16007
16071
|
if (n !== null) return n;
|
|
16008
|
-
let r;
|
|
16009
|
-
if (
|
|
16010
|
-
|
|
16011
|
-
|
|
16012
|
-
|
|
16013
|
-
|
|
16014
|
-
|
|
16015
|
-
|
|
16016
|
-
|
|
16072
|
+
let r, o = xv(e);
|
|
16073
|
+
if (o.parseError) return U_("", e, o.parseError);
|
|
16074
|
+
r = o.parsed;
|
|
16075
|
+
let c = i.safeParse(r);
|
|
16076
|
+
return c.success ? typeof a != "object" || !a ? $({
|
|
16077
|
+
code: "LEAF_BIND",
|
|
16078
|
+
message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),set_data 无法就地替换外部持有的值引用`,
|
|
16079
|
+
hint: "主数据 bind 必须为对象/数组(低代码主 JSON 本就是);叶子值请用对象包裹(如 {value:\"x\"})或集成方通过 sdk.setData 替换 bind"
|
|
16080
|
+
}) : (m("set"), c.data !== null && typeof c.data == "object" && (s ? gv(a, c.data) : Mv(a, c.data)), p({
|
|
16017
16081
|
op: "set",
|
|
16018
|
-
value:
|
|
16082
|
+
value: c.data,
|
|
16019
16083
|
timestamp: Date.now()
|
|
16020
|
-
}),
|
|
16084
|
+
}), u = Tv(a), `已设置主数据 = ${wv(c.data, 600)} (新 hash=${Tv(a)})${s ? "(白名单模式:仅更新 schema 声明字段,未声明字段保留)" : ""}`) : H_("", c.error.issues);
|
|
16021
16085
|
}, {
|
|
16022
16086
|
name: "set_data",
|
|
16023
16087
|
description: "设置主数据的值(整体替换)。value 为 JSON 对象(或 JSON 字符串),需通过 schema 校验。校验失败会返回错误而非写入。expectedHash(可选):改前 read/get 返回的 hash,传入则启用乐观锁;不传时系统自动用你最后一次读到的 hash 比对(autoLock,默认开)。大对象/数组强烈建议改用 edit_data 增量 patch。",
|
|
@@ -16028,45 +16092,47 @@ function jv(e, r = {}) {
|
|
|
16028
16092
|
}),
|
|
16029
16093
|
n(async ({ op: e, jsonPath: t, value: n, expectedHash: r }) => {
|
|
16030
16094
|
let o = t || "";
|
|
16031
|
-
if (
|
|
16095
|
+
if (hv(o)) return $({
|
|
16032
16096
|
code: "PATH_UNSAFE",
|
|
16033
16097
|
message: `jsonPath "${o}" 含非法段(__proto__/constructor/prototype)`,
|
|
16034
16098
|
hint: "使用正常的属性路径,如 components.0.text(数组索引用数字)"
|
|
16035
16099
|
});
|
|
16036
|
-
|
|
16037
|
-
|
|
16100
|
+
if (!Dv(o, s)) return $({
|
|
16101
|
+
code: "PATH_DENIED",
|
|
16102
|
+
message: `edit_data @ "${o}" 不在 schema 声明字段内`,
|
|
16103
|
+
hint: "仅 schema 声明的 key 可写;若需操作该字段,集成方需在 schema 中声明它"
|
|
16104
|
+
});
|
|
16105
|
+
let c = await h("edit", r || (d ? u : void 0));
|
|
16106
|
+
if (c !== null) return c;
|
|
16038
16107
|
if (typeof a != "object" || !a) return $({
|
|
16039
16108
|
code: "NOT_OBJECT",
|
|
16040
16109
|
message: `edit 仅适用于对象/数组主数据,当前是 ${a === void 0 ? "undefined" : typeof a}`,
|
|
16041
16110
|
hint: "叶子(原始类型)请用 set_data 整体设置"
|
|
16042
16111
|
});
|
|
16043
|
-
let
|
|
16112
|
+
let l;
|
|
16044
16113
|
if (e !== "remove") {
|
|
16045
16114
|
if (n === void 0 || n === "") return $({
|
|
16046
16115
|
code: "MISSING_VALUE",
|
|
16047
16116
|
message: `${e} 操作需要 value`,
|
|
16048
16117
|
hint: `op 为 ${e} 时 value 必填;删除请用 op:'remove'`
|
|
16049
16118
|
});
|
|
16050
|
-
|
|
16051
|
-
|
|
16052
|
-
|
|
16053
|
-
return W_("", n, e);
|
|
16054
|
-
}
|
|
16055
|
-
else c = n;
|
|
16119
|
+
let t = xv(n);
|
|
16120
|
+
if (t.parseError) return U_("", n, t.parseError);
|
|
16121
|
+
l = t.parsed;
|
|
16056
16122
|
}
|
|
16057
|
-
let
|
|
16058
|
-
if (
|
|
16123
|
+
let f = bv(a), g = kv(f, e, o, l);
|
|
16124
|
+
if (g) return $({
|
|
16059
16125
|
code: "PATCH_FAILED",
|
|
16060
|
-
message:
|
|
16126
|
+
message: g,
|
|
16061
16127
|
hint: "检查 op 与目标类型:merge 需对象,append 需数组;jsonPath 指向需存在"
|
|
16062
16128
|
});
|
|
16063
|
-
let
|
|
16064
|
-
return
|
|
16129
|
+
let _ = i.safeParse(f);
|
|
16130
|
+
return _.success ? (m("edit"), Av(a, e, o, l), p({
|
|
16065
16131
|
op: "edit",
|
|
16066
16132
|
detail: `${e}${o ? "@" + o : ""}`,
|
|
16067
|
-
value:
|
|
16133
|
+
value: l,
|
|
16068
16134
|
timestamp: Date.now()
|
|
16069
|
-
}),
|
|
16135
|
+
}), u = Tv(a), `已 edit 主数据(${e}${o ? " @ " + o : ""})。当前值:${wv(a, 600)} (新 hash=${Tv(a)})`) : H_("", _.error.issues);
|
|
16070
16136
|
}, {
|
|
16071
16137
|
name: "edit_data",
|
|
16072
16138
|
description: "增量编辑主数据(对象/数组),只发改动的 patch,无需重传整个大对象。op:set(在 jsonPath 设值)、remove(删 jsonPath)、merge(把 value 合并到 jsonPath 指向的对象,默认根)、append(把 value 追加到 jsonPath 指向的数组,默认根)。jsonPath 为相对主数据根的点号路径(数组索引用数字,如 components.0.text);value 为 JSON 对象(推荐直传)或 JSON 字符串。整体仍经 schema 校验,失败不写入。expectedHash(可选):改前 read/get 返回的 hash;不传时自动用你最后读到的 hash(autoLock,默认开)防\"基于过期值覆盖\"。",
|
|
@@ -16088,20 +16154,25 @@ function jv(e, r = {}) {
|
|
|
16088
16154
|
message: "delete_data 需要 jsonPath 指定要删的子路径(主数据整体不可删,用 set_data 整体替换)",
|
|
16089
16155
|
hint: "如 jsonPath:\"components.0\" 删数组首项"
|
|
16090
16156
|
});
|
|
16091
|
-
if (
|
|
16157
|
+
if (hv(e)) return $({
|
|
16092
16158
|
code: "PATH_UNSAFE",
|
|
16093
16159
|
message: `jsonPath "${e}" 含非法段`,
|
|
16094
16160
|
hint: "使用正常属性路径"
|
|
16095
16161
|
});
|
|
16096
|
-
|
|
16162
|
+
if (!Dv(e, s)) return $({
|
|
16163
|
+
code: "PATH_DENIED",
|
|
16164
|
+
message: `delete_data @ "${e}" 不在 schema 声明字段内`,
|
|
16165
|
+
hint: "仅 schema 声明的 key 可删"
|
|
16166
|
+
});
|
|
16167
|
+
let n = await h("delete", t || (d ? u : void 0));
|
|
16097
16168
|
if (n !== null) return n;
|
|
16098
|
-
|
|
16099
|
-
let r =
|
|
16100
|
-
return
|
|
16169
|
+
m("delete");
|
|
16170
|
+
let r = yv(a, e);
|
|
16171
|
+
return p({
|
|
16101
16172
|
op: "delete",
|
|
16102
16173
|
detail: e,
|
|
16103
16174
|
timestamp: Date.now()
|
|
16104
|
-
}),
|
|
16175
|
+
}), u = Tv(a), r ? `已删除主数据 @ ${e}` : `主数据 @ ${e} 不存在(无需删除)`;
|
|
16105
16176
|
}, {
|
|
16106
16177
|
name: "delete_data",
|
|
16107
16178
|
description: "删除主数据的某个子路径(jsonPath)。主数据整体不可删(用 set_data 整体替换)。expectedHash(可选):改前 read/get 返回的 hash;不传时自动用你最后读到的 hash(autoLock,默认开)防\"基于过期值删除\"。",
|
|
@@ -16110,45 +16181,45 @@ function jv(e, r = {}) {
|
|
|
16110
16181
|
expectedHash: t.string().optional().describe("乐观锁:改前 read/get 返回的 hash;传入则校验,不一致拒绝删除防覆盖")
|
|
16111
16182
|
})
|
|
16112
16183
|
}),
|
|
16113
|
-
n(async ({ label: e }) => `已为主数据创建快照 #${
|
|
16184
|
+
n(async ({ label: e }) => `已为主数据创建快照 #${m("manual", e)}${e ? `(${e})` : ""}。可用 list_data_snapshots 查看、restore_data 回退。`, {
|
|
16114
16185
|
name: "snapshot_data",
|
|
16115
16186
|
description: "为主数据手动创建一个命名快照(检查点)。set/edit/delete 也会自动存快照。",
|
|
16116
16187
|
schema: t.object({ label: t.string().optional().describe("可选的快照标签,便于识别") })
|
|
16117
16188
|
}),
|
|
16118
16189
|
n(async () => {
|
|
16119
|
-
if (!
|
|
16120
|
-
let e =
|
|
16190
|
+
if (!c.length) return "无快照。set/edit/delete 会自动存快照,也可用 snapshot_data 手动创建检查点。";
|
|
16191
|
+
let e = c.map((e) => {
|
|
16121
16192
|
let t = JSON.stringify(e.value ?? "").length, n = new Date(e.ts).toLocaleTimeString("zh-CN", { hour12: !1 });
|
|
16122
16193
|
return ` #${e.id} [${e.op}]${e.label ? ` "${e.label}"` : ""} ${n} 修改前≈${t}字符`;
|
|
16123
16194
|
});
|
|
16124
|
-
return `主数据快照(共 ${
|
|
16195
|
+
return `主数据快照(共 ${c.length} 条):\n${e.join("\n")}`;
|
|
16125
16196
|
}, {
|
|
16126
16197
|
name: "list_data_snapshots",
|
|
16127
16198
|
description: "列出主数据的快照时间线(序号、操作类型、标签、大小)。",
|
|
16128
16199
|
schema: t.object({})
|
|
16129
16200
|
}),
|
|
16130
16201
|
n(async ({ id: e }) => {
|
|
16131
|
-
if (!
|
|
16202
|
+
if (!c.length) return $({
|
|
16132
16203
|
code: "NO_SNAPSHOT",
|
|
16133
16204
|
message: "无快照可回退",
|
|
16134
16205
|
hint: "set/edit/delete 会自动存快照;也可先 snapshot_data 手动创建检查点"
|
|
16135
16206
|
});
|
|
16136
|
-
let t = e === void 0 ?
|
|
16207
|
+
let t = e === void 0 ? c[c.length - 1] : c.find((t) => t.id === e);
|
|
16137
16208
|
if (!t) return $({
|
|
16138
16209
|
code: "SNAPSHOT_NOT_FOUND",
|
|
16139
16210
|
message: `未找到快照 #${e}`,
|
|
16140
16211
|
hint: "用 list_data_snapshots 查看可用快照序号"
|
|
16141
16212
|
});
|
|
16142
16213
|
let n = i.safeParse(t.value);
|
|
16143
|
-
return n.success ? (
|
|
16214
|
+
return n.success ? (jv(a, bv(t.value)), p({
|
|
16144
16215
|
op: "restore",
|
|
16145
16216
|
detail: `#${t.id}`,
|
|
16146
16217
|
timestamp: Date.now()
|
|
16147
|
-
}),
|
|
16218
|
+
}), u = Tv(a), `已回退主数据到快照 #${t.id}[${t.op}]${t.label ? `(${t.label})` : ""}。`) : $({
|
|
16148
16219
|
code: "SNAPSHOT_SCHEMA_INVALID",
|
|
16149
16220
|
message: `快照 #${t.id} 的值不符合当前 schema,无法回退`,
|
|
16150
16221
|
hint: "schema 可能已变更;该快照已过期,选其他快照或重新设置",
|
|
16151
|
-
details:
|
|
16222
|
+
details: V_(n.error.issues)
|
|
16152
16223
|
});
|
|
16153
16224
|
}, {
|
|
16154
16225
|
name: "restore_data",
|
|
@@ -16161,9 +16232,9 @@ function jv(e, r = {}) {
|
|
|
16161
16232
|
message: `主数据不是对象/数组,无法查询(当前为 ${a === void 0 ? "undefined" : typeof a})`,
|
|
16162
16233
|
hint: "query 仅适用于对象/数组;叶子用 get_data 读"
|
|
16163
16234
|
});
|
|
16164
|
-
let n;
|
|
16235
|
+
let n = s ? Ov(a, s) : a, r;
|
|
16165
16236
|
try {
|
|
16166
|
-
|
|
16237
|
+
r = cv(n, e);
|
|
16167
16238
|
} catch (t) {
|
|
16168
16239
|
return $({
|
|
16169
16240
|
code: "JSONPATH_SYNTAX",
|
|
@@ -16172,8 +16243,8 @@ function jv(e, r = {}) {
|
|
|
16172
16243
|
details: { expr: e }
|
|
16173
16244
|
});
|
|
16174
16245
|
}
|
|
16175
|
-
let
|
|
16176
|
-
return `{"matched":${
|
|
16246
|
+
let i = t ?? 50, o = r.slice(0, i), c = o.map((e) => `{"path":${JSON.stringify(e.path)},"index":${e.index === void 0 ? "null" : e.index},"value":${wv(e.value)}}`);
|
|
16247
|
+
return `{"matched":${r.length},"returned":${o.length},"truncated":${r.length > i},"results":[${c.join(",")}]}`;
|
|
16177
16248
|
}, {
|
|
16178
16249
|
name: "query_data",
|
|
16179
16250
|
description: "用 JSONPath 表达式对主数据做结构化查询(只读,无副作用)。语法子集:$ 根、.key、[n]、[\"key\"]、[*] 通配、[?(filter)] 过滤、..key 递归找后代、..* 全后代。过滤表达式:@.field op literal(op:==/!=/</<=/>/>=),&&/||/() 连接;@ 指当前元素。注意过滤作用于\"当前节点的子元素数组\",若主数据是对象需先点出数组字段再过滤,如 $.components[?(@.type==\"card\" && @.price<100)]。返回匹配元素的 path(相对主数据根,数组索引可作后续 edit_data 的 jsonPath)+ index(若父为数组)+ value。适合在大数组里按条件筛选元素,定位后再用 edit_data 增量改。",
|
|
@@ -16188,13 +16259,13 @@ function jv(e, r = {}) {
|
|
|
16188
16259
|
message: "主数据为空,无可搜索内容"
|
|
16189
16260
|
});
|
|
16190
16261
|
try {
|
|
16191
|
-
let o =
|
|
16262
|
+
let o = uv(s ? Ov(a, s) : a, e, {
|
|
16192
16263
|
mode: t,
|
|
16193
16264
|
fuzzyThreshold: n,
|
|
16194
16265
|
matchKey: r,
|
|
16195
16266
|
limit: i ?? 50
|
|
16196
16267
|
});
|
|
16197
|
-
return
|
|
16268
|
+
return wv({
|
|
16198
16269
|
matched: o.length,
|
|
16199
16270
|
results: o
|
|
16200
16271
|
});
|
|
@@ -16227,7 +16298,7 @@ function jv(e, r = {}) {
|
|
|
16227
16298
|
message: `脚本过长(${e.length} 字符,上限 8000)`,
|
|
16228
16299
|
hint: "精简脚本;复杂逻辑可分步(先 query 探查再 transform 改),或拆成多次 eval"
|
|
16229
16300
|
});
|
|
16230
|
-
let n = await
|
|
16301
|
+
let n = await pv(bv(s ? Ov(a, s) : a), e, 3e3);
|
|
16231
16302
|
if (!n.ok) {
|
|
16232
16303
|
let t = /超时/.test(n.error || "");
|
|
16233
16304
|
return $({
|
|
@@ -16241,143 +16312,255 @@ function jv(e, r = {}) {
|
|
|
16241
16312
|
});
|
|
16242
16313
|
}
|
|
16243
16314
|
if (t === "transform") {
|
|
16244
|
-
let e =
|
|
16245
|
-
|
|
16315
|
+
let e = n.result;
|
|
16316
|
+
if (e && typeof e == "object" && !Array.isArray(e) && "patches" in e && Array.isArray(e.patches)) {
|
|
16317
|
+
if (typeof a != "object" || !a) return $({
|
|
16318
|
+
code: "LEAF_BIND",
|
|
16319
|
+
message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),eval transform(patches) 无法就地替换`,
|
|
16320
|
+
hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
|
|
16321
|
+
});
|
|
16322
|
+
let t = e.patches, r = bv(a), o = [];
|
|
16323
|
+
for (let e = 0; e < t.length; e++) {
|
|
16324
|
+
let n = t[e], i = n.jsonPath || "";
|
|
16325
|
+
if (hv(i)) return $({
|
|
16326
|
+
code: "PATH_UNSAFE",
|
|
16327
|
+
message: `patches[${e}] jsonPath "${i}" 含非法段`,
|
|
16328
|
+
hint: "使用正常属性路径"
|
|
16329
|
+
});
|
|
16330
|
+
if (!Dv(i, s)) return $({
|
|
16331
|
+
code: "PATH_DENIED",
|
|
16332
|
+
message: `patches[${e}] @ "${i}" 不在 schema 声明字段内`,
|
|
16333
|
+
hint: "仅 schema 声明的 key 可写"
|
|
16334
|
+
});
|
|
16335
|
+
let a = n.op, c;
|
|
16336
|
+
if (a !== "remove") {
|
|
16337
|
+
if (n.value === void 0 || n.value === "") return $({
|
|
16338
|
+
code: "MISSING_VALUE",
|
|
16339
|
+
message: `patches[${e}] ${a} 操作需要 value`,
|
|
16340
|
+
hint: `op 为 ${a} 时 value 必填`
|
|
16341
|
+
});
|
|
16342
|
+
let t = xv(n.value);
|
|
16343
|
+
if (t.parseError) return U_(`patches[${e}]`, n.value, t.parseError);
|
|
16344
|
+
c = t.parsed;
|
|
16345
|
+
}
|
|
16346
|
+
let l = kv(r, a, i, c);
|
|
16347
|
+
if (l) return $({
|
|
16348
|
+
code: "PATCH_FAILED",
|
|
16349
|
+
message: `patches[${e}]: ${l}`,
|
|
16350
|
+
hint: "检查 op 与目标类型:merge 需对象,append 需数组"
|
|
16351
|
+
});
|
|
16352
|
+
o.push({
|
|
16353
|
+
op: a,
|
|
16354
|
+
jp: i,
|
|
16355
|
+
value: c
|
|
16356
|
+
});
|
|
16357
|
+
}
|
|
16358
|
+
let c = i.safeParse(r);
|
|
16359
|
+
if (!c.success) return $({
|
|
16360
|
+
code: "SCHEMA_INVALID",
|
|
16361
|
+
message: "脚本 patches 应用后整体校验失败,未写入",
|
|
16362
|
+
hint: "确认 patches 合并后整体仍符合 schema",
|
|
16363
|
+
details: V_(c.error.issues)
|
|
16364
|
+
});
|
|
16365
|
+
m("edit", "eval_transform");
|
|
16366
|
+
for (let e of o) Av(a, e.op, e.jp, e.value);
|
|
16367
|
+
return p({
|
|
16368
|
+
op: "edit",
|
|
16369
|
+
detail: `eval_transform(${o.length} patches)`,
|
|
16370
|
+
timestamp: Date.now()
|
|
16371
|
+
}), u = Tv(a), `已通过脚本 transform(patches) 更新主数据(${o.length} 个 patch,耗时 ${n.elapsedMs}ms)。当前值: ${wv(a, 600)}`;
|
|
16372
|
+
}
|
|
16373
|
+
let t = i.safeParse(e);
|
|
16374
|
+
return t.success ? typeof a != "object" || !a ? $({
|
|
16375
|
+
code: "LEAF_BIND",
|
|
16376
|
+
message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),eval transform 无法就地替换外部持有的值引用`,
|
|
16377
|
+
hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
|
|
16378
|
+
}) : (m("edit", "eval_transform"), t.data !== null && typeof t.data == "object" && (s ? gv(a, t.data) : Mv(a, t.data)), p({
|
|
16246
16379
|
op: "edit",
|
|
16247
16380
|
detail: "eval_transform",
|
|
16248
16381
|
timestamp: Date.now()
|
|
16249
|
-
}),
|
|
16382
|
+
}), u = Tv(a), `已通过脚本 transform 更新主数据(耗时 ${n.elapsedMs}ms)。当前值: ${wv(a, 600)}`) : $({
|
|
16250
16383
|
code: "SCHEMA_INVALID",
|
|
16251
16384
|
message: "脚本返回值校验失败,未写入(transform 模式要求返回主数据的完整新值且符合 schema)",
|
|
16252
|
-
hint: "确认脚本 return 了完整新值(非部分)
|
|
16253
|
-
details:
|
|
16385
|
+
hint: "确认脚本 return 了完整新值(非部分);或返回 {patches:[...]} 走增量模式;按 describe_data() 查看格式",
|
|
16386
|
+
details: V_(t.error.issues)
|
|
16254
16387
|
});
|
|
16255
16388
|
}
|
|
16256
|
-
return
|
|
16389
|
+
return wv({
|
|
16257
16390
|
ok: !0,
|
|
16258
16391
|
result: n.result,
|
|
16259
16392
|
elapsedMs: n.elapsedMs
|
|
16260
16393
|
});
|
|
16261
16394
|
}, {
|
|
16262
16395
|
name: "eval_script",
|
|
16263
|
-
description: "在隔离的 Web Worker 沙箱里对主数据跑自定义 JS 脚本(无 window/document 访问,fetch/XHR/WebSocket/importScripts 已禁用,超时 3s 可终止)。脚本以 `data` 为入参(主数据的深拷贝),返回值即结果。mode:query(默认,只读,把返回值回给 LLM,适合过滤/映射/聚合/统计大数组)、transform(把返回值作为主数据的新整体值,经 schema 校验后就地落地,适合批量重写)
|
|
16396
|
+
description: "在隔离的 Web Worker 沙箱里对主数据跑自定义 JS 脚本(无 window/document 访问,fetch/XHR/WebSocket/importScripts 已禁用,超时 3s 可终止)。脚本以 `data` 为入参(主数据的深拷贝),返回值即结果。mode:query(默认,只读,把返回值回给 LLM,适合过滤/映射/聚合/统计大数组)、transform(把返回值作为主数据的新整体值,经 schema 校验后就地落地,适合批量重写)。transform 支持两种返回形式:① 完整新值(整体替换);② {patches:[{op,jsonPath,value},...]} 增量 patch(按 patch 应用,避免大对象整体重传,任一 patch 失败或整体 schema 校验失败则不写入)。query 不改主数据。脚本内可用标准 JS(Array/Object/JSON/Math 等)与 async/await。",
|
|
16264
16397
|
schema: t.object({
|
|
16265
16398
|
script: t.string().describe("JS 脚本体,如 data.filter(c=>c.stock>0).map(c=>c.id);入参名 data;末尾表达式或 return 即返回值"),
|
|
16266
16399
|
mode: t.enum(["query", "transform"]).optional().describe("query=只读返回结果(默认),transform=校验后落地为新值")
|
|
16267
16400
|
})
|
|
16268
16401
|
}),
|
|
16269
|
-
n(async ({ jsonPath: e }) => {
|
|
16270
|
-
let
|
|
16402
|
+
n(async ({ jsonPath: e, fields: t, depth: n }) => {
|
|
16403
|
+
let i = e || "";
|
|
16404
|
+
if (!Dv(i, s)) return $({
|
|
16405
|
+
code: "PATH_DENIED",
|
|
16406
|
+
message: `read @ "${i}" 不在 schema 声明字段内`,
|
|
16407
|
+
hint: "主数据仅暴露 schema 声明的字段;若需操作该字段,集成方需在 schema 中声明它"
|
|
16408
|
+
});
|
|
16409
|
+
let c = i ? _v(a, i) : a;
|
|
16410
|
+
i || (c = Ov(c, s));
|
|
16411
|
+
let l = c;
|
|
16271
16412
|
if (r.interceptors?.read) try {
|
|
16272
|
-
|
|
16413
|
+
l = r.interceptors.read(l);
|
|
16273
16414
|
} catch (e) {
|
|
16274
16415
|
return $({
|
|
16275
16416
|
code: "READ_INTERCEPT",
|
|
16276
16417
|
message: `read 拦截器抛错: ${e.message}`
|
|
16277
16418
|
});
|
|
16278
16419
|
}
|
|
16279
|
-
|
|
16280
|
-
|
|
16281
|
-
|
|
16282
|
-
|
|
16420
|
+
t && t.length && (l = Sv(l, t)), n != null && (l = Cv(l, n));
|
|
16421
|
+
let d = Tv(a);
|
|
16422
|
+
u = d;
|
|
16423
|
+
let f = t && t.length ? `(字段裁剪:${t.join(",")})` : "", p = n == null ? "" : `(深度≤${n})`, m = f || p ? ` ${f}${p}` : "", h = e ? "" : `主数据说明: ${o}\n格式: 写入值需为 JSON,且通过声明的 schema 校验(校验失败时 write 会返回结构化错误)。\n\n`;
|
|
16424
|
+
return l === void 0 ? `${h}主数据${e ? ` @ ${e}` : ""}${m} = (undefined) (hash=${d})` : `${h}主数据${e ? ` @ ${e}` : ""}${m} = ${wv(l)} (hash=${d})`;
|
|
16283
16425
|
}, {
|
|
16284
16426
|
name: "read",
|
|
16285
|
-
description: "读取主数据(高层入口,合并 describe/get)。不传 jsonPath → 返回主数据说明 + 格式提示;传 jsonPath → 返回该子路径当前值 + hash。hash 用于乐观锁(默认 autoLock,write 时自动比对,无需手动传)
|
|
16286
|
-
schema: t.object({
|
|
16427
|
+
description: "读取主数据(高层入口,合并 describe/get)。不传 jsonPath → 返回主数据说明 + 格式提示;传 jsonPath → 返回该子路径当前值 + hash。hash 用于乐观锁(默认 autoLock,write 时自动比对,无需手动传)。fields(可选):字段裁剪,只返回对象(及数组元素)的指定字段,减少大对象返回体积;depth(可选):嵌套深度限制(0=只根占位,1=根+子,递归截断深层),减少深层结构返回体积。两者可组合,先裁字段再截深度。集成方可能经 read 拦截器对返回值脱敏/派生。",
|
|
16428
|
+
schema: t.object({
|
|
16429
|
+
jsonPath: t.string().optional().describe("要读的子路径(相对主数据根,如 components.0.text);不传则读整个主数据并返回说明"),
|
|
16430
|
+
fields: t.array(t.string()).optional().describe("字段裁剪:只返回指定字段(对对象/数组元素投影),减少返回体积,如 [\"id\",\"title\"]"),
|
|
16431
|
+
depth: t.number().int().min(0).optional().describe("嵌套深度限制:0=只根占位,1=根+子,递归到 depth 层后用 {...}/[...] 占位截断,减少深层返回体积")
|
|
16432
|
+
})
|
|
16287
16433
|
}),
|
|
16288
|
-
n(async ({ value: e, patch: t,
|
|
16289
|
-
let
|
|
16290
|
-
|
|
16291
|
-
let
|
|
16434
|
+
n(async ({ value: e, patch: t, patches: n, del: o }) => {
|
|
16435
|
+
let c = "set";
|
|
16436
|
+
o ? c = "delete" : (n && n.length || t) && (c = "edit");
|
|
16437
|
+
let l = e, f;
|
|
16292
16438
|
if (r.interceptors?.write) try {
|
|
16293
|
-
let
|
|
16294
|
-
|
|
16439
|
+
let i = c === "delete" ? {
|
|
16440
|
+
del: !0,
|
|
16441
|
+
jsonPath: t?.jsonPath
|
|
16442
|
+
} : c === "edit" && n && n.length ? { patches: n } : c === "edit" ? {
|
|
16443
|
+
op: t.op,
|
|
16444
|
+
jsonPath: t.jsonPath || "",
|
|
16445
|
+
value: e
|
|
16446
|
+
} : e, o = r.interceptors.write(i, a);
|
|
16447
|
+
if (o && typeof o == "object" && "error" in o) return $({
|
|
16295
16448
|
code: "WRITE_INTERCEPT",
|
|
16296
|
-
message: `write 拦截器拒绝: ${
|
|
16449
|
+
message: `write 拦截器拒绝: ${o.error}`
|
|
16297
16450
|
});
|
|
16298
|
-
|
|
16451
|
+
c === "delete" || (c === "edit" && n && n.length ? f = o && Array.isArray(o) ? o : n : l = o);
|
|
16299
16452
|
} catch (e) {
|
|
16300
16453
|
return $({
|
|
16301
16454
|
code: "WRITE_INTERCEPT",
|
|
16302
16455
|
message: `write 拦截器抛错: ${e.message}`
|
|
16303
16456
|
});
|
|
16304
16457
|
}
|
|
16305
|
-
let
|
|
16306
|
-
if (
|
|
16458
|
+
let g = d ? u : void 0;
|
|
16459
|
+
if (c === "delete") {
|
|
16307
16460
|
if (!t?.jsonPath) return $({
|
|
16308
16461
|
code: "MISSING_VALUE",
|
|
16309
16462
|
message: "delete 需要 patch.jsonPath 指定要删的子路径(主数据整体不可删,用 write(value) 整体替换)",
|
|
16310
16463
|
hint: "如 patch:{jsonPath:\"components.0\"}, del:true"
|
|
16311
16464
|
});
|
|
16312
|
-
if (
|
|
16465
|
+
if (hv(t.jsonPath)) return $({
|
|
16313
16466
|
code: "PATH_UNSAFE",
|
|
16314
16467
|
message: `jsonPath "${t.jsonPath}" 含非法段`,
|
|
16315
16468
|
hint: "使用正常属性路径"
|
|
16316
16469
|
});
|
|
16317
|
-
|
|
16470
|
+
if (!Dv(t.jsonPath, s)) return $({
|
|
16471
|
+
code: "PATH_DENIED",
|
|
16472
|
+
message: `write delete @ "${t.jsonPath}" 不在 schema 声明字段内`,
|
|
16473
|
+
hint: "仅 schema 声明的 key 可删"
|
|
16474
|
+
});
|
|
16475
|
+
let e = await h("delete", g);
|
|
16318
16476
|
if (e !== null) return e;
|
|
16319
|
-
|
|
16320
|
-
let n =
|
|
16321
|
-
return
|
|
16477
|
+
m("delete");
|
|
16478
|
+
let n = yv(a, t.jsonPath);
|
|
16479
|
+
return p({
|
|
16322
16480
|
op: "delete",
|
|
16323
16481
|
detail: t.jsonPath,
|
|
16324
16482
|
timestamp: Date.now()
|
|
16325
|
-
}),
|
|
16326
|
-
}
|
|
16327
|
-
let d;
|
|
16328
|
-
if (typeof s == "string") try {
|
|
16329
|
-
d = JSON.parse(s);
|
|
16330
|
-
} catch {
|
|
16331
|
-
d = s;
|
|
16483
|
+
}), u = Tv(a), n ? `已删除主数据 @ ${t.jsonPath}` : `主数据 @ ${t.jsonPath} 不存在(无需删除)`;
|
|
16332
16484
|
}
|
|
16333
|
-
|
|
16334
|
-
if (o === "edit") {
|
|
16335
|
-
let e = t.jsonPath || "";
|
|
16336
|
-
if (gv(e)) return $({
|
|
16337
|
-
code: "PATH_UNSAFE",
|
|
16338
|
-
message: `jsonPath "${e}" 含非法段`,
|
|
16339
|
-
hint: "使用正常属性路径,如 components.0.text"
|
|
16340
|
-
});
|
|
16485
|
+
if (c === "edit") {
|
|
16341
16486
|
if (typeof a != "object" || !a) return $({
|
|
16342
16487
|
code: "NOT_OBJECT",
|
|
16343
16488
|
message: `edit 仅适用于对象/数组主数据,当前是 ${a === void 0 ? "undefined" : typeof a}`,
|
|
16344
16489
|
hint: "叶子用 write(value) 整体设置"
|
|
16345
16490
|
});
|
|
16346
|
-
let
|
|
16347
|
-
if (
|
|
16348
|
-
let r =
|
|
16349
|
-
|
|
16350
|
-
|
|
16351
|
-
|
|
16352
|
-
|
|
16353
|
-
|
|
16354
|
-
|
|
16355
|
-
|
|
16356
|
-
|
|
16357
|
-
|
|
16358
|
-
|
|
16359
|
-
|
|
16360
|
-
|
|
16361
|
-
|
|
16491
|
+
let e = await h("edit", g);
|
|
16492
|
+
if (e !== null) return e;
|
|
16493
|
+
let r = f || (n && n.length ? n : [{
|
|
16494
|
+
op: t.op,
|
|
16495
|
+
jsonPath: t.jsonPath || "",
|
|
16496
|
+
value: l
|
|
16497
|
+
}]), o = bv(a), c = [];
|
|
16498
|
+
for (let e = 0; e < r.length; e++) {
|
|
16499
|
+
let t = r[e], n = t.jsonPath || "";
|
|
16500
|
+
if (hv(n)) return $({
|
|
16501
|
+
code: "PATH_UNSAFE",
|
|
16502
|
+
message: `patches[${e}] jsonPath "${n}" 含非法段`,
|
|
16503
|
+
hint: "使用正常属性路径,如 components.0.text"
|
|
16504
|
+
});
|
|
16505
|
+
if (!Dv(n, s)) return $({
|
|
16506
|
+
code: "PATH_DENIED",
|
|
16507
|
+
message: `patches[${e}] @ "${n}" 不在 schema 声明字段内`,
|
|
16508
|
+
hint: "仅 schema 声明的 key 可写"
|
|
16509
|
+
});
|
|
16510
|
+
let i = t.op, a;
|
|
16511
|
+
if (i !== "remove") {
|
|
16512
|
+
if (t.value === void 0 || t.value === "") return $({
|
|
16513
|
+
code: "MISSING_VALUE",
|
|
16514
|
+
message: `patches[${e}] ${i} 操作需要 value`,
|
|
16515
|
+
hint: `op 为 ${i} 时 value 必填;删除请用 op:'remove'`
|
|
16516
|
+
});
|
|
16517
|
+
let n = xv(t.value);
|
|
16518
|
+
if (n.parseError) return U_(`patches[${e}]`, t.value, n.parseError);
|
|
16519
|
+
a = n.parsed;
|
|
16520
|
+
}
|
|
16521
|
+
let l = kv(o, i, n, a);
|
|
16522
|
+
if (l) return $({
|
|
16523
|
+
code: "PATCH_FAILED",
|
|
16524
|
+
message: `patches[${e}]: ${l}`,
|
|
16525
|
+
hint: "检查 op 与目标类型:merge 需对象,append 需数组"
|
|
16526
|
+
});
|
|
16527
|
+
c.push({
|
|
16528
|
+
op: i,
|
|
16529
|
+
jp: n,
|
|
16530
|
+
value: a
|
|
16531
|
+
});
|
|
16532
|
+
}
|
|
16533
|
+
let d = i.safeParse(o);
|
|
16534
|
+
if (!d.success) return H_("", d.error.issues);
|
|
16535
|
+
m("edit");
|
|
16536
|
+
for (let e of c) Av(a, e.op, e.jp, e.value);
|
|
16537
|
+
return p({
|
|
16362
16538
|
op: "edit",
|
|
16363
|
-
detail: `${
|
|
16364
|
-
value:
|
|
16539
|
+
detail: `${c.length} 个 patch${c.length > 1 ? "(批量)" : ""}`,
|
|
16540
|
+
value: c.map((e) => `${e.op}@${e.jp}`),
|
|
16365
16541
|
timestamp: Date.now()
|
|
16366
|
-
}),
|
|
16542
|
+
}), u = Tv(a), `已 write(edit) 主数据(${c.length} 个 patch)。当前值:${wv(a, 600)} (新 hash=${Tv(a)})`;
|
|
16367
16543
|
}
|
|
16368
|
-
let
|
|
16369
|
-
if (
|
|
16370
|
-
|
|
16371
|
-
|
|
16544
|
+
let _, v = xv(l);
|
|
16545
|
+
if (v.parseError) return U_("", l, v.parseError);
|
|
16546
|
+
_ = v.parsed;
|
|
16547
|
+
let y = await h("set", g);
|
|
16548
|
+
if (y !== null) return y;
|
|
16549
|
+
let b = i.safeParse(_);
|
|
16550
|
+
return b.success ? typeof a != "object" || !a ? $({
|
|
16551
|
+
code: "LEAF_BIND",
|
|
16552
|
+
message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),write(set) 无法就地替换外部持有的值引用`,
|
|
16553
|
+
hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹(如 {value:\"x\"})或集成方通过 sdk.setData 替换 bind"
|
|
16554
|
+
}) : (m("set"), b.data !== null && typeof b.data == "object" && (s ? gv(a, b.data) : Mv(a, b.data)), p({
|
|
16372
16555
|
op: "set",
|
|
16373
|
-
value:
|
|
16556
|
+
value: b.data,
|
|
16374
16557
|
timestamp: Date.now()
|
|
16375
|
-
}),
|
|
16558
|
+
}), u = Tv(a), `已 write(set) 主数据 = ${wv(b.data, 600)} (新 hash=${Tv(a)})${s ? "(白名单模式:仅更新 schema 声明字段,未声明字段保留)" : ""}`) : H_("", b.error.issues);
|
|
16376
16559
|
}, {
|
|
16377
16560
|
name: "write",
|
|
16378
|
-
description: "写入主数据(高层入口,合并 set/edit/delete + 自动乐观锁 + 自动快照)
|
|
16561
|
+
description: "写入主数据(高层入口,合并 set/edit/delete + 自动乐观锁 + 自动快照)。四种意图:① 整体替换 write({ value }) value 为 JSON 对象(推荐)或字符串;② 单个增量 patch write({ value, patch:{op,jsonPath} }) op=set/remove/merge/append,jsonPath 相对主数据根(如 components.0.text),value 作为该 patch 的值;③ 批量增量 write({ patches:[{op,jsonPath,value},...] }) 一次原子应用多个 patch(任一失败整体不写入,适合一次改多处);④ 删除 write({ patch:{jsonPath}, del:true })。写入自动经 schema 校验(失败不写)+ 自动存快照(可 restore_data 回退)+ 自动乐观锁(autoLock,用你最后 read 到的 hash 比对,冲突则 VERSION_CONFLICT)。集成方可能经 write 拦截器校验/转换/拒绝(批量模式拦截器收到 {patches},返回新 patches 数组或 {error})。",
|
|
16379
16562
|
schema: t.object({
|
|
16380
|
-
value: t.unknown().optional().describe("JSON 对象(推荐,如 {title:\"x\"})或 JSON 字符串;set
|
|
16563
|
+
value: t.unknown().optional().describe("JSON 对象(推荐,如 {title:\"x\"})或 JSON 字符串;set 整体或单个 patch 的 set/merge/append 必填"),
|
|
16381
16564
|
patch: t.object({
|
|
16382
16565
|
op: t.enum([
|
|
16383
16566
|
"set",
|
|
@@ -16386,22 +16569,32 @@ function jv(e, r = {}) {
|
|
|
16386
16569
|
"append"
|
|
16387
16570
|
]),
|
|
16388
16571
|
jsonPath: t.string().optional().describe("相对主数据根的点号路径(如 components.0.text);set/remove 必填,merge/append 不填则作用于根")
|
|
16389
|
-
}).optional().describe("
|
|
16572
|
+
}).optional().describe("单个增量编辑;传 patch(无 patches)走单 patch edit 语义,value 作为该 patch 的 value"),
|
|
16573
|
+
patches: t.array(t.object({
|
|
16574
|
+
op: t.enum([
|
|
16575
|
+
"set",
|
|
16576
|
+
"remove",
|
|
16577
|
+
"merge",
|
|
16578
|
+
"append"
|
|
16579
|
+
]),
|
|
16580
|
+
jsonPath: t.string().optional().describe("相对主数据根的点号路径;set/remove 必填,merge/append 不填则作用于根"),
|
|
16581
|
+
value: t.unknown().optional().describe("JSON 值(推荐直传)或 JSON 字符串;set/merge/append 必填,remove 不需")
|
|
16582
|
+
})).optional().describe("批量增量编辑:一次原子应用多个 patch(任一失败则整体不写入,clone 试跑全部 + schema 校验通过才落 live)。适合一次改多处,减少多轮往返"),
|
|
16390
16583
|
del: t.boolean().optional().describe("true 则删除 patch.jsonPath 指定的子路径(等价 delete_data)")
|
|
16391
16584
|
})
|
|
16392
16585
|
})
|
|
16393
16586
|
];
|
|
16394
|
-
return Object.defineProperty(
|
|
16395
|
-
value:
|
|
16587
|
+
return Object.defineProperty(g, "controller", {
|
|
16588
|
+
value: f,
|
|
16396
16589
|
enumerable: !1,
|
|
16397
16590
|
configurable: !1,
|
|
16398
16591
|
writable: !1
|
|
16399
|
-
}),
|
|
16592
|
+
}), g;
|
|
16400
16593
|
}
|
|
16401
16594
|
//#endregion
|
|
16402
16595
|
//#region src/core/tools/fetchDoc.ts
|
|
16403
|
-
var
|
|
16404
|
-
let n = new AbortController(), r = setTimeout(() => n.abort(),
|
|
16596
|
+
var Lv = 3e4, Rv = [n(async ({ url: e, as: t }) => {
|
|
16597
|
+
let n = new AbortController(), r = setTimeout(() => n.abort(), Lv);
|
|
16405
16598
|
try {
|
|
16406
16599
|
let r = await fetch(e, {
|
|
16407
16600
|
method: "GET",
|
|
@@ -16418,7 +16611,7 @@ var Mv = 3e4, Nv = [n(async ({ url: e, as: t }) => {
|
|
|
16418
16611
|
].join("\n");
|
|
16419
16612
|
} catch (t) {
|
|
16420
16613
|
let r = t?.message || String(t);
|
|
16421
|
-
return n.signal.aborted ? `获取失败:请求超时(${
|
|
16614
|
+
return n.signal.aborted ? `获取失败:请求超时(${Lv}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
|
|
16422
16615
|
} finally {
|
|
16423
16616
|
clearTimeout(r);
|
|
16424
16617
|
}
|
|
@@ -16429,25 +16622,25 @@ var Mv = 3e4, Nv = [n(async ({ url: e, as: t }) => {
|
|
|
16429
16622
|
url: t.string().describe("要抓取的 URL(同源或已配 CORS)"),
|
|
16430
16623
|
as: t.enum(["text", "markdown"]).optional().describe("返回格式标签,默认 text")
|
|
16431
16624
|
})
|
|
16432
|
-
})],
|
|
16433
|
-
function
|
|
16434
|
-
return
|
|
16625
|
+
})], zv = Rv;
|
|
16626
|
+
function Bv(e, t) {
|
|
16627
|
+
return Iv(e, t);
|
|
16435
16628
|
}
|
|
16436
|
-
function
|
|
16629
|
+
function Vv(e, t, n) {
|
|
16437
16630
|
let r = e?.dataOps !== !1, i = e?.fetch !== !1;
|
|
16438
16631
|
return [...r ? t : [], ...i ? n : []];
|
|
16439
16632
|
}
|
|
16440
16633
|
//#endregion
|
|
16441
16634
|
//#region src/core/harness/usageHints.ts
|
|
16442
|
-
var
|
|
16443
|
-
function
|
|
16635
|
+
var Hv = .7;
|
|
16636
|
+
function Uv(e, t, n = "simple") {
|
|
16444
16637
|
let r = n !== "advanced";
|
|
16445
16638
|
return {
|
|
16446
16639
|
name: "usageHints",
|
|
16447
16640
|
augmentPrompt: () => {
|
|
16448
16641
|
let n = [];
|
|
16449
16642
|
if (e?.planning !== !1 && n.push("多步任务建议先 write_todos 拆解为步骤并逐步推进。"), t && (r ? (n.push("读写主数据用 read/write(高层入口,自动乐观锁 + 自动快照)。read({jsonPath}) 读子路径当前值(返回含 hash,write 时自动比对,无需手动传);read() 不传读整个主数据 + 说明。write({value}) 整体替换(value 直传 JSON 对象,如 {title:\"x\"},无需 stringify);write({value, patch:{op,jsonPath}}) 增量 patch(op=set/remove/merge/append);write({patch:{jsonPath}, del:true}) 删除子路径。写入自动经 schema 校验(失败不写)+ 自动存快照(出错可用 restore_data 回退)。"), n.push("修改大对象/数组优先用 write 的 patch 增量(只发改动部分),避免整体重传被 max_tokens 截断致 JSON 不完整。"), 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(返回值经校验后落地)。"))), e?.subagent !== !1 && n.push("独立子任务可 spawn_agent 委派(只读工具,过程不占主上下文)。"), e?.subagents?.length) {
|
|
16450
|
-
let t = e.subagents.filter((e) => (e.temperature ?? 0) >=
|
|
16643
|
+
let t = e.subagents.filter((e) => (e.temperature ?? 0) >= Hv || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), i = e.subagents.filter((e) => (e.temperature ?? 0) < Hv && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
|
|
16451
16644
|
n.push("【规划-反思-执行·路由】按任务性质选模式,不要对简单任务过度编排:"), t.length && (n.push(` · 创作/设计/开放性需求(如"设计主题风格""换个感觉")→ 先调 ${t.map((e) => "use_" + e.id).join("/")} 出 2-3 套方案(高温创意),`), n.push(" 不要自己拍板;拿到方案后,若需用户拍板用 request_human_confirmation 弹选项。")), i.length && n.push(` · 严谨/易错/校验类 → 可先调 ${i.map((e) => "use_" + e.id).join("/")} 反思挑刺(低温审查),据反馈修订。`), n.push(r ? " · 方案定稿后,由你(主 agent)用 write 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。" : " · 方案定稿后,由你(主 agent)用 edit_data 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。"), n.push(" · 简单/明确任务(如\"标题改红色\")直接执行,不必走规划-反思。");
|
|
16452
16645
|
}
|
|
16453
16646
|
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;
|
|
@@ -16456,7 +16649,7 @@ function Rv(e, t, n = "simple") {
|
|
|
16456
16649
|
}
|
|
16457
16650
|
//#endregion
|
|
16458
16651
|
//#region src/core/utils/id.ts
|
|
16459
|
-
function
|
|
16652
|
+
function Wv() {
|
|
16460
16653
|
try {
|
|
16461
16654
|
if (typeof crypto < "u" && typeof crypto.randomUUID == "function") return crypto.randomUUID();
|
|
16462
16655
|
} catch {}
|
|
@@ -16464,57 +16657,57 @@ function zv() {
|
|
|
16464
16657
|
}
|
|
16465
16658
|
//#endregion
|
|
16466
16659
|
//#region src/core/backends/storage.ts
|
|
16467
|
-
var
|
|
16660
|
+
var Gv = "chat-sdk", Kv = 50 * 1024 * 1024, qv = 4 * 1024 * 1024, Jv = 10 * 1024 * 1024, Yv = .9, Xv = 500, Zv = 300, Qv = "__meta__", $v = "v:1", ey = [
|
|
16468
16661
|
"messages",
|
|
16469
16662
|
"vfs",
|
|
16470
16663
|
"todos",
|
|
16471
16664
|
"memory"
|
|
16472
16665
|
];
|
|
16473
|
-
function
|
|
16474
|
-
return e === "local" || e === "session" ?
|
|
16666
|
+
function ty(e) {
|
|
16667
|
+
return e === "local" || e === "session" ? qv : Kv;
|
|
16475
16668
|
}
|
|
16476
|
-
function
|
|
16669
|
+
function ny(e) {
|
|
16477
16670
|
if (typeof e != "object" || !e) return !1;
|
|
16478
16671
|
let t = e;
|
|
16479
16672
|
return t.name === "QuotaExceededError" || t.name === "NS_ERROR_DOM_QUOTA_REACHED" || t.code === 22 || t.code === 1014;
|
|
16480
16673
|
}
|
|
16481
|
-
function
|
|
16674
|
+
function ry(e, t, n, r) {
|
|
16482
16675
|
return [
|
|
16483
|
-
|
|
16676
|
+
$v,
|
|
16484
16677
|
e,
|
|
16485
16678
|
t,
|
|
16486
16679
|
n,
|
|
16487
16680
|
r
|
|
16488
16681
|
].join("::");
|
|
16489
16682
|
}
|
|
16490
|
-
function
|
|
16683
|
+
function iy(e, t, n) {
|
|
16491
16684
|
return [
|
|
16492
|
-
|
|
16685
|
+
$v,
|
|
16493
16686
|
e,
|
|
16494
16687
|
t,
|
|
16495
16688
|
n
|
|
16496
16689
|
].join("::") + "::";
|
|
16497
16690
|
}
|
|
16498
|
-
function
|
|
16691
|
+
function ay(e, t) {
|
|
16499
16692
|
return [
|
|
16500
|
-
|
|
16693
|
+
$v,
|
|
16501
16694
|
e,
|
|
16502
16695
|
t
|
|
16503
16696
|
].join("::") + "::";
|
|
16504
16697
|
}
|
|
16505
|
-
function
|
|
16506
|
-
return [
|
|
16698
|
+
function oy(e) {
|
|
16699
|
+
return [$v, e].join("::") + "::";
|
|
16507
16700
|
}
|
|
16508
|
-
var
|
|
16509
|
-
function
|
|
16510
|
-
|
|
16701
|
+
var sy = null;
|
|
16702
|
+
function cy(e) {
|
|
16703
|
+
sy ||= new TextEncoder();
|
|
16511
16704
|
try {
|
|
16512
|
-
return
|
|
16705
|
+
return sy.encode(JSON.stringify(e)).length;
|
|
16513
16706
|
} catch {
|
|
16514
16707
|
return 0;
|
|
16515
16708
|
}
|
|
16516
16709
|
}
|
|
16517
|
-
function
|
|
16710
|
+
function ly(e, t, n) {
|
|
16518
16711
|
let r = e.reduce((e, t) => e + t.bytes, 0);
|
|
16519
16712
|
if (r <= t) return [];
|
|
16520
16713
|
let i = t * n, a = [...e].sort((e, t) => e.lastAccessed - t.lastAccessed), o = [];
|
|
@@ -16524,7 +16717,7 @@ function iy(e, t, n) {
|
|
|
16524
16717
|
}
|
|
16525
16718
|
return o;
|
|
16526
16719
|
}
|
|
16527
|
-
function
|
|
16720
|
+
function uy() {
|
|
16528
16721
|
let e = /* @__PURE__ */ new Map();
|
|
16529
16722
|
return {
|
|
16530
16723
|
async get(t) {
|
|
@@ -16544,7 +16737,7 @@ function ay() {
|
|
|
16544
16737
|
}
|
|
16545
16738
|
};
|
|
16546
16739
|
}
|
|
16547
|
-
function
|
|
16740
|
+
function dy(e) {
|
|
16548
16741
|
return new Promise((t, n) => {
|
|
16549
16742
|
if (typeof indexedDB > "u") {
|
|
16550
16743
|
n(/* @__PURE__ */ Error("indexedDB 不可用"));
|
|
@@ -16605,7 +16798,7 @@ function oy(e) {
|
|
|
16605
16798
|
}, r.onerror = () => n(r.error);
|
|
16606
16799
|
});
|
|
16607
16800
|
}
|
|
16608
|
-
function
|
|
16801
|
+
function fy(e) {
|
|
16609
16802
|
return {
|
|
16610
16803
|
async get(t) {
|
|
16611
16804
|
let n = e.getItem(t);
|
|
@@ -16639,12 +16832,12 @@ function sy(e) {
|
|
|
16639
16832
|
}
|
|
16640
16833
|
};
|
|
16641
16834
|
}
|
|
16642
|
-
function
|
|
16835
|
+
function py(e, t, n) {
|
|
16643
16836
|
let r = (e.get(t) ?? Promise.resolve()).then(n, n);
|
|
16644
16837
|
return e.set(t, r.then(() => void 0, () => void 0)), r;
|
|
16645
16838
|
}
|
|
16646
|
-
function
|
|
16647
|
-
let t = e.dbName ??
|
|
16839
|
+
function my(e = {}) {
|
|
16840
|
+
let t = e.dbName ?? Gv, n = e.backend ?? "indexed", r = e.maxBytes ?? ty(n), i = e.maxBytesPerSession ?? Jv, a = e.evictionWatermark ?? Yv, o = e.debounceMs ?? Xv, s = /* @__PURE__ */ new Set();
|
|
16648
16841
|
function c(e) {
|
|
16649
16842
|
for (let t of s) try {
|
|
16650
16843
|
t(e);
|
|
@@ -16657,16 +16850,16 @@ function ly(e = {}) {
|
|
|
16657
16850
|
try {
|
|
16658
16851
|
if (n === "indexed") {
|
|
16659
16852
|
if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
|
|
16660
|
-
l = await
|
|
16853
|
+
l = await dy(t), d(!0);
|
|
16661
16854
|
} else if (n === "session") {
|
|
16662
16855
|
if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
|
|
16663
|
-
l =
|
|
16856
|
+
l = fy(sessionStorage), d(!0);
|
|
16664
16857
|
} else if (n === "local") {
|
|
16665
16858
|
if (typeof localStorage > "u") throw Error("localStorage 不可用");
|
|
16666
|
-
l =
|
|
16667
|
-
} else l =
|
|
16859
|
+
l = fy(localStorage), d(!0);
|
|
16860
|
+
} else l = uy(), d(!1);
|
|
16668
16861
|
} catch (e) {
|
|
16669
|
-
l =
|
|
16862
|
+
l = uy();
|
|
16670
16863
|
let t = e instanceof Error ? e.message : String(e);
|
|
16671
16864
|
d(!1), Promise.resolve().then(() => c({
|
|
16672
16865
|
type: "degraded",
|
|
@@ -16676,10 +16869,10 @@ function ly(e = {}) {
|
|
|
16676
16869
|
})();
|
|
16677
16870
|
let p = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map();
|
|
16678
16871
|
function g(e, n, r, a) {
|
|
16679
|
-
let o =
|
|
16680
|
-
return
|
|
16872
|
+
let o = ry(t, r, a, Qv);
|
|
16873
|
+
return py(h, o, async () => {
|
|
16681
16874
|
let t = async () => {
|
|
16682
|
-
let t = await l.get(o), s = await l.get(e), u = s == null ? 0 :
|
|
16875
|
+
let t = await l.get(o), s = await l.get(e), u = s == null ? 0 : cy(s), d = cy(n), f = (t?.bytes ?? 0) + (d - u);
|
|
16683
16876
|
if (f > i) {
|
|
16684
16877
|
c({
|
|
16685
16878
|
type: "quota",
|
|
@@ -16701,12 +16894,12 @@ function ly(e = {}) {
|
|
|
16701
16894
|
try {
|
|
16702
16895
|
await t();
|
|
16703
16896
|
} catch (e) {
|
|
16704
|
-
if (
|
|
16897
|
+
if (ny(e) && !u) {
|
|
16705
16898
|
u = !0;
|
|
16706
16899
|
try {
|
|
16707
16900
|
await b();
|
|
16708
16901
|
} catch {}
|
|
16709
|
-
l =
|
|
16902
|
+
l = uy(), Promise.resolve().then(() => c({
|
|
16710
16903
|
type: "degraded",
|
|
16711
16904
|
reason: "存储配额超限(QuotaExceededError),已淘汰最旧会话并降级内存"
|
|
16712
16905
|
}));
|
|
@@ -16718,7 +16911,7 @@ function ly(e = {}) {
|
|
|
16718
16911
|
});
|
|
16719
16912
|
}
|
|
16720
16913
|
function _(e, n, r, i) {
|
|
16721
|
-
let a =
|
|
16914
|
+
let a = ry(t, e, n, r), s = p.get(a);
|
|
16722
16915
|
s && s.resolve();
|
|
16723
16916
|
let c = m.get(a);
|
|
16724
16917
|
return c && clearTimeout(c), new Promise((t) => {
|
|
@@ -16745,15 +16938,15 @@ function ly(e = {}) {
|
|
|
16745
16938
|
function y() {
|
|
16746
16939
|
v ||= setTimeout(() => {
|
|
16747
16940
|
v = null, b();
|
|
16748
|
-
},
|
|
16941
|
+
}, Zv);
|
|
16749
16942
|
}
|
|
16750
16943
|
async function b() {
|
|
16751
16944
|
let e = [];
|
|
16752
|
-
await l.scan(
|
|
16945
|
+
await l.scan(oy(t), (t, n) => {
|
|
16753
16946
|
t.endsWith("::__meta__") && e.push(n);
|
|
16754
16947
|
});
|
|
16755
|
-
let n =
|
|
16756
|
-
for (let e of n) await l.clearPrefix(
|
|
16948
|
+
let n = ly(e, r, a);
|
|
16949
|
+
for (let e of n) await l.clearPrefix(iy(t, e.agentId, e.sessionId)), c({
|
|
16757
16950
|
type: "evicted",
|
|
16758
16951
|
agentId: e.agentId,
|
|
16759
16952
|
sessionId: e.sessionId,
|
|
@@ -16764,13 +16957,13 @@ function ly(e = {}) {
|
|
|
16764
16957
|
ready: f,
|
|
16765
16958
|
async listSessions(e) {
|
|
16766
16959
|
let n = [];
|
|
16767
|
-
return await l.scan(
|
|
16960
|
+
return await l.scan(ay(t, e), (e, t) => {
|
|
16768
16961
|
e.endsWith("::__meta__") && n.push(t);
|
|
16769
16962
|
}), n.sort((e, t) => t.lastAccessed - e.lastAccessed);
|
|
16770
16963
|
},
|
|
16771
16964
|
async load(e, n) {
|
|
16772
|
-
let r =
|
|
16773
|
-
return await
|
|
16965
|
+
let r = ry(t, e, n, Qv);
|
|
16966
|
+
return await py(h, r, async () => {
|
|
16774
16967
|
let i = await l.get(r);
|
|
16775
16968
|
if (!i) return;
|
|
16776
16969
|
let a = {
|
|
@@ -16779,8 +16972,8 @@ function ly(e = {}) {
|
|
|
16779
16972
|
todos: [],
|
|
16780
16973
|
memory: ""
|
|
16781
16974
|
};
|
|
16782
|
-
for (let r of
|
|
16783
|
-
let i = await l.get(
|
|
16975
|
+
for (let r of ey) {
|
|
16976
|
+
let i = await l.get(ry(t, e, n, r));
|
|
16784
16977
|
i != null && (a[r] = i);
|
|
16785
16978
|
}
|
|
16786
16979
|
return i.lastAccessed = Date.now(), await l.set(r, i), a;
|
|
@@ -16788,7 +16981,7 @@ function ly(e = {}) {
|
|
|
16788
16981
|
},
|
|
16789
16982
|
async save(e, t, n) {
|
|
16790
16983
|
let r = [];
|
|
16791
|
-
for (let i of
|
|
16984
|
+
for (let i of ey) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
|
|
16792
16985
|
await Promise.all(r);
|
|
16793
16986
|
},
|
|
16794
16987
|
async flush() {
|
|
@@ -16802,10 +16995,10 @@ function ly(e = {}) {
|
|
|
16802
16995
|
})), c({ type: "flush" }), await b();
|
|
16803
16996
|
},
|
|
16804
16997
|
async deleteSession(e, n) {
|
|
16805
|
-
await l.clearPrefix(
|
|
16998
|
+
await l.clearPrefix(iy(t, e, n));
|
|
16806
16999
|
},
|
|
16807
17000
|
async createSession(e, n, r) {
|
|
16808
|
-
let i = r ??
|
|
17001
|
+
let i = r ?? Wv(), a = Date.now(), o = {
|
|
16809
17002
|
agentId: e,
|
|
16810
17003
|
sessionId: i,
|
|
16811
17004
|
createdAt: a,
|
|
@@ -16813,7 +17006,7 @@ function ly(e = {}) {
|
|
|
16813
17006
|
bytes: 0,
|
|
16814
17007
|
title: n
|
|
16815
17008
|
};
|
|
16816
|
-
return await l.set(
|
|
17009
|
+
return await l.set(ry(t, e, i, Qv), o), i;
|
|
16817
17010
|
},
|
|
16818
17011
|
onEvent(e) {
|
|
16819
17012
|
s.add(e);
|
|
@@ -16828,34 +17021,34 @@ function ly(e = {}) {
|
|
|
16828
17021
|
}
|
|
16829
17022
|
//#endregion
|
|
16830
17023
|
//#region src/core/sdk/createChatSdk.ts
|
|
16831
|
-
var
|
|
16832
|
-
"
|
|
16833
|
-
"所有写操作都经范围控制(
|
|
17024
|
+
var hy = [
|
|
17025
|
+
"你是一个 JSON 操作助手。集成方声明了一个主数据对象(含 zod schema 校验),你通过专用工具安全地读写它来完成任务。",
|
|
17026
|
+
"所有写操作都经范围控制(仅 schema 声明字段内)与 schema 校验(不合法会返回结构化错误而非写入),并自动留快照可回退。",
|
|
16834
17027
|
"大对象/数组优先用增量 patch(只发改动)而非整体重传,避免输出被截断。",
|
|
16835
|
-
|
|
17028
|
+
L_.reliableWriteRules
|
|
16836
17029
|
].join("\n\n");
|
|
16837
|
-
function
|
|
17030
|
+
function gy(e) {
|
|
16838
17031
|
if (!e) return "";
|
|
16839
|
-
let t =
|
|
17032
|
+
let t = R_(e.schema);
|
|
16840
17033
|
return `\n\n## 可操作数据(字段以 read 工具返回的实际值为准)\n${e.description ? e.description + "\n" : ""}${t}`;
|
|
16841
17034
|
}
|
|
16842
|
-
var
|
|
16843
|
-
function
|
|
16844
|
-
return e === void 0 || e === !1 ? null : typeof e == "string" ?
|
|
17035
|
+
var _y = 50;
|
|
17036
|
+
function vy(e) {
|
|
17037
|
+
return e === void 0 || e === !1 ? null : typeof e == "string" ? my({ backend: e }) : e.enabled === !1 ? null : my(e);
|
|
16845
17038
|
}
|
|
16846
|
-
function
|
|
17039
|
+
function yy(e) {
|
|
16847
17040
|
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
16848
17041
|
}
|
|
16849
|
-
var
|
|
16850
|
-
function
|
|
17042
|
+
var by = /* @__PURE__ */ new Map();
|
|
17043
|
+
function xy(e) {
|
|
16851
17044
|
let t = e.content;
|
|
16852
17045
|
return typeof t == "string" ? t : Array.isArray(t) ? t.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(t ?? "");
|
|
16853
17046
|
}
|
|
16854
|
-
function
|
|
17047
|
+
function Sy(e) {
|
|
16855
17048
|
let t = e.summaryLlm ?? e.llm;
|
|
16856
17049
|
if (!t) return;
|
|
16857
17050
|
let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, o = e.summaryTimeoutMs ?? 15e3, c;
|
|
16858
|
-
if (
|
|
17051
|
+
if (yy(t)) c = t;
|
|
16859
17052
|
else {
|
|
16860
17053
|
let i = t;
|
|
16861
17054
|
if (!i.apiKey) {
|
|
@@ -16873,20 +17066,20 @@ function _y(e) {
|
|
|
16873
17066
|
return async (e) => {
|
|
16874
17067
|
let t = new AbortController(), n = setTimeout(() => t.abort(), o);
|
|
16875
17068
|
try {
|
|
16876
|
-
return
|
|
17069
|
+
return xy(await c.invoke([new a("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new i(e)], { signal: t.signal })).trim();
|
|
16877
17070
|
} finally {
|
|
16878
17071
|
clearTimeout(n);
|
|
16879
17072
|
}
|
|
16880
17073
|
};
|
|
16881
17074
|
}
|
|
16882
|
-
function
|
|
17075
|
+
function Cy(e, t) {
|
|
16883
17076
|
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;
|
|
16884
17077
|
}
|
|
16885
|
-
function
|
|
17078
|
+
function wy(e, t, n) {
|
|
16886
17079
|
return {
|
|
16887
17080
|
name: "sdk-events",
|
|
16888
17081
|
wrapToolCall: async (t, r) => {
|
|
16889
|
-
let i = await r(t), a =
|
|
17082
|
+
let i = await r(t), a = Cy(t.name, t.args);
|
|
16890
17083
|
return a && e({
|
|
16891
17084
|
type: "data_change",
|
|
16892
17085
|
operation: a,
|
|
@@ -16901,7 +17094,7 @@ function yy(e, t, n) {
|
|
|
16901
17094
|
}
|
|
16902
17095
|
};
|
|
16903
17096
|
}
|
|
16904
|
-
function
|
|
17097
|
+
function Ty(e, r) {
|
|
16905
17098
|
let i = /* @__PURE__ */ fn(null), a = 0;
|
|
16906
17099
|
function o(e) {
|
|
16907
17100
|
return new Promise((t) => {
|
|
@@ -16922,17 +17115,17 @@ function by(e, r) {
|
|
|
16922
17115
|
let t = i.value;
|
|
16923
17116
|
t && (i.value = null, t.resolve({ action: e }));
|
|
16924
17117
|
}
|
|
16925
|
-
let c =
|
|
17118
|
+
let c = vy(e.storage);
|
|
16926
17119
|
e.debug && c && c.onEvent((e) => console.log("[page-agent-sdk][storage]", e));
|
|
16927
|
-
let l =
|
|
17120
|
+
let l = yy(e.llm) ? void 0 : e.llm, u = ng({
|
|
16928
17121
|
model: l?.model,
|
|
16929
17122
|
contextWindow: e.contextWindow ?? l?.contextWindow,
|
|
16930
17123
|
maxOutputTokens: e.maxOutputTokens ?? l?.maxOutputTokens
|
|
16931
17124
|
});
|
|
16932
17125
|
e.debug && console.log("[page-agent-sdk][modelCaps]", u);
|
|
16933
|
-
let d =
|
|
17126
|
+
let d = Sy(e);
|
|
16934
17127
|
e.debug && !d && console.warn("[page-agent-sdk][summarization] 未构造 llmInvoke(apiKey 缺失?),摘要回退零成本索引摘要");
|
|
16935
|
-
let f = /* @__PURE__ */ Qt([]), p =
|
|
17128
|
+
let f = /* @__PURE__ */ Qt([]), p = G_(e.vfs?.initialFiles, {
|
|
16936
17129
|
persist: c ? { save: (e) => {
|
|
16937
17130
|
B.sessionId && c && c.save(r, B.sessionId, { vfs: e });
|
|
16938
17131
|
} } : void 0,
|
|
@@ -16941,19 +17134,20 @@ function by(e, r) {
|
|
|
16941
17134
|
...e.data,
|
|
16942
17135
|
description: e.data.description ?? "主数据对象"
|
|
16943
17136
|
} : void 0, v = e.checkpoint, y = v !== void 0 && v !== !1, b = y ? qg({
|
|
17137
|
+
getData: () => O()?.bind,
|
|
16944
17138
|
slotPaths: _ ? [""] : [],
|
|
16945
17139
|
vfsStore: p,
|
|
16946
17140
|
todosMw: m,
|
|
16947
17141
|
getTodos: () => g.current?.getState?.()?.todos ?? [],
|
|
16948
17142
|
messages: f,
|
|
16949
17143
|
maxCheckpoints: v && typeof v == "object" ? v.maxCheckpoints : void 0
|
|
16950
|
-
}) : null, x = !v || typeof v != "object" || v.auto !== !1, S = e.capabilities, C = S?.dataOps !== !1, w = (e.systemPrompt ??
|
|
17144
|
+
}) : null, x = !v || typeof v != "object" || v.auto !== !1, S = e.capabilities, C = S?.dataOps !== !1, w = (e.systemPrompt ?? hy) + gy(_), T = C && _ ? Iv(_, {
|
|
16951
17145
|
onAudit: e.debug ? (e) => console.log("[page-agent-sdk][data audit]", e) : void 0,
|
|
16952
17146
|
maxSnapshots: e.maxSnapshots,
|
|
16953
17147
|
onConflict: o,
|
|
16954
17148
|
autoLock: e.autoLock,
|
|
16955
17149
|
interceptors: e.interceptors
|
|
16956
|
-
}) : [], E = C ?
|
|
17150
|
+
}) : [], E = C ? Fv(T, e.toolMode) : [], D = C && _ ? T.controller ?? null : null, O = () => D?.get() ?? _, k = /* @__PURE__ */ new Map(), A = Vv(S, E, Rv);
|
|
16957
17151
|
A.forEach((e) => k.set(e.name, "builtin"));
|
|
16958
17152
|
let j = [...e.tools || []];
|
|
16959
17153
|
j.forEach((e) => k.set(e.name, "user"));
|
|
@@ -16961,10 +17155,10 @@ function by(e, r) {
|
|
|
16961
17155
|
N && k.set(Lg, "builtin");
|
|
16962
17156
|
let P = y && b ? [n(async () => {
|
|
16963
17157
|
let e = b.list();
|
|
16964
|
-
return e.length ? b.restore() ? `已回退到最近一次正常状态(checkpoint #${e[e.length - 1].id})
|
|
17158
|
+
return e.length ? b.restore() ? `已回退到最近一次正常状态(checkpoint #${e[e.length - 1].id})。对话历史、主数据、vfs、todos 已整体还原。请基于回退后的状态重新判断并继续。` : "回退失败:无可用 checkpoint。" : "无可用 checkpoint,无法回退。";
|
|
16965
17159
|
}, {
|
|
16966
17160
|
name: "restore_last_checkpoint",
|
|
16967
|
-
description: "回退到最近一次正常状态(整体还原对话历史 +
|
|
17161
|
+
description: "回退到最近一次正常状态(整体还原对话历史 + 主数据 + vfs + todos)。当本轮操作出错、页面被改坏、或走偏时调用,回到本轮起点重新来过。不传参数即回退最近一次。",
|
|
16968
17162
|
schema: t.object({}).optional()
|
|
16969
17163
|
}), n(async () => {
|
|
16970
17164
|
let e = b.list();
|
|
@@ -17003,12 +17197,15 @@ function by(e, r) {
|
|
|
17003
17197
|
"read",
|
|
17004
17198
|
"fetch_document"
|
|
17005
17199
|
], le = F.filter((e) => ce.includes(e.name)), ue = re ? o_({
|
|
17006
|
-
check: e.verify.check ?? f_({
|
|
17200
|
+
check: e.verify.check ?? f_({
|
|
17201
|
+
schemas: () => O() ? { "": O().schema } : {},
|
|
17202
|
+
root: () => O()?.bind
|
|
17203
|
+
}),
|
|
17007
17204
|
adversarial: e.verify?.adversarial ? {
|
|
17008
17205
|
llm: e.llm,
|
|
17009
17206
|
tools: le
|
|
17010
17207
|
} : void 0
|
|
17011
|
-
}) : void 0, de =
|
|
17208
|
+
}) : void 0, de = Uv({
|
|
17012
17209
|
...S,
|
|
17013
17210
|
humanConfirm: M,
|
|
17014
17211
|
subagents: e.subagents?.map((e) => ({
|
|
@@ -17029,14 +17226,11 @@ function by(e, r) {
|
|
|
17029
17226
|
de,
|
|
17030
17227
|
...I ? [m] : [],
|
|
17031
17228
|
...L ? [kg(e.skills || [], { readVfs: ee ? (e) => p.files[e]?.content : void 0 })] : [],
|
|
17032
|
-
...ee ? [
|
|
17033
|
-
...R ? [
|
|
17034
|
-
...
|
|
17229
|
+
...ee ? [Q_(p)] : [],
|
|
17230
|
+
...R ? [F_({
|
|
17231
|
+
...B_(e, u.contextWindow),
|
|
17035
17232
|
llmInvoke: d,
|
|
17036
|
-
|
|
17037
|
-
path: "",
|
|
17038
|
-
description: O().description ?? "主数据对象"
|
|
17039
|
-
}] : [],
|
|
17233
|
+
getRegisteredData: () => O() ? [{ description: O().description ?? "主数据对象" }] : [],
|
|
17040
17234
|
preserveLastToolResults: (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? ["describe_data", "read"]
|
|
17041
17235
|
})] : [],
|
|
17042
17236
|
...z ? [h] : [],
|
|
@@ -17048,8 +17242,8 @@ function by(e, r) {
|
|
|
17048
17242
|
...oe ? [oe] : [],
|
|
17049
17243
|
...se ? [se] : [],
|
|
17050
17244
|
...e.middleware || [],
|
|
17051
|
-
|
|
17052
|
-
], ge = e.maxMemoryRounds ??
|
|
17245
|
+
wy(me, f, O)
|
|
17246
|
+
], ge = e.maxMemoryRounds ?? _y, B = {
|
|
17053
17247
|
agentId: r,
|
|
17054
17248
|
store: c,
|
|
17055
17249
|
messages: f,
|
|
@@ -17124,14 +17318,14 @@ function by(e, r) {
|
|
|
17124
17318
|
if (B.refCount--, B.refCount <= 0) {
|
|
17125
17319
|
c && (p.flush?.(), c.flush(), c.dispose());
|
|
17126
17320
|
let e = B.mcpClosers.splice(0);
|
|
17127
|
-
e.length && Promise.allSettled(e.map((e) => e())),
|
|
17321
|
+
e.length && Promise.allSettled(e.map((e) => e())), by.delete(r);
|
|
17128
17322
|
}
|
|
17129
17323
|
},
|
|
17130
17324
|
resolveConflict: s,
|
|
17131
17325
|
getInfo() {
|
|
17132
17326
|
return {
|
|
17133
17327
|
id: r,
|
|
17134
|
-
model:
|
|
17328
|
+
model: yy(e.llm) ? e.llm.model ?? e.llm.modelName : e.llm.model,
|
|
17135
17329
|
systemPrompt: w,
|
|
17136
17330
|
tools: F.map((e) => ({
|
|
17137
17331
|
name: e.name,
|
|
@@ -17218,7 +17412,7 @@ function by(e, r) {
|
|
|
17218
17412
|
}), F.push(...n), e.debug && console.log(`[page-agent-sdk][mcp] 注入 ${n.length} 个工具,${B.mcpServers.length} 个 server`);
|
|
17219
17413
|
}
|
|
17220
17414
|
B.agent = bg({
|
|
17221
|
-
...
|
|
17415
|
+
...yy(e.llm) ? { llm: e.llm } : {
|
|
17222
17416
|
apiKey: e.llm.apiKey,
|
|
17223
17417
|
baseUrl: e.llm.baseUrl,
|
|
17224
17418
|
model: e.llm.model,
|
|
@@ -17238,11 +17432,11 @@ function by(e, r) {
|
|
|
17238
17432
|
}), g.current = B.agent;
|
|
17239
17433
|
})(), B;
|
|
17240
17434
|
}
|
|
17241
|
-
function
|
|
17242
|
-
let t = e.id ??
|
|
17435
|
+
function Ey(e) {
|
|
17436
|
+
let t = e.id ?? Wv();
|
|
17243
17437
|
e.id || console.warn(`[page-agent-sdk] 未传 options.id,已生成随机 id "${t}"。刷新后持久化数据无法恢复,请传稳定 id。`);
|
|
17244
|
-
let n = e.streaming ?? !0, r = e.ui ?? "default", i, a = e.shareContext ?
|
|
17245
|
-
a ? i = a : (i =
|
|
17438
|
+
let n = e.streaming ?? !0, r = e.ui ?? "default", i, a = e.shareContext ? by.get(t) : void 0;
|
|
17439
|
+
a ? i = a : (i = Ty(e, t), e.shareContext && by.set(t, i)), i.refCount++;
|
|
17246
17440
|
let o = null, s = null, c = null;
|
|
17247
17441
|
async function l() {
|
|
17248
17442
|
if (await i.initDone, r === !1) {
|
|
@@ -17277,7 +17471,7 @@ function xy(e) {
|
|
|
17277
17471
|
i.afterRound(), i.store && await i.store.flush();
|
|
17278
17472
|
},
|
|
17279
17473
|
onClear: () => {
|
|
17280
|
-
i.store && (i.sessionId =
|
|
17474
|
+
i.store && (i.sessionId = Wv(), i.vfsStore.clear?.(), i.todosMw.reset([]), e.memory || i.memoryMw.reset(""), i.agent.debugLogs.value = [], i.store.createSession(i.agentId, e.session?.title, i.sessionId));
|
|
17281
17475
|
},
|
|
17282
17476
|
pendingConflict: i.pendingConflict.value,
|
|
17283
17477
|
onResolveConflict: (e) => i.resolveConflict(e)
|
|
@@ -17316,7 +17510,7 @@ function xy(e) {
|
|
|
17316
17510
|
}
|
|
17317
17511
|
//#endregion
|
|
17318
17512
|
//#region src/core/sdk/defineTool.ts
|
|
17319
|
-
function
|
|
17513
|
+
function Dy(e) {
|
|
17320
17514
|
return n(async (t) => {
|
|
17321
17515
|
let n = await e.handler(t);
|
|
17322
17516
|
return typeof n == "string" ? n : JSON.stringify(n);
|
|
@@ -17327,4 +17521,4 @@ function Sy(e) {
|
|
|
17327
17521
|
});
|
|
17328
17522
|
}
|
|
17329
17523
|
//#endregion
|
|
17330
|
-
export {
|
|
17524
|
+
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, Ey as createChatSdk, qg as createCheckpointManager, Jg as createCheckpointMiddleware, Iv as createDataOps, Bg as createHumanConfirmMiddleware, zg as createHumanConfirmTool, uy as createMemoryBackend, my as createSessionStore, n_ as createSubagentMiddleware, a_ as createSubagentsMiddleware, Uv as createUsageHintsMiddleware, o_ as createVerifyMiddleware, G_ as createVfs, fy as createWebStorageBackend, f_ as createWriteBackCheck, Bv as defineDataToolset, Cg as defineSkill, Dy as defineTool, hg as detectGarbledToolCall, rg as estimateTokens, R_ as extractSchemaHint, y_ as extractText, Rv as fetchDocTools, zv as fetchTools, Fv as filterByToolMode, V_ as formatZodIssues, ny as isQuotaError, cv as jpEval, U_ as jsonParseError, ag as offloadPassThroughChars, ig as offloadThresholdChars, I_ as presets, B_ as resolveContextOptions, ng as resolveModelCaps, pv as runSandboxedScript, uv as searchJson, Vv as selectBuiltinTools, L_ as systemPromptHelpers, $ as toolError, xl as useChat, e as z, H_ as zodError };
|