page-agent-sdk 4.1.0 → 4.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/README.zh-CN.md +2 -2
- package/dist/page-agent-sdk.headless.js +155 -100
- package/dist/page-agent-sdk.iife.js +7 -6
- package/dist/page-agent-sdk.js +110 -55
- package/dist/page-agent-sdk.legacy.js +134 -78
- package/dist/page-agent-sdk.umd.cjs +7 -6
- package/package.json +1 -1
|
@@ -42885,7 +42885,7 @@ function yge(e) {
|
|
|
42885
42885
|
return !!(e == null || typeof e == "string" || e instanceof ArrayBuffer || ArrayBuffer.isView(e) || typeof Blob < "u" && e instanceof Blob || e instanceof URLSearchParams || e instanceof FormData);
|
|
42886
42886
|
}
|
|
42887
42887
|
function bge(e) {
|
|
42888
|
-
let t = e.model || "
|
|
42888
|
+
let t = e.model || "deepseek-v4-flash", n = e.temperature, r = e.maxTokens, i = e.baseUrl;
|
|
42889
42889
|
if (e.mode === "direct") {
|
|
42890
42890
|
let a = !1;
|
|
42891
42891
|
try {
|
|
@@ -55796,7 +55796,7 @@ function AQ(e) {
|
|
|
55796
55796
|
}
|
|
55797
55797
|
function jQ(e) {
|
|
55798
55798
|
var t, n, r;
|
|
55799
|
-
let { apiKey: i, baseUrl: a, model: o = "
|
|
55799
|
+
let { apiKey: i, baseUrl: a, model: o = "deepseek-v4-flash", temperature: s = .7, maxTokens: c, extraBody: l, extraConfig: u, systemPrompt: d, tools: f = [], middleware: p = [], maxToolRounds: m, maxIterations: h, maxRetries: g = 2, retryDelayMs: _ = 500, stallMs: v = KZ, streamMaxMs: y = qZ, toolTimeoutMs: b, maxParallelTools: x = 1, maxVerifyAttempts: S = 0, roundTokenBudget: C = 0, onLog: w, onLlmChange: T, imageContentFormat: E = "openai", staleReadInvalidation: D = !0, debug: O = !1 } = e, k = m == null ? dwe : m;
|
|
55800
55800
|
(!Number.isFinite(k) || k < 1) && (console.warn(`[page-agent-sdk] maxToolRounds=${k} 非法(须 ≥1 正整数),已 clamp 到 1(0/负数致主循环 while 不进 → agent 不调 LLM 静默返回兜底文案)`), k = 1);
|
|
55801
55801
|
let A = bF({
|
|
55802
55802
|
model: o,
|
|
@@ -57341,7 +57341,7 @@ function v$(e, t, n, r) {
|
|
|
57341
57341
|
}
|
|
57342
57342
|
if (t === "move") return b$(e, n, r);
|
|
57343
57343
|
let i = n ? s$(e, n) : e;
|
|
57344
|
-
return Array.isArray(i) ? (Array.isArray(r) ? i.push(...r) : i.push(r), null) : `append 目标${n ? `(${n})` : "(根)"}
|
|
57344
|
+
return typeof i == "string" ? typeof r == "string" ? (c$(e, n, i + r), null) : `append 目标(${n})是字符串,value 必须也是字符串(拼接语义)` : Array.isArray(i) ? (Array.isArray(r) ? i.push(...r) : i.push(r), null) : `append 目标${n ? `(${n})` : "(根)"}不是数组(也不支持非字符串标量拼接)`;
|
|
57345
57345
|
}
|
|
57346
57346
|
function y$(e, t) {
|
|
57347
57347
|
let n = t.split("."), r = e;
|
|
@@ -57489,6 +57489,7 @@ function O$(e) {
|
|
|
57489
57489
|
"## 当前精修目标",
|
|
57490
57490
|
n.map((e) => `· ${e.path}${e.label ? `(${e.label})` : ""}`).join("\n"),
|
|
57491
57491
|
`仅操作上述 ${n.length} 个聚焦子树${n.length > 1 ? "之一" : ""},用户未指明目标的指令默认作用于聚焦组件(「增加/修改/删除 X」类指令优先理解为对聚焦组件本身的改动 —— 如为其加页签/子项,写焦点路径的子路径;仅用户明确要求新建独立组件时才需解除焦点);不要改动其他组件;${o}`,
|
|
57492
|
+
"用户用指示代词提问(「这是啥/这个/它是干什么的」等)时,所指默认是聚焦目标 —— 先 read 聚焦子树,再围绕聚焦组件回答,勿泛答整页",
|
|
57492
57493
|
"read 不带路径时默认只返回聚焦子树;需要全量主数据时显式列顶层键(read({jsonPaths:[...]}) )"
|
|
57493
57494
|
], r = e.getSchema();
|
|
57494
57495
|
if (r) {
|
|
@@ -67659,47 +67660,63 @@ function Mke(e, t, n, r) {
|
|
|
67659
67660
|
hint: "重新 read 该字段触发懒注册重建句柄,再写回新句柄 ⟦res:<handle>⟧"
|
|
67660
67661
|
};
|
|
67661
67662
|
}
|
|
67662
|
-
function Nke(e, t) {
|
|
67663
|
-
let
|
|
67664
|
-
for (let [
|
|
67665
|
-
let
|
|
67666
|
-
if (
|
|
67667
|
-
|
|
67668
|
-
|
|
67663
|
+
function Nke(e, t, n) {
|
|
67664
|
+
let r = t.getBind();
|
|
67665
|
+
for (let [i, a] of t.resourcesByPath) {
|
|
67666
|
+
let o = s$(r, i), s = s$(e, i);
|
|
67667
|
+
if (s === void 0) {
|
|
67668
|
+
if (o === void 0) continue;
|
|
67669
|
+
let t = i.split(".");
|
|
67670
|
+
if (s$(e, t.length > 1 ? t.slice(0, -1).join(".") : "") !== void 0) {
|
|
67671
|
+
c$(e, i, o);
|
|
67672
|
+
continue;
|
|
67673
|
+
}
|
|
67674
|
+
if (!(e && typeof e == "object" && t[0] in e)) {
|
|
67675
|
+
if (n) continue;
|
|
67676
|
+
c$(e, i, o);
|
|
67677
|
+
continue;
|
|
67678
|
+
}
|
|
67679
|
+
return {
|
|
67680
|
+
ok: !1,
|
|
67681
|
+
code: a.mode === "freeze" ? "FROZEN_FIELD" : "VERBATIM_PROTECTED",
|
|
67682
|
+
path: i,
|
|
67683
|
+
message: `整体替换会移除受保护字段 "${i}"(${a.mode}),已拒绝`,
|
|
67684
|
+
hint: a.mode === "freeze" ? "含冻结字段的容器不可整体清空/替换:保留包含该字段的元素(补齐其必填字段,如 type),或逐个 remove 其余元素;彻底移除该字段需集成方调整 data.resources" : "含 verbatim 字段的容器不可整体清空/替换:保留包含该字段的元素,或先 resource_delete({path}) 释放保护后再整体替换"
|
|
67685
|
+
};
|
|
67669
67686
|
}
|
|
67670
|
-
if (
|
|
67671
|
-
if (
|
|
67672
|
-
c$(e,
|
|
67687
|
+
if (a.mode === "freeze") {
|
|
67688
|
+
if (s === V6(i)) {
|
|
67689
|
+
c$(e, i, o);
|
|
67673
67690
|
continue;
|
|
67674
67691
|
}
|
|
67675
|
-
if (!W6(
|
|
67692
|
+
if (!W6(s, o)) return {
|
|
67676
67693
|
ok: !1,
|
|
67677
67694
|
code: "FROZEN_FIELD",
|
|
67678
|
-
path:
|
|
67679
|
-
message: `字段 "${
|
|
67695
|
+
path: i,
|
|
67696
|
+
message: `字段 "${i}" 已冻结(freeze 保护),不可修改`,
|
|
67680
67697
|
hint: "该字段由系统/集成方维护,LLM 不得改动。如需展示其值用 resource_get({path}) 取真值"
|
|
67681
67698
|
};
|
|
67682
67699
|
} else {
|
|
67683
|
-
let n = Oke(
|
|
67700
|
+
let n = Oke(s);
|
|
67684
67701
|
if (n && n.type === "res") {
|
|
67685
|
-
let
|
|
67686
|
-
if ("value" in
|
|
67687
|
-
c$(e,
|
|
67702
|
+
let r = Mke(n.handle, i, o, t.resourceStore);
|
|
67703
|
+
if ("value" in r) {
|
|
67704
|
+
c$(e, i, r.value);
|
|
67688
67705
|
continue;
|
|
67689
67706
|
}
|
|
67690
67707
|
return {
|
|
67691
67708
|
ok: !1,
|
|
67692
|
-
code:
|
|
67693
|
-
path:
|
|
67694
|
-
message:
|
|
67695
|
-
hint:
|
|
67709
|
+
code: r.code,
|
|
67710
|
+
path: i,
|
|
67711
|
+
message: r.message,
|
|
67712
|
+
hint: r.hint
|
|
67696
67713
|
};
|
|
67697
67714
|
}
|
|
67698
|
-
if (!W6(
|
|
67715
|
+
if (!W6(s, o)) return {
|
|
67699
67716
|
ok: !1,
|
|
67700
67717
|
code: "VERBATIM_MISMATCH",
|
|
67701
|
-
path:
|
|
67702
|
-
message: `字段 "${
|
|
67718
|
+
path: i,
|
|
67719
|
+
message: `字段 "${i}" 为 verbatim 保护(精确原样保留),写入值与原值不符`,
|
|
67703
67720
|
hint: "要改该值请先 resource_update({path, value}) 更新资源池,再写回句柄 ⟦res:<handle>⟧;或写回原值(经 resource_get 取到的值)保持不变"
|
|
67704
67721
|
};
|
|
67705
67722
|
}
|
|
@@ -67719,18 +67736,18 @@ function Pke(e, t, n) {
|
|
|
67719
67736
|
} }));
|
|
67720
67737
|
}
|
|
67721
67738
|
function Fke(e) {
|
|
67722
|
-
let { value: t, ctx: n } = e;
|
|
67739
|
+
let { value: t, ctx: n, mergeMode: r } = e;
|
|
67723
67740
|
if (!n || !n.resourcesByPath.size) return {
|
|
67724
67741
|
ok: !0,
|
|
67725
67742
|
value: t
|
|
67726
67743
|
};
|
|
67727
|
-
let
|
|
67728
|
-
return
|
|
67744
|
+
let i = u$(t), a = Nke(i, n, r);
|
|
67745
|
+
return a.ok ? {
|
|
67729
67746
|
ok: !0,
|
|
67730
|
-
value:
|
|
67747
|
+
value: i
|
|
67731
67748
|
} : {
|
|
67732
67749
|
ok: !1,
|
|
67733
|
-
error: Pke(
|
|
67750
|
+
error: Pke(a)
|
|
67734
67751
|
};
|
|
67735
67752
|
}
|
|
67736
67753
|
function Ike(e) {
|
|
@@ -67954,8 +67971,34 @@ function Rke(e) {
|
|
|
67954
67971
|
}
|
|
67955
67972
|
if (i === "append") {
|
|
67956
67973
|
var v;
|
|
67957
|
-
let e = o[p++],
|
|
67958
|
-
if (
|
|
67974
|
+
let e = o[p++], r = (v = e == null ? void 0 : e.elems) == null ? [] : v, i = s$(n, a);
|
|
67975
|
+
if (typeof i == "string" && typeof r[0] == "string") {
|
|
67976
|
+
let e = r[0], n = IQ(t, a);
|
|
67977
|
+
if (n.kind === "missing") return {
|
|
67978
|
+
ok: !1,
|
|
67979
|
+
error: d([a]),
|
|
67980
|
+
writeBacks: [],
|
|
67981
|
+
notices: c
|
|
67982
|
+
};
|
|
67983
|
+
let o = i + e;
|
|
67984
|
+
if (n.kind !== "open") {
|
|
67985
|
+
var y, b;
|
|
67986
|
+
let e = n.schemas.map((e) => e.safeParse(o)).find((e) => !e.success);
|
|
67987
|
+
if (e) return {
|
|
67988
|
+
ok: !1,
|
|
67989
|
+
error: u(a, (y = (b = e.error) == null ? void 0 : b.issues) == null ? [] : y),
|
|
67990
|
+
writeBacks: [],
|
|
67991
|
+
notices: c
|
|
67992
|
+
};
|
|
67993
|
+
}
|
|
67994
|
+
f.push({
|
|
67995
|
+
op: "appendStr",
|
|
67996
|
+
jp: a,
|
|
67997
|
+
str: e
|
|
67998
|
+
});
|
|
67999
|
+
continue;
|
|
68000
|
+
}
|
|
68001
|
+
if (!r.length) {
|
|
67959
68002
|
f.push({
|
|
67960
68003
|
op: "appendElems",
|
|
67961
68004
|
jp: a,
|
|
@@ -67963,61 +68006,61 @@ function Rke(e) {
|
|
|
67963
68006
|
});
|
|
67964
68007
|
continue;
|
|
67965
68008
|
}
|
|
67966
|
-
let
|
|
67967
|
-
if (
|
|
68009
|
+
let s = IQ(t, a);
|
|
68010
|
+
if (s.kind === "missing") return {
|
|
67968
68011
|
ok: !1,
|
|
67969
68012
|
error: d([a || "(根)"]),
|
|
67970
68013
|
writeBacks: [],
|
|
67971
68014
|
notices: c
|
|
67972
68015
|
};
|
|
67973
|
-
if (
|
|
68016
|
+
if (s.kind === "open") {
|
|
67974
68017
|
c.push(`${a || "(根)"}=开放节点放行`), f.push({
|
|
67975
68018
|
op: "appendElems",
|
|
67976
68019
|
jp: a,
|
|
67977
|
-
elems:
|
|
68020
|
+
elems: r
|
|
67978
68021
|
});
|
|
67979
68022
|
continue;
|
|
67980
68023
|
}
|
|
67981
|
-
let
|
|
67982
|
-
if (!
|
|
68024
|
+
let l = BQ(s.schemas);
|
|
68025
|
+
if (!l.length) {
|
|
67983
68026
|
c.push(`${a || "(根)"}:目标非 schema 声明数组,元素未校验放行`), f.push({
|
|
67984
68027
|
op: "appendElems",
|
|
67985
68028
|
jp: a,
|
|
67986
|
-
elems:
|
|
68029
|
+
elems: r
|
|
67987
68030
|
});
|
|
67988
68031
|
continue;
|
|
67989
68032
|
}
|
|
67990
|
-
let
|
|
67991
|
-
for (let e = 0; e <
|
|
67992
|
-
let t = [],
|
|
67993
|
-
for (let a of
|
|
67994
|
-
var
|
|
67995
|
-
let
|
|
67996
|
-
if (
|
|
67997
|
-
|
|
68033
|
+
let m = [];
|
|
68034
|
+
for (let e = 0; e < r.length; e++) {
|
|
68035
|
+
let t = [], n, i = !1;
|
|
68036
|
+
for (let a of l) {
|
|
68037
|
+
var x, S;
|
|
68038
|
+
let o = a.safeParse(r[e]);
|
|
68039
|
+
if (o.success) {
|
|
68040
|
+
i = !0, n = o.data;
|
|
67998
68041
|
break;
|
|
67999
68042
|
}
|
|
68000
|
-
t.push(...(
|
|
68043
|
+
t.push(...(x = (S = o.error) == null ? void 0 : S.issues) == null ? [] : x);
|
|
68001
68044
|
}
|
|
68002
|
-
if (!
|
|
68045
|
+
if (!i) return {
|
|
68003
68046
|
ok: !1,
|
|
68004
68047
|
error: u(`${a || "(根)"}[新增元素${e}]`, t),
|
|
68005
68048
|
writeBacks: [],
|
|
68006
68049
|
notices: c
|
|
68007
68050
|
};
|
|
68008
|
-
let
|
|
68009
|
-
if (
|
|
68051
|
+
let o = C$(void 0, r[e], n, a ? `${a}.${e}` : String(e));
|
|
68052
|
+
if (o.length) return {
|
|
68010
68053
|
ok: !1,
|
|
68011
|
-
error: d(
|
|
68054
|
+
error: d(o),
|
|
68012
68055
|
writeBacks: [],
|
|
68013
68056
|
notices: c
|
|
68014
68057
|
};
|
|
68015
|
-
|
|
68058
|
+
m.push(n);
|
|
68016
68059
|
}
|
|
68017
68060
|
f.push({
|
|
68018
68061
|
op: "appendElems",
|
|
68019
68062
|
jp: a,
|
|
68020
|
-
elems:
|
|
68063
|
+
elems: m
|
|
68021
68064
|
});
|
|
68022
68065
|
continue;
|
|
68023
68066
|
}
|
|
@@ -68048,7 +68091,7 @@ function Rke(e) {
|
|
|
68048
68091
|
if (e.startsWith("__pg") || i$.has(e)) continue;
|
|
68049
68092
|
let r = a ? `${a}.${e}` : e, o = l(r), s = LQ(t, r, o);
|
|
68050
68093
|
if (!s.ok) {
|
|
68051
|
-
var
|
|
68094
|
+
var C;
|
|
68052
68095
|
if (s.resolution === "missing") {
|
|
68053
68096
|
if (s$(n, r) === void 0) return {
|
|
68054
68097
|
ok: !1,
|
|
@@ -68061,7 +68104,7 @@ function Rke(e) {
|
|
|
68061
68104
|
}
|
|
68062
68105
|
return {
|
|
68063
68106
|
ok: !1,
|
|
68064
|
-
error: u(r, (
|
|
68107
|
+
error: u(r, (C = s.issues) == null ? [] : C),
|
|
68065
68108
|
writeBacks: [],
|
|
68066
68109
|
notices: c
|
|
68067
68110
|
};
|
|
@@ -68083,9 +68126,9 @@ function Rke(e) {
|
|
|
68083
68126
|
});
|
|
68084
68127
|
continue;
|
|
68085
68128
|
}
|
|
68086
|
-
let
|
|
68087
|
-
if (
|
|
68088
|
-
let e = s$(r, a.slice(0,
|
|
68129
|
+
let T = l(a), E = a.lastIndexOf(".");
|
|
68130
|
+
if (E > 0 && /^\d+$/.test(a.slice(E + 1))) {
|
|
68131
|
+
let e = s$(r, a.slice(0, E));
|
|
68089
68132
|
if (Array.isArray(e)) {
|
|
68090
68133
|
for (let t = 0; t < e.length; t++) if (!(t in e)) return {
|
|
68091
68134
|
ok: !1,
|
|
@@ -68099,10 +68142,10 @@ function Rke(e) {
|
|
|
68099
68142
|
};
|
|
68100
68143
|
}
|
|
68101
68144
|
}
|
|
68102
|
-
let
|
|
68103
|
-
if (!
|
|
68104
|
-
var
|
|
68105
|
-
if (
|
|
68145
|
+
let D = LQ(t, a, T);
|
|
68146
|
+
if (!D.ok) {
|
|
68147
|
+
var w;
|
|
68148
|
+
if (D.resolution === "missing") {
|
|
68106
68149
|
if (s$(n, a) === void 0) return {
|
|
68107
68150
|
ok: !1,
|
|
68108
68151
|
error: d([a]),
|
|
@@ -68112,29 +68155,29 @@ function Rke(e) {
|
|
|
68112
68155
|
f.push({
|
|
68113
68156
|
op: "set",
|
|
68114
68157
|
jp: a,
|
|
68115
|
-
value:
|
|
68158
|
+
value: T
|
|
68116
68159
|
});
|
|
68117
68160
|
continue;
|
|
68118
68161
|
}
|
|
68119
68162
|
return {
|
|
68120
68163
|
ok: !1,
|
|
68121
|
-
error: u(a, (
|
|
68164
|
+
error: u(a, (w = D.issues) == null ? [] : w),
|
|
68122
68165
|
writeBacks: [],
|
|
68123
68166
|
notices: c
|
|
68124
68167
|
};
|
|
68125
68168
|
}
|
|
68126
|
-
|
|
68127
|
-
let
|
|
68128
|
-
if (
|
|
68169
|
+
D.resolution === "open" && c.push(`${a || "(根)"}=开放节点放行`);
|
|
68170
|
+
let O = C$(s$(n, a), T, D.data, a);
|
|
68171
|
+
if (O.length) return {
|
|
68129
68172
|
ok: !1,
|
|
68130
|
-
error: d(
|
|
68173
|
+
error: d(O),
|
|
68131
68174
|
writeBacks: [],
|
|
68132
68175
|
notices: c
|
|
68133
68176
|
};
|
|
68134
68177
|
f.push({
|
|
68135
68178
|
op: "set",
|
|
68136
68179
|
jp: a,
|
|
68137
|
-
value:
|
|
68180
|
+
value: D.data
|
|
68138
68181
|
});
|
|
68139
68182
|
}
|
|
68140
68183
|
return {
|
|
@@ -68153,7 +68196,8 @@ function Y6(e) {
|
|
|
68153
68196
|
if (d) {
|
|
68154
68197
|
let e = Fke({
|
|
68155
68198
|
value: p,
|
|
68156
|
-
ctx: d
|
|
68199
|
+
ctx: d,
|
|
68200
|
+
mergeMode: !!a
|
|
68157
68201
|
});
|
|
68158
68202
|
if (!e.ok) return {
|
|
68159
68203
|
ok: !1,
|
|
@@ -68276,7 +68320,7 @@ function X6(e) {
|
|
|
68276
68320
|
error: AZ({
|
|
68277
68321
|
code: "PATCH_FAILED",
|
|
68278
68322
|
message: `patches[${e}]: ${c}`,
|
|
68279
|
-
hint: "检查 op 与目标类型:merge 需对象,append
|
|
68323
|
+
hint: "检查 op 与目标类型:merge 需对象,append 需数组或字符串"
|
|
68280
68324
|
})
|
|
68281
68325
|
};
|
|
68282
68326
|
y(o, n), h.push({
|
|
@@ -68339,6 +68383,9 @@ function X6(e) {
|
|
|
68339
68383
|
var w;
|
|
68340
68384
|
let t = e.jp ? s$(n, e.jp) : n;
|
|
68341
68385
|
Array.isArray(t) && (w = e.elems) != null && w.length && t.push(...e.elems);
|
|
68386
|
+
} else if (e.op === "appendStr") {
|
|
68387
|
+
let t = e.jp ? s$(n, e.jp) : n;
|
|
68388
|
+
typeof t == "string" && typeof e.str == "string" && c$(n, e.jp, t + e.str);
|
|
68342
68389
|
}
|
|
68343
68390
|
return (t = e.internalAfterWrite) == null || t.call(e, n, p), c == null || c(), {
|
|
68344
68391
|
ok: !0,
|
|
@@ -69406,15 +69453,23 @@ function t8(e, t = {}) {
|
|
|
69406
69453
|
fe(t);
|
|
69407
69454
|
let n = fF(async () => {
|
|
69408
69455
|
let e = v.list();
|
|
69409
|
-
|
|
69456
|
+
if (!e.length) {
|
|
69457
|
+
let e = [...b.resourcesByPath.entries()].filter(([, e]) => e.mode === "freeze").map(([e]) => e);
|
|
69458
|
+
return e.length ? `资源池为空,但集成方静态配置了 freeze 只读字段:${e.join("、 ")}(freeze 无句柄、不可释放;resource_delete 仅对 verbatim 生效)` : "当前无已注册的受保护资源(read 受保护路径会懒注册)";
|
|
69459
|
+
}
|
|
69460
|
+
return m$({ resources: e });
|
|
69410
69461
|
}, {
|
|
69411
69462
|
name: "resource_list",
|
|
69412
69463
|
description: "列出所有已注册的受保护资源(path/mode/handle/bytes)。",
|
|
69413
69464
|
schema: B({})
|
|
69414
69465
|
}), r = fF(async ({ path: e, handle: t }) => {
|
|
69415
|
-
var n;
|
|
69416
|
-
let
|
|
69417
|
-
return !
|
|
69466
|
+
var n, r;
|
|
69467
|
+
let i = e;
|
|
69468
|
+
return !i && t && (i = (n = v.get(t)) == null ? void 0 : n.path), i ? v.delete(i) ? `已释放资源 "${i}"(后续 read 该字段会重新懒注册)` : ((r = b.resourcesByPath.get(i)) == null ? void 0 : r.mode) === "freeze" ? AZ({
|
|
69469
|
+
code: "FROZEN_FIELD",
|
|
69470
|
+
message: `字段 "${i}" 为 freeze 静态保护(不在资源池、无句柄、不可释放)`,
|
|
69471
|
+
hint: "freeze 由集成方在 data.resources 静态配置,只读不可解;含冻结字段的元素无法整体删除,请保留该元素或由集成方调整 data.resources"
|
|
69472
|
+
}) : `资源 "${i}" 不存在(无需释放)` : AZ({
|
|
69418
69473
|
code: "RESOURCE_NOT_FOUND",
|
|
69419
69474
|
message: "未提供 path 或有效 handle",
|
|
69420
69475
|
hint: "传要释放的受保护字段 path 或 handle"
|
|
@@ -70489,6 +70544,7 @@ ${`- 输出形态:完整、自包含的 HTML 页面(.${r},可独立成页)`}
|
|
|
70489
70544
|
- **机械决定一次定**:写法选择(read 回读 vs 复制、vfs 草稿 vs 直写 data、并行 vs 串行)快速选一个,**不在思考里反复权衡 token 成本**(为之纠结反更费 token)。
|
|
70490
70545
|
- **禁止在思考里整段写出完整代码草稿**:CSS/JS/HTML 代码只写进 write / vfs_write / vfs_edit 工具调用(代码只出现一次);思考里只做高层设计(结构 / 字段 / 方案选择),不要先逐行预写一遍代码再在工具里重复一遍 —— 那会让代码 token 翻倍。
|
|
70491
70546
|
- **终稿纪律(一次写成)**:动手前要点清单一次定稿(≤10 条:结构 + DOM 分层/z-index + 关键尺寸 + 动画时序),清单齐了**直接在工具调用里写终稿**;① 不先写一版再推翻重写第二版(整段重写 = 代码 token 翻倍,写前多花 30 秒把清单想齐);② 同一几何/层级约束(bottom 定位/遮挡/z-index)**只推演一次**,不重复推导第二遍;③ 写完发现小问题(遮挡/重叠/命名),只改那一处,不重写整段。
|
|
70547
|
+
- **大段 code 分块写(超长代码硬约束)**:预计 code 超过 ~8K 字符时,**一次工具调用装不下会被 max_tokens 掐断** —— 必须分块:① 首块用 write 把组件连同 code 第一段写入(如 code 写到 CSS 中段即止);② 后续每段用 write({op:'append', jsonPath:'${n}.N.${t}', value:'下一段文本'}) 逐块尾接(每块 ≤4K 字符);③ 全部拼完再 validate_code。**禁止**在任何一次调用里塞完整超长代码(截断 = 静默失败重来,token 全废)。
|
|
70492
70548
|
- **代码字符串不纠结转义**:代码字段(${t})/ content 参数就是普通字符串,直接写完整代码文本(换行、引号照常写),不要纠结「\n」转义、单双引号、字面换行会不会被拒 —— 框架自动序列化,反复权衡纯属浪费 token。
|
|
70493
70549
|
- 一次想清楚 → 动手 → 验证 → 收口。**思考是手段不是目的,产出代码才是**。
|
|
70494
70550
|
8. **收口格式(必守,最后一行)**:收口回复 = 简短结果总结 + **末行交接笔记** \`[note] <一句话实现要点>\` —— 关键设计决策 / 用户偏好 / 踩坑(如「[note] 液面用 height keyframes 4.2s 循环;装饰仅灯串+光斑 2 类」)。框架只识别末尾 [note] 行存进组件、自动转交下次维护该组件的子 agent;**漏写 = 下任失去交接**(真 LLM 实测漏写率 3/4,务必末行带上)。一行内,只写可复用结论。`;
|