Skip to content

feat: update Composio components#8868

Merged
ogabrielluiz merged 67 commits into
langflow-ai:mainfrom
ComposioHQ:feat/composio-v3-2
Aug 18, 2025
Merged

feat: update Composio components#8868
ogabrielluiz merged 67 commits into
langflow-ai:mainfrom
ComposioHQ:feat/composio-v3-2

Conversation

@abhishekpatil4
Copy link
Copy Markdown
Contributor

@abhishekpatil4 abhishekpatil4 commented Jul 3, 2025

Changes

  • Dynamic component system: Replaced hardcoded components with dynamic tool fetching code
  • Package updates: Added composio package, updated composio_langchain, removed composio-core
  • Response post-processing: Added support to process tool execution responses before returning to components code
  • New/Replaced components: Added Gmail, Slack, Outlook, Reddit etc.

Processed response screenshot for reference:
Screenshot 2025-07-04 at 2 32 45 AM

Summary by CodeRabbit

  • New Features

    • Added integration components for Google Meet, Google Tasks, Linear, Reddit, Slackbot, Supabase, Todoist, YouTube, and Dropbox.
    • Introduced new sidebar bundles and icons for Linear, Reddit, Google Tasks, Google Maps, Todoist, Zoom, Google Meet, and Google Sheets.
    • Enabled lazy loading and display of new app icons in the interface.
  • Improvements

    • Upgraded Composio SDK dependencies for enhanced API integration.
    • Refactored and modernized Composio components for improved action handling, authentication, and UI configuration.
  • Bug Fixes

    • Improved error handling and state management for API connections and tool selection.
  • Removals

    • Simplified or removed legacy code for Gmail, Google Calendar, Outlook, Slack, and GitHub components to prepare for updated implementations.

@dosubot dosubot Bot added the size:XXL This PR changes 1000+ lines, ignoring generated files. label Jul 3, 2025
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jul 3, 2025

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Walkthrough

This update introduces new Composio integrations (Google Meet, Google Tasks, Linear, Reddit, Slackbot, Supabase, Todoist, YouTube, Dropbox), refactors backend components to use the latest Composio SDK, and streamlines existing API components. The frontend is updated with new icons and sidebar bundles for these integrations, expanding UI support.

Changes

File(s) Change Summary
pyproject.toml Updated Composio dependencies to use the new composio package at version 1.0.0rc9 and removed composio-core.
src/backend/base/langflow/base/composio/composio_base.py Refactored to use new Composio SDK, improved action/schema handling, dynamic UI config, robust authentication, and error handling. Added/updated multiple public methods for action/data management.
src/backend/base/langflow/components/composio/init.py Added exports for new Composio API components: Google Meet, Google Tasks, Linear, Reddit, Slackbot, Supabase, Todoist, YouTube, Dropbox.
src/backend/base/langflow/components/composio/composio_api.py Refactored to use new Composio client and LangchainProvider; simplified tool validation, build config logic, and deprecated old SDK usage. Improved error handling.
src/backend/base/langflow/components/composio/dropbox_compnent.py Added new Dropbox API component class with basic attributes and placeholder method.
src/backend/base/langflow/components/composio/github_composio.py Stripped to a minimal skeleton; removed all action/input logic, leaving only basic attributes and an empty method.
src/backend/base/langflow/components/composio/gmail_composio.py Removed all action/input logic; added minimal constructor and response post-processing methods for Gmail actions.
src/backend/base/langflow/components/composio/googlecalendar_composio.py Reduced to a skeleton; removed all logic except basic attributes and a stub method.
src/backend/base/langflow/components/composio/googlemeet_composio.py Added new Google Meet API component class with attributes and placeholder method.
src/backend/base/langflow/components/composio/googletasks_composio.py Added new Google Tasks API component class with attributes.
src/backend/base/langflow/components/composio/linear_composio.py Added new Linear API component class with attributes and placeholder method.
src/backend/base/langflow/components/composio/outlook_composio.py Reduced to skeleton; removed all logic except basic attributes and a stub method.
src/backend/base/langflow/components/composio/reddit_composio.py Added new Reddit API component class with attributes and placeholder method.
src/backend/base/langflow/components/composio/slack_composio.py Removed all logic except for an empty stub method.
src/backend/base/langflow/components/composio/slackbot_composio.py Added new Slackbot API component class with attributes and placeholder method.
src/backend/base/langflow/components/composio/supabase_composio.py Added new Supabase API component class with attributes and placeholder method.
src/backend/base/langflow/components/composio/todoist_composio.py Added new Todoist API component class with attributes and placeholder method.
src/backend/base/langflow/components/composio/youtube_composio.py Added new YouTube API component class with attributes and placeholder method.
src/frontend/src/icons/GoogleTasks/googletasks.jsx Added new SVG React component for Google Tasks icon.
src/frontend/src/icons/GoogleTasks/index.tsx Added forwardRef wrapper for Google Tasks icon.
src/frontend/src/icons/googlemaps/googlemaps.jsx Added new SVG React component for Google Maps icon.
src/frontend/src/icons/googlemaps/index.tsx Added forwardRef wrapper for Google Maps icon.
src/frontend/src/icons/googlemeet/googlemeet.jsx Added new SVG React component for Google Meet icon.
src/frontend/src/icons/googlemeet/index.tsx Added forwardRef wrapper for Google Meet icon.
src/frontend/src/icons/googlesheets/googlesheets.jsx Added new SVG React component for Google Sheets icon.
src/frontend/src/icons/googlesheets/index.tsx Added forwardRef wrapper for Google Sheets icon.
src/frontend/src/icons/lazyIconImports.ts Extended lazy icon mapping with new icons: Google Meet, Google Tasks, Google Sheets, Google Maps, Todoist, Zoom, Linear, Reddit.
src/frontend/src/icons/linear/index.tsx Added forwardRef wrapper for Linear icon.
src/frontend/src/icons/linear/linear.jsx Added new SVG React component for Linear icon.
src/frontend/src/icons/reddit/index.tsx Added forwardRef wrapper for Reddit icon.
src/frontend/src/icons/reddit/reddit.jsx Added new SVG React component for Reddit icon.
src/frontend/src/icons/todoist/index.tsx Added forwardRef wrapper for Todoist icon.
src/frontend/src/icons/todoist/todoist.jsx Added new SVG React component for Todoist icon.
src/frontend/src/icons/zoom/index.tsx Added forwardRef wrapper for Zoom icon.
src/frontend/src/icons/zoom/zoom.jsx Added new SVG React component for Zoom icon.
src/frontend/src/utils/styleUtils.ts Added new sidebar bundles and icon mappings for all newly supported tools.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Frontend
    participant Backend
    participant ComposioSDK

    User->>Frontend: Selects a tool (e.g., Google Tasks)
    Frontend->>Backend: Requests available actions and input schema
    Backend->>ComposioSDK: Fetch toolkits/actions metadata
    ComposioSDK-->>Backend: Returns actions and schemas
    Backend-->>Frontend: Returns actions/options and dynamic input fields
    User->>Frontend: Fills input fields and submits action
    Frontend->>Backend: Sends action request with parameters
    Backend->>ComposioSDK: Executes selected action with parameters
    ComposioSDK-->>Backend: Returns action result
    Backend-->>Frontend: Returns processed result
    Frontend-->>User: Displays result
Loading

Suggested labels

enhancement, size:XXL, lgtm

Suggested reviewers

  • edwinjosechittilappilly
  • mfortman11
✨ Finishing Touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@dosubot dosubot Bot added enhancement New feature or request javascript Pull requests that update Javascript code labels Jul 3, 2025
@github-actions github-actions Bot added enhancement New feature or request and removed enhancement New feature or request labels Jul 3, 2025
@abhishekpatil4
Copy link
Copy Markdown
Contributor Author

I'm getting this error when I use Slack, Supabase or GitHub Component specifically when all tools are enabled (works fine when tools are limited) Error while updating the Component: An unexpected error occurred while updating the Component. Please try again.

This likely happens during tool schema to LangFlow input conversion. Is there a way to debug this? Maybe a debug flag or logging option? I don't see any error logs currently.

Thanks!

Screenshot 2025-07-04 at 2 40 02 AM

Copy link
Copy Markdown
Contributor

@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: 22

🔭 Outside diff range comments (8)
pyproject.toml (1)

35-37: Duplicate pins produce non-deterministic resolution

The file lists the same libraries twice (certifi and filelock). PEP-621 parsers usually keep the last occurrence, but this is easy to miss and will confuse dependabot / uv.

-    "certifi>=2023.11.17,<2025.0.0",
-    "certifi==2024.8.30",
+    # keep only one, pick the stricter spec
+    "certifi==2024.8.30",-    "filelock>=3.18.0",
-    "filelock>=3.18.0"
+    "filelock>=3.18.0"

Also applies to: 127-129

src/frontend/src/icons/googlemaps/googlemaps.jsx (1)

1-20: Conventions breach: no dark-mode colours & no TypeScript wrapper

Same issues as the Zoom icon: the SVG ignores isdark and no index.tsx with forwardRef exists.
Add both pieces so the icon integrates with the existing lazy-loading + ref-forwarding infrastructure.

src/backend/base/langflow/components/composio/todoist_composio.py (1)

10-12: Implement the abstract method with a pass statement.

The set_default_tools method is abstract in the base class but has no implementation. Add a pass statement to prevent runtime errors.

 def set_default_tools(self):
     """Set the default tools for Todoist component."""
+    pass
src/backend/base/langflow/components/composio/supabase_composio.py (1)

10-12: Implement the abstract method with a pass statement.

The set_default_tools method is abstract in the base class but has no implementation. Add a pass statement to prevent runtime errors.

 def set_default_tools(self):
     """Set the default tools for Supabase component."""
+    pass
src/backend/base/langflow/components/composio/reddit_composio.py (1)

10-12: Implement the abstract method with a pass statement.

The set_default_tools method is abstract in the base class but has no implementation. Add a pass statement to prevent runtime errors.

 def set_default_tools(self):
     """Set the default tools for Reddit component."""
+    pass
src/backend/base/langflow/components/composio/youtube_composio.py (1)

10-12: Implement the abstract method with a pass statement.

The set_default_tools method is abstract in the base class but has no implementation. Add a pass statement to prevent runtime errors.

 def set_default_tools(self):
     """Set the default tools for Youtube component."""
+    pass
src/backend/base/langflow/components/composio/slackbot_composio.py (1)

10-12: Implement the abstract method with a pass statement.

The set_default_tools method is abstract in the base class but has no implementation. Add a pass statement to prevent runtime errors.

 def set_default_tools(self):
     """Set the default tools for Slackbot component."""
+    pass
src/backend/base/langflow/components/composio/composio_api.py (1)

126-220: Refactor deeply nested code blocks.

The update_build_config method has 6 levels of nesting, exceeding the recommended limit of 5. Consider extracting helper methods to improve readability.

Would you like me to suggest a refactored version that extracts the connection checking and OAuth flow logic into separate methods?

🧹 Nitpick comments (19)
src/frontend/src/icons/GoogleTasks/index.tsx (1)

4-8: Expose full SVG props to consumers

React.PropsWithChildren<{}> blocks common attributes such as className, style, width, etc. Typing the props as React.SVGProps<SVGSVGElement> (which already includes children) keeps the pattern consistent while remaining type-safe.

-export const GoogleTasksIcon = forwardRef<
-  SVGSVGElement,
-  React.PropsWithChildren<{}>
->((props, ref) => {
+export const GoogleTasksIcon = forwardRef<
+  SVGSVGElement,
+  React.SVGProps<SVGSVGElement>
+>((props, ref) => {
src/frontend/src/icons/googlesheets/googlesheets.jsx (1)

1-19: Spread incoming props & honour the isdark theme toggle

  1. props is never used – consumers cannot set className, onClick, etc.
  2. Guidelines require an isdark prop so colours adapt to dark mode.
-const Icon = (props) => (
-    <svg
+const Icon = ({ isdark, ...props }) => (
+    <svg
       xmlns="http://www.w3.org/2000/svg"
       viewBox="0 0 48 48"
       width="23px"
       height="23px"
+      {...props}
     >
       <path
-        fill="#43a047"
+        fill={isdark ? "#66bb6a" : "#43a047"}

(Repeat the colour guard for the other hard-coded fills as needed.)

src/frontend/src/icons/todoist/todoist.jsx (1)

1-3: Allow customisation & dark-mode for Todoist icon

Same concerns as with the Google Sheets icon – props are ignored and the graphic is not theme-aware.

-const Icon = (props) => (
-    <svg xmlns="http://www.w3.org/2000/svg"  viewBox="0 0 48 48" width="23px" height="23px" baseProfile="basic">
+const Icon = ({ isdark, ...props }) => (
+    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="23px" height="23px" baseProfile="basic" {...props}>-<path fill="#f44336"
+<path fill={isdark ? "#ef5350" : "#f44336"}
src/frontend/src/icons/googlemeet/index.tsx (1)

4-8: Use SVGProps for better type coverage (same as Google Tasks)

-export const GooglemeetIcon = forwardRef<
-  SVGSVGElement,
-  React.PropsWithChildren<{}>
->((props, ref) => {
+export const GooglemeetIcon = forwardRef<
+  SVGSVGElement,
+  React.SVGProps<SVGSVGElement>
+>((props, ref) => {

Keeps icon typings uniform and unblocks consumers from passing standard SVG attributes.

src/frontend/src/icons/googlesheets/index.tsx (1)

4-9: Optional typing refinement

React.PropsWithChildren<{}> is accepted across the codebase, but tools like Biome flag {}.
If you ever touch this again, consider

React.PropsWithChildren<{ isdark?: boolean }>

to silence the linter and document the dark-mode prop.

src/frontend/src/icons/todoist/index.tsx (1)

4-9: (Nit) Silence Biome lint by typing the prop shape

Optional but avoids lint error:

-React.PropsWithChildren<{}>
+React.PropsWithChildren<{ isdark?: boolean }>
src/backend/base/langflow/components/composio/dropbox_compnent.py (1)

10-12: Implement or remove placeholder method.

The set_default_tools method is empty. Either implement it with default tools or remove it if not needed yet.

-    def set_default_tools(self):
-        """Set the default tools for Dropbox component."""
+    def set_default_tools(self):
+        """Set the default tools for Dropbox component."""
+        pass  # TODO: Implement default tools configuration
src/backend/base/langflow/components/composio/linear_composio.py (1)

10-12: Implement or remove placeholder method.

The set_default_tools method is empty. Either implement it with default tools or add a pass statement for clarity.

     def set_default_tools(self):
         """Set the default tools for Linear component."""
+        pass  # TODO: Implement default tools configuration
src/backend/base/langflow/components/composio/todoist_composio.py (1)

4-8: Add class docstring for better documentation.

The class is missing a docstring that describes its purpose and functionality.

 class ComposioTodoistAPIComponent(ComposioBaseComponent):
+    """Composio API component for Todoist integration."""
     display_name: str = "Todoist"
src/backend/base/langflow/components/composio/supabase_composio.py (1)

4-8: Add class docstring for better documentation.

The class is missing a docstring that describes its purpose and functionality.

 class ComposioSupabaseAPIComponent(ComposioBaseComponent):
+    """Composio API component for Supabase integration."""
     display_name: str = "Supabase"
src/backend/base/langflow/components/composio/reddit_composio.py (1)

4-8: Add class docstring for better documentation.

The class is missing a docstring that describes its purpose and functionality.

 class ComposioRedditAPIComponent(ComposioBaseComponent):
+    """Composio API component for Reddit integration."""
     display_name: str = "Reddit"
src/backend/base/langflow/components/composio/youtube_composio.py (1)

4-8: Add class docstring for better documentation.

The class is missing a docstring that describes its purpose and functionality.

 class ComposioYoutubeAPIComponent(ComposioBaseComponent):
+    """Composio API component for YouTube integration."""
     display_name: str = "Youtube"
src/backend/base/langflow/components/composio/slackbot_composio.py (2)

4-8: Add class docstring for better documentation.

The class is missing a docstring that describes its purpose and functionality.

 class ComposioSlackbotAPIComponent(ComposioBaseComponent):
+    """Composio API component for Slackbot integration."""
     display_name: str = "Slackbot"

6-6: Consider icon consistency with component name.

The icon is set to "Slack" while the component name is "Slackbot". For consistency with other components, consider using "Slackbot" if a specific icon exists.

-    icon = "Slack"
+    icon = "Slackbot"
src/backend/base/langflow/base/composio/composio_base.py (5)

128-130: Remove excessive blank lines.

-
-
-
+

473-473: Fix inline comment formatting.

-                    field_schema_copy["description"] = f"User ID for {self.app_name.title()}: " + field_schema["description"] #noqa: E501
+                    field_schema_copy["description"] = f"User ID for {self.app_name.title()}: " + field_schema["description"]  # noqa: E501
-                            if inp.name == "user_id" and getattr(self, "entity_id", None) == getattr(inp, "value", None): #noqa: E501
+                            if inp.name == "user_id" and getattr(self, "entity_id", None) == getattr(inp, "value", None):  # noqa: E501

Also applies to: 565-565


376-378: Remove excessive blank lines.

-
-
+

681-681: Fix inline comment formatting throughout the method.

Multiple inline comments need proper spacing:

-                if field_name_in_config not in ["api_key", "tool_mode", "action", "auth_link", "entity_id"] and isinstance(build_config[field_name_in_config], dict) and "show" in build_config[field_name_in_config]:  # noqa: E501
+                if field_name_in_config not in ["api_key", "tool_mode", "action", "auth_link", "entity_id"] and isinstance(build_config[field_name_in_config], dict) and "show" in build_config[field_name_in_config]:  # noqa: E501

-                    connections = toolset.connected_accounts.list(user_ids=[self.entity_id], toolkit_slugs=[toolkit_slug]) #noqa: E501
+                    connections = toolset.connected_accounts.list(user_ids=[self.entity_id], toolkit_slugs=[toolkit_slug])  # noqa: E501

# ... and similar fixes for lines 774, 809, 813

Also applies to: 755-755, 774-774, 809-809, 813-813


885-887: Remove commented debug code.

     def configure_tools(self, composio: Composio) -> list[Tool]:
         tools = composio.tools.get(user_id=self.entity_id, toolkits=[self.app_name.lower()], limit=999)
-        # tools = composio.tools.get(user_id=self.entity_id, toolkits=[self.app_name.lower()])
-        # logger.info(f"Tools: {tools}")
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 78d64eb and 0564001.

⛔ Files ignored due to path filters (9)
  • src/frontend/src/icons/GoogleTasks/googletasks.svg is excluded by !**/*.svg
  • src/frontend/src/icons/googlemaps/googlemaps.svg is excluded by !**/*.svg
  • src/frontend/src/icons/googlemeet/googlemeet.svg is excluded by !**/*.svg
  • src/frontend/src/icons/googlesheets/googlesheets.svg is excluded by !**/*.svg
  • src/frontend/src/icons/linear/linear.svg is excluded by !**/*.svg
  • src/frontend/src/icons/reddit/reddit.svg is excluded by !**/*.svg
  • src/frontend/src/icons/todoist/todoist.svg is excluded by !**/*.svg
  • src/frontend/src/icons/zoom/zoom.svg is excluded by !**/*.svg
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (36)
  • pyproject.toml (1 hunks)
  • src/backend/base/langflow/base/composio/composio_base.py (5 hunks)
  • src/backend/base/langflow/components/composio/__init__.py (1 hunks)
  • src/backend/base/langflow/components/composio/composio_api.py (6 hunks)
  • src/backend/base/langflow/components/composio/dropbox_compnent.py (1 hunks)
  • src/backend/base/langflow/components/composio/github_composio.py (1 hunks)
  • src/backend/base/langflow/components/composio/gmail_composio.py (1 hunks)
  • src/backend/base/langflow/components/composio/googlecalendar_composio.py (1 hunks)
  • src/backend/base/langflow/components/composio/googlemeet_composio.py (1 hunks)
  • src/backend/base/langflow/components/composio/googletasks_composio.py (1 hunks)
  • src/backend/base/langflow/components/composio/linear_composio.py (1 hunks)
  • src/backend/base/langflow/components/composio/outlook_composio.py (1 hunks)
  • src/backend/base/langflow/components/composio/reddit_composio.py (1 hunks)
  • src/backend/base/langflow/components/composio/slack_composio.py (1 hunks)
  • src/backend/base/langflow/components/composio/slackbot_composio.py (1 hunks)
  • src/backend/base/langflow/components/composio/supabase_composio.py (1 hunks)
  • src/backend/base/langflow/components/composio/todoist_composio.py (1 hunks)
  • src/backend/base/langflow/components/composio/youtube_composio.py (1 hunks)
  • src/frontend/src/icons/GoogleTasks/googletasks.jsx (1 hunks)
  • src/frontend/src/icons/GoogleTasks/index.tsx (1 hunks)
  • src/frontend/src/icons/googlemaps/googlemaps.jsx (1 hunks)
  • src/frontend/src/icons/googlemaps/index.tsx (1 hunks)
  • src/frontend/src/icons/googlemeet/googlemeet.jsx (1 hunks)
  • src/frontend/src/icons/googlemeet/index.tsx (1 hunks)
  • src/frontend/src/icons/googlesheets/googlesheets.jsx (1 hunks)
  • src/frontend/src/icons/googlesheets/index.tsx (1 hunks)
  • src/frontend/src/icons/lazyIconImports.ts (4 hunks)
  • src/frontend/src/icons/linear/index.tsx (1 hunks)
  • src/frontend/src/icons/linear/linear.jsx (1 hunks)
  • src/frontend/src/icons/reddit/index.tsx (1 hunks)
  • src/frontend/src/icons/reddit/reddit.jsx (1 hunks)
  • src/frontend/src/icons/todoist/index.tsx (1 hunks)
  • src/frontend/src/icons/todoist/todoist.jsx (1 hunks)
  • src/frontend/src/icons/zoom/index.tsx (1 hunks)
  • src/frontend/src/icons/zoom/zoom.jsx (1 hunks)
  • src/frontend/src/utils/styleUtils.ts (6 hunks)
🧰 Additional context used
📓 Path-based instructions (12)
`{uv.lock,pyproject.toml}`: Use uv (>=0.4) as the Python package manager for dependency management

{uv.lock,pyproject.toml}: Use uv (>=0.4) as the Python package manager for dependency management

📄 Source: CodeRabbit Inference Engine (.cursor/rules/backend_development.mdc)

List of files the instruction was applied to:

  • pyproject.toml
`src/frontend/**/*.{ts,tsx}`: Use React 18 with TypeScript for all UI components and frontend logic.

src/frontend/**/*.{ts,tsx}: Use React 18 with TypeScript for all UI components and frontend logic.

📄 Source: CodeRabbit Inference Engine (.cursor/rules/frontend_development.mdc)

List of files the instruction was applied to:

  • src/frontend/src/icons/zoom/index.tsx
  • src/frontend/src/icons/googlemeet/index.tsx
  • src/frontend/src/icons/linear/index.tsx
  • src/frontend/src/icons/googlesheets/index.tsx
  • src/frontend/src/icons/reddit/index.tsx
  • src/frontend/src/icons/googlemaps/index.tsx
  • src/frontend/src/icons/GoogleTasks/index.tsx
  • src/frontend/src/icons/todoist/index.tsx
  • src/frontend/src/icons/lazyIconImports.ts
  • src/frontend/src/utils/styleUtils.ts
`src/frontend/**/*.{ts,tsx,js,jsx,css,scss}`: Use Tailwind CSS for styling all frontend components.

src/frontend/**/*.{ts,tsx,js,jsx,css,scss}: Use Tailwind CSS for styling all frontend components.

📄 Source: CodeRabbit Inference Engine (.cursor/rules/frontend_development.mdc)

List of files the instruction was applied to:

  • src/frontend/src/icons/zoom/index.tsx
  • src/frontend/src/icons/GoogleTasks/googletasks.jsx
  • src/frontend/src/icons/googlemeet/googlemeet.jsx
  • src/frontend/src/icons/googlemeet/index.tsx
  • src/frontend/src/icons/linear/index.tsx
  • src/frontend/src/icons/googlesheets/index.tsx
  • src/frontend/src/icons/reddit/reddit.jsx
  • src/frontend/src/icons/linear/linear.jsx
  • src/frontend/src/icons/reddit/index.tsx
  • src/frontend/src/icons/googlemaps/googlemaps.jsx
  • src/frontend/src/icons/googlesheets/googlesheets.jsx
  • src/frontend/src/icons/googlemaps/index.tsx
  • src/frontend/src/icons/GoogleTasks/index.tsx
  • src/frontend/src/icons/zoom/zoom.jsx
  • src/frontend/src/icons/todoist/todoist.jsx
  • src/frontend/src/icons/todoist/index.tsx
  • src/frontend/src/icons/lazyIconImports.ts
  • src/frontend/src/utils/styleUtils.ts
`src/frontend/src/icons/**/*.{ts,tsx,js,jsx}`: Use Lucide React for icons in frontend components.

src/frontend/src/icons/**/*.{ts,tsx,js,jsx}: Use Lucide React for icons in frontend components.

📄 Source: CodeRabbit Inference Engine (.cursor/rules/frontend_development.mdc)

List of files the instruction was applied to:

  • src/frontend/src/icons/zoom/index.tsx
  • src/frontend/src/icons/GoogleTasks/googletasks.jsx
  • src/frontend/src/icons/googlemeet/googlemeet.jsx
  • src/frontend/src/icons/googlemeet/index.tsx
  • src/frontend/src/icons/linear/index.tsx
  • src/frontend/src/icons/googlesheets/index.tsx
  • src/frontend/src/icons/reddit/reddit.jsx
  • src/frontend/src/icons/linear/linear.jsx
  • src/frontend/src/icons/reddit/index.tsx
  • src/frontend/src/icons/googlemaps/googlemaps.jsx
  • src/frontend/src/icons/googlesheets/googlesheets.jsx
  • src/frontend/src/icons/googlemaps/index.tsx
  • src/frontend/src/icons/GoogleTasks/index.tsx
  • src/frontend/src/icons/zoom/zoom.jsx
  • src/frontend/src/icons/todoist/todoist.jsx
  • src/frontend/src/icons/todoist/index.tsx
  • src/frontend/src/icons/lazyIconImports.ts
`src/frontend/src/icons/*/*`: Create a new directory for your icon in `src/front...

src/frontend/src/icons/*/*: Create a new directory for your icon in src/frontend/src/icons/YourIconName/ and add your SVG as a React component (e.g., YourIconName.jsx) that uses the isdark prop to support both light and dark mode.

📄 Source: CodeRabbit Inference Engine (.cursor/rules/icons.mdc)

List of files the instruction was applied to:

  • src/frontend/src/icons/zoom/index.tsx
  • src/frontend/src/icons/GoogleTasks/googletasks.jsx
  • src/frontend/src/icons/googlemeet/googlemeet.jsx
  • src/frontend/src/icons/googlemeet/index.tsx
  • src/frontend/src/icons/linear/index.tsx
  • src/frontend/src/icons/googlesheets/index.tsx
  • src/frontend/src/icons/reddit/reddit.jsx
  • src/frontend/src/icons/linear/linear.jsx
  • src/frontend/src/icons/reddit/index.tsx
  • src/frontend/src/icons/googlemaps/googlemaps.jsx
  • src/frontend/src/icons/googlesheets/googlesheets.jsx
  • src/frontend/src/icons/googlemaps/index.tsx
  • src/frontend/src/icons/GoogleTasks/index.tsx
  • src/frontend/src/icons/zoom/zoom.jsx
  • src/frontend/src/icons/todoist/todoist.jsx
  • src/frontend/src/icons/todoist/index.tsx
`src/frontend/src/icons/*/index.tsx`: Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.

src/frontend/src/icons/*/index.tsx: Create an index.tsx in your icon directory that exports your icon using forwardRef and passes the isdark prop.

📄 Source: CodeRabbit Inference Engine (.cursor/rules/icons.mdc)

List of files the instruction was applied to:

  • src/frontend/src/icons/zoom/index.tsx
  • src/frontend/src/icons/googlemeet/index.tsx
  • src/frontend/src/icons/linear/index.tsx
  • src/frontend/src/icons/googlesheets/index.tsx
  • src/frontend/src/icons/reddit/index.tsx
  • src/frontend/src/icons/googlemaps/index.tsx
  • src/frontend/src/icons/GoogleTasks/index.tsx
  • src/frontend/src/icons/todoist/index.tsx
`src/frontend/src/icons/*/*.jsx`: Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.

src/frontend/src/icons/*/*.jsx: Always support both light and dark mode for custom icons by using the isdark prop in your SVG component.

📄 Source: CodeRabbit Inference Engine (.cursor/rules/icons.mdc)

List of files the instruction was applied to:

  • src/frontend/src/icons/GoogleTasks/googletasks.jsx
  • src/frontend/src/icons/googlemeet/googlemeet.jsx
  • src/frontend/src/icons/reddit/reddit.jsx
  • src/frontend/src/icons/linear/linear.jsx
  • src/frontend/src/icons/googlemaps/googlemaps.jsx
  • src/frontend/src/icons/googlesheets/googlesheets.jsx
  • src/frontend/src/icons/zoom/zoom.jsx
  • src/frontend/src/icons/todoist/todoist.jsx
`src/backend/base/langflow/components/**/*.py`: Add new backend components to th...

src/backend/base/langflow/components/**/*.py: Add new backend components to the appropriate subdirectory under src/backend/base/langflow/components/
Implement async component methods using async def and await for asynchronous operations
Use asyncio.create_task for background work in async components and ensure proper cleanup on cancellation
Use asyncio.Queue for non-blocking queue operations in async components and handle timeouts appropriately

📄 Source: CodeRabbit Inference Engine (.cursor/rules/backend_development.mdc)

List of files the instruction was applied to:

  • src/backend/base/langflow/components/composio/todoist_composio.py
  • src/backend/base/langflow/components/composio/googlemeet_composio.py
  • src/backend/base/langflow/components/composio/reddit_composio.py
  • src/backend/base/langflow/components/composio/supabase_composio.py
  • src/backend/base/langflow/components/composio/__init__.py
  • src/backend/base/langflow/components/composio/slackbot_composio.py
  • src/backend/base/langflow/components/composio/googletasks_composio.py
  • src/backend/base/langflow/components/composio/dropbox_compnent.py
  • src/backend/base/langflow/components/composio/linear_composio.py
  • src/backend/base/langflow/components/composio/youtube_composio.py
  • src/backend/base/langflow/components/composio/gmail_composio.py
  • src/backend/base/langflow/components/composio/outlook_composio.py
  • src/backend/base/langflow/components/composio/googlecalendar_composio.py
  • src/backend/base/langflow/components/composio/github_composio.py
  • src/backend/base/langflow/components/composio/slack_composio.py
  • src/backend/base/langflow/components/composio/composio_api.py
`src/backend/**/*.py`: Run make format_backend to format Python code early and often Run make lint to check for linting issues in backend Python code

src/backend/**/*.py: Run make format_backend to format Python code early and often
Run make lint to check for linting issues in backend Python code

📄 Source: CodeRabbit Inference Engine (.cursor/rules/backend_development.mdc)

List of files the instruction was applied to:

  • src/backend/base/langflow/components/composio/todoist_composio.py
  • src/backend/base/langflow/components/composio/googlemeet_composio.py
  • src/backend/base/langflow/components/composio/reddit_composio.py
  • src/backend/base/langflow/components/composio/supabase_composio.py
  • src/backend/base/langflow/components/composio/__init__.py
  • src/backend/base/langflow/components/composio/slackbot_composio.py
  • src/backend/base/langflow/components/composio/googletasks_composio.py
  • src/backend/base/langflow/components/composio/dropbox_compnent.py
  • src/backend/base/langflow/components/composio/linear_composio.py
  • src/backend/base/langflow/components/composio/youtube_composio.py
  • src/backend/base/langflow/components/composio/gmail_composio.py
  • src/backend/base/langflow/components/composio/outlook_composio.py
  • src/backend/base/langflow/components/composio/googlecalendar_composio.py
  • src/backend/base/langflow/components/composio/github_composio.py
  • src/backend/base/langflow/components/composio/slack_composio.py
  • src/backend/base/langflow/components/composio/composio_api.py
  • src/backend/base/langflow/base/composio/composio_base.py
`src/backend/**/components/**/*.py`: In your Python component class, set the `icon` attribute to a string matching the frontend icon mapping exactly (case-sensitive).

src/backend/**/components/**/*.py: In your Python component class, set the icon attribute to a string matching the frontend icon mapping exactly (case-sensitive).

📄 Source: CodeRabbit Inference Engine (.cursor/rules/icons.mdc)

List of files the instruction was applied to:

  • src/backend/base/langflow/components/composio/todoist_composio.py
  • src/backend/base/langflow/components/composio/googlemeet_composio.py
  • src/backend/base/langflow/components/composio/reddit_composio.py
  • src/backend/base/langflow/components/composio/supabase_composio.py
  • src/backend/base/langflow/components/composio/__init__.py
  • src/backend/base/langflow/components/composio/slackbot_composio.py
  • src/backend/base/langflow/components/composio/googletasks_composio.py
  • src/backend/base/langflow/components/composio/dropbox_compnent.py
  • src/backend/base/langflow/components/composio/linear_composio.py
  • src/backend/base/langflow/components/composio/youtube_composio.py
  • src/backend/base/langflow/components/composio/gmail_composio.py
  • src/backend/base/langflow/components/composio/outlook_composio.py
  • src/backend/base/langflow/components/composio/googlecalendar_composio.py
  • src/backend/base/langflow/components/composio/github_composio.py
  • src/backend/base/langflow/components/composio/slack_composio.py
  • src/backend/base/langflow/components/composio/composio_api.py
`src/backend/base/langflow/components/**/__init__.py`: Update __init__.py with alphabetical imports when adding new components

src/backend/base/langflow/components/**/__init__.py: Update init.py with alphabetical imports when adding new components

📄 Source: CodeRabbit Inference Engine (.cursor/rules/backend_development.mdc)

List of files the instruction was applied to:

  • src/backend/base/langflow/components/composio/__init__.py
`src/frontend/src/icons/lazyIconImports.ts`: Add your icon to the `lazyIconsMapp...

src/frontend/src/icons/lazyIconImports.ts: Add your icon to the lazyIconsMapping object in src/frontend/src/icons/lazyIconImports.ts with a key that matches the backend icon string exactly.

📄 Source: CodeRabbit Inference Engine (.cursor/rules/icons.mdc)

List of files the instruction was applied to:

  • src/frontend/src/icons/lazyIconImports.ts
🧠 Learnings (36)
📓 Common learnings
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: After backend restart, old components will show 'Updates Available' in the UI
pyproject.toml (1)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to {uv.lock,pyproject.toml} : Use uv (>=0.4) as the Python package manager for dependency management
src/frontend/src/icons/zoom/index.tsx (12)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/components/**/*FlowGraph.tsx : Use React Flow for flow graph visualization components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/**/*.{ts,tsx} : Use React 18 with TypeScript for all UI components and frontend logic.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-23T12:46:42.048Z
Learning: Custom React Flow node types should be implemented as memoized components, using Handle components for connection points and supporting optional icons and labels.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-23T12:46:42.048Z
Learning: React Flow should be used for flow graph visualization, with nodes and edges passed as props, and changes handled via onNodesChange and onEdgesChange callbacks.
src/frontend/src/icons/GoogleTasks/googletasks.jsx (10)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/components/**/*FlowGraph.tsx : Use React Flow for flow graph visualization components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/**/*.{ts,tsx} : Use React 18 with TypeScript for all UI components and frontend logic.
src/frontend/src/icons/googlemeet/googlemeet.jsx (9)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/components/**/*FlowGraph.tsx : Use React Flow for flow graph visualization components.
src/frontend/src/icons/googlemeet/index.tsx (11)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/components/**/*FlowGraph.tsx : Use React Flow for flow graph visualization components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/**/*.{ts,tsx} : Use React 18 with TypeScript for all UI components and frontend logic.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-23T12:46:42.048Z
Learning: Custom React Flow node types should be implemented as memoized components, using Handle components for connection points and supporting optional icons and labels.
src/frontend/src/icons/linear/index.tsx (11)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/components/**/*FlowGraph.tsx : Use React Flow for flow graph visualization components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/lazyIconImports.ts : Add your icon to the `lazyIconsMapping` object in `src/frontend/src/icons/lazyIconImports.ts` with a key that matches the backend icon string exactly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-23T12:46:42.048Z
Learning: Custom React Flow node types should be implemented as memoized components, using Handle components for connection points and supporting optional icons and labels.
src/frontend/src/icons/googlesheets/index.tsx (13)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/components/**/*FlowGraph.tsx : Use React Flow for flow graph visualization components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/**/*.{ts,tsx} : Use React 18 with TypeScript for all UI components and frontend logic.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/lazyIconImports.ts : Add your icon to the `lazyIconsMapping` object in `src/frontend/src/icons/lazyIconImports.ts` with a key that matches the backend icon string exactly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-23T12:46:42.048Z
Learning: Custom React Flow node types should be implemented as memoized components, using Handle components for connection points and supporting optional icons and labels.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-23T12:46:42.048Z
Learning: React Flow should be used for flow graph visualization, with nodes and edges passed as props, and changes handled via onNodesChange and onEdgesChange callbacks.
src/frontend/src/icons/reddit/reddit.jsx (10)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/components/**/*FlowGraph.tsx : Use React Flow for flow graph visualization components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/**/*.{ts,tsx} : Use React 18 with TypeScript for all UI components and frontend logic.
src/frontend/src/icons/linear/linear.jsx (11)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/components/**/*FlowGraph.tsx : Use React Flow for flow graph visualization components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-23T12:46:42.048Z
Learning: Custom React Flow node types should be implemented as memoized components, using Handle components for connection points and supporting optional icons and labels.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/lazyIconImports.ts : Add your icon to the `lazyIconsMapping` object in `src/frontend/src/icons/lazyIconImports.ts` with a key that matches the backend icon string exactly.
src/frontend/src/icons/reddit/index.tsx (12)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/components/**/*FlowGraph.tsx : Use React Flow for flow graph visualization components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/**/*.{ts,tsx} : Use React 18 with TypeScript for all UI components and frontend logic.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-23T12:46:42.048Z
Learning: Custom React Flow node types should be implemented as memoized components, using Handle components for connection points and supporting optional icons and labels.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-23T12:46:42.048Z
Learning: React Flow should be used for flow graph visualization, with nodes and edges passed as props, and changes handled via onNodesChange and onEdgesChange callbacks.
src/backend/base/langflow/components/composio/todoist_composio.py (8)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Add new backend components to the appropriate subdirectory under src/backend/base/langflow/components/
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/tests/unit/components/**/*.py : Create comprehensive unit tests for all new components
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Implement async component methods using async def and await for asynchronous operations
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-06-30T14:41:58.837Z
Learning: Applies to src/backend/tests/**/*.py : Inherit from the appropriate ComponentTestBase class ('ComponentTestBase', 'ComponentTestBaseWithClient', or 'ComponentTestBaseWithoutClient') and provide the required fixtures: 'component_class', 'default_kwargs', and 'file_names_mapping' when adding a new component test.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/backend/**/components/**/*.py : In your Python component class, set the `icon` attribute to a string matching the frontend icon mapping exactly (case-sensitive).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/backend/**/*component*.py : In your Python component class, set the `icon` attribute to a string matching the frontend icon mapping exactly (case-sensitive).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Use asyncio.create_task for background work in async components and ensure proper cleanup on cancellation
src/frontend/src/icons/googlemaps/googlemaps.jsx (11)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/lazyIconImports.ts : Add your icon to the `lazyIconsMapping` object in `src/frontend/src/icons/lazyIconImports.ts` with a key that matches the backend icon string exactly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/components/**/*FlowGraph.tsx : Use React Flow for flow graph visualization components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-23T12:46:42.048Z
Learning: Custom React Flow node types should be implemented as memoized components, using Handle components for connection points and supporting optional icons and labels.
src/frontend/src/icons/googlesheets/googlesheets.jsx (11)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/lazyIconImports.ts : Add your icon to the `lazyIconsMapping` object in `src/frontend/src/icons/lazyIconImports.ts` with a key that matches the backend icon string exactly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/components/**/*FlowGraph.tsx : Use React Flow for flow graph visualization components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-23T12:46:42.048Z
Learning: Custom React Flow node types should be implemented as memoized components, using Handle components for connection points and supporting optional icons and labels.
src/backend/base/langflow/components/composio/googlemeet_composio.py (4)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Add new backend components to the appropriate subdirectory under src/backend/base/langflow/components/
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Implement async component methods using async def and await for asynchronous operations
Learnt from: ogabrielluiz
PR: langflow-ai/langflow#0
File: :0-0
Timestamp: 2025-06-26T19:43:18.260Z
Learning: In langflow custom components, the `module_name` parameter is now propagated through template building functions to add module metadata and code hashes to frontend nodes for better component tracking and debugging.
src/frontend/src/icons/googlemaps/index.tsx (13)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/components/**/*FlowGraph.tsx : Use React Flow for flow graph visualization components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/lazyIconImports.ts : Add your icon to the `lazyIconsMapping` object in `src/frontend/src/icons/lazyIconImports.ts` with a key that matches the backend icon string exactly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/**/*.{ts,tsx} : Use React 18 with TypeScript for all UI components and frontend logic.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-23T12:46:42.048Z
Learning: Custom React Flow node types should be implemented as memoized components, using Handle components for connection points and supporting optional icons and labels.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-23T12:46:42.048Z
Learning: React Flow should be used for flow graph visualization, with nodes and edges passed as props, and changes handled via onNodesChange and onEdgesChange callbacks.
src/frontend/src/icons/GoogleTasks/index.tsx (12)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/components/**/*FlowGraph.tsx : Use React Flow for flow graph visualization components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/**/*.{ts,tsx} : Use React 18 with TypeScript for all UI components and frontend logic.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/lazyIconImports.ts : Add your icon to the `lazyIconsMapping` object in `src/frontend/src/icons/lazyIconImports.ts` with a key that matches the backend icon string exactly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-23T12:46:42.048Z
Learning: Custom React Flow node types should be implemented as memoized components, using Handle components for connection points and supporting optional icons and labels.
src/frontend/src/icons/zoom/zoom.jsx (11)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/components/**/*FlowGraph.tsx : Use React Flow for flow graph visualization components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/**/*.{ts,tsx} : Use React 18 with TypeScript for all UI components and frontend logic.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-23T12:46:42.048Z
Learning: Custom React Flow node types should be implemented as memoized components, using Handle components for connection points and supporting optional icons and labels.
src/frontend/src/icons/todoist/todoist.jsx (10)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/lazyIconImports.ts : Add your icon to the `lazyIconsMapping` object in `src/frontend/src/icons/lazyIconImports.ts` with a key that matches the backend icon string exactly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/components/**/*FlowGraph.tsx : Use React Flow for flow graph visualization components.
src/backend/base/langflow/components/composio/reddit_composio.py (2)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Add new backend components to the appropriate subdirectory under src/backend/base/langflow/components/
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
src/backend/base/langflow/components/composio/supabase_composio.py (8)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Add new backend components to the appropriate subdirectory under src/backend/base/langflow/components/
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Implement async component methods using async def and await for asynchronous operations
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/backend/**/components/**/*.py : In your Python component class, set the `icon` attribute to a string matching the frontend icon mapping exactly (case-sensitive).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/backend/**/*component*.py : In your Python component class, set the `icon` attribute to a string matching the frontend icon mapping exactly (case-sensitive).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/tests/unit/components/**/*.py : Create comprehensive unit tests for all new components
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-06-30T14:41:58.837Z
Learning: Applies to src/backend/tests/**/*.py : Inherit from the appropriate ComponentTestBase class ('ComponentTestBase', 'ComponentTestBaseWithClient', or 'ComponentTestBaseWithoutClient') and provide the required fixtures: 'component_class', 'default_kwargs', and 'file_names_mapping' when adding a new component test.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/services/database/models/**/*.py : Place database models in src/backend/base/langflow/services/database/models/ and its subdirectories
src/frontend/src/icons/todoist/index.tsx (11)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/**/*.{ts,tsx} : Use React 18 with TypeScript for all UI components and frontend logic.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/components/**/*FlowGraph.tsx : Use React Flow for flow graph visualization components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-23T12:46:42.048Z
Learning: Custom React Flow node types should be implemented as memoized components, using Handle components for connection points and supporting optional icons and labels.
src/backend/base/langflow/components/composio/__init__.py (3)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Add new backend components to the appropriate subdirectory under src/backend/base/langflow/components/
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Implement async component methods using async def and await for asynchronous operations
src/backend/base/langflow/components/composio/slackbot_composio.py (6)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Add new backend components to the appropriate subdirectory under src/backend/base/langflow/components/
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
Learnt from: ogabrielluiz
PR: langflow-ai/langflow#0
File: :0-0
Timestamp: 2025-06-26T19:43:18.260Z
Learning: In langflow custom components, the `module_name` parameter is now propagated through template building functions to add module metadata and code hashes to frontend nodes for better component tracking and debugging.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Implement async component methods using async def and await for asynchronous operations
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/backend/**/*component*.py : In your Python component class, set the `icon` attribute to a string matching the frontend icon mapping exactly (case-sensitive).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/backend/**/components/**/*.py : In your Python component class, set the `icon` attribute to a string matching the frontend icon mapping exactly (case-sensitive).
src/backend/base/langflow/components/composio/googletasks_composio.py (8)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Add new backend components to the appropriate subdirectory under src/backend/base/langflow/components/
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Use asyncio.create_task for background work in async components and ensure proper cleanup on cancellation
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Implement async component methods using async def and await for asynchronous operations
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/tests/unit/components/**/*.py : Create comprehensive unit tests for all new components
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/backend/**/components/**/*.py : In your Python component class, set the `icon` attribute to a string matching the frontend icon mapping exactly (case-sensitive).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/backend/**/*component*.py : In your Python component class, set the `icon` attribute to a string matching the frontend icon mapping exactly (case-sensitive).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-06-30T14:41:58.837Z
Learning: Applies to src/backend/tests/**/*.py : Inherit from the appropriate ComponentTestBase class ('ComponentTestBase', 'ComponentTestBaseWithClient', or 'ComponentTestBaseWithoutClient') and provide the required fixtures: 'component_class', 'default_kwargs', and 'file_names_mapping' when adding a new component test.
src/backend/base/langflow/components/composio/dropbox_compnent.py (8)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Add new backend components to the appropriate subdirectory under src/backend/base/langflow/components/
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/backend/**/*component*.py : In your Python component class, set the `icon` attribute to a string matching the frontend icon mapping exactly (case-sensitive).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/backend/**/components/**/*.py : In your Python component class, set the `icon` attribute to a string matching the frontend icon mapping exactly (case-sensitive).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-06-30T14:41:58.837Z
Learning: Applies to src/backend/tests/**/*.py : Inherit from the appropriate ComponentTestBase class ('ComponentTestBase', 'ComponentTestBaseWithClient', or 'ComponentTestBaseWithoutClient') and provide the required fixtures: 'component_class', 'default_kwargs', and 'file_names_mapping' when adding a new component test.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Implement async component methods using async def and await for asynchronous operations
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/tests/unit/components/**/*.py : Create comprehensive unit tests for all new components
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
src/frontend/src/icons/lazyIconImports.ts (13)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/lazyIconImports.ts : Add your icon to the `lazyIconsMapping` object in `src/frontend/src/icons/lazyIconImports.ts` with a key that matches the backend icon string exactly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: The frontend icon mapping key (in 'lazyIconsMapping') must match the backend 'icon' attribute string exactly, including case sensitivity, to ensure correct icon rendering.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: If a custom icon does not exist for a component, use a generic lucide icon as a fallback and request a new custom icon if needed.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: If no suitable custom icon exists, use a lucide icon from https://lucide.dev/icons.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Use clear, recognizable, and consistent icon names for both backend and frontend (e.g., 'AstraDB', 'Postgres', 'OpenAI').
src/backend/base/langflow/components/composio/linear_composio.py (6)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Add new backend components to the appropriate subdirectory under src/backend/base/langflow/components/
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Implement async component methods using async def and await for asynchronous operations
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-06-30T14:41:58.837Z
Learning: Applies to {src/backend/tests/**/*.py,tests/**/*.py} : Test backward compatibility across Langflow versions by mapping component files to supported versions using 'VersionComponentMapping'.
Learnt from: ogabrielluiz
PR: langflow-ai/langflow#0
File: :0-0
Timestamp: 2025-06-26T19:43:18.260Z
Learning: In langflow custom components, the `module_name` parameter is now propagated through template building functions to add module metadata and code hashes to frontend nodes for better component tracking and debugging.
src/backend/base/langflow/components/composio/youtube_composio.py (5)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Add new backend components to the appropriate subdirectory under src/backend/base/langflow/components/
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
Learnt from: ogabrielluiz
PR: langflow-ai/langflow#0
File: :0-0
Timestamp: 2025-06-26T19:43:18.260Z
Learning: In langflow custom components, the `module_name` parameter is now propagated through template building functions to add module metadata and code hashes to frontend nodes for better component tracking and debugging.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/backend/**/components/**/*.py : In your Python component class, set the `icon` attribute to a string matching the frontend icon mapping exactly (case-sensitive).
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/backend/**/*component*.py : In your Python component class, set the `icon` attribute to a string matching the frontend icon mapping exactly (case-sensitive).
src/backend/base/langflow/components/composio/gmail_composio.py (1)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
src/backend/base/langflow/components/composio/outlook_composio.py (1)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
src/backend/base/langflow/components/composio/googlecalendar_composio.py (1)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
src/backend/base/langflow/components/composio/github_composio.py (1)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
src/frontend/src/utils/styleUtils.ts (12)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/frontend_development.mdc:0-0
Timestamp: 2025-06-30T14:40:29.494Z
Learning: Applies to src/frontend/src/icons/**/*.{ts,tsx,js,jsx} : Use Lucide React for icons in frontend components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/lazyIconImports.ts : Add your icon to the `lazyIconsMapping` object in `src/frontend/src/icons/lazyIconImports.ts` with a key that matches the backend icon string exactly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/docs_development.mdc:0-0
Timestamp: 2025-06-30T14:40:02.667Z
Learning: Applies to docs/sidebars.js : Sidebar navigation must be configured and updated in 'docs/sidebars.js' to reflect the current documentation structure.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/index.tsx : Create an `index.tsx` in your icon directory that exports your icon using `forwardRef` and passes the `isdark` prop.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Export custom icon components in React using React.forwardRef to ensure proper ref forwarding and compatibility with parent components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/* : Create a new directory for your icon in `src/frontend/src/icons/YourIconName/` and add your SVG as a React component (e.g., `YourIconName.jsx`) that uses the `isdark` prop to support both light and dark mode.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: Custom SVG icon components in React should always support both light and dark mode by accepting an 'isdark' prop and adjusting colors accordingly.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/frontend/src/icons/*/*.jsx : Always support both light and dark mode for custom icons by using the `isdark` prop in your SVG component.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: The frontend icon mapping key (in 'lazyIconsMapping') must match the backend 'icon' attribute string exactly, including case sensitivity, to ensure correct icon rendering.
Learnt from: dolfim-ibm
PR: langflow-ai/langflow#8394
File: src/frontend/src/icons/Docling/index.tsx:4-6
Timestamp: 2025-06-16T11:14:04.200Z
Learning: The Langflow codebase consistently uses `React.PropsWithChildren<{}>` as the prop type for all icon components using forwardRef, rather than `React.SVGProps<SVGSVGElement>`. This is an established pattern across hundreds of icon files in src/frontend/src/icons/.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Use clear, recognizable, and consistent icon names for both backend and frontend (e.g., 'AstraDB', 'Postgres', 'OpenAI').
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-23T12:46:52.420Z
Learning: When implementing a new component icon in Langflow, ensure the icon name is clear, recognizable, and used consistently across both backend (Python 'icon' attribute) and frontend (React/TypeScript mapping).
src/backend/base/langflow/components/composio/composio_api.py (6)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-06-30T14:41:58.837Z
Learning: Applies to {src/backend/tests/**/*.py,tests/**/*.py} : Test backward compatibility across Langflow versions by mapping component files to supported versions using 'VersionComponentMapping'.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Add new backend components to the appropriate subdirectory under src/backend/base/langflow/components/
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-06-30T14:41:58.837Z
Learning: Applies to {src/backend/tests/**/*.py,tests/**/*.py} : Test component configuration updates by asserting changes in build config dictionaries.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Implement async component methods using async def and await for asynchronous operations
Learnt from: ogabrielluiz
PR: langflow-ai/langflow#0
File: :0-0
Timestamp: 2025-06-26T19:43:18.260Z
Learning: In langflow custom components, the `module_name` parameter is now propagated through template building functions to add module metadata and code hashes to frontend nodes for better component tracking and debugging.
src/backend/base/langflow/base/composio/composio_base.py (6)
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/__init__.py : Update __init__.py with alphabetical imports when adding new components
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Add new backend components to the appropriate subdirectory under src/backend/base/langflow/components/
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/base/langflow/components/**/*.py : Implement async component methods using async def and await for asynchronous operations
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/tests/unit/components/**/*.py : Use ComponentTestBaseWithClient or ComponentTestBaseWithoutClient as base classes for component unit tests
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-06-30T14:41:58.837Z
Learning: Applies to {src/backend/tests/**/*.py,tests/**/*.py} : Test backward compatibility across Langflow versions by mapping component files to supported versions using 'VersionComponentMapping'.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-06-30T14:41:58.837Z
Learning: Applies to src/backend/tests/**/*.py : Inherit from the appropriate ComponentTestBase class ('ComponentTestBase', 'ComponentTestBaseWithClient', or 'ComponentTestBaseWithoutClient') and provide the required fixtures: 'component_class', 'default_kwargs', and 'file_names_mapping' when adding a new component test.
🧬 Code Graph Analysis (11)
src/frontend/src/icons/googlemeet/googlemeet.jsx (1)
src/frontend/src/icons/googlemeet/index.tsx (1)
  • GooglemeetIcon (4-9)
src/frontend/src/icons/googlemeet/index.tsx (1)
src/frontend/src/icons/googlemeet/googlemeet.jsx (1)
  • GooglemeetIcon (1-33)
src/frontend/src/icons/linear/linear.jsx (4)
src/frontend/src/icons/googlemaps/googlemaps.jsx (1)
  • Icon (1-3)
src/frontend/src/icons/googlesheets/googlesheets.jsx (1)
  • Icon (1-19)
src/frontend/src/icons/todoist/todoist.jsx (1)
  • Icon (1-3)
src/frontend/src/icons/zoom/zoom.jsx (1)
  • Icon (1-3)
src/frontend/src/icons/reddit/index.tsx (1)
src/frontend/src/icons/reddit/reddit.jsx (1)
  • RedditIconSVG (1-12)
src/frontend/src/icons/googlemaps/googlemaps.jsx (4)
src/frontend/src/icons/googlesheets/googlesheets.jsx (1)
  • Icon (1-19)
src/frontend/src/icons/linear/linear.jsx (1)
  • Icon (1-19)
src/frontend/src/icons/todoist/todoist.jsx (1)
  • Icon (1-3)
src/frontend/src/icons/zoom/zoom.jsx (1)
  • Icon (1-3)
src/frontend/src/icons/todoist/todoist.jsx (3)
src/frontend/src/icons/googlemaps/googlemaps.jsx (1)
  • Icon (1-3)
src/frontend/src/icons/googlesheets/googlesheets.jsx (1)
  • Icon (1-19)
src/frontend/src/icons/zoom/zoom.jsx (1)
  • Icon (1-3)
src/backend/base/langflow/components/composio/reddit_composio.py (12)
src/backend/base/langflow/base/composio/composio_base.py (2)
  • ComposioBaseComponent (27-1019)
  • set_default_tools (1018-1019)
src/backend/base/langflow/components/composio/gmail_composio.py (1)
  • set_default_tools (37-38)
src/backend/base/langflow/components/composio/googlecalendar_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/github_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/googlemeet_composio.py (1)
  • set_default_tools (11-12)
src/backend/base/langflow/components/composio/linear_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/outlook_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/slack_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/slackbot_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/supabase_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/youtube_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/todoist_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/supabase_composio.py (12)
src/backend/base/langflow/base/composio/composio_base.py (2)
  • ComposioBaseComponent (27-1019)
  • set_default_tools (1018-1019)
src/backend/base/langflow/components/composio/gmail_composio.py (1)
  • set_default_tools (37-38)
src/backend/base/langflow/components/composio/googlecalendar_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/github_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/googlemeet_composio.py (1)
  • set_default_tools (11-12)
src/backend/base/langflow/components/composio/linear_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/outlook_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/reddit_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/slack_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/slackbot_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/youtube_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/todoist_composio.py (1)
  • set_default_tools (10-11)
src/backend/base/langflow/components/composio/__init__.py (8)
src/backend/base/langflow/components/composio/googlemeet_composio.py (1)
  • ComposioGooglemeetAPIComponent (5-12)
src/backend/base/langflow/components/composio/googletasks_composio.py (1)
  • ComposioGoogleTasksAPIComponent (4-9)
src/backend/base/langflow/components/composio/linear_composio.py (1)
  • ComposioLinearAPIComponent (4-11)
src/backend/base/langflow/components/composio/reddit_composio.py (1)
  • ComposioRedditAPIComponent (4-11)
src/backend/base/langflow/components/composio/slackbot_composio.py (1)
  • ComposioSlackbotAPIComponent (4-11)
src/backend/base/langflow/components/composio/supabase_composio.py (1)
  • ComposioSupabaseAPIComponent (4-11)
src/backend/base/langflow/components/composio/todoist_composio.py (1)
  • ComposioTodoistAPIComponent (4-11)
src/backend/base/langflow/components/composio/youtube_composio.py (1)
  • ComposioYoutubeAPIComponent (4-11)
src/backend/base/langflow/components/composio/dropbox_compnent.py (1)
src/backend/base/langflow/base/composio/composio_base.py (1)
  • ComposioBaseComponent (27-1019)
src/backend/base/langflow/components/composio/googlecalendar_composio.py (3)
src/backend/base/langflow/components/composio/gmail_composio.py (1)
  • set_default_tools (37-38)
src/backend/base/langflow/components/composio/googlemeet_composio.py (1)
  • set_default_tools (11-12)
src/backend/base/langflow/base/composio/composio_base.py (1)
  • set_default_tools (1018-1019)
🪛 Biome (1.9.4)
src/frontend/src/icons/zoom/index.tsx

[error] 6-6: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)

src/frontend/src/icons/googlemeet/index.tsx

[error] 6-6: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)

src/frontend/src/icons/linear/index.tsx

[error] 6-6: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)

src/frontend/src/icons/googlesheets/index.tsx

[error] 6-6: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)

src/frontend/src/icons/reddit/index.tsx

[error] 6-6: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)

src/frontend/src/icons/googlemaps/index.tsx

[error] 6-6: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)

src/frontend/src/icons/GoogleTasks/index.tsx

[error] 6-6: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)

src/frontend/src/icons/todoist/index.tsx

[error] 6-6: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)

🪛 Pylint (3.3.7)
src/backend/base/langflow/components/composio/googletasks_composio.py

[refactor] 4-4: Too few public methods (0/2)

(R0903)

src/backend/base/langflow/components/composio/composio_api.py

[refactor] 155-217: Too many nested blocks (6/5)

(R1702)

src/backend/base/langflow/base/composio/composio_base.py

[refactor] 172-172: Too many local variables (33/15)

(R0914)


[refactor] 181-375: Too many nested blocks (6/5)

(R1702)


[refactor] 181-375: Too many nested blocks (7/5)

(R1702)


[refactor] 181-375: Too many nested blocks (9/5)

(R1702)


[refactor] 181-375: Too many nested blocks (9/5)

(R1702)


[refactor] 181-375: Too many nested blocks (6/5)

(R1702)


[refactor] 172-172: Too many branches (39/12)

(R0912)


[refactor] 172-172: Too many statements (112/50)

(R0915)


[refactor] 181-375: Too many nested blocks (7/5)

(R1702)


[refactor] 378-378: Too many local variables (30/15)

(R0914)


[refactor] 385-576: Too many nested blocks (6/5)

(R1702)


[refactor] 378-378: Too many return statements (12/6)

(R0911)


[refactor] 378-378: Too many branches (39/12)

(R0912)


[refactor] 378-378: Too many statements (97/50)

(R0915)


[refactor] 385-576: Too many nested blocks (6/5)

(R1702)


[refactor] 637-637: Too many local variables (26/15)

(R0914)


[refactor] 748-875: Too many nested blocks (7/5)

(R1702)


[refactor] 748-875: Too many nested blocks (7/5)

(R1702)


[refactor] 748-875: Too many nested blocks (6/5)

(R1702)


[refactor] 748-875: Too many nested blocks (6/5)

(R1702)


[refactor] 637-637: Too many return statements (8/6)

(R0911)


[refactor] 637-637: Too many branches (54/12)

(R0912)


[refactor] 637-637: Too many statements (154/50)

(R0915)


[refactor] 922-922: Too many local variables (22/15)

(R0914)


[refactor] 922-922: Either all return statements in a function should return an expression, or none of them should.

(R1710)

🪛 Flake8 (7.2.0)
src/backend/base/langflow/components/composio/composio_api.py

[error] 92-92: too many blank lines (2)

(E303)


[error] 179-179: visually indented line with same indent as next logical line

(E129)


[error] 180-180: over-indented

(E117)

src/backend/base/langflow/base/composio/composio_base.py

[error] 130-130: too many blank lines (3)

(E303)


[error] 378-378: too many blank lines (2)

(E303)


[error] 473-473: at least two spaces before inline comment

(E261)


[error] 473-473: inline comment should start with '# '

(E262)


[error] 565-565: at least two spaces before inline comment

(E261)


[error] 565-565: inline comment should start with '# '

(E262)


[error] 681-681: at least two spaces before inline comment

(E261)


[error] 681-681: inline comment should start with '# '

(E262)


[error] 755-755: at least two spaces before inline comment

(E261)


[error] 755-755: inline comment should start with '# '

(E262)


[error] 774-774: at least two spaces before inline comment

(E261)


[error] 774-774: inline comment should start with '# '

(E262)


[error] 809-809: at least two spaces before inline comment

(E261)


[error] 809-809: inline comment should start with '# '

(E262)


[error] 813-813: at least two spaces before inline comment

(E261)


[error] 813-813: inline comment should start with '# '

(E262)

🔇 Additional comments (19)
pyproject.toml (1)

69-70: Prefer stable versions over release-candidates for production dependencies

1.0.0rc9 is still a release-candidate. Unless you depend on RC-specific features, pinning to a final release (or at least a <1.0.0 stable tag) reduces the risk of breaking changes when the package graduates to GA.

-    "composio-langchain==1.0.0rc9",
-    "composio==1.0.0rc9",
+#   TODO: switch to the first stable build once available
+    "composio-langchain>=1.0.0,<2.0.0",
+    "composio>=1.0.0,<2.0.0",

Check whether the GA builds are already on PyPI and, if not, open an issue to track the upgrade.

src/frontend/src/icons/reddit/index.tsx (1)

6-6: Static analysis warning can be ignored.

The use of React.PropsWithChildren<{}> is the established pattern across hundreds of icon files in this codebase, as confirmed by the retrieved learnings. This static analysis warning is a false positive.

src/frontend/src/icons/linear/index.tsx (1)

6-6: Static analysis warning can be ignored.

The use of React.PropsWithChildren<{}> is the established pattern in this codebase for icon components.

src/frontend/src/icons/googlemaps/index.tsx (1)

6-6: Static analysis warning can be ignored.

The use of React.PropsWithChildren<{}> is the established pattern in this codebase for icon components.

src/frontend/src/icons/zoom/index.tsx (1)

6-6: Static analysis warning can be ignored.

The use of React.PropsWithChildren<{}> is the established pattern in this codebase for icon components.

src/frontend/src/icons/googlesheets/index.tsx (1)

4-9: Icon does not guarantee dark-mode support

The wrapper faithfully forwards props, but the underlying googlesheets.jsx hard-codes fill colours and ignores an isdark prop, violating the icon guidelines that every custom SVG must honour light/dark mode via that prop.
Please extend the SVG component to accept { isdark?: boolean } and swap colours accordingly (or at minimum expose className / style so Tailwind can style the fills).

src/frontend/src/icons/todoist/index.tsx (1)

4-9: Dark-mode still unimplemented in underlying SVG

Same observation as for Google Sheets: the wrapper forwards props, but todoist.jsx does not react to isdark. Users on dark themes will get a red square with poor contrast.

Recommend updating the SVG component to honour isdark.

src/backend/base/langflow/components/composio/googletasks_composio.py (1)

4-9: Add missing description attribute for consistency.

The component structure looks good, but it's missing the description attribute that other Composio components have for consistency.

 class ComposioGoogleTasksAPIComponent(ComposioBaseComponent):
     display_name: str = "Google Tasks"
+    description: str = "Google Tasks API"
     icon = "GoogleTasks"
     documentation: str = "https://docs.composio.dev"
     app_name = "googletasks"
⛔ Skipped due to learnings
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/backend_development.mdc:0-0
Timestamp: 2025-06-30T14:39:17.428Z
Learning: Applies to src/backend/tests/unit/components/**/*.py : Create comprehensive unit tests for all new components
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-06-30T14:41:58.837Z
Learning: Applies to src/backend/tests/**/*.py : Inherit from the appropriate ComponentTestBase class ('ComponentTestBase', 'ComponentTestBaseWithClient', or 'ComponentTestBaseWithoutClient') and provide the required fixtures: 'component_class', 'default_kwargs', and 'file_names_mapping' when adding a new component test.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-06-30T14:41:58.837Z
Learning: Applies to {src/backend/tests/**/*.py,src/frontend/**/*.test.{ts,tsx,js,jsx},src/frontend/**/*.spec.{ts,tsx,js,jsx},tests/**/*.py} : Expected behaviors should be explicitly stated in test docstrings or comments.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-06-30T14:41:58.837Z
Learning: Applies to {src/backend/tests/**/*.py,src/frontend/**/*.test.{ts,tsx,js,jsx},src/frontend/**/*.spec.{ts,tsx,js,jsx},tests/**/*.py} : Create comprehensive unit tests for all new components.
Learnt from: CR
PR: langflow-ai/langflow#0
File: .cursor/rules/icons.mdc:0-0
Timestamp: 2025-06-30T14:40:50.836Z
Learning: Applies to src/backend/**/*component*.py : In your Python component class, set the `icon` attribute to a string matching the frontend icon mapping exactly (case-sensitive).
src/backend/base/langflow/components/composio/googlemeet_composio.py (1)

7-7: Icon mapping verified for “Googlemeet”

The icon name “Googlemeet” is consistently defined in the frontend:

  • In src/frontend/src/utils/styleUtils.ts:
    { display_name: "Googlemeet", name: "googlemeet", icon: "Googlemeet" }
    // …
    Googlemeet: "Googlemeet",
  • In src/frontend/src/icons/lazyIconImports.ts:
    Googlemeet: () =>
      import("@/icons/googlemeet").then((mod) => ({
        default: mod.GooglemeetIcon,
      })),

No changes required.

src/frontend/src/icons/lazyIconImports.ts (1)

110-149: LGTM! Icon mappings follow established patterns.

The new icon mappings for Googlemeet, GoogleTasks, Googlesheets, Googlemaps, Todoist, Zoom, Linear, and Reddit all follow the correct lazy loading pattern and maintain consistency with existing entries.

Also applies to: 182-184, 247-248

src/backend/base/langflow/components/composio/__init__.py (1)

5-14: LGTM! Imports follow alphabetical ordering.

The new component imports and exports properly follow alphabetical ordering as required by the coding guidelines, and maintain consistency with the existing pattern.

Also applies to: 21-30

src/backend/base/langflow/components/composio/slack_composio.py (1)

4-12: LGTM! Refactoring aligns with architectural changes.

The component has been appropriately stripped down to a minimal skeleton, consistent with the broader refactoring that moves detailed implementation logic to the base component.

src/frontend/src/utils/styleUtils.ts (1)

234-276: LGTM! Sidebar bundles and icon mappings properly integrated.

The new entries in SIDEBAR_BUNDLES and nodeIconToDisplayIconMap follow the established patterns and properly integrate the new Composio components into the frontend UI system.

Also applies to: 356-402

src/backend/base/langflow/components/composio/googlecalendar_composio.py (1)

6-6: Icon name “Googlecalendar” matches frontend mapping
The backend icon = "Googlecalendar" aligns exactly (case-sensitive) with:

  • src/frontend/src/utils/styleUtils.ts → icon: "Googlecalendar"
  • src/frontend/src/icons/googlecalendar/index.tsx → exports GooglecalendarIcon
  • src/frontend/src/icons/lazyIconImports.ts → key Googlecalendar

No changes required.

src/backend/base/langflow/base/composio/composio_base.py (5)

5-6: LGTM! SDK migration looks correct.

The migration from deprecated SDK classes to the new Composio client with LangchainProvider aligns with the dependency updates in pyproject.toml.


73-84: Good refactoring to prevent shared state issues.

Moving mutable attributes from class-level to instance variables is the correct approach to avoid state sharing between component instances.


87-89: Good defensive programming practice.

Adding None handling prevents potential AttributeError when execute_action returns None.


908-921: Good documentation update for enabled_tools property.

The updated docstring clearly explains how the property exposes all action keys for autonomous agents without UI selection.


1004-1015: Good error handling in post-processor.

The method properly handles exceptions and logs errors while gracefully falling back to raw data.

Comment thread src/frontend/src/icons/reddit/index.tsx Outdated
Comment on lines +4 to +9
export const RedditIcon = forwardRef<
SVGSVGElement,
React.PropsWithChildren<{}>
>((props, ref) => {
return <RedditIconSVG ref={ref} {...props} />;
}); No newline at end of file
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Add dark mode support by forwarding the isdark prop.

The coding guidelines require custom SVG icon components to support both light and dark mode by accepting an isdark prop. The current implementation doesn't forward this prop to the underlying SVG component.

Apply this diff to forward the isdark prop:

>((props, ref) => {
-  return <RedditIconSVG ref={ref} {...props} />;
+  return <RedditIconSVG ref={ref} isdark={props.isdark} {...props} />;
});
📝 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
export const RedditIcon = forwardRef<
SVGSVGElement,
React.PropsWithChildren<{}>
>((props, ref) => {
return <RedditIconSVG ref={ref} {...props} />;
});
export const RedditIcon = forwardRef<
SVGSVGElement,
React.PropsWithChildren<{}>
>((props, ref) => {
return <RedditIconSVG ref={ref} isdark={props.isdark} {...props} />;
});
🧰 Tools
🪛 Biome (1.9.4)

[error] 6-6: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)

🤖 Prompt for AI Agents
In src/frontend/src/icons/reddit/index.tsx around lines 4 to 9, the RedditIcon
component does not forward the `isdark` prop to the underlying RedditIconSVG
component, which is required for dark mode support. Update the component to
explicitly accept the `isdark` prop and pass it along with other props to
RedditIconSVG, ensuring the icon can render correctly in both light and dark
modes.

Comment thread src/frontend/src/icons/linear/index.tsx Outdated
Comment on lines +4 to +9
export const LinearIcon = forwardRef<
SVGSVGElement,
React.PropsWithChildren<{}>
>((props, ref) => {
return <LinearIconSVG ref={ref} {...props} />;
}); No newline at end of file
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Add dark mode support by forwarding the isdark prop.

The coding guidelines require custom SVG icon components to support both light and dark mode. Forward the isdark prop to the underlying SVG component.

Apply this diff:

>((props, ref) => {
-  return <LinearIconSVG ref={ref} {...props} />;
+  return <LinearIconSVG ref={ref} isdark={props.isdark} {...props} />;
});
🧰 Tools
🪛 Biome (1.9.4)

[error] 6-6: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)

🤖 Prompt for AI Agents
In src/frontend/src/icons/linear/index.tsx around lines 4 to 9, the LinearIcon
component does not forward the isdark prop to the underlying LinearIconSVG
component, which is required for dark mode support. Update the component to
explicitly accept an isdark prop and pass it along with other props to
LinearIconSVG, ensuring the dark mode styling can be applied correctly.

Comment on lines +1 to +13
const RedditIconSVG = (props) => (
<svg viewBox="0 0 16 16" width="23px" height="23px" {...props}>
<path
fill="#fe3155"
d="M8,0c4.418,0,8,3.582,8,8s-3.582,8-8,8s-8-3.582-8-8S3.582,0,8,0z"
/>
<path
fill="#fff"
d="M12.124,6.875c-0.285,0.009-0.558,0.127-0.766,0.324c-0.911-0.62-1.98-0.96-3.08-0.984l0.52-2.496 l1.711,0.36c0.047,0.44,0.442,0.758,0.882,0.711c0.438-0.049,0.756-0.442,0.709-0.882c-0.047-0.44-0.442-0.758-0.88-0.709 c-0.253,0.025-0.48,0.173-0.605,0.391l-1.96-0.391C8.522,3.167,8.387,3.251,8.358,3.387c0,0.002,0,0.002,0,0.004L7.767,6.167 c-1.113,0.016-2.198,0.36-3.12,0.984c-0.469-0.442-1.209-0.42-1.651,0.051c-0.442,0.471-0.42,1.209,0.053,1.651 c0.091,0.085,0.196,0.16,0.313,0.211c-0.007,0.118-0.007,0.235,0,0.353c0,1.791,2.089,3.249,4.664,3.249 c2.576,0,4.664-1.456,4.664-3.249c0.007-0.118,0.007-0.234,0-0.353c0.402-0.2,0.655-0.615,0.645-1.064 C13.311,7.356,12.771,6.853,12.124,6.875z M5.335,8.8c0-0.442,0.358-0.8,0.802-0.8c0.442,0,0.8,0.358,0.8,0.8s-0.358,0.8-0.8,0.8 S5.335,9.242,5.335,8.8z M9.971,11C9.616,11.328,8.988,11.616,8,11.616S6.384,11.328,6.029,11c-0.073-0.067-0.062-0.227,0.031-0.304 c0.078-0.065,0.193-0.065,0.275,0c0.48,0.353,1.07,0.48,1.665,0.48s1.185-0.127,1.665-0.48c0.082-0.065,0.196-0.065,0.275,0 C10.033,10.773,10.044,10.933,9.971,11z M9.842,9.6C9.4,9.6,9.04,9.242,9.04,8.8C9.042,8.358,9.4,8,9.842,8 c0.442,0,0.8,0.358,0.8,0.8S10.284,9.6,9.842,9.6z"
/>
</svg>
);
export default RedditIconSVG; No newline at end of file
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Implement dark mode support using the isdark prop.

The coding guidelines require custom SVG icon components to support both light and dark mode. The current implementation uses hardcoded colors that don't adapt to the theme.

Apply this diff to add dark mode support:

-const RedditIconSVG = (props) => (
+const RedditIconSVG = ({ isdark, ...props }) => (
    <svg viewBox="0 0 16 16" width="23px" height="23px" {...props}>
      <path
-        fill="#fe3155"
+        fill={isdark ? "#fe3155" : "#fe3155"}
        d="M8,0c4.418,0,8,3.582,8,8s-3.582,8-8,8s-8-3.582-8-8S3.582,0,8,0z"
      />
      <path
-        fill="#fff"
+        fill={isdark ? "#000" : "#fff"}
        d="M12.124,6.875c-0.285,0.009-0.558,0.127-0.766,0.324c-0.911-0.62-1.98-0.96-3.08-0.984l0.52-2.496	l1.711,0.36c0.047,0.44,0.442,0.758,0.882,0.711c0.438-0.049,0.756-0.442,0.709-0.882c-0.047-0.44-0.442-0.758-0.88-0.709	c-0.253,0.025-0.48,0.173-0.605,0.391l-1.96-0.391C8.522,3.167,8.387,3.251,8.358,3.387c0,0.002,0,0.002,0,0.004L7.767,6.167	c-1.113,0.016-2.198,0.36-3.12,0.984c-0.469-0.442-1.209-0.42-1.651,0.051c-0.442,0.471-0.42,1.209,0.053,1.651	c0.091,0.085,0.196,0.16,0.313,0.211c-0.007,0.118-0.007,0.235,0,0.353c0,1.791,2.089,3.249,4.664,3.249	c2.576,0,4.664-1.456,4.664-3.249c0.007-0.118,0.007-0.234,0-0.353c0.402-0.2,0.655-0.615,0.645-1.064	C13.311,7.356,12.771,6.853,12.124,6.875z M5.335,8.8c0-0.442,0.358-0.8,0.802-0.8c0.442,0,0.8,0.358,0.8,0.8s-0.358,0.8-0.8,0.8	S5.335,9.242,5.335,8.8z M9.971,11C9.616,11.328,8.988,11.616,8,11.616S6.384,11.328,6.029,11c-0.073-0.067-0.062-0.227,0.031-0.304	c0.078-0.065,0.193-0.065,0.275,0c0.48,0.353,1.07,0.48,1.665,0.48s1.185-0.127,1.665-0.48c0.082-0.065,0.196-0.065,0.275,0	C10.033,10.773,10.044,10.933,9.971,11z M9.842,9.6C9.4,9.6,9.04,9.242,9.04,8.8C9.042,8.358,9.4,8,9.842,8	c0.442,0,0.8,0.358,0.8,0.8S10.284,9.6,9.842,9.6z"
      />
    </svg>
  );
📝 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
const RedditIconSVG = (props) => (
<svg viewBox="0 0 16 16" width="23px" height="23px" {...props}>
<path
fill="#fe3155"
d="M8,0c4.418,0,8,3.582,8,8s-3.582,8-8,8s-8-3.582-8-8S3.582,0,8,0z"
/>
<path
fill="#fff"
d="M12.124,6.875c-0.285,0.009-0.558,0.127-0.766,0.324c-0.911-0.62-1.98-0.96-3.08-0.984l0.52-2.496 l1.711,0.36c0.047,0.44,0.442,0.758,0.882,0.711c0.438-0.049,0.756-0.442,0.709-0.882c-0.047-0.44-0.442-0.758-0.88-0.709 c-0.253,0.025-0.48,0.173-0.605,0.391l-1.96-0.391C8.522,3.167,8.387,3.251,8.358,3.387c0,0.002,0,0.002,0,0.004L7.767,6.167 c-1.113,0.016-2.198,0.36-3.12,0.984c-0.469-0.442-1.209-0.42-1.651,0.051c-0.442,0.471-0.42,1.209,0.053,1.651 c0.091,0.085,0.196,0.16,0.313,0.211c-0.007,0.118-0.007,0.235,0,0.353c0,1.791,2.089,3.249,4.664,3.249 c2.576,0,4.664-1.456,4.664-3.249c0.007-0.118,0.007-0.234,0-0.353c0.402-0.2,0.655-0.615,0.645-1.064 C13.311,7.356,12.771,6.853,12.124,6.875z M5.335,8.8c0-0.442,0.358-0.8,0.802-0.8c0.442,0,0.8,0.358,0.8,0.8s-0.358,0.8-0.8,0.8 S5.335,9.242,5.335,8.8z M9.971,11C9.616,11.328,8.988,11.616,8,11.616S6.384,11.328,6.029,11c-0.073-0.067-0.062-0.227,0.031-0.304 c0.078-0.065,0.193-0.065,0.275,0c0.48,0.353,1.07,0.48,1.665,0.48s1.185-0.127,1.665-0.48c0.082-0.065,0.196-0.065,0.275,0 C10.033,10.773,10.044,10.933,9.971,11z M9.842,9.6C9.4,9.6,9.04,9.242,9.04,8.8C9.042,8.358,9.4,8,9.842,8 c0.442,0,0.8,0.358,0.8,0.8S10.284,9.6,9.842,9.6z"
/>
</svg>
);
export default RedditIconSVG;
const RedditIconSVG = ({ isdark, ...props }) => (
<svg viewBox="0 0 16 16" width="23px" height="23px" {...props}>
<path
fill={isdark ? "#fe3155" : "#fe3155"}
d="M8,0c4.418,0,8,3.582,8,8s-3.582,8-8,8s-8-3.582-8-8S3.582,0,8,0z"
/>
<path
fill={isdark ? "#000" : "#fff"}
d="M12.124,6.875c-0.285,0.009-0.558,0.127-0.766,0.324c-0.911-0.62-1.98-0.96-3.08-0.984l0.52-2.496 l1.711,0.36c0.047,0.44,0.442,0.758,0.882,0.711c0.438-0.049,0.756-0.442,0.709-0.882c-0.047-0.44-0.442-0.758-0.88-0.709 c-0.253,0.025-0.48,0.173-0.605,0.391l-1.96-0.391C8.522,3.167,8.387,3.251,8.358,3.387c0,0.002,0,0.002,0,0.004L7.767,6.167 c-1.113,0.016-2.198,0.36-3.12,0.984c-0.469-0.442-1.209-0.42-1.651,0.051c-0.442,0.471-0.42,1.209,0.053,1.651 c0.091,0.085,0.196,0.16,0.313,0.211c-0.007,0.118-0.007,0.235,0,0.353c0,1.791,2.089,3.249,4.664,3.249 c2.576,0,4.664-1.456,4.664-3.249c0.007-0.118,0.007-0.234,0-0.353c0.402-0.2,0.655-0.615,0.645-1.064 C13.311,7.356,12.771,6.853,12.124,6.875z M5.335,8.8c0-0.442,0.358-0.8,0.802-0.8c0.442,0,0.8,0.358,0.8,0.8s-0.358,0.8-0.8,0.8 S5.335,9.242,5.335,8.8z M9.971,11C9.616,11.328,8.988,11.616,8,11.616S6.384,11.328,6.029,11c-0.073-0.067-0.062-0.227,0.031-0.304 c0.078-0.065,0.193-0.065,0.275,0c0.48,0.353,1.07,0.48,1.665,0.48s1.185-0.127,1.665-0.48c0.082-0.065,0.196-0.065,0.275,0 C10.033,10.773,10.044,10.933,9.971,11z M9.842,9.6C9.4,9.6,9.04,9.242,9.04,8.8C9.042,8.358,9.4,8,9.842,8 c0.442,0,0.8,0.358,0.8,0.8S10.284,9.6,9.842,9.6z"
/>
</svg>
);
export default RedditIconSVG;
🤖 Prompt for AI Agents
In src/frontend/src/icons/reddit/reddit.jsx lines 1 to 13, the SVG icon uses
hardcoded fill colors that do not adapt to dark mode. Modify the component to
accept an 'isdark' prop and conditionally set the fill colors based on its
value, using appropriate colors for light and dark themes instead of fixed hex
codes. Update the fill attributes in the <path> elements to use these
conditional colors so the icon supports both modes.

Comment on lines +4 to +9
export const GooglemapsIcon = forwardRef<
SVGSVGElement,
React.PropsWithChildren<{}>
>((props, ref) => {
return <GooglemapsIconSVG ref={ref} {...props} />;
});
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Add dark mode support by forwarding the isdark prop.

The coding guidelines require custom SVG icon components to support both light and dark mode. Forward the isdark prop to the underlying SVG component.

Apply this diff:

>((props, ref) => {
-  return <GooglemapsIconSVG ref={ref} {...props} />;
+  return <GooglemapsIconSVG ref={ref} isdark={props.isdark} {...props} />;
});
📝 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
export const GooglemapsIcon = forwardRef<
SVGSVGElement,
React.PropsWithChildren<{}>
>((props, ref) => {
return <GooglemapsIconSVG ref={ref} {...props} />;
});
export const GooglemapsIcon = forwardRef<
SVGSVGElement,
React.PropsWithChildren<{}>
>((props, ref) => {
return <GooglemapsIconSVG ref={ref} isdark={props.isdark} {...props} />;
});
🧰 Tools
🪛 Biome (1.9.4)

[error] 6-6: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)

🤖 Prompt for AI Agents
In src/frontend/src/icons/googlemaps/index.tsx around lines 4 to 9, the
GooglemapsIcon component does not forward the isdark prop to the underlying SVG
component, which is required for dark mode support. Update the component to
accept an isdark prop and pass it along with other props to GooglemapsIconSVG to
enable dark mode styling.

Comment thread src/frontend/src/icons/zoom/index.tsx Outdated
Comment on lines +4 to +9
export const ZoomIcon = forwardRef<
SVGSVGElement,
React.PropsWithChildren<{}>
>((props, ref) => {
return <ZoomIconSVG ref={ref} {...props} />;
}); No newline at end of file
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Add dark mode support by forwarding the isdark prop.

The coding guidelines require custom SVG icon components to support both light and dark mode. Forward the isdark prop to the underlying SVG component.

Apply this diff:

>((props, ref) => {
-  return <ZoomIconSVG ref={ref} {...props} />;
+  return <ZoomIconSVG ref={ref} isdark={props.isdark} {...props} />;
});
📝 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
export const ZoomIcon = forwardRef<
SVGSVGElement,
React.PropsWithChildren<{}>
>((props, ref) => {
return <ZoomIconSVG ref={ref} {...props} />;
});
export const ZoomIcon = forwardRef<
SVGSVGElement,
React.PropsWithChildren<{}>
>((props, ref) => {
- return <ZoomIconSVG ref={ref} {...props} />;
+ return <ZoomIconSVG ref={ref} isdark={props.isdark} {...props} />;
});
🧰 Tools
🪛 Biome (1.9.4)

[error] 6-6: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)

🤖 Prompt for AI Agents
In src/frontend/src/icons/zoom/index.tsx around lines 4 to 9, the ZoomIcon
component does not forward the isdark prop to the underlying ZoomIconSVG
component, which is required for dark mode support. Modify the component to
accept an isdark prop and pass it along with other props to ZoomIconSVG,
ensuring the dark mode styling can be applied correctly.

Comment on lines +178 to +184
if (connection_list and hasattr(connection_list, "items") and connection_list.items and
isinstance(connection_list.items, list) and len(connection_list.items) > 0):
for connection in connection_list.items:
if getattr(connection, "status", None) == "ACTIVE":
has_active_connections = True
break

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix indentation issues.

The indentation is incorrect and makes the code harder to read.

                 if (connection_list and hasattr(connection_list, "items") and connection_list.items and
                     isinstance(connection_list.items, list) and len(connection_list.items) > 0):
-                        for connection in connection_list.items:
-                            if getattr(connection, "status", None) == "ACTIVE":
-                                has_active_connections = True
-                                break
+                    for connection in connection_list.items:
+                        if getattr(connection, "status", None) == "ACTIVE":
+                            has_active_connections = True
+                            break
📝 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
if (connection_list and hasattr(connection_list, "items") and connection_list.items and
isinstance(connection_list.items, list) and len(connection_list.items) > 0):
for connection in connection_list.items:
if getattr(connection, "status", None) == "ACTIVE":
has_active_connections = True
break
if (connection_list and hasattr(connection_list, "items") and connection_list.items and
isinstance(connection_list.items, list) and len(connection_list.items) > 0):
for connection in connection_list.items:
if getattr(connection, "status", None) == "ACTIVE":
has_active_connections = True
break
🧰 Tools
🪛 Flake8 (7.2.0)

[error] 179-179: visually indented line with same indent as next logical line

(E129)


[error] 180-180: over-indented

(E117)

🤖 Prompt for AI Agents
In src/backend/base/langflow/components/composio/composio_api.py around lines
178 to 184, the indentation of the if statement and the for loop is inconsistent
and reduces readability. Adjust the indentation so that the if condition and the
for loop are properly aligned and nested according to Python standards, ensuring
all blocks are indented uniformly to improve clarity.

Comment on lines +378 to +577
def _validate_schema_inputs(self, action_key: str) -> list[InputTypes]:
"""Convert the JSON schema for *action_key* into Langflow input objects."""
schema_dict = self._action_schemas.get(action_key)
if not schema_dict:
logger.warning(f"No schema found for action key: {action_key}")
return []

try:
parameters_schema = schema_dict.get("input_parameters", {})
if parameters_schema is None:
logger.warning(f"Parameters schema is None for action key: {action_key}")
return []

# Check if parameters_schema has the expected structure
if not isinstance(parameters_schema, dict):
logger.warning(
f"Parameters schema is not a dict for action key: {action_key}, got: {type(parameters_schema)}"
)
return []

# Validate parameters_schema has required structure before flattening
if not parameters_schema.get("properties") and not parameters_schema.get("$defs"):
# Create a minimal valid schema to avoid errors
parameters_schema = {"type": "object", "properties": {}}

# Sanitize the schema before passing to flatten_schema
# Handle case where 'required' is explicitly None (causes "'NoneType' object is not iterable")
if parameters_schema.get("required") is None:
parameters_schema = parameters_schema.copy() # Don't modify the original
parameters_schema["required"] = []

try:
# Preserve original descriptions before flattening to restore if lost
original_descriptions = {}
original_props = parameters_schema.get("properties", {})
for prop_name, prop_schema in original_props.items():
if isinstance(prop_schema, dict) and "description" in prop_schema:
original_descriptions[prop_name] = prop_schema["description"]

flat_schema = flatten_schema(parameters_schema)

# Restore lost descriptions in flattened schema
if flat_schema and isinstance(flat_schema, dict) and "properties" in flat_schema:
flat_props = flat_schema["properties"]
for field_name, field_schema in flat_props.items():
# Check if this field lost its description during flattening
if isinstance(field_schema, dict) and "description" not in field_schema:
# Try to find the original description
# Handle array fields like bcc[0] -> bcc
base_field_name = field_name.replace("[0]", "")
if base_field_name in original_descriptions:
field_schema["description"] = original_descriptions[base_field_name]
elif field_name in original_descriptions:
field_schema["description"] = original_descriptions[field_name]
except (KeyError, TypeError, ValueError) as flatten_error:
logger.error(f"flatten_schema failed for {action_key}: {flatten_error}")
return []

if flat_schema is None:
logger.warning(f"Flat schema is None for action key: {action_key}")
return []

# Additional check for flat_schema structure
if not isinstance(flat_schema, dict):
logger.warning(f"Flat schema is not a dict for action key: {action_key}, got: {type(flat_schema)}")
return []

# Ensure flat_schema has the expected structure for create_input_schema_from_json_schema
if flat_schema.get("type") != "object":
logger.warning(f"Flat schema for {action_key} is not of type 'object', got: {flat_schema.get('type')}")
# Fix the schema type if it's missing
flat_schema["type"] = "object"

if "properties" not in flat_schema:
flat_schema["properties"] = {}

# Clean up field names - remove [0] suffixes from array fields
cleaned_properties = {}
attachment_related_fields = set() # Track fields that are attachment-related

for field_name, field_schema in flat_schema.get("properties", {}).items():
# Remove [0] suffix from field names (e.g., "bcc[0]" -> "bcc", "cc[0]" -> "cc")
clean_field_name = field_name.replace("[0]", "")

# Check if this field is attachment-related (contains "attachment." prefix)
if clean_field_name.lower().startswith("attachment."):
attachment_related_fields.add(clean_field_name)
# Don't add individual attachment sub-fields to the schema
continue

# Handle conflicting field names - rename user_id to avoid conflicts with entity_id
if clean_field_name == "user_id":
clean_field_name = f"{self.app_name}_user_id"
# Update the field schema description to reflect the name change
field_schema_copy = field_schema.copy()
field_schema_copy["description"] = f"User ID for {self.app_name.title()}: " + field_schema["description"] #noqa: E501
else:
# Use the original field schema for all other fields
field_schema_copy = field_schema

# Preserve the full schema information, not just the type
cleaned_properties[clean_field_name] = field_schema_copy

# If we found attachment-related fields, add a single "attachment" field
if attachment_related_fields:
# Create a generic attachment field schema
attachment_schema = {
"type": "string",
"description": "File attachment for the email",
"title": "Attachment"
}
cleaned_properties["attachment"] = attachment_schema

# Update the flat schema with cleaned field names
flat_schema["properties"] = cleaned_properties

# Also update required fields to match cleaned names
if flat_schema.get("required"):
cleaned_required = [field.replace("[0]", "") for field in flat_schema["required"]]
flat_schema["required"] = cleaned_required

input_schema = create_input_schema_from_json_schema(flat_schema)
if input_schema is None:
logger.warning(f"Input schema is None for action key: {action_key}")
return []

# Additional safety check before calling schema_to_langflow_inputs
if not hasattr(input_schema, "model_fields"):
logger.warning(f"Input schema for {action_key} does not have model_fields attribute")
return []

if input_schema.model_fields is None:
logger.warning(f"Input schema model_fields is None for {action_key}")
return []

result = schema_to_langflow_inputs(input_schema)

# Process inputs to handle attachment fields and set advanced status
if result:
processed_inputs = []
required_fields_set = set(flat_schema.get("required", []))

# Get file upload fields from stored action data
file_upload_fields = self._actions_data.get(action_key, {}).get("file_upload_fields", set())
if attachment_related_fields: # If we consolidated attachment fields
file_upload_fields = file_upload_fields | {"attachment"}

for inp in result:
if hasattr(inp, "name") and inp.name is not None:
# Check if this specific field is a file upload field
if inp.name.lower() in file_upload_fields or inp.name.lower() == "attachment":
# Replace with FileInput for file upload fields
file_input = FileInput(
name=inp.name,
display_name=getattr(inp, "display_name", inp.name.replace("_", " ").title()),
required=inp.name in required_fields_set,
advanced=inp.name not in required_fields_set,
info=getattr(inp, "info", "Upload file for this field"),
show=True,
file_types=[
"csv", "txt", "doc", "docx", "xls", "xlsx", "pdf",
"png", "jpg", "jpeg", "gif", "zip", "rar", "ppt", "pptx"
],
)
processed_inputs.append(file_input)
else:
# Ensure proper display_name and info are set for regular fields
if not hasattr(inp, "display_name") or not inp.display_name:
inp.display_name = inp.name.replace("_", " ").title()

# Preserve description from schema if available
field_schema = flat_schema.get("properties", {}).get(inp.name, {})
schema_description = field_schema.get("description")
current_info = getattr(inp, "info", None)

# Use schema description if available, otherwise keep current info or create from name
if schema_description:
inp.info = schema_description
elif not current_info:
# Fallback: create a basic description from the field name if no description exists
inp.info = f"{inp.name.replace('_', ' ').title()} field"

# Set advanced status for non-file-upload fields
if inp.name not in required_fields_set:
inp.advanced = True

# Skip entity_id being mapped to user_id parameter
if inp.name == "user_id" and getattr(self, "entity_id", None) == getattr(inp, "value", None): #noqa: E501
continue

processed_inputs.append(inp)
else:
processed_inputs.append(inp)

return processed_inputs
return result # noqa: TRY300
except ValueError as e:
logger.warning(f"Error generating inputs for {action_key}: {e}")
return []

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Method complexity needs attention.

Similar to _populate_actions_data, this method has high complexity:

  • 30 local variables
  • 39 branches
  • 97 statements
  • Deep nesting levels

The duplication of schema processing logic between this method and _populate_actions_data (lines 246-280 duplicated at 398-432) suggests both methods should use a shared helper function.

🧰 Tools
🪛 Flake8 (7.2.0)

[error] 378-378: too many blank lines (2)

(E303)


[error] 473-473: at least two spaces before inline comment

(E261)


[error] 473-473: inline comment should start with '# '

(E262)


[error] 565-565: at least two spaces before inline comment

(E261)


[error] 565-565: inline comment should start with '# '

(E262)

🪛 Pylint (3.3.7)

[refactor] 378-378: Too many local variables (30/15)

(R0914)


[refactor] 385-576: Too many nested blocks (6/5)

(R1702)


[refactor] 378-378: Too many return statements (12/6)

(R0911)


[refactor] 378-378: Too many branches (39/12)

(R0912)


[refactor] 378-378: Too many statements (97/50)

(R0915)


[refactor] 385-576: Too many nested blocks (6/5)

(R1702)

🤖 Prompt for AI Agents
In src/backend/base/langflow/base/composio/composio_base.py between lines 378
and 577, the _validate_schema_inputs method is overly complex with many local
variables, branches, and deep nesting, and duplicates schema processing logic
found in _populate_actions_data (lines 246-280). To fix this, refactor by
extracting the duplicated schema processing code into a shared helper function
that both methods can call. This will reduce complexity, improve readability,
and avoid code duplication. Then update _validate_schema_inputs and
_populate_actions_data to use this helper function for schema processing.

Comment on lines +922 to +1003
def execute_action(self):
"""Execute the selected Composio tool."""
composio = self._build_wrapper()
self._populate_actions_data()
self._build_action_maps()

@abstractmethod
def execute_action(self) -> list[dict]:
"""Execute action and return response as Message."""
display_name = (
self.action[0]["name"] if isinstance(getattr(self, "action", None), list) and self.action else self.action
)
action_key = self._display_to_key_map.get(display_name)

if not action_key:
msg = f"Invalid action: {display_name}"
raise ValueError(msg)

try:
arguments: dict[str, Any] = {}
param_fields = self._actions_data.get(action_key, {}).get("action_fields", [])

schema_dict = self._action_schemas.get(action_key, {})
parameters_schema = schema_dict.get("input_parameters", {})
schema_properties = parameters_schema.get("properties", {}) if parameters_schema else {}
# Handle case where 'required' field is None (causes "'NoneType' object is not iterable")
required_list = parameters_schema.get("required", []) if parameters_schema else []
required_fields = set(required_list) if required_list is not None else set()

for field in param_fields:
if not hasattr(self, field):
continue
value = getattr(self, field)

# Skip None, empty strings, and empty lists
if value is None or value == "" or (isinstance(value, list) and len(value) == 0):
continue

# For optional fields, be more strict about including them
# Only include if the user has explicitly provided a meaningful value
if field not in required_fields:
# Get the default value from the schema
field_schema = schema_properties.get(field, {})
schema_default = field_schema.get("default")

# Skip if the current value matches the schema default
if value == schema_default:
continue

logger.debug(f"Field: {field}, Value: {value}, Schema Default: {schema_default}")

# Convert comma-separated to list for array parameters (heuristic)
prop_schema = schema_properties.get(field, {})
if prop_schema.get("type") == "array" and isinstance(value, str):
value = [item.strip() for item in value.split(",")]

if field in self._bool_variables:
value = bool(value)

# Handle renamed fields - map back to original names for API execution
final_field_name = field
if field.endswith("_user_id") and field.startswith(self.app_name):
final_field_name = "user_id"
logger.debug(f"Mapping {field} back to user_id for API execution")

arguments[final_field_name] = value

# Execute using new SDK
result = composio.tools.execute(
slug=action_key,
arguments=arguments,
user_id=self.entity_id,
)

if isinstance(result, dict) and "successful" in result:
if result["successful"]:
raw_data = result.get("data", result)
return self._apply_post_processor(action_key, raw_data)
error_msg = result.get("error", "Tool execution failed")
raise ValueError(error_msg)

except ValueError as e:
logger.error(f"Failed to execute {action_key}: {e}")
raise

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

execute_action return consistency issue.

The method has inconsistent return statements - some return values while others return nothing (implicitly None). All paths should return a value or raise an exception.

Also, the method has high complexity (22 local variables). Consider extracting the argument preparation logic into a separate method.

🧰 Tools
🪛 Pylint (3.3.7)

[refactor] 922-922: Too many local variables (22/15)

(R0914)


[refactor] 922-922: Either all return statements in a function should return an expression, or none of them should.

(R1710)

🤖 Prompt for AI Agents
In src/backend/base/langflow/base/composio/composio_base.py around lines 922 to
1003, the execute_action method has inconsistent return behavior, returning a
processed result on success but implicitly returning None if no successful
result is found or an exception is raised. Refactor the method to ensure all
execution paths either return a value or raise an exception explicitly.
Additionally, extract the argument preparation logic (building the arguments
dictionary from parameters and schema) into a separate helper method to reduce
complexity and improve readability.

Comment on lines +172 to +376
def _populate_actions_data(self):
"""Fetch the list of actions for the toolkit and build helper maps."""
if self._actions_data:
return

if not getattr(self, "api_key", None):
logger.warning("API key is missing. Cannot populate actions data.")
return

try:
composio = self._build_wrapper()
toolkit_slug = self.app_name.lower()

raw_tools = composio.tools.get_raw_composio_tools(toolkits=[toolkit_slug], limit=999)

if not raw_tools:
msg = f"Toolkit '{toolkit_slug}' not found or has no available tools"
raise ValueError(msg)

for raw_tool in raw_tools:
try:
# Convert raw_tool to dict-like structure
tool_dict = raw_tool.__dict__ if hasattr(raw_tool, "__dict__") else raw_tool

if not tool_dict:
logger.warning(f"Tool is None or empty: {raw_tool}")
continue

action_key = tool_dict.get("slug")
if not action_key:
logger.warning(f"Action key (slug) is missing in tool: {tool_dict}")
continue

# Human-friendly display name
display_name = tool_dict.get("name") or tool_dict.get("display_name")
if not display_name:
# Better fallback: convert GMAIL_SEND_EMAIL to "Send Email"
# Remove app prefix and convert to title case
clean_name = action_key
clean_name = clean_name.removeprefix(f"{self.app_name.upper()}_")
# Convert underscores to spaces and title case
display_name = clean_name.replace("_", " ").title()

# Build list of parameter names and track bool fields
parameters_schema = tool_dict.get("input_parameters", {})
if parameters_schema is None:
logger.warning(f"Parameters schema is None for action key: {action_key}")
# Still add the action but with empty fields
self._action_schemas[action_key] = tool_dict
self._actions_data[action_key] = {
"display_name": display_name,
"action_fields": [],
"file_upload_fields": set(),
}
continue

try:
# Special handling for unusual schema structures
if not isinstance(parameters_schema, dict):
# Try to convert if it's a model object
if hasattr(parameters_schema, "model_dump"):
parameters_schema = parameters_schema.model_dump()
elif hasattr(parameters_schema, "__dict__"):
parameters_schema = parameters_schema.__dict__
else:
logger.warning(f"Cannot process parameters schema for {action_key}, skipping")
self._action_schemas[action_key] = tool_dict
self._actions_data[action_key] = {
"display_name": display_name,
"action_fields": [],
"file_upload_fields": set(),
}
continue

# Validate parameters_schema has required structure before flattening
if not parameters_schema.get("properties") and not parameters_schema.get("$defs"):
# Create a minimal valid schema to avoid errors
parameters_schema = {"type": "object", "properties": {}}

# Sanitize the schema before passing to flatten_schema
# Handle case where 'required' is explicitly None (causes "'NoneType' object is not iterable")
if parameters_schema.get("required") is None:
parameters_schema = parameters_schema.copy() # Don't modify the original
parameters_schema["required"] = []

try:
# Preserve original descriptions before flattening to restore if lost
original_descriptions = {}
original_props = parameters_schema.get("properties", {})
for prop_name, prop_schema in original_props.items():
if isinstance(prop_schema, dict) and "description" in prop_schema:
original_descriptions[prop_name] = prop_schema["description"]

flat_schema = flatten_schema(parameters_schema)

# Restore lost descriptions in flattened schema
if flat_schema and isinstance(flat_schema, dict) and "properties" in flat_schema:
flat_props = flat_schema["properties"]
for field_name, field_schema in flat_props.items():
# Check if this field lost its description during flattening
if isinstance(field_schema, dict) and "description" not in field_schema:
# Try to find the original description
# Handle array fields like bcc[0] -> bcc
base_field_name = field_name.replace("[0]", "")
if base_field_name in original_descriptions:
field_schema["description"] = original_descriptions[base_field_name]
elif field_name in original_descriptions:
field_schema["description"] = original_descriptions[field_name]
except (KeyError, TypeError, ValueError):
self._action_schemas[action_key] = tool_dict
self._actions_data[action_key] = {
"display_name": display_name,
"action_fields": [],
"file_upload_fields": set(),
}
continue

if flat_schema is None:
logger.warning(f"Flat schema is None for action key: {action_key}")
# Still add the action but with empty fields so the UI doesn't break
self._action_schemas[action_key] = tool_dict
self._actions_data[action_key] = {
"display_name": display_name,
"action_fields": [],
"file_upload_fields": set(),
}
continue

# Extract field names and detect file upload fields during parsing
raw_action_fields = list(flat_schema.get("properties", {}).keys())
action_fields = []
attachment_related_found = False
file_upload_fields = set()

# Check original schema properties for file_uploadable fields
original_props = parameters_schema.get("properties", {})
for field_name, field_schema in original_props.items():
if isinstance(field_schema, dict):
clean_field_name = field_name.replace("[0]", "")
# Check direct file_uploadable attribute
if field_schema.get("file_uploadable") is True:
file_upload_fields.add(clean_field_name)
logger.debug(f"Found file upload field: {clean_field_name} in {action_key}")

# Check anyOf structures (like OUTLOOK_OUTLOOK_SEND_EMAIL)
if "anyOf" in field_schema:
for any_of_item in field_schema["anyOf"]:
if isinstance(any_of_item, dict) and any_of_item.get("file_uploadable") is True:
file_upload_fields.add(clean_field_name)

for field in raw_action_fields:
clean_field = field.replace("[0]", "")
# Check if this field is attachment-related
if clean_field.lower().startswith("attachment."):
attachment_related_found = True
continue # Skip individual attachment fields

# Handle conflicting field names - rename user_id to avoid conflicts with entity_id
if clean_field == "user_id":
clean_field = f"{self.app_name}_user_id"
logger.debug(f"Renamed user_id to {clean_field} to avoid conflict with entity_id")

action_fields.append(clean_field)

# Add consolidated attachment field if we found attachment-related fields
if attachment_related_found:
action_fields.append("attachment")
file_upload_fields.add("attachment") # Attachment fields are also file upload fields

# Track boolean parameters so we can coerce them later
properties = flat_schema.get("properties", {})
if properties:
for p_name, p_schema in properties.items():
if isinstance(p_schema, dict) and p_schema.get("type") == "boolean":
# Use cleaned field name for boolean tracking
clean_field_name = p_name.replace("[0]", "")
self._bool_variables.add(clean_field_name)

self._action_schemas[action_key] = tool_dict
self._actions_data[action_key] = {
"display_name": display_name,
"action_fields": action_fields,
"file_upload_fields": file_upload_fields,
}

except (KeyError, TypeError, ValueError) as flatten_error:
logger.error(f"flatten_schema failed for {action_key}: {flatten_error}")
self._action_schemas[action_key] = tool_dict
self._actions_data[action_key] = {
"display_name": display_name,
"action_fields": [],
"file_upload_fields": set(),
}
continue

except ValueError as e:
logger.warning(f"Failed processing Composio tool for action {raw_tool}: {e}")

# Helper look-ups used elsewhere
self._all_fields = {f for d in self._actions_data.values() for f in d["action_fields"]}
self._build_action_maps()

except ValueError as e:
logger.debug(f"Could not populate Composio actions for {self.app_name}: {e}")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Method is too complex - consider refactoring.

This method has excessive complexity with:

  • 33 local variables (exceeds limit of 15)
  • 39 branches (exceeds limit of 12)
  • 112 statements (exceeds limit of 50)
  • Up to 9 levels of nesting (exceeds limit of 5)

Consider breaking this method into smaller, focused helper methods:

  1. _fetch_raw_tools() - for fetching tools from Composio
  2. _process_tool_metadata() - for extracting action key and display name
  3. _process_parameters_schema() - for schema flattening and field extraction
  4. _identify_file_upload_fields() - for file upload field detection

Would you like me to help refactor this method into smaller, more maintainable functions?

🧰 Tools
🪛 Pylint (3.3.7)

[refactor] 172-172: Too many local variables (33/15)

(R0914)


[refactor] 181-375: Too many nested blocks (6/5)

(R1702)


[refactor] 181-375: Too many nested blocks (7/5)

(R1702)


[refactor] 181-375: Too many nested blocks (9/5)

(R1702)


[refactor] 181-375: Too many nested blocks (9/5)

(R1702)


[refactor] 181-375: Too many nested blocks (6/5)

(R1702)


[refactor] 172-172: Too many branches (39/12)

(R0912)


[refactor] 172-172: Too many statements (112/50)

(R0915)


[refactor] 181-375: Too many nested blocks (7/5)

(R1702)

🤖 Prompt for AI Agents
In src/backend/base/langflow/base/composio/composio_base.py from lines 172 to
376, the _populate_actions_data method is overly complex with too many
variables, branches, statements, and nesting levels. To fix this, refactor the
method by extracting smaller helper methods: one to fetch raw tools
(_fetch_raw_tools), one to process tool metadata like action key and display
name (_process_tool_metadata), one to handle schema flattening and field
extraction (_process_parameters_schema), and one to identify file upload fields
(_identify_file_upload_fields). Then call these helpers in
_populate_actions_data to simplify and clarify the logic.

Comment on lines 637 to 883
def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None) -> dict:
"""Optimized build config updates."""
"""Simplified build config updates."""
# BULLETPROOF tool_mode checking - check all possible places where tool_mode could be stored
instance_tool_mode = getattr(self, "tool_mode", False) if hasattr(self, "tool_mode") else False

# Check build_config for tool_mode in multiple possible structures
build_config_tool_mode = False
if "tool_mode" in build_config:
tool_mode_config = build_config["tool_mode"]
if isinstance(tool_mode_config, dict):
build_config_tool_mode = tool_mode_config.get("value", False)
else:
build_config_tool_mode = bool(tool_mode_config)

# If this is a tool_mode change, update BOTH instance variable AND build_config
if field_name == "tool_mode":
build_config["action"]["show"] = not field_value
self.tool_mode = field_value
instance_tool_mode = field_value
# CRITICAL: Store tool_mode state in build_config so it persists
if "tool_mode" not in build_config:
build_config["tool_mode"] = {}
if isinstance(build_config["tool_mode"], dict):
build_config["tool_mode"]["value"] = field_value
build_config_tool_mode = field_value

# Current tool_mode is True if ANY source indicates it's enabled
current_tool_mode = instance_tool_mode or build_config_tool_mode or (field_name == "tool_mode" and field_value)

# CRITICAL: If tool_mode is enabled from ANY source, immediately hide action field and return
if current_tool_mode:
build_config["action"]["show"] = False

# CRITICAL: Hide ALL action parameter fields when tool mode is enabled
logger.debug(f"Available fields in _all_fields: {list(self._all_fields)}")
logger.debug(f"Available fields in build_config: {list(build_config.keys())}")

hidden_fields = []
for field in self._all_fields:
build_config[field]["show"] = False
if field in build_config:
build_config[field]["show"] = False
hidden_fields.append(field)

# Also hide any other action-related fields that might be in build_config
action_related_fields = []
for field_name_in_config in build_config: #noqa: PLC0206
# Skip base fields like api_key, tool_mode, action, etc.
if field_name_in_config not in ["api_key", "tool_mode", "action", "auth_link", "entity_id"] and isinstance(build_config[field_name_in_config], dict) and "show" in build_config[field_name_in_config]: # noqa: E501
build_config[field_name_in_config]["show"] = False
action_related_fields.append(field_name_in_config)

logger.debug(f"Hidden fields from _all_fields: {hidden_fields}")
logger.debug(f"Hidden action-related fields from build_config: {action_related_fields}")

# ENSURE tool_mode state is preserved in build_config for future calls
if "tool_mode" not in build_config:
build_config["tool_mode"] = {"value": True}
elif isinstance(build_config["tool_mode"], dict):
build_config["tool_mode"]["value"] = True
# Don't proceed with any other logic that might override this
return build_config

# Ensure dynamic action metadata is available whenever we have an API key
if (field_name == "api_key" and field_value) or (self.api_key and not self._actions_data):
self._populate_actions_data()

if field_name == "tool_mode":
logger.error(f"Tool mode changed: field_value={field_value}, field_name={field_name}")
if field_value is True:
build_config["action"]["show"] = False # Hide action field when tool mode is enabled
for field in self._all_fields:
build_config[field]["show"] = False # Update show status for all fields based on tool mode
elif field_value is False:
build_config["action"]["show"] = True # Show action field when tool mode is disabled
for field in self._all_fields:
build_config[field]["show"] = True # Update show status for all fields based on tool mode
return build_config

if field_name == "action":
self._update_action_config(build_config, field_value)
# Keep the existing show/hide behaviour
self.show_hide_fields(build_config, field_value)
if build_config["auth_link"]["value"] == "validated":
return build_config
return build_config

# Handle API key removal
if field_name == "api_key" and len(field_value) == 0:
build_config["auth_link"]["value"] = ""
build_config["auth_link"]["auth_tooltip"] = "Please provide a valid Composio API Key."
build_config["action"]["options"] = []
build_config["action"]["helper_text"] = "Please connect before selecting actions."
build_config["action"]["helper_text_metadata"] = {"variant": "destructive"}
return build_config

# Only proceed with connection logic if we have an API key
if not hasattr(self, "api_key") or not self.api_key:
return build_config

# Build the action maps before using them
self._build_action_maps()
# CRITICAL: If tool_mode is enabled (check both instance and build_config), skip all connection logic
if current_tool_mode:
build_config["action"]["show"] = False
return build_config

# Update the action options
# Update action options only if tool_mode is disabled
self._build_action_maps()
build_config["action"]["options"] = [
{
"name": self.sanitize_action_name(action),
"metadata": action,
}
{"name": self.sanitize_action_name(action), "metadata": action}
for action in self._actions_data
]
# Only set show=True if tool_mode is not enabled
if not current_tool_mode:
build_config["action"]["show"] = True

try:
toolset = self._build_wrapper()
entity = toolset.client.get_entity(id=self.entity_id)
toolkit_slug = self.app_name.lower()

# Handle disconnection first (if user clicked disconnect)
if field_name == "auth_link" and field_value == "disconnect":
try:
connections = toolset.connected_accounts.list(user_ids=[self.entity_id], toolkit_slugs=[toolkit_slug]) #noqa: E501
# Validate response structure before accessing items
if connections and hasattr(connections, "items") and connections.items:
if isinstance(connections.items, list) and len(connections.items) > 0:
# Find the first ACTIVE connection to disconnect
active_connection = None
for connection in connections.items:
if getattr(connection, "status", None) == "ACTIVE":
active_connection = connection
break

if active_connection:
connection_id = getattr(active_connection, "id", None)
if connection_id:
toolset.connected_accounts.delete(nanoid=connection_id)
logger.info(f"Disconnected ACTIVE connection from {toolkit_slug}")
else:
logger.warning(f"ACTIVE connection found but no ID available for {toolkit_slug}")
else:
logger.warning(f"Found {len(connections.items)} connection(s) for {toolkit_slug}, but none are ACTIVE to disconnect") #noqa: E501
else:
logger.warning(f"No connections to disconnect for {toolkit_slug}")
else:
logger.warning(f"Invalid connection response structure for {toolkit_slug}")

# After disconnection, fall through to check connection status
except ValueError as e:
logger.error(f"Error disconnecting: {e}")
build_config["auth_link"]["value"] = "error"
build_config["auth_link"]["auth_tooltip"] = f"Disconnect failed: {e!s}"
return build_config

# Check current connection status and set appropriate auth_link value
try:
entity.get_connection(app=self.app_name)
build_config["auth_link"]["value"] = "validated"
build_config["auth_link"]["auth_tooltip"] = "Disconnect"
build_config["action"]["helper_text"] = None
build_config["action"]["helper_text_metadata"] = {}
except NoItemsFound:
auth_scheme = self._get_auth_scheme(self.app_name)
if auth_scheme and auth_scheme.auth_mode == "OAUTH2":
connection_list = toolset.connected_accounts.list(
user_ids=[self.entity_id],
toolkit_slugs=[toolkit_slug]
)

# Validate response structure and check for valid connections
has_active_connections = False
if connection_list and hasattr(connection_list, "items") and connection_list.items:
# Check if items is a list and has valid connections
if isinstance(connection_list.items, list) and len(connection_list.items) > 0:
# Check if any connection has status 'ACTIVE'
active_connections = []
for connection in connection_list.items:
connection_status = getattr(connection, "status", None)
if connection_status == "ACTIVE":
active_connections.append(connection)

if active_connections:
has_active_connections = True
logger.debug(
f"Found {len(active_connections)} ACTIVE connection(s) out of {len(connection_list.items)} total for {toolkit_slug}" #noqa: E501
)
else:
logger.debug(
f"Found {len(connection_list.items)} connection(s) for {toolkit_slug}, but none are ACTIVE" #noqa: E501
)
else:
logger.debug(f"No valid connections found for {toolkit_slug}: items is not a valid list")
else:
logger.debug(f"No connections found for {toolkit_slug}: invalid response structure")

if has_active_connections:
# User has active connection
build_config["auth_link"]["value"] = "validated"
build_config["auth_link"]["auth_tooltip"] = "Disconnect"
build_config["action"]["helper_text"] = ""
build_config["action"]["helper_text_metadata"] = {}
else:
# No active connection - create OAuth connection and set redirect URL immediately
try:
build_config["auth_link"]["value"] = self._initiate_default_connection(entity, self.app_name)
logger.info(f"No active connection found. Creating OAuth connection for {toolkit_slug}...")
connection = toolset.toolkits.authorize(user_id=self.entity_id, toolkit=toolkit_slug)

# Get the redirect URL
redirect_url = getattr(connection, "redirect_url", None)
if not redirect_url:
# Try accessing it as a property or method
if hasattr(connection, "redirect_url"):
redirect_url = connection.redirect_url
else:
error_message = "No redirect URL received from Composio"
raise ValueError(error_message)

# Validate the URL format
if not redirect_url.startswith(("http://", "https://")):
message = f"Invalid redirect URL format: {redirect_url}"
raise ValueError(message)

# Log the URL for debugging and manual use if needed
logger.info(f"🔗 Composio OAuth URL for {toolkit_slug}: {redirect_url}")

# Set the redirect URL directly - like the old implementation
build_config["auth_link"]["value"] = redirect_url
build_config["auth_link"]["auth_tooltip"] = "Connect"
except (ValueError, ConnectionError, ApiKeyError) as e:
build_config["auth_link"]["value"] = "disabled"
build_config["action"]["helper_text"] = "Please connect before selecting actions."
build_config["action"]["helper_text_metadata"] = {"variant": "destructive"}
except ValueError as e:
logger.error(f"Error creating OAuth connection: {e}")
build_config["auth_link"]["value"] = "connect"
build_config["auth_link"]["auth_tooltip"] = f"Error: {e!s}"
logger.error(f"Error checking auth status: {e}")
build_config["action"]["helper_text"] = "Please connect before selecting actions."
build_config["action"]["helper_text_metadata"] = {"variant": "destructive"}

except ValueError as e:
logger.error(f"Error checking connection status for {toolkit_slug}: {e}")
# Default to disconnected state on error
build_config["auth_link"]["value"] = "connect"
build_config["auth_link"]["auth_tooltip"] = "Connect"
build_config["action"]["helper_text"] = "Please connect before selecting actions."
build_config["action"]["helper_text_metadata"] = {"variant": "destructive"}

except (ValueError, ConnectionError) as e:
build_config["auth_link"]["value"] = "error"
build_config["auth_link"]["auth_tooltip"] = f"Error: {e!s}"
logger.error(f"Error checking auth status: {e}")
except ApiKeyError as e:
except ValueError as e:
build_config["auth_link"]["value"] = ""
build_config["auth_link"]["auth_tooltip"] = "Please provide a valid Composio API Key."
build_config["action"]["options"] = []
build_config["action"]["value"] = ""
build_config["action"]["helper_text"] = "Please connect before selecting actions."
build_config["action"]["helper_text_metadata"] = {"variant": "destructive"}
logger.error(f"Error checking auth status: {e}")
logger.error(f"Error in auth flow: {e}")

# Handle disconnection
if field_name == "auth_link" and field_value == "disconnect":
try:
for field in self._all_fields:
build_config[field]["show"] = False
toolset = self._build_wrapper()
entity = toolset.client.get_entity(id=self.entity_id)
self.disconnect_connection(entity, self.app_name)
build_config["auth_link"]["value"] = self._initiate_default_connection(entity, self.app_name)
build_config["auth_link"]["auth_tooltip"] = "Connect"
build_config["action"]["helper_text"] = "Please connect before selecting actions."
build_config["action"]["helper_text_metadata"] = {
"variant": "destructive",
}
build_config["action"]["options"] = []
build_config["action"]["value"] = ""
except (ValueError, ConnectionError, ApiKeyError) as e:
build_config["auth_link"]["value"] = "error"
build_config["auth_link"]["auth_tooltip"] = f"Failed to disconnect from the app: {e}"
logger.error(f"Error disconnecting: {e}")
if field_name == "auth_link" and field_value == "validated":
build_config["action"]["helper_text"] = ""
build_config["action"]["helper_text_metadata"] = {"icon": "Check", "variant": "success"}
# CRITICAL: Final check to ensure action field is hidden when tool_mode is enabled
# This overrides any other logic that might have set it to visible
if self._is_tool_mode_enabled():
build_config["action"]["show"] = False
logger.debug("Final check: Hiding action field because tool_mode is enabled")

return build_config
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

⚠️ Potential issue

Critical: Method is extremely complex and needs major refactoring.

This method has severe complexity issues:

  • 26 local variables
  • 54 branches (4.5x the recommended limit)
  • 154 statements (3x the recommended limit)
  • Multiple deeply nested conditionals

The method is trying to handle too many responsibilities:

  1. Tool mode state management
  2. API key validation
  3. Connection status checking
  4. OAuth flow handling
  5. Build config updates
  6. Action field visibility

Consider extracting these into separate methods:

  • _handle_tool_mode_change()
  • _handle_api_key_change()
  • _check_connection_status()
  • _handle_oauth_flow()
  • _update_action_visibility()
🧰 Tools
🪛 Flake8 (7.2.0)

[error] 681-681: at least two spaces before inline comment

(E261)


[error] 681-681: inline comment should start with '# '

(E262)


[error] 755-755: at least two spaces before inline comment

(E261)


[error] 755-755: inline comment should start with '# '

(E262)


[error] 774-774: at least two spaces before inline comment

(E261)


[error] 774-774: inline comment should start with '# '

(E262)


[error] 809-809: at least two spaces before inline comment

(E261)


[error] 809-809: inline comment should start with '# '

(E262)


[error] 813-813: at least two spaces before inline comment

(E261)


[error] 813-813: inline comment should start with '# '

(E262)

🪛 Pylint (3.3.7)

[refactor] 637-637: Too many local variables (26/15)

(R0914)


[refactor] 748-875: Too many nested blocks (7/5)

(R1702)


[refactor] 748-875: Too many nested blocks (7/5)

(R1702)


[refactor] 748-875: Too many nested blocks (6/5)

(R1702)


[refactor] 748-875: Too many nested blocks (6/5)

(R1702)


[refactor] 637-637: Too many return statements (8/6)

(R0911)


[refactor] 637-637: Too many branches (54/12)

(R0912)


[refactor] 637-637: Too many statements (154/50)

(R0915)

🤖 Prompt for AI Agents
In src/backend/base/langflow/base/composio/composio_base.py between lines 637
and 883, the update_build_config method is overly complex with excessive local
variables, branches, and nested conditionals, making it hard to maintain.
Refactor by extracting distinct responsibilities into separate helper methods:
create _handle_tool_mode_change to manage tool mode state updates and
visibility, _handle_api_key_change for API key validation and related config
updates, _check_connection_status to encapsulate connection status logic,
_handle_oauth_flow for OAuth connection creation and error handling, and
_update_action_visibility to centralize action field show/hide logic. Then
simplify update_build_config by delegating to these methods, reducing complexity
and improving readability.

@github-actions github-actions Bot added enhancement New feature or request and removed enhancement New feature or request labels Jul 10, 2025
@abhishekpatil4
Copy link
Copy Markdown
Contributor Author

Hi @ogabrielluiz , I've updated the PR to include the changes from this PR & and prevent system key (code) removal. However, I'm encountering a different error when loading the GitHub/Slack Component. Could you help me troubleshoot this? Thanks! 🙌🏻

Error:

Error while updating the Component
400: {'error': 'Error building Component: Error creating class: Module custom_component not found. Please install it and try again', 'traceback': 'Traceback (most recent call last):\n File "/Users/abhishek/langflow/src/backend/base/langflow/utils/validate.py", line 276, in prepare_global_scope\n imported_module = importlib.import_module(module_name)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/Users/abhishek/.local/share/uv/python/cpython-3.11.10-macos-aarch64-none/lib/python3.11/importlib/init.py", line 126, in import_module\n return _bootstrap._gcd_import(name[level:], package, level)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "<frozen importlib._bootstrap>", line 1204, in _gcd_import\n File "<frozen importlib._bootstrap>", line 1176, in _find_and_load\n File "<frozen importlib._bootstrap>", line 1140, in _find_and_load_unlocked\nModuleNotFoundError: No module named 'custom_component'\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File "/Users/abhishek/langflow/src/backend/base/langflow/utils/validate.py", line 197, in create_class\n exec_globals = prepare_global_scope(module)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/Users/abhishek/langflow/src/backend/base/langflow/utils/validate.py", line 288, in prepare_global_scope\n raise ModuleNotFoundError(msg) from e\nModuleNotFoundError: Module custom_component not found. Please install it and try again\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File "/Users/abhishek/langflow/src/backend/base/langflow/custom/utils.py", line 475, in build_custom_component_template\n has_template_config = hasattr(custom_component, "template_config")\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/Users/abhishek/langflow/src/backend/base/langflow/custom/custom_component/custom_component.py", line 400, in template_config\n self._template_config = self.build_template_config()\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/Users/abhishek/langflow/src/backend/base/langflow/custom/custom_component/base_component.py", line 106, in build_template_config\n cc_class = eval_custom_component_code(self._code)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/Users/abhishek/langflow/src/backend/base/langflow/custom/eval.py", line 12, in eval_custom_component_code\n return validate.create_class(code, class_name)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/Users/abhishek/langflow/src/backend/base/langflow/utils/validate.py", line 216, in create_class\n raise ValueError(msg) from e\nValueError: Error creating class: Module custom_component not found. Please install it and try again\n'}

Steps to reproduce the issue:

  1. Checkout and Pull changes from this branch
  2. Execute make run_cli cmd.
  3. Look for GitHub & Slack components from Composio and load them
langflow-composio-error.mp4

@edwinjosechittilappilly
Copy link
Copy Markdown
Collaborator

Can you resolve the conflicts, Ideally the tests in main branch are working, Please resolve the conflicts and try again.

@edwinjosechittilappilly
Copy link
Copy Markdown
Collaborator

@abhishekpatil4 can you check which are the test failing again, also check the ruff and lint errors also.

@edwinjosechittilappilly
Copy link
Copy Markdown
Collaborator

@abhishekpatil4 May I know what is pending in this PR?
Idealy lets get this merged this week or before we start. Please test iteratively.

@coderabbitai iteratively nudge the tests that are failing and potential fixes for that.

@Uday-sidagana
Copy link
Copy Markdown
Contributor

Hi @edwinjosechittilappilly,
The test cases seem to be a little flaky — I'm seeing some inconsistencies in test results each time I push changes. I checked the actions on the main branch, and it looks like all the test cases are passing successfully there. I've attached some images for reference showing the inconsistencies. Could you please help me out? Thank you!
Screenshot 2025-08-06 at 3 20 09 PM
Screenshot 2025-08-07 at 23 13 23
Screenshot 2025-08-08 at 00 25 38

@edwinjosechittilappilly
Copy link
Copy Markdown
Collaborator

@italojohnny can you take a look into the tests in this PR?

@edwinjosechittilappilly
Copy link
Copy Markdown
Collaborator

confirmed the tests that are failing in FE and BE are the flaky ones, hence adding the Fast track mode.

@sonarqubecloud
Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
2 Security Hotspots
6.9% Duplication on New Code (required ≤ 3%)

See analysis details on SonarQube Cloud

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

community Pull Request from an external contributor enhancement New feature or request fast-track Skip tests and sends PR into the merge queue javascript Pull requests that update Javascript code lgtm This PR has been approved by a maintainer size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants