diff --git a/design/05-editor-mainline/process/5-29-editor-runtime-followup-checklist-v1.md b/design/05-editor-mainline/process/5-29-editor-runtime-followup-checklist-v1.md index 749c581f..737d2f15 100644 --- a/design/05-editor-mainline/process/5-29-editor-runtime-followup-checklist-v1.md +++ b/design/05-editor-mainline/process/5-29-editor-runtime-followup-checklist-v1.md @@ -146,3 +146,9 @@ UI / 浏览器可见项必须有真实浏览器截图或结构化 smoke 证据 - Worker A handoff 出现任务串线迹象,final 同时讨论 3-20 和 5-29;Codex 只采纳其中由本地代码复核确认的 5-29 结论:`on_selection_change` 和 `try_sync_editor_overlay_state` 不能直接统一,因为 toolbar lock 语义不同。 - Codex 主控采纳最小机械切片:把 `try_close_block_menu_overlays` 迁入 `editor_runtime/overlays.rs`;`try_sync_editor_overlay_state`、`close_editor_floating_overlays_if_escape` 和 `on_selection_change` 仍留在 `lib.rs`。 - 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check`、`cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen`、`NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js`、`NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`。 +- 2026-05-25:Batch M 按用户纠正尝试并行派发 3 个 Reasonix 实现 worker,均使用独立 worktree;run `reasonix-2026-05-24T19-40-19-806Z-81099224` 仅有 `prompt.md`、`memory-recall.json`、`reasonix-transcript.jsonl`,无 `final.md`、`result.json`、`process-handoff.md/json`,不采纳。 + - 失败原因:Reasonix ACP 并发串线,transcript 出现读取非本 worker worktree 的行为;不满足 handoff 合同。 + - 主控处置:不从 Batch M 合入任何 diff;改用 Batch N 的独立 worktree 子 agent worker 继续推进,仍由 Codex 复核 diff 和验证。 +- 2026-05-25:Batch N 继续收口 overlay escape 小切片:Codex 主控把 `close_editor_floating_overlays_if_escape` 机械迁入 `editor_runtime/overlays.rs`,`lib.rs` 仅保留调用和仍需壳层状态的 open / sync overlay 编排。 + - 未迁:`try_sync_editor_overlay_state`、`on_selection_change`、`open_slash_menu_overlay` / `open_image_toolbar_overlay` / `open_block_menu_overlay`,原因是仍依赖 DOM event、toolbar lock、selection bridge 或 Leptos shell signal 编排。 + - 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check`、`cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen`、`NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js`、`NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`。 diff --git a/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.js b/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.js index c066623b..7d7dcd16 100644 --- a/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.js +++ b/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.js @@ -1284,7 +1284,7 @@ function __wbg_get_imports() { return ret; }, __wbindgen_cast_0000000000000006: function(arg0, arg1) { - // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("KeyboardEvent")], shim_idx: 527, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("KeyboardEvent")], shim_idx: 524, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__hd90af689bc3e71bf); return ret; }, diff --git a/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island_bg.wasm b/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island_bg.wasm index b2eef6e5..0e3cde12 100644 Binary files a/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island_bg.wasm and b/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island_bg.wasm differ diff --git a/rust/spikes/leptos-tiptap-spike/src/editor_runtime/overlays.rs b/rust/spikes/leptos-tiptap-spike/src/editor_runtime/overlays.rs index 97943dad..2f597d30 100644 --- a/rust/spikes/leptos-tiptap-spike/src/editor_runtime/overlays.rs +++ b/rust/spikes/leptos-tiptap-spike/src/editor_runtime/overlays.rs @@ -1,4 +1,4 @@ -use leptos::prelude::{Set, WriteSignal}; +use leptos::prelude::{GetUntracked, ReadSignal, Set, WriteSignal}; use crate::{ editor_runtime::block_hover_state::HoveredBlockState, @@ -118,6 +118,70 @@ pub(crate) fn close_editor_floating_overlays( set_block_folded_title_open.set(false); } +#[allow(clippy::too_many_arguments)] +pub(crate) fn close_editor_floating_overlays_if_escape( + slash_open: ReadSignal, + turn_into_open: ReadSignal, + color_menu_open: ReadSignal, + more_menu_open: ReadSignal, + image_toolbar_anchor: ReadSignal>, + table_toolbar_open: ReadSignal, + table_options_open: ReadSignal, + block_menu_open: ReadSignal, + set_slash_open: WriteSignal, + set_slash_index: WriteSignal, + set_slash_query: WriteSignal, + set_turn_into_open: WriteSignal, + set_color_menu_open: WriteSignal, + set_more_menu_open: WriteSignal, + set_locked_toolbar_anchor: WriteSignal>, + set_text_selection_active: WriteSignal, + set_floating_toolbar_anchor: WriteSignal>, + set_image_toolbar_anchor: WriteSignal>, + set_table_toolbar_open: WriteSignal, + set_table_options_open: WriteSignal, + set_table_overlay_anchor: WriteSignal>, + set_table_selection_overlay: WriteSignal>, + set_block_menu_open: WriteSignal, + set_block_menu_anchor: WriteSignal>, + set_block_turn_into_open: WriteSignal, + set_block_folded_title_open: WriteSignal, +) -> bool { + let overlay_open = slash_open.try_get_untracked().unwrap_or(false) + || turn_into_open.try_get_untracked().unwrap_or(false) + || color_menu_open.try_get_untracked().unwrap_or(false) + || more_menu_open.try_get_untracked().unwrap_or(false) + || image_toolbar_anchor.try_get_untracked().flatten().is_some() + || table_toolbar_open.try_get_untracked().unwrap_or(false) + || table_options_open.try_get_untracked().unwrap_or(false) + || block_menu_open.try_get_untracked().unwrap_or(false); + + if overlay_open { + close_editor_floating_overlays( + set_slash_open, + set_slash_index, + set_slash_query, + set_turn_into_open, + set_color_menu_open, + set_more_menu_open, + set_locked_toolbar_anchor, + set_text_selection_active, + set_floating_toolbar_anchor, + set_image_toolbar_anchor, + set_table_toolbar_open, + set_table_options_open, + set_table_overlay_anchor, + set_table_selection_overlay, + set_block_menu_open, + set_block_menu_anchor, + set_block_turn_into_open, + set_block_folded_title_open, + ); + } + + overlay_open +} + pub(crate) fn try_close_block_menu_overlays( set_slash_open: WriteSignal, set_turn_into_open: WriteSignal, diff --git a/rust/spikes/leptos-tiptap-spike/src/lib.rs b/rust/spikes/leptos-tiptap-spike/src/lib.rs index edf74cee..c3be01c3 100644 --- a/rust/spikes/leptos-tiptap-spike/src/lib.rs +++ b/rust/spikes/leptos-tiptap-spike/src/lib.rs @@ -40,9 +40,10 @@ use editor_runtime::dom_selection::{ }; use editor_runtime::editor_focus::{active_editor_stage, body_has_focus, schedule_editor_focus}; use editor_runtime::overlays::{ - close_editor_floating_overlays, floating_toolbar_anchor_from_selection, - sync_text_selection_overlay, FloatingToolbarAnchor, ImageToolbarAnchor, TableOverlayAnchor, - TableSelectionKind, TableSelectionOverlayState, try_close_block_menu_overlays, + close_editor_floating_overlays, close_editor_floating_overlays_if_escape, + floating_toolbar_anchor_from_selection, sync_text_selection_overlay, try_close_block_menu_overlays, + FloatingToolbarAnchor, ImageToolbarAnchor, TableOverlayAnchor, TableSelectionKind, + TableSelectionOverlayState, }; use editor_runtime::persistence::{ load_persisted_document, normalize_identity_value, persist_document_state, @@ -5656,70 +5657,6 @@ fn toolbar_overlay_locked( turn_into_open || color_menu_open || more_menu_open } -#[allow(clippy::too_many_arguments)] -fn close_editor_floating_overlays_if_escape( - slash_open: ReadSignal, - turn_into_open: ReadSignal, - color_menu_open: ReadSignal, - more_menu_open: ReadSignal, - image_toolbar_anchor: ReadSignal>, - table_toolbar_open: ReadSignal, - table_options_open: ReadSignal, - block_menu_open: ReadSignal, - set_slash_open: WriteSignal, - set_slash_index: WriteSignal, - set_slash_query: WriteSignal, - set_turn_into_open: WriteSignal, - set_color_menu_open: WriteSignal, - set_more_menu_open: WriteSignal, - set_locked_toolbar_anchor: WriteSignal>, - set_text_selection_active: WriteSignal, - set_floating_toolbar_anchor: WriteSignal>, - set_image_toolbar_anchor: WriteSignal>, - set_table_toolbar_open: WriteSignal, - set_table_options_open: WriteSignal, - set_table_overlay_anchor: WriteSignal>, - set_table_selection_overlay: WriteSignal>, - set_block_menu_open: WriteSignal, - set_block_menu_anchor: WriteSignal>, - set_block_turn_into_open: WriteSignal, - set_block_folded_title_open: WriteSignal, -) -> bool { - let overlay_open = slash_open.try_get_untracked().unwrap_or(false) - || turn_into_open.try_get_untracked().unwrap_or(false) - || color_menu_open.try_get_untracked().unwrap_or(false) - || more_menu_open.try_get_untracked().unwrap_or(false) - || image_toolbar_anchor.try_get_untracked().flatten().is_some() - || table_toolbar_open.try_get_untracked().unwrap_or(false) - || table_options_open.try_get_untracked().unwrap_or(false) - || block_menu_open.try_get_untracked().unwrap_or(false); - - if overlay_open { - close_editor_floating_overlays( - set_slash_open, - set_slash_index, - set_slash_query, - set_turn_into_open, - set_color_menu_open, - set_more_menu_open, - set_locked_toolbar_anchor, - set_text_selection_active, - set_floating_toolbar_anchor, - set_image_toolbar_anchor, - set_table_toolbar_open, - set_table_options_open, - set_table_overlay_anchor, - set_table_selection_overlay, - set_block_menu_open, - set_block_menu_anchor, - set_block_turn_into_open, - set_block_folded_title_open, - ); - } - - overlay_open -} - fn open_slash_menu_overlay( set_slash_open: WriteSignal, set_slash_index: WriteSignal,