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.
@@ -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 t = d_(e.userMsg.content, 60) || "(空)", n = e.assistantMsgs[0] ? d_(e.assistantMsgs[0].content, 80) : "(无回复)", r = e.assistantMsgs.flatMap((e) => (e.steps || []).map((e) => e.name)), i = r.length ? ` [工具: ${r.join(", ")}]` : "";
14882
- return `- 第${e.round}轮:${t} → ${n}${i}`;
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
- l = await t.llmInvoke(y_(o)), u = s + "llm_summary";
14935
+ u = await t.llmInvoke(y_(o, l)), d = s + "llm_summary";
14931
14936
  } catch {
14932
- l = y_(o), u = s + "index_summary(llm_fallback)";
14933
- }
14934
- else l = y_(o), u = s + "index_summary";
14935
- let d = t.enableRecall ? b_(o, c, t.recallTopK) : [], f = d.length ? d.map((e) => `- 第${e.round}轮:${d_(e.userMsg.content, 60)} → ${e.assistantMsgs[0] ? d_(e.assistantMsgs[0].content, 80) : ""}`).join("\n") : "", p = [`【对话历史摘要】以下是之前 ${o.length} 轮对话的要点(最新 ${a.length} 轮已完整保留):`, l];
14936
- f && p.push("\n【与当前问题可能相关的早期对话】", f);
14937
- let m = {
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: p.join("\n"),
14950
+ content: m.join("\n"),
14940
14951
  timestamp: Date.now()
14941
- }, h = [];
14942
- for (let e of a) h.push(e.userMsg), h.push(...e.assistantMsgs);
14943
- let g = [m, ...h];
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: g,
14956
+ messages: _,
14946
14957
  stats: {
14947
14958
  triggered: !0,
14948
14959
  roundsTotal: n.length,
14949
14960
  roundsSummarized: o.length,
14950
- roundsRecalled: d.length,
14961
+ roundsRecalled: f.length,
14951
14962
  originalMessages: r,
14952
- compressedMessages: g.length,
14953
- strategy: u
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/sdk/contextPreset.ts
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 T_(e, t) {
15020
- let n = w_[e.contextPreset ?? "auto"] ?? {}, r = e.contextOptions === !1 ? {} : e.contextOptions ?? {};
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 E_(e) {
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 D_(e, t) {
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: E_(t)
15084
+ details: O_(t)
15053
15085
  });
15054
15086
  }
15055
- function O_(e, t, n) {
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 k_ = .9;
15065
- function A_(e, t = {}) {
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[N_(t)] = {
15099
+ if (e) for (let [t, r] of Object.entries(e)) n[F_(t)] = {
15068
15100
  content: r,
15069
- updatedAt: F_()
15101
+ updatedAt: L_()
15070
15102
  };
15071
15103
  let { persist: r } = t, i = t.maxBytes ?? 4194304;
15072
15104
  function a() {
15073
- if (M_(n) <= i) return;
15074
- let e = i * k_, t = Object.entries(n).sort((e, t) => e[1].updatedAt - t[1].updatedAt);
15075
- for (let [r] of t) if (delete n[r], M_(n) <= e) break;
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[N_(t)] = r;
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 j_ = null;
15110
- function M_(e) {
15111
- j_ ||= new TextEncoder();
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 += j_.encode(n.content).length;
15145
+ for (let n of Object.values(e)) t += N_.encode(n.content).length;
15114
15146
  return t;
15115
15147
  }
15116
- function N_(e) {
15148
+ function F_(e) {
15117
15149
  return e.replace(/^\/+/, "").replace(/\/+/g, "/");
15118
15150
  }
15119
- function P_(e) {
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 F_() {
15159
+ function L_() {
15128
15160
  return Date.now();
15129
15161
  }
15130
- function I_(e) {
15162
+ function R_(e) {
15131
15163
  return [
15132
15164
  n(async ({ path: t, offset: n, limit: r }) => {
15133
- let i = e.files[N_(t)];
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[N_(t)] = {
15183
+ n(async ({ path: t, content: n }) => (e.files[F_(t)] = {
15152
15184
  content: n,
15153
- updatedAt: F_()
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 = N_(t), a = e.files[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: F_()
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 = P_(t);
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 ? [N_(n)] : Object.keys(e.files), a = [];
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 L_(e) {
15294
+ function z_(e) {
15263
15295
  return {
15264
15296
  name: "vfs",
15265
- tools: I_(e),
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 R_ = /[\w$-]/;
15272
- function z_(e) {
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 && R_.test(n[r]);) e += n[r++];
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 && R_.test(n[r]);) e += n[r++];
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 B_(e) {
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 V_ = class {
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(), W_(t, e, this.operand())) : H_(e);
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 U_(e, this.item);
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 H_(e) {
15480
+ function W_(e) {
15449
15481
  return !!e && e !== 0 && e !== "" && e !== null;
15450
15482
  }
15451
- function U_(e, t) {
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 W_(e, t, n) {
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 G_(e, t) {
15471
- return new V_(B_(e), t).parse();
15502
+ function q_(e, t) {
15503
+ return new U_(H_(e), t).parse();
15472
15504
  }
15473
- function K_(e, t) {
15505
+ function J_(e, t) {
15474
15506
  return e ? `${e}.${t}` : String(t);
15475
15507
  }
15476
- function q_(e, t) {
15508
+ function Y_(e, t) {
15477
15509
  let n = [{
15478
15510
  path: "",
15479
15511
  value: e
15480
15512
  }];
15481
- for (let e of z_(t)) {
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: K_(r.path, e.key),
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: K_(r.path, e.index),
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: K_(e.path, r),
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: K_(e.path, n),
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: K_(e.path, n),
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: K_(n.path, r),
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
- G_(e.filter, n) && t.push({
15531
- path: K_(r.path, i),
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
- G_(e.filter, i) && t.push({
15539
- path: K_(r.path, n),
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 J_(e, t) {
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 Y_(e, t, n = {}) {
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, K_(l, t), String(t)));
15575
- else for (let t of Object.keys(e)) c(e[t], K_(l, t), 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 = X_(d, t, r, n.fuzzyThreshold ?? 2, s);
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 = X_(u, t, r, n.fuzzyThreshold ?? 2, s);
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 X_(e, t, n, r, i) {
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 = J_(a, o);
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 Z_ = [
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 Q_(e, t, n = 3e3) {
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 = Z_ + "\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;
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 $_ = /* @__PURE__ */ new Set([
15704
+ var tv = /* @__PURE__ */ new Set([
15673
15705
  "__proto__",
15674
15706
  "constructor",
15675
15707
  "prototype"
15676
15708
  ]);
15677
- function ev(e) {
15678
- return e.split(".").some((e) => $_.has(e));
15709
+ function nv(e) {
15710
+ return e.split(".").some((e) => tv.has(e));
15679
15711
  }
15680
- function tv(e, t) {
15681
- if (!(!t || typeof t != "object" || Array.isArray(t))) for (let n of Object.keys(t)) $_.has(n) || (e[n] = t[n]);
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 nv(e, t) {
15684
- if (ev(t)) return;
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 rv(e, t, n) {
15693
- if (ev(t)) return;
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 iv(e, t) {
15702
- if (ev(t)) return !1;
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 av(e) {
15743
+ function sv(e) {
15712
15744
  return e === void 0 ? void 0 : JSON.parse(JSON.stringify(e));
15713
15745
  }
15714
- function ov(e, t = Infinity) {
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 sv(e, t, n, r) {
15734
- if (t === "set") return n ? (rv(e, n, r), null) : "set 操作需要 jsonPath(整体替换请用 set_window_prop)";
15735
- if (t === "remove") return n ? (iv(e, n), null) : "remove 操作需要 jsonPath";
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 ? nv(e, n) : e;
15738
- return typeof t != "object" || !t || Array.isArray(t) ? `merge 目标${n ? `(${n})` : "(根)"}不是对象` : (tv(t, r), null);
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 ? nv(e, n) : e;
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 cv(e, t, n, r) {
15744
- if (t === "set") rv(window, `${e}.${n}`, r);
15745
- else if (t === "remove") iv(window, `${e}.${n}`);
15746
- else if (t === "merge") tv(n ? nv(window, `${e}.${n}`) : nv(window, e), r);
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 ? nv(window, `${e}.${n}`) : nv(window, e);
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 lv(e, t) {
15753
- let n = nv(window, e);
15754
- typeof n == "object" && n ? uv(n, t) : rv(window, e, t);
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 uv(e, t) {
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 dv(e, r = {}) {
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
- }, l = (r.whitelist ?? !0) === !1;
15781
- function u(e) {
15782
- return r.allowRawRead ? !0 : [...i.keys()].some((t) => e === t || e.startsWith(t + ".") || l && t.startsWith(e + "."));
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
- function d(e, t, n) {
15785
- let r = av(nv(window, e)), i = a.get(e) || [], s = i.length ? i[i.length - 1].id + 1 : 1;
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 f = n(async () => {
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
- }), p = n(async ({ path: e }) => {
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
- }), m = n(async ({ path: e }) => {
15820
- if (!u(e)) return $({
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 = nv(window, e);
15827
- return t === void 0 ? `${e} = (undefined)` : `${e} = ${ov(t)}`;
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
- }), h = n(async ({ path: e, value: t }) => {
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 O_(e, t, n);
15883
+ return A_(e, t, n);
15845
15884
  }
15846
15885
  let a = n.schema.safeParse(r);
15847
- if (!a.success) return D_(e, a.error.issues);
15848
- d(e, "set");
15849
- let o = nv(window, e);
15850
- return typeof o == "object" && o && a.data !== null && typeof a.data == "object" ? uv(o, a.data) : rv(window, e, a.data), c({
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} = ${ov(a.data, 600)}`;
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
- }), g = n(async ({ path: e, op: t, jsonPath: n, value: r }) => {
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 (ev(o)) return $({
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 O_(e, r, t);
15928
+ return A_(e, r, t);
15890
15929
  }
15891
15930
  }
15892
- let l = nv(window, e);
15893
- if (typeof l != "object" || !l) return $({
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}" 当前是 ${l === void 0 ? "undefined" : typeof l}`,
15935
+ message: `edit 仅适用于对象/数组属性,"${e}" 当前是 ${u === void 0 ? "undefined" : typeof u}`,
15897
15936
  hint: "叶子属性(原始类型)请用 set_window_prop 整体设置"
15898
15937
  });
15899
- let u = av(l), f = sv(u, t, o, s);
15900
- if (f) return $({
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: f,
15942
+ message: p,
15904
15943
  hint: "检查 op 与目标类型:merge 需目标为对象,append 需目标为数组;jsonPath 指向需存在"
15905
15944
  });
15906
- let p = a.schema.safeParse(u);
15907
- return p.success ? (d(e, "edit"), cv(e, t, o, s), c({
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 : ""})。当前值:${ov(nv(window, e), 600)}`) : D_(e, p.error.issues);
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
- }), _ = n(async ({ path: e }) => {
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
- d(e, "delete");
15936
- let t = iv(window, e);
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
- }), v = n(async ({ path: e, label: t }) => i.has(e) ? `已为 ${e} 创建快照 #${d(e, "manual", t)}${t ? `(${t})` : ""}。可用 list_window_snapshots 查看、restore_window_snapshot 回退。` : $({
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
- }), y = n(async ({ path: e }) => {
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
- }), b = n(async ({ path: e, id: t }) => {
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 ? (lv(e, av(o.value)), c({
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: E_(s.error.issues)
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
- }), x = [
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 (!u(n)) {
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 = nv(window, n);
16043
- t.push(`- ${n} = ${e === void 0 ? "(undefined)" : ov(e)}`);
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 = nv(window, e);
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 = q_(r, t);
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":${ov(e.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 = nv(window, e);
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 = Y_(s, t, {
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 ov({
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 Q_(av(nv(window, e)), t, 3e3);
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: E_(t.error.issues)
16217
+ details: O_(t.error.issues)
16179
16218
  });
16180
- d(e, "edit", "eval_transform");
16181
- let n = nv(window, e);
16182
- return typeof n == "object" && n && t.data !== null && typeof t.data == "object" ? uv(n, t.data) : rv(window, e, t.data), c({
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)。当前值: ${ov(nv(window, e), 600)}`;
16226
+ }), `已通过脚本 transform 更新 ${e}(耗时 ${a.elapsedMs}ms)。当前值: ${cv(iv(window, e), 600)}`;
16188
16227
  }
16189
- return ov({
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(x, "controller", {
16243
+ return Object.defineProperty(S, "controller", {
16205
16244
  value: s,
16206
16245
  enumerable: !1,
16207
16246
  configurable: !1,
16208
16247
  writable: !1
16209
- }), x;
16248
+ }), S;
16210
16249
  }
16211
16250
  //#endregion
16212
16251
  //#region src/core/tools/fetchDoc.ts
16213
- var fv = 3e4, pv = [n(async ({ url: e, as: t }) => {
16214
- let n = new AbortController(), r = setTimeout(() => n.abort(), fv);
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 ? `获取失败:请求超时(${fv}ms,${e})。` : /Failed to fetch|NetworkError|CORS|blocked/i.test(r) ? `获取失败:可能是 CORS 跨域拦截或网络错误(${r})。浏览器仅能 GET 同源或服务端已配置 CORS 的资源;跨域抓取需后端代理。` : `获取失败:${r}`;
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
- })], mv = pv;
16243
- function hv(e, t) {
16244
- return dv(e, t);
16281
+ })], gv = hv;
16282
+ function _v(e, t) {
16283
+ return pv(e, t);
16245
16284
  }
16246
- function gv(e, t, n) {
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 _v = .7;
16253
- function vv(e, t) {
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) >= _v || /规划|创意|设计|方案|brainstorm|plan/i.test(e.description)), r = e.subagents.filter((e) => (e.temperature ?? 0) < _v && /反思|审查|挑刺|校验|review|critique|reflect/i.test(e.description));
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 yv() {
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 bv = "chat-sdk", xv = 50 * 1024 * 1024, Sv = 4 * 1024 * 1024, Cv = 10 * 1024 * 1024, wv = .9, Tv = 500, Ev = 300, Dv = "__meta__", Ov = "v:1", kv = [
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 Av(e) {
16283
- return e === "local" || e === "session" ? Sv : xv;
16321
+ function Mv(e) {
16322
+ return e === "local" || e === "session" ? wv : Cv;
16284
16323
  }
16285
- function jv(e) {
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 Mv(e, t, n, r) {
16329
+ function Pv(e, t, n, r) {
16291
16330
  return [
16292
- Ov,
16331
+ Av,
16293
16332
  e,
16294
16333
  t,
16295
16334
  n,
16296
16335
  r
16297
16336
  ].join("::");
16298
16337
  }
16299
- function Nv(e, t, n) {
16338
+ function Fv(e, t, n) {
16300
16339
  return [
16301
- Ov,
16340
+ Av,
16302
16341
  e,
16303
16342
  t,
16304
16343
  n
16305
16344
  ].join("::") + "::";
16306
16345
  }
16307
- function Pv(e, t) {
16346
+ function Iv(e, t) {
16308
16347
  return [
16309
- Ov,
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
- Iv ||= new TextEncoder();
16354
+ return [Av, e].join("::") + "::";
16355
+ }
16356
+ var Rv = null;
16357
+ function zv(e) {
16358
+ Rv ||= new TextEncoder();
16320
16359
  try {
16321
- return Iv.encode(JSON.stringify(e)).length;
16360
+ return Rv.encode(JSON.stringify(e)).length;
16322
16361
  } catch {
16323
16362
  return 0;
16324
16363
  }
16325
16364
  }
16326
- function Rv(e, t, n) {
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 zv() {
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 Bv(e) {
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 Vv(e) {
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 Hv(e, t, n) {
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 Uv(e = {}) {
16456
- let t = e.dbName ?? bv, n = e.backend ?? "indexed", r = e.maxBytes ?? Av(n), i = e.maxBytesPerSession ?? Cv, a = e.evictionWatermark ?? wv, o = e.debounceMs ?? Tv, s = /* @__PURE__ */ new Set();
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 Bv(t), d(!0);
16508
+ l = await Hv(t), d(!0);
16470
16509
  } else if (n === "session") {
16471
16510
  if (typeof sessionStorage > "u") throw Error("sessionStorage 不可用");
16472
- l = Vv(sessionStorage), d(!0);
16511
+ l = Uv(sessionStorage), d(!0);
16473
16512
  } else if (n === "local") {
16474
16513
  if (typeof localStorage > "u") throw Error("localStorage 不可用");
16475
- l = Vv(localStorage), d(!0);
16476
- } else l = zv(), d(!1);
16514
+ l = Uv(localStorage), d(!0);
16515
+ } else l = Vv(), d(!1);
16477
16516
  } catch (e) {
16478
- l = zv();
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 = Mv(t, r, a, Dv);
16489
- return Hv(h, o, async () => {
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 : Lv(s), d = Lv(n), f = (t?.bytes ?? 0) + (d - u);
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 (jv(e) && !u) {
16552
+ if (Nv(e) && !u) {
16514
16553
  u = !0;
16515
16554
  try {
16516
16555
  await b();
16517
16556
  } catch {}
16518
- l = zv(), Promise.resolve().then(() => c({
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 = Mv(t, e, n, r), s = p.get(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
- }, Ev);
16596
+ }, Ov);
16558
16597
  }
16559
16598
  async function b() {
16560
16599
  let e = [];
16561
- await l.scan(Fv(t), (t, n) => {
16600
+ await l.scan(Lv(t), (t, n) => {
16562
16601
  t.endsWith("::__meta__") && e.push(n);
16563
16602
  });
16564
- let n = Rv(e, r, a);
16565
- for (let e of n) await l.clearPrefix(Nv(t, e.agentId, e.sessionId)), c({
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(Pv(t, e), (e, t) => {
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 = Mv(t, e, n, Dv);
16582
- return await Hv(h, r, async () => {
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 kv) {
16592
- let i = await l.get(Mv(t, e, n, r));
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 kv) n[i] !== void 0 && r.push(_(e, t, i, n[i]));
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(Nv(t, e, n));
16653
+ await l.clearPrefix(Fv(t, e, n));
16615
16654
  },
16616
16655
  async createSession(e, n, r) {
16617
- let i = r ?? yv(), a = Date.now(), o = {
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(Mv(t, e, i, Dv), o), i;
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 Wv = 50;
16641
- function Gv(e) {
16642
- return e === void 0 || e === !1 ? null : typeof e == "string" ? Uv({ backend: e }) : e.enabled === !1 ? null : Uv(e);
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 Kv(e) {
16688
+ function Yv(e) {
16645
16689
  return !!e && typeof e == "object" && typeof e.invoke == "function" && typeof e.stream == "function";
16646
16690
  }
16647
- var qv = /* @__PURE__ */ new Map();
16648
- function Jv(e) {
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 Yv(e) {
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 (Kv(t)) c = t;
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 Jv(await c.invoke([new a("你是对话历史压缩助手。把下面按轮次索引的对话要点,改写成一段连贯、紧凑的中文摘要,保留关键事实、用户意图与已用工具,不要编造。直接输出摘要正文。"), new i(e)], { signal: t.signal })).trim();
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 Xv(e) {
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 Zv(e) {
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 Qv(e, t) {
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 = Xv(t.name);
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 ? Zv(n) : void 0
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 $v(e, r) {
16716
- let i = Gv(e.storage);
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 = Kv(e.llm) ? void 0 : e.llm, o = Wh({
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 = Yv(e);
16768
+ let s = Qv(e);
16725
16769
  e.debug && !s && console.warn("[page-agent-sdk][summarization] 未构造 llmInvoke(apiKey 缺失?),摘要回退零成本索引摘要");
16726
- let c = /* @__PURE__ */ Qt([]), l = A_(e.vfs?.initialFiles, {
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 ? dv(e.windowProps || [], {
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 = gv(_, y, pv);
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 = vv({
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 ? [L_(l)] : [],
16862
+ ...j ? [z_(l)] : [],
16819
16863
  ...M ? [C_({
16820
- ...T_(e, o.contextWindow),
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
- Qv(ce, c)
16833
- ], le = e.maxMemoryRounds ?? Wv, B = {
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())), qv.delete(r);
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: Kv(e.llm) ? e.llm.model ?? e.llm.modelName : e.llm.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
- ...Kv(e.llm) ? { llm: e.llm } : {
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 ey(e) {
17005
- let t = e.id ?? yv();
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 ? qv.get(t) : void 0;
17008
- a ? i = a : (i = $v(e, t), e.shareContext && qv.set(t, i)), i.refCount++;
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 = yv(), 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));
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 ty(e) {
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
- //#region src/core/presets.ts
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 };