page-agent-sdk 1.2.0 → 1.3.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 +6 -4
- package/README.zh-CN.md +5 -3
- package/dist/page-agent-sdk.iife.js +117 -112
- package/dist/page-agent-sdk.js +323 -291
- package/dist/page-agent-sdk.umd.cjs +25 -20
- package/package.json +1 -1
- package/skills/page-agent-sdk-integrate/SKILL.md +4 -2
- package/skills/page-agent-sdk-integrate/references/advanced.md +32 -0
- package/skills/page-agent-sdk-integrate/references/api.md +13 -0
- package/skills/page-agent-sdk-integrate/references/options.md +2 -2
- package/skills/page-agent-sdk-integrate/references/quickstart.md +33 -1
- package/skills/page-agent-sdk-integrate/references/use-cases.md +31 -0
- package/types/index.d.ts +5 -0
package/dist/page-agent-sdk.js
CHANGED
|
@@ -14876,10 +14876,15 @@ function v_(e) {
|
|
|
14876
14876
|
for (let n of e.assistantMsgs) t += __(n);
|
|
14877
14877
|
return t;
|
|
14878
14878
|
}
|
|
14879
|
-
function y_(e) {
|
|
14879
|
+
function y_(e, t) {
|
|
14880
14880
|
return e.map((e) => {
|
|
14881
|
-
let
|
|
14882
|
-
|
|
14881
|
+
let n = d_(e.userMsg.content, 60) || "(空)", r = e.assistantMsgs[0] ? d_(e.assistantMsgs[0].content, 80) : "(无回复)", i = e.assistantMsgs.flatMap((e) => (e.steps || []).map((e) => e.name)), a = i.length ? ` [工具: ${i.join(", ")}]` : "", o = "";
|
|
14882
|
+
if (t && t.size) {
|
|
14883
|
+
let n = [];
|
|
14884
|
+
for (let r of e.assistantMsgs) for (let e of r.steps || []) e.name && t.has(e.name) && e.result && n.push(`${e.name}: ${d_(e.result, 120)}`);
|
|
14885
|
+
n.length && (o = `\n 字段提示: ${n.join(" | ")}`);
|
|
14886
|
+
}
|
|
14887
|
+
return `- 第${e.round}轮:${n} → ${r}${a}${o}`;
|
|
14883
14888
|
}).join("\n");
|
|
14884
14889
|
}
|
|
14885
14890
|
function b_(e, t, n) {
|
|
@@ -14925,32 +14930,38 @@ function x_(e = {}) {
|
|
|
14925
14930
|
let e = Math.min(t.windowRounds, n.length);
|
|
14926
14931
|
a = n.slice(n.length - e), o = n.slice(0, n.length - e), s = "window+";
|
|
14927
14932
|
}
|
|
14928
|
-
let c = [...e].reverse().find((e) => e.role === "user")?.content || "", l, u;
|
|
14933
|
+
let c = [...e].reverse().find((e) => e.role === "user")?.content || "", l = t.preserveLastToolResults?.length ? new Set(t.preserveLastToolResults) : void 0, u, d;
|
|
14929
14934
|
if (t.enableLLMSummary && t.llmInvoke) try {
|
|
14930
|
-
|
|
14935
|
+
u = await t.llmInvoke(y_(o, l)), d = s + "llm_summary";
|
|
14931
14936
|
} catch {
|
|
14932
|
-
|
|
14933
|
-
}
|
|
14934
|
-
else
|
|
14935
|
-
let
|
|
14936
|
-
|
|
14937
|
-
|
|
14937
|
+
u = y_(o, l), d = s + "index_summary(llm_fallback)";
|
|
14938
|
+
}
|
|
14939
|
+
else u = y_(o, l), d = s + "index_summary";
|
|
14940
|
+
let f = t.enableRecall ? b_(o, c, t.recallTopK) : [], p = f.length ? f.map((e) => `- 第${e.round}轮:${d_(e.userMsg.content, 60)} → ${e.assistantMsgs[0] ? d_(e.assistantMsgs[0].content, 80) : ""}`).join("\n") : "", m = [`【对话历史摘要】以下是之前 ${o.length} 轮对话的要点(最新 ${a.length} 轮已完整保留):`, u];
|
|
14941
|
+
if (p && m.push("\n【与当前问题可能相关的早期对话】", p), t.getRegisteredProps) try {
|
|
14942
|
+
let e = t.getRegisteredProps();
|
|
14943
|
+
if (e.length) {
|
|
14944
|
+
let t = e.map((e) => `- ${e.path}: ${e.description}`).join("\n");
|
|
14945
|
+
m.push("\n【当前可操作 window 属性(动态增删后的最新状态,操作前以 list_window_props 为准)】", t);
|
|
14946
|
+
}
|
|
14947
|
+
} catch {}
|
|
14948
|
+
let h = {
|
|
14938
14949
|
role: "system",
|
|
14939
|
-
content:
|
|
14950
|
+
content: m.join("\n"),
|
|
14940
14951
|
timestamp: Date.now()
|
|
14941
|
-
},
|
|
14942
|
-
for (let e of a)
|
|
14943
|
-
let
|
|
14952
|
+
}, g = [];
|
|
14953
|
+
for (let e of a) g.push(e.userMsg), g.push(...e.assistantMsgs);
|
|
14954
|
+
let _ = [h, ...g];
|
|
14944
14955
|
return {
|
|
14945
|
-
messages:
|
|
14956
|
+
messages: _,
|
|
14946
14957
|
stats: {
|
|
14947
14958
|
triggered: !0,
|
|
14948
14959
|
roundsTotal: n.length,
|
|
14949
14960
|
roundsSummarized: o.length,
|
|
14950
|
-
roundsRecalled:
|
|
14961
|
+
roundsRecalled: f.length,
|
|
14951
14962
|
originalMessages: r,
|
|
14952
|
-
compressedMessages:
|
|
14953
|
-
strategy:
|
|
14963
|
+
compressedMessages: _.length,
|
|
14964
|
+
strategy: d
|
|
14954
14965
|
}
|
|
14955
14966
|
};
|
|
14956
14967
|
}
|
|
@@ -14993,8 +15004,29 @@ function C_(e = {}) {
|
|
|
14993
15004
|
};
|
|
14994
15005
|
}
|
|
14995
15006
|
//#endregion
|
|
14996
|
-
//#region src/core/
|
|
15007
|
+
//#region src/core/presets.ts
|
|
14997
15008
|
var w_ = {
|
|
15009
|
+
pageBuilder: { systemPrompt: "你是页面构建助手。流程:get_window_prop 读取当前页面结构 → set_window_prop / edit_window_prop 修改属性 → 页面实时更新。多步任务先用 write_todos 拆解,逐步推进。" },
|
|
15010
|
+
researcher: {
|
|
15011
|
+
systemPrompt: "你是调研助手。多路调研用 spawn_agents 并行委派子 agent(各负责一个方向);单份资料用 fetch_document 抓取;最后结构化汇总,给出结论与依据。",
|
|
15012
|
+
subagent: { maxParallel: 4 }
|
|
15013
|
+
},
|
|
15014
|
+
minimal: { capabilities: {
|
|
15015
|
+
planning: !1,
|
|
15016
|
+
skills: !1,
|
|
15017
|
+
vfs: !1,
|
|
15018
|
+
summarization: !1,
|
|
15019
|
+
memory: !1,
|
|
15020
|
+
subagent: !1
|
|
15021
|
+
} }
|
|
15022
|
+
}, T_ = { reliableWriteRules: [
|
|
15023
|
+
"【可靠写入规则】",
|
|
15024
|
+
"1. 改任何属性前,先用 get_window_prop 读其当前真实值,基于真实值改,不要凭记忆;",
|
|
15025
|
+
"2. 若不确定可操作哪些属性,先 list_window_props 查看当前注册项(动态组件场景下注册表会增删,以工具返回为准,勿凭旧记忆);",
|
|
15026
|
+
"3. 不确定某属性字段结构时,先 describe_window_prop 看其说明,字段以 describe 返回为准;",
|
|
15027
|
+
"4. 写入若被 schema 校验拒绝(返回结构化错误含字段名与期望类型),按错误修正后重试,不要放弃;",
|
|
15028
|
+
"5. 优先用 edit_window_prop 增量 patch(只发改动),避免 set 整体重传大 JSON 被截断。"
|
|
15029
|
+
].join("\n") }, E_ = {
|
|
14998
15030
|
auto: {
|
|
14999
15031
|
summaryThresholdRatio: .5,
|
|
15000
15032
|
windowRatio: .4,
|
|
@@ -15016,8 +15048,8 @@ var w_ = {
|
|
|
15016
15048
|
enableLLMSummary: !0
|
|
15017
15049
|
}
|
|
15018
15050
|
};
|
|
15019
|
-
function
|
|
15020
|
-
let n =
|
|
15051
|
+
function D_(e, t) {
|
|
15052
|
+
let n = E_[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
|
|
15021
15053
|
return {
|
|
15022
15054
|
...n,
|
|
15023
15055
|
...r,
|
|
@@ -15034,7 +15066,7 @@ function $(e) {
|
|
|
15034
15066
|
};
|
|
15035
15067
|
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)}`;
|
|
15036
15068
|
}
|
|
15037
|
-
function
|
|
15069
|
+
function O_(e) {
|
|
15038
15070
|
return e.slice(0, 10).map((e) => {
|
|
15039
15071
|
let t = e, n = {
|
|
15040
15072
|
path: (Array.isArray(t.path) ? t.path.join(".") : String(t.path ?? "")) || "(root)",
|
|
@@ -15043,16 +15075,16 @@ function E_(e) {
|
|
|
15043
15075
|
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;
|
|
15044
15076
|
});
|
|
15045
15077
|
}
|
|
15046
|
-
function
|
|
15078
|
+
function k_(e, t) {
|
|
15047
15079
|
return $({
|
|
15048
15080
|
code: "SCHEMA_INVALID",
|
|
15049
15081
|
path: e,
|
|
15050
15082
|
message: `值不符合 "${e}" 的 schema(${t.length} 处问题)`,
|
|
15051
15083
|
hint: `按 describe_window_prop("${e}") 查看格式,修正后重试;改大对象优先用 edit_window_prop 增量 patch(只发改动部分)`,
|
|
15052
|
-
details:
|
|
15084
|
+
details: O_(t)
|
|
15053
15085
|
});
|
|
15054
15086
|
}
|
|
15055
|
-
function
|
|
15087
|
+
function A_(e, t, n) {
|
|
15056
15088
|
let r = n?.message || String(n);
|
|
15057
15089
|
return $({
|
|
15058
15090
|
code: "JSON_PARSE",
|
|
@@ -15061,18 +15093,18 @@ function O_(e, t, n) {
|
|
|
15061
15093
|
hint: `检查引号/逗号/括号是否闭合;字符串值需双引号包裹(如 '"dark"' 表示字符串 dark,数字直接写如 5);预览前 80 字符:${t.slice(0, 80)}`
|
|
15062
15094
|
});
|
|
15063
15095
|
}
|
|
15064
|
-
var
|
|
15065
|
-
function
|
|
15096
|
+
var j_ = .9;
|
|
15097
|
+
function M_(e, t = {}) {
|
|
15066
15098
|
let n = Object.create(null);
|
|
15067
|
-
if (e) for (let [t, r] of Object.entries(e)) n[
|
|
15099
|
+
if (e) for (let [t, r] of Object.entries(e)) n[F_(t)] = {
|
|
15068
15100
|
content: r,
|
|
15069
|
-
updatedAt:
|
|
15101
|
+
updatedAt: L_()
|
|
15070
15102
|
};
|
|
15071
15103
|
let { persist: r } = t, i = t.maxBytes ?? 4194304;
|
|
15072
15104
|
function a() {
|
|
15073
|
-
if (
|
|
15074
|
-
let e = i *
|
|
15075
|
-
for (let [r] of t) if (delete n[r],
|
|
15105
|
+
if (P_(n) <= i) return;
|
|
15106
|
+
let e = i * j_, t = Object.entries(n).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
|
|
15107
|
+
for (let [r] of t) if (delete n[r], P_(n) <= e) break;
|
|
15076
15108
|
}
|
|
15077
15109
|
let o = null;
|
|
15078
15110
|
function s() {
|
|
@@ -15097,7 +15129,7 @@ function A_(e, t = {}) {
|
|
|
15097
15129
|
}
|
|
15098
15130
|
}) };
|
|
15099
15131
|
return r && (l.hydrate = (e) => {
|
|
15100
|
-
for (let [t, r] of Object.entries(e)) n[
|
|
15132
|
+
for (let [t, r] of Object.entries(e)) n[F_(t)] = r;
|
|
15101
15133
|
a();
|
|
15102
15134
|
}, l.flush = () => {
|
|
15103
15135
|
o &&= (clearTimeout(o), null), s();
|
|
@@ -15106,17 +15138,17 @@ function A_(e, t = {}) {
|
|
|
15106
15138
|
c();
|
|
15107
15139
|
}), l;
|
|
15108
15140
|
}
|
|
15109
|
-
var
|
|
15110
|
-
function
|
|
15111
|
-
|
|
15141
|
+
var N_ = null;
|
|
15142
|
+
function P_(e) {
|
|
15143
|
+
N_ ||= new TextEncoder();
|
|
15112
15144
|
let t = 0;
|
|
15113
|
-
for (let n of Object.values(e)) t +=
|
|
15145
|
+
for (let n of Object.values(e)) t += N_.encode(n.content).length;
|
|
15114
15146
|
return t;
|
|
15115
15147
|
}
|
|
15116
|
-
function
|
|
15148
|
+
function F_(e) {
|
|
15117
15149
|
return e.replace(/^\/+/, "").replace(/\/+/g, "/");
|
|
15118
15150
|
}
|
|
15119
|
-
function
|
|
15151
|
+
function I_(e) {
|
|
15120
15152
|
let t = "";
|
|
15121
15153
|
for (let n = 0; n < e.length; n++) {
|
|
15122
15154
|
let r = e[n];
|
|
@@ -15124,13 +15156,13 @@ function P_(e) {
|
|
|
15124
15156
|
}
|
|
15125
15157
|
return RegExp("^" + t + "$");
|
|
15126
15158
|
}
|
|
15127
|
-
function
|
|
15159
|
+
function L_() {
|
|
15128
15160
|
return Date.now();
|
|
15129
15161
|
}
|
|
15130
|
-
function
|
|
15162
|
+
function R_(e) {
|
|
15131
15163
|
return [
|
|
15132
15164
|
n(async ({ path: t, offset: n, limit: r }) => {
|
|
15133
|
-
let i = e.files[
|
|
15165
|
+
let i = e.files[F_(t)];
|
|
15134
15166
|
if (!i) return $({
|
|
15135
15167
|
code: "NOT_FOUND",
|
|
15136
15168
|
path: t,
|
|
@@ -15148,9 +15180,9 @@ function I_(e) {
|
|
|
15148
15180
|
limit: t.number().int().min(1).default(2e3).describe("读取行数")
|
|
15149
15181
|
})
|
|
15150
15182
|
}),
|
|
15151
|
-
n(async ({ path: t, content: n }) => (e.files[
|
|
15183
|
+
n(async ({ path: t, content: n }) => (e.files[F_(t)] = {
|
|
15152
15184
|
content: n,
|
|
15153
|
-
updatedAt:
|
|
15185
|
+
updatedAt: L_()
|
|
15154
15186
|
}, `已写入 ${t}(${n.length} 字符)`), {
|
|
15155
15187
|
name: "vfs_write",
|
|
15156
15188
|
description: "写入/覆盖虚拟工作区文件,作为中间工作记忆。",
|
|
@@ -15160,7 +15192,7 @@ function I_(e) {
|
|
|
15160
15192
|
})
|
|
15161
15193
|
}),
|
|
15162
15194
|
n(async ({ path: t, oldString: n, newString: r }) => {
|
|
15163
|
-
let i =
|
|
15195
|
+
let i = F_(t), a = e.files[i];
|
|
15164
15196
|
if (!a) return $({
|
|
15165
15197
|
code: "NOT_FOUND",
|
|
15166
15198
|
path: t,
|
|
@@ -15190,7 +15222,7 @@ function I_(e) {
|
|
|
15190
15222
|
}
|
|
15191
15223
|
return e.files[i] = {
|
|
15192
15224
|
content: a.content.replace(n, r),
|
|
15193
|
-
updatedAt:
|
|
15225
|
+
updatedAt: L_()
|
|
15194
15226
|
}, `已替换 ${t} 中 1 处。`;
|
|
15195
15227
|
}, {
|
|
15196
15228
|
name: "vfs_edit",
|
|
@@ -15212,7 +15244,7 @@ function I_(e) {
|
|
|
15212
15244
|
n(async ({ pattern: t }) => {
|
|
15213
15245
|
let n;
|
|
15214
15246
|
try {
|
|
15215
|
-
n =
|
|
15247
|
+
n = I_(t);
|
|
15216
15248
|
} catch (e) {
|
|
15217
15249
|
return $({
|
|
15218
15250
|
code: "GLOB_INVALID",
|
|
@@ -15241,7 +15273,7 @@ function I_(e) {
|
|
|
15241
15273
|
details: { pattern: t }
|
|
15242
15274
|
});
|
|
15243
15275
|
}
|
|
15244
|
-
let i = n ? [
|
|
15276
|
+
let i = n ? [F_(n)] : Object.keys(e.files), a = [];
|
|
15245
15277
|
for (let t of i) {
|
|
15246
15278
|
let n = e.files[t];
|
|
15247
15279
|
n && n.content.split("\n").forEach((e, n) => {
|
|
@@ -15259,17 +15291,17 @@ function I_(e) {
|
|
|
15259
15291
|
})
|
|
15260
15292
|
];
|
|
15261
15293
|
}
|
|
15262
|
-
function
|
|
15294
|
+
function z_(e) {
|
|
15263
15295
|
return {
|
|
15264
15296
|
name: "vfs",
|
|
15265
|
-
tools:
|
|
15297
|
+
tools: R_(e),
|
|
15266
15298
|
beforeAgent: () => ({ files: e.files })
|
|
15267
15299
|
};
|
|
15268
15300
|
}
|
|
15269
15301
|
//#endregion
|
|
15270
15302
|
//#region src/core/tools/windowQuery.ts
|
|
15271
|
-
var
|
|
15272
|
-
function
|
|
15303
|
+
var B_ = /[\w$-]/;
|
|
15304
|
+
function V_(e) {
|
|
15273
15305
|
let t = [], n = e.trim(), r = +(n[0] === "$");
|
|
15274
15306
|
for (; r < n.length;) {
|
|
15275
15307
|
let e = n[r];
|
|
@@ -15280,7 +15312,7 @@ function z_(e) {
|
|
|
15280
15312
|
continue;
|
|
15281
15313
|
}
|
|
15282
15314
|
let e = "";
|
|
15283
|
-
for (; r < n.length &&
|
|
15315
|
+
for (; r < n.length && B_.test(n[r]);) e += n[r++];
|
|
15284
15316
|
if (!e) throw Error("JSONPath: .. 后缺属性名");
|
|
15285
15317
|
t.push({
|
|
15286
15318
|
type: "descendKey",
|
|
@@ -15293,7 +15325,7 @@ function z_(e) {
|
|
|
15293
15325
|
continue;
|
|
15294
15326
|
}
|
|
15295
15327
|
let e = "";
|
|
15296
|
-
for (; r < n.length &&
|
|
15328
|
+
for (; r < n.length && B_.test(n[r]);) e += n[r++];
|
|
15297
15329
|
if (!e) throw Error("JSONPath: . 后缺属性名");
|
|
15298
15330
|
t.push({
|
|
15299
15331
|
type: "key",
|
|
@@ -15349,7 +15381,7 @@ function z_(e) {
|
|
|
15349
15381
|
}
|
|
15350
15382
|
return t;
|
|
15351
15383
|
}
|
|
15352
|
-
function
|
|
15384
|
+
function H_(e) {
|
|
15353
15385
|
let t = [], n = 0, r = e.trim();
|
|
15354
15386
|
for (; n < r.length;) {
|
|
15355
15387
|
let e = r[n];
|
|
@@ -15394,7 +15426,7 @@ function B_(e) {
|
|
|
15394
15426
|
}
|
|
15395
15427
|
return t;
|
|
15396
15428
|
}
|
|
15397
|
-
var
|
|
15429
|
+
var U_ = class {
|
|
15398
15430
|
toks;
|
|
15399
15431
|
item;
|
|
15400
15432
|
pos = 0;
|
|
@@ -15430,12 +15462,12 @@ var V_ = class {
|
|
|
15430
15462
|
return this.next(), e;
|
|
15431
15463
|
}
|
|
15432
15464
|
let e = this.operand(), t = this.peek();
|
|
15433
|
-
return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(),
|
|
15465
|
+
return t === "==" || t === "!=" || t === "<" || t === "<=" || t === ">" || t === ">=" ? (this.next(), K_(t, e, this.operand())) : W_(e);
|
|
15434
15466
|
}
|
|
15435
15467
|
operand() {
|
|
15436
15468
|
let e = this.next();
|
|
15437
15469
|
if (e === void 0) throw Error("过滤表达式:缺操作数");
|
|
15438
|
-
if (e.startsWith("@")) return
|
|
15470
|
+
if (e.startsWith("@")) return G_(e, this.item);
|
|
15439
15471
|
if (e[0] === "'" || e[0] === "\"") return e.slice(1, -1);
|
|
15440
15472
|
if (e === "true") return !0;
|
|
15441
15473
|
if (e === "false") return !1;
|
|
@@ -15445,10 +15477,10 @@ var V_ = class {
|
|
|
15445
15477
|
throw Error(`过滤表达式:未知操作数 '${e}'`);
|
|
15446
15478
|
}
|
|
15447
15479
|
};
|
|
15448
|
-
function
|
|
15480
|
+
function W_(e) {
|
|
15449
15481
|
return !!e && e !== 0 && e !== "" && e !== null;
|
|
15450
15482
|
}
|
|
15451
|
-
function
|
|
15483
|
+
function G_(e, t) {
|
|
15452
15484
|
let n = e.split(".").filter((e) => e && e !== "@"), r = t;
|
|
15453
15485
|
for (let e of n) {
|
|
15454
15486
|
if (typeof r != "object" || !r) return;
|
|
@@ -15456,7 +15488,7 @@ function U_(e, t) {
|
|
|
15456
15488
|
}
|
|
15457
15489
|
return r;
|
|
15458
15490
|
}
|
|
15459
|
-
function
|
|
15491
|
+
function K_(e, t, n) {
|
|
15460
15492
|
switch (e) {
|
|
15461
15493
|
case "==": return t === n;
|
|
15462
15494
|
case "!=": return t !== n;
|
|
@@ -15467,47 +15499,47 @@ function W_(e, t, n) {
|
|
|
15467
15499
|
default: return !1;
|
|
15468
15500
|
}
|
|
15469
15501
|
}
|
|
15470
|
-
function
|
|
15471
|
-
return new
|
|
15502
|
+
function q_(e, t) {
|
|
15503
|
+
return new U_(H_(e), t).parse();
|
|
15472
15504
|
}
|
|
15473
|
-
function
|
|
15505
|
+
function J_(e, t) {
|
|
15474
15506
|
return e ? `${e}.${t}` : String(t);
|
|
15475
15507
|
}
|
|
15476
|
-
function
|
|
15508
|
+
function Y_(e, t) {
|
|
15477
15509
|
let n = [{
|
|
15478
15510
|
path: "",
|
|
15479
15511
|
value: e
|
|
15480
15512
|
}];
|
|
15481
|
-
for (let e of
|
|
15513
|
+
for (let e of V_(t)) {
|
|
15482
15514
|
let t = [];
|
|
15483
15515
|
if (e.type === "key") for (let r of n) r.value != null && typeof r.value == "object" && e.key in r.value && t.push({
|
|
15484
|
-
path:
|
|
15516
|
+
path: J_(r.path, e.key),
|
|
15485
15517
|
value: r.value[e.key]
|
|
15486
15518
|
});
|
|
15487
15519
|
else if (e.type === "index") {
|
|
15488
15520
|
for (let r of n) if (Array.isArray(r.value)) {
|
|
15489
15521
|
let n = r.value[e.index];
|
|
15490
15522
|
e.index >= 0 && e.index < r.value.length && t.push({
|
|
15491
|
-
path:
|
|
15523
|
+
path: J_(r.path, e.index),
|
|
15492
15524
|
value: n,
|
|
15493
15525
|
index: e.index
|
|
15494
15526
|
});
|
|
15495
15527
|
}
|
|
15496
15528
|
} else if (e.type === "wildcard") {
|
|
15497
15529
|
for (let e of n) if (Array.isArray(e.value)) e.value.forEach((n, r) => t.push({
|
|
15498
|
-
path:
|
|
15530
|
+
path: J_(e.path, r),
|
|
15499
15531
|
value: n,
|
|
15500
15532
|
index: r
|
|
15501
15533
|
}));
|
|
15502
15534
|
else if (e.value != null && typeof e.value == "object") for (let n of Object.keys(e.value)) t.push({
|
|
15503
|
-
path:
|
|
15535
|
+
path: J_(e.path, n),
|
|
15504
15536
|
value: e.value[n]
|
|
15505
15537
|
});
|
|
15506
15538
|
} else if (e.type === "descendKey") {
|
|
15507
15539
|
let r = e.key, i = (e) => {
|
|
15508
15540
|
if (!(e.value == null || typeof e.value != "object")) for (let n of Object.keys(e.value)) {
|
|
15509
15541
|
let a = {
|
|
15510
|
-
path:
|
|
15542
|
+
path: J_(e.path, n),
|
|
15511
15543
|
value: e.value[n]
|
|
15512
15544
|
};
|
|
15513
15545
|
n === r && t.push(a), i(a);
|
|
@@ -15518,7 +15550,7 @@ function q_(e, t) {
|
|
|
15518
15550
|
let e = (n) => {
|
|
15519
15551
|
if (!(n.value == null || typeof n.value != "object")) for (let r of Object.keys(n.value)) {
|
|
15520
15552
|
let i = {
|
|
15521
|
-
path:
|
|
15553
|
+
path: J_(n.path, r),
|
|
15522
15554
|
value: n.value[r]
|
|
15523
15555
|
};
|
|
15524
15556
|
t.push(i), e(i);
|
|
@@ -15527,16 +15559,16 @@ function q_(e, t) {
|
|
|
15527
15559
|
for (let t of n) e(t);
|
|
15528
15560
|
} else if (e.type === "filter") {
|
|
15529
15561
|
for (let r of n) if (Array.isArray(r.value)) r.value.forEach((n, i) => {
|
|
15530
|
-
|
|
15531
|
-
path:
|
|
15562
|
+
q_(e.filter, n) && t.push({
|
|
15563
|
+
path: J_(r.path, i),
|
|
15532
15564
|
value: n,
|
|
15533
15565
|
index: i
|
|
15534
15566
|
});
|
|
15535
15567
|
});
|
|
15536
15568
|
else if (r.value != null && typeof r.value == "object") for (let n of Object.keys(r.value)) {
|
|
15537
15569
|
let i = r.value[n];
|
|
15538
|
-
|
|
15539
|
-
path:
|
|
15570
|
+
q_(e.filter, i) && t.push({
|
|
15571
|
+
path: J_(r.path, n),
|
|
15540
15572
|
value: i
|
|
15541
15573
|
});
|
|
15542
15574
|
}
|
|
@@ -15545,7 +15577,7 @@ function q_(e, t) {
|
|
|
15545
15577
|
}
|
|
15546
15578
|
return n;
|
|
15547
15579
|
}
|
|
15548
|
-
function
|
|
15580
|
+
function X_(e, t) {
|
|
15549
15581
|
let n = e.length, r = t.length;
|
|
15550
15582
|
if (!n) return r;
|
|
15551
15583
|
if (!r) return n;
|
|
@@ -15561,7 +15593,7 @@ function J_(e, t) {
|
|
|
15561
15593
|
}
|
|
15562
15594
|
return i[r];
|
|
15563
15595
|
}
|
|
15564
|
-
function
|
|
15596
|
+
function Z_(e, t, n = {}) {
|
|
15565
15597
|
let r = n.mode || "substring", i = n.limit ?? 50, a = n.matchKey !== !1, o = [], s = null;
|
|
15566
15598
|
if (r === "regex") try {
|
|
15567
15599
|
s = new RegExp(t, "i");
|
|
@@ -15571,11 +15603,11 @@ function Y_(e, t, n = {}) {
|
|
|
15571
15603
|
let c = (e, l, u) => {
|
|
15572
15604
|
if (o.length >= i || e == null) return;
|
|
15573
15605
|
if (typeof e == "object") {
|
|
15574
|
-
if (Array.isArray(e)) e.forEach((e, t) => c(e,
|
|
15575
|
-
else for (let t of Object.keys(e)) c(e[t],
|
|
15606
|
+
if (Array.isArray(e)) e.forEach((e, t) => c(e, J_(l, t), String(t)));
|
|
15607
|
+
else for (let t of Object.keys(e)) c(e[t], J_(l, t), t);
|
|
15576
15608
|
return;
|
|
15577
15609
|
}
|
|
15578
|
-
let d = String(e), f =
|
|
15610
|
+
let d = String(e), f = Q_(d, t, r, n.fuzzyThreshold ?? 2, s);
|
|
15579
15611
|
if (f) {
|
|
15580
15612
|
o.push({
|
|
15581
15613
|
path: l,
|
|
@@ -15586,7 +15618,7 @@ function Y_(e, t, n = {}) {
|
|
|
15586
15618
|
return;
|
|
15587
15619
|
}
|
|
15588
15620
|
if (a && u) {
|
|
15589
|
-
let e =
|
|
15621
|
+
let e = Q_(u, t, r, n.fuzzyThreshold ?? 2, s);
|
|
15590
15622
|
e && o.push({
|
|
15591
15623
|
path: l,
|
|
15592
15624
|
key: u,
|
|
@@ -15597,18 +15629,18 @@ function Y_(e, t, n = {}) {
|
|
|
15597
15629
|
};
|
|
15598
15630
|
return c(e, ""), o;
|
|
15599
15631
|
}
|
|
15600
|
-
function
|
|
15632
|
+
function Q_(e, t, n, r, i) {
|
|
15601
15633
|
let a = e.toLowerCase(), o = t.toLowerCase();
|
|
15602
15634
|
if (n === "substring") return a.includes(o) ? 1 : null;
|
|
15603
15635
|
if (n === "regex") return i && i.test(e) ? 1 : null;
|
|
15604
15636
|
if (n === "fuzzy") {
|
|
15605
15637
|
if (a.includes(o)) return 2;
|
|
15606
|
-
let e =
|
|
15638
|
+
let e = X_(a, o);
|
|
15607
15639
|
return e <= r ? r - e + 1 : null;
|
|
15608
15640
|
}
|
|
15609
15641
|
return null;
|
|
15610
15642
|
}
|
|
15611
|
-
var
|
|
15643
|
+
var $_ = [
|
|
15612
15644
|
"self.fetch = () => { throw new Error('fetch 已被沙箱禁用') }",
|
|
15613
15645
|
"self.XMLHttpRequest = function(){ throw new Error('XMLHttpRequest 已被沙箱禁用') }",
|
|
15614
15646
|
"self.importScripts = () => { throw new Error('importScripts 已被沙箱禁用') }",
|
|
@@ -15621,7 +15653,7 @@ var Z_ = [
|
|
|
15621
15653
|
"try { self.BroadcastChannel = undefined } catch {}",
|
|
15622
15654
|
"if (self.navigator && self.navigator.sendBeacon) self.navigator.sendBeacon = () => { throw new Error('sendBeacon 已被沙箱禁用') }"
|
|
15623
15655
|
].join("\n");
|
|
15624
|
-
function
|
|
15656
|
+
function ev(e, t, n = 3e3) {
|
|
15625
15657
|
return new Promise((r) => {
|
|
15626
15658
|
let i = Date.now(), a = !1, o = (e) => {
|
|
15627
15659
|
if (!a) {
|
|
@@ -15634,7 +15666,7 @@ function Q_(e, t, n = 3e3) {
|
|
|
15634
15666
|
elapsedMs: Date.now() - i
|
|
15635
15667
|
});
|
|
15636
15668
|
}
|
|
15637
|
-
}, s =
|
|
15669
|
+
}, s = $_ + "\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;
|
|
15638
15670
|
try {
|
|
15639
15671
|
let e = new Blob([s], { type: "application/javascript" });
|
|
15640
15672
|
c = URL.createObjectURL(e), l = new Worker(c);
|
|
@@ -15669,19 +15701,19 @@ function Q_(e, t, n = 3e3) {
|
|
|
15669
15701
|
}
|
|
15670
15702
|
//#endregion
|
|
15671
15703
|
//#region src/core/tools/windowOps.ts
|
|
15672
|
-
var
|
|
15704
|
+
var tv = /* @__PURE__ */ new Set([
|
|
15673
15705
|
"__proto__",
|
|
15674
15706
|
"constructor",
|
|
15675
15707
|
"prototype"
|
|
15676
15708
|
]);
|
|
15677
|
-
function
|
|
15678
|
-
return e.split(".").some((e) =>
|
|
15709
|
+
function nv(e) {
|
|
15710
|
+
return e.split(".").some((e) => tv.has(e));
|
|
15679
15711
|
}
|
|
15680
|
-
function
|
|
15681
|
-
if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t))
|
|
15712
|
+
function rv(e, t) {
|
|
15713
|
+
if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t)) tv.has(n) || (e[n] = t[n]);
|
|
15682
15714
|
}
|
|
15683
|
-
function
|
|
15684
|
-
if (
|
|
15715
|
+
function iv(e, t) {
|
|
15716
|
+
if (nv(t)) return;
|
|
15685
15717
|
let n = t.split("."), r = e;
|
|
15686
15718
|
for (let e of n) {
|
|
15687
15719
|
if (r == null) return;
|
|
@@ -15689,8 +15721,8 @@ function nv(e, t) {
|
|
|
15689
15721
|
}
|
|
15690
15722
|
return r;
|
|
15691
15723
|
}
|
|
15692
|
-
function
|
|
15693
|
-
if (
|
|
15724
|
+
function av(e, t, n) {
|
|
15725
|
+
if (nv(t)) return;
|
|
15694
15726
|
let r = t.split("."), i = e;
|
|
15695
15727
|
for (let e = 0; e < r.length - 1; e++) {
|
|
15696
15728
|
let t = r[e];
|
|
@@ -15698,8 +15730,8 @@ function rv(e, t, n) {
|
|
|
15698
15730
|
}
|
|
15699
15731
|
i[r[r.length - 1]] = n;
|
|
15700
15732
|
}
|
|
15701
|
-
function
|
|
15702
|
-
if (
|
|
15733
|
+
function ov(e, t) {
|
|
15734
|
+
if (nv(t)) return !1;
|
|
15703
15735
|
let n = t.split("."), r = e;
|
|
15704
15736
|
for (let e = 0; e < n.length - 1; e++) {
|
|
15705
15737
|
if (r == null) return !1;
|
|
@@ -15708,10 +15740,10 @@ function iv(e, t) {
|
|
|
15708
15740
|
let i = n[n.length - 1];
|
|
15709
15741
|
return r == null || !(i in r) ? !1 : (delete r[i], !0);
|
|
15710
15742
|
}
|
|
15711
|
-
function
|
|
15743
|
+
function sv(e) {
|
|
15712
15744
|
return e === void 0 ? void 0 : JSON.parse(JSON.stringify(e));
|
|
15713
15745
|
}
|
|
15714
|
-
function
|
|
15746
|
+
function cv(e, t = Infinity) {
|
|
15715
15747
|
let n = /* @__PURE__ */ new WeakSet(), r;
|
|
15716
15748
|
try {
|
|
15717
15749
|
r = JSON.stringify(e, (e, t) => {
|
|
@@ -15730,30 +15762,30 @@ function ov(e, t = Infinity) {
|
|
|
15730
15762
|
}
|
|
15731
15763
|
return r.length > t && (r = r.slice(0, t) + `\n…[已截断,原长度 ${r.length}]`), r;
|
|
15732
15764
|
}
|
|
15733
|
-
function
|
|
15734
|
-
if (t === "set") return n ? (
|
|
15735
|
-
if (t === "remove") return n ? (
|
|
15765
|
+
function lv(e, t, n, r) {
|
|
15766
|
+
if (t === "set") return n ? (av(e, n, r), null) : "set 操作需要 jsonPath(整体替换请用 set_window_prop)";
|
|
15767
|
+
if (t === "remove") return n ? (ov(e, n), null) : "remove 操作需要 jsonPath";
|
|
15736
15768
|
if (t === "merge") {
|
|
15737
|
-
let t = n ?
|
|
15738
|
-
return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (
|
|
15769
|
+
let t = n ? iv(e, n) : e;
|
|
15770
|
+
return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (rv(t, r), null);
|
|
15739
15771
|
}
|
|
15740
|
-
let i = n ?
|
|
15772
|
+
let i = n ? iv(e, n) : e;
|
|
15741
15773
|
return Array.isArray(i) ? (Array.isArray(r) ? i.push(...r) : i.push(r), null) : `append 目标${n ? `(${n})` : "(根)"}不是数组`;
|
|
15742
15774
|
}
|
|
15743
|
-
function
|
|
15744
|
-
if (t === "set")
|
|
15745
|
-
else if (t === "remove")
|
|
15746
|
-
else if (t === "merge")
|
|
15775
|
+
function uv(e, t, n, r) {
|
|
15776
|
+
if (t === "set") av(window, `${e}.${n}`, r);
|
|
15777
|
+
else if (t === "remove") ov(window, `${e}.${n}`);
|
|
15778
|
+
else if (t === "merge") rv(n ? iv(window, `${e}.${n}`) : iv(window, e), r);
|
|
15747
15779
|
else {
|
|
15748
|
-
let t = n ?
|
|
15780
|
+
let t = n ? iv(window, `${e}.${n}`) : iv(window, e);
|
|
15749
15781
|
Array.isArray(r) ? t.push(...r) : t.push(r);
|
|
15750
15782
|
}
|
|
15751
15783
|
}
|
|
15752
|
-
function
|
|
15753
|
-
let n =
|
|
15754
|
-
typeof n == "object" && n ?
|
|
15784
|
+
function dv(e, t) {
|
|
15785
|
+
let n = iv(window, e);
|
|
15786
|
+
typeof n == "object" && n ? fv(n, t) : av(window, e, t);
|
|
15755
15787
|
}
|
|
15756
|
-
function
|
|
15788
|
+
function fv(e, t) {
|
|
15757
15789
|
if (Array.isArray(e)) {
|
|
15758
15790
|
e.length = 0, Array.isArray(t) && e.push(...t);
|
|
15759
15791
|
return;
|
|
@@ -15762,7 +15794,7 @@ function uv(e, t) {
|
|
|
15762
15794
|
for (let t of Object.keys(e)) t in n || delete e[t];
|
|
15763
15795
|
for (let t of Object.keys(n)) e[t] = n[t];
|
|
15764
15796
|
}
|
|
15765
|
-
function
|
|
15797
|
+
function pv(e, r = {}) {
|
|
15766
15798
|
let i = /* @__PURE__ */ new Map();
|
|
15767
15799
|
for (let t of e) i.set(t.path, t);
|
|
15768
15800
|
let a = /* @__PURE__ */ new Map(), o = r.maxSnapshots ?? 20, s = {
|
|
@@ -15777,12 +15809,19 @@ function dv(e, r = {}) {
|
|
|
15777
15809
|
has: (e) => i.has(e)
|
|
15778
15810
|
}, c = (e) => {
|
|
15779
15811
|
r.onAudit?.(e);
|
|
15780
|
-
}
|
|
15781
|
-
function
|
|
15782
|
-
|
|
15812
|
+
};
|
|
15813
|
+
function l() {
|
|
15814
|
+
let e = [...i.keys()];
|
|
15815
|
+
if (!e.length) return "";
|
|
15816
|
+
let t = e.join(", ");
|
|
15817
|
+
return e.length > 8 || t.length > 240 ? `\n(当前可操作属性共 ${e.length} 项,用 list_window_props 查看)` : `\n(当前可操作 path: ${t})`;
|
|
15783
15818
|
}
|
|
15784
|
-
|
|
15785
|
-
|
|
15819
|
+
let u = (r.whitelist ?? !0) === !1;
|
|
15820
|
+
function d(e) {
|
|
15821
|
+
return r.allowRawRead ? !0 : [...i.keys()].some((t) => e === t || e.startsWith(t + ".") || u && t.startsWith(e + "."));
|
|
15822
|
+
}
|
|
15823
|
+
function f(e, t, n) {
|
|
15824
|
+
let r = sv(iv(window, e)), i = a.get(e) || [], s = i.length ? i[i.length - 1].id + 1 : 1;
|
|
15786
15825
|
for (i.push({
|
|
15787
15826
|
id: s,
|
|
15788
15827
|
ts: Date.now(),
|
|
@@ -15792,7 +15831,7 @@ function dv(e, r = {}) {
|
|
|
15792
15831
|
}); i.length > o;) i.shift();
|
|
15793
15832
|
return a.set(e, i), s;
|
|
15794
15833
|
}
|
|
15795
|
-
let
|
|
15834
|
+
let p = n(async () => {
|
|
15796
15835
|
if (!i.size) return "当前没有已注册的可操作 window 属性。";
|
|
15797
15836
|
let e = [...i.values()].map((e) => `- ${e.path}: ${e.description}`);
|
|
15798
15837
|
return `可操作的 window 属性(共 ${i.size} 项):\n${e.join("\n")}`;
|
|
@@ -15800,7 +15839,7 @@ function dv(e, r = {}) {
|
|
|
15800
15839
|
name: "list_window_props",
|
|
15801
15840
|
description: "列出所有已注册、可操作的 window 属性(path + 说明)。操作 window 前先调用此工具了解可用范围。",
|
|
15802
15841
|
schema: t.object({})
|
|
15803
|
-
}),
|
|
15842
|
+
}), m = n(async ({ path: e }) => {
|
|
15804
15843
|
let t = i.get(e);
|
|
15805
15844
|
return t ? [
|
|
15806
15845
|
`路径: ${t.path}`,
|
|
@@ -15816,20 +15855,20 @@ function dv(e, r = {}) {
|
|
|
15816
15855
|
name: "describe_window_prop",
|
|
15817
15856
|
description: "获取单个已注册 window 属性的说明与格式要求。",
|
|
15818
15857
|
schema: t.object({ path: t.string().describe("属性路径,如 app.theme") })
|
|
15819
|
-
}),
|
|
15820
|
-
if (!
|
|
15858
|
+
}), h = n(async ({ path: e }) => {
|
|
15859
|
+
if (!d(e)) return $({
|
|
15821
15860
|
code: "NOT_REGISTERED",
|
|
15822
15861
|
path: e,
|
|
15823
15862
|
message: `属性 "${e}" 不可读取(未注册,且非已注册路径的后代)`,
|
|
15824
15863
|
hint: "用 list_window_props 查看可操作字段;字段白名单读模式下未注册的祖先(整体大 JSON)不暴露,需读其声明子路径"
|
|
15825
15864
|
});
|
|
15826
|
-
let t =
|
|
15827
|
-
return t === void 0 ? `${e} = (undefined)` : `${e} = ${
|
|
15865
|
+
let t = iv(window, e);
|
|
15866
|
+
return t === void 0 ? `${e} = (undefined)` : `${e} = ${cv(t)}`;
|
|
15828
15867
|
}, {
|
|
15829
15868
|
name: "get_window_prop",
|
|
15830
15869
|
description: "读取一个已注册 window 属性的当前值(安全序列化:函数/DOM/循环引用做摘要;大结果由系统自动外存,提示用 vfs_read 回读)。字段白名单读模式(默认)下仅可读注册 path 自身/后代;未注册祖先(整体大 JSON)不可读,避免大 JSON 拉进上下文。",
|
|
15831
15870
|
schema: t.object({ path: t.string().describe("已注册的属性路径或其后代") })
|
|
15832
|
-
}),
|
|
15871
|
+
}), g = n(async ({ path: e, value: t }) => {
|
|
15833
15872
|
let n = i.get(e);
|
|
15834
15873
|
if (!n) return $({
|
|
15835
15874
|
code: "NOT_REGISTERED",
|
|
@@ -15841,18 +15880,18 @@ function dv(e, r = {}) {
|
|
|
15841
15880
|
try {
|
|
15842
15881
|
r = JSON.parse(t);
|
|
15843
15882
|
} catch (n) {
|
|
15844
|
-
return
|
|
15883
|
+
return A_(e, t, n);
|
|
15845
15884
|
}
|
|
15846
15885
|
let a = n.schema.safeParse(r);
|
|
15847
|
-
if (!a.success) return
|
|
15848
|
-
|
|
15849
|
-
let o =
|
|
15850
|
-
return typeof o == "object" && o && a.data !== null && typeof a.data == "object" ?
|
|
15886
|
+
if (!a.success) return k_(e, a.error.issues);
|
|
15887
|
+
f(e, "set");
|
|
15888
|
+
let o = iv(window, e);
|
|
15889
|
+
return typeof o == "object" && o && a.data !== null && typeof a.data == "object" ? fv(o, a.data) : av(window, e, a.data), c({
|
|
15851
15890
|
op: "set",
|
|
15852
15891
|
path: e,
|
|
15853
15892
|
value: a.data,
|
|
15854
15893
|
timestamp: Date.now()
|
|
15855
|
-
}), `已设置 ${e} = ${
|
|
15894
|
+
}), `已设置 ${e} = ${cv(a.data, 600)}${l()}`;
|
|
15856
15895
|
}, {
|
|
15857
15896
|
name: "set_window_prop",
|
|
15858
15897
|
description: "设置一个已注册 window 属性的值(整体替换)。仅能操作注册表内声明的属性;value 为 JSON 字符串,需通过该属性声明的 schema 校验。校验失败会返回错误而非写入。大对象/数组强烈建议改用 edit_window_prop 增量 patch —— 整体重传大 JSON 时输出可能被 max_tokens 截断,导致 JSON 不完整而校验失败,且浪费 token。",
|
|
@@ -15860,7 +15899,7 @@ function dv(e, r = {}) {
|
|
|
15860
15899
|
path: t.string().describe("已注册的属性路径"),
|
|
15861
15900
|
value: t.string().describe("JSON 字符串形式的值,需符合该属性 schema")
|
|
15862
15901
|
})
|
|
15863
|
-
}),
|
|
15902
|
+
}), _ = n(async ({ path: e, op: t, jsonPath: n, value: r }) => {
|
|
15864
15903
|
let a = i.get(e);
|
|
15865
15904
|
if (!a) return $({
|
|
15866
15905
|
code: "NOT_REGISTERED",
|
|
@@ -15869,7 +15908,7 @@ function dv(e, r = {}) {
|
|
|
15869
15908
|
hint: "用 list_window_props 查看可用属性"
|
|
15870
15909
|
});
|
|
15871
15910
|
let o = n || "";
|
|
15872
|
-
if (
|
|
15911
|
+
if (nv(o)) return $({
|
|
15873
15912
|
code: "PATH_UNSAFE",
|
|
15874
15913
|
path: e,
|
|
15875
15914
|
message: `jsonPath "${o}" 含非法段(__proto__/constructor/prototype)`,
|
|
@@ -15886,31 +15925,31 @@ function dv(e, r = {}) {
|
|
|
15886
15925
|
try {
|
|
15887
15926
|
s = JSON.parse(r);
|
|
15888
15927
|
} catch (t) {
|
|
15889
|
-
return
|
|
15928
|
+
return A_(e, r, t);
|
|
15890
15929
|
}
|
|
15891
15930
|
}
|
|
15892
|
-
let
|
|
15893
|
-
if (typeof
|
|
15931
|
+
let u = iv(window, e);
|
|
15932
|
+
if (typeof u != "object" || !u) return $({
|
|
15894
15933
|
code: "NOT_OBJECT",
|
|
15895
15934
|
path: e,
|
|
15896
|
-
message: `edit 仅适用于对象/数组属性,"${e}" 当前是 ${
|
|
15935
|
+
message: `edit 仅适用于对象/数组属性,"${e}" 当前是 ${u === void 0 ? "undefined" : typeof u}`,
|
|
15897
15936
|
hint: "叶子属性(原始类型)请用 set_window_prop 整体设置"
|
|
15898
15937
|
});
|
|
15899
|
-
let
|
|
15900
|
-
if (
|
|
15938
|
+
let d = sv(u), p = lv(d, t, o, s);
|
|
15939
|
+
if (p) return $({
|
|
15901
15940
|
code: "PATCH_FAILED",
|
|
15902
15941
|
path: e,
|
|
15903
|
-
message:
|
|
15942
|
+
message: p,
|
|
15904
15943
|
hint: "检查 op 与目标类型:merge 需目标为对象,append 需目标为数组;jsonPath 指向需存在"
|
|
15905
15944
|
});
|
|
15906
|
-
let
|
|
15907
|
-
return
|
|
15945
|
+
let m = a.schema.safeParse(d);
|
|
15946
|
+
return m.success ? (f(e, "edit"), uv(e, t, o, s), c({
|
|
15908
15947
|
op: "edit",
|
|
15909
15948
|
path: e,
|
|
15910
15949
|
detail: `${t}${o ? "@" + o : ""}`,
|
|
15911
15950
|
value: s,
|
|
15912
15951
|
timestamp: Date.now()
|
|
15913
|
-
}), `已 edit ${e}(${t}${o ? " @ " + o : ""})。当前值:${
|
|
15952
|
+
}), `已 edit ${e}(${t}${o ? " @ " + o : ""})。当前值:${cv(iv(window, e), 600)}${l()}`) : k_(e, m.error.issues);
|
|
15914
15953
|
}, {
|
|
15915
15954
|
name: "edit_window_prop",
|
|
15916
15955
|
description: "增量编辑一个已注册的「对象/数组」window 属性,只发改动的 patch,无需重传整个大对象。op:set(在 jsonPath 设值)、remove(删 jsonPath)、merge(把 value 合并到 jsonPath 指向的对象,默认根)、append(把 value 追加到 jsonPath 指向的数组,默认根)。jsonPath 为相对属性根的点号路径(数组索引用数字,如 components.0.text);value 为 JSON 字符串。整体仍经 schema 校验,失败不写入。",
|
|
@@ -15925,25 +15964,25 @@ function dv(e, r = {}) {
|
|
|
15925
15964
|
jsonPath: t.string().optional().describe("相对属性根的点号路径(数组索引用数字,如 components.0.text)。set/remove 必填;merge/append 不填则作用于根"),
|
|
15926
15965
|
value: t.string().optional().describe("JSON 字符串(set/merge/append 必填)")
|
|
15927
15966
|
})
|
|
15928
|
-
}),
|
|
15967
|
+
}), v = n(async ({ path: e }) => {
|
|
15929
15968
|
if (!i.has(e)) return $({
|
|
15930
15969
|
code: "NOT_REGISTERED",
|
|
15931
15970
|
path: e,
|
|
15932
15971
|
message: `属性 "${e}" 未在注册表中声明,不可删除`,
|
|
15933
15972
|
hint: "用 list_window_props 查看可用属性"
|
|
15934
15973
|
});
|
|
15935
|
-
|
|
15936
|
-
let t =
|
|
15974
|
+
f(e, "delete");
|
|
15975
|
+
let t = ov(window, e);
|
|
15937
15976
|
return c({
|
|
15938
15977
|
op: "delete",
|
|
15939
15978
|
path: e,
|
|
15940
15979
|
timestamp: Date.now()
|
|
15941
|
-
}), t ? `已删除 ${e}` : `${e} 不存在(无需删除)`;
|
|
15980
|
+
}), t ? `已删除 ${e}${l()}` : `${e} 不存在(无需删除)${l()}`;
|
|
15942
15981
|
}, {
|
|
15943
15982
|
name: "delete_window_prop",
|
|
15944
15983
|
description: "删除一个已注册 window 属性。",
|
|
15945
15984
|
schema: t.object({ path: t.string().describe("已注册的属性路径") })
|
|
15946
|
-
}),
|
|
15985
|
+
}), y = n(async ({ path: e, label: t }) => i.has(e) ? `已为 ${e} 创建快照 #${f(e, "manual", t)}${t ? `(${t})` : ""}。可用 list_window_snapshots 查看、restore_window_snapshot 回退。` : $({
|
|
15947
15986
|
code: "NOT_REGISTERED",
|
|
15948
15987
|
path: e,
|
|
15949
15988
|
message: `属性 "${e}" 未注册,无法打快照`,
|
|
@@ -15955,7 +15994,7 @@ function dv(e, r = {}) {
|
|
|
15955
15994
|
path: t.string().describe("已注册的属性路径"),
|
|
15956
15995
|
label: t.string().optional().describe("可选的快照标签,便于识别")
|
|
15957
15996
|
})
|
|
15958
|
-
}),
|
|
15997
|
+
}), b = n(async ({ path: e }) => {
|
|
15959
15998
|
let t = e ? [e] : [...i.keys()];
|
|
15960
15999
|
if (e && !i.has(e)) return $({
|
|
15961
16000
|
code: "NOT_REGISTERED",
|
|
@@ -15981,7 +16020,7 @@ function dv(e, r = {}) {
|
|
|
15981
16020
|
name: "list_window_snapshots",
|
|
15982
16021
|
description: "列出 window 属性的快照时间线(序号、操作类型、标签、大小)。不传 path 列出所有属性。",
|
|
15983
16022
|
schema: t.object({ path: t.string().optional().describe("限定单个属性,不传则列出全部") })
|
|
15984
|
-
}),
|
|
16023
|
+
}), x = n(async ({ path: e, id: t }) => {
|
|
15985
16024
|
let n = i.get(e);
|
|
15986
16025
|
if (!n) return $({
|
|
15987
16026
|
code: "NOT_REGISTERED",
|
|
@@ -16004,7 +16043,7 @@ function dv(e, r = {}) {
|
|
|
16004
16043
|
hint: "用 list_window_snapshots 查看可用快照序号"
|
|
16005
16044
|
});
|
|
16006
16045
|
let s = n.schema.safeParse(o.value);
|
|
16007
|
-
return s.success ? (
|
|
16046
|
+
return s.success ? (dv(e, sv(o.value)), c({
|
|
16008
16047
|
op: "restore",
|
|
16009
16048
|
path: e,
|
|
16010
16049
|
detail: `#${o.id}`,
|
|
@@ -16014,7 +16053,7 @@ function dv(e, r = {}) {
|
|
|
16014
16053
|
path: e,
|
|
16015
16054
|
message: `快照 #${o.id} 的值不符合当前 schema,无法回退`,
|
|
16016
16055
|
hint: "schema 可能已变更;该快照已过期,选其他快照或重新设置",
|
|
16017
|
-
details:
|
|
16056
|
+
details: O_(s.error.issues)
|
|
16018
16057
|
});
|
|
16019
16058
|
}, {
|
|
16020
16059
|
name: "restore_window_snapshot",
|
|
@@ -16023,14 +16062,14 @@ function dv(e, r = {}) {
|
|
|
16023
16062
|
path: t.string().describe("已注册的属性路径"),
|
|
16024
16063
|
id: t.number().int().optional().describe("指定快照序号;不传则回退最近一次")
|
|
16025
16064
|
})
|
|
16026
|
-
}),
|
|
16027
|
-
f,
|
|
16065
|
+
}), S = [
|
|
16028
16066
|
p,
|
|
16029
16067
|
m,
|
|
16068
|
+
h,
|
|
16030
16069
|
n(async ({ paths: e }) => {
|
|
16031
16070
|
let t = [];
|
|
16032
16071
|
for (let n of e) {
|
|
16033
|
-
if (!
|
|
16072
|
+
if (!d(n)) {
|
|
16034
16073
|
t.push(`- ${n} = ERROR: ${$({
|
|
16035
16074
|
code: "NOT_REGISTERED",
|
|
16036
16075
|
path: n,
|
|
@@ -16039,8 +16078,8 @@ function dv(e, r = {}) {
|
|
|
16039
16078
|
})}`);
|
|
16040
16079
|
continue;
|
|
16041
16080
|
}
|
|
16042
|
-
let e =
|
|
16043
|
-
t.push(`- ${n} = ${e === void 0 ? "(undefined)" :
|
|
16081
|
+
let e = iv(window, n);
|
|
16082
|
+
t.push(`- ${n} = ${e === void 0 ? "(undefined)" : cv(e)}`);
|
|
16044
16083
|
}
|
|
16045
16084
|
return t.join("\n");
|
|
16046
16085
|
}, {
|
|
@@ -16048,12 +16087,12 @@ function dv(e, r = {}) {
|
|
|
16048
16087
|
description: "批量按路径读取 window 属性的局部或多个字段(避免对大 JSON 整体读取)。paths 支持注册属性的任意后代路径(如 page.components.0.text)、自身。字段白名单读模式(默认)下未注册祖先不可读。逐行返回 path = value;单个值过大仍由系统自动外存 vfs。",
|
|
16049
16088
|
schema: t.object({ paths: t.array(t.string().describe("路径,如 page.components.0.text")).min(1).max(20) })
|
|
16050
16089
|
}),
|
|
16051
|
-
h,
|
|
16052
16090
|
g,
|
|
16053
16091
|
_,
|
|
16054
16092
|
v,
|
|
16055
16093
|
y,
|
|
16056
16094
|
b,
|
|
16095
|
+
x,
|
|
16057
16096
|
n(async ({ path: e, expr: t, limit: n }) => {
|
|
16058
16097
|
if (!i.get(e)) return $({
|
|
16059
16098
|
code: "NOT_REGISTERED",
|
|
@@ -16061,7 +16100,7 @@ function dv(e, r = {}) {
|
|
|
16061
16100
|
message: `属性 "${e}" 未注册`,
|
|
16062
16101
|
hint: "用 list_window_props 查看可用属性"
|
|
16063
16102
|
});
|
|
16064
|
-
let r =
|
|
16103
|
+
let r = iv(window, e);
|
|
16065
16104
|
if (typeof r != "object" || !r) return $({
|
|
16066
16105
|
code: "NOT_OBJECT",
|
|
16067
16106
|
path: e,
|
|
@@ -16070,7 +16109,7 @@ function dv(e, r = {}) {
|
|
|
16070
16109
|
});
|
|
16071
16110
|
let a;
|
|
16072
16111
|
try {
|
|
16073
|
-
a =
|
|
16112
|
+
a = Y_(r, t);
|
|
16074
16113
|
} catch (n) {
|
|
16075
16114
|
return $({
|
|
16076
16115
|
code: "JSONPATH_SYNTAX",
|
|
@@ -16080,7 +16119,7 @@ function dv(e, r = {}) {
|
|
|
16080
16119
|
details: { expr: t }
|
|
16081
16120
|
});
|
|
16082
16121
|
}
|
|
16083
|
-
let o = n ?? 50, s = a.slice(0, o), c = s.map((e) => `{"path":${JSON.stringify(e.path)},"index":${e.index === void 0 ? "null" : e.index},"value":${
|
|
16122
|
+
let o = n ?? 50, s = a.slice(0, o), c = s.map((e) => `{"path":${JSON.stringify(e.path)},"index":${e.index === void 0 ? "null" : e.index},"value":${cv(e.value)}}`);
|
|
16084
16123
|
return `{"matched":${a.length},"returned":${s.length},"truncated":${a.length > o},"results":[${c.join(",")}]}`;
|
|
16085
16124
|
}, {
|
|
16086
16125
|
name: "query_window_prop",
|
|
@@ -16098,20 +16137,20 @@ function dv(e, r = {}) {
|
|
|
16098
16137
|
message: `属性 "${e}" 未注册`,
|
|
16099
16138
|
hint: "用 list_window_props 查看可用属性"
|
|
16100
16139
|
});
|
|
16101
|
-
let s =
|
|
16140
|
+
let s = iv(window, e);
|
|
16102
16141
|
if (s == null) return $({
|
|
16103
16142
|
code: "EMPTY",
|
|
16104
16143
|
path: e,
|
|
16105
16144
|
message: `"${e}" 为空,无可搜索内容`
|
|
16106
16145
|
});
|
|
16107
16146
|
try {
|
|
16108
|
-
let e =
|
|
16147
|
+
let e = Z_(s, t, {
|
|
16109
16148
|
mode: n,
|
|
16110
16149
|
fuzzyThreshold: r,
|
|
16111
16150
|
matchKey: a,
|
|
16112
16151
|
limit: o ?? 50
|
|
16113
16152
|
});
|
|
16114
|
-
return
|
|
16153
|
+
return cv({
|
|
16115
16154
|
matched: e.length,
|
|
16116
16155
|
results: e
|
|
16117
16156
|
});
|
|
@@ -16154,7 +16193,7 @@ function dv(e, r = {}) {
|
|
|
16154
16193
|
message: `脚本过长(${t.length} 字符,上限 8000)`,
|
|
16155
16194
|
hint: "精简脚本;复杂逻辑可分步(先 query 探查再 transform 改),或拆成多次 eval"
|
|
16156
16195
|
});
|
|
16157
|
-
let a = await
|
|
16196
|
+
let a = await ev(sv(iv(window, e)), t, 3e3);
|
|
16158
16197
|
if (!a.ok) {
|
|
16159
16198
|
let n = /超时/.test(a.error || "");
|
|
16160
16199
|
return $({
|
|
@@ -16175,18 +16214,18 @@ function dv(e, r = {}) {
|
|
|
16175
16214
|
path: e,
|
|
16176
16215
|
message: "脚本返回值校验失败,未写入(transform 模式要求返回该属性的完整新值且符合 schema)",
|
|
16177
16216
|
hint: `确认脚本 return 了完整新值(非部分);按 describe_window_prop("${e}") 查看格式`,
|
|
16178
|
-
details:
|
|
16217
|
+
details: O_(t.error.issues)
|
|
16179
16218
|
});
|
|
16180
|
-
|
|
16181
|
-
let n =
|
|
16182
|
-
return typeof n == "object" && n && t.data !== null && typeof t.data == "object" ?
|
|
16219
|
+
f(e, "edit", "eval_transform");
|
|
16220
|
+
let n = iv(window, e);
|
|
16221
|
+
return typeof n == "object" && n && t.data !== null && typeof t.data == "object" ? fv(n, t.data) : av(window, e, t.data), c({
|
|
16183
16222
|
op: "edit",
|
|
16184
16223
|
path: e,
|
|
16185
16224
|
detail: "eval_transform",
|
|
16186
16225
|
timestamp: Date.now()
|
|
16187
|
-
}), `已通过脚本 transform 更新 ${e}(耗时 ${a.elapsedMs}ms)。当前值: ${
|
|
16226
|
+
}), `已通过脚本 transform 更新 ${e}(耗时 ${a.elapsedMs}ms)。当前值: ${cv(iv(window, e), 600)}`;
|
|
16188
16227
|
}
|
|
16189
|
-
return
|
|
16228
|
+
return cv({
|
|
16190
16229
|
ok: !0,
|
|
16191
16230
|
result: a.result,
|
|
16192
16231
|
elapsedMs: a.elapsedMs
|
|
@@ -16201,17 +16240,17 @@ function dv(e, r = {}) {
|
|
|
16201
16240
|
})
|
|
16202
16241
|
})
|
|
16203
16242
|
];
|
|
16204
|
-
return Object.defineProperty(
|
|
16243
|
+
return Object.defineProperty(S, "controller", {
|
|
16205
16244
|
value: s,
|
|
16206
16245
|
enumerable: !1,
|
|
16207
16246
|
configurable: !1,
|
|
16208
16247
|
writable: !1
|
|
16209
|
-
}),
|
|
16248
|
+
}), S;
|
|
16210
16249
|
}
|
|
16211
16250
|
//#endregion
|
|
16212
16251
|
//#region src/core/tools/fetchDoc.ts
|
|
16213
|
-
var
|
|
16214
|
-
let n = new AbortController(), r = setTimeout(() => n.abort(),
|
|
16252
|
+
var mv = 3e4, hv = [n(async ({ url: e, as: t }) => {
|
|
16253
|
+
let n = new AbortController(), r = setTimeout(() => n.abort(), mv);
|
|
16215
16254
|
try {
|
|
16216
16255
|
let r = await fetch(e, {
|
|
16217
16256
|
method: "GET",
|
|
@@ -16228,7 +16267,7 @@ var fv = 3e4, pv = [n(async ({ url: e, as: t }) => {
|
|
|
16228
16267
|
].join("\n");
|
|
16229
16268
|
} catch (t) {
|
|
16230
16269
|
let r = t?.message || String(t);
|
|
16231
|
-
return n.signal.aborted ? `获取失败:请求超时(${
|
|
16270
|
+
return n.signal.aborted ? `获取失败:请求超时(${mv}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
|
|
16232
16271
|
} finally {
|
|
16233
16272
|
clearTimeout(r);
|
|
16234
16273
|
}
|
|
@@ -16239,24 +16278,24 @@ var fv = 3e4, pv = [n(async ({ url: e, as: t }) => {
|
|
|
16239
16278
|
url: t.string().describe("要抓取的 URL(同源或已配 CORS)"),
|
|
16240
16279
|
as: t.enum(["text", "markdown"]).optional().describe("返回格式标签,默认 text")
|
|
16241
16280
|
})
|
|
16242
|
-
})],
|
|
16243
|
-
function
|
|
16244
|
-
return
|
|
16281
|
+
})], gv = hv;
|
|
16282
|
+
function _v(e, t) {
|
|
16283
|
+
return pv(e, t);
|
|
16245
16284
|
}
|
|
16246
|
-
function
|
|
16285
|
+
function vv(e, t, n) {
|
|
16247
16286
|
let r = e?.windowOps !== !1, i = e?.fetch !== !1;
|
|
16248
16287
|
return [...r ? t : [], ...i ? n : []];
|
|
16249
16288
|
}
|
|
16250
16289
|
//#endregion
|
|
16251
16290
|
//#region src/core/harness/usageHints.ts
|
|
16252
|
-
var
|
|
16253
|
-
function
|
|
16291
|
+
var yv = .7;
|
|
16292
|
+
function bv(e, t) {
|
|
16254
16293
|
return {
|
|
16255
16294
|
name: "usageHints",
|
|
16256
16295
|
augmentPrompt: () => {
|
|
16257
16296
|
let n = [];
|
|
16258
|
-
if (e?.planning !== !1 && n.push("多步任务建议先 write_todos 拆解为步骤并逐步推进。"), t && (n.push("修改大对象/数组属性优先用 edit_window_prop 增量 patch(只发改动部分),避免 set 整体重传被 max_tokens 截断导致 JSON 不完整、校验失败。"), n.push("修改属性出错时可用 restore_window_snapshot(path) 回退最近一次。"), n.push("在大数组里按条件筛选元素用 query_window_prop(JSONPath,如 $[?(@.type==\"card\" && @.price<100)]),返回匹配元素的 path/index;定位后再 edit_window_prop 改。"), n.push("找名字记不清的元素用 search_window_prop(支持 substring/regex/fuzzy 模糊搜索)。"), n.push("需要过滤/映射/聚合/批量重写大数组时用 eval_window_script(沙箱脚本,入参 data);只读探查用 mode=query,批量重写用 mode=transform(返回值经校验后落地)。")), e?.subagent !== !1 && n.push("独立子任务可 spawn_agent 委派(只读工具,过程不占主上下文)。"), e?.subagents?.length) {
|
|
16259
|
-
let t = e.subagents.filter((e) => (e.temperature ?? 0) >=
|
|
16297
|
+
if (e?.planning !== !1 && n.push("多步任务建议先 write_todos 拆解为步骤并逐步推进。"), t && (n.push("不确定可操作哪些属性时用 list_window_props 查看(动态组件场景下注册表会增删,以工具返回为准,勿凭旧记忆);不确定某属性字段结构时用 describe_window_prop。"), n.push("改属性前先 get_window_prop 读其当前真实值,基于真实值改,不要凭记忆。"), n.push("修改大对象/数组属性优先用 edit_window_prop 增量 patch(只发改动部分),避免 set 整体重传被 max_tokens 截断导致 JSON 不完整、校验失败。"), n.push("修改属性出错时可用 restore_window_snapshot(path) 回退最近一次。"), n.push("在大数组里按条件筛选元素用 query_window_prop(JSONPath,如 $[?(@.type==\"card\" && @.price<100)]),返回匹配元素的 path/index;定位后再 edit_window_prop 改。"), n.push("找名字记不清的元素用 search_window_prop(支持 substring/regex/fuzzy 模糊搜索)。"), n.push("需要过滤/映射/聚合/批量重写大数组时用 eval_window_script(沙箱脚本,入参 data);只读探查用 mode=query,批量重写用 mode=transform(返回值经校验后落地)。")), e?.subagent !== !1 && n.push("独立子任务可 spawn_agent 委派(只读工具,过程不占主上下文)。"), e?.subagents?.length) {
|
|
16298
|
+
let t = e.subagents.filter((e) => (e.temperature ?? 0) >= yv || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), r = e.subagents.filter((e) => (e.temperature ?? 0) < yv && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
|
|
16260
16299
|
n.push("【规划-反思-执行·路由】按任务性质选模式,不要对简单任务过度编排:"), t.length && (n.push(` · 创作/设计/开放性需求(如"设计主题风格""换个感觉")→ 先调 ${t.map((e) => "use_" + e.id).join("/")} 出 2-3 套方案(高温创意),`), n.push(" 不要自己拍板;拿到方案后,若需用户拍板用 request_human_confirmation 弹选项。")), r.length && n.push(` · 严谨/易错/校验类 → 可先调 ${r.map((e) => "use_" + e.id).join("/")} 反思挑刺(低温审查),据反馈修订。`), n.push(" · 方案定稿后,由你(主 agent)用 edit_window_prop 落地成 JSON(低温度执行 + schema 校验 + 写前确认)。"), n.push(" · 简单/明确任务(如\"标题改红色\")直接执行,不必走规划-反思。");
|
|
16261
16300
|
}
|
|
16262
16301
|
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" + n.join("\n") : void 0;
|
|
@@ -16265,7 +16304,7 @@ function vv(e, t) {
|
|
|
16265
16304
|
}
|
|
16266
16305
|
//#endregion
|
|
16267
16306
|
//#region src/core/utils/id.ts
|
|
16268
|
-
function
|
|
16307
|
+
function xv() {
|
|
16269
16308
|
try {
|
|
16270
16309
|
if (typeof crypto < "u" && typeof crypto.randomUUID == "function") return crypto.randomUUID();
|
|
16271
16310
|
} catch {}
|
|
@@ -16273,57 +16312,57 @@ function yv() {
|
|
|
16273
16312
|
}
|
|
16274
16313
|
//#endregion
|
|
16275
16314
|
//#region src/core/backends/storage.ts
|
|
16276
|
-
var
|
|
16315
|
+
var Sv = "chat-sdk", Cv = 50 * 1024 * 1024, wv = 4 * 1024 * 1024, Tv = 10 * 1024 * 1024, Ev = .9, Dv = 500, Ov = 300, kv = "__meta__", Av = "v:1", jv = [
|
|
16277
16316
|
"messages",
|
|
16278
16317
|
"vfs",
|
|
16279
16318
|
"todos",
|
|
16280
16319
|
"memory"
|
|
16281
16320
|
];
|
|
16282
|
-
function
|
|
16283
|
-
return e === "local" || e === "session" ?
|
|
16321
|
+
function Mv(e) {
|
|
16322
|
+
return e === "local" || e === "session" ? wv : Cv;
|
|
16284
16323
|
}
|
|
16285
|
-
function
|
|
16324
|
+
function Nv(e) {
|
|
16286
16325
|
if (typeof e != "object" || !e) return !1;
|
|
16287
16326
|
let t = e;
|
|
16288
16327
|
return t.name === "QuotaExceededError" || t.name === "NS_ERROR_DOM_QUOTA_REACHED" || t.code === 22 || t.code === 1014;
|
|
16289
16328
|
}
|
|
16290
|
-
function
|
|
16329
|
+
function Pv(e, t, n, r) {
|
|
16291
16330
|
return [
|
|
16292
|
-
|
|
16331
|
+
Av,
|
|
16293
16332
|
e,
|
|
16294
16333
|
t,
|
|
16295
16334
|
n,
|
|
16296
16335
|
r
|
|
16297
16336
|
].join("::");
|
|
16298
16337
|
}
|
|
16299
|
-
function
|
|
16338
|
+
function Fv(e, t, n) {
|
|
16300
16339
|
return [
|
|
16301
|
-
|
|
16340
|
+
Av,
|
|
16302
16341
|
e,
|
|
16303
16342
|
t,
|
|
16304
16343
|
n
|
|
16305
16344
|
].join("::") + "::";
|
|
16306
16345
|
}
|
|
16307
|
-
function
|
|
16346
|
+
function Iv(e, t) {
|
|
16308
16347
|
return [
|
|
16309
|
-
|
|
16348
|
+
Av,
|
|
16310
16349
|
e,
|
|
16311
16350
|
t
|
|
16312
16351
|
].join("::") + "::";
|
|
16313
16352
|
}
|
|
16314
|
-
function Fv(e) {
|
|
16315
|
-
return [Ov, e].join("::") + "::";
|
|
16316
|
-
}
|
|
16317
|
-
var Iv = null;
|
|
16318
16353
|
function Lv(e) {
|
|
16319
|
-
|
|
16354
|
+
return [Av, e].join("::") + "::";
|
|
16355
|
+
}
|
|
16356
|
+
var Rv = null;
|
|
16357
|
+
function zv(e) {
|
|
16358
|
+
Rv ||= new TextEncoder();
|
|
16320
16359
|
try {
|
|
16321
|
-
return
|
|
16360
|
+
return Rv.encode(JSON.stringify(e)).length;
|
|
16322
16361
|
} catch {
|
|
16323
16362
|
return 0;
|
|
16324
16363
|
}
|
|
16325
16364
|
}
|
|
16326
|
-
function
|
|
16365
|
+
function Bv(e, t, n) {
|
|
16327
16366
|
let r = e.reduce((e, t) => e + t.bytes, 0);
|
|
16328
16367
|
if (r <= t) return [];
|
|
16329
16368
|
let i = t * n, a = [...e].sort((e, t) => e.lastAccessed - t.lastAccessed), o = [];
|
|
@@ -16333,7 +16372,7 @@ function Rv(e, t, n) {
|
|
|
16333
16372
|
}
|
|
16334
16373
|
return o;
|
|
16335
16374
|
}
|
|
16336
|
-
function
|
|
16375
|
+
function Vv() {
|
|
16337
16376
|
let e = /* @__PURE__ */ new Map();
|
|
16338
16377
|
return {
|
|
16339
16378
|
async get(t) {
|
|
@@ -16353,7 +16392,7 @@ function zv() {
|
|
|
16353
16392
|
}
|
|
16354
16393
|
};
|
|
16355
16394
|
}
|
|
16356
|
-
function
|
|
16395
|
+
function Hv(e) {
|
|
16357
16396
|
return new Promise((t, n) => {
|
|
16358
16397
|
if (typeof indexedDB > "u") {
|
|
16359
16398
|
n(/* @__PURE__ */ Error("indexedDB 不可用"));
|
|
@@ -16414,7 +16453,7 @@ function Bv(e) {
|
|
|
16414
16453
|
}, r.onerror = () => n(r.error);
|
|
16415
16454
|
});
|
|
16416
16455
|
}
|
|
16417
|
-
function
|
|
16456
|
+
function Uv(e) {
|
|
16418
16457
|
return {
|
|
16419
16458
|
async get(t) {
|
|
16420
16459
|
let n = e.getItem(t);
|
|
@@ -16448,12 +16487,12 @@ function Vv(e) {
|
|
|
16448
16487
|
}
|
|
16449
16488
|
};
|
|
16450
16489
|
}
|
|
16451
|
-
function
|
|
16490
|
+
function Wv(e, t, n) {
|
|
16452
16491
|
let r = (e.get(t) ?? Promise.resolve()).then(n, n);
|
|
16453
16492
|
return e.set(t, r.then(() => void 0, () => void 0)), r;
|
|
16454
16493
|
}
|
|
16455
|
-
function
|
|
16456
|
-
let t = e.dbName ??
|
|
16494
|
+
function Gv(e = {}) {
|
|
16495
|
+
let t = e.dbName ?? Sv, n = e.backend ?? "indexed", r = e.maxBytes ?? Mv(n), i = e.maxBytesPerSession ?? Tv, a = e.evictionWatermark ?? Ev, o = e.debounceMs ?? Dv, s = /* @__PURE__ */ new Set();
|
|
16457
16496
|
function c(e) {
|
|
16458
16497
|
for (let t of s) try {
|
|
16459
16498
|
t(e);
|
|
@@ -16466,16 +16505,16 @@ function Uv(e = {}) {
|
|
|
16466
16505
|
try {
|
|
16467
16506
|
if (n === "indexed") {
|
|
16468
16507
|
if (typeof indexedDB > "u") throw Error("indexedDB 不可用");
|
|
16469
|
-
l = await
|
|
16508
|
+
l = await Hv(t), d(!0);
|
|
16470
16509
|
} else if (n === "session") {
|
|
16471
16510
|
if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
|
|
16472
|
-
l =
|
|
16511
|
+
l = Uv(sessionStorage), d(!0);
|
|
16473
16512
|
} else if (n === "local") {
|
|
16474
16513
|
if (typeof localStorage > "u") throw Error("localStorage 不可用");
|
|
16475
|
-
l =
|
|
16476
|
-
} else l =
|
|
16514
|
+
l = Uv(localStorage), d(!0);
|
|
16515
|
+
} else l = Vv(), d(!1);
|
|
16477
16516
|
} catch (e) {
|
|
16478
|
-
l =
|
|
16517
|
+
l = Vv();
|
|
16479
16518
|
let t = e instanceof Error ? e.message : String(e);
|
|
16480
16519
|
d(!1), Promise.resolve().then(() => c({
|
|
16481
16520
|
type: "degraded",
|
|
@@ -16485,10 +16524,10 @@ function Uv(e = {}) {
|
|
|
16485
16524
|
})();
|
|
16486
16525
|
let p = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map();
|
|
16487
16526
|
function g(e, n, r, a) {
|
|
16488
|
-
let o =
|
|
16489
|
-
return
|
|
16527
|
+
let o = Pv(t, r, a, kv);
|
|
16528
|
+
return Wv(h, o, async () => {
|
|
16490
16529
|
let t = async () => {
|
|
16491
|
-
let t = await l.get(o), s = await l.get(e), u = s == null ? 0 :
|
|
16530
|
+
let t = await l.get(o), s = await l.get(e), u = s == null ? 0 : zv(s), d = zv(n), f = (t?.bytes ?? 0) + (d - u);
|
|
16492
16531
|
if (f > i) {
|
|
16493
16532
|
c({
|
|
16494
16533
|
type: "quota",
|
|
@@ -16510,12 +16549,12 @@ function Uv(e = {}) {
|
|
|
16510
16549
|
try {
|
|
16511
16550
|
await t();
|
|
16512
16551
|
} catch (e) {
|
|
16513
|
-
if (
|
|
16552
|
+
if (Nv(e) && !u) {
|
|
16514
16553
|
u = !0;
|
|
16515
16554
|
try {
|
|
16516
16555
|
await b();
|
|
16517
16556
|
} catch {}
|
|
16518
|
-
l =
|
|
16557
|
+
l = Vv(), Promise.resolve().then(() => c({
|
|
16519
16558
|
type: "degraded",
|
|
16520
16559
|
reason: "存储配额超限(QuotaExceededError),已淘汰最旧会话并降级内存"
|
|
16521
16560
|
}));
|
|
@@ -16527,7 +16566,7 @@ function Uv(e = {}) {
|
|
|
16527
16566
|
});
|
|
16528
16567
|
}
|
|
16529
16568
|
function _(e, n, r, i) {
|
|
16530
|
-
let a =
|
|
16569
|
+
let a = Pv(t, e, n, r), s = p.get(a);
|
|
16531
16570
|
s && s.resolve();
|
|
16532
16571
|
let c = m.get(a);
|
|
16533
16572
|
return c && clearTimeout(c), new Promise((t) => {
|
|
@@ -16554,15 +16593,15 @@ function Uv(e = {}) {
|
|
|
16554
16593
|
function y() {
|
|
16555
16594
|
v ||= setTimeout(() => {
|
|
16556
16595
|
v = null, b();
|
|
16557
|
-
},
|
|
16596
|
+
}, Ov);
|
|
16558
16597
|
}
|
|
16559
16598
|
async function b() {
|
|
16560
16599
|
let e = [];
|
|
16561
|
-
await l.scan(
|
|
16600
|
+
await l.scan(Lv(t), (t, n) => {
|
|
16562
16601
|
t.endsWith("::__meta__") && e.push(n);
|
|
16563
16602
|
});
|
|
16564
|
-
let n =
|
|
16565
|
-
for (let e of n) await l.clearPrefix(
|
|
16603
|
+
let n = Bv(e, r, a);
|
|
16604
|
+
for (let e of n) await l.clearPrefix(Fv(t, e.agentId, e.sessionId)), c({
|
|
16566
16605
|
type: "evicted",
|
|
16567
16606
|
agentId: e.agentId,
|
|
16568
16607
|
sessionId: e.sessionId,
|
|
@@ -16573,13 +16612,13 @@ function Uv(e = {}) {
|
|
|
16573
16612
|
ready: f,
|
|
16574
16613
|
async listSessions(e) {
|
|
16575
16614
|
let n = [];
|
|
16576
|
-
return await l.scan(
|
|
16615
|
+
return await l.scan(Iv(t, e), (e, t) => {
|
|
16577
16616
|
e.endsWith("::__meta__") && n.push(t);
|
|
16578
16617
|
}), n.sort((e, t) => t.lastAccessed - e.lastAccessed);
|
|
16579
16618
|
},
|
|
16580
16619
|
async load(e, n) {
|
|
16581
|
-
let r =
|
|
16582
|
-
return await
|
|
16620
|
+
let r = Pv(t, e, n, kv);
|
|
16621
|
+
return await Wv(h, r, async () => {
|
|
16583
16622
|
let i = await l.get(r);
|
|
16584
16623
|
if (!i) return;
|
|
16585
16624
|
let a = {
|
|
@@ -16588,8 +16627,8 @@ function Uv(e = {}) {
|
|
|
16588
16627
|
todos: [],
|
|
16589
16628
|
memory: ""
|
|
16590
16629
|
};
|
|
16591
|
-
for (let r of
|
|
16592
|
-
let i = await l.get(
|
|
16630
|
+
for (let r of jv) {
|
|
16631
|
+
let i = await l.get(Pv(t, e, n, r));
|
|
16593
16632
|
i != null && (a[r] = i);
|
|
16594
16633
|
}
|
|
16595
16634
|
return i.lastAccessed = Date.now(), await l.set(r, i), a;
|
|
@@ -16597,7 +16636,7 @@ function Uv(e = {}) {
|
|
|
16597
16636
|
},
|
|
16598
16637
|
async save(e, t, n) {
|
|
16599
16638
|
let r = [];
|
|
16600
|
-
for (let i of
|
|
16639
|
+
for (let i of jv) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
|
|
16601
16640
|
await Promise.all(r);
|
|
16602
16641
|
},
|
|
16603
16642
|
async flush() {
|
|
@@ -16611,10 +16650,10 @@ function Uv(e = {}) {
|
|
|
16611
16650
|
})), c({ type: "flush" }), await b();
|
|
16612
16651
|
},
|
|
16613
16652
|
async deleteSession(e, n) {
|
|
16614
|
-
await l.clearPrefix(
|
|
16653
|
+
await l.clearPrefix(Fv(t, e, n));
|
|
16615
16654
|
},
|
|
16616
16655
|
async createSession(e, n, r) {
|
|
16617
|
-
let i = r ??
|
|
16656
|
+
let i = r ?? xv(), a = Date.now(), o = {
|
|
16618
16657
|
agentId: e,
|
|
16619
16658
|
sessionId: i,
|
|
16620
16659
|
createdAt: a,
|
|
@@ -16622,7 +16661,7 @@ function Uv(e = {}) {
|
|
|
16622
16661
|
bytes: 0,
|
|
16623
16662
|
title: n
|
|
16624
16663
|
};
|
|
16625
|
-
return await l.set(
|
|
16664
|
+
return await l.set(Pv(t, e, i, kv), o), i;
|
|
16626
16665
|
},
|
|
16627
16666
|
onEvent(e) {
|
|
16628
16667
|
s.add(e);
|
|
@@ -16637,23 +16676,28 @@ function Uv(e = {}) {
|
|
|
16637
16676
|
}
|
|
16638
16677
|
//#endregion
|
|
16639
16678
|
//#region src/core/sdk/createChatSdk.ts
|
|
16640
|
-
var
|
|
16641
|
-
|
|
16642
|
-
|
|
16679
|
+
var Kv = [
|
|
16680
|
+
"你是一个页面操作助手。宿主页面在 window 对象上注册了可操作的属性,你通过专用工具安全地读写这些属性来操作页面。",
|
|
16681
|
+
"所有写操作都经范围控制(仅注册表内)与 schema 校验(不合法会返回结构化错误而非写入),并自动留快照可回退。",
|
|
16682
|
+
"大对象/数组优先用增量 patch(只发改动)而非整体重传,避免输出被截断。",
|
|
16683
|
+
T_.reliableWriteRules
|
|
16684
|
+
].join("\n\n"), qv = 50;
|
|
16685
|
+
function Jv(e) {
|
|
16686
|
+
return e === void 0 || e === !1 ? null : typeof e == "string" ? Gv({ backend: e }) : e.enabled === !1 ? null : Gv(e);
|
|
16643
16687
|
}
|
|
16644
|
-
function
|
|
16688
|
+
function Yv(e) {
|
|
16645
16689
|
return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
|
|
16646
16690
|
}
|
|
16647
|
-
var
|
|
16648
|
-
function
|
|
16691
|
+
var Xv = /* @__PURE__ */ new Map();
|
|
16692
|
+
function Zv(e) {
|
|
16649
16693
|
let t = e.content;
|
|
16650
16694
|
return typeof t == "string" ? t : Array.isArray(t) ? t.map((e) => typeof e == "string" ? e : e?.text ?? "").join("") : String(t ?? "");
|
|
16651
16695
|
}
|
|
16652
|
-
function
|
|
16696
|
+
function Qv(e) {
|
|
16653
16697
|
let t = e.summaryLlm ?? e.llm;
|
|
16654
16698
|
if (!t) return;
|
|
16655
16699
|
let n = e.summaryTemperature ?? .3, r = e.summaryMaxTokens ?? 1024, o = e.summaryTimeoutMs ?? 15e3, c;
|
|
16656
|
-
if (
|
|
16700
|
+
if (Yv(t)) c = t;
|
|
16657
16701
|
else {
|
|
16658
16702
|
let i = t;
|
|
16659
16703
|
if (!i.apiKey) {
|
|
@@ -16671,16 +16715,16 @@ function Yv(e) {
|
|
|
16671
16715
|
return async (e) => {
|
|
16672
16716
|
let t = new AbortController(), n = setTimeout(() => t.abort(), o);
|
|
16673
16717
|
try {
|
|
16674
|
-
return
|
|
16718
|
+
return Zv(await c.invoke([new a("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new i(e)], { signal: t.signal })).trim();
|
|
16675
16719
|
} finally {
|
|
16676
16720
|
clearTimeout(n);
|
|
16677
16721
|
}
|
|
16678
16722
|
};
|
|
16679
16723
|
}
|
|
16680
|
-
function
|
|
16724
|
+
function $v(e) {
|
|
16681
16725
|
return e === "set_window_prop" ? "set" : e === "edit_window_prop" ? "edit" : e === "delete_window_prop" ? "delete" : e === "restore_window_snapshot" ? "restore" : null;
|
|
16682
16726
|
}
|
|
16683
|
-
function
|
|
16727
|
+
function ey(e) {
|
|
16684
16728
|
let t = e.split("."), n = globalThis.window;
|
|
16685
16729
|
for (let e of t) {
|
|
16686
16730
|
if (n == null) return;
|
|
@@ -16688,18 +16732,18 @@ function Zv(e) {
|
|
|
16688
16732
|
}
|
|
16689
16733
|
return n;
|
|
16690
16734
|
}
|
|
16691
|
-
function
|
|
16735
|
+
function ty(e, t) {
|
|
16692
16736
|
return {
|
|
16693
16737
|
name: "sdk-events",
|
|
16694
16738
|
wrapToolCall: async (t, n) => {
|
|
16695
|
-
let r = await n(t), i =
|
|
16739
|
+
let r = await n(t), i = $v(t.name);
|
|
16696
16740
|
if (i) {
|
|
16697
16741
|
let n = String(t.args?.path ?? "");
|
|
16698
16742
|
e({
|
|
16699
16743
|
type: "window_prop_change",
|
|
16700
16744
|
path: n,
|
|
16701
16745
|
operation: i,
|
|
16702
|
-
value: n ?
|
|
16746
|
+
value: n ? ey(n) : void 0
|
|
16703
16747
|
});
|
|
16704
16748
|
}
|
|
16705
16749
|
return r;
|
|
@@ -16712,18 +16756,18 @@ function Qv(e, t) {
|
|
|
16712
16756
|
}
|
|
16713
16757
|
};
|
|
16714
16758
|
}
|
|
16715
|
-
function
|
|
16716
|
-
let i =
|
|
16759
|
+
function ny(e, r) {
|
|
16760
|
+
let i = Jv(e.storage);
|
|
16717
16761
|
e.debug && i && i.onEvent((e) => console.log("[page-agent-sdk][storage]", e));
|
|
16718
|
-
let a =
|
|
16762
|
+
let a = Yv(e.llm) ? void 0 : e.llm, o = Wh({
|
|
16719
16763
|
model: a?.model,
|
|
16720
16764
|
contextWindow: e.contextWindow ?? a?.contextWindow,
|
|
16721
16765
|
maxOutputTokens: e.maxOutputTokens ?? a?.maxOutputTokens
|
|
16722
16766
|
});
|
|
16723
16767
|
e.debug && console.log("[page-agent-sdk][modelCaps]", o);
|
|
16724
|
-
let s =
|
|
16768
|
+
let s = Qv(e);
|
|
16725
16769
|
e.debug && !s && console.warn("[page-agent-sdk][summarization] 未构造 llmInvoke(apiKey 缺失?),摘要回退零成本索引摘要");
|
|
16726
|
-
let c = /* @__PURE__ */ Qt([]), l =
|
|
16770
|
+
let c = /* @__PURE__ */ Qt([]), l = M_(e.vfs?.initialFiles, {
|
|
16727
16771
|
persist: i ? { save: (e) => {
|
|
16728
16772
|
B.sessionId && i && i.save(r, B.sessionId, { vfs: e });
|
|
16729
16773
|
} } : void 0,
|
|
@@ -16735,10 +16779,10 @@ function $v(e, r) {
|
|
|
16735
16779
|
getTodos: () => f.current?.getState?.()?.todos ?? [],
|
|
16736
16780
|
messages: c,
|
|
16737
16781
|
maxCheckpoints: p && typeof p == "object" ? p.maxCheckpoints : void 0
|
|
16738
|
-
}) : null, g = !p || typeof p != "object" || p.auto !== !1, _ = e.capabilities, v = _?.windowOps !== !1, y = v ?
|
|
16782
|
+
}) : null, g = !p || typeof p != "object" || p.auto !== !1, _ = e.capabilities, v = _?.windowOps !== !1, y = v ? pv(e.windowProps || [], {
|
|
16739
16783
|
onAudit: e.debug ? (e) => console.log("[page-agent-sdk][window audit]", e) : void 0,
|
|
16740
16784
|
maxSnapshots: e.maxSnapshots
|
|
16741
|
-
}) : [], b = v ? y.controller ?? null : null, x = () => b?.list() ?? e.windowProps ?? [], S = /* @__PURE__ */ new Map(), C =
|
|
16785
|
+
}) : [], b = v ? y.controller ?? null : null, x = () => b?.list() ?? e.windowProps ?? [], S = /* @__PURE__ */ new Map(), C = vv(_, y, hv);
|
|
16742
16786
|
C.forEach((e) => S.set(e.name, "builtin"));
|
|
16743
16787
|
let w = [...e.tools || []];
|
|
16744
16788
|
w.forEach((e) => S.set(e.name, "user"));
|
|
@@ -16794,7 +16838,7 @@ function $v(e, r) {
|
|
|
16794
16838
|
llm: e.llm,
|
|
16795
16839
|
tools: re
|
|
16796
16840
|
} : void 0
|
|
16797
|
-
}) : void 0, ae =
|
|
16841
|
+
}) : void 0, ae = bv({
|
|
16798
16842
|
..._,
|
|
16799
16843
|
humanConfirm: T,
|
|
16800
16844
|
subagents: e.subagents?.map((e) => ({
|
|
@@ -16815,10 +16859,15 @@ function $v(e, r) {
|
|
|
16815
16859
|
ae,
|
|
16816
16860
|
...k ? [u] : [],
|
|
16817
16861
|
...A ? [gg(e.skills || [], { readVfs: j ? (e) => l.files[e]?.content : void 0 })] : [],
|
|
16818
|
-
...j ? [
|
|
16862
|
+
...j ? [z_(l)] : [],
|
|
16819
16863
|
...M ? [C_({
|
|
16820
|
-
...
|
|
16821
|
-
llmInvoke: s
|
|
16864
|
+
...D_(e, o.contextWindow),
|
|
16865
|
+
llmInvoke: s,
|
|
16866
|
+
getRegisteredProps: () => x().map((e) => ({
|
|
16867
|
+
path: e.path,
|
|
16868
|
+
description: e.description
|
|
16869
|
+
})),
|
|
16870
|
+
preserveLastToolResults: (e.contextOptions && e.contextOptions.preserveLastToolResults) ?? ["describe_window_prop", "list_window_props"]
|
|
16822
16871
|
})] : [],
|
|
16823
16872
|
...N ? [d] : [],
|
|
16824
16873
|
...e.permissions?.length ? [Sg(e.permissions)] : [],
|
|
@@ -16829,8 +16878,8 @@ function $v(e, r) {
|
|
|
16829
16878
|
...ee ? [ee] : [],
|
|
16830
16879
|
...te ? [te] : [],
|
|
16831
16880
|
...e.middleware || [],
|
|
16832
|
-
|
|
16833
|
-
], le = e.maxMemoryRounds ??
|
|
16881
|
+
ty(ce, c)
|
|
16882
|
+
], le = e.maxMemoryRounds ?? qv, B = {
|
|
16834
16883
|
agentId: r,
|
|
16835
16884
|
store: i,
|
|
16836
16885
|
messages: c,
|
|
@@ -16888,13 +16937,13 @@ function $v(e, r) {
|
|
|
16888
16937
|
if (B.refCount--, B.refCount <= 0) {
|
|
16889
16938
|
i && (l.flush?.(), i.flush(), i.dispose());
|
|
16890
16939
|
let e = B.mcpClosers.splice(0);
|
|
16891
|
-
e.length && Promise.allSettled(e.map((e) => e())),
|
|
16940
|
+
e.length && Promise.allSettled(e.map((e) => e())), Xv.delete(r);
|
|
16892
16941
|
}
|
|
16893
16942
|
},
|
|
16894
16943
|
getInfo() {
|
|
16895
16944
|
return {
|
|
16896
16945
|
id: r,
|
|
16897
|
-
model:
|
|
16946
|
+
model: Yv(e.llm) ? e.llm.model ?? e.llm.modelName : e.llm.model,
|
|
16898
16947
|
tools: O.map((e) => ({
|
|
16899
16948
|
name: e.name,
|
|
16900
16949
|
description: e.description,
|
|
@@ -16981,14 +17030,14 @@ function $v(e, r) {
|
|
|
16981
17030
|
}), O.push(...n), e.debug && console.log(`[page-agent-sdk][mcp] 注入 ${n.length} 个工具,${B.mcpServers.length} 个 server`);
|
|
16982
17031
|
}
|
|
16983
17032
|
B.agent = sg({
|
|
16984
|
-
...
|
|
17033
|
+
...Yv(e.llm) ? { llm: e.llm } : {
|
|
16985
17034
|
apiKey: e.llm.apiKey,
|
|
16986
17035
|
baseUrl: e.llm.baseUrl,
|
|
16987
17036
|
model: e.llm.model,
|
|
16988
17037
|
temperature: e.llm.temperature,
|
|
16989
17038
|
maxTokens: e.llm.maxTokens
|
|
16990
17039
|
},
|
|
16991
|
-
systemPrompt: e.systemPrompt,
|
|
17040
|
+
systemPrompt: e.systemPrompt ?? Kv,
|
|
16992
17041
|
tools: O,
|
|
16993
17042
|
middleware: z,
|
|
16994
17043
|
maxToolRounds: e.maxToolRounds,
|
|
@@ -17001,11 +17050,11 @@ function $v(e, r) {
|
|
|
17001
17050
|
}), f.current = B.agent;
|
|
17002
17051
|
})(), B;
|
|
17003
17052
|
}
|
|
17004
|
-
function
|
|
17005
|
-
let t = e.id ??
|
|
17053
|
+
function ry(e) {
|
|
17054
|
+
let t = e.id ?? xv();
|
|
17006
17055
|
e.id || console.warn(`[page-agent-sdk] 未传 options.id,已生成随机 id "${t}"。刷新后持久化数据无法恢复,请传稳定 id。`);
|
|
17007
|
-
let n = e.streaming ?? !0, r = e.ui ?? "default", i, a = e.shareContext ?
|
|
17008
|
-
a ? i = a : (i =
|
|
17056
|
+
let n = e.streaming ?? !0, r = e.ui ?? "default", i, a = e.shareContext ? Xv.get(t) : void 0;
|
|
17057
|
+
a ? i = a : (i = ny(e, t), e.shareContext && Xv.set(t, i)), i.refCount++;
|
|
17009
17058
|
let o = null, s = null, c = null;
|
|
17010
17059
|
async function l() {
|
|
17011
17060
|
if (await i.initDone, r === !1) {
|
|
@@ -17034,7 +17083,7 @@ function ey(e) {
|
|
|
17034
17083
|
i.afterRound(), i.store && await i.store.flush();
|
|
17035
17084
|
},
|
|
17036
17085
|
onClear: () => {
|
|
17037
|
-
i.store && (i.sessionId =
|
|
17086
|
+
i.store && (i.sessionId = xv(), 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));
|
|
17038
17087
|
}
|
|
17039
17088
|
});
|
|
17040
17089
|
} })), o.mount(t), i.store && (s = () => {
|
|
@@ -17070,7 +17119,7 @@ function ey(e) {
|
|
|
17070
17119
|
}
|
|
17071
17120
|
//#endregion
|
|
17072
17121
|
//#region src/core/sdk/defineTool.ts
|
|
17073
|
-
function
|
|
17122
|
+
function iy(e) {
|
|
17074
17123
|
return n(async (t) => {
|
|
17075
17124
|
let n = await e.handler(t);
|
|
17076
17125
|
return typeof n == "string" ? n : JSON.stringify(n);
|
|
@@ -17081,21 +17130,4 @@ function ty(e) {
|
|
|
17081
17130
|
});
|
|
17082
17131
|
}
|
|
17083
17132
|
//#endregion
|
|
17084
|
-
|
|
17085
|
-
var ny = {
|
|
17086
|
-
pageBuilder: { systemPrompt: "你是页面构建助手。流程:get_window_prop 读取当前页面结构 → set_window_prop / edit_window_prop 修改属性 → 页面实时更新。多步任务先用 write_todos 拆解,逐步推进。" },
|
|
17087
|
-
researcher: {
|
|
17088
|
-
systemPrompt: "你是调研助手。多路调研用 spawn_agents 并行委派子 agent(各负责一个方向);单份资料用 fetch_document 抓取;最后结构化汇总,给出结论与依据。",
|
|
17089
|
-
subagent: { maxParallel: 4 }
|
|
17090
|
-
},
|
|
17091
|
-
minimal: { capabilities: {
|
|
17092
|
-
planning: !1,
|
|
17093
|
-
skills: !1,
|
|
17094
|
-
vfs: !1,
|
|
17095
|
-
summarization: !1,
|
|
17096
|
-
memory: !1,
|
|
17097
|
-
subagent: !1
|
|
17098
|
-
} }
|
|
17099
|
-
};
|
|
17100
|
-
//#endregion
|
|
17101
|
-
export { w_ as CONTEXT_PRESETS, Rh as ChatDialog, Qd as CodePreview, wg as HUMAN_CONFIRM_TOOL_NAME, ef as MessageContent, l_ as connectMcp, sg as createAgent, Cg as createApprovalMiddleware, ey as createChatSdk, Pg as createCheckpointManager, Fg as createCheckpointMiddleware, Dg as createHumanConfirmMiddleware, Eg as createHumanConfirmTool, zv as createMemoryBackend, Uv as createSessionStore, Ug as createSubagentMiddleware, Kg as createSubagentsMiddleware, vv as createUsageHintsMiddleware, qg as createVerifyMiddleware, A_ as createVfs, Vv as createWebStorageBackend, dv as createWindowOps, $g as createWriteBackCheck, ug as defineSkill, ty as defineTool, hv as defineWindowToolset, Gh as estimateTokens, o_ as extractText, pv as fetchDocTools, mv as fetchTools, E_ as formatZodIssues, jv as isQuotaError, q_ as jpEval, O_ as jsonParseError, qh as offloadPassThroughChars, Kh as offloadThresholdChars, ny as presets, T_ as resolveContextOptions, Wh as resolveModelCaps, Q_ as runSandboxedScript, Y_ as searchJson, gv as selectBuiltinTools, $ as toolError, xl as useChat, e as z, D_ as zodError };
|
|
17133
|
+
export { E_ as CONTEXT_PRESETS, Rh as ChatDialog, Qd as CodePreview, wg as HUMAN_CONFIRM_TOOL_NAME, ef as MessageContent, l_ as connectMcp, sg as createAgent, Cg as createApprovalMiddleware, ry as createChatSdk, Pg as createCheckpointManager, Fg as createCheckpointMiddleware, Dg as createHumanConfirmMiddleware, Eg as createHumanConfirmTool, Vv as createMemoryBackend, Gv as createSessionStore, Ug as createSubagentMiddleware, Kg as createSubagentsMiddleware, bv as createUsageHintsMiddleware, qg as createVerifyMiddleware, M_ as createVfs, Uv as createWebStorageBackend, pv as createWindowOps, $g as createWriteBackCheck, ug as defineSkill, iy as defineTool, _v as defineWindowToolset, Gh as estimateTokens, o_ as extractText, hv as fetchDocTools, gv as fetchTools, O_ as formatZodIssues, Nv as isQuotaError, Y_ as jpEval, A_ as jsonParseError, qh as offloadPassThroughChars, Kh as offloadThresholdChars, w_ as presets, D_ as resolveContextOptions, Wh as resolveModelCaps, ev as runSandboxedScript, Z_ as searchJson, vv as selectBuiltinTools, T_ as systemPromptHelpers, $ as toolError, xl as useChat, e as z, k_ as zodError };
|