Skip to content

Conversation

@anthhub
Copy link
Contributor

@anthhub anthhub commented Jan 11, 2026

Summary by CodeRabbit

  • New Features
    • Workflow execution is now customizable via environment variables for polling intervals, execution timeouts, node-level timeouts, and distributed lock TTL.
    • Default node execution timeout increased to 30 minutes.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Jan 11, 2026

📝 Walkthrough

Walkthrough

This PR introduces configuration-driven workflow execution timeouts by adding a new workflow config block with four timeout/interval properties, updating the default node execution timeout from 10 to 30 minutes, and refactoring WorkflowService to use config-backed getters instead of hard-coded constants for all timeout operations.

Changes

Cohort / File(s) Summary
Configuration addition
apps/api/src/modules/config/app.config.ts
Introduces new top-level workflow configuration block with four environment-variable-backed properties: pollIntervalMs (default 1500ms), executionTimeoutMs (default 30 min), nodeExecutionTimeoutMs (default 30 min), and pollLockTtlMs (default 5000ms).
Constants and service refactoring
apps/api/src/modules/workflow/workflow.constants.ts, apps/api/src/modules/workflow/workflow.service.ts
Updates NODE_EXECUTION_TIMEOUT_MS default from 10 to 30 minutes; adds comments indicating configurability. Adds four private config-backed getters to WorkflowService that replace hard-coded constant references throughout polling, timeout checks, and error messages.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • PR #1468: Directly modifies workflow service and execution constants to control polling/execution timeouts; this PR's configuration approach complements that work by externalizing those timeout values.
  • PR #1810: Modifies the same workflow module to add/configure workflow poll, execution, and node timeouts with poll lock TTL; this PR extends that by making those values configuration-driven through environment variables.

Suggested reviewers

  • pftom
  • PerishCode
  • CH1111

Poem

🐰 From constants carved in stone so deep,
The config now takes the leap!
Timeouts dance with flexibility's grace,
While workflows find their rightful pace.
Thirty minutes for nodes to breathe,
Configuration's gentle wreath! ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title check ❓ Inconclusive The title is vague and generic, using non-descriptive phrasing ('chore: update workflow and config files') that fails to convey the main purpose of making workflow timeouts configurable via environment variables. Consider using a more descriptive title that highlights the primary change, such as 'chore: make workflow timeouts configurable via environment variables' or 'chore: add workflow configuration for timeouts and polling intervals'.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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

✨ Finishing touches
  • 📝 Generate docstrings

📜 Recent review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 31c83f2 and ce63065.

📒 Files selected for processing (3)
  • apps/api/src/modules/config/app.config.ts
  • apps/api/src/modules/workflow/workflow.constants.ts
  • apps/api/src/modules/workflow/workflow.service.ts
🧰 Additional context used
📓 Path-based instructions (15)
**/*.{js,ts,jsx,tsx}

📄 CodeRabbit inference engine (.cursorrules)

**/*.{js,ts,jsx,tsx}: Always use optional chaining (?.) when accessing object properties
Always use nullish coalescing (??) or default values for potentially undefined values
Always check array existence before using array methods
Always validate object properties before destructuring
Always use single quotes for string literals in JavaScript/TypeScript code

**/*.{js,ts,jsx,tsx}: Use semicolons at the end of statements
Include spaces around operators (e.g., a + b instead of a+b)
Always use curly braces for control statements
Place opening braces on the same line as their statement

**/*.{js,ts,jsx,tsx}: Group import statements in order: React/framework libraries, third-party libraries, internal modules, relative path imports, type imports, style imports
Sort imports alphabetically within each import group
Leave a blank line between import groups
Extract complex logic into custom hooks
Use functional updates for state (e.g., setCount(prev => prev + 1))
Split complex state into multiple state variables rather than single large objects
Use useReducer for complex state logic instead of multiple useState calls

Files:

  • apps/api/src/modules/workflow/workflow.service.ts
  • apps/api/src/modules/workflow/workflow.constants.ts
  • apps/api/src/modules/config/app.config.ts
**/*.{js,ts,tsx,jsx,py,java,cpp,c,cs,rb,go,rs,php,swift,kt,scala,r,m,mm,sql}

📄 CodeRabbit inference engine (.cursor/rules/00-language-priority.mdc)

**/*.{js,ts,tsx,jsx,py,java,cpp,c,cs,rb,go,rs,php,swift,kt,scala,r,m,mm,sql}: All code comments MUST be written in English
All variable names, function names, class names, and other identifiers MUST use English words
Comments should be concise and explain 'why' rather than 'what'
Use proper grammar and punctuation in comments
Keep comments up-to-date when code changes
Document complex logic, edge cases, and important implementation details
Use clear, descriptive names that indicate purpose
Avoid abbreviations unless they are universally understood

Files:

  • apps/api/src/modules/workflow/workflow.service.ts
  • apps/api/src/modules/workflow/workflow.constants.ts
  • apps/api/src/modules/config/app.config.ts
**/*.{js,ts,tsx,jsx}

📄 CodeRabbit inference engine (.cursor/rules/00-language-priority.mdc)

Use JSDoc style comments for functions and classes in JavaScript/TypeScript

Files:

  • apps/api/src/modules/workflow/workflow.service.ts
  • apps/api/src/modules/workflow/workflow.constants.ts
  • apps/api/src/modules/config/app.config.ts
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (.cursor/rules/01-code-style.mdc)

**/*.{js,jsx,ts,tsx}: Use single quotes for string literals in TypeScript/JavaScript
Always use optional chaining (?.) when accessing object properties in TypeScript/JavaScript
Always use nullish coalescing (??) or default values for potentially undefined values in TypeScript/JavaScript
Always check array existence before using array methods in TypeScript/JavaScript
Validate object properties before destructuring in TypeScript/JavaScript
Use ES6+ features like arrow functions, destructuring, and spread operators in TypeScript/JavaScript
Avoid magic numbers and strings - use named constants in TypeScript/JavaScript
Use async/await instead of raw promises for asynchronous code in TypeScript/JavaScript

Files:

  • apps/api/src/modules/workflow/workflow.service.ts
  • apps/api/src/modules/workflow/workflow.constants.ts
  • apps/api/src/modules/config/app.config.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (.cursor/rules/03-typescript-guidelines.mdc)

**/*.{ts,tsx}: Avoid using any type whenever possible - use unknown type instead with proper type guards
Always define explicit return types for functions, especially for public APIs
Prefer extending existing types over creating entirely new types
Use TypeScript utility types (Partial<T>, Pick<T, K>, Omit<T, K>, Readonly<T>, Record<K, T>) to derive new types
Use union types and intersection types to combine existing types
Always import types explicitly using the import type syntax
Group type imports separately from value imports
Minimize creating local type aliases for imported types

Files:

  • apps/api/src/modules/workflow/workflow.service.ts
  • apps/api/src/modules/workflow/workflow.constants.ts
  • apps/api/src/modules/config/app.config.ts
**/*.{js,ts,jsx,tsx,css,json}

📄 CodeRabbit inference engine (.cursor/rules/04-code-formatting.mdc)

Maximum line length of 100 characters

Files:

  • apps/api/src/modules/workflow/workflow.service.ts
  • apps/api/src/modules/workflow/workflow.constants.ts
  • apps/api/src/modules/config/app.config.ts
**/*.{js,ts,jsx,tsx,css,json,yml,yaml}

📄 CodeRabbit inference engine (.cursor/rules/04-code-formatting.mdc)

Use 2 spaces for indentation, no tabs

Files:

  • apps/api/src/modules/workflow/workflow.service.ts
  • apps/api/src/modules/workflow/workflow.constants.ts
  • apps/api/src/modules/config/app.config.ts
**/*.{js,ts,jsx,tsx,css,json,yml,yaml,md}

📄 CodeRabbit inference engine (.cursor/rules/04-code-formatting.mdc)

No trailing whitespace at the end of lines

Files:

  • apps/api/src/modules/workflow/workflow.service.ts
  • apps/api/src/modules/workflow/workflow.constants.ts
  • apps/api/src/modules/config/app.config.ts
apps/api/src/**/*.{controller,service}.ts

📄 CodeRabbit inference engine (.cursor/rules/06-api-structure.mdc)

Implement proper error handling in API modules

Files:

  • apps/api/src/modules/workflow/workflow.service.ts
**/*.{css,scss,sass,less,js,jsx,ts,tsx}

📄 CodeRabbit inference engine (.cursor/rules/09-design-system.mdc)

**/*.{css,scss,sass,less,js,jsx,ts,tsx}: Primary color (#155EEF) should be used for main brand color in buttons, links, and accents
Error color (#F04438) should be used for error states and destructive actions
Success color (#12B76A) should be used for success states and confirmations
Warning color (#F79009) should be used for warnings and important notifications
Info color (#0BA5EC) should be used for informational elements

Files:

  • apps/api/src/modules/workflow/workflow.service.ts
  • apps/api/src/modules/workflow/workflow.constants.ts
  • apps/api/src/modules/config/app.config.ts
**/*.{tsx,ts}

📄 CodeRabbit inference engine (.cursor/rules/09-i18n-guidelines.mdc)

**/*.{tsx,ts}: Use the translation wrapper component and useTranslation hook in components
Ensure all user-facing text is translatable

Files:

  • apps/api/src/modules/workflow/workflow.service.ts
  • apps/api/src/modules/workflow/workflow.constants.ts
  • apps/api/src/modules/config/app.config.ts
**/*.{tsx,ts,json}

📄 CodeRabbit inference engine (.cursor/rules/09-i18n-guidelines.mdc)

Support dynamic content with placeholders in translations

Files:

  • apps/api/src/modules/workflow/workflow.service.ts
  • apps/api/src/modules/workflow/workflow.constants.ts
  • apps/api/src/modules/config/app.config.ts
**/*.{tsx,ts,jsx,js,vue,css,scss,less}

📄 CodeRabbit inference engine (.cursor/rules/11-ui-design-patterns.mdc)

**/*.{tsx,ts,jsx,js,vue,css,scss,less}: Use the primary blue (#155EEF) for main UI elements, CTAs, and active states
Use red (#F04438) only for errors, warnings, and destructive actions
Use green (#12B76A) for success states and confirmations
Use orange (#F79009) for warning states and important notifications
Use blue (#0BA5EC) for informational elements
Primary buttons should be solid with the primary color
Secondary buttons should have a border with transparent or light background
Danger buttons should use the error color
Use consistent padding, border radius, and hover states for all buttons
Follow fixed button sizes based on their importance and context
Use consistent border radius (rounded-lg) for all cards
Apply light shadows (shadow-sm) for card elevation
Maintain consistent padding inside cards (p-4 or p-6)
Use subtle borders for card separation
Ensure proper spacing between card elements
Apply consistent styling to all form inputs
Use clear visual indicators for focus, hover, and error states in form elements
Apply proper spacing between elements using 8px, 16px, 24px increments
Ensure proper alignment of elements (left, center, or right)
Use responsive layouts that work across different device sizes
Maintain a minimum contrast ratio of 4.5:1 for text

Files:

  • apps/api/src/modules/workflow/workflow.service.ts
  • apps/api/src/modules/workflow/workflow.constants.ts
  • apps/api/src/modules/config/app.config.ts
**/*.{tsx,ts,jsx,js,vue}

📄 CodeRabbit inference engine (.cursor/rules/11-ui-design-patterns.mdc)

**/*.{tsx,ts,jsx,js,vue}: Include appropriate loading states for async actions in buttons
Group related form elements with appropriate spacing
Provide clear validation feedback for forms
Ensure proper labeling and accessibility for form elements
Ensure all interactive elements are keyboard accessible
Include appropriate ARIA attributes for complex components
Provide alternative text for images and icons
Support screen readers with semantic HTML elements

Files:

  • apps/api/src/modules/workflow/workflow.service.ts
  • apps/api/src/modules/workflow/workflow.constants.ts
  • apps/api/src/modules/config/app.config.ts
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (.cursor/rules/08-contributing-guidelines.mdc)

**/*.{ts,tsx,js,jsx}: Follow the TypeScript/JavaScript style guidelines
Ensure code is well-tested and documented

Files:

  • apps/api/src/modules/workflow/workflow.service.ts
  • apps/api/src/modules/workflow/workflow.constants.ts
  • apps/api/src/modules/config/app.config.ts
🧬 Code graph analysis (1)
apps/api/src/modules/workflow/workflow.service.ts (2)
apps/api/src/modules/workflow/workflow.constants.ts (1)
  • WORKFLOW_EXECUTION_CONSTANTS (11-23)
apps/api/src/modules/common/redis.service.ts (1)
  • releaseLock (595-623)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build / Build
🔇 Additional comments (9)
apps/api/src/modules/workflow/workflow.constants.ts (1)

12-22: LGTM! Timeout increase aligns with config-driven approach.

The updated comments clearly document the configurability via environment variables, and the increase of NODE_EXECUTION_TIMEOUT_MS from 10 to 30 minutes provides more breathing room for complex workflow nodes.

apps/api/src/modules/config/app.config.ts (1)

316-328: LGTM! Workflow configuration block is well-structured.

The new workflow configuration section follows the existing patterns in the file and provides clear, descriptive comments for each timeout property. The default values correctly align with the constants defined in workflow.constants.ts.

apps/api/src/modules/workflow/workflow.service.ts (7)

52-90: LGTM! Config-backed getters are well-implemented.

The private getter pattern provides clean separation between configuration and usage, with appropriate fallbacks to the constants. The JSDoc comments clearly explain the purpose of each getter.


307-307: LGTM! Consistent use of config-driven poll interval.

The delay now uses the configurable pollIntervalMs getter instead of a hard-coded value.


605-605: LGTM! Lock TTL now uses configurable value.

The distributed lock TTL is now driven by the pollLockTtlMs getter, allowing runtime configurability.


643-645: LGTM! Timeout check and error message use configurable values.

Both the timeout comparison and the error message now correctly reference executionTimeoutMs, ensuring consistency between behavior and user-facing messages.


713-713: LGTM! Node execution timeout uses configurable value.

The stuck node detection now uses the configurable nodeExecutionTimeoutMs getter.


722-722: LGTM! Error message reflects actual timeout value.

The error message correctly interpolates the nodeExecutionTimeoutMs value, ensuring users see the actual configured timeout.


969-969: LGTM! Poll rescheduling uses configurable interval.

The recursive poll scheduling now uses the configurable pollIntervalMs getter for consistent behavior.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants