From aa293fec3fc68fc6217e783da7c7b6a6a5d611cd Mon Sep 17 00:00:00 2001 From: lix-2026 Date: Mon, 25 May 2026 04:28:43 +0800 Subject: [PATCH] refactor: extract toolbar overlay lock helper --- ...0-browser-runtime-followup-checklist-v1.md | 2 ++ ...29-editor-runtime-followup-checklist-v1.md | 4 ++++ .../mnote-leptos-tiptap-spike-island_bg.wasm | Bin 2123181 -> 2123181 bytes .../src/editor_runtime/overlays.rs | 8 ++++++++ rust/spikes/leptos-tiptap-spike/src/lib.rs | 13 +++---------- 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/design/03-rust-web/process/3-20-browser-runtime-followup-checklist-v1.md b/design/03-rust-web/process/3-20-browser-runtime-followup-checklist-v1.md index 86d9699f..e7dac0ec 100644 --- a/design/03-rust-web/process/3-20-browser-runtime-followup-checklist-v1.md +++ b/design/03-rust-web/process/3-20-browser-runtime-followup-checklist-v1.md @@ -163,3 +163,5 @@ UI / 浏览器可见项必须有真实浏览器截图或结构化 smoke 证据 - 修改:`task487-local-folder-tree-live-consumer-smoke.js` 保持 RED smoke 退出 0 语义,增加 staged DOM 状态、PageTree/FileTree 外部创建/删除后的目标节点证据、navigation evidence 和更多截图路径。 - Worker 验证:`node --check scripts/task487-local-folder-tree-live-consumer-smoke.js`、限定 `git diff --check` 通过;因当时 3000 未启动,未运行真实浏览器 smoke。 - Codex 主控验证:`node --check scripts/task487-local-folder-tree-live-consumer-smoke.js`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3001 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task487-local-folder-tree-live-consumer-smoke.js`。结果仍为 RED,`transport=local-folder-events`、PageTree/FileTree 外部变更阶段 `navigationEvents=0`,但 `treeLiveApplied` 仍为空,说明 live consumer 证据仍未收敛到 snapshot/resync。 +- 2026-05-25:Batch P Reasonix 派发失败并拒收:三个输出目录 `reasonix-2026-05-24T20-21-00-338Z-53f263c7` / `reasonix-2026-05-24T20-21-00-457Z-9384a1e5` / `reasonix-2026-05-24T20-21-00-569Z-8a3585e8` 均只有 `prompt.md` / `memory-recall.json` / `reasonix-transcript.jsonl`,没有 `result.json`、`process-handoff.md/json` 或 `final.md`;记录中的三个 worktree 目录当前不存在,Codex 未采纳任何 diff。后续 B/C/D 等实现 worker 必须在独立 worktree 产出候选 patch,再由 Codex 读取 Hindsight recall、handoff、diff 和验证证据后选择性合入。 +- 2026-05-25:Batch Q 未经主控批准再次自动启动 3 个 Reasonix runner(`0525-q-worker-a/b/c-*`),超过当前 goal 的 2 worker 上限;Codex 已终止进程,删除本轮自动生成的 3 份 batch-q 草稿并移除空 worktree,不采纳任何结果。后续在修复 runner 自动派发前,不再让 Reasonix 直接负责多 worker 规划。 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 4af42f5a..49be4bdb 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 @@ -160,3 +160,7 @@ UI / 浏览器可见项必须有真实浏览器截图或结构化 smoke 证据 - 未迁:`drop_indicator_from_target`、拖拽 listener、Leptos signal、`editor_stage_element` / `editor_root_element` 查询和 block reorder 行为仍留在 shell。 - Worker 验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check`、`git diff --check`、`rustfmt --edition 2021 --check rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_dnd.rs` 通过;`cargo check -p leptos-tiptap-spike` 因包名不匹配失败,主控改用正确 manifest 复核。 - Codex 主控验证:`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`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3001 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3001 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`。 +- 2026-05-25:Codex 主控完成 overlay 状态纯 helper 小切片:`toolbar_overlay_locked(turn_into_open, color_menu_open, more_menu_open)` 迁入 `editor_runtime/overlays.rs`;`lib.rs` 仍保留 runtime state/status payload、overlay sync、block menu signal 和 DOM 编排调用点。 + - 修改:`rust/spikes/leptos-tiptap-spike/src/editor_runtime/overlays.rs`、`rust/spikes/leptos-tiptap-spike/src/lib.rs`、generated island wasm。 + - 已验证:`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`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3001 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3001 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3001 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`。 + - 未迁:`try_sync_editor_overlay_state`、`on_selection_change` overlay 同步、`drop_indicator_from_target`、拖拽 listener 和 block reorder 行为。 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 5622963f7268c32dc0c8815c757d7a499e581bfe..8a2e044188555515b9063f77436817d1a559ec02 100644 GIT binary patch delta 8382 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 delta 8379 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 bool { + turn_into_open || color_menu_open || more_menu_open +} + #[allow(clippy::too_many_arguments)] pub(crate) fn close_editor_floating_overlays( set_slash_open: WriteSignal, diff --git a/rust/spikes/leptos-tiptap-spike/src/lib.rs b/rust/spikes/leptos-tiptap-spike/src/lib.rs index cbb108b0..6fc2ac05 100644 --- a/rust/spikes/leptos-tiptap-spike/src/lib.rs +++ b/rust/spikes/leptos-tiptap-spike/src/lib.rs @@ -42,8 +42,9 @@ use editor_runtime::editor_focus::{active_editor_stage, body_has_focus, schedule use editor_runtime::overlays::{ close_editor_floating_overlays_if_escape, floating_toolbar_anchor_from_selection, open_block_menu_overlay, open_image_toolbar_overlay, open_slash_menu_overlay, - sync_text_selection_overlay, try_close_block_menu_overlays, FloatingToolbarAnchor, - ImageToolbarAnchor, TableOverlayAnchor, TableSelectionKind, TableSelectionOverlayState, + sync_text_selection_overlay, toolbar_overlay_locked, try_close_block_menu_overlays, + FloatingToolbarAnchor, ImageToolbarAnchor, TableOverlayAnchor, TableSelectionKind, + TableSelectionOverlayState, }; use editor_runtime::persistence::{ load_persisted_document, normalize_identity_value, persist_document_state, @@ -5646,14 +5647,6 @@ fn replace_top_level_block_kind( Ok(()) } -fn toolbar_overlay_locked( - turn_into_open: bool, - color_menu_open: bool, - more_menu_open: bool, -) -> bool { - turn_into_open || color_menu_open || more_menu_open -} - fn try_sync_editor_overlay_state( set_editor_focused: WriteSignal, set_text_selection_active: WriteSignal,