Skip to content

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 12, 2026 8:28pm

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

Eliminated ~440 lines of SyncWrapper boilerplate by introducing ToolSubBlockRenderer that delegates tool parameter rendering to SubBlock components, achieving full rendering parity with standard block inputs.

Key Improvements

  • Component extraction: Created reusable ParameterWithLabel, ToolSubBlockRenderer, and moved ToolCredentialSelector to components/tools/ directory
  • Type safety: Extracted StoredTool interface to types.ts with stronger typing (removed most any usage)
  • Bug fixes:
    • Fixed folder selector missing for tools with canonicalParamId (e.g., Google Drive list files)
    • Fixed canonical toggle (basic/advanced switch) not clickable in tool-input context
    • Fixed change detection by filtering synthetic tool subblock IDs from workflow comparison
  • Architecture: New getSubBlocksForToolInput() function in params.ts provides centralized filtering and resolution of SubBlockConfigs with canonical mode and visibility support
  • Dependencies: Added dependencyContext prop to SubBlock for non-preview dependency resolution, enabling dependsOn to work in tool-input context
  • Deployment: Moved predeploy checks earlier in deployment flow for first-time deployments

Testing

All 42 tool-input tests and 31 params tests pass with zero TypeScript errors.

Confidence Score: 4/5

  • This PR is safe to merge with low risk - it's a well-tested refactor with comprehensive test coverage
  • The refactor is substantial but well-executed with strong test coverage (42 tool-input tests + 31 params tests passing). The architecture simplifies the codebase significantly (-325 net lines) while fixing multiple bugs. The bidirectional sync pattern in ToolSubBlockRenderer uses refs to prevent echo loops, and the synthetic ID filtering prevents false change detection. Minor confidence reduction due to the scale of changes affecting core tool rendering logic.
  • No files require special attention - all changes are well-structured and tested

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 tool parameters with SubBlock rendering using synthetic store keys and bidirectional sync effects
apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/tools/parameter.tsx Extracted generic parameter wrapper that handles wand state, labels, and canonical toggle rendering
apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx Major refactor eliminating ~440 lines of SyncWrapper code, now using ToolSubBlockRenderer for full SubBlock delegation with improved canonical toggle and folder selector support
apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/sub-block.tsx Added labelSuffix prop and dependencyContext for non-preview dependency resolution, enabling tool-input context support
apps/sim/tools/params.ts Added getSubBlocksForToolInput function that filters and resolves SubBlockConfigs for tool-input rendering with canonical mode and visibility support
apps/sim/lib/workflows/comparison/normalize.ts Fixed change detection by filtering out synthetic tool subblock IDs (format: subBlockId-tool-N-paramId) from comparison

Sequence Diagram

sequenceDiagram
    participant TI as ToolInput
    participant TSR as ToolSubBlockRenderer
    participant SB as SubBlock
    participant Store as SubBlockStore
    participant Tool as StoredTool.params

    Note over TI,Tool: New Architecture (After Refactor)
    
    TI->>TI: getSubBlocksForToolInput(toolId)
    TI->>TI: Filter & resolve SubBlockConfigs
    
    loop For each tool parameter
        TI->>TSR: Render with SubBlockConfig
        TSR->>TSR: Create synthetic ID<br/>(subBlockId-tool-N-paramId)
        TSR->>Store: useSubBlockValue(syntheticId)
        
        Note over TSR,Tool: Bidirectional Sync
        Tool->>TSR: toolParams[paramId] changes
        TSR->>Store: Push to store (effect 1)
        
        Store->>TSR: storeValue changes
        TSR->>Tool: onParamChange(toolIndex, paramId)
        
        TSR->>SB: Delegate full rendering
        SB->>SB: Render with labelSuffix,<br/>dependencyContext, canonicalToggle
    end
    
    Note over TI: Legacy path for params<br/>without SubBlockConfig
    TI->>TI: Render with ParameterWithLabel
Loading

Last reviewed commit: 6ee73fa

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

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 1 potential issue.

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

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