page-agent-sdk 2.4.1 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/README.zh-CN.md +3 -2
- package/dist/page-agent-sdk.iife.js +118 -118
- package/dist/page-agent-sdk.js +585 -401
- package/dist/page-agent-sdk.umd.cjs +33 -33
- package/package.json +1 -1
package/dist/page-agent-sdk.js
CHANGED
|
@@ -15017,7 +15017,18 @@ function P_(e = {}) {
|
|
|
15017
15017
|
...e
|
|
15018
15018
|
};
|
|
15019
15019
|
async function n(e) {
|
|
15020
|
-
let n = C_(e), r = e.length, i =
|
|
15020
|
+
let n = C_(e), r = e.length, i = "";
|
|
15021
|
+
if (n.length) {
|
|
15022
|
+
let t = n[0].startIdx;
|
|
15023
|
+
for (let n = 0; n < t; n++) {
|
|
15024
|
+
let t = e[n];
|
|
15025
|
+
if (t.role === "system" && typeof t.content == "string" && t.content.startsWith("【更早对话摘要")) {
|
|
15026
|
+
i = t.content.replace(/^【[^】]*】\n?/, "");
|
|
15027
|
+
break;
|
|
15028
|
+
}
|
|
15029
|
+
}
|
|
15030
|
+
}
|
|
15031
|
+
let a = (t) => ({
|
|
15021
15032
|
messages: e,
|
|
15022
15033
|
stats: {
|
|
15023
15034
|
triggered: !1,
|
|
@@ -15028,82 +15039,66 @@ function P_(e = {}) {
|
|
|
15028
15039
|
compressedMessages: r,
|
|
15029
15040
|
strategy: t
|
|
15030
15041
|
}
|
|
15031
|
-
}),
|
|
15042
|
+
}), o, s, c;
|
|
15032
15043
|
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,
|
|
15044
|
+
if (n.reduce((e, t) => e + j_(t), 0) <= t.contextWindow * (t.summaryThresholdRatio ?? .5)) return a("none");
|
|
15045
|
+
let e = t.contextWindow * (t.windowRatio ?? .4), r = 0, i = 0;
|
|
15035
15046
|
for (let t = n.length - 1; t >= 0; t--) if (r += j_(n[t]), r >= e) {
|
|
15036
|
-
|
|
15047
|
+
i = t + 1;
|
|
15037
15048
|
break;
|
|
15038
15049
|
}
|
|
15039
|
-
if (
|
|
15040
|
-
|
|
15050
|
+
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");
|
|
15051
|
+
c = "token-window+";
|
|
15041
15052
|
} else {
|
|
15042
|
-
if (n.length <= t.summaryThresholdRounds) return
|
|
15053
|
+
if (n.length <= t.summaryThresholdRounds) return a("none");
|
|
15043
15054
|
let e = Math.min(t.windowRounds, n.length);
|
|
15044
|
-
|
|
15055
|
+
o = n.slice(n.length - e), s = n.slice(0, n.length - e), c = "window+";
|
|
15045
15056
|
}
|
|
15046
|
-
let
|
|
15057
|
+
let l = [...e].reverse().find((e) => e.role === "user")?.content || "", u = t.preserveLastToolResults?.length ? new Set(t.preserveLastToolResults) : void 0, d, f;
|
|
15047
15058
|
if (t.enableLLMSummary && t.llmInvoke) try {
|
|
15048
|
-
|
|
15059
|
+
d = await t.llmInvoke(M_(s, u)), f = c + "llm_summary";
|
|
15049
15060
|
} catch {
|
|
15050
|
-
|
|
15051
|
-
}
|
|
15052
|
-
else
|
|
15053
|
-
let
|
|
15054
|
-
|
|
15055
|
-
|
|
15061
|
+
d = M_(s, u), f = c + "index_summary(llm_fallback)";
|
|
15062
|
+
}
|
|
15063
|
+
else d = M_(s, u), f = c + "index_summary";
|
|
15064
|
+
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];
|
|
15065
|
+
m && g.push("\n【与当前问题可能相关的早期对话】", m);
|
|
15066
|
+
let _ = t.getRegisteredData ?? t.getRegisteredSlots;
|
|
15067
|
+
if (_) try {
|
|
15068
|
+
let e = _();
|
|
15056
15069
|
if (e.length) {
|
|
15057
15070
|
let t = e.map((e) => `- ${e.path ? e.path + ": " : ""}${e.description}`).join("\n");
|
|
15058
|
-
|
|
15071
|
+
g.push("\n【当前可操作数据(动态增删后的最新状态,操作前以 describe_data / read 为准)】", t);
|
|
15059
15072
|
}
|
|
15060
15073
|
} catch {}
|
|
15061
|
-
let
|
|
15074
|
+
let v = {
|
|
15062
15075
|
role: "system",
|
|
15063
|
-
content:
|
|
15076
|
+
content: g.join("\n"),
|
|
15064
15077
|
timestamp: Date.now()
|
|
15065
|
-
},
|
|
15066
|
-
for (let e of
|
|
15067
|
-
let
|
|
15078
|
+
}, y = [];
|
|
15079
|
+
for (let e of o) y.push(e.userMsg), y.push(...e.assistantMsgs);
|
|
15080
|
+
let b = [v, ...y];
|
|
15068
15081
|
return {
|
|
15069
|
-
messages:
|
|
15082
|
+
messages: b,
|
|
15070
15083
|
stats: {
|
|
15071
15084
|
triggered: !0,
|
|
15072
15085
|
roundsTotal: n.length,
|
|
15073
|
-
roundsSummarized:
|
|
15074
|
-
roundsRecalled:
|
|
15086
|
+
roundsSummarized: s.length,
|
|
15087
|
+
roundsRecalled: p.length,
|
|
15075
15088
|
originalMessages: r,
|
|
15076
|
-
compressedMessages:
|
|
15077
|
-
strategy:
|
|
15089
|
+
compressedMessages: b.length,
|
|
15090
|
+
strategy: f
|
|
15078
15091
|
}
|
|
15079
15092
|
};
|
|
15080
15093
|
}
|
|
15081
15094
|
return {
|
|
15082
15095
|
compress: n,
|
|
15083
|
-
config: t
|
|
15084
|
-
trimToolResults: F_
|
|
15096
|
+
config: t
|
|
15085
15097
|
};
|
|
15086
15098
|
}
|
|
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
15099
|
//#endregion
|
|
15105
15100
|
//#region src/core/harness/summarization.ts
|
|
15106
|
-
function
|
|
15101
|
+
function F_(e = {}) {
|
|
15107
15102
|
let t = P_(e);
|
|
15108
15103
|
return {
|
|
15109
15104
|
name: "summarization",
|
|
@@ -15118,7 +15113,7 @@ function I_(e = {}) {
|
|
|
15118
15113
|
}
|
|
15119
15114
|
//#endregion
|
|
15120
15115
|
//#region src/core/presets.ts
|
|
15121
|
-
var
|
|
15116
|
+
var I_ = {
|
|
15122
15117
|
pageBuilder: { systemPrompt: "你是页面构建助手。按用户意图读写主数据(经 data 声明 + schema 校验),改完页面实时更新。" },
|
|
15123
15118
|
researcher: {
|
|
15124
15119
|
systemPrompt: "你是调研助手。多路调研用 spawn_agents 并行委派子 agent(各负责一个方向);单份资料用 fetch_document 抓取;最后结构化汇总,给出结论与依据。",
|
|
@@ -15132,7 +15127,7 @@ var L_ = {
|
|
|
15132
15127
|
memory: !1,
|
|
15133
15128
|
subagent: !1
|
|
15134
15129
|
} }
|
|
15135
|
-
},
|
|
15130
|
+
}, L_ = { reliableWriteRules: [
|
|
15136
15131
|
"【可靠写入规则】",
|
|
15137
15132
|
"1. 改任何属性前,先用 read({ path }) 读其当前真实值,基于真实值改,不要凭记忆;",
|
|
15138
15133
|
"2. 若不确定可操作哪些属性,先 read() 不传 path 查看当前注册项(动态组件场景下注册表会增删,以工具返回为准,勿凭旧记忆);",
|
|
@@ -15140,7 +15135,7 @@ var L_ = {
|
|
|
15140
15135
|
"4. 写入若被 schema 校验拒绝(返回结构化错误含字段名与期望类型),按错误修正后重试,不要放弃;",
|
|
15141
15136
|
"5. 优先用 write 的 patch 增量改(只发改动,如 write({ path, value, patch:{ op, jsonPath } })),避免整体重传大 JSON 被截断。"
|
|
15142
15137
|
].join("\n") };
|
|
15143
|
-
function
|
|
15138
|
+
function R_(e) {
|
|
15144
15139
|
if (!e) return "";
|
|
15145
15140
|
try {
|
|
15146
15141
|
let t = e.shape ?? (e._def?.shape ? typeof e._def.shape == "function" ? e._def.shape() : e._def.shape : null);
|
|
@@ -15153,7 +15148,7 @@ function z_(e) {
|
|
|
15153
15148
|
}
|
|
15154
15149
|
//#endregion
|
|
15155
15150
|
//#region src/core/sdk/contextPreset.ts
|
|
15156
|
-
var
|
|
15151
|
+
var z_ = {
|
|
15157
15152
|
auto: {
|
|
15158
15153
|
summaryThresholdRatio: .5,
|
|
15159
15154
|
windowRatio: .4,
|
|
@@ -15175,8 +15170,8 @@ var B_ = {
|
|
|
15175
15170
|
enableLLMSummary: !0
|
|
15176
15171
|
}
|
|
15177
15172
|
};
|
|
15178
|
-
function
|
|
15179
|
-
let n =
|
|
15173
|
+
function B_(e, t) {
|
|
15174
|
+
let n = z_[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
|
|
15180
15175
|
return {
|
|
15181
15176
|
...n,
|
|
15182
15177
|
...r,
|
|
@@ -15193,7 +15188,7 @@ function $(e) {
|
|
|
15193
15188
|
};
|
|
15194
15189
|
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
15190
|
}
|
|
15196
|
-
function
|
|
15191
|
+
function V_(e) {
|
|
15197
15192
|
return e.slice(0, 10).map((e) => {
|
|
15198
15193
|
let t = e, n = {
|
|
15199
15194
|
path: (Array.isArray(t.path) ? t.path.join(".") : String(t.path ?? "")) || "(root)",
|
|
@@ -15202,16 +15197,16 @@ function H_(e) {
|
|
|
15202
15197
|
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
15198
|
});
|
|
15204
15199
|
}
|
|
15205
|
-
function
|
|
15200
|
+
function H_(e, t) {
|
|
15206
15201
|
return $({
|
|
15207
15202
|
code: "SCHEMA_INVALID",
|
|
15208
15203
|
path: e,
|
|
15209
15204
|
message: `值不符合 "${e}" 的 schema(${t.length} 处问题)`,
|
|
15210
15205
|
hint: `用 read({jsonPath:"${e}"}) 查看当前值,按 describe_data() 查看主数据 schema,修正后重试;改大对象优先用 write 的 patch 增量(只发改动部分)`,
|
|
15211
|
-
details:
|
|
15206
|
+
details: V_(t)
|
|
15212
15207
|
});
|
|
15213
15208
|
}
|
|
15214
|
-
function
|
|
15209
|
+
function U_(e, t, n) {
|
|
15215
15210
|
let r = n?.message || String(n);
|
|
15216
15211
|
return $({
|
|
15217
15212
|
code: "JSON_PARSE",
|
|
@@ -15220,18 +15215,18 @@ function W_(e, t, n) {
|
|
|
15220
15215
|
hint: `检查引号/逗号/括号是否闭合;字符串值需双引号包裹(如 '"dark"' 表示字符串 dark,数字直接写如 5);预览前 80 字符:${t.slice(0, 80)}`
|
|
15221
15216
|
});
|
|
15222
15217
|
}
|
|
15223
|
-
var
|
|
15224
|
-
function
|
|
15218
|
+
var W_ = .9;
|
|
15219
|
+
function G_(e, t = {}) {
|
|
15225
15220
|
let n = Object.create(null);
|
|
15226
|
-
if (e) for (let [t, r] of Object.entries(e)) n[
|
|
15221
|
+
if (e) for (let [t, r] of Object.entries(e)) n[J_(t)] = {
|
|
15227
15222
|
content: r,
|
|
15228
|
-
updatedAt:
|
|
15223
|
+
updatedAt: X_()
|
|
15229
15224
|
};
|
|
15230
15225
|
let { persist: r } = t, i = t.maxBytes ?? 4194304;
|
|
15231
15226
|
function a() {
|
|
15232
|
-
if (
|
|
15233
|
-
let e = i *
|
|
15234
|
-
for (let [r] of t) if (delete n[r],
|
|
15227
|
+
if (q_(n) <= i) return;
|
|
15228
|
+
let e = i * W_, t = Object.entries(n).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
|
|
15229
|
+
for (let [r] of t) if (delete n[r], q_(n) <= e) break;
|
|
15235
15230
|
}
|
|
15236
15231
|
let o = null;
|
|
15237
15232
|
function s() {
|
|
@@ -15256,7 +15251,7 @@ function K_(e, t = {}) {
|
|
|
15256
15251
|
}
|
|
15257
15252
|
}) };
|
|
15258
15253
|
return r && (l.hydrate = (e) => {
|
|
15259
|
-
for (let [t, r] of Object.entries(e)) n[
|
|
15254
|
+
for (let [t, r] of Object.entries(e)) n[J_(t)] = r;
|
|
15260
15255
|
a();
|
|
15261
15256
|
}, l.flush = () => {
|
|
15262
15257
|
o &&= (clearTimeout(o), null), s();
|
|
@@ -15265,17 +15260,17 @@ function K_(e, t = {}) {
|
|
|
15265
15260
|
c();
|
|
15266
15261
|
}), l;
|
|
15267
15262
|
}
|
|
15268
|
-
var
|
|
15269
|
-
function
|
|
15270
|
-
|
|
15263
|
+
var K_ = null;
|
|
15264
|
+
function q_(e) {
|
|
15265
|
+
K_ ||= new TextEncoder();
|
|
15271
15266
|
let t = 0;
|
|
15272
|
-
for (let n of Object.values(e)) t +=
|
|
15267
|
+
for (let n of Object.values(e)) t += K_.encode(n.content).length;
|
|
15273
15268
|
return t;
|
|
15274
15269
|
}
|
|
15275
|
-
function
|
|
15270
|
+
function J_(e) {
|
|
15276
15271
|
return e.replace(/^\/+/, "").replace(/\/+/g, "/");
|
|
15277
15272
|
}
|
|
15278
|
-
function
|
|
15273
|
+
function Y_(e) {
|
|
15279
15274
|
let t = "";
|
|
15280
15275
|
for (let n = 0; n < e.length; n++) {
|
|
15281
15276
|
let r = e[n];
|
|
@@ -15283,13 +15278,13 @@ function X_(e) {
|
|
|
15283
15278
|
}
|
|
15284
15279
|
return RegExp("^" + t + "$");
|
|
15285
15280
|
}
|
|
15286
|
-
function
|
|
15281
|
+
function X_() {
|
|
15287
15282
|
return Date.now();
|
|
15288
15283
|
}
|
|
15289
|
-
function
|
|
15284
|
+
function Z_(e) {
|
|
15290
15285
|
return [
|
|
15291
15286
|
n(async ({ path: t, offset: n, limit: r }) => {
|
|
15292
|
-
let i = e.files[
|
|
15287
|
+
let i = e.files[J_(t)];
|
|
15293
15288
|
if (!i) return $({
|
|
15294
15289
|
code: "NOT_FOUND",
|
|
15295
15290
|
path: t,
|
|
@@ -15307,9 +15302,9 @@ function Q_(e) {
|
|
|
15307
15302
|
limit: t.number().int().min(1).default(2e3).describe("读取行数")
|
|
15308
15303
|
})
|
|
15309
15304
|
}),
|
|
15310
|
-
n(async ({ path: t, content: n }) => (e.files[
|
|
15305
|
+
n(async ({ path: t, content: n }) => (e.files[J_(t)] = {
|
|
15311
15306
|
content: n,
|
|
15312
|
-
updatedAt:
|
|
15307
|
+
updatedAt: X_()
|
|
15313
15308
|
}, `已写入 ${t}(${n.length} 字符)`), {
|
|
15314
15309
|
name: "vfs_write",
|
|
15315
15310
|
description: "写入/覆盖虚拟工作区文件,作为中间工作记忆。",
|
|
@@ -15319,7 +15314,7 @@ function Q_(e) {
|
|
|
15319
15314
|
})
|
|
15320
15315
|
}),
|
|
15321
15316
|
n(async ({ path: t, oldString: n, newString: r }) => {
|
|
15322
|
-
let i =
|
|
15317
|
+
let i = J_(t), a = e.files[i];
|
|
15323
15318
|
if (!a) return $({
|
|
15324
15319
|
code: "NOT_FOUND",
|
|
15325
15320
|
path: t,
|
|
@@ -15349,7 +15344,7 @@ function Q_(e) {
|
|
|
15349
15344
|
}
|
|
15350
15345
|
return e.files[i] = {
|
|
15351
15346
|
content: a.content.replace(n, r),
|
|
15352
|
-
updatedAt:
|
|
15347
|
+
updatedAt: X_()
|
|
15353
15348
|
}, `已替换 ${t} 中 1 处。`;
|
|
15354
15349
|
}, {
|
|
15355
15350
|
name: "vfs_edit",
|
|
@@ -15371,7 +15366,7 @@ function Q_(e) {
|
|
|
15371
15366
|
n(async ({ pattern: t }) => {
|
|
15372
15367
|
let n;
|
|
15373
15368
|
try {
|
|
15374
|
-
n =
|
|
15369
|
+
n = Y_(t);
|
|
15375
15370
|
} catch (e) {
|
|
15376
15371
|
return $({
|
|
15377
15372
|
code: "GLOB_INVALID",
|
|
@@ -15400,7 +15395,7 @@ function Q_(e) {
|
|
|
15400
15395
|
details: { pattern: t }
|
|
15401
15396
|
});
|
|
15402
15397
|
}
|
|
15403
|
-
let i = n ? [
|
|
15398
|
+
let i = n ? [J_(n)] : Object.keys(e.files), a = [];
|
|
15404
15399
|
for (let t of i) {
|
|
15405
15400
|
let n = e.files[t];
|
|
15406
15401
|
n && n.content.split("\n").forEach((e, n) => {
|
|
@@ -15418,17 +15413,17 @@ function Q_(e) {
|
|
|
15418
15413
|
})
|
|
15419
15414
|
];
|
|
15420
15415
|
}
|
|
15421
|
-
function
|
|
15416
|
+
function Q_(e) {
|
|
15422
15417
|
return {
|
|
15423
15418
|
name: "vfs",
|
|
15424
|
-
tools:
|
|
15419
|
+
tools: Z_(e),
|
|
15425
15420
|
beforeAgent: () => ({ files: e.files })
|
|
15426
15421
|
};
|
|
15427
15422
|
}
|
|
15428
15423
|
//#endregion
|
|
15429
15424
|
//#region src/core/tools/dataSlotQuery.ts
|
|
15430
|
-
var
|
|
15431
|
-
function
|
|
15425
|
+
var $_ = /[\w$-]/;
|
|
15426
|
+
function ev(e) {
|
|
15432
15427
|
let t = [], n = e.trim(), r = +(n[0] === "$");
|
|
15433
15428
|
for (; r < n.length;) {
|
|
15434
15429
|
let e = n[r];
|
|
@@ -15439,7 +15434,7 @@ function tv(e) {
|
|
|
15439
15434
|
continue;
|
|
15440
15435
|
}
|
|
15441
15436
|
let e = "";
|
|
15442
|
-
for (; r < n.length &&
|
|
15437
|
+
for (; r < n.length && $_.test(n[r]);) e += n[r++];
|
|
15443
15438
|
if (!e) throw Error("JSONPath: .. 后缺属性名");
|
|
15444
15439
|
t.push({
|
|
15445
15440
|
type: "descendKey",
|
|
@@ -15452,7 +15447,7 @@ function tv(e) {
|
|
|
15452
15447
|
continue;
|
|
15453
15448
|
}
|
|
15454
15449
|
let e = "";
|
|
15455
|
-
for (; r < n.length &&
|
|
15450
|
+
for (; r < n.length && $_.test(n[r]);) e += n[r++];
|
|
15456
15451
|
if (!e) throw Error("JSONPath: . 后缺属性名");
|
|
15457
15452
|
t.push({
|
|
15458
15453
|
type: "key",
|
|
@@ -15508,7 +15503,7 @@ function tv(e) {
|
|
|
15508
15503
|
}
|
|
15509
15504
|
return t;
|
|
15510
15505
|
}
|
|
15511
|
-
function
|
|
15506
|
+
function tv(e) {
|
|
15512
15507
|
let t = [], n = 0, r = e.trim();
|
|
15513
15508
|
for (; n < r.length;) {
|
|
15514
15509
|
let e = r[n];
|
|
@@ -15553,7 +15548,7 @@ function nv(e) {
|
|
|
15553
15548
|
}
|
|
15554
15549
|
return t;
|
|
15555
15550
|
}
|
|
15556
|
-
var
|
|
15551
|
+
var nv = class {
|
|
15557
15552
|
toks;
|
|
15558
15553
|
item;
|
|
15559
15554
|
pos = 0;
|
|
@@ -15589,12 +15584,12 @@ var rv = class {
|
|
|
15589
15584
|
return this.next(), e;
|
|
15590
15585
|
}
|
|
15591
15586
|
let e = this.operand(), t = this.peek();
|
|
15592
|
-
return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(),
|
|
15587
|
+
return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), av(t, e, this.operand())) : rv(e);
|
|
15593
15588
|
}
|
|
15594
15589
|
operand() {
|
|
15595
15590
|
let e = this.next();
|
|
15596
15591
|
if (e === void 0) throw Error("过滤表达式:缺操作数");
|
|
15597
|
-
if (e.startsWith("@")) return
|
|
15592
|
+
if (e.startsWith("@")) return iv(e, this.item);
|
|
15598
15593
|
if (e[0] === "'" || e[0] === "\"") return e.slice(1, -1);
|
|
15599
15594
|
if (e === "true") return !0;
|
|
15600
15595
|
if (e === "false") return !1;
|
|
@@ -15604,10 +15599,10 @@ var rv = class {
|
|
|
15604
15599
|
throw Error(`过滤表达式:未知操作数 '${e}'`);
|
|
15605
15600
|
}
|
|
15606
15601
|
};
|
|
15607
|
-
function
|
|
15602
|
+
function rv(e) {
|
|
15608
15603
|
return !!e && e !== 0 && e !== "" && e !== null;
|
|
15609
15604
|
}
|
|
15610
|
-
function
|
|
15605
|
+
function iv(e, t) {
|
|
15611
15606
|
let n = e.split(".").filter((e) => e && e !== "@"), r = t;
|
|
15612
15607
|
for (let e of n) {
|
|
15613
15608
|
if (typeof r != "object" || !r) return;
|
|
@@ -15615,7 +15610,7 @@ function av(e, t) {
|
|
|
15615
15610
|
}
|
|
15616
15611
|
return r;
|
|
15617
15612
|
}
|
|
15618
|
-
function
|
|
15613
|
+
function av(e, t, n) {
|
|
15619
15614
|
switch (e) {
|
|
15620
15615
|
case "==": return t === n;
|
|
15621
15616
|
case "!=": return t !== n;
|
|
@@ -15626,47 +15621,47 @@ function ov(e, t, n) {
|
|
|
15626
15621
|
default: return !1;
|
|
15627
15622
|
}
|
|
15628
15623
|
}
|
|
15629
|
-
function
|
|
15630
|
-
return new
|
|
15624
|
+
function ov(e, t) {
|
|
15625
|
+
return new nv(tv(e), t).parse();
|
|
15631
15626
|
}
|
|
15632
|
-
function
|
|
15627
|
+
function sv(e, t) {
|
|
15633
15628
|
return e ? `${e}.${t}` : String(t);
|
|
15634
15629
|
}
|
|
15635
|
-
function
|
|
15630
|
+
function cv(e, t) {
|
|
15636
15631
|
let n = [{
|
|
15637
15632
|
path: "",
|
|
15638
15633
|
value: e
|
|
15639
15634
|
}];
|
|
15640
|
-
for (let e of
|
|
15635
|
+
for (let e of ev(t)) {
|
|
15641
15636
|
let t = [];
|
|
15642
15637
|
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:
|
|
15638
|
+
path: sv(r.path, e.key),
|
|
15644
15639
|
value: r.value[e.key]
|
|
15645
15640
|
});
|
|
15646
15641
|
else if (e.type === "index") {
|
|
15647
15642
|
for (let r of n) if (Array.isArray(r.value)) {
|
|
15648
15643
|
let n = r.value[e.index];
|
|
15649
15644
|
e.index >= 0 && e.index < r.value.length && t.push({
|
|
15650
|
-
path:
|
|
15645
|
+
path: sv(r.path, e.index),
|
|
15651
15646
|
value: n,
|
|
15652
15647
|
index: e.index
|
|
15653
15648
|
});
|
|
15654
15649
|
}
|
|
15655
15650
|
} else if (e.type === "wildcard") {
|
|
15656
15651
|
for (let e of n) if (Array.isArray(e.value)) e.value.forEach((n, r) => t.push({
|
|
15657
|
-
path:
|
|
15652
|
+
path: sv(e.path, r),
|
|
15658
15653
|
value: n,
|
|
15659
15654
|
index: r
|
|
15660
15655
|
}));
|
|
15661
15656
|
else if (e.value != null && typeof e.value == "object") for (let n of Object.keys(e.value)) t.push({
|
|
15662
|
-
path:
|
|
15657
|
+
path: sv(e.path, n),
|
|
15663
15658
|
value: e.value[n]
|
|
15664
15659
|
});
|
|
15665
15660
|
} else if (e.type === "descendKey") {
|
|
15666
15661
|
let r = e.key, i = (e) => {
|
|
15667
15662
|
if (!(e.value == null || typeof e.value != "object")) for (let n of Object.keys(e.value)) {
|
|
15668
15663
|
let a = {
|
|
15669
|
-
path:
|
|
15664
|
+
path: sv(e.path, n),
|
|
15670
15665
|
value: e.value[n]
|
|
15671
15666
|
};
|
|
15672
15667
|
n === r && t.push(a), i(a);
|
|
@@ -15677,7 +15672,7 @@ function lv(e, t) {
|
|
|
15677
15672
|
let e = (n) => {
|
|
15678
15673
|
if (!(n.value == null || typeof n.value != "object")) for (let r of Object.keys(n.value)) {
|
|
15679
15674
|
let i = {
|
|
15680
|
-
path:
|
|
15675
|
+
path: sv(n.path, r),
|
|
15681
15676
|
value: n.value[r]
|
|
15682
15677
|
};
|
|
15683
15678
|
t.push(i), e(i);
|
|
@@ -15686,16 +15681,16 @@ function lv(e, t) {
|
|
|
15686
15681
|
for (let t of n) e(t);
|
|
15687
15682
|
} else if (e.type === "filter") {
|
|
15688
15683
|
for (let r of n) if (Array.isArray(r.value)) r.value.forEach((n, i) => {
|
|
15689
|
-
|
|
15690
|
-
path:
|
|
15684
|
+
ov(e.filter, n) && t.push({
|
|
15685
|
+
path: sv(r.path, i),
|
|
15691
15686
|
value: n,
|
|
15692
15687
|
index: i
|
|
15693
15688
|
});
|
|
15694
15689
|
});
|
|
15695
15690
|
else if (r.value != null && typeof r.value == "object") for (let n of Object.keys(r.value)) {
|
|
15696
15691
|
let i = r.value[n];
|
|
15697
|
-
|
|
15698
|
-
path:
|
|
15692
|
+
ov(e.filter, i) && t.push({
|
|
15693
|
+
path: sv(r.path, n),
|
|
15699
15694
|
value: i
|
|
15700
15695
|
});
|
|
15701
15696
|
}
|
|
@@ -15704,7 +15699,7 @@ function lv(e, t) {
|
|
|
15704
15699
|
}
|
|
15705
15700
|
return n;
|
|
15706
15701
|
}
|
|
15707
|
-
function
|
|
15702
|
+
function lv(e, t) {
|
|
15708
15703
|
let n = e.length, r = t.length;
|
|
15709
15704
|
if (!n) return r;
|
|
15710
15705
|
if (!r) return n;
|
|
@@ -15720,7 +15715,7 @@ function uv(e, t) {
|
|
|
15720
15715
|
}
|
|
15721
15716
|
return i[r];
|
|
15722
15717
|
}
|
|
15723
|
-
function
|
|
15718
|
+
function uv(e, t, n = {}) {
|
|
15724
15719
|
let r = n.mode || "substring", i = n.limit ?? 50, a = n.matchKey !== !1, o = [], s = null;
|
|
15725
15720
|
if (r === "regex") try {
|
|
15726
15721
|
s = new RegExp(t, "i");
|
|
@@ -15730,11 +15725,11 @@ function dv(e, t, n = {}) {
|
|
|
15730
15725
|
let c = (e, l, u) => {
|
|
15731
15726
|
if (o.length >= i || e == null) return;
|
|
15732
15727
|
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],
|
|
15728
|
+
if (Array.isArray(e)) e.forEach((e, t) => c(e, sv(l, t), String(t)));
|
|
15729
|
+
else for (let t of Object.keys(e)) c(e[t], sv(l, t), t);
|
|
15735
15730
|
return;
|
|
15736
15731
|
}
|
|
15737
|
-
let d = String(e), f =
|
|
15732
|
+
let d = String(e), f = dv(d, t, r, n.fuzzyThreshold ?? 2, s);
|
|
15738
15733
|
if (f) {
|
|
15739
15734
|
o.push({
|
|
15740
15735
|
path: l,
|
|
@@ -15745,7 +15740,7 @@ function dv(e, t, n = {}) {
|
|
|
15745
15740
|
return;
|
|
15746
15741
|
}
|
|
15747
15742
|
if (a && u) {
|
|
15748
|
-
let e =
|
|
15743
|
+
let e = dv(u, t, r, n.fuzzyThreshold ?? 2, s);
|
|
15749
15744
|
e && o.push({
|
|
15750
15745
|
path: l,
|
|
15751
15746
|
key: u,
|
|
@@ -15756,18 +15751,18 @@ function dv(e, t, n = {}) {
|
|
|
15756
15751
|
};
|
|
15757
15752
|
return c(e, ""), o;
|
|
15758
15753
|
}
|
|
15759
|
-
function
|
|
15754
|
+
function dv(e, t, n, r, i) {
|
|
15760
15755
|
let a = e.toLowerCase(), o = t.toLowerCase();
|
|
15761
15756
|
if (n === "substring") return a.includes(o) ? 1 : null;
|
|
15762
15757
|
if (n === "regex") return i && i.test(e) ? 1 : null;
|
|
15763
15758
|
if (n === "fuzzy") {
|
|
15764
15759
|
if (a.includes(o)) return 2;
|
|
15765
|
-
let e =
|
|
15760
|
+
let e = lv(a, o);
|
|
15766
15761
|
return e <= r ? r - e + 1 : null;
|
|
15767
15762
|
}
|
|
15768
15763
|
return null;
|
|
15769
15764
|
}
|
|
15770
|
-
var
|
|
15765
|
+
var fv = [
|
|
15771
15766
|
"self.fetch = () => { throw new Error('fetch 已被沙箱禁用') }",
|
|
15772
15767
|
"self.XMLHttpRequest = function(){ throw new Error('XMLHttpRequest 已被沙箱禁用') }",
|
|
15773
15768
|
"self.importScripts = () => { throw new Error('importScripts 已被沙箱禁用') }",
|
|
@@ -15780,7 +15775,7 @@ var pv = [
|
|
|
15780
15775
|
"try { self.BroadcastChannel = undefined } catch {}",
|
|
15781
15776
|
"if (self.navigator && self.navigator.sendBeacon) self.navigator.sendBeacon = () => { throw new Error('sendBeacon 已被沙箱禁用') }"
|
|
15782
15777
|
].join("\n");
|
|
15783
|
-
function
|
|
15778
|
+
function pv(e, t, n = 3e3) {
|
|
15784
15779
|
return new Promise((r) => {
|
|
15785
15780
|
let i = Date.now(), a = !1, o = (e) => {
|
|
15786
15781
|
if (!a) {
|
|
@@ -15793,7 +15788,7 @@ function mv(e, t, n = 3e3) {
|
|
|
15793
15788
|
elapsedMs: Date.now() - i
|
|
15794
15789
|
});
|
|
15795
15790
|
}
|
|
15796
|
-
}, s =
|
|
15791
|
+
}, 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
15792
|
try {
|
|
15798
15793
|
let e = new Blob([s], { type: "application/javascript" });
|
|
15799
15794
|
c = URL.createObjectURL(e), l = new Worker(c);
|
|
@@ -15828,20 +15823,20 @@ function mv(e, t, n = 3e3) {
|
|
|
15828
15823
|
}
|
|
15829
15824
|
//#endregion
|
|
15830
15825
|
//#region src/core/tools/dataOps.ts
|
|
15831
|
-
var
|
|
15826
|
+
var mv = /* @__PURE__ */ new Set([
|
|
15832
15827
|
"__proto__",
|
|
15833
15828
|
"constructor",
|
|
15834
15829
|
"prototype"
|
|
15835
15830
|
]);
|
|
15836
|
-
function
|
|
15837
|
-
return e.split(".").some((e) =>
|
|
15831
|
+
function hv(e) {
|
|
15832
|
+
return e.split(".").some((e) => mv.has(e));
|
|
15838
15833
|
}
|
|
15839
|
-
function
|
|
15840
|
-
if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t))
|
|
15834
|
+
function gv(e, t) {
|
|
15835
|
+
if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t)) mv.has(n) || (e[n] = t[n]);
|
|
15841
15836
|
}
|
|
15842
|
-
function
|
|
15837
|
+
function _v(e, t) {
|
|
15843
15838
|
if (!t) return e;
|
|
15844
|
-
if (
|
|
15839
|
+
if (hv(t)) return;
|
|
15845
15840
|
let n = t.split("."), r = e;
|
|
15846
15841
|
for (let e of n) {
|
|
15847
15842
|
if (r == null) return;
|
|
@@ -15849,8 +15844,8 @@ function vv(e, t) {
|
|
|
15849
15844
|
}
|
|
15850
15845
|
return r;
|
|
15851
15846
|
}
|
|
15852
|
-
function
|
|
15853
|
-
if (!t ||
|
|
15847
|
+
function vv(e, t, n) {
|
|
15848
|
+
if (!t || hv(t)) return;
|
|
15854
15849
|
let r = t.split("."), i = e;
|
|
15855
15850
|
for (let e = 0; e < r.length - 1; e++) {
|
|
15856
15851
|
let t = r[e];
|
|
@@ -15858,8 +15853,8 @@ function yv(e, t, n) {
|
|
|
15858
15853
|
}
|
|
15859
15854
|
i[r[r.length - 1]] = n;
|
|
15860
15855
|
}
|
|
15861
|
-
function
|
|
15862
|
-
if (!t ||
|
|
15856
|
+
function yv(e, t) {
|
|
15857
|
+
if (!t || hv(t)) return !1;
|
|
15863
15858
|
let n = t.split("."), r = e;
|
|
15864
15859
|
for (let e = 0; e < n.length - 1; e++) {
|
|
15865
15860
|
if (r == null) return !1;
|
|
@@ -15868,10 +15863,37 @@ function bv(e, t) {
|
|
|
15868
15863
|
let i = n[n.length - 1];
|
|
15869
15864
|
return r == null || !(i in r) ? !1 : (delete r[i], !0);
|
|
15870
15865
|
}
|
|
15871
|
-
function
|
|
15866
|
+
function bv(e) {
|
|
15872
15867
|
return e === void 0 ? void 0 : JSON.parse(JSON.stringify(e));
|
|
15873
15868
|
}
|
|
15874
|
-
function
|
|
15869
|
+
function xv(e) {
|
|
15870
|
+
if (typeof e != "string") return { parsed: e };
|
|
15871
|
+
let t = e.trim();
|
|
15872
|
+
if (!t) return { parsed: e };
|
|
15873
|
+
let n = t[0] === "{" || t[0] === "[";
|
|
15874
|
+
try {
|
|
15875
|
+
return { parsed: JSON.parse(t) };
|
|
15876
|
+
} catch (t) {
|
|
15877
|
+
return n ? { parseError: t } : { parsed: e };
|
|
15878
|
+
}
|
|
15879
|
+
}
|
|
15880
|
+
function Sv(e, t) {
|
|
15881
|
+
if (typeof e != "object" || !e) return e;
|
|
15882
|
+
let n = new Set(t);
|
|
15883
|
+
if (Array.isArray(e)) return e.map((e) => Sv(e, t));
|
|
15884
|
+
let r = {};
|
|
15885
|
+
for (let t of Object.keys(e)) n.has(t) && (r[t] = e[t]);
|
|
15886
|
+
return r;
|
|
15887
|
+
}
|
|
15888
|
+
function Cv(e, t) {
|
|
15889
|
+
if (typeof e != "object" || !e) return e;
|
|
15890
|
+
if (t <= 0) return Array.isArray(e) ? `[...${e.length}]` : "{...}";
|
|
15891
|
+
if (Array.isArray(e)) return e.map((e) => Cv(e, t - 1));
|
|
15892
|
+
let n = {};
|
|
15893
|
+
for (let r of Object.keys(e)) n[r] = Cv(e[r], t - 1);
|
|
15894
|
+
return n;
|
|
15895
|
+
}
|
|
15896
|
+
function wv(e, t = Infinity) {
|
|
15875
15897
|
let n = /* @__PURE__ */ new WeakSet(), r;
|
|
15876
15898
|
try {
|
|
15877
15899
|
r = JSON.stringify(e, (e, t) => {
|
|
@@ -15890,34 +15912,62 @@ function Sv(e, t = Infinity) {
|
|
|
15890
15912
|
}
|
|
15891
15913
|
return r.length > t && (r = r.slice(0, t) + `\n…[已截断,原长度 ${r.length}]`), r;
|
|
15892
15914
|
}
|
|
15893
|
-
function
|
|
15894
|
-
let t =
|
|
15915
|
+
function Tv(e) {
|
|
15916
|
+
let t = wv(e), n = 5381;
|
|
15895
15917
|
for (let e = 0; e < t.length; e++) n = (n << 5) + n + t.charCodeAt(e) >>> 0;
|
|
15896
15918
|
return n.toString(36);
|
|
15897
15919
|
}
|
|
15898
|
-
function
|
|
15899
|
-
|
|
15900
|
-
|
|
15920
|
+
function Ev(e) {
|
|
15921
|
+
let t = e;
|
|
15922
|
+
for (let e = 0; e < 5 && t && t._def; e++) {
|
|
15923
|
+
if (t._def.innerType) {
|
|
15924
|
+
t = t._def.innerType;
|
|
15925
|
+
continue;
|
|
15926
|
+
}
|
|
15927
|
+
break;
|
|
15928
|
+
}
|
|
15929
|
+
if (!t || !t.shape || typeof t.shape != "object") return null;
|
|
15930
|
+
try {
|
|
15931
|
+
let e = typeof t.shape == "function" ? t.shape() : t.shape;
|
|
15932
|
+
return Object.keys(e);
|
|
15933
|
+
} catch {
|
|
15934
|
+
return null;
|
|
15935
|
+
}
|
|
15936
|
+
}
|
|
15937
|
+
function Dv(e, t) {
|
|
15938
|
+
if (!t || !e) return !0;
|
|
15939
|
+
let n = e.split(".")[0];
|
|
15940
|
+
return t.includes(n);
|
|
15941
|
+
}
|
|
15942
|
+
function Ov(e, t) {
|
|
15943
|
+
if (!t || typeof e != "object" || !e || Array.isArray(e)) return e;
|
|
15944
|
+
let n = new Set(t), r = {};
|
|
15945
|
+
for (let t of Object.keys(e)) n.has(t) && (r[t] = e[t]);
|
|
15946
|
+
return r;
|
|
15947
|
+
}
|
|
15948
|
+
function kv(e, t, n, r) {
|
|
15949
|
+
if (t === "set") return n ? (vv(e, n, r), null) : "set 操作需要 jsonPath(整体替换请用 set_data)";
|
|
15950
|
+
if (t === "remove") return n ? (yv(e, n), null) : "remove 操作需要 jsonPath";
|
|
15901
15951
|
if (t === "merge") {
|
|
15902
|
-
let t = n ?
|
|
15903
|
-
return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (
|
|
15952
|
+
let t = n ? _v(e, n) : e;
|
|
15953
|
+
return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (gv(t, r), null);
|
|
15904
15954
|
}
|
|
15905
|
-
let i = n ?
|
|
15955
|
+
let i = n ? _v(e, n) : e;
|
|
15906
15956
|
return Array.isArray(i) ? (Array.isArray(r) ? i.push(...r) : i.push(r), null) : `append 目标${n ? `(${n})` : "(根)"}不是数组`;
|
|
15907
15957
|
}
|
|
15908
|
-
function
|
|
15909
|
-
if (t === "set")
|
|
15910
|
-
else if (t === "remove")
|
|
15911
|
-
else if (t === "merge")
|
|
15958
|
+
function Av(e, t, n, r) {
|
|
15959
|
+
if (t === "set") vv(e, n, r);
|
|
15960
|
+
else if (t === "remove") yv(e, n);
|
|
15961
|
+
else if (t === "merge") gv(n ? _v(e, n) : e, r);
|
|
15912
15962
|
else {
|
|
15913
|
-
let t = n ?
|
|
15963
|
+
let t = n ? _v(e, n) : e;
|
|
15914
15964
|
Array.isArray(r) ? t.push(...r) : t.push(r);
|
|
15915
15965
|
}
|
|
15916
15966
|
}
|
|
15917
|
-
function
|
|
15918
|
-
typeof e == "object" && e &&
|
|
15967
|
+
function jv(e, t) {
|
|
15968
|
+
typeof e == "object" && e && Mv(e, t);
|
|
15919
15969
|
}
|
|
15920
|
-
function
|
|
15970
|
+
function Mv(e, t) {
|
|
15921
15971
|
if (Array.isArray(e)) {
|
|
15922
15972
|
e.length = 0, Array.isArray(t) && e.push(...t);
|
|
15923
15973
|
return;
|
|
@@ -15926,51 +15976,51 @@ function Dv(e, t) {
|
|
|
15926
15976
|
for (let t of Object.keys(e)) t in n || delete e[t];
|
|
15927
15977
|
for (let t of Object.keys(n)) e[t] = n[t];
|
|
15928
15978
|
}
|
|
15929
|
-
var
|
|
15979
|
+
var Nv = /* @__PURE__ */ new Set([
|
|
15930
15980
|
"describe_data",
|
|
15931
15981
|
"get_data",
|
|
15932
15982
|
"set_data",
|
|
15933
15983
|
"edit_data",
|
|
15934
15984
|
"delete_data"
|
|
15935
|
-
]),
|
|
15936
|
-
function
|
|
15937
|
-
return t === "advanced" ? e : t === "minimal" ? e.filter((e) =>
|
|
15985
|
+
]), Pv = /* @__PURE__ */ new Set(["read", "write"]);
|
|
15986
|
+
function Fv(e, t = "simple") {
|
|
15987
|
+
return t === "advanced" ? e : t === "minimal" ? e.filter((e) => Pv.has(e.name)) : e.filter((e) => !Nv.has(e.name));
|
|
15938
15988
|
}
|
|
15939
|
-
function
|
|
15940
|
-
let i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s = [],
|
|
15989
|
+
function Iv(e, r = {}) {
|
|
15990
|
+
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
15991
|
get: () => ({
|
|
15942
15992
|
schema: i,
|
|
15943
15993
|
bind: a,
|
|
15944
15994
|
description: o
|
|
15945
15995
|
}),
|
|
15946
15996
|
set: (e) => {
|
|
15947
|
-
i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s.length = 0,
|
|
15997
|
+
i = e.schema, a = e.bind, o = e.description ?? "主数据对象", s = Ev(i), c.length = 0, u = void 0;
|
|
15948
15998
|
},
|
|
15949
15999
|
update: (e) => {
|
|
15950
|
-
a = e,
|
|
16000
|
+
a = e, c.length = 0, u = void 0;
|
|
15951
16001
|
}
|
|
15952
|
-
},
|
|
16002
|
+
}, p = (e) => {
|
|
15953
16003
|
r.onAudit?.(e);
|
|
15954
16004
|
};
|
|
15955
|
-
function
|
|
15956
|
-
let n =
|
|
15957
|
-
for (
|
|
16005
|
+
function m(e, t) {
|
|
16006
|
+
let n = bv(a), r = c.length ? c[c.length - 1].id + 1 : 1;
|
|
16007
|
+
for (c.push({
|
|
15958
16008
|
id: r,
|
|
15959
16009
|
ts: Date.now(),
|
|
15960
16010
|
op: e,
|
|
15961
16011
|
label: t,
|
|
15962
16012
|
value: n
|
|
15963
|
-
});
|
|
16013
|
+
}); c.length > l;) c.shift();
|
|
15964
16014
|
return r;
|
|
15965
16015
|
}
|
|
15966
|
-
async function
|
|
16016
|
+
async function h(e, t, n) {
|
|
15967
16017
|
if (!t || t === "") return null;
|
|
15968
|
-
let i =
|
|
16018
|
+
let i = Tv(a);
|
|
15969
16019
|
if (i === t) return null;
|
|
15970
16020
|
if (!r.onConflict) return $({
|
|
15971
16021
|
code: "VERSION_CONFLICT",
|
|
15972
16022
|
message: `乐观锁冲突:expectedHash=${t} 但当前 hash=${i}。主数据在你 read 之后已被修改(外部代码/其他 agent/用户手动改)。`,
|
|
15973
|
-
hint: `重新 read 拿最新值与 hash,基于最新值修改后再写入(传新的 expectedHash)。当前值:${
|
|
16023
|
+
hint: `重新 read 拿最新值与 hash,基于最新值修改后再写入(传新的 expectedHash)。当前值:${wv(a, 400)}`
|
|
15974
16024
|
});
|
|
15975
16025
|
let o = await r.onConflict({
|
|
15976
16026
|
op: e,
|
|
@@ -15980,44 +16030,52 @@ function jv(e, r = {}) {
|
|
|
15980
16030
|
expectedHash: t,
|
|
15981
16031
|
snapshotId: 0
|
|
15982
16032
|
});
|
|
15983
|
-
if (o.action === "keep_external") return `已保留外部修改(未写入)。当前值:${
|
|
16033
|
+
if (o.action === "keep_external") return `已保留外部修改(未写入)。当前值:${wv(a, 400)} (hash=${i})。请重新 read 拿最新值与 hash 再改。`;
|
|
15984
16034
|
if (o.action === "restore") {
|
|
15985
|
-
if (!
|
|
15986
|
-
let e =
|
|
15987
|
-
return
|
|
16035
|
+
if (!c.length) return `无历史快照可回退(本次为首次操作)。当前值:${wv(a, 400)} (hash=${i})。请重新 read 再改或选「强制覆盖」。`;
|
|
16036
|
+
let e = c[c.length - 1];
|
|
16037
|
+
return jv(a, bv(e.value)), `已回退主数据到历史快照 #${e.id}[${e.op}]。当前值:${wv(a, 400)} (hash=${Tv(a)})。请基于回退后的值重写或停止。`;
|
|
15988
16038
|
}
|
|
15989
16039
|
return null;
|
|
15990
16040
|
}
|
|
15991
|
-
let
|
|
16041
|
+
let g = [
|
|
15992
16042
|
n(async () => [`说明: ${o}`, "格式: 写入值需为 JSON,且通过声明的 schema 校验(校验失败时 set_data/edit_data 会返回结构化错误,含具体字段与期望类型)。"].join("\n"), {
|
|
15993
16043
|
name: "describe_data",
|
|
15994
16044
|
description: "获取主数据的说明与格式要求。",
|
|
15995
16045
|
schema: t.object({})
|
|
15996
16046
|
}),
|
|
15997
16047
|
n(async ({ jsonPath: e }) => {
|
|
15998
|
-
let t =
|
|
15999
|
-
|
|
16048
|
+
let t = e || "";
|
|
16049
|
+
if (!Dv(t, s)) return $({
|
|
16050
|
+
code: "PATH_DENIED",
|
|
16051
|
+
message: `get_data @ "${t}" 不在 schema 声明字段内(仅 schema 声明的 key 可读)`,
|
|
16052
|
+
hint: "主数据仅暴露 schema 声明的字段;若需操作该字段,集成方需在 schema 中声明它"
|
|
16053
|
+
});
|
|
16054
|
+
let n = t ? _v(a, t) : a;
|
|
16055
|
+
t || (n = Ov(n, s));
|
|
16056
|
+
let r = Tv(a);
|
|
16057
|
+
return u = r, n === void 0 ? `主数据${t ? ` @ ${t}` : ""} = (undefined) (hash=${r})` : `主数据${t ? ` @ ${t}` : ""} = ${wv(n)} (hash=${r})`;
|
|
16000
16058
|
}, {
|
|
16001
16059
|
name: "get_data",
|
|
16002
16060
|
description: "读取主数据的当前值(安全序列化:函数/DOM/循环引用做摘要;大结果由系统自动外存,提示用 vfs_read 回读)。返回含 hash(乐观锁):改前先 read/get 拿 hash,写入时传 expectedHash 回传,系统对比当前 hash 防\"基于过期值覆盖\"。jsonPath 可选:读整个主数据不传,读子路径传(如 components.0.text)。",
|
|
16003
16061
|
schema: t.object({ jsonPath: t.string().optional().describe("相对主数据根的点号路径(如 components.0.text);不传则读整个主数据") })
|
|
16004
16062
|
}),
|
|
16005
16063
|
n(async ({ value: e, expectedHash: t }) => {
|
|
16006
|
-
let n = await
|
|
16064
|
+
let n = await h("set", t || (d ? u : void 0));
|
|
16007
16065
|
if (n !== null) return n;
|
|
16008
|
-
let r;
|
|
16009
|
-
if (
|
|
16010
|
-
|
|
16011
|
-
|
|
16012
|
-
|
|
16013
|
-
|
|
16014
|
-
|
|
16015
|
-
|
|
16016
|
-
|
|
16066
|
+
let r, o = xv(e);
|
|
16067
|
+
if (o.parseError) return U_("", e, o.parseError);
|
|
16068
|
+
r = o.parsed;
|
|
16069
|
+
let c = i.safeParse(r);
|
|
16070
|
+
return c.success ? typeof a != "object" || !a ? $({
|
|
16071
|
+
code: "LEAF_BIND",
|
|
16072
|
+
message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),set_data 无法就地替换外部持有的值引用`,
|
|
16073
|
+
hint: "主数据 bind 必须为对象/数组(低代码主 JSON 本就是);叶子值请用对象包裹(如 {value:\"x\"})或集成方通过 sdk.setData 替换 bind"
|
|
16074
|
+
}) : (m("set"), c.data !== null && typeof c.data == "object" && (s ? gv(a, c.data) : Mv(a, c.data)), p({
|
|
16017
16075
|
op: "set",
|
|
16018
|
-
value:
|
|
16076
|
+
value: c.data,
|
|
16019
16077
|
timestamp: Date.now()
|
|
16020
|
-
}),
|
|
16078
|
+
}), u = Tv(a), `已设置主数据 = ${wv(c.data, 600)} (新 hash=${Tv(a)})${s ? "(白名单模式:仅更新 schema 声明字段,未声明字段保留)" : ""}`) : H_("", c.error.issues);
|
|
16021
16079
|
}, {
|
|
16022
16080
|
name: "set_data",
|
|
16023
16081
|
description: "设置主数据的值(整体替换)。value 为 JSON 对象(或 JSON 字符串),需通过 schema 校验。校验失败会返回错误而非写入。expectedHash(可选):改前 read/get 返回的 hash,传入则启用乐观锁;不传时系统自动用你最后一次读到的 hash 比对(autoLock,默认开)。大对象/数组强烈建议改用 edit_data 增量 patch。",
|
|
@@ -16028,45 +16086,47 @@ function jv(e, r = {}) {
|
|
|
16028
16086
|
}),
|
|
16029
16087
|
n(async ({ op: e, jsonPath: t, value: n, expectedHash: r }) => {
|
|
16030
16088
|
let o = t || "";
|
|
16031
|
-
if (
|
|
16089
|
+
if (hv(o)) return $({
|
|
16032
16090
|
code: "PATH_UNSAFE",
|
|
16033
16091
|
message: `jsonPath "${o}" 含非法段(__proto__/constructor/prototype)`,
|
|
16034
16092
|
hint: "使用正常的属性路径,如 components.0.text(数组索引用数字)"
|
|
16035
16093
|
});
|
|
16036
|
-
|
|
16037
|
-
|
|
16094
|
+
if (!Dv(o, s)) return $({
|
|
16095
|
+
code: "PATH_DENIED",
|
|
16096
|
+
message: `edit_data @ "${o}" 不在 schema 声明字段内`,
|
|
16097
|
+
hint: "仅 schema 声明的 key 可写;若需操作该字段,集成方需在 schema 中声明它"
|
|
16098
|
+
});
|
|
16099
|
+
let c = await h("edit", r || (d ? u : void 0));
|
|
16100
|
+
if (c !== null) return c;
|
|
16038
16101
|
if (typeof a != "object" || !a) return $({
|
|
16039
16102
|
code: "NOT_OBJECT",
|
|
16040
16103
|
message: `edit 仅适用于对象/数组主数据,当前是 ${a === void 0 ? "undefined" : typeof a}`,
|
|
16041
16104
|
hint: "叶子(原始类型)请用 set_data 整体设置"
|
|
16042
16105
|
});
|
|
16043
|
-
let
|
|
16106
|
+
let l;
|
|
16044
16107
|
if (e !== "remove") {
|
|
16045
16108
|
if (n === void 0 || n === "") return $({
|
|
16046
16109
|
code: "MISSING_VALUE",
|
|
16047
16110
|
message: `${e} 操作需要 value`,
|
|
16048
16111
|
hint: `op 为 ${e} 时 value 必填;删除请用 op:'remove'`
|
|
16049
16112
|
});
|
|
16050
|
-
|
|
16051
|
-
|
|
16052
|
-
|
|
16053
|
-
return W_("", n, e);
|
|
16054
|
-
}
|
|
16055
|
-
else c = n;
|
|
16113
|
+
let t = xv(n);
|
|
16114
|
+
if (t.parseError) return U_("", n, t.parseError);
|
|
16115
|
+
l = t.parsed;
|
|
16056
16116
|
}
|
|
16057
|
-
let
|
|
16058
|
-
if (
|
|
16117
|
+
let f = bv(a), g = kv(f, e, o, l);
|
|
16118
|
+
if (g) return $({
|
|
16059
16119
|
code: "PATCH_FAILED",
|
|
16060
|
-
message:
|
|
16120
|
+
message: g,
|
|
16061
16121
|
hint: "检查 op 与目标类型:merge 需对象,append 需数组;jsonPath 指向需存在"
|
|
16062
16122
|
});
|
|
16063
|
-
let
|
|
16064
|
-
return
|
|
16123
|
+
let _ = i.safeParse(f);
|
|
16124
|
+
return _.success ? (m("edit"), Av(a, e, o, l), p({
|
|
16065
16125
|
op: "edit",
|
|
16066
16126
|
detail: `${e}${o ? "@" + o : ""}`,
|
|
16067
|
-
value:
|
|
16127
|
+
value: l,
|
|
16068
16128
|
timestamp: Date.now()
|
|
16069
|
-
}),
|
|
16129
|
+
}), u = Tv(a), `已 edit 主数据(${e}${o ? " @ " + o : ""})。当前值:${wv(a, 600)} (新 hash=${Tv(a)})`) : H_("", _.error.issues);
|
|
16070
16130
|
}, {
|
|
16071
16131
|
name: "edit_data",
|
|
16072
16132
|
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 +16148,25 @@ function jv(e, r = {}) {
|
|
|
16088
16148
|
message: "delete_data 需要 jsonPath 指定要删的子路径(主数据整体不可删,用 set_data 整体替换)",
|
|
16089
16149
|
hint: "如 jsonPath:\"components.0\" 删数组首项"
|
|
16090
16150
|
});
|
|
16091
|
-
if (
|
|
16151
|
+
if (hv(e)) return $({
|
|
16092
16152
|
code: "PATH_UNSAFE",
|
|
16093
16153
|
message: `jsonPath "${e}" 含非法段`,
|
|
16094
16154
|
hint: "使用正常属性路径"
|
|
16095
16155
|
});
|
|
16096
|
-
|
|
16156
|
+
if (!Dv(e, s)) return $({
|
|
16157
|
+
code: "PATH_DENIED",
|
|
16158
|
+
message: `delete_data @ "${e}" 不在 schema 声明字段内`,
|
|
16159
|
+
hint: "仅 schema 声明的 key 可删"
|
|
16160
|
+
});
|
|
16161
|
+
let n = await h("delete", t || (d ? u : void 0));
|
|
16097
16162
|
if (n !== null) return n;
|
|
16098
|
-
|
|
16099
|
-
let r =
|
|
16100
|
-
return
|
|
16163
|
+
m("delete");
|
|
16164
|
+
let r = yv(a, e);
|
|
16165
|
+
return p({
|
|
16101
16166
|
op: "delete",
|
|
16102
16167
|
detail: e,
|
|
16103
16168
|
timestamp: Date.now()
|
|
16104
|
-
}),
|
|
16169
|
+
}), u = Tv(a), r ? `已删除主数据 @ ${e}` : `主数据 @ ${e} 不存在(无需删除)`;
|
|
16105
16170
|
}, {
|
|
16106
16171
|
name: "delete_data",
|
|
16107
16172
|
description: "删除主数据的某个子路径(jsonPath)。主数据整体不可删(用 set_data 整体替换)。expectedHash(可选):改前 read/get 返回的 hash;不传时自动用你最后读到的 hash(autoLock,默认开)防\"基于过期值删除\"。",
|
|
@@ -16110,45 +16175,45 @@ function jv(e, r = {}) {
|
|
|
16110
16175
|
expectedHash: t.string().optional().describe("乐观锁:改前 read/get 返回的 hash;传入则校验,不一致拒绝删除防覆盖")
|
|
16111
16176
|
})
|
|
16112
16177
|
}),
|
|
16113
|
-
n(async ({ label: e }) => `已为主数据创建快照 #${
|
|
16178
|
+
n(async ({ label: e }) => `已为主数据创建快照 #${m("manual", e)}${e ? `(${e})` : ""}。可用 list_data_snapshots 查看、restore_data 回退。`, {
|
|
16114
16179
|
name: "snapshot_data",
|
|
16115
16180
|
description: "为主数据手动创建一个命名快照(检查点)。set/edit/delete 也会自动存快照。",
|
|
16116
16181
|
schema: t.object({ label: t.string().optional().describe("可选的快照标签,便于识别") })
|
|
16117
16182
|
}),
|
|
16118
16183
|
n(async () => {
|
|
16119
|
-
if (!
|
|
16120
|
-
let e =
|
|
16184
|
+
if (!c.length) return "无快照。set/edit/delete 会自动存快照,也可用 snapshot_data 手动创建检查点。";
|
|
16185
|
+
let e = c.map((e) => {
|
|
16121
16186
|
let t = JSON.stringify(e.value ?? "").length, n = new Date(e.ts).toLocaleTimeString("zh-CN", { hour12: !1 });
|
|
16122
16187
|
return ` #${e.id} [${e.op}]${e.label ? ` "${e.label}"` : ""} ${n} 修改前≈${t}字符`;
|
|
16123
16188
|
});
|
|
16124
|
-
return `主数据快照(共 ${
|
|
16189
|
+
return `主数据快照(共 ${c.length} 条):\n${e.join("\n")}`;
|
|
16125
16190
|
}, {
|
|
16126
16191
|
name: "list_data_snapshots",
|
|
16127
16192
|
description: "列出主数据的快照时间线(序号、操作类型、标签、大小)。",
|
|
16128
16193
|
schema: t.object({})
|
|
16129
16194
|
}),
|
|
16130
16195
|
n(async ({ id: e }) => {
|
|
16131
|
-
if (!
|
|
16196
|
+
if (!c.length) return $({
|
|
16132
16197
|
code: "NO_SNAPSHOT",
|
|
16133
16198
|
message: "无快照可回退",
|
|
16134
16199
|
hint: "set/edit/delete 会自动存快照;也可先 snapshot_data 手动创建检查点"
|
|
16135
16200
|
});
|
|
16136
|
-
let t = e === void 0 ?
|
|
16201
|
+
let t = e === void 0 ? c[c.length - 1] : c.find((t) => t.id === e);
|
|
16137
16202
|
if (!t) return $({
|
|
16138
16203
|
code: "SNAPSHOT_NOT_FOUND",
|
|
16139
16204
|
message: `未找到快照 #${e}`,
|
|
16140
16205
|
hint: "用 list_data_snapshots 查看可用快照序号"
|
|
16141
16206
|
});
|
|
16142
16207
|
let n = i.safeParse(t.value);
|
|
16143
|
-
return n.success ? (
|
|
16208
|
+
return n.success ? (jv(a, bv(t.value)), p({
|
|
16144
16209
|
op: "restore",
|
|
16145
16210
|
detail: `#${t.id}`,
|
|
16146
16211
|
timestamp: Date.now()
|
|
16147
|
-
}),
|
|
16212
|
+
}), u = Tv(a), `已回退主数据到快照 #${t.id}[${t.op}]${t.label ? `(${t.label})` : ""}。`) : $({
|
|
16148
16213
|
code: "SNAPSHOT_SCHEMA_INVALID",
|
|
16149
16214
|
message: `快照 #${t.id} 的值不符合当前 schema,无法回退`,
|
|
16150
16215
|
hint: "schema 可能已变更;该快照已过期,选其他快照或重新设置",
|
|
16151
|
-
details:
|
|
16216
|
+
details: V_(n.error.issues)
|
|
16152
16217
|
});
|
|
16153
16218
|
}, {
|
|
16154
16219
|
name: "restore_data",
|
|
@@ -16161,9 +16226,9 @@ function jv(e, r = {}) {
|
|
|
16161
16226
|
message: `主数据不是对象/数组,无法查询(当前为 ${a === void 0 ? "undefined" : typeof a})`,
|
|
16162
16227
|
hint: "query 仅适用于对象/数组;叶子用 get_data 读"
|
|
16163
16228
|
});
|
|
16164
|
-
let n;
|
|
16229
|
+
let n = s ? Ov(a, s) : a, r;
|
|
16165
16230
|
try {
|
|
16166
|
-
|
|
16231
|
+
r = cv(n, e);
|
|
16167
16232
|
} catch (t) {
|
|
16168
16233
|
return $({
|
|
16169
16234
|
code: "JSONPATH_SYNTAX",
|
|
@@ -16172,8 +16237,8 @@ function jv(e, r = {}) {
|
|
|
16172
16237
|
details: { expr: e }
|
|
16173
16238
|
});
|
|
16174
16239
|
}
|
|
16175
|
-
let
|
|
16176
|
-
return `{"matched":${
|
|
16240
|
+
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)}}`);
|
|
16241
|
+
return `{"matched":${r.length},"returned":${o.length},"truncated":${r.length > i},"results":[${c.join(",")}]}`;
|
|
16177
16242
|
}, {
|
|
16178
16243
|
name: "query_data",
|
|
16179
16244
|
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 +16253,13 @@ function jv(e, r = {}) {
|
|
|
16188
16253
|
message: "主数据为空,无可搜索内容"
|
|
16189
16254
|
});
|
|
16190
16255
|
try {
|
|
16191
|
-
let o =
|
|
16256
|
+
let o = uv(s ? Ov(a, s) : a, e, {
|
|
16192
16257
|
mode: t,
|
|
16193
16258
|
fuzzyThreshold: n,
|
|
16194
16259
|
matchKey: r,
|
|
16195
16260
|
limit: i ?? 50
|
|
16196
16261
|
});
|
|
16197
|
-
return
|
|
16262
|
+
return wv({
|
|
16198
16263
|
matched: o.length,
|
|
16199
16264
|
results: o
|
|
16200
16265
|
});
|
|
@@ -16227,7 +16292,7 @@ function jv(e, r = {}) {
|
|
|
16227
16292
|
message: `脚本过长(${e.length} 字符,上限 8000)`,
|
|
16228
16293
|
hint: "精简脚本;复杂逻辑可分步(先 query 探查再 transform 改),或拆成多次 eval"
|
|
16229
16294
|
});
|
|
16230
|
-
let n = await
|
|
16295
|
+
let n = await pv(bv(s ? Ov(a, s) : a), e, 3e3);
|
|
16231
16296
|
if (!n.ok) {
|
|
16232
16297
|
let t = /超时/.test(n.error || "");
|
|
16233
16298
|
return $({
|
|
@@ -16241,143 +16306,255 @@ function jv(e, r = {}) {
|
|
|
16241
16306
|
});
|
|
16242
16307
|
}
|
|
16243
16308
|
if (t === "transform") {
|
|
16244
|
-
let e =
|
|
16245
|
-
|
|
16309
|
+
let e = n.result;
|
|
16310
|
+
if (e && typeof e == "object" && !Array.isArray(e) && "patches" in e && Array.isArray(e.patches)) {
|
|
16311
|
+
if (typeof a != "object" || !a) return $({
|
|
16312
|
+
code: "LEAF_BIND",
|
|
16313
|
+
message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),eval transform(patches) 无法就地替换`,
|
|
16314
|
+
hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
|
|
16315
|
+
});
|
|
16316
|
+
let t = e.patches, r = bv(a), o = [];
|
|
16317
|
+
for (let e = 0; e < t.length; e++) {
|
|
16318
|
+
let n = t[e], i = n.jsonPath || "";
|
|
16319
|
+
if (hv(i)) return $({
|
|
16320
|
+
code: "PATH_UNSAFE",
|
|
16321
|
+
message: `patches[${e}] jsonPath "${i}" 含非法段`,
|
|
16322
|
+
hint: "使用正常属性路径"
|
|
16323
|
+
});
|
|
16324
|
+
if (!Dv(i, s)) return $({
|
|
16325
|
+
code: "PATH_DENIED",
|
|
16326
|
+
message: `patches[${e}] @ "${i}" 不在 schema 声明字段内`,
|
|
16327
|
+
hint: "仅 schema 声明的 key 可写"
|
|
16328
|
+
});
|
|
16329
|
+
let a = n.op, c;
|
|
16330
|
+
if (a !== "remove") {
|
|
16331
|
+
if (n.value === void 0 || n.value === "") return $({
|
|
16332
|
+
code: "MISSING_VALUE",
|
|
16333
|
+
message: `patches[${e}] ${a} 操作需要 value`,
|
|
16334
|
+
hint: `op 为 ${a} 时 value 必填`
|
|
16335
|
+
});
|
|
16336
|
+
let t = xv(n.value);
|
|
16337
|
+
if (t.parseError) return U_(`patches[${e}]`, n.value, t.parseError);
|
|
16338
|
+
c = t.parsed;
|
|
16339
|
+
}
|
|
16340
|
+
let l = kv(r, a, i, c);
|
|
16341
|
+
if (l) return $({
|
|
16342
|
+
code: "PATCH_FAILED",
|
|
16343
|
+
message: `patches[${e}]: ${l}`,
|
|
16344
|
+
hint: "检查 op 与目标类型:merge 需对象,append 需数组"
|
|
16345
|
+
});
|
|
16346
|
+
o.push({
|
|
16347
|
+
op: a,
|
|
16348
|
+
jp: i,
|
|
16349
|
+
value: c
|
|
16350
|
+
});
|
|
16351
|
+
}
|
|
16352
|
+
let c = i.safeParse(r);
|
|
16353
|
+
if (!c.success) return $({
|
|
16354
|
+
code: "SCHEMA_INVALID",
|
|
16355
|
+
message: "脚本 patches 应用后整体校验失败,未写入",
|
|
16356
|
+
hint: "确认 patches 合并后整体仍符合 schema",
|
|
16357
|
+
details: V_(c.error.issues)
|
|
16358
|
+
});
|
|
16359
|
+
m("edit", "eval_transform");
|
|
16360
|
+
for (let e of o) Av(a, e.op, e.jp, e.value);
|
|
16361
|
+
return p({
|
|
16362
|
+
op: "edit",
|
|
16363
|
+
detail: `eval_transform(${o.length} patches)`,
|
|
16364
|
+
timestamp: Date.now()
|
|
16365
|
+
}), u = Tv(a), `已通过脚本 transform(patches) 更新主数据(${o.length} 个 patch,耗时 ${n.elapsedMs}ms)。当前值: ${wv(a, 600)}`;
|
|
16366
|
+
}
|
|
16367
|
+
let t = i.safeParse(e);
|
|
16368
|
+
return t.success ? typeof a != "object" || !a ? $({
|
|
16369
|
+
code: "LEAF_BIND",
|
|
16370
|
+
message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),eval transform 无法就地替换外部持有的值引用`,
|
|
16371
|
+
hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹或集成方通过 sdk.setData 替换 bind"
|
|
16372
|
+
}) : (m("edit", "eval_transform"), t.data !== null && typeof t.data == "object" && (s ? gv(a, t.data) : Mv(a, t.data)), p({
|
|
16246
16373
|
op: "edit",
|
|
16247
16374
|
detail: "eval_transform",
|
|
16248
16375
|
timestamp: Date.now()
|
|
16249
|
-
}),
|
|
16376
|
+
}), u = Tv(a), `已通过脚本 transform 更新主数据(耗时 ${n.elapsedMs}ms)。当前值: ${wv(a, 600)}`) : $({
|
|
16250
16377
|
code: "SCHEMA_INVALID",
|
|
16251
16378
|
message: "脚本返回值校验失败,未写入(transform 模式要求返回主数据的完整新值且符合 schema)",
|
|
16252
|
-
hint: "确认脚本 return 了完整新值(非部分)
|
|
16253
|
-
details:
|
|
16379
|
+
hint: "确认脚本 return 了完整新值(非部分);或返回 {patches:[...]} 走增量模式;按 describe_data() 查看格式",
|
|
16380
|
+
details: V_(t.error.issues)
|
|
16254
16381
|
});
|
|
16255
16382
|
}
|
|
16256
|
-
return
|
|
16383
|
+
return wv({
|
|
16257
16384
|
ok: !0,
|
|
16258
16385
|
result: n.result,
|
|
16259
16386
|
elapsedMs: n.elapsedMs
|
|
16260
16387
|
});
|
|
16261
16388
|
}, {
|
|
16262
16389
|
name: "eval_script",
|
|
16263
|
-
description: "在隔离的 Web Worker 沙箱里对主数据跑自定义 JS 脚本(无 window/document 访问,fetch/XHR/WebSocket/importScripts 已禁用,超时 3s 可终止)。脚本以 `data` 为入参(主数据的深拷贝),返回值即结果。mode:query(默认,只读,把返回值回给 LLM,适合过滤/映射/聚合/统计大数组)、transform(把返回值作为主数据的新整体值,经 schema 校验后就地落地,适合批量重写)
|
|
16390
|
+
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
16391
|
schema: t.object({
|
|
16265
16392
|
script: t.string().describe("JS 脚本体,如 data.filter(c=>c.stock>0).map(c=>c.id);入参名 data;末尾表达式或 return 即返回值"),
|
|
16266
16393
|
mode: t.enum(["query", "transform"]).optional().describe("query=只读返回结果(默认),transform=校验后落地为新值")
|
|
16267
16394
|
})
|
|
16268
16395
|
}),
|
|
16269
|
-
n(async ({ jsonPath: e }) => {
|
|
16270
|
-
let
|
|
16396
|
+
n(async ({ jsonPath: e, fields: t, depth: n }) => {
|
|
16397
|
+
let i = e || "";
|
|
16398
|
+
if (!Dv(i, s)) return $({
|
|
16399
|
+
code: "PATH_DENIED",
|
|
16400
|
+
message: `read @ "${i}" 不在 schema 声明字段内`,
|
|
16401
|
+
hint: "主数据仅暴露 schema 声明的字段;若需操作该字段,集成方需在 schema 中声明它"
|
|
16402
|
+
});
|
|
16403
|
+
let c = i ? _v(a, i) : a;
|
|
16404
|
+
i || (c = Ov(c, s));
|
|
16405
|
+
let l = c;
|
|
16271
16406
|
if (r.interceptors?.read) try {
|
|
16272
|
-
|
|
16407
|
+
l = r.interceptors.read(l);
|
|
16273
16408
|
} catch (e) {
|
|
16274
16409
|
return $({
|
|
16275
16410
|
code: "READ_INTERCEPT",
|
|
16276
16411
|
message: `read 拦截器抛错: ${e.message}`
|
|
16277
16412
|
});
|
|
16278
16413
|
}
|
|
16279
|
-
|
|
16280
|
-
|
|
16281
|
-
|
|
16282
|
-
|
|
16414
|
+
t && t.length && (l = Sv(l, t)), n != null && (l = Cv(l, n));
|
|
16415
|
+
let d = Tv(a);
|
|
16416
|
+
u = d;
|
|
16417
|
+
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`;
|
|
16418
|
+
return l === void 0 ? `${h}主数据${e ? ` @ ${e}` : ""}${m} = (undefined) (hash=${d})` : `${h}主数据${e ? ` @ ${e}` : ""}${m} = ${wv(l)} (hash=${d})`;
|
|
16283
16419
|
}, {
|
|
16284
16420
|
name: "read",
|
|
16285
|
-
description: "读取主数据(高层入口,合并 describe/get)。不传 jsonPath → 返回主数据说明 + 格式提示;传 jsonPath → 返回该子路径当前值 + hash。hash 用于乐观锁(默认 autoLock,write 时自动比对,无需手动传)
|
|
16286
|
-
schema: t.object({
|
|
16421
|
+
description: "读取主数据(高层入口,合并 describe/get)。不传 jsonPath → 返回主数据说明 + 格式提示;传 jsonPath → 返回该子路径当前值 + hash。hash 用于乐观锁(默认 autoLock,write 时自动比对,无需手动传)。fields(可选):字段裁剪,只返回对象(及数组元素)的指定字段,减少大对象返回体积;depth(可选):嵌套深度限制(0=只根占位,1=根+子,递归截断深层),减少深层结构返回体积。两者可组合,先裁字段再截深度。集成方可能经 read 拦截器对返回值脱敏/派生。",
|
|
16422
|
+
schema: t.object({
|
|
16423
|
+
jsonPath: t.string().optional().describe("要读的子路径(相对主数据根,如 components.0.text);不传则读整个主数据并返回说明"),
|
|
16424
|
+
fields: t.array(t.string()).optional().describe("字段裁剪:只返回指定字段(对对象/数组元素投影),减少返回体积,如 [\"id\",\"title\"]"),
|
|
16425
|
+
depth: t.number().int().min(0).optional().describe("嵌套深度限制:0=只根占位,1=根+子,递归到 depth 层后用 {...}/[...] 占位截断,减少深层返回体积")
|
|
16426
|
+
})
|
|
16287
16427
|
}),
|
|
16288
|
-
n(async ({ value: e, patch: t,
|
|
16289
|
-
let
|
|
16290
|
-
|
|
16291
|
-
let
|
|
16428
|
+
n(async ({ value: e, patch: t, patches: n, del: o }) => {
|
|
16429
|
+
let c = "set";
|
|
16430
|
+
o ? c = "delete" : (n && n.length || t) && (c = "edit");
|
|
16431
|
+
let l = e, f;
|
|
16292
16432
|
if (r.interceptors?.write) try {
|
|
16293
|
-
let
|
|
16294
|
-
|
|
16433
|
+
let i = c === "delete" ? {
|
|
16434
|
+
del: !0,
|
|
16435
|
+
jsonPath: t?.jsonPath
|
|
16436
|
+
} : c === "edit" && n && n.length ? { patches: n } : c === "edit" ? {
|
|
16437
|
+
op: t.op,
|
|
16438
|
+
jsonPath: t.jsonPath || "",
|
|
16439
|
+
value: e
|
|
16440
|
+
} : e, o = r.interceptors.write(i, a);
|
|
16441
|
+
if (o && typeof o == "object" && "error" in o) return $({
|
|
16295
16442
|
code: "WRITE_INTERCEPT",
|
|
16296
|
-
message: `write 拦截器拒绝: ${
|
|
16443
|
+
message: `write 拦截器拒绝: ${o.error}`
|
|
16297
16444
|
});
|
|
16298
|
-
|
|
16445
|
+
c === "delete" || (c === "edit" && n && n.length ? f = o && Array.isArray(o) ? o : n : l = o);
|
|
16299
16446
|
} catch (e) {
|
|
16300
16447
|
return $({
|
|
16301
16448
|
code: "WRITE_INTERCEPT",
|
|
16302
16449
|
message: `write 拦截器抛错: ${e.message}`
|
|
16303
16450
|
});
|
|
16304
16451
|
}
|
|
16305
|
-
let
|
|
16306
|
-
if (
|
|
16452
|
+
let g = d ? u : void 0;
|
|
16453
|
+
if (c === "delete") {
|
|
16307
16454
|
if (!t?.jsonPath) return $({
|
|
16308
16455
|
code: "MISSING_VALUE",
|
|
16309
16456
|
message: "delete 需要 patch.jsonPath 指定要删的子路径(主数据整体不可删,用 write(value) 整体替换)",
|
|
16310
16457
|
hint: "如 patch:{jsonPath:\"components.0\"}, del:true"
|
|
16311
16458
|
});
|
|
16312
|
-
if (
|
|
16459
|
+
if (hv(t.jsonPath)) return $({
|
|
16313
16460
|
code: "PATH_UNSAFE",
|
|
16314
16461
|
message: `jsonPath "${t.jsonPath}" 含非法段`,
|
|
16315
16462
|
hint: "使用正常属性路径"
|
|
16316
16463
|
});
|
|
16317
|
-
|
|
16464
|
+
if (!Dv(t.jsonPath, s)) return $({
|
|
16465
|
+
code: "PATH_DENIED",
|
|
16466
|
+
message: `write delete @ "${t.jsonPath}" 不在 schema 声明字段内`,
|
|
16467
|
+
hint: "仅 schema 声明的 key 可删"
|
|
16468
|
+
});
|
|
16469
|
+
let e = await h("delete", g);
|
|
16318
16470
|
if (e !== null) return e;
|
|
16319
|
-
|
|
16320
|
-
let n =
|
|
16321
|
-
return
|
|
16471
|
+
m("delete");
|
|
16472
|
+
let n = yv(a, t.jsonPath);
|
|
16473
|
+
return p({
|
|
16322
16474
|
op: "delete",
|
|
16323
16475
|
detail: t.jsonPath,
|
|
16324
16476
|
timestamp: Date.now()
|
|
16325
|
-
}),
|
|
16326
|
-
}
|
|
16327
|
-
let d;
|
|
16328
|
-
if (typeof s == "string") try {
|
|
16329
|
-
d = JSON.parse(s);
|
|
16330
|
-
} catch {
|
|
16331
|
-
d = s;
|
|
16477
|
+
}), u = Tv(a), n ? `已删除主数据 @ ${t.jsonPath}` : `主数据 @ ${t.jsonPath} 不存在(无需删除)`;
|
|
16332
16478
|
}
|
|
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
|
-
});
|
|
16479
|
+
if (c === "edit") {
|
|
16341
16480
|
if (typeof a != "object" || !a) return $({
|
|
16342
16481
|
code: "NOT_OBJECT",
|
|
16343
16482
|
message: `edit 仅适用于对象/数组主数据,当前是 ${a === void 0 ? "undefined" : typeof a}`,
|
|
16344
16483
|
hint: "叶子用 write(value) 整体设置"
|
|
16345
16484
|
});
|
|
16346
|
-
let
|
|
16347
|
-
if (
|
|
16348
|
-
let r =
|
|
16349
|
-
|
|
16350
|
-
|
|
16351
|
-
|
|
16352
|
-
|
|
16353
|
-
|
|
16354
|
-
|
|
16355
|
-
|
|
16356
|
-
|
|
16357
|
-
|
|
16358
|
-
|
|
16359
|
-
|
|
16360
|
-
|
|
16361
|
-
|
|
16485
|
+
let e = await h("edit", g);
|
|
16486
|
+
if (e !== null) return e;
|
|
16487
|
+
let r = f || (n && n.length ? n : [{
|
|
16488
|
+
op: t.op,
|
|
16489
|
+
jsonPath: t.jsonPath || "",
|
|
16490
|
+
value: l
|
|
16491
|
+
}]), o = bv(a), c = [];
|
|
16492
|
+
for (let e = 0; e < r.length; e++) {
|
|
16493
|
+
let t = r[e], n = t.jsonPath || "";
|
|
16494
|
+
if (hv(n)) return $({
|
|
16495
|
+
code: "PATH_UNSAFE",
|
|
16496
|
+
message: `patches[${e}] jsonPath "${n}" 含非法段`,
|
|
16497
|
+
hint: "使用正常属性路径,如 components.0.text"
|
|
16498
|
+
});
|
|
16499
|
+
if (!Dv(n, s)) return $({
|
|
16500
|
+
code: "PATH_DENIED",
|
|
16501
|
+
message: `patches[${e}] @ "${n}" 不在 schema 声明字段内`,
|
|
16502
|
+
hint: "仅 schema 声明的 key 可写"
|
|
16503
|
+
});
|
|
16504
|
+
let i = t.op, a;
|
|
16505
|
+
if (i !== "remove") {
|
|
16506
|
+
if (t.value === void 0 || t.value === "") return $({
|
|
16507
|
+
code: "MISSING_VALUE",
|
|
16508
|
+
message: `patches[${e}] ${i} 操作需要 value`,
|
|
16509
|
+
hint: `op 为 ${i} 时 value 必填;删除请用 op:'remove'`
|
|
16510
|
+
});
|
|
16511
|
+
let n = xv(t.value);
|
|
16512
|
+
if (n.parseError) return U_(`patches[${e}]`, t.value, n.parseError);
|
|
16513
|
+
a = n.parsed;
|
|
16514
|
+
}
|
|
16515
|
+
let l = kv(o, i, n, a);
|
|
16516
|
+
if (l) return $({
|
|
16517
|
+
code: "PATCH_FAILED",
|
|
16518
|
+
message: `patches[${e}]: ${l}`,
|
|
16519
|
+
hint: "检查 op 与目标类型:merge 需对象,append 需数组"
|
|
16520
|
+
});
|
|
16521
|
+
c.push({
|
|
16522
|
+
op: i,
|
|
16523
|
+
jp: n,
|
|
16524
|
+
value: a
|
|
16525
|
+
});
|
|
16526
|
+
}
|
|
16527
|
+
let d = i.safeParse(o);
|
|
16528
|
+
if (!d.success) return H_("", d.error.issues);
|
|
16529
|
+
m("edit");
|
|
16530
|
+
for (let e of c) Av(a, e.op, e.jp, e.value);
|
|
16531
|
+
return p({
|
|
16362
16532
|
op: "edit",
|
|
16363
|
-
detail: `${
|
|
16364
|
-
value:
|
|
16533
|
+
detail: `${c.length} 个 patch${c.length > 1 ? "(批量)" : ""}`,
|
|
16534
|
+
value: c.map((e) => `${e.op}@${e.jp}`),
|
|
16365
16535
|
timestamp: Date.now()
|
|
16366
|
-
}),
|
|
16536
|
+
}), u = Tv(a), `已 write(edit) 主数据(${c.length} 个 patch)。当前值:${wv(a, 600)} (新 hash=${Tv(a)})`;
|
|
16367
16537
|
}
|
|
16368
|
-
let
|
|
16369
|
-
if (
|
|
16370
|
-
|
|
16371
|
-
|
|
16538
|
+
let _, v = xv(l);
|
|
16539
|
+
if (v.parseError) return U_("", l, v.parseError);
|
|
16540
|
+
_ = v.parsed;
|
|
16541
|
+
let y = await h("set", g);
|
|
16542
|
+
if (y !== null) return y;
|
|
16543
|
+
let b = i.safeParse(_);
|
|
16544
|
+
return b.success ? typeof a != "object" || !a ? $({
|
|
16545
|
+
code: "LEAF_BIND",
|
|
16546
|
+
message: `主数据 bind 为原始类型(${a === null ? "null" : typeof a}),write(set) 无法就地替换外部持有的值引用`,
|
|
16547
|
+
hint: "主数据 bind 必须为对象/数组;叶子值请用对象包裹(如 {value:\"x\"})或集成方通过 sdk.setData 替换 bind"
|
|
16548
|
+
}) : (m("set"), b.data !== null && typeof b.data == "object" && (s ? gv(a, b.data) : Mv(a, b.data)), p({
|
|
16372
16549
|
op: "set",
|
|
16373
|
-
value:
|
|
16550
|
+
value: b.data,
|
|
16374
16551
|
timestamp: Date.now()
|
|
16375
|
-
}),
|
|
16552
|
+
}), u = Tv(a), `已 write(set) 主数据 = ${wv(b.data, 600)} (新 hash=${Tv(a)})${s ? "(白名单模式:仅更新 schema 声明字段,未声明字段保留)" : ""}`) : H_("", b.error.issues);
|
|
16376
16553
|
}, {
|
|
16377
16554
|
name: "write",
|
|
16378
|
-
description: "写入主数据(高层入口,合并 set/edit/delete + 自动乐观锁 + 自动快照)
|
|
16555
|
+
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
16556
|
schema: t.object({
|
|
16380
|
-
value: t.unknown().optional().describe("JSON 对象(推荐,如 {title:\"x\"})或 JSON 字符串;set
|
|
16557
|
+
value: t.unknown().optional().describe("JSON 对象(推荐,如 {title:\"x\"})或 JSON 字符串;set 整体或单个 patch 的 set/merge/append 必填"),
|
|
16381
16558
|
patch: t.object({
|
|
16382
16559
|
op: t.enum([
|
|
16383
16560
|
"set",
|
|
@@ -16386,22 +16563,32 @@ function jv(e, r = {}) {
|
|
|
16386
16563
|
"append"
|
|
16387
16564
|
]),
|
|
16388
16565
|
jsonPath: t.string().optional().describe("相对主数据根的点号路径(如 components.0.text);set/remove 必填,merge/append 不填则作用于根")
|
|
16389
|
-
}).optional().describe("
|
|
16566
|
+
}).optional().describe("单个增量编辑;传 patch(无 patches)走单 patch edit 语义,value 作为该 patch 的 value"),
|
|
16567
|
+
patches: t.array(t.object({
|
|
16568
|
+
op: t.enum([
|
|
16569
|
+
"set",
|
|
16570
|
+
"remove",
|
|
16571
|
+
"merge",
|
|
16572
|
+
"append"
|
|
16573
|
+
]),
|
|
16574
|
+
jsonPath: t.string().optional().describe("相对主数据根的点号路径;set/remove 必填,merge/append 不填则作用于根"),
|
|
16575
|
+
value: t.unknown().optional().describe("JSON 值(推荐直传)或 JSON 字符串;set/merge/append 必填,remove 不需")
|
|
16576
|
+
})).optional().describe("批量增量编辑:一次原子应用多个 patch(任一失败则整体不写入,clone 试跑全部 + schema 校验通过才落 live)。适合一次改多处,减少多轮往返"),
|
|
16390
16577
|
del: t.boolean().optional().describe("true 则删除 patch.jsonPath 指定的子路径(等价 delete_data)")
|
|
16391
16578
|
})
|
|
16392
16579
|
})
|
|
16393
16580
|
];
|
|
16394
|
-
return Object.defineProperty(
|
|
16395
|
-
value:
|
|
16581
|
+
return Object.defineProperty(g, "controller", {
|
|
16582
|
+
value: f,
|
|
16396
16583
|
enumerable: !1,
|
|
16397
16584
|
configurable: !1,
|
|
16398
16585
|
writable: !1
|
|
16399
|
-
}),
|
|
16586
|
+
}), g;
|
|
16400
16587
|
}
|
|
16401
16588
|
//#endregion
|
|
16402
16589
|
//#region src/core/tools/fetchDoc.ts
|
|
16403
|
-
var
|
|
16404
|
-
let n = new AbortController(), r = setTimeout(() => n.abort(),
|
|
16590
|
+
var Lv = 3e4, Rv = [n(async ({ url: e, as: t }) => {
|
|
16591
|
+
let n = new AbortController(), r = setTimeout(() => n.abort(), Lv);
|
|
16405
16592
|
try {
|
|
16406
16593
|
let r = await fetch(e, {
|
|
16407
16594
|
method: "GET",
|
|
@@ -16418,7 +16605,7 @@ var Mv = 3e4, Nv = [n(async ({ url: e, as: t }) => {
|
|
|
16418
16605
|
].join("\n");
|
|
16419
16606
|
} catch (t) {
|
|
16420
16607
|
let r = t?.message || String(t);
|
|
16421
|
-
return n.signal.aborted ? `获取失败:请求超时(${
|
|
16608
|
+
return n.signal.aborted ? `获取失败:请求超时(${Lv}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
|
|
16422
16609
|
} finally {
|
|
16423
16610
|
clearTimeout(r);
|
|
16424
16611
|
}
|
|
@@ -16429,25 +16616,25 @@ var Mv = 3e4, Nv = [n(async ({ url: e, as: t }) => {
|
|
|
16429
16616
|
url: t.string().describe("要抓取的 URL(同源或已配 CORS)"),
|
|
16430
16617
|
as: t.enum(["text", "markdown"]).optional().describe("返回格式标签,默认 text")
|
|
16431
16618
|
})
|
|
16432
|
-
})],
|
|
16433
|
-
function
|
|
16434
|
-
return
|
|
16619
|
+
})], zv = Rv;
|
|
16620
|
+
function Bv(e, t) {
|
|
16621
|
+
return Iv(e, t);
|
|
16435
16622
|
}
|
|
16436
|
-
function
|
|
16623
|
+
function Vv(e, t, n) {
|
|
16437
16624
|
let r = e?.dataOps !== !1, i = e?.fetch !== !1;
|
|
16438
16625
|
return [...r ? t : [], ...i ? n : []];
|
|
16439
16626
|
}
|
|
16440
16627
|
//#endregion
|
|
16441
16628
|
//#region src/core/harness/usageHints.ts
|
|
16442
|
-
var
|
|
16443
|
-
function
|
|
16629
|
+
var Hv = .7;
|
|
16630
|
+
function Uv(e, t, n = "simple") {
|
|
16444
16631
|
let r = n !== "advanced";
|
|
16445
16632
|
return {
|
|
16446
16633
|
name: "usageHints",
|
|
16447
16634
|
augmentPrompt: () => {
|
|
16448
16635
|
let n = [];
|
|
16449
16636
|
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) >=
|
|
16637
|
+
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
16638
|
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
16639
|
}
|
|
16453
16640
|
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 +16643,7 @@ function Rv(e, t, n = "simple") {
|
|
|
16456
16643
|
}
|
|
16457
16644
|
//#endregion
|
|
16458
16645
|
//#region src/core/utils/id.ts
|
|
16459
|
-
function
|
|
16646
|
+
function Wv() {
|
|
16460
16647
|
try {
|
|
16461
16648
|
if (typeof crypto < "u" && typeof crypto.randomUUID == "function") return crypto.randomUUID();
|
|
16462
16649
|
} catch {}
|
|
@@ -16464,57 +16651,57 @@ function zv() {
|
|
|
16464
16651
|
}
|
|
16465
16652
|
//#endregion
|
|
16466
16653
|
//#region src/core/backends/storage.ts
|
|
16467
|
-
var
|
|
16654
|
+
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
16655
|
"messages",
|
|
16469
16656
|
"vfs",
|
|
16470
16657
|
"todos",
|
|
16471
16658
|
"memory"
|
|
16472
16659
|
];
|
|
16473
|
-
function
|
|
16474
|
-
return e === "local" || e === "session" ?
|
|
16660
|
+
function ty(e) {
|
|
16661
|
+
return e === "local" || e === "session" ? qv : Kv;
|
|
16475
16662
|
}
|
|
16476
|
-
function
|
|
16663
|
+
function ny(e) {
|
|
16477
16664
|
if (typeof e != "object" || !e) return !1;
|
|
16478
16665
|
let t = e;
|
|
16479
16666
|
return t.name === "QuotaExceededError" || t.name === "NS_ERROR_DOM_QUOTA_REACHED" || t.code === 22 || t.code === 1014;
|
|
16480
16667
|
}
|
|
16481
|
-
function
|
|
16668
|
+
function ry(e, t, n, r) {
|
|
16482
16669
|
return [
|
|
16483
|
-
|
|
16670
|
+
$v,
|
|
16484
16671
|
e,
|
|
16485
16672
|
t,
|
|
16486
16673
|
n,
|
|
16487
16674
|
r
|
|
16488
16675
|
].join("::");
|
|
16489
16676
|
}
|
|
16490
|
-
function
|
|
16677
|
+
function iy(e, t, n) {
|
|
16491
16678
|
return [
|
|
16492
|
-
|
|
16679
|
+
$v,
|
|
16493
16680
|
e,
|
|
16494
16681
|
t,
|
|
16495
16682
|
n
|
|
16496
16683
|
].join("::") + "::";
|
|
16497
16684
|
}
|
|
16498
|
-
function
|
|
16685
|
+
function ay(e, t) {
|
|
16499
16686
|
return [
|
|
16500
|
-
|
|
16687
|
+
$v,
|
|
16501
16688
|
e,
|
|
16502
16689
|
t
|
|
16503
16690
|
].join("::") + "::";
|
|
16504
16691
|
}
|
|
16505
|
-
function
|
|
16506
|
-
return [
|
|
16692
|
+
function oy(e) {
|
|
16693
|
+
return [$v, e].join("::") + "::";
|
|
16507
16694
|
}
|
|
16508
|
-
var
|
|
16509
|
-
function
|
|
16510
|
-
|
|
16695
|
+
var sy = null;
|
|
16696
|
+
function cy(e) {
|
|
16697
|
+
sy ||= new TextEncoder();
|
|
16511
16698
|
try {
|
|
16512
|
-
return
|
|
16699
|
+
return sy.encode(JSON.stringify(e)).length;
|
|
16513
16700
|
} catch {
|
|
16514
16701
|
return 0;
|
|
16515
16702
|
}
|
|
16516
16703
|
}
|
|
16517
|
-
function
|
|
16704
|
+
function ly(e, t, n) {
|
|
16518
16705
|
let r = e.reduce((e, t) => e + t.bytes, 0);
|
|
16519
16706
|
if (r <= t) return [];
|
|
16520
16707
|
let i = t * n, a = [...e].sort((e, t) => e.lastAccessed - t.lastAccessed), o = [];
|
|
@@ -16524,7 +16711,7 @@ function iy(e, t, n) {
|
|
|
16524
16711
|
}
|
|
16525
16712
|
return o;
|
|
16526
16713
|
}
|
|
16527
|
-
function
|
|
16714
|
+
function uy() {
|
|
16528
16715
|
let e = /* @__PURE__ */ new Map();
|
|
16529
16716
|
return {
|
|
16530
16717
|
async get(t) {
|
|
@@ -16544,7 +16731,7 @@ function ay() {
|
|
|
16544
16731
|
}
|
|
16545
16732
|
};
|
|
16546
16733
|
}
|
|
16547
|
-
function
|
|
16734
|
+
function dy(e) {
|
|
16548
16735
|
return new Promise((t, n) => {
|
|
16549
16736
|
if (typeof indexedDB > "u") {
|
|
16550
16737
|
n(/* @__PURE__ */ Error("indexedDB 不可用"));
|
|
@@ -16605,7 +16792,7 @@ function oy(e) {
|
|
|
16605
16792
|
}, r.onerror = () => n(r.error);
|
|
16606
16793
|
});
|
|
16607
16794
|
}
|
|
16608
|
-
function
|
|
16795
|
+
function fy(e) {
|
|
16609
16796
|
return {
|
|
16610
16797
|
async get(t) {
|
|
16611
16798
|
let n = e.getItem(t);
|
|
@@ -16639,12 +16826,12 @@ function sy(e) {
|
|
|
16639
16826
|
}
|
|
16640
16827
|
};
|
|
16641
16828
|
}
|
|
16642
|
-
function
|
|
16829
|
+
function py(e, t, n) {
|
|
16643
16830
|
let r = (e.get(t) ?? Promise.resolve()).then(n, n);
|
|
16644
16831
|
return e.set(t, r.then(() => void 0, () => void 0)), r;
|
|
16645
16832
|
}
|
|
16646
|
-
function
|
|
16647
|
-
let t = e.dbName ??
|
|
16833
|
+
function my(e = {}) {
|
|
16834
|
+
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
16835
|
function c(e) {
|
|
16649
16836
|
for (let t of s) try {
|
|
16650
16837
|
t(e);
|
|
@@ -16657,16 +16844,16 @@ function ly(e = {}) {
|
|
|
16657
16844
|
try {
|
|
16658
16845
|
if (n === "indexed") {
|
|
16659
16846
|
if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
|
|
16660
|
-
l = await
|
|
16847
|
+
l = await dy(t), d(!0);
|
|
16661
16848
|
} else if (n === "session") {
|
|
16662
16849
|
if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
|
|
16663
|
-
l =
|
|
16850
|
+
l = fy(sessionStorage), d(!0);
|
|
16664
16851
|
} else if (n === "local") {
|
|
16665
16852
|
if (typeof localStorage > "u") throw Error("localStorage 不可用");
|
|
16666
|
-
l =
|
|
16667
|
-
} else l =
|
|
16853
|
+
l = fy(localStorage), d(!0);
|
|
16854
|
+
} else l = uy(), d(!1);
|
|
16668
16855
|
} catch (e) {
|
|
16669
|
-
l =
|
|
16856
|
+
l = uy();
|
|
16670
16857
|
let t = e instanceof Error ? e.message : String(e);
|
|
16671
16858
|
d(!1), Promise.resolve().then(() => c({
|
|
16672
16859
|
type: "degraded",
|
|
@@ -16676,10 +16863,10 @@ function ly(e = {}) {
|
|
|
16676
16863
|
})();
|
|
16677
16864
|
let p = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map();
|
|
16678
16865
|
function g(e, n, r, a) {
|
|
16679
|
-
let o =
|
|
16680
|
-
return
|
|
16866
|
+
let o = ry(t, r, a, Qv);
|
|
16867
|
+
return py(h, o, async () => {
|
|
16681
16868
|
let t = async () => {
|
|
16682
|
-
let t = await l.get(o), s = await l.get(e), u = s == null ? 0 :
|
|
16869
|
+
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
16870
|
if (f > i) {
|
|
16684
16871
|
c({
|
|
16685
16872
|
type: "quota",
|
|
@@ -16701,12 +16888,12 @@ function ly(e = {}) {
|
|
|
16701
16888
|
try {
|
|
16702
16889
|
await t();
|
|
16703
16890
|
} catch (e) {
|
|
16704
|
-
if (
|
|
16891
|
+
if (ny(e) && !u) {
|
|
16705
16892
|
u = !0;
|
|
16706
16893
|
try {
|
|
16707
16894
|
await b();
|
|
16708
16895
|
} catch {}
|
|
16709
|
-
l =
|
|
16896
|
+
l = uy(), Promise.resolve().then(() => c({
|
|
16710
16897
|
type: "degraded",
|
|
16711
16898
|
reason: "存储配额超限(QuotaExceededError),已淘汰最旧会话并降级内存"
|
|
16712
16899
|
}));
|
|
@@ -16718,7 +16905,7 @@ function ly(e = {}) {
|
|
|
16718
16905
|
});
|
|
16719
16906
|
}
|
|
16720
16907
|
function _(e, n, r, i) {
|
|
16721
|
-
let a =
|
|
16908
|
+
let a = ry(t, e, n, r), s = p.get(a);
|
|
16722
16909
|
s && s.resolve();
|
|
16723
16910
|
let c = m.get(a);
|
|
16724
16911
|
return c && clearTimeout(c), new Promise((t) => {
|
|
@@ -16745,15 +16932,15 @@ function ly(e = {}) {
|
|
|
16745
16932
|
function y() {
|
|
16746
16933
|
v ||= setTimeout(() => {
|
|
16747
16934
|
v = null, b();
|
|
16748
|
-
},
|
|
16935
|
+
}, Zv);
|
|
16749
16936
|
}
|
|
16750
16937
|
async function b() {
|
|
16751
16938
|
let e = [];
|
|
16752
|
-
await l.scan(
|
|
16939
|
+
await l.scan(oy(t), (t, n) => {
|
|
16753
16940
|
t.endsWith("::__meta__") && e.push(n);
|
|
16754
16941
|
});
|
|
16755
|
-
let n =
|
|
16756
|
-
for (let e of n) await l.clearPrefix(
|
|
16942
|
+
let n = ly(e, r, a);
|
|
16943
|
+
for (let e of n) await l.clearPrefix(iy(t, e.agentId, e.sessionId)), c({
|
|
16757
16944
|
type: "evicted",
|
|
16758
16945
|
agentId: e.agentId,
|
|
16759
16946
|
sessionId: e.sessionId,
|
|
@@ -16764,13 +16951,13 @@ function ly(e = {}) {
|
|
|
16764
16951
|
ready: f,
|
|
16765
16952
|
async listSessions(e) {
|
|
16766
16953
|
let n = [];
|
|
16767
|
-
return await l.scan(
|
|
16954
|
+
return await l.scan(ay(t, e), (e, t) => {
|
|
16768
16955
|
e.endsWith("::__meta__") && n.push(t);
|
|
16769
16956
|
}), n.sort((e, t) => t.lastAccessed - e.lastAccessed);
|
|
16770
16957
|
},
|
|
16771
16958
|
async load(e, n) {
|
|
16772
|
-
let r =
|
|
16773
|
-
return await
|
|
16959
|
+
let r = ry(t, e, n, Qv);
|
|
16960
|
+
return await py(h, r, async () => {
|
|
16774
16961
|
let i = await l.get(r);
|
|
16775
16962
|
if (!i) return;
|
|
16776
16963
|
let a = {
|
|
@@ -16779,8 +16966,8 @@ function ly(e = {}) {
|
|
|
16779
16966
|
todos: [],
|
|
16780
16967
|
memory: ""
|
|
16781
16968
|
};
|
|
16782
|
-
for (let r of
|
|
16783
|
-
let i = await l.get(
|
|
16969
|
+
for (let r of ey) {
|
|
16970
|
+
let i = await l.get(ry(t, e, n, r));
|
|
16784
16971
|
i != null && (a[r] = i);
|
|
16785
16972
|
}
|
|
16786
16973
|
return i.lastAccessed = Date.now(), await l.set(r, i), a;
|
|
@@ -16788,7 +16975,7 @@ function ly(e = {}) {
|
|
|
16788
16975
|
},
|
|
16789
16976
|
async save(e, t, n) {
|
|
16790
16977
|
let r = [];
|
|
16791
|
-
for (let i of
|
|
16978
|
+
for (let i of ey) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
|
|
16792
16979
|
await Promise.all(r);
|
|
16793
16980
|
},
|
|
16794
16981
|
async flush() {
|
|
@@ -16802,10 +16989,10 @@ function ly(e = {}) {
|
|
|
16802
16989
|
})), c({ type: "flush" }), await b();
|
|
16803
16990
|
},
|
|
16804
16991
|
async deleteSession(e, n) {
|
|
16805
|
-
await l.clearPrefix(
|
|
16992
|
+
await l.clearPrefix(iy(t, e, n));
|
|
16806
16993
|
},
|
|
16807
16994
|
async createSession(e, n, r) {
|
|
16808
|
-
let i = r ??
|
|
16995
|
+
let i = r ?? Wv(), a = Date.now(), o = {
|
|
16809
16996
|
agentId: e,
|
|
16810
16997
|
sessionId: i,
|
|
16811
16998
|
createdAt: a,
|
|
@@ -16813,7 +17000,7 @@ function ly(e = {}) {
|
|
|
16813
17000
|
bytes: 0,
|
|
16814
17001
|
title: n
|
|
16815
17002
|
};
|
|
16816
|
-
return await l.set(
|
|
17003
|
+
return await l.set(ry(t, e, i, Qv), o), i;
|
|
16817
17004
|
},
|
|
16818
17005
|
onEvent(e) {
|
|
16819
17006
|
s.add(e);
|
|
@@ -16828,34 +17015,34 @@ function ly(e = {}) {
|
|
|
16828
17015
|
}
|
|
16829
17016
|
//#endregion
|
|
16830
17017
|
//#region src/core/sdk/createChatSdk.ts
|
|
16831
|
-
var
|
|
17018
|
+
var hy = [
|
|
16832
17019
|
"你是一个页面操作助手。宿主页面在 window 对象上注册了可操作的属性,你通过专用工具安全地读写这些属性来操作页面。",
|
|
16833
17020
|
"所有写操作都经范围控制(仅注册表内)与 schema 校验(不合法会返回结构化错误而非写入),并自动留快照可回退。",
|
|
16834
17021
|
"大对象/数组优先用增量 patch(只发改动)而非整体重传,避免输出被截断。",
|
|
16835
|
-
|
|
17022
|
+
L_.reliableWriteRules
|
|
16836
17023
|
].join("\n\n");
|
|
16837
|
-
function
|
|
17024
|
+
function gy(e) {
|
|
16838
17025
|
if (!e) return "";
|
|
16839
|
-
let t =
|
|
17026
|
+
let t = R_(e.schema);
|
|
16840
17027
|
return `\n\n## 可操作数据(字段以 read 工具返回的实际值为准)\n${e.description ? e.description + "\n" : ""}${t}`;
|
|
16841
17028
|
}
|
|
16842
|
-
var
|
|
16843
|
-
function
|
|
16844
|
-
return e === void 0 || e === !1 ? null : typeof e == "string" ?
|
|
17029
|
+
var _y = 50;
|
|
17030
|
+
function vy(e) {
|
|
17031
|
+
return e === void 0 || e === !1 ? null : typeof e == "string" ? my({ backend: e }) : e.enabled === !1 ? null : my(e);
|
|
16845
17032
|
}
|
|
16846
|
-
function
|
|
17033
|
+
function yy(e) {
|
|
16847
17034
|
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
16848
17035
|
}
|
|
16849
|
-
var
|
|
16850
|
-
function
|
|
17036
|
+
var by = /* @__PURE__ */ new Map();
|
|
17037
|
+
function xy(e) {
|
|
16851
17038
|
let t = e.content;
|
|
16852
17039
|
return typeof t == "string" ? t : Array.isArray(t) ? t.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(t ?? "");
|
|
16853
17040
|
}
|
|
16854
|
-
function
|
|
17041
|
+
function Sy(e) {
|
|
16855
17042
|
let t = e.summaryLlm ?? e.llm;
|
|
16856
17043
|
if (!t) return;
|
|
16857
17044
|
let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, o = e.summaryTimeoutMs ?? 15e3, c;
|
|
16858
|
-
if (
|
|
17045
|
+
if (yy(t)) c = t;
|
|
16859
17046
|
else {
|
|
16860
17047
|
let i = t;
|
|
16861
17048
|
if (!i.apiKey) {
|
|
@@ -16873,20 +17060,20 @@ function _y(e) {
|
|
|
16873
17060
|
return async (e) => {
|
|
16874
17061
|
let t = new AbortController(), n = setTimeout(() => t.abort(), o);
|
|
16875
17062
|
try {
|
|
16876
|
-
return
|
|
17063
|
+
return xy(await c.invoke([new a("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new i(e)], { signal: t.signal })).trim();
|
|
16877
17064
|
} finally {
|
|
16878
17065
|
clearTimeout(n);
|
|
16879
17066
|
}
|
|
16880
17067
|
};
|
|
16881
17068
|
}
|
|
16882
|
-
function
|
|
17069
|
+
function Cy(e, t) {
|
|
16883
17070
|
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
17071
|
}
|
|
16885
|
-
function
|
|
17072
|
+
function wy(e, t, n) {
|
|
16886
17073
|
return {
|
|
16887
17074
|
name: "sdk-events",
|
|
16888
17075
|
wrapToolCall: async (t, r) => {
|
|
16889
|
-
let i = await r(t), a =
|
|
17076
|
+
let i = await r(t), a = Cy(t.name, t.args);
|
|
16890
17077
|
return a && e({
|
|
16891
17078
|
type: "data_change",
|
|
16892
17079
|
operation: a,
|
|
@@ -16901,7 +17088,7 @@ function yy(e, t, n) {
|
|
|
16901
17088
|
}
|
|
16902
17089
|
};
|
|
16903
17090
|
}
|
|
16904
|
-
function
|
|
17091
|
+
function Ty(e, r) {
|
|
16905
17092
|
let i = /* @__PURE__ */ fn(null), a = 0;
|
|
16906
17093
|
function o(e) {
|
|
16907
17094
|
return new Promise((t) => {
|
|
@@ -16922,17 +17109,17 @@ function by(e, r) {
|
|
|
16922
17109
|
let t = i.value;
|
|
16923
17110
|
t && (i.value = null, t.resolve({ action: e }));
|
|
16924
17111
|
}
|
|
16925
|
-
let c =
|
|
17112
|
+
let c = vy(e.storage);
|
|
16926
17113
|
e.debug && c && c.onEvent((e) => console.log("[page-agent-sdk][storage]", e));
|
|
16927
|
-
let l =
|
|
17114
|
+
let l = yy(e.llm) ? void 0 : e.llm, u = ng({
|
|
16928
17115
|
model: l?.model,
|
|
16929
17116
|
contextWindow: e.contextWindow ?? l?.contextWindow,
|
|
16930
17117
|
maxOutputTokens: e.maxOutputTokens ?? l?.maxOutputTokens
|
|
16931
17118
|
});
|
|
16932
17119
|
e.debug && console.log("[page-agent-sdk][modelCaps]", u);
|
|
16933
|
-
let d =
|
|
17120
|
+
let d = Sy(e);
|
|
16934
17121
|
e.debug && !d && console.warn("[page-agent-sdk][summarization] 未构造 llmInvoke(apiKey 缺失?),摘要回退零成本索引摘要");
|
|
16935
|
-
let f = /* @__PURE__ */ Qt([]), p =
|
|
17122
|
+
let f = /* @__PURE__ */ Qt([]), p = G_(e.vfs?.initialFiles, {
|
|
16936
17123
|
persist: c ? { save: (e) => {
|
|
16937
17124
|
B.sessionId && c && c.save(r, B.sessionId, { vfs: e });
|
|
16938
17125
|
} } : void 0,
|
|
@@ -16947,13 +17134,13 @@ function by(e, r) {
|
|
|
16947
17134
|
getTodos: () => g.current?.getState?.()?.todos ?? [],
|
|
16948
17135
|
messages: f,
|
|
16949
17136
|
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 ??
|
|
17137
|
+
}) : 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
17138
|
onAudit: e.debug ? (e) => console.log("[page-agent-sdk][data audit]", e) : void 0,
|
|
16952
17139
|
maxSnapshots: e.maxSnapshots,
|
|
16953
17140
|
onConflict: o,
|
|
16954
17141
|
autoLock: e.autoLock,
|
|
16955
17142
|
interceptors: e.interceptors
|
|
16956
|
-
}) : [], E = C ?
|
|
17143
|
+
}) : [], 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
17144
|
A.forEach((e) => k.set(e.name, "builtin"));
|
|
16958
17145
|
let j = [...e.tools || []];
|
|
16959
17146
|
j.forEach((e) => k.set(e.name, "user"));
|
|
@@ -17008,7 +17195,7 @@ function by(e, r) {
|
|
|
17008
17195
|
llm: e.llm,
|
|
17009
17196
|
tools: le
|
|
17010
17197
|
} : void 0
|
|
17011
|
-
}) : void 0, de =
|
|
17198
|
+
}) : void 0, de = Uv({
|
|
17012
17199
|
...S,
|
|
17013
17200
|
humanConfirm: M,
|
|
17014
17201
|
subagents: e.subagents?.map((e) => ({
|
|
@@ -17029,14 +17216,11 @@ function by(e, r) {
|
|
|
17029
17216
|
de,
|
|
17030
17217
|
...I ? [m] : [],
|
|
17031
17218
|
...L ? [kg(e.skills || [], { readVfs: ee ? (e) => p.files[e]?.content : void 0 })] : [],
|
|
17032
|
-
...ee ? [
|
|
17033
|
-
...R ? [
|
|
17034
|
-
...
|
|
17219
|
+
...ee ? [Q_(p)] : [],
|
|
17220
|
+
...R ? [F_({
|
|
17221
|
+
...B_(e, u.contextWindow),
|
|
17035
17222
|
llmInvoke: d,
|
|
17036
|
-
|
|
17037
|
-
path: "",
|
|
17038
|
-
description: O().description ?? "主数据对象"
|
|
17039
|
-
}] : [],
|
|
17223
|
+
getRegisteredData: () => O() ? [{ description: O().description ?? "主数据对象" }] : [],
|
|
17040
17224
|
preserveLastToolResults: (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? ["describe_data", "read"]
|
|
17041
17225
|
})] : [],
|
|
17042
17226
|
...z ? [h] : [],
|
|
@@ -17048,8 +17232,8 @@ function by(e, r) {
|
|
|
17048
17232
|
...oe ? [oe] : [],
|
|
17049
17233
|
...se ? [se] : [],
|
|
17050
17234
|
...e.middleware || [],
|
|
17051
|
-
|
|
17052
|
-
], ge = e.maxMemoryRounds ??
|
|
17235
|
+
wy(me, f, O)
|
|
17236
|
+
], ge = e.maxMemoryRounds ?? _y, B = {
|
|
17053
17237
|
agentId: r,
|
|
17054
17238
|
store: c,
|
|
17055
17239
|
messages: f,
|
|
@@ -17124,14 +17308,14 @@ function by(e, r) {
|
|
|
17124
17308
|
if (B.refCount--, B.refCount <= 0) {
|
|
17125
17309
|
c && (p.flush?.(), c.flush(), c.dispose());
|
|
17126
17310
|
let e = B.mcpClosers.splice(0);
|
|
17127
|
-
e.length && Promise.allSettled(e.map((e) => e())),
|
|
17311
|
+
e.length && Promise.allSettled(e.map((e) => e())), by.delete(r);
|
|
17128
17312
|
}
|
|
17129
17313
|
},
|
|
17130
17314
|
resolveConflict: s,
|
|
17131
17315
|
getInfo() {
|
|
17132
17316
|
return {
|
|
17133
17317
|
id: r,
|
|
17134
|
-
model:
|
|
17318
|
+
model: yy(e.llm) ? e.llm.model ?? e.llm.modelName : e.llm.model,
|
|
17135
17319
|
systemPrompt: w,
|
|
17136
17320
|
tools: F.map((e) => ({
|
|
17137
17321
|
name: e.name,
|
|
@@ -17218,7 +17402,7 @@ function by(e, r) {
|
|
|
17218
17402
|
}), F.push(...n), e.debug && console.log(`[page-agent-sdk][mcp] 注入 ${n.length} 个工具,${B.mcpServers.length} 个 server`);
|
|
17219
17403
|
}
|
|
17220
17404
|
B.agent = bg({
|
|
17221
|
-
...
|
|
17405
|
+
...yy(e.llm) ? { llm: e.llm } : {
|
|
17222
17406
|
apiKey: e.llm.apiKey,
|
|
17223
17407
|
baseUrl: e.llm.baseUrl,
|
|
17224
17408
|
model: e.llm.model,
|
|
@@ -17238,11 +17422,11 @@ function by(e, r) {
|
|
|
17238
17422
|
}), g.current = B.agent;
|
|
17239
17423
|
})(), B;
|
|
17240
17424
|
}
|
|
17241
|
-
function
|
|
17242
|
-
let t = e.id ??
|
|
17425
|
+
function Ey(e) {
|
|
17426
|
+
let t = e.id ?? Wv();
|
|
17243
17427
|
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 =
|
|
17428
|
+
let n = e.streaming ?? !0, r = e.ui ?? "default", i, a = e.shareContext ? by.get(t) : void 0;
|
|
17429
|
+
a ? i = a : (i = Ty(e, t), e.shareContext && by.set(t, i)), i.refCount++;
|
|
17246
17430
|
let o = null, s = null, c = null;
|
|
17247
17431
|
async function l() {
|
|
17248
17432
|
if (await i.initDone, r === !1) {
|
|
@@ -17277,7 +17461,7 @@ function xy(e) {
|
|
|
17277
17461
|
i.afterRound(), i.store && await i.store.flush();
|
|
17278
17462
|
},
|
|
17279
17463
|
onClear: () => {
|
|
17280
|
-
i.store && (i.sessionId =
|
|
17464
|
+
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
17465
|
},
|
|
17282
17466
|
pendingConflict: i.pendingConflict.value,
|
|
17283
17467
|
onResolveConflict: (e) => i.resolveConflict(e)
|
|
@@ -17316,7 +17500,7 @@ function xy(e) {
|
|
|
17316
17500
|
}
|
|
17317
17501
|
//#endregion
|
|
17318
17502
|
//#region src/core/sdk/defineTool.ts
|
|
17319
|
-
function
|
|
17503
|
+
function Dy(e) {
|
|
17320
17504
|
return n(async (t) => {
|
|
17321
17505
|
let n = await e.handler(t);
|
|
17322
17506
|
return typeof n == "string" ? n : JSON.stringify(n);
|
|
@@ -17327,4 +17511,4 @@ function Sy(e) {
|
|
|
17327
17511
|
});
|
|
17328
17512
|
}
|
|
17329
17513
|
//#endregion
|
|
17330
|
-
export {
|
|
17514
|
+
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 };
|