@fiveohhwon/workflows-mcp
Version:
A Model Context Protocol (MCP) implementation for workflow management and automation.
139 lines • 4.39 kB
JavaScript
import { z } from 'zod';
export const ActionType = z.enum([
'tool_call',
'analyze',
'consider',
'research',
'validate',
'summarize',
'decide',
'wait_for_input',
'transform',
'extract',
'compose',
'branch',
'loop',
'parallel',
'checkpoint',
'notify',
'assert',
'retry'
]);
export const ErrorHandling = z.enum(['stop', 'continue', 'retry']);
export const BaseStep = z.object({
id: z.number().positive(),
action: ActionType,
description: z.string(),
save_result_as: z.string().optional(),
error_handling: ErrorHandling.default('stop'),
timeout_ms: z.number().positive().optional(),
retry_count: z.number().nonnegative().default(0).optional(),
dependencies: z.array(z.number().positive()).optional(),
show_all_variables: z.boolean().optional(),
});
export const ToolCallStep = BaseStep.extend({
action: z.literal('tool_call'),
tool_name: z.string(),
parameters: z.record(z.any()).default({}),
});
export const CognitiveStep = BaseStep.extend({
action: z.enum(['analyze', 'consider', 'research', 'validate', 'summarize', 'decide', 'extract', 'compose']),
input_from: z.array(z.string()).optional(),
criteria: z.string().optional(),
});
export const WaitForInputStep = BaseStep.extend({
action: z.literal('wait_for_input'),
prompt: z.string(),
input_type: z.enum(['text', 'number', 'boolean', 'json']).default('text'),
validation: z.string().optional(),
});
export const TransformStep = BaseStep.extend({
action: z.literal('transform'),
input_from: z.array(z.string()),
transformation: z.string(),
});
export const BranchCondition = z.object({
if: z.string(),
goto_step: z.number().positive(),
});
export const BranchStep = BaseStep.extend({
action: z.literal('branch'),
conditions: z.array(BranchCondition),
default_step: z.number().positive().optional(),
});
export const LoopStep = BaseStep.extend({
action: z.literal('loop'),
over: z.string(),
as: z.string(),
steps: z.array(z.number().positive()),
max_iterations: z.number().positive().optional(),
});
export const ParallelStep = BaseStep.extend({
action: z.literal('parallel'),
parallel_steps: z.array(z.number().positive()),
wait_for_all: z.boolean().default(true),
});
export const CheckpointStep = BaseStep.extend({
action: z.literal('checkpoint'),
checkpoint_name: z.string(),
});
export const NotifyStep = BaseStep.extend({
action: z.literal('notify'),
message: z.string(),
channel: z.string().optional(),
});
export const AssertStep = BaseStep.extend({
action: z.literal('assert'),
condition: z.string(),
message: z.string().optional(),
});
export const RetryStep = BaseStep.extend({
action: z.literal('retry'),
step_id: z.number().positive(),
max_attempts: z.number().positive().default(3),
});
export const Step = z.discriminatedUnion('action', [
ToolCallStep,
CognitiveStep,
WaitForInputStep,
TransformStep,
BranchStep,
LoopStep,
ParallelStep,
CheckpointStep,
NotifyStep,
AssertStep,
RetryStep,
]);
export const InputParameter = z.object({
type: z.enum(['string', 'number', 'boolean', 'array', 'object']),
description: z.string(),
required: z.boolean().default(true),
default: z.any().optional(),
validation: z.string().optional(),
});
export const WorkflowMetadata = z.object({
created_at: z.string().datetime(),
updated_at: z.string().datetime(),
created_by: z.string().optional(),
times_run: z.number().nonnegative().default(0),
average_duration_ms: z.number().nonnegative().optional(),
success_rate: z.number().min(0).max(1).optional(),
last_run_at: z.string().datetime().optional(),
});
export const Workflow = z.object({
id: z.string().uuid(),
name: z.string().min(1),
description: z.string(),
goal: z.string(),
version: z.string().regex(/^\d+\.\d+\.\d+$/),
tags: z.array(z.string()).default([]),
inputs: z.record(InputParameter).default({}),
outputs: z.array(z.string()).optional(),
required_tools: z.array(z.string()).optional(),
steps: z.array(Step).min(1),
metadata: WorkflowMetadata.optional(),
is_deleted: z.boolean().default(false),
strict_dependencies: z.boolean().optional(),
});
//# sourceMappingURL=workflow.js.map