Files
metabuilder/workflow/plugins/ts/base.ts
johndoe6345789 7ce8b4ae8a refactor(workflow): convert all plugins to class/struct + factory pattern
- Python: class extending NodeExecutor + factory.py (80+ plugins)
- TypeScript: class implements NodeExecutor + factory.ts (7 groups, 116 classes)
- Go: struct with methods + factory.go (36 plugins)
- Rust: struct impl NodeExecutor trait + factory.rs (54 plugins)
- Mojo: struct + factory.mojo (11 plugins)

All package.json files now include:
- files array listing source files
- metadata.class/struct field
- metadata.entrypoint field

This enables a unified plugin loading system across all languages
with no import side effects (Spring-style DI pattern).

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-22 14:53:04 +00:00

80 lines
2.0 KiB
TypeScript

/**
* Base types and interfaces for TypeScript workflow plugins.
* @packageDocumentation
*/
/**
* Input data passed to plugin execute methods.
*/
export interface ExecuteInputs {
/** The workflow node being executed */
node: {
id: string;
name: string;
type: string;
nodeType: string;
parameters: Record<string, any>;
};
/** Workflow execution context */
context: {
executionId: string;
tenantId: string;
userId: string;
triggerData: Record<string, any>;
variables: Record<string, any>;
};
/** Current execution state with results from previous nodes */
state: Record<string, any>;
}
/**
* Result returned from plugin execute methods.
*/
export interface ExecuteResult {
/** Primary result value */
result?: any;
/** Additional output data */
[key: string]: any;
}
/**
* Interface that all node executor plugins must implement.
*/
export interface NodeExecutor {
/** Unique node type identifier (e.g., 'string.concat', 'math.add') */
readonly nodeType: string;
/** Category for grouping (e.g., 'string', 'math', 'logic') */
readonly category: string;
/** Human-readable description of what this node does */
readonly description: string;
/**
* Execute the plugin logic.
* @param inputs - Input data including node, context, and state
* @param runtime - Optional runtime services (logging, etc.)
* @returns The execution result
*/
execute(inputs: ExecuteInputs, runtime?: any): ExecuteResult;
}
/**
* Helper to create a context object for template interpolation.
*/
export function createTemplateContext(inputs: ExecuteInputs): Record<string, any> {
return {
context: inputs.context,
state: inputs.state,
json: inputs.context.triggerData,
};
}
/**
* Helper to resolve template values.
*/
export function resolveValue(value: any, ctx: Record<string, any>, interpolate: (template: string, ctx: any) => any): any {
if (typeof value === 'string' && value.startsWith('{{') && value.endsWith('}}')) {
return interpolate(value, ctx);
}
return value;
}