@bernierllc/temporal-workflow-ui
Version:
Thin domain-specific wrapper around @bernierllc/generic-workflow-ui for Temporal workflows
459 lines (380 loc) • 12.6 kB
Markdown
# @bernierllc/temporal-workflow-ui
Thin domain-specific wrapper around @bernierllc/generic-workflow-ui for Temporal workflows.
## Installation
```bash
npm install @bernierllc/temporal-workflow-ui
```
## Phase 1: Core Types & Adapters
This package is currently in **Phase 1**, providing foundational types, adapters, and validation for Temporal workflows. Components will be added in Phase 2.
### What's Included (Phase 1)
- ✅ **Type Definitions** - Complete TypeScript types for Temporal workflows
- ✅ **Adapters** - Bidirectional conversion between Temporal, Generic, and JSON formats
- ✅ **Validation** - Comprehensive validation functions for workflows, stages, and transitions
- ⏳ **Components** - Coming in Phase 2
## Usage
### Type Definitions
```typescript
import {
TemporalWorkflow,
TemporalWorkflowStage,
TemporalWorkflowTransition,
TemporalActivityMetadata,
TemporalAgentMetadata,
} from '@bernierllc/temporal-workflow-ui';
// Define a Temporal workflow
const workflow: TemporalWorkflow = {
id: 'wf-1',
name: 'Data Processing Workflow',
description: 'Process and analyze data',
stages: [
{
id: 'trigger-1',
name: 'Manual Trigger',
order: 0,
type: 'trigger',
metadata: {
nodeType: 'trigger',
triggerType: 'manual',
},
},
{
id: 'activity-1',
name: 'Fetch Data',
order: 1,
type: 'activity',
metadata: {
nodeType: 'activity',
activityName: 'fetchDataActivity',
taskQueue: 'data-processing',
retryPolicy: {
maximumAttempts: 3,
backoffCoefficient: 2,
initialInterval: 1000,
},
timeout: {
startToCloseTimeout: 30000,
},
},
},
{
id: 'agent-1',
name: 'AI Analyzer',
order: 2,
type: 'agent',
metadata: {
nodeType: 'agent',
agentPromptId: 'analyzer-prompt-123',
agentName: 'Data Analyzer',
taskQueue: 'ai-processing',
modelProvider: 'openai',
modelName: 'gpt-4',
temperature: 0.7,
},
},
],
transitions: [
{
id: 'trans-1',
from: 'trigger-1',
to: 'activity-1',
},
{
id: 'trans-2',
from: 'activity-1',
to: 'agent-1',
condition: 'result.status === "success"',
metadata: {
label: 'On Success',
},
},
],
defaultTaskQueue: 'default',
workflowTimeout: 300000,
};
```
### Adapters
#### Temporal ↔ Generic Conversion
```typescript
import { temporalToGeneric, genericToTemporal } from '@bernierllc/temporal-workflow-ui';
// Convert Temporal workflow to Generic workflow
const genericWorkflow = temporalToGeneric(workflow);
// Use with generic-workflow-ui components
import { GenericWorkflowStepper } from '@bernierllc/generic-workflow-ui';
<GenericWorkflowStepper workflow={genericWorkflow} />;
// Convert back to Temporal
const temporalWorkflow = genericToTemporal(genericWorkflow);
```
#### Temporal ↔ JSON Conversion
```typescript
import { temporalWorkflowToJSON, jsonToTemporalWorkflow } from '@bernierllc/temporal-workflow-ui';
// Export workflow to JSON (n8n-style)
const jsonDefinition = temporalWorkflowToJSON(workflow);
// Save to file
fs.writeFileSync('workflow.json', JSON.stringify(jsonDefinition, null, 2));
// Import from JSON
const loadedWorkflow = jsonToTemporalWorkflow(jsonDefinition);
```
### Validation
```typescript
import { validateTemporalWorkflow, validateTaskQueue, validateRetryPolicy } from '@bernierllc/temporal-workflow-ui';
// Validate complete workflow
const result = validateTemporalWorkflow(workflow);
if (!result.valid) {
console.error('Validation errors:');
result.errors.forEach(error => {
console.error(`- ${error.message}`, {
stageId: error.stageId,
field: error.field,
severity: error.severity,
});
});
}
// Validate task queue
const taskQueueResult = validateTaskQueue({
id: 'queue-1',
name: 'processing-queue',
workerCount: 5,
});
// Validate retry policy
const retryPolicyResult = validateRetryPolicy({
maximumAttempts: 3,
backoffCoefficient: 2,
initialInterval: 1000,
maximumInterval: 60000,
});
```
### Validation Rules
The validator enforces these rules:
**Workflow-Level:**
- ✅ Workflow must have a name
- ✅ Workflow must have at least one trigger node
- ✅ All stage IDs must be unique
- ✅ All transition IDs must be unique
- ✅ All transitions must reference valid stages
- ✅ No circular dependencies in workflow transitions
- ✅ All stages must have names
- ✅ All signal names must be unique (v1.1.0)
- ✅ All query names must be unique (v1.1.0)
- ✅ All work queue names must be unique (v1.1.0)
- ✅ No circular dependencies in blockUntil (v1.1.0)
**Node-Level:**
- ✅ Activities must have `activityName` and `taskQueue`
- ✅ Agents must have `agentPromptId`, `agentName`, and `taskQueue`
- ✅ Signals must have `signalName`
- ✅ Triggers must have `triggerType`
- ✅ Queries must have `queryName` (v1.1.0)
- ✅ Scheduled workflows must have `workflowName`, `taskQueue`, and valid `cronExpression` (v1.1.0)
- ✅ Work queues must have `queueId`, `queueName`, `signalName`, and `queryName` (v1.1.0)
- ✅ Child workflows with `blockUntil` must reference existing stages (v1.1.0)
- ✅ Retry policy values must be valid
- ✅ Timeout values must be valid
## New in v1.1.0
### Query Nodes
Query nodes enable parent-child workflow communication:
```typescript
{
id: 'query-1',
name: 'Check Parent Status',
order: 3,
type: 'query',
metadata: {
nodeType: 'query',
queryName: 'getParentStatus',
queryType: 'send',
targetWorkflowId: 'parent-workflow-123',
returnType: 'WorkflowStatus',
timeout: 5000,
},
}
```
### Scheduled Workflow Nodes
Schedule child workflows to run on a cron schedule:
```typescript
{
id: 'scheduled-1',
name: 'Daily Report Generator',
order: 4,
type: 'scheduled-workflow',
metadata: {
nodeType: 'scheduled-workflow',
workflowName: 'generateDailyReport',
taskQueue: 'reporting-queue',
cronExpression: '0 9 * * *', // Every day at 9 AM
timezone: 'America/New_York',
parameters: {
reportType: 'daily',
recipients: ['team@example.com'],
},
},
}
```
### Work Queue Nodes
Coordinate work queues with signal/query patterns:
```typescript
{
id: 'queue-1',
name: 'High Priority Tasks',
order: 5,
type: 'work-queue',
metadata: {
nodeType: 'work-queue',
queueId: 'high-priority-queue',
queueName: 'highPriorityTasks',
signalName: 'addHighPriorityTask',
queryName: 'getQueueStatus',
maxSize: 100,
priority: 10,
taskQueue: 'worker-queue',
},
}
```
### Enhanced Child Workflow Metadata
Child workflows now support parent communication and dependency blocking:
```typescript
{
id: 'child-1',
name: 'Data Processor',
order: 6,
type: 'child-workflow',
metadata: {
nodeType: 'child-workflow',
workflowName: 'processDataWorkflow',
taskQueue: 'processing-queue',
// Signal back to parent when done
signalToParent: {
signalName: 'notifyParent',
autoCreate: true,
queueName: 'notifications',
},
// Query parent for configuration
queryParent: {
queryName: 'getProcessingConfig',
queueName: 'config-requests',
},
// Wait for other child workflows to complete
blockUntil: ['child-fetch-data', 'child-validate'],
},
}
```
### Workflow-Level Arrays
Workflows can now define signals, queries, and work queues at the top level:
```typescript
const workflow: TemporalWorkflow = {
id: 'wf-1',
name: 'Advanced Workflow',
stages: [...],
transitions: [...],
// Define signals that child workflows can use
signals: [
{
id: 'sig-1',
name: 'notifyProgress',
parameters: { progress: 'number' },
autoGenerated: false
},
],
// Define queries for parent-child communication
queries: [
{
id: 'q-1',
name: 'getStatus',
returnType: 'WorkflowStatus',
autoGenerated: false
},
],
// Define work queues for coordination
workQueues: [
{
id: 'wq-1',
name: 'taskQueue',
signalName: 'addTask',
queryName: 'getQueueStatus',
maxSize: 50,
priority: 5,
},
],
};
```
## API Reference
### Types
#### Core Types
- `TemporalWorkflow` - Complete workflow definition
- `TemporalWorkflowStage` - Individual workflow stage
- `TemporalWorkflowTransition` - Transition between stages
- `TemporalNodeType` - Node type union ('activity' | 'agent' | 'signal' | 'query' | 'scheduled-workflow' | 'work-queue' | etc.)
#### Metadata Types
- `TemporalActivityMetadata` - Activity-specific metadata
- `TemporalAgentMetadata` - Agent-specific metadata
- `TemporalSignalMetadata` - Signal-specific metadata
- `TemporalTriggerMetadata` - Trigger-specific metadata
- `TemporalChildWorkflowMetadata` - Child workflow metadata (enhanced in v1.1.0)
- `TemporalParallelMetadata` - Parallel execution metadata
- `TemporalConditionMetadata` - Conditional branching metadata
- `TemporalQueryMetadata` - Query operations metadata (new in v1.1.0)
- `TemporalScheduledWorkflowMetadata` - Cron-scheduled workflows (new in v1.1.0)
- `TemporalWorkQueueMetadata` - Work queue coordinator (new in v1.1.0)
- `TemporalRetryPolicy` - Retry configuration
- `TemporalTimeout` - Timeout configuration
- `TaskQueue` - Task queue definition
#### Execution Types
- `TemporalWorkflowExecution` - Workflow execution state
- `TemporalWorkflowExecutionStatus` - Execution status enum
- `TemporalStageExecutionStatus` - Stage execution status enum
- `TemporalWorkflowEvent` - Workflow event in history
#### Validation Types
- `ValidationResult` - Validation result with errors
- `ValidationError` - Individual validation error
- `ValidationSeverity` - Error severity ('error' | 'warning')
### Adapters
- `temporalToGeneric(workflow)` - Convert Temporal → Generic
- `genericToTemporal(workflow)` - Convert Generic → Temporal
- `temporalWorkflowToJSON(workflow)` - Convert Temporal → JSON
- `jsonToTemporalWorkflow(json)` - Convert JSON → Temporal
### Validation Functions
- `validateTemporalWorkflow(workflow)` - Validate complete workflow
- `validateStage(stage)` - Validate individual stage
- `validateTransition(transition)` - Validate individual transition
- `validateTaskQueue(taskQueue)` - Validate task queue
- `validateRetryPolicy(policy)` - Validate retry policy
## Design Philosophy
This package follows a **thin wrapper philosophy**:
- **Minimal Abstraction** - Delegates to `@bernierllc/generic-workflow-ui` for UI components
- **Type Safety First** - Full TypeScript support with strict mode
- **Lossless Conversion** - Bidirectional adapters preserve all data
- **Domain-Specific** - Temporal-specific types and validation
- **Flexible** - Access underlying generic components when needed
## Integration Status
- **Logger**: not-applicable
- **Docs-Suite**: ready
- **NeverHub**: not-applicable
## Roadmap
### Phase 1 (Current) ✅
- ✅ Type definitions
- ✅ Adapters (Temporal ↔ Generic ↔ JSON)
- ✅ Validation functions
- ✅ Comprehensive tests (85%+ coverage)
### Phase 2 (Next)
- ⏳ `TemporalWorkflowBuilder` - Visual workflow builder
- ⏳ `TemporalWorkflowStepper` - Progress visualization
- ⏳ `TemporalActivityCard` - Activity detail display
- ⏳ `TemporalAgentCard` - Agent detail display
- ⏳ `TemporalComponentPalette` - Drag-and-drop palette
- ⏳ `TemporalPropertyPanel` - Property editor
- ⏳ `TemporalTaskQueueSelector` - Task queue selector
- ⏳ `TemporalRetryPolicyEditor` - Retry policy editor
- ⏳ `TemporalTimeoutEditor` - Timeout editor
### Phase 3 (Future)
- ⏳ `TemporalWorkflowTimeline` - Execution history
- ⏳ `TemporalWorkflowExecutionPanel` - Complete monitoring panel
- ⏳ `useTemporalWorkflow` - Workflow state hook
- ⏳ `useTemporalExecution` - Execution monitoring hook
## Contributing
This package is part of the BernierLLC tools monorepo. See the root README for development guidelines.
## License
Copyright (c) 2025 Bernier LLC
This file is licensed to the client under a limited-use license.
The client may use and modify this code *only within the scope of the project it was delivered for*.
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
## See Also
- [@bernierllc/generic-workflow-ui](../generic-workflow-ui) - Generic workflow UI components
- [Temporal Documentation](https://docs.temporal.io/) - Official Temporal docs