Skip to content

Release v1.1.3#103

Merged
shrimbly merged 11 commits intomasterfrom
develop
Mar 22, 2026
Merged

Release v1.1.3#103
shrimbly merged 11 commits intomasterfrom
develop

Conversation

@shrimbly
Copy link
Copy Markdown
Owner

@shrimbly shrimbly commented Mar 22, 2026

What's New in v1.1.3

Bug Fixes

  • Prompt variables now work through Router nodes — PromptConstructor nodes connected through a Router will correctly resolve their {variables}, fixing workflows that use routing to fan out prompts.

  • Node handles no longer get clipped — Connection handles at the edges of nodes are now fully visible and clickable, fixing a layout issue where overflow was hidden on certain node types.

  • Nodes no longer grow taller every time you reopen a workflow — Fixed a bug where nodes with inline parameters (like model settings panels) would accumulate extra height each time the workflow was loaded.

  • Panel height is now corrected at render time — Moved the height correction logic from workflow load into the BaseNode component itself, making it more reliable and eliminating a class of dimension bugs caused by React Flow reconciliation.

  • ArrayNode auto-route icon updated — The auto-route toggle on Array nodes now uses a proper split icon from Lucide instead of a placeholder, making its purpose clearer.


6 commits, 7 files changed

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes

    • Settings panel height now persists correctly across collapse/expand and workflow reloads
    • Prompt variable resolution now includes routed text sources for more accurate autocomplete and previews
    • Modal backdrop styling updated for improved visual contrast
  • UI / Visual

    • Improved node overflow handling and handle stacking so visual elements render above underlying layers
    • Moved and restyled node visual handles and image containers for proper clipping and rounded corners
  • New Features

    • Updated auto-route-to-Prompts button icon styling

shrimbly and others added 6 commits March 13, 2026 10:58
…ipping

The default content div used overflow-hidden which clipped handles positioned
at left: -7px / right: -7px. Nodes that need clipping (ImageInput, Annotation,
VideoTrim) already set their own contentClassName.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
Variables from upstream Prompt nodes weren't discovered when a Router sat
between the Prompt and PromptConstructor. Added resolveTextSourcesThroughRouters()
helper that recursively traverses router nodes to find actual text sources,
used in both the component and executor.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
Store measured settings panel height in node data (_settingsPanelHeight).
On workflow load, subtract it from persisted height so BaseNode's expand
effect re-adds the real panel height from a clean baseline instead of
double-counting.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
The pre-subtraction in loadWorkflow was overridden by React Flow's
dimension reconciliation. Instead, correct at the source: in BaseNode's
expand timeout, read _settingsPanelHeight from node data and only add
the delta (measured - saved) so reloaded nodes don't double-count.
Also clear _settingsPanelHeight on collapse to avoid stale values.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
Use the Lucide split icon (rotated 90deg) for the auto-route button
to better convey the splitting action. Also improve settings reactivity
by reading from Zustand store directly and reparsing atomically on
setting changes.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 22, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 660dca2d-5984-44fc-af75-48ec2f6f7511

📥 Commits

Reviewing files that changed from the base of the PR and between 753790b and cbd7c66.

📒 Files selected for processing (2)
  • CHANGELOG.md
  • package.json

📝 Walkthrough

Walkthrough

Persist settings-panel heights on nodes, add router-aware resolution for upstream text sources, atomically reparse ArrayNode split-setting changes, move/adjust node handle and overflow rendering (including z-index), update a modal backdrop test selector, and bump package version to 1.1.3.

Changes

Cohort / File(s) Summary
Settings Panel + Types
src/components/nodes/BaseNode.tsx, src/types/nodes.ts
Persist measured settings panel height to node.data._settingsPanelHeight; collapse/expand/resize now read/write this field to avoid height double-counting on reload. Added optional _settingsPanelHeight to multiple node data interfaces.
Router-aware Text Source Resolution
src/store/utils/connectedInputs.ts, src/store/execution/simpleNodeExecutors.ts, src/components/nodes/PromptConstructorNode.tsx
Add resolveTextSourcesThroughRouters(...) to expand upstream text sources through router/switch nodes; PromptConstructorNode and executePromptConstructor now use router-resolved text sources instead of only direct edge-derived nodes.
ArrayNode: Atomic Split Settings & UI
src/components/nodes/ArrayNode.tsx
Derive nodeData from store via useMemo; introduce updateSettingsAndReparse to atomically merge split-related settings and immediately reparse/update outputs; wired split-setting handlers to use it; replaced auto-route button SVG.
Overflow / Handle / Visual Adjustments
src/components/nodes/AnnotationNode.tsx, src/components/nodes/GLBViewerNode.tsx, src/components/nodes/ImageInputNode.tsx, src/components/nodes/VideoTrimNode.tsx, src/app/globals.css
Removed overflow-clip/overflow-hidden from several node content wrappers and moved clipping/rounded corners into inner visual wrappers; moved a reference Handle to render after visuals to correct z-order; set .react-flow__handle { z-index: 5 }.
Tests & Version
src/components/__tests__/WelcomeModal.test.tsx, package.json, CHANGELOG.md
Adjusted WelcomeModal backdrop test selector from .bg-black\/50 to .bg-black\/60; bumped package version to 1.1.3; updated changelog entries reflecting layout, routing, and rendering fixes.

Sequence Diagram(s)

mermaid
sequenceDiagram
autonumber
participant UI as "PromptConstructorNode (UI)"
participant Store as "Nodes Store"
participant Router as "Router/Switch Nodes"
participant Executor as "simpleNodeExecutors"
UI->>Store: request connected text nodes
Store->>Store: compute directTextNodes
Store->>Router: resolveTextSourcesThroughRouters(directTextNodes, nodes, edges)
Router-->>Store: return expanded text sources (non-router nodes)
Store->>UI: provide availableVariables (router-resolved)
UI->>Executor: executePromptConstructor with resolved sources
Executor->>Store: fetch resolved connected text content
Executor-->>UI: return variable-map / generated output

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

🐰 I nibble at code with whiskers bright,
I stitch heights and routes through the night,
I follow text through routers' maze,
Clip visuals snug, lift handles raised—
Hop, parse, and render; the workflow's right!

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 27.27% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The PR title 'Release v1.1.3' is vague and generic, describing a version bump without conveying specific details about the substantial changes made (variable resolution through routers, handle visibility fixes, node height corrections, icon updates, etc.). Consider a more descriptive title that highlights a key change, such as 'Fix variable resolution through routers and handle visibility' or 'v1.1.3: Router variable resolution and layout fixes'.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch develop

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

…s to prevent handle clipping

Nodes that passed overflow-clip via contentClassName to BaseNode were
clipping their React Flow handles since handles are children of the
content div. Moved the clip to inner content wrappers that don't
contain handles.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/nodes/BaseNode.tsx`:
- Around line 111-114: The code mutates node.data (_settingsPanelHeight) via
React Flow's setNodes (in the applyNodeDimensions/getNodeDimension branches) but
the app treats workflowStore (useWorkflowStore) as the source of truth; change
these updates to call the store helper updateNodeData(node.id, {
_settingsPanelHeight: 0 }) (or a small helper that applies dimensions and then
calls updateNodeData) instead of writing into node.data directly so subscribers
and persistence remain in sync; locate the occurrences around
applyNodeDimensions/getNodeDimension (and the similar blocks at lines noted) and
replace direct node.data changes with calls to updateNodeData while preserving
the width/height dimension logic.
- Around line 148-155: When restoring node size after measuring panel height,
clamp the computed new height to the node's minimum: compute savedPanelHeight
and heightToAdd as before, then ensure the updated height uses
Math.max(minHeight, currentHeight + heightToAdd) before calling
applyNodeDimensions; update the returned data to still set _settingsPanelHeight
to finalHeight. Modify the branch around savedPanelHeight/heightToAdd
(references: savedPanelHeight, heightToAdd, finalHeight, minHeight,
getNodeDimension, applyNodeDimensions, _settingsPanelHeight) so the node never
shrinks below minHeight on reloads or model changes.

In `@src/store/utils/connectedInputs.ts`:
- Around line 128-155: resolveTextSourcesThroughRouters currently only unwraps
"router" nodes and stops at "switch" nodes, causing upstream prompt/LLM
variables to be missed; update the traversal so "switch" is treated as a
passthrough like in getConnectedInputsPure. In practice, modify the logic inside
resolveTextSourcesThroughRouters (the node.type check) to also recurse when
node.type === "switch" (i.e., treat node.type === "router" || node.type ===
"switch"), gather upstreamNodes the same way (filter edges by target === node.id
and targetHandle === "text", map to allNodes by e.source, filter undefined), and
call resolveTextSourcesThroughRouters recursively with the same visited Set so
switch nodes are unwrapped into their upstream text sources. Ensure visited
handling remains unchanged to avoid cycles.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 242a09cc-267e-4b55-9871-18aada65209f

📥 Commits

Reviewing files that changed from the base of the PR and between de9dd02 and e82a23e.

📒 Files selected for processing (7)
  • src/components/__tests__/WelcomeModal.test.tsx
  • src/components/nodes/ArrayNode.tsx
  • src/components/nodes/BaseNode.tsx
  • src/components/nodes/PromptConstructorNode.tsx
  • src/store/execution/simpleNodeExecutors.ts
  • src/store/utils/connectedInputs.ts
  • src/types/nodes.ts

Comment on lines +111 to +114
return {
...applyNodeDimensions(node, getNodeDimension(node, "width"), newHeight),
data: { ...node.data, _settingsPanelHeight: 0 },
};
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

Persist _settingsPanelHeight through the Zustand store, not setNodes.

These branches now mutate node.data through React Flow while the repo treats workflowStore.ts as the source of truth for node state. Since components in this PR already read node data back from the store, _settingsPanelHeight should go through updateNodeData() (or a small helper that updates dimensions and data together) so persistence and other subscribers stay in sync. As per coding guidelines, "All application state lives in workflowStore.ts using Zustand; access via useWorkflowStore() hook" and "Update node state using updateNodeData(nodeId, partialData) instead of direct mutations".

Also applies to: 153-156, 203-206

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/nodes/BaseNode.tsx` around lines 111 - 114, The code mutates
node.data (_settingsPanelHeight) via React Flow's setNodes (in the
applyNodeDimensions/getNodeDimension branches) but the app treats workflowStore
(useWorkflowStore) as the source of truth; change these updates to call the
store helper updateNodeData(node.id, { _settingsPanelHeight: 0 }) (or a small
helper that applies dimensions and then calls updateNodeData) instead of writing
into node.data directly so subscribers and persistence remain in sync; locate
the occurrences around applyNodeDimensions/getNodeDimension (and the similar
blocks at lines noted) and replace direct node.data changes with calls to
updateNodeData while preserving the width/height dimension logic.

shrimbly and others added 2 commits March 22, 2026 22:04
Nodes with `position: relative` on inner wrappers (e.g. image wrapper
needing it for its remove button) caused left-side handles to render
behind the wrapper due to CSS painting order. Adding z-index: 5 to
all handles ensures they always paint above node content.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
…der clipping

The left handle was rendered before the image wrapper div in DOM order.
Since the image wrapper has position: relative (needed for its remove
button), it painted over the handle. Moving both handles to render
after visual content ensures they paint last (on top).

Co-Authored-By: Claude Opus 4.6 <[email protected]>
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/nodes/ImageInputNode.tsx`:
- Around line 142-149: The target Handle metadata uses generic "reference"
values; update the Handle in ImageInputNode so its id and data-handletype follow
image conventions (change id="reference" to id="image" and
data-handletype="reference" to data-handletype="image") so the component Handle
(Handle, Position.Left) correctly identifies Base64 image payloads for node
connections.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: d70de02e-c9ec-490a-b08a-12d38938a164

📥 Commits

Reviewing files that changed from the base of the PR and between e82a23e and eabc607.

📒 Files selected for processing (5)
  • src/app/globals.css
  • src/components/nodes/AnnotationNode.tsx
  • src/components/nodes/GLBViewerNode.tsx
  • src/components/nodes/ImageInputNode.tsx
  • src/components/nodes/VideoTrimNode.tsx
✅ Files skipped from review due to trivial changes (1)
  • src/components/nodes/GLBViewerNode.tsx

Comment on lines +142 to +149
{/* Handles rendered after visual content so they paint on top */}
<Handle
type="target"
position={Position.Left}
id="reference"
data-handletype="reference"
className="!bg-gray-500"
/>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Normalize target handle metadata to image conventions.

At Line 146-147, id="reference" and data-handletype="reference" deviate from the node handle conventions for image payloads. Please use image-aligned handle metadata.

Proposed fix
       <Handle
         type="target"
         position={Position.Left}
-        id="reference"
-        data-handletype="reference"
+        id="image"
+        data-handletype="image"
         className="!bg-gray-500"
       />

As per coding guidelines: "Use descriptive handle IDs matching the data type: id="image" for image data and id="text" for text data" and "Use image handle type for Base64 data URLs, text for strings, and audio for Base64 data URLs in node connections".

📝 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.

Suggested change
{/* Handles rendered after visual content so they paint on top */}
<Handle
type="target"
position={Position.Left}
id="reference"
data-handletype="reference"
className="!bg-gray-500"
/>
{/* Handles rendered after visual content so they paint on top */}
<Handle
type="target"
position={Position.Left}
id="image"
data-handletype="image"
className="!bg-gray-500"
/>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/nodes/ImageInputNode.tsx` around lines 142 - 149, The target
Handle metadata uses generic "reference" values; update the Handle in
ImageInputNode so its id and data-handletype follow image conventions (change
id="reference" to id="image" and data-handletype="reference" to
data-handletype="image") so the component Handle (Handle, Position.Left)
correctly identifies Base64 image payloads for node connections.

shrimbly and others added 2 commits March 22, 2026 22:27
… nodes

BaseNode: the settings expand branch now clamps the computed height to
minHeight, matching the collapse and ResizeObserver branches.

connectedInputs: resolveTextSourcesThroughRouters now recurses through
switch nodes (same as routers) so upstream text sources are not missed.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
Co-Authored-By: Claude Opus 4.6 <[email protected]>
@shrimbly shrimbly merged commit db352a4 into master Mar 22, 2026
1 check was pending
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant