mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-25 14:25:02 +00:00
Add full Python workflow execution engine with: Core Executor: - engine.py: WorkflowEngine for running n8n configs - n8n_executor.py: N8N-style workflow execution with connections - node_executor.py: Individual node execution with plugin dispatch - loop_executor.py: Loop node execution with iteration control - execution_order.py: Topological sort for node ordering Schema & Validation: - n8n_schema.py: N8N workflow schema types and validation - n8n_converter.py: Legacy to n8n schema conversion Plugin System: - plugin_loader.py: Dynamic plugin loading - plugin_registry.py: Plugin discovery and registration - plugin_map.json: 116 plugin type mappings Runtime & Context: - runtime.py: Workflow runtime container - input_resolver.py: Binding and coercion resolution - value_helpers.py: Value normalization helpers - workflow_context_builder.py: Runtime context assembly - workflow_config_loader.py: Configuration loading - workflow_engine_builder.py: Engine assembly with dependencies Utilities: - tool_calls_handler.py: LLM tool call handling - tool_runner.py: Tool execution with logging - notification_helpers.py: Slack/Discord notifications - workflow_adapter.py: N8N format handling - workflow_graph.py: Node/edge graph for visualization Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
"""Helpers for normalizing workflow values."""
|
|
|
|
|
|
class ValueHelpers:
|
|
"""Normalize values for workflow helpers."""
|
|
@staticmethod
|
|
def ensure_list(value):
|
|
"""Return a list for any incoming value."""
|
|
if value is None:
|
|
return []
|
|
if isinstance(value, list):
|
|
return value
|
|
if isinstance(value, (tuple, set)):
|
|
return list(value)
|
|
if isinstance(value, str):
|
|
return [line for line in value.splitlines() if line.strip()]
|
|
return [value]
|
|
|
|
@staticmethod
|
|
def coerce_bool(value) -> bool:
|
|
"""Coerce values into booleans."""
|
|
if isinstance(value, bool):
|
|
return value
|
|
if isinstance(value, str):
|
|
lowered = value.strip().lower()
|
|
if lowered in ("true", "yes", "1"):
|
|
return True
|
|
if lowered in ("false", "no", "0", ""):
|
|
return False
|
|
return bool(value)
|
|
|
|
@staticmethod
|
|
def normalize_separator(text):
|
|
"""Normalize escaped separators."""
|
|
if text is None:
|
|
return ""
|
|
if isinstance(text, str):
|
|
return text.replace("\\n", "\n").replace("\\t", "\t")
|
|
return str(text)
|