page-agent-sdk 4.2.2 → 4.2.3

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.
@@ -198,6 +198,22 @@ var b = [
198
198
  vision: !0
199
199
  }
200
200
  },
201
+ {
202
+ pattern: /qwen3(\.\d+)?-vl/i,
203
+ caps: {
204
+ contextWindow: 262144,
205
+ maxOutputTokens: 32768,
206
+ vision: !0
207
+ }
208
+ },
209
+ {
210
+ pattern: /qwen3(\.\d+)?-(max|plus|flash)/i,
211
+ caps: {
212
+ contextWindow: 262144,
213
+ maxOutputTokens: 32768,
214
+ thinking: !0
215
+ }
216
+ },
201
217
  {
202
218
  pattern: /qwen-max|qwen-plus/i,
203
219
  caps: {
@@ -7623,63 +7639,70 @@ function Up(e, t) {
7623
7639
  return Array.isArray(a) && Number(i) >= a.length;
7624
7640
  }
7625
7641
  function Wp(e) {
7626
- let t = e.initialFocuses ? [...e.initialFocuses] : [], n = () => e.onChange?.([...t]), r = e.unfocusGuidance ?? "tool", i = (e) => `若你的意图是修改聚焦组件本身(如给它新增页签/子项),请改写焦点路径的子路径重试${e ? `(如 ${e})` : ""};`, a = r === "tool" ? `需改其他组件请先 remove_focus / clear_focus 或换焦点。${i()}` : r === "ask-user" ? `焦点由用户在输入框设定与移除(聚焦 chip ✕);用户要求改其他组件时,提示用户移除聚焦后重试,勿尝试写焦点外(会被拒)。${i()}` : `需改其他组件时,在收口回复中说明需先取消焦点(焦点由主会话管理),勿尝试越界写。${i()}`, o = (e) => r === "tool" ? `${i(e)}需操作焦点外组件请先 remove_focus / clear_focus 或换焦点后重试。` : r === "ask-user" ? `${i(e)}焦点由用户在输入框管理,请提示用户移除输入框中的聚焦 chip 后重试(当前模式无 focus 工具)。` : `${i(e)}请只改焦点子树;需改其他组件时,在收口回复中说明需先取消焦点。`;
7642
+ let t = e.initialFocuses ? [...e.initialFocuses] : [], n = null, r = () => n ?? t, i = () => e.onChange?.([...t]), a = (e, r) => {
7643
+ t = r(t), n !== null && e === "agent" && (n = r(n)), i();
7644
+ }, o = e.unfocusGuidance ?? "tool", s = (e) => `若你的意图是修改聚焦组件本身(如给它新增页签/子项),请改写焦点路径的子路径重试${e ? `(如 ${e})` : ""};`, c = o === "tool" ? `需改其他组件请先 remove_focus / clear_focus 或换焦点。${s()}` : o === "ask-user" ? `焦点由用户在输入框设定与移除(聚焦 chip ✕);用户要求改其他组件时,提示用户移除聚焦后重试,勿尝试写焦点外(会被拒)。${s()}` : `需改其他组件时,在收口回复中说明需先取消焦点(焦点由主会话管理),勿尝试越界写。${s()}`, l = (e) => o === "tool" ? `${s(e)}需操作焦点外组件请先 remove_focus / clear_focus 或换焦点后重试。` : o === "ask-user" ? `${s(e)}焦点由用户在输入框管理,请提示用户移除输入框中的聚焦 chip 后重试(当前模式无 focus 工具)。` : `${s(e)}请只改焦点子树;需改其他组件时,在收口回复中说明需先取消焦点。`;
7627
7645
  return {
7628
7646
  name: "focus",
7629
- beforeAgent: () => t.length ? {
7630
- focuses: [...t],
7631
- focus: t[0]
7632
- } : {},
7647
+ beforeAgent: () => (n = [...t], n.length ? {
7648
+ focuses: [...n],
7649
+ focus: n[0]
7650
+ } : {}),
7651
+ afterAgent: () => {
7652
+ n = null;
7653
+ },
7633
7654
  augmentPrompt: () => {
7655
+ let t = r();
7634
7656
  if (!t.length) return;
7635
7657
  let n = [
7636
7658
  "## 当前精修目标",
7637
7659
  t.map((e) => `· ${e.path}${e.label ? `(${e.label})` : ""}`).join("\n"),
7638
- `仅操作上述 ${t.length} 个聚焦子树${t.length > 1 ? "之一" : ""},用户未指明目标的指令默认作用于聚焦组件(「增加/修改/删除 X」类指令优先理解为对聚焦组件本身的改动 —— 如为其加页签/子项,写焦点路径的子路径;仅用户明确要求新建独立组件时才需解除焦点);不要改动其他组件;${a}`,
7660
+ `仅操作上述 ${t.length} 个聚焦子树${t.length > 1 ? "之一" : ""},用户未指明目标的指令默认作用于聚焦组件(「增加/修改/删除 X」类指令优先理解为对聚焦组件本身的改动 —— 如为其加页签/子项,写焦点路径的子路径;仅用户明确要求新建独立组件时才需解除焦点);不要改动其他组件;${c}`,
7639
7661
  "用户用指示代词提问(「这是啥/这个/它是干什么的」等)时,所指默认是聚焦目标 —— 先 read 聚焦子树,再围绕聚焦组件回答,勿泛答整页",
7640
7662
  "read 不带路径时默认只返回聚焦子树;需要全量主数据时显式列顶层键(read({jsonPaths:[...]}) )"
7641
- ], r = e.getSchema();
7642
- if (r) {
7663
+ ], i = e.getSchema();
7664
+ if (i) {
7643
7665
  let e = t.map((e) => {
7644
- let t = wf(r, e.path);
7666
+ let t = wf(i, e.path);
7645
7667
  return t ? rp(t) : null;
7646
7668
  }).filter((e) => !!e);
7647
7669
  e.length && n.push("", "## 焦点子树结构(仅此范围可操作)", ...e);
7648
7670
  }
7649
7671
  return n.join("\n");
7650
7672
  },
7651
- wrapToolCall: async (n, r) => {
7652
- if (t.length) {
7653
- let i = t.map((e) => e.label ? `${e.path}(${e.label})` : e.path).join(", "), a = t.length === 1 ? `${t[0].path}.props.xxx` : void 0, s = (e) => ({
7654
- content: `PATH_DENIED · 聚焦越界:当前聚焦 [${i}],不可操作「${e}」。${o(a)}`,
7673
+ wrapToolCall: async (t, n) => {
7674
+ let i = r();
7675
+ if (i.length) {
7676
+ let r = i.map((e) => e.label ? `${e.path}(${e.label})` : e.path).join(", "), a = i.length === 1 ? `${i[0].path}.props.xxx` : void 0, o = (e) => ({
7677
+ content: `PATH_DENIED · 聚焦越界:当前聚焦 [${r}],不可操作「${e}」。${l(a)}`,
7655
7678
  status: "error"
7656
7679
  });
7657
- if (n.name === "eval_script") {
7658
- if (n.args?.mode !== "transform") return r(n);
7659
- let i = Vp(n.args);
7660
- if (!i.length) return s("(整体数据)");
7661
- for (let n of i) if (!t.some((e) => Hp(n, e.path)) && !Up(n, e.getBind?.())) return s(n);
7662
- return r(n);
7680
+ if (t.name === "eval_script") {
7681
+ if (t.args?.mode !== "transform") return n(t);
7682
+ let r = Vp(t.args);
7683
+ if (!r.length) return o("(整体数据)");
7684
+ for (let t of r) if (!i.some((e) => Hp(t, e.path)) && !Up(t, e.getBind?.())) return o(t);
7685
+ return n(t);
7663
7686
  }
7664
- if (Bp.has(n.name)) {
7665
- let r = Vp(n.args);
7666
- if (!r.length) return s("(整体数据)");
7667
- for (let n of r) if (!t.some((e) => Hp(n, e.path)) && !Up(n, e.getBind?.())) return s(n);
7687
+ if (Bp.has(t.name)) {
7688
+ let n = Vp(t.args);
7689
+ if (!n.length) return o("(整体数据)");
7690
+ for (let t of n) if (!i.some((e) => Hp(t, e.path)) && !Up(t, e.getBind?.())) return o(t);
7668
7691
  }
7669
- if (n.name === "read") {
7670
- n.callConfig = {
7671
- ...n.callConfig ?? {},
7672
- __pgFullTextPaths: t.map((e) => e.path)
7692
+ if (t.name === "read") {
7693
+ t.callConfig = {
7694
+ ...t.callConfig ?? {},
7695
+ __pgFullTextPaths: i.map((e) => e.path)
7673
7696
  };
7674
- let e = n.args;
7697
+ let e = t.args;
7675
7698
  if (!e?.jsonPath && !e?.jsonPaths) {
7676
- let i = t.map((e) => e.path), a = await r({
7677
- ...n,
7699
+ let r = i.map((e) => e.path), a = await n({
7700
+ ...t,
7678
7701
  args: {
7679
7702
  ...e,
7680
- jsonPaths: i
7703
+ jsonPaths: r
7681
7704
  }
7682
- }), o = `【聚焦模式】read 未带路径 → 默认返回聚焦子树(${i.join(", ")});需要全量主数据时显式列顶层键,如 read({jsonPaths:['<顶层键1>','<顶层键2>']})\n`;
7705
+ }), o = `【聚焦模式】read 未带路径 → 默认返回聚焦子树(${r.join(", ")});需要全量主数据时显式列顶层键,如 read({jsonPaths:['<顶层键1>','<顶层键2>']})\n`;
7683
7706
  return {
7684
7707
  ...a,
7685
7708
  content: o + a.content
@@ -7687,26 +7710,33 @@ function Wp(e) {
7687
7710
  }
7688
7711
  }
7689
7712
  }
7690
- return r(n);
7713
+ return n(t);
7691
7714
  },
7692
- setFocus: (e) => {
7693
- t = e ? [e] : [], n();
7715
+ setFocus: (e, t) => {
7716
+ a(t, () => e ? [e] : []);
7694
7717
  },
7695
7718
  getFocus: () => t[0],
7696
7719
  getFocuses: () => [...t],
7697
- addFocus: (e) => {
7698
- let r = t.findIndex((t) => t.path === e.path);
7699
- r >= 0 ? t[r] = e : t.push(e), n();
7720
+ addFocus: (e, t) => {
7721
+ a(t, (t) => {
7722
+ let n = t.findIndex((t) => t.path === e.path);
7723
+ if (n >= 0) {
7724
+ let r = [...t];
7725
+ return r[n] = e, r;
7726
+ }
7727
+ return [...t, e];
7728
+ });
7700
7729
  },
7701
- removeFocus: (e) => {
7702
- t = t.filter((t) => t.path !== e), n();
7730
+ removeFocus: (e, t) => {
7731
+ a(t, (t) => t.filter((t) => t.path !== e));
7703
7732
  },
7704
- clearFocus: () => {
7705
- t = [], n();
7733
+ clearFocus: (e) => {
7734
+ a(e, () => []);
7706
7735
  },
7707
7736
  reset: () => {
7708
- t = [], n();
7709
- }
7737
+ t = [], n = null, i();
7738
+ },
7739
+ isInvokeActive: () => n !== null
7710
7740
  };
7711
7741
  }
7712
7742
  //#endregion
@@ -14752,7 +14782,7 @@ function qy(e, n) {
14752
14782
  return n ? wf(n, e) ? (j.setFocus({
14753
14783
  path: e,
14754
14784
  ...t ? { label: t } : {}
14755
- }), `已聚焦到 ${e}${t ? `(${t})` : ""}。后续仅可写该子树(越界被拒),每轮只看到该组件结构。完成精修后调 clear_focus 退出。`) : `PATH_DENIED · 聚焦失败:path "${e}" 不在 schema 内。请先用 read 查看可操作路径再聚焦。` : "聚焦失败:当前无主数据 schema,无法聚焦。";
14785
+ }, "agent"), `已聚焦到 ${e}${t ? `(${t})` : ""}。后续仅可写该子树(越界被拒),每轮只看到该组件结构。完成精修后调 clear_focus 退出。`) : `PATH_DENIED · 聚焦失败:path "${e}" 不在 schema 内。请先用 read 查看可操作路径再聚焦。` : "聚焦失败:当前无主数据 schema,无法聚焦。";
14756
14786
  }, {
14757
14787
  name: "set_focus",
14758
14788
  description: "聚焦到指定组件子树(如 components.3)精修,替换全部已有焦点(非累积;要保留已有焦点追加用 add_focus)。聚焦后:仅可写该子树(越界 PATH_DENIED)+ 每轮只看到该组件结构。多组件页面精修其中一个时用,避免改到别处。先 read 定位 path 再聚焦;完成调 clear_focus。",
@@ -14760,7 +14790,7 @@ function qy(e, n) {
14760
14790
  path: t.string().describe("要聚焦的组件 jsonPath,如 components.3"),
14761
14791
  label: t.string().optional().describe("人类可读标签,如「导航栏」")
14762
14792
  })
14763
- }), Me = r(async () => (j.clearFocus(), "已清除聚焦,恢复全量可操作范围(可读写所有组件)。"), {
14793
+ }), Me = r(async () => (j.clearFocus("agent"), "已清除聚焦,恢复全量可操作范围(可读写所有组件)。"), {
14764
14794
  name: "clear_focus",
14765
14795
  description: "清除当前聚焦,退出精修模式,恢复对全部组件的读写权限。",
14766
14796
  schema: t.object({}).optional()
@@ -14771,7 +14801,7 @@ function qy(e, n) {
14771
14801
  j.addFocus({
14772
14802
  path: e,
14773
14803
  ...t ? { label: t } : {}
14774
- });
14804
+ }, "agent");
14775
14805
  let r = j.getFocuses();
14776
14806
  return `已聚焦 ${e}${t ? `(${t})` : ""}(当前共 ${r.length} 个焦点:${r.map((e) => e.path).join(", ")})。后续仅可写这些子树之一(越界被拒)。`;
14777
14807
  }, {
@@ -14783,7 +14813,7 @@ function qy(e, n) {
14783
14813
  })
14784
14814
  }), Pe = r(async ({ path: e }) => {
14785
14815
  let t = j.getFocuses().length;
14786
- j.removeFocus(e);
14816
+ j.removeFocus(e, "agent");
14787
14817
  let n = j.getFocuses();
14788
14818
  return n.length === t ? `path "${e}" 不在当前焦点列表中(当前:${n.map((e) => e.path).join(", ") || "无"})。` : n.length ? `已移除焦点 ${e}(剩余 ${n.length} 个:${n.map((e) => e.path).join(", ")})。` : `已移除焦点 ${e},聚焦已清空,恢复全量操作范围。`;
14789
14819
  }, {
@@ -15610,14 +15640,14 @@ function qy(e, n) {
15610
15640
  },
15611
15641
  setFocus(t) {
15612
15642
  let n = Ky(t, "setFocus", Ae, () => ge()?.schema, e.debug);
15613
- return n.ok ? (j.setFocus(t), G.infoTick.value++, { ok: !0 }) : n;
15643
+ return n.ok ? (j.setFocus(t), e.debug && j.isInvokeActive() && console.info("[page-agent-sdk][focus] 在途流程进行中,聚焦将在下一次输入生效(当前流程不受影响)"), G.infoTick.value++, { ok: !0 }) : n;
15614
15644
  },
15615
15645
  addFocus(t) {
15616
15646
  let n = Ky(t, "addFocus", Ae, () => ge()?.schema, e.debug);
15617
15647
  return n.ok ? j.getFocuses().length >= 8 ? (e.debug && console.warn("[page-agent-sdk][focus] addFocus 拒绝:焦点数已达上限 8(augmentPrompt 注入每焦点子树 schema,过多致 system prompt 超预算)"), {
15618
15648
  ok: !1,
15619
15649
  error: "焦点数上限 8(避免 system prompt 撑爆)"
15620
- }) : (j.addFocus(t), G.infoTick.value++, { ok: !0 }) : n;
15650
+ }) : (j.addFocus(t), e.debug && j.isInvokeActive() && console.info("[page-agent-sdk][focus] 在途流程进行中,聚焦将在下一次输入生效(当前流程不受影响)"), G.infoTick.value++, { ok: !0 }) : n;
15621
15651
  },
15622
15652
  removeFocus(e) {
15623
15653
  Ae && (j.removeFocus(e), G.infoTick.value++);
@@ -17629,8 +17659,8 @@ function nw(e = {}) {
17629
17659
  await r?.(s.messages);
17630
17660
  } catch {}
17631
17661
  s.loading = !1, u = null;
17632
- let e = d.value.shift();
17633
- e !== void 0 && (g("user", e), s.loading = !0, s.error = null, u = new AbortController(), await _(u.signal));
17662
+ let t = d.value.shift();
17663
+ t !== void 0 && (g("user", t, e.getFocuses?.()), s.loading = !0, s.error = null, u = new AbortController(), await _(u.signal));
17634
17664
  }
17635
17665
  function b(e) {
17636
17666
  d.value.splice(e, 1);
@@ -17787,7 +17817,7 @@ var ow = {
17787
17817
  copyThinkingTruncTitle: "复制完整思考(渲染已截尾,复制取全量)",
17788
17818
  focusChipTitlePrefix: "精修中:",
17789
17819
  focusChipTitleHint: "(点击回看 · ✕ 移除)",
17790
- historyFocusChipTitlePrefix: "回看 ",
17820
+ historyFocusChipTitlePrefix: "发送时聚焦(路径可能已变):",
17791
17821
  removeFocus: "移除此焦点",
17792
17822
  sendHint: "Enter 发送 · Shift+Enter 换行",
17793
17823
  sendTitle: "发送",
@@ -18011,7 +18041,7 @@ var ow = {
18011
18041
  copyThinkingTruncTitle: "Copy full reasoning (display truncated, copy gets all)",
18012
18042
  focusChipTitlePrefix: "Focus:",
18013
18043
  focusChipTitleHint: "(click to view · ✕ remove)",
18014
- historyFocusChipTitlePrefix: "View ",
18044
+ historyFocusChipTitlePrefix: "Focused at send (path may have changed): ",
18015
18045
  removeFocus: "Remove this focus",
18016
18046
  sendHint: "Enter to send · Shift+Enter for newline",
18017
18047
  sendTitle: "Send",
@@ -18217,7 +18247,8 @@ function dw(e = {}) {
18217
18247
  onPersist: e.onPersist,
18218
18248
  onClear: e.onClear,
18219
18249
  onQueuedCleared: e.onQueuedCleared,
18220
- onBeforeRegenerate: e.onBeforeRegenerate
18250
+ onBeforeRegenerate: e.onBeforeRegenerate,
18251
+ getFocuses: e.getFocuses
18221
18252
  }), { state: n, sendMessage: r, removeQueuedTask: i, queuedTasks: a } = t, o = /* @__PURE__ */ Mn(""), s = /* @__PURE__ */ Mn(!0), c = () => {
18222
18253
  s.value = !s.value;
18223
18254
  }, l = /* @__PURE__ */ Mn(!1), u = () => {
@@ -28237,7 +28268,7 @@ var Gk = ["innerHTML"], Kk = /* @__PURE__ */ Wi({
28237
28268
  }, cA = { class: "message-content" }, lA = {
28238
28269
  key: 2,
28239
28270
  class: "msg-focuses"
28240
- }, uA = ["title", "onClick"], dA = ["data-img-count"], fA = ["href", "title"], pA = ["src", "alt"], mA = {
28271
+ }, uA = ["title"], dA = ["data-img-count"], fA = ["href", "title"], pA = ["src", "alt"], mA = {
28241
28272
  key: 1,
28242
28273
  class: "msg-image-lost"
28243
28274
  }, hA = /*#__PURE__*/ qT(/* @__PURE__ */ Wi({
@@ -28294,8 +28325,7 @@ var Gk = ["innerHTML"], Kk = /* @__PURE__ */ Wi({
28294
28325
  e.message.role === "user" && e.message.focuses?.length ? (Y(), X("div", lA, [(Y(!0), X(J, null, ga(e.message.focuses, (e) => (Y(), X("span", {
28295
28326
  key: e.path,
28296
28327
  class: "msg-focus-chip",
28297
- title: K(n).messages.historyFocusChipTitlePrefix + e.path,
28298
- onClick: (t) => K(n).focusChipClick(e)
28328
+ title: K(n).messages.historyFocusChipTitlePrefix + e.path
28299
28329
  }, [xs(JT, { icon: K(n).icons.focus }, null, 8, ["icon"]), Es(" " + W(e.path), 1)], 8, uA))), 128))])) : Q("", !0),
28300
28330
  e.message.role === "user" && e.message.images?.length ? (Y(), X("div", {
28301
28331
  key: 3,
@@ -28340,7 +28370,7 @@ var Gk = ["innerHTML"], Kk = /* @__PURE__ */ Wi({
28340
28370
  }, null, 8, ["messages", "copied"])) : Q("", !0)
28341
28371
  ])], 10, oA));
28342
28372
  }
28343
- }), [["__scopeId", "data-v-dc92d354"]]), gA = { class: "chat-body" }, _A = {
28373
+ }), [["__scopeId", "data-v-053034ee"]]), gA = { class: "chat-body" }, _A = {
28344
28374
  key: 0,
28345
28375
  class: "empty-state"
28346
28376
  }, vA = { class: "empty-icon" }, yA = {
@@ -43065,6 +43065,22 @@ var xge = [
43065
43065
  vision: !0
43066
43066
  }
43067
43067
  },
43068
+ {
43069
+ pattern: /qwen3(\.\d+)?-vl/i,
43070
+ caps: {
43071
+ contextWindow: 262144,
43072
+ maxOutputTokens: 32768,
43073
+ vision: !0
43074
+ }
43075
+ },
43076
+ {
43077
+ pattern: /qwen3(\.\d+)?-(max|plus|flash)/i,
43078
+ caps: {
43079
+ contextWindow: 262144,
43080
+ maxOutputTokens: 32768,
43081
+ thinking: !0
43082
+ }
43083
+ },
43068
43084
  {
43069
43085
  pattern: /qwen-max|qwen-plus/i,
43070
43086
  caps: {
@@ -57473,89 +57489,106 @@ function D$(e, t) {
57473
57489
  }
57474
57490
  function O$(e) {
57475
57491
  var t;
57476
- let n = e.initialFocuses ? [...e.initialFocuses] : [], r = () => {
57492
+ let n = e.initialFocuses ? [...e.initialFocuses] : [], r = null, i = () => {
57493
+ var e;
57494
+ return (e = r) == null ? n : e;
57495
+ }, a = () => {
57477
57496
  var t;
57478
57497
  return (t = e.onChange) == null ? void 0 : t.call(e, [...n]);
57479
- }, i = (t = e.unfocusGuidance) == null ? "tool" : t, a = (e) => `若你的意图是修改聚焦组件本身(如给它新增页签/子项),请改写焦点路径的子路径重试${e ? `(如 ${e})` : ""};`, o = i === "tool" ? `需改其他组件请先 remove_focus / clear_focus 或换焦点。${a()}` : i === "ask-user" ? `焦点由用户在输入框设定与移除(聚焦 chip ✕);用户要求改其他组件时,提示用户移除聚焦后重试,勿尝试写焦点外(会被拒)。${a()}` : `需改其他组件时,在收口回复中说明需先取消焦点(焦点由主会话管理),勿尝试越界写。${a()}`, s = (e) => i === "tool" ? `${a(e)}需操作焦点外组件请先 remove_focus / clear_focus 或换焦点后重试。` : i === "ask-user" ? `${a(e)}焦点由用户在输入框管理,请提示用户移除输入框中的聚焦 chip 后重试(当前模式无 focus 工具)。` : `${a(e)}请只改焦点子树;需改其他组件时,在收口回复中说明需先取消焦点。`;
57498
+ }, o = (e, t) => {
57499
+ n = t(n), r !== null && e === "agent" && (r = t(r)), a();
57500
+ }, s = (t = e.unfocusGuidance) == null ? "tool" : t, c = (e) => `若你的意图是修改聚焦组件本身(如给它新增页签/子项),请改写焦点路径的子路径重试${e ? `(如 ${e})` : ""};`, l = s === "tool" ? `需改其他组件请先 remove_focus / clear_focus 或换焦点。${c()}` : s === "ask-user" ? `焦点由用户在输入框设定与移除(聚焦 chip ✕);用户要求改其他组件时,提示用户移除聚焦后重试,勿尝试写焦点外(会被拒)。${c()}` : `需改其他组件时,在收口回复中说明需先取消焦点(焦点由主会话管理),勿尝试越界写。${c()}`, u = (e) => s === "tool" ? `${c(e)}需操作焦点外组件请先 remove_focus / clear_focus 或换焦点后重试。` : s === "ask-user" ? `${c(e)}焦点由用户在输入框管理,请提示用户移除输入框中的聚焦 chip 后重试(当前模式无 focus 工具)。` : `${c(e)}请只改焦点子树;需改其他组件时,在收口回复中说明需先取消焦点。`;
57480
57501
  return {
57481
57502
  name: "focus",
57482
- beforeAgent: () => n.length ? {
57483
- focuses: [...n],
57484
- focus: n[0]
57485
- } : {},
57503
+ beforeAgent: () => (r = [...n], r.length ? {
57504
+ focuses: [...r],
57505
+ focus: r[0]
57506
+ } : {}),
57507
+ afterAgent: () => {
57508
+ r = null;
57509
+ },
57486
57510
  augmentPrompt: () => {
57487
- if (!n.length) return;
57488
- let t = [
57511
+ let t = i();
57512
+ if (!t.length) return;
57513
+ let n = [
57489
57514
  "## 当前精修目标",
57490
- n.map((e) => `· ${e.path}${e.label ? `(${e.label})` : ""}`).join("\n"),
57491
- `仅操作上述 ${n.length} 个聚焦子树${n.length > 1 ? "之一" : ""},用户未指明目标的指令默认作用于聚焦组件(「增加/修改/删除 X」类指令优先理解为对聚焦组件本身的改动 —— 如为其加页签/子项,写焦点路径的子路径;仅用户明确要求新建独立组件时才需解除焦点);不要改动其他组件;${o}`,
57515
+ t.map((e) => `· ${e.path}${e.label ? `(${e.label})` : ""}`).join("\n"),
57516
+ `仅操作上述 ${t.length} 个聚焦子树${t.length > 1 ? "之一" : ""},用户未指明目标的指令默认作用于聚焦组件(「增加/修改/删除 X」类指令优先理解为对聚焦组件本身的改动 —— 如为其加页签/子项,写焦点路径的子路径;仅用户明确要求新建独立组件时才需解除焦点);不要改动其他组件;${l}`,
57492
57517
  "用户用指示代词提问(「这是啥/这个/它是干什么的」等)时,所指默认是聚焦目标 —— 先 read 聚焦子树,再围绕聚焦组件回答,勿泛答整页",
57493
57518
  "read 不带路径时默认只返回聚焦子树;需要全量主数据时显式列顶层键(read({jsonPaths:[...]}) )"
57494
57519
  ], r = e.getSchema();
57495
57520
  if (r) {
57496
- let e = n.map((e) => {
57521
+ let e = t.map((e) => {
57497
57522
  let t = FQ(r, e.path);
57498
57523
  return t ? r$(t) : null;
57499
57524
  }).filter((e) => !!e);
57500
- e.length && t.push("", "## 焦点子树结构(仅此范围可操作)", ...e);
57525
+ e.length && n.push("", "## 焦点子树结构(仅此范围可操作)", ...e);
57501
57526
  }
57502
- return t.join("\n");
57527
+ return n.join("\n");
57503
57528
  },
57504
- wrapToolCall: async (t, r) => {
57505
- if (n.length) {
57506
- let l = n.map((e) => e.label ? `${e.path}(${e.label})` : e.path).join(", "), u = n.length === 1 ? `${n[0].path}.props.xxx` : void 0, d = (e) => ({
57507
- content: `PATH_DENIED · 聚焦越界:当前聚焦 [${l}],不可操作「${e}」。${s(u)}`,
57529
+ wrapToolCall: async (t, n) => {
57530
+ let r = i();
57531
+ if (r.length) {
57532
+ let i = r.map((e) => e.label ? `${e.path}(${e.label})` : e.path).join(", "), l = r.length === 1 ? `${r[0].path}.props.xxx` : void 0, d = (e) => ({
57533
+ content: `PATH_DENIED · 聚焦越界:当前聚焦 [${i}],不可操作「${e}」。${u(l)}`,
57508
57534
  status: "error"
57509
57535
  });
57510
57536
  if (t.name === "eval_script") {
57511
- var i;
57512
- if (((i = t.args) == null ? void 0 : i.mode) !== "transform") return r(t);
57513
- let o = T$(t.args);
57514
- if (!o.length) return d("(整体数据)");
57515
- for (let t of o) {
57516
- var a;
57517
- if (!n.some((e) => E$(t, e.path)) && !D$(t, (a = e.getBind) == null ? void 0 : a.call(e))) return d(t);
57537
+ var a;
57538
+ if (((a = t.args) == null ? void 0 : a.mode) !== "transform") return n(t);
57539
+ let i = T$(t.args);
57540
+ if (!i.length) return d("(整体数据)");
57541
+ for (let t of i) {
57542
+ var o;
57543
+ if (!r.some((e) => E$(t, e.path)) && !D$(t, (o = e.getBind) == null ? void 0 : o.call(e))) return d(t);
57518
57544
  }
57519
- return r(t);
57545
+ return n(t);
57520
57546
  }
57521
57547
  if (Vwe.has(t.name)) {
57522
- let r = T$(t.args);
57523
- if (!r.length) return d("(整体数据)");
57524
- for (let t of r) {
57525
- var o;
57526
- if (!n.some((e) => E$(t, e.path)) && !D$(t, (o = e.getBind) == null ? void 0 : o.call(e))) return d(t);
57548
+ let n = T$(t.args);
57549
+ if (!n.length) return d("(整体数据)");
57550
+ for (let t of n) {
57551
+ var s;
57552
+ if (!r.some((e) => E$(t, e.path)) && !D$(t, (s = e.getBind) == null ? void 0 : s.call(e))) return d(t);
57527
57553
  }
57528
57554
  }
57529
57555
  if (t.name === "read") {
57530
57556
  var c;
57531
- t.callConfig = j(j({}, (c = t.callConfig) == null ? {} : c), {}, { __pgFullTextPaths: n.map((e) => e.path) });
57557
+ t.callConfig = j(j({}, (c = t.callConfig) == null ? {} : c), {}, { __pgFullTextPaths: r.map((e) => e.path) });
57532
57558
  let e = t.args;
57533
57559
  if (!(e != null && e.jsonPath) && !(e != null && e.jsonPaths)) {
57534
- let i = n.map((e) => e.path), a = await r(j(j({}, t), {}, { args: j(j({}, e), {}, { jsonPaths: i }) })), o = `【聚焦模式】read 未带路径 → 默认返回聚焦子树(${i.join(", ")});需要全量主数据时显式列顶层键,如 read({jsonPaths:['<顶层键1>','<顶层键2>']})\n`;
57560
+ let i = r.map((e) => e.path), a = await n(j(j({}, t), {}, { args: j(j({}, e), {}, { jsonPaths: i }) })), o = `【聚焦模式】read 未带路径 → 默认返回聚焦子树(${i.join(", ")});需要全量主数据时显式列顶层键,如 read({jsonPaths:['<顶层键1>','<顶层键2>']})\n`;
57535
57561
  return j(j({}, a), {}, { content: o + a.content });
57536
57562
  }
57537
57563
  }
57538
57564
  }
57539
- return r(t);
57565
+ return n(t);
57540
57566
  },
57541
- setFocus: (e) => {
57542
- n = e ? [e] : [], r();
57567
+ setFocus: (e, t) => {
57568
+ o(t, () => e ? [e] : []);
57543
57569
  },
57544
57570
  getFocus: () => n[0],
57545
57571
  getFocuses: () => [...n],
57546
- addFocus: (e) => {
57547
- let t = n.findIndex((t) => t.path === e.path);
57548
- t >= 0 ? n[t] = e : n.push(e), r();
57572
+ addFocus: (e, t) => {
57573
+ o(t, (t) => {
57574
+ let n = t.findIndex((t) => t.path === e.path);
57575
+ if (n >= 0) {
57576
+ let r = [...t];
57577
+ return r[n] = e, r;
57578
+ }
57579
+ return [...t, e];
57580
+ });
57549
57581
  },
57550
- removeFocus: (e) => {
57551
- n = n.filter((t) => t.path !== e), r();
57582
+ removeFocus: (e, t) => {
57583
+ o(t, (t) => t.filter((t) => t.path !== e));
57552
57584
  },
57553
- clearFocus: () => {
57554
- n = [], r();
57585
+ clearFocus: (e) => {
57586
+ o(e, () => []);
57555
57587
  },
57556
57588
  reset: () => {
57557
- n = [], r();
57558
- }
57589
+ n = [], r = null, a();
57590
+ },
57591
+ isInvokeActive: () => r !== null
57559
57592
  };
57560
57593
  }
57561
57594
  _F(), Xf();
@@ -72519,7 +72552,7 @@ function aMe(e, t) {
72519
72552
  let mt = Ge.focus, ht = fF(async ({ path: e, label: t }) => {
72520
72553
  var n;
72521
72554
  let r = (n = et()) == null ? void 0 : n.schema;
72522
- return r ? FQ(r, e) ? (Ee.setFocus(j({ path: e }, t ? { label: t } : {})), `已聚焦到 ${e}${t ? `(${t})` : ""}。后续仅可写该子树(越界被拒),每轮只看到该组件结构。完成精修后调 clear_focus 退出。`) : `PATH_DENIED · 聚焦失败:path "${e}" 不在 schema 内。请先用 read 查看可操作路径再聚焦。` : "聚焦失败:当前无主数据 schema,无法聚焦。";
72555
+ return r ? FQ(r, e) ? (Ee.setFocus(j({ path: e }, t ? { label: t } : {}), "agent"), `已聚焦到 ${e}${t ? `(${t})` : ""}。后续仅可写该子树(越界被拒),每轮只看到该组件结构。完成精修后调 clear_focus 退出。`) : `PATH_DENIED · 聚焦失败:path "${e}" 不在 schema 内。请先用 read 查看可操作路径再聚焦。` : "聚焦失败:当前无主数据 schema,无法聚焦。";
72523
72556
  }, {
72524
72557
  name: "set_focus",
72525
72558
  description: "聚焦到指定组件子树(如 components.3)精修,替换全部已有焦点(非累积;要保留已有焦点追加用 add_focus)。聚焦后:仅可写该子树(越界 PATH_DENIED)+ 每轮只看到该组件结构。多组件页面精修其中一个时用,避免改到别处。先 read 定位 path 再聚焦;完成调 clear_focus。",
@@ -72527,7 +72560,7 @@ function aMe(e, t) {
72527
72560
  path: z().describe("要聚焦的组件 jsonPath,如 components.3"),
72528
72561
  label: z().optional().describe("人类可读标签,如「导航栏」")
72529
72562
  })
72530
- }), gt = fF(async () => (Ee.clearFocus(), "已清除聚焦,恢复全量可操作范围(可读写所有组件)。"), {
72563
+ }), gt = fF(async () => (Ee.clearFocus("agent"), "已清除聚焦,恢复全量可操作范围(可读写所有组件)。"), {
72531
72564
  name: "clear_focus",
72532
72565
  description: "清除当前聚焦,退出精修模式,恢复对全部组件的读写权限。",
72533
72566
  schema: B({}).optional()
@@ -72536,7 +72569,7 @@ function aMe(e, t) {
72536
72569
  let r = (n = et()) == null ? void 0 : n.schema;
72537
72570
  if (!r) return "聚焦失败:当前无主数据 schema,无法聚焦。";
72538
72571
  if (!FQ(r, e)) return `PATH_DENIED · 聚焦失败:path "${e}" 不在 schema 内。请先用 read 查看可操作路径再聚焦。`;
72539
- Ee.addFocus(j({ path: e }, t ? { label: t } : {}));
72572
+ Ee.addFocus(j({ path: e }, t ? { label: t } : {}), "agent");
72540
72573
  let i = Ee.getFocuses();
72541
72574
  return `已聚焦 ${e}${t ? `(${t})` : ""}(当前共 ${i.length} 个焦点:${i.map((e) => e.path).join(", ")})。后续仅可写这些子树之一(越界被拒)。`;
72542
72575
  }, {
@@ -72548,7 +72581,7 @@ function aMe(e, t) {
72548
72581
  })
72549
72582
  }), vt = fF(async ({ path: e }) => {
72550
72583
  let t = Ee.getFocuses().length;
72551
- Ee.removeFocus(e);
72584
+ Ee.removeFocus(e, "agent");
72552
72585
  let n = Ee.getFocuses();
72553
72586
  return n.length === t ? `path "${e}" 不在当前焦点列表中(当前:${n.map((e) => e.path).join(", ") || "无"})。` : n.length ? `已移除焦点 ${e}(剩余 ${n.length} 个:${n.map((e) => e.path).join(", ")})。` : `已移除焦点 ${e},聚焦已清空,恢复全量操作范围。`;
72554
72587
  }, {
@@ -73450,7 +73483,7 @@ function aMe(e, t) {
73450
73483
  var e;
73451
73484
  return (e = et()) == null ? void 0 : e.schema;
73452
73485
  }, e.debug);
73453
- return n.ok ? (Ee.setFocus(t), R.infoTick.value++, { ok: !0 }) : n;
73486
+ return n.ok ? (Ee.setFocus(t), e.debug && Ee.isInvokeActive() && console.info("[page-agent-sdk][focus] 在途流程进行中,聚焦将在下一次输入生效(当前流程不受影响)"), R.infoTick.value++, { ok: !0 }) : n;
73454
73487
  },
73455
73488
  addFocus(t) {
73456
73489
  let n = iMe(t, "addFocus", mt, () => {
@@ -73460,7 +73493,7 @@ function aMe(e, t) {
73460
73493
  return n.ok ? Ee.getFocuses().length >= 8 ? (e.debug && console.warn("[page-agent-sdk][focus] addFocus 拒绝:焦点数已达上限 8(augmentPrompt 注入每焦点子树 schema,过多致 system prompt 超预算)"), {
73461
73494
  ok: !1,
73462
73495
  error: "焦点数上限 8(避免 system prompt 撑爆)"
73463
- }) : (Ee.addFocus(t), R.infoTick.value++, { ok: !0 }) : n;
73496
+ }) : (Ee.addFocus(t), e.debug && Ee.isInvokeActive() && console.info("[page-agent-sdk][focus] 在途流程进行中,聚焦将在下一次输入生效(当前流程不受影响)"), R.infoTick.value++, { ok: !0 }) : n;
73464
73497
  },
73465
73498
  removeFocus(e) {
73466
73499
  mt && (Ee.removeFocus(e), R.infoTick.value++);
@@ -75518,8 +75551,11 @@ function bPe(e = {}) {
75518
75551
  await (i == null ? void 0 : i(c.messages));
75519
75552
  } catch (e) {}
75520
75553
  c.loading = !1, d = null;
75521
- let e = f.value.shift();
75522
- e !== void 0 && (_("user", e), c.loading = !0, c.error = null, d = new AbortController(), await v(d.signal));
75554
+ let t = f.value.shift();
75555
+ if (t !== void 0) {
75556
+ var n;
75557
+ _("user", t, (n = e.getFocuses) == null ? void 0 : n.call(e)), c.loading = !0, c.error = null, d = new AbortController(), await v(d.signal);
75558
+ }
75523
75559
  }
75524
75560
  function x(e) {
75525
75561
  f.value.splice(e, 1);
@@ -75681,7 +75717,7 @@ var B7 = {
75681
75717
  copyThinkingTruncTitle: "复制完整思考(渲染已截尾,复制取全量)",
75682
75718
  focusChipTitlePrefix: "精修中:",
75683
75719
  focusChipTitleHint: "(点击回看 · ✕ 移除)",
75684
- historyFocusChipTitlePrefix: "回看 ",
75720
+ historyFocusChipTitlePrefix: "发送时聚焦(路径可能已变):",
75685
75721
  removeFocus: "移除此焦点",
75686
75722
  sendHint: "Enter 发送 · Shift+Enter 换行",
75687
75723
  sendTitle: "发送",
@@ -75905,7 +75941,7 @@ var B7 = {
75905
75941
  copyThinkingTruncTitle: "Copy full reasoning (display truncated, copy gets all)",
75906
75942
  focusChipTitlePrefix: "Focus:",
75907
75943
  focusChipTitleHint: "(click to view · ✕ remove)",
75908
- historyFocusChipTitlePrefix: "View ",
75944
+ historyFocusChipTitlePrefix: "Focused at send (path may have changed): ",
75909
75945
  removeFocus: "Remove this focus",
75910
75946
  sendHint: "Enter to send · Shift+Enter for newline",
75911
75947
  sendTitle: "Send",
@@ -76109,7 +76145,8 @@ function TPe(e = {}) {
76109
76145
  onPersist: e.onPersist,
76110
76146
  onClear: e.onClear,
76111
76147
  onQueuedCleared: e.onQueuedCleared,
76112
- onBeforeRegenerate: e.onBeforeRegenerate
76148
+ onBeforeRegenerate: e.onBeforeRegenerate,
76149
+ getFocuses: e.getFocuses
76113
76150
  }), { state: r, sendMessage: i, removeQueuedTask: a, queuedTasks: o } = n, s = /* @__PURE__ */ Xq(""), c = /* @__PURE__ */ Xq(!0), l = () => {
76114
76151
  c.value = !c.value;
76115
76152
  }, u = /* @__PURE__ */ Xq(!1), d = () => {
@@ -86160,7 +86197,7 @@ var nze = { class: "msg-actions" }, rze = ["title"], ize = {
86160
86197
  }, fze = { class: "message-content" }, pze = {
86161
86198
  key: 2,
86162
86199
  class: "msg-focuses"
86163
- }, mze = ["title", "onClick"], hze = ["data-img-count"], gze = ["href", "title"], _ze = ["src", "alt"], vze = {
86200
+ }, mze = ["title"], hze = ["data-img-count"], gze = ["href", "title"], _ze = ["src", "alt"], vze = {
86164
86201
  key: 1,
86165
86202
  class: "msg-image-lost"
86166
86203
  }, yze = /*#__PURE__*/ _9(/* @__PURE__ */ nY({
@@ -86225,8 +86262,7 @@ var nze = { class: "msg-actions" }, rze = ["title"], ize = {
86225
86262
  e.message.role === "user" && (u = e.message.focuses) != null && u.length ? (X(), Z("div", pze, [(X(!0), Z(oX, null, gY(e.message.focuses, (e) => (X(), Z("span", {
86226
86263
  key: e.path,
86227
86264
  class: "msg-focus-chip",
86228
- title: Y(n).messages.historyFocusChipTitlePrefix + e.path,
86229
- onClick: (t) => Y(n).focusChipClick(e)
86265
+ title: Y(n).messages.historyFocusChipTitlePrefix + e.path
86230
86266
  }, [bX(v9, { icon: Y(n).icons.focus }, null, 8, ["icon"]), SX(" " + J(e.path), 1)], 8, mze))), 128))])) : $("", !0),
86231
86267
  e.message.role === "user" && (d = e.message.images) != null && d.length ? (X(), Z("div", {
86232
86268
  key: 3,
@@ -86272,7 +86308,7 @@ var nze = { class: "msg-actions" }, rze = ["title"], ize = {
86272
86308
  ])], 10, uze);
86273
86309
  };
86274
86310
  }
86275
- }), [["__scopeId", "data-v-dc92d354"]]), bze = { class: "chat-body" }, xze = {
86311
+ }), [["__scopeId", "data-v-053034ee"]]), bze = { class: "chat-body" }, xze = {
86276
86312
  key: 0,
86277
86313
  class: "empty-state"
86278
86314
  }, Sze = { class: "empty-icon" }, Cze = {