Skip to content

refactor(tool-input): subblock-first rendering, component extraction, bug fixes#3207

Merged
waleedlatif1 merged 17 commits intostagingfrom
sim-609-tool-input-refactor
Feb 13, 2026
Merged

refactor(tool-input): subblock-first rendering, component extraction, bug fixes#3207
waleedlatif1 merged 17 commits intostagingfrom
sim-609-tool-input-refactor

Conversation

@waleedlatif1
Copy link
Collaborator

Summary

  • Replace ~440-line SyncWrapper system with ToolSubBlockRenderer that delegates to <SubBlock> for full rendering parity
  • Restore "(optional)" indicator on tool params via labelSuffix prop on SubBlock
  • Fix folder selector missing for tools with canonicalParamId (e.g. Google Drive list files)
  • Fix canonical toggle (basic/advanced switch) not clickable in tool-input context
  • Extract ParameterWithLabel, ToolSubBlockRenderer, ToolCredentialSelector to components/tools/
  • Extract StoredTool to types.ts, selection helpers to utils.ts
  • Remove dead code and strengthen typing (no any)

Type of Change

  • Refactor
  • Bug fix

Testing

  • tsc --noEmit — zero errors
  • 42 tool-input tests pass
  • 31 params tests pass
  • Tested manually: registry tools, custom tools, MCP tools, canonical toggle, folder selector, optional indicator

Checklist

  • Code follows project style guidelines
  • Self-reviewed my changes
  • Tests added/updated and passing
  • No new warnings introduced
  • I confirm that I have read and agree to the terms outlined in the Contributor License Agreement (CLA)

waleedlatif1 and others added 2 commits February 11, 2026 22:46
…d dependsOn gating

Replace 17+ individual SyncWrapper components with a single centralized
ToolSubBlockRenderer that bridges the subblock store with StoredTool.params
via synthetic store keys. This reduces ~1000 lines of duplicated wrapper
code and ensures tool-input renders subblock components identically to
the standalone SubBlock path.

- Add ToolSubBlockRenderer with bidirectional store sync
- Add basic/advanced mode toggle (ArrowLeftRight) using collaborative functions
- Add dependsOn gating via useDependsOnGate (fields disable instead of hiding)
- Add paramVisibility field to SubBlockConfig for tool-input visibility control
- Pass canonicalModeOverrides through getSubBlocksForToolInput
- Show (optional) label for non-user-only fields (LLM can inject at runtime)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…canonical toggle, extract components

- Attach resolved paramVisibility to subblocks from getSubBlocksForToolInput
- Add labelSuffix prop to SubBlock for "(optional)" badge on user-or-llm params
- Fix folder selector missing for tools with canonicalParamId (e.g. Google Drive)
- Fix canonical toggle not clickable by letting SubBlock handle dependsOn internally
- Extract ParameterWithLabel, ToolSubBlockRenderer, ToolCredentialSelector to components/tools/
- Extract StoredTool interface to types.ts, selection helpers to utils.ts
- Remove dead code (mcpError, refreshTools, oldParamIds, initialParams)
- Strengthen typing: replace any with proper types on icon components and evaluateParameterCondition
@vercel
Copy link

vercel bot commented Feb 12, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
docs Skipped Skipped Feb 13, 2026 2:32am

Request Review

@waleedlatif1 waleedlatif1 changed the title refactor(tool-input): SubBlock-first rendering, component extraction, bug fixes refactor(tool-input): subblock-first rendering, component extraction, bug fixes Feb 12, 2026
@greptile-apps
Copy link
Contributor

greptile-apps bot commented Feb 12, 2026

Greptile Overview

Greptile Summary

This PR successfully refactors the tool-input system by replacing a ~440-line SyncWrapper with a cleaner ToolSubBlockRenderer component that delegates to <SubBlock> for full rendering parity. The refactor reduces tool-input.tsx from ~2400 to ~1100 lines while extracting reusable components (ParameterWithLabel, ToolCredentialSelector) and utilities to separate files.

Key improvements:

  • Extracted StoredTool type and selection utilities to dedicated files for better code organization
  • Added canonical mode handling in providers/utils.ts for basic/advanced parameter switching
  • Fixed canonical toggle clickability by properly passing props through the component hierarchy
  • Fixed folder selector visibility for tools with canonicalParamId (e.g. Google Drive)
  • Added labelSuffix and dependencyContext props to SubBlock component
  • Removed any types and strengthened type safety throughout

Issues found:

  • The PR description claims to restore "(optional)" indicator via labelSuffix, but ToolSubBlockRenderer doesn't pass this prop to SubBlock. Parameters with user-or-llm visibility currently show no indicator (line 90-107 in sub-block-renderer.tsx)

Confidence Score: 4/5

  • This PR is generally safe to merge with one logic issue that needs fixing
  • The refactor is well-structured and tests pass (42 tool-input tests, 31 params tests), but there's a critical logic issue where the "(optional)" indicator is missing from user-or-llm visibility parameters despite being mentioned as fixed in the PR description. The issue is isolated to one component and has a straightforward fix.
  • The sub-block-renderer.tsx file needs the labelSuffix prop added to properly display "(optional)" indicators

Important Files Changed

Filename Overview
apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/tools/sub-block-renderer.tsx New component that bridges SubBlock rendering with tool params; missing labelSuffix prop for "(optional)" indicator on user-or-llm visibility params
apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx Major refactor from ~2400 to ~1100 lines by delegating to ToolSubBlockRenderer; removes SyncWrapper system and improves code organization
apps/sim/tools/params.ts Added wandConfig to UIComponentConfig and new utility functions for filtering SubBlocks in tool-input context
apps/sim/providers/utils.ts Added canonical mode handling and paramsTransform logic for tool execution; complex but necessary changes

Sequence Diagram

sequenceDiagram
    participant TI as ToolInput
    participant TSR as ToolSubBlockRenderer
    participant SB as SubBlock
    participant Store as SubBlockStore
    
    TI->>TSR: Render tool parameter<br/>(with subBlock config)
    Note over TSR: Create synthetic ID:<br/>${subBlockId}-tool-${toolIndex}-${paramId}
    TSR->>Store: useSubBlockValue(syntheticId)
    Store-->>TSR: [storeValue, setStoreValue]
    
    Note over TSR: Sync tool.params → store
    TSR->>TSR: Parse JSON if object type<br/>(file-upload, table, etc.)
    TSR->>Store: setStoreValue(parsed/string)
    
    TSR->>SB: <SubBlock config={...} canonicalToggle={...}/>
    Note over SB: Renders using native<br/>SubBlock components
    SB->>Store: Updates store on user input
    
    Store-->>TSR: storeValue changed
    Note over TSR: Sync store → tool.params
    TSR->>TSR: Stringify if object type
    TSR->>TI: onParamChange(toolIndex, paramId, stringValue)
Loading

Last reviewed commit: a76e6e9

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

11 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

…evant in tool input, and removed unused param
@waleedlatif1
Copy link
Collaborator Author

@cursor review
@greptile

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

12 files reviewed, no comments

Edit Code Review Agent Settings | Greptile

The SubBlock-first rendering path was hard-returning after rendering
subblocks, so tool params without matching subblocks (like inputMapping
for workflow tools) were never rendered. Now renders subblocks first,
then any remaining displayParams not covered by subblocks via the legacy
ParameterWithLabel fallback.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
After redeploying a child workflow via the stale badge, the workflow
state cache was not invalidated, so WorkflowInputMapperInput kept
showing stale input fields until page refresh. Now invalidates
workflowKeys.state on deploy success.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…tional) spacing

- Set workflowId param to user-only in workflow_executor tool config
  so "Select Workflow" no longer shows "(optional)" indicator
- Tighten (optional) label spacing with -ml-[3px] to counteract
  parent Label's gap-[6px], making it feel inline with the label text

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use items-baseline instead of items-center on Label flex containers
so the smaller (optional) text aligns with the label text baseline
rather than sitting slightly below it.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bump the expanded tool body container's top padding from 8px to 12px
for more breathing room between the header bar and the first parameter.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Revert container padding to py-[8px] (MCP tools were correct).
Wrap SubBlock-first output in a div with pt-[4px] so only registry
tools get extra breathing room from the container top.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
SubBlock's internal gap (10px between label and input) matched the
between-parameter gap (10px), making them indistinguishable. Increase
the between-parameter gap to 14px so consecutive parameters are
visually distinct, matching the separation seen in ParameterWithLabel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@waleedlatif1
Copy link
Collaborator Author

@cursor review
@greptile

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

17 files reviewed, no comments

Edit Code Review Agent Settings | Greptile

@waleedlatif1
Copy link
Collaborator Author

@cursor review
@greptile

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

25 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

@waleedlatif1
Copy link
Collaborator Author

@greptile
@cursor review

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

30 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

@waleedlatif1
Copy link
Collaborator Author

https://github.com/cursor review

@waleedlatif1
Copy link
Collaborator Author

@cursor review

Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

@waleedlatif1 waleedlatif1 merged commit 602e371 into staging Feb 13, 2026
12 checks passed
@waleedlatif1 waleedlatif1 deleted the sim-609-tool-input-refactor branch February 13, 2026 03:01
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