147 bugfixes#13809
Conversation
🎭 Playwright: ✅ 1716 passed, 0 failed · 1 flaky📊 Browser Reports
🎨 Storybook: ✅ Built — View Storybook📦 Bundle: 7.91 MB gzip 🔴 +109 BDetailsSummary
Category Glance App Entry Points — 47.3 kB (baseline 47.3 kB) • ⚪ 0 BMain entry bundles and manifests
Status: 1 added / 1 removed Graph Workspace — 1.25 MB (baseline 1.25 MB) • ⚪ 0 BGraph editor runtime, canvas, workflow orchestration
Status: 1 added / 1 removed Views & Navigation — 109 kB (baseline 109 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces
Status: 11 added / 11 removed / 3 unchanged Panels & Settings — 550 kB (baseline 550 kB) • ⚪ 0 BConfiguration panels, inspectors, and settings screens
Status: 11 added / 11 removed / 15 unchanged User & Accounts — 29.1 kB (baseline 29.1 kB) • ⚪ 0 BAuthentication, profile, and account management bundles
Status: 7 added / 7 removed / 3 unchanged Editors & Dialogs — 121 kB (baseline 121 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors
Status: 5 added / 5 removed / 1 unchanged UI Components — 56.8 kB (baseline 56.8 kB) • ⚪ 0 BReusable component library chunks
Status: 5 added / 5 removed / 8 unchanged Data & Services — 270 kB (baseline 270 kB) • ⚪ 0 BStores, services, APIs, and repositories
Status: 13 added / 13 removed / 3 unchanged Utilities & Hooks — 3.41 MB (baseline 3.41 MB) • 🔴 +246 BHelpers, composables, and utility bundles
Status: 16 added / 16 removed / 20 unchanged Vendor & Third-Party — 15.7 MB (baseline 15.7 MB) • ⚪ 0 BExternal libraries and shared vendor chunks Status: 16 unchanged Other — 11.9 MB (baseline 11.9 MB) • 🔴 +122 BBundles that do not match a named category
Status: 66 added / 66 removed / 96 unchanged ⚡ Performance Report
Show regressions
All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-07-19T08:49:12.967Z",
"gitSha": "7bb9aba5118424b58aa3d75a944800ec1cd19835",
"branch": "austin/147-fixes",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2030.0299999999822,
"styleRecalcs": 11,
"styleRecalcDurationMs": 8.789,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 409.14399999999995,
"heapDeltaBytes": -21155656,
"heapUsedBytes": 47539044,
"domNodes": -263,
"jsHeapTotalBytes": 19804160,
"scriptDurationMs": 13.685999999999998,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-idle",
"durationMs": 2067.342999999994,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.776999999999997,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 456.15599999999995,
"heapDeltaBytes": -20562916,
"heapUsedBytes": 48246764,
"domNodes": -266,
"jsHeapTotalBytes": 19804160,
"scriptDurationMs": 20.795,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1939.4640000000152,
"styleRecalcs": 79,
"styleRecalcDurationMs": 42.393,
"layouts": 12,
"layoutDurationMs": 3.7289999999999996,
"taskDurationMs": 876.225,
"heapDeltaBytes": -15888272,
"heapUsedBytes": 52989680,
"domNodes": -258,
"jsHeapTotalBytes": 21114880,
"scriptDurationMs": 129.10399999999998,
"eventListeners": -131,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1827.019000000007,
"styleRecalcs": 74,
"styleRecalcDurationMs": 44.308,
"layouts": 12,
"layoutDurationMs": 3.514,
"taskDurationMs": 852.967,
"heapDeltaBytes": -15401524,
"heapUsedBytes": 53705104,
"domNodes": -268,
"jsHeapTotalBytes": 19279872,
"scriptDurationMs": 124.34700000000001,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1747.0930000000067,
"styleRecalcs": 30,
"styleRecalcDurationMs": 18.113999999999997,
"layouts": 6,
"layoutDurationMs": 0.649,
"taskDurationMs": 321.45500000000004,
"heapDeltaBytes": 7193376,
"heapUsedBytes": 76039956,
"domNodes": 77,
"jsHeapTotalBytes": 19415040,
"scriptDurationMs": 22.018000000000004,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1743.842000000086,
"styleRecalcs": 31,
"styleRecalcDurationMs": 17.855000000000004,
"layouts": 6,
"layoutDurationMs": 0.6869999999999999,
"taskDurationMs": 323.245,
"heapDeltaBytes": 7490416,
"heapUsedBytes": 76560708,
"domNodes": 78,
"jsHeapTotalBytes": 19939328,
"scriptDurationMs": 22.107,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "dom-widget-clipping",
"durationMs": 563.0010000000425,
"styleRecalcs": 12,
"styleRecalcDurationMs": 9.265,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 332.91200000000003,
"heapDeltaBytes": -11661768,
"heapUsedBytes": 57237780,
"domNodes": 20,
"jsHeapTotalBytes": 19939328,
"scriptDurationMs": 55.842000000000006,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "dom-widget-clipping",
"durationMs": 619.4160000000011,
"styleRecalcs": 10,
"styleRecalcDurationMs": 7.7879999999999985,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 356.95200000000006,
"heapDeltaBytes": -11583544,
"heapUsedBytes": 57267584,
"domNodes": 16,
"jsHeapTotalBytes": 19677184,
"scriptDurationMs": 59.053000000000004,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2062.320999999997,
"styleRecalcs": 9,
"styleRecalcDurationMs": 9.700999999999997,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 556.7789999999999,
"heapDeltaBytes": 6104920,
"heapUsedBytes": 65457052,
"domNodes": -266,
"jsHeapTotalBytes": 5455872,
"scriptDurationMs": 96.134,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-idle",
"durationMs": 2022.2400000000107,
"styleRecalcs": 7,
"styleRecalcDurationMs": 6.288000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 584.685,
"heapDeltaBytes": 4407156,
"heapUsedBytes": 64012244,
"domNodes": -270,
"jsHeapTotalBytes": 4931584,
"scriptDurationMs": 103.83000000000001,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-pan",
"durationMs": 2139.5860000000084,
"styleRecalcs": 69,
"styleRecalcDurationMs": 14.389,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1132.4460000000001,
"heapDeltaBytes": -4246780,
"heapUsedBytes": 55861052,
"domNodes": -269,
"jsHeapTotalBytes": 4931584,
"scriptDurationMs": 400.883,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2153.1740000000354,
"styleRecalcs": 68,
"styleRecalcDurationMs": 14.266999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1148.6390000000001,
"heapDeltaBytes": -4410528,
"heapUsedBytes": 55928348,
"domNodes": -268,
"jsHeapTotalBytes": 5718016,
"scriptDurationMs": 406.105,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "large-graph-zoom",
"durationMs": 3131.3520000000494,
"styleRecalcs": 66,
"styleRecalcDurationMs": 15.480000000000004,
"layouts": 60,
"layoutDurationMs": 7.372999999999999,
"taskDurationMs": 1297.9650000000001,
"heapDeltaBytes": -7607960,
"heapUsedBytes": 56225236,
"domNodes": -271,
"jsHeapTotalBytes": 8601600,
"scriptDurationMs": 471.39,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-zoom",
"durationMs": 3186.1539999999877,
"styleRecalcs": 65,
"styleRecalcDurationMs": 14.153000000000002,
"layouts": 60,
"layoutDurationMs": 7.497999999999999,
"taskDurationMs": 1349.612,
"heapDeltaBytes": -1902868,
"heapUsedBytes": 59911556,
"domNodes": -271,
"jsHeapTotalBytes": 7815168,
"scriptDurationMs": 488.86600000000004,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "minimap-idle",
"durationMs": 2029.8230000000217,
"styleRecalcs": 9,
"styleRecalcDurationMs": 9.149999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 577.99,
"heapDeltaBytes": 1398348,
"heapUsedBytes": 63390412,
"domNodes": -266,
"jsHeapTotalBytes": 5455872,
"scriptDurationMs": 101.713,
"eventListeners": -159,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "minimap-idle",
"durationMs": 2042.946000000029,
"styleRecalcs": 9,
"styleRecalcDurationMs": 9.135000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 598.1750000000001,
"heapDeltaBytes": 4753684,
"heapUsedBytes": 66067472,
"domNodes": -269,
"jsHeapTotalBytes": 5455872,
"scriptDurationMs": 107.086,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 577.8690000000211,
"styleRecalcs": 47,
"styleRecalcDurationMs": 11.404000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 360.15500000000003,
"heapDeltaBytes": -11617208,
"heapUsedBytes": 57572128,
"domNodes": 20,
"jsHeapTotalBytes": 20987904,
"scriptDurationMs": 121.21100000000001,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 567.0789999999215,
"styleRecalcs": 48,
"styleRecalcDurationMs": 10.936,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 368.72700000000003,
"heapDeltaBytes": -11468280,
"heapUsedBytes": 57520136,
"domNodes": 22,
"jsHeapTotalBytes": 20463616,
"scriptDurationMs": 119.02799999999999,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 1989.1440000000102,
"styleRecalcs": 9,
"styleRecalcDurationMs": 8.059000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 393.04,
"heapDeltaBytes": -20450204,
"heapUsedBytes": 48396480,
"domNodes": -268,
"jsHeapTotalBytes": 19804160,
"scriptDurationMs": 13.053,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 2025.0819999999976,
"styleRecalcs": 9,
"styleRecalcDurationMs": 8.479,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 411.21200000000005,
"heapDeltaBytes": -21665704,
"heapUsedBytes": 47169740,
"domNodes": -267,
"jsHeapTotalBytes": 19542016,
"scriptDurationMs": 14.912999999999998,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1688.8819999999782,
"styleRecalcs": 75,
"styleRecalcDurationMs": 34.52,
"layouts": 16,
"layoutDurationMs": 3.8270000000000004,
"taskDurationMs": 706.742,
"heapDeltaBytes": -20216400,
"heapUsedBytes": 48955156,
"domNodes": -265,
"jsHeapTotalBytes": 20066304,
"scriptDurationMs": 89.14999999999999,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1740.5370000000175,
"styleRecalcs": 75,
"styleRecalcDurationMs": 40.287000000000006,
"layouts": 16,
"layoutDurationMs": 5.346,
"taskDurationMs": 799.9340000000001,
"heapDeltaBytes": -19857180,
"heapUsedBytes": 49025488,
"domNodes": -266,
"jsHeapTotalBytes": 20066304,
"scriptDurationMs": 100.727,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "subgraph-transition-enter",
"durationMs": 1199.7819999999706,
"styleRecalcs": 19,
"styleRecalcDurationMs": 30.034000000000006,
"layouts": 15,
"layoutDurationMs": 13.291,
"taskDurationMs": 826.6710000000002,
"heapDeltaBytes": 29391404,
"heapUsedBytes": 95857384,
"domNodes": 13673,
"jsHeapTotalBytes": 15990784,
"scriptDurationMs": 36.72399999999999,
"eventListeners": 2369,
"totalBlockingTimeMs": 132,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "viewport-pan-sweep",
"durationMs": 8236.569000000032,
"styleRecalcs": 251,
"styleRecalcDurationMs": 39.272,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3788.462,
"heapDeltaBytes": 16306220,
"heapUsedBytes": 77554688,
"domNodes": -264,
"jsHeapTotalBytes": 7233536,
"scriptDurationMs": 1236.823,
"eventListeners": -113,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8285.007999999947,
"styleRecalcs": 250,
"styleRecalcDurationMs": 39.024,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3887.5860000000002,
"heapDeltaBytes": 18702748,
"heapUsedBytes": 78067024,
"domNodes": -268,
"jsHeapTotalBytes": 6709248,
"scriptDurationMs": 1270.714,
"eventListeners": -113,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 12916.86900000002,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 12897.584000000003,
"heapDeltaBytes": -46810496,
"heapUsedBytes": 157997752,
"domNodes": -8311,
"jsHeapTotalBytes": -9637888,
"scriptDurationMs": 583.57,
"eventListeners": -16382,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.220000000000073,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 12555.593000000044,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 12533.570999999998,
"heapDeltaBytes": -51608040,
"heapUsedBytes": 170937608,
"domNodes": -8311,
"jsHeapTotalBytes": -8327168,
"scriptDurationMs": 554.7359999999999,
"eventListeners": -16386,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.223333333333358,
"p95FrameDurationMs": 16.80000000000291
},
{
"name": "vue-large-graph-pan",
"durationMs": 15701.117999999951,
"styleRecalcs": 82,
"styleRecalcDurationMs": 13.216000000000005,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 15665.758,
"heapDeltaBytes": -63289428,
"heapUsedBytes": 154206584,
"domNodes": -8311,
"jsHeapTotalBytes": -15667200,
"scriptDurationMs": 879.4340000000001,
"eventListeners": -16382,
"totalBlockingTimeMs": 6,
"frameDurationMs": 17.223333333333237,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 15738.735000000019,
"styleRecalcs": 83,
"styleRecalcDurationMs": 13.236999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 15710.981,
"heapDeltaBytes": -31955948,
"heapUsedBytes": 169075320,
"domNodes": -8311,
"jsHeapTotalBytes": -14589952,
"scriptDurationMs": 887.7420000000001,
"eventListeners": -16384,
"totalBlockingTimeMs": 79,
"frameDurationMs": 17.223333333333237,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "workflow-execution",
"durationMs": 450.0580000000127,
"styleRecalcs": 15,
"styleRecalcDurationMs": 24.161,
"layouts": 3,
"layoutDurationMs": 1.131,
"taskDurationMs": 120.745,
"heapDeltaBytes": -16235012,
"heapUsedBytes": 51866660,
"domNodes": 130,
"jsHeapTotalBytes": 7880704,
"scriptDurationMs": 10.514000000000001,
"eventListeners": 67,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "workflow-execution",
"durationMs": 449.32299999993575,
"styleRecalcs": 14,
"styleRecalcDurationMs": 20.601000000000003,
"layouts": 3,
"layoutDurationMs": 0.621,
"taskDurationMs": 110.45699999999998,
"heapDeltaBytes": -16478060,
"heapUsedBytes": 51683628,
"domNodes": 119,
"jsHeapTotalBytes": 7094272,
"scriptDurationMs": 8.774999999999999,
"eventListeners": 65,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
}
]
} |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughGroup-node input mappings now use input names instead of numeric indices during synthesis and conversion. External input reconnection resolves slots by name. Subgraph widget cleanup is deferred during rebinding, with shared test fixtures and coverage for value preservation. ChangesGroup input mapping
Subgraph widget lifecycle
Estimated code review effort: 3 (Moderate) | ~20 minutes Suggested reviewers: Caution Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional.
❌ Failed checks (1 error, 1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 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 |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/extensions/core/groupNode.test.ts`:
- Around line 108-132: Extend the GroupNodeConfig.processInputSlots tests to
cover linked inputs, unlinked inputs, and an empty exposed-input list. Verify
each case produces the expected inputMap, preserving the existing name-based
mapping assertion for the happy path.
In `@src/extensions/core/groupNode.ts`:
- Around line 920-931: Update the loop using node.inputs and groupSlotId so
missing input arrays or out-of-range slots are handled safely with optional
chaining before reading link, while preserving the existing continue behavior
for absent links.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: d49dbb99-1d30-4f8c-a5a0-7d49cb8a2a44
📒 Files selected for processing (2)
src/extensions/core/groupNode.test.tssrc/extensions/core/groupNode.ts
| for (const innerInputName in map) { | ||
| const groupSlotId = map[innerInputName] | ||
| if (groupSlotId == null) continue | ||
| const slot = node.inputs[groupSlotId] | ||
| if (slot.link == null) continue | ||
| const link = app.rootGraph.links[slot.link] | ||
| if (!link) continue | ||
| const originNode = app.rootGraph.getNodeById(link.origin_id) | ||
| originNode?.connect(link.origin_slot, newNode, +innerInputId) | ||
| const innerInputId = newNode.findInputSlot(innerInputName) | ||
| if (innerInputId !== -1) { | ||
| originNode?.connect(link.origin_slot, newNode, innerInputId) | ||
| } |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
Use optional chaining to prevent null-pointer dereferences.
node.inputs can be undefined (e.g., if a node is instantiated with no inputs), and slot can be undefined if groupSlotId falls out of bounds due to desynced state or runtime mutations. Accessing slot.link directly without safety guards can crash the application with a TypeError. Use optional chaining to safely navigate missing inputs.
🛡️ Proposed fix to safely access the link property
- const slot = node.inputs[groupSlotId]
- if (slot.link == null) continue
+ const slot = node.inputs?.[groupSlotId]
+ if (slot?.link == null) continue📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| for (const innerInputName in map) { | |
| const groupSlotId = map[innerInputName] | |
| if (groupSlotId == null) continue | |
| const slot = node.inputs[groupSlotId] | |
| if (slot.link == null) continue | |
| const link = app.rootGraph.links[slot.link] | |
| if (!link) continue | |
| const originNode = app.rootGraph.getNodeById(link.origin_id) | |
| originNode?.connect(link.origin_slot, newNode, +innerInputId) | |
| const innerInputId = newNode.findInputSlot(innerInputName) | |
| if (innerInputId !== -1) { | |
| originNode?.connect(link.origin_slot, newNode, innerInputId) | |
| } | |
| for (const innerInputName in map) { | |
| const groupSlotId = map[innerInputName] | |
| if (groupSlotId == null) continue | |
| const slot = node.inputs?.[groupSlotId] | |
| if (slot?.link == null) continue | |
| const link = app.rootGraph.links[slot.link] | |
| if (!link) continue | |
| const originNode = app.rootGraph.getNodeById(link.origin_id) | |
| const innerInputId = newNode.findInputSlot(innerInputName) | |
| if (innerInputId !== -1) { | |
| originNode?.connect(link.origin_slot, newNode, innerInputId) | |
| } |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/extensions/core/groupNode.ts` around lines 920 - 931, Update the loop
using node.inputs and groupSlotId so missing input arrays or out-of-range slots
are handled safely with optional chaining before reading link, while preserving
the existing continue behavior for absent links.
Codecov Report❌ Patch coverage is
@@ Coverage Diff @@
## main #13809 +/- ##
==========================================
- Coverage 78.58% 78.47% -0.12%
==========================================
Files 1684 1684
Lines 113317 113758 +441
Branches 39395 39551 +156
==========================================
+ Hits 89055 89276 +221
- Misses 23630 23840 +210
- Partials 632 642 +10
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 15 files with indirect coverage changes 🚀 New features to boost your workflow:
|
Not terribly happy with the state here and want even more time to mull it over. I want to minimize the conceptual understanding required to interact with a system. This regression shows understanding and responsibility leaking out of the system, which isn't great
Staging branch for fixes to bugs found in 1.47