${esc(String(law))}
` : ""} + ${chains.length ? skillProseList(chains.map((line) => String(line))) : ""} + ${bounds.length ? `${esc(bounds.map((line) => String(line)).join(";"))}
` : ""} + ${scale ? `${esc(clampPreviewText(scale, 240))}
` : ""} +diff --git a/web/agent-ui.js b/web/agent-ui.js
index c06aedd..2fbabb3 100644
--- a/web/agent-ui.js
+++ b/web/agent-ui.js
@@ -928,6 +928,10 @@ function wireDictateProductMenu() {
tagEl?.getAttribute("title")?.trim() ||
tagEl?.textContent?.trim() ||
"产物";
+ if (action === "edit") {
+ beginDictateProductEdit(card);
+ return;
+ }
if (action === "peek") {
openContentPeek({
title,
@@ -1606,12 +1610,34 @@ export function renderSkillPicker(_view, _onPick) {
}
let activeRailTab = "books";
-/** 用户手动展开侧栏后,在本会话保持展开,直到再点收起 */
-let railUserExpanded = false;
+const RAIL_EXPANDED_KEY = "wa-rail-user-expanded";
+const COORD_COLLAPSED_KEY = "wa-coord-rail-collapsed";
+
+function readBoolStore(key, fallback) {
+ try {
+ const v = localStorage.getItem(key);
+ if (v === "1") return true;
+ if (v === "0") return false;
+ } catch {
+ /* ignore */
+ }
+ return fallback;
+}
+
+function writeBoolStore(key, value) {
+ try {
+ localStorage.setItem(key, value ? "1" : "0");
+ } catch {
+ /* ignore */
+ }
+}
+
+/** 左侧栏:可收起时是否由用户展开(localStorage 记忆) */
+let railUserExpanded = readBoolStore(RAIL_EXPANDED_KEY, false);
/** 创作右侧栏:history=此前对话;products=转述产物 */
let coordRailMode = "history";
-/** 创作验收右侧栏:默认收起(对话);转述看产物时默认展开 */
-let coordRailCollapsed = true;
+/** 右侧栏是否收起(localStorage 记忆;默认收起) */
+let coordRailCollapsed = readBoolStore(COORD_COLLAPSED_KEY, true);
function syncCoordRailChrome() {
const rail = document.getElementById("coord-rail");
@@ -1658,6 +1684,7 @@ function scrollCoordDrawerToLatest() {
function setCoordRailCollapsed(collapsed) {
const opening = coordRailCollapsed && !collapsed;
coordRailCollapsed = Boolean(collapsed);
+ writeBoolStore(COORD_COLLAPSED_KEY, coordRailCollapsed);
syncCoordRailChrome();
if (opening) {
requestAnimationFrame(() => scrollCoordDrawerToLatest());
@@ -1724,6 +1751,7 @@ function wireRailChrome() {
expand.dataset.wired = "1";
expand.addEventListener("click", () => {
railUserExpanded = true;
+ writeBoolStore(RAIL_EXPANDED_KEY, true);
syncRailCollapse();
});
}
@@ -1733,6 +1761,7 @@ function wireRailChrome() {
collapse.addEventListener("click", () => {
if (document.body.dataset.railCanCollapse !== "1") return;
railUserExpanded = false;
+ writeBoolStore(RAIL_EXPANDED_KEY, false);
syncRailCollapse();
});
}
@@ -1768,8 +1797,9 @@ function syncRailCollapse(view) {
export function resetRailChrome() {
activeRailTab = "books";
+ // 根目录必须展开左栏;记忆仍留在 localStorage,进作品后恢复
railUserExpanded = true;
- coordRailCollapsed = true;
+ coordRailCollapsed = readBoolStore(COORD_COLLAPSED_KEY, true);
document.body.dataset.railCanCollapse = "0";
document.body.classList.remove(
"rail-collapsed",
@@ -1779,7 +1809,7 @@ export function resetRailChrome() {
const rail = document.getElementById("coord-rail");
if (rail) {
rail.hidden = true;
- rail.dataset.collapsed = "1";
+ rail.dataset.collapsed = coordRailCollapsed ? "1" : "0";
}
setRailTab("books");
wireRailChrome();
@@ -1852,9 +1882,9 @@ function maybeSyncRail(view) {
}
const started = hasStartedCreation(view);
const wasCollapsible = document.body.dataset.railCanCollapse === "1";
- // 刚进入创作:默认缩进;未开写:展开并停在作品
+ // 刚进入可收起:恢复浏览器记忆,无记忆则默认收起
if (started && !wasCollapsible) {
- railUserExpanded = false;
+ railUserExpanded = readBoolStore(RAIL_EXPANDED_KEY, false);
}
if (!started) {
railUserExpanded = true;
@@ -2889,7 +2919,16 @@ function renderContextFragmentHtml(doc, opts = {}) {
}
}
- const body = frag.正文 != null ? frag.正文 : frag.body;
+ let body = frag.正文 != null ? frag.正文 : frag.body;
+ if (
+ frag.体验锚定 != null &&
+ body &&
+ typeof body === "object" &&
+ !Array.isArray(body) &&
+ body.体验锚定 == null
+ ) {
+ body = { ...body, 体验锚定: frag.体验锚定 };
+ }
if (typeof body === "string" && body.trim()) {
parts.push(
`正文
${renderProseHtml(body)}
(未写)
`; + return `(推进合同未写)
`} +${esc(String(law))}
` : ""} + ${chains.length ? skillProseList(chains.map((line) => String(line))) : ""} + ${bounds.length ? `${esc(bounds.map((line) => String(line)).join(";"))}
` : ""} + ${scale ? `${esc(clampPreviewText(scale, 240))}
` : ""} +尚无产物
-Agent 落盘后会出现在这里。点击行展开,右键可查看全文或复制。
+Agent 落盘后会出现在这里。点击行展开后可直接修改,右键也可查看全文或复制。