fix: node replacement fails after execution and modal sync#9269
fix: node replacement fails after execution and modal sync#9269christian-byrne merged 2 commits intomainfrom
Conversation
- Detect missing nodes by unregistered type instead of has_errors flag, which gets cleared by clearAllNodeErrorFlags during execution - Sync modal replace action with executionErrorStore so Errors Tab updates immediately when nodes are replaced from the dialog
🎨 Storybook: ✅ Built — View Storybook |
🎭 Playwright: ✅ 549 passed, 0 failed · 4 flaky📊 Browser Reports
|
📝 WalkthroughWalkthroughIntegrates execution error store synchronization into the missing-node replacement flow and tightens placeholder selection to only consider nodes whose serialized or inherent type matches selected target types. Changes
Sequence Diagram(s)mermaid Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
📦 Bundle: 4.46 MB gzip 🔴 +77 BDetailsSummary
Category Glance App Entry Points — 17.9 kB (baseline 17.9 kB) • ⚪ 0 BMain entry bundles and manifests
Status: 1 added / 1 removed Graph Workspace — 1.02 MB (baseline 1.02 MB) • ⚪ 0 BGraph editor runtime, canvas, workflow orchestration
Status: 1 added / 1 removed Views & Navigation — 72.1 kB (baseline 72.1 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces
Status: 9 added / 9 removed Panels & Settings — 435 kB (baseline 435 kB) • ⚪ 0 BConfiguration panels, inspectors, and settings screens
Status: 10 added / 10 removed User & Accounts — 16 kB (baseline 16 kB) • ⚪ 0 BAuthentication, profile, and account management bundles
Status: 5 added / 5 removed Editors & Dialogs — 736 B (baseline 736 B) • ⚪ 0 BModals, dialogs, drawers, and in-app editors
Status: 1 added / 1 removed UI Components — 47 kB (baseline 47 kB) • ⚪ 0 BReusable component library chunks
Status: 5 added / 5 removed Data & Services — 2.55 MB (baseline 2.55 MB) • 🔴 +362 BStores, services, APIs, and repositories
Status: 13 added / 13 removed Utilities & Hooks — 55.5 kB (baseline 55.5 kB) • ⚪ 0 BHelpers, composables, and utility bundles
Status: 11 added / 11 removed Vendor & Third-Party — 8.84 MB (baseline 8.84 MB) • ⚪ 0 BExternal libraries and shared vendor chunks
Other — 7.86 MB (baseline 7.86 MB) • ⚪ 0 BBundles that do not match a named category
Status: 52 added / 52 removed |
⚡ Performance Report
Raw data{
"timestamp": "2026-02-27T04:18:45.752Z",
"gitSha": "6bbf55f504152226ec856a3d2f346695ca7eb3b6",
"branch": "fix/node-replacement-detection",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2019.315000000006,
"styleRecalcs": 124,
"styleRecalcDurationMs": 24.5,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 412.57000000000005,
"heapDeltaBytes": -3687004
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1961.7800000000045,
"styleRecalcs": 182,
"styleRecalcDurationMs": 61.297000000000004,
"layouts": 12,
"layoutDurationMs": 4.2620000000000005,
"taskDurationMs": 934.118,
"heapDeltaBytes": -2400208
},
{
"name": "dom-widget-clipping",
"durationMs": 585.0080000000162,
"styleRecalcs": 40,
"styleRecalcDurationMs": 12.628,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 366.143,
"heapDeltaBytes": 6617468
}
]
} |
…ime state - Replace has_errors/registered_node_types filter with targetTypes Set built from the user's explicit selection - Eliminates dependency on transient flags and pack installation state - Improve comment in MissingNodesContent.vue explaining error store sync
|
note (non-blocking): the |
## Summary Fixes two bugs in the node replacement flow: placeholder detection failing after workflow execution or pack reinstallation, and missing UI sync in the Errors Tab when replacements are applied from the modal dialog. ## Changes - **Placeholder detection**: Node placeholder detection now matches against `targetTypes` (derived from the replaceable node list built at workflow load time) instead of relying on `has_errors` flag or `registered_node_types` lookup. This ensures replacement works reliably after execution (where `has_errors` gets cleared) and after pack reinstallation (where the type becomes registered). - **Modal → Errors Tab sync**: Added `executionErrorStore.removeMissingNodesByType()` call in `MissingNodesContent.vue` after replacement, so the Errors Tab reflects changes immediately without requiring a page reload. ## Review Focus - `collectAllNodes` predicate change in `useNodeReplacement.ts`: now uses `targetTypes.has(originalType)` to find nodes by their original serialized type. This is independent of runtime state like `has_errors` or `registered_node_types`. - `executionErrorStore.removeMissingNodesByType` call timing in `MissingNodesContent.vue` — runs synchronously after `replaceNodesInPlace` resolves, before auto-close logic. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-9269-fix-node-replacement-fails-after-execution-and-modal-sync-3146d73d365081218398c961639b450f) by [Unito](https://www.unito.io)
## Summary Fixes two bugs in the node replacement flow: placeholder detection failing after workflow execution or pack reinstallation, and missing UI sync in the Errors Tab when replacements are applied from the modal dialog. ## Changes - **Placeholder detection**: Node placeholder detection now matches against `targetTypes` (derived from the replaceable node list built at workflow load time) instead of relying on `has_errors` flag or `registered_node_types` lookup. This ensures replacement works reliably after execution (where `has_errors` gets cleared) and after pack reinstallation (where the type becomes registered). - **Modal → Errors Tab sync**: Added `executionErrorStore.removeMissingNodesByType()` call in `MissingNodesContent.vue` after replacement, so the Errors Tab reflects changes immediately without requiring a page reload. ## Review Focus - `collectAllNodes` predicate change in `useNodeReplacement.ts`: now uses `targetTypes.has(originalType)` to find nodes by their original serialized type. This is independent of runtime state like `has_errors` or `registered_node_types`. - `executionErrorStore.removeMissingNodesByType` call timing in `MissingNodesContent.vue` — runs synchronously after `replaceNodesInPlace` resolves, before auto-close logic. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-9269-fix-node-replacement-fails-after-execution-and-modal-sync-3146d73d365081218398c961639b450f) by [Unito](https://www.unito.io)
…modal sync (#9568) Backport of #9269 to `core/1.40` Automatically created by backport workflow. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-9568-backport-core-1-40-fix-node-replacement-fails-after-execution-and-modal-sync-31d6d73d365081dc8affc0e1591df4cb) by [Unito](https://www.unito.io) Co-authored-by: jaeone94 <89377375+jaeone94@users.noreply.github.com>
Summary
Fixes two bugs in the node replacement flow: placeholder detection failing after workflow execution or pack reinstallation, and missing UI sync in the Errors Tab when replacements are applied from the modal dialog.
Changes
targetTypes(derived from the replaceable node list built at workflow load time) instead of relying onhas_errorsflag orregistered_node_typeslookup. This ensures replacement works reliably after execution (wherehas_errorsgets cleared) and after pack reinstallation (where the type becomes registered).executionErrorStore.removeMissingNodesByType()call inMissingNodesContent.vueafter replacement, so the Errors Tab reflects changes immediately without requiring a page reload.Review Focus
collectAllNodespredicate change inuseNodeReplacement.ts: now usestargetTypes.has(originalType)to find nodes by their original serialized type. This is independent of runtime state likehas_errorsorregistered_node_types.executionErrorStore.removeMissingNodesByTypecall timing inMissingNodesContent.vue— runs synchronously afterreplaceNodesInPlaceresolves, before auto-close logic.┆Issue is synchronized with this Notion page by Unito