feat: Phase 1 - Canvas with React Flow

- 8 node types (Model, Solver, DesignVar, Extractor, Objective, Constraint, Algorithm, Surrogate)
- Drag-drop from palette to canvas
- Node configuration panels
- Graph validation with error/warning display
- Intent JSON serialization
- Zustand state management

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-14 20:00:35 -05:00
parent 73a7b9d9f1
commit 7919511bb2
24 changed files with 1915 additions and 6 deletions

View File

@@ -0,0 +1,102 @@
/**
* Canvas Schema - Type definitions for optimization workflow nodes
*/
export type NodeType =
| 'model'
| 'solver'
| 'designVar'
| 'extractor'
| 'objective'
| 'constraint'
| 'algorithm'
| 'surrogate';
export interface BaseNodeData {
label: string;
configured: boolean;
errors?: string[];
}
export interface ModelNodeData extends BaseNodeData {
type: 'model';
filePath?: string;
fileType?: 'prt' | 'fem' | 'sim';
}
export interface SolverNodeData extends BaseNodeData {
type: 'solver';
solverType?: 'SOL101' | 'SOL103' | 'SOL105' | 'SOL106' | 'SOL111' | 'SOL112';
}
export interface DesignVarNodeData extends BaseNodeData {
type: 'designVar';
expressionName?: string;
minValue?: number;
maxValue?: number;
unit?: string;
}
export interface ExtractorNodeData extends BaseNodeData {
type: 'extractor';
extractorId?: string;
extractorName?: string;
config?: Record<string, unknown>;
}
export interface ObjectiveNodeData extends BaseNodeData {
type: 'objective';
name?: string;
direction?: 'minimize' | 'maximize';
weight?: number;
}
export interface ConstraintNodeData extends BaseNodeData {
type: 'constraint';
name?: string;
operator?: '<' | '<=' | '>' | '>=' | '==';
value?: number;
}
export interface AlgorithmNodeData extends BaseNodeData {
type: 'algorithm';
method?: 'TPE' | 'CMA-ES' | 'NSGA-II' | 'GP-BO' | 'RandomSearch';
maxTrials?: number;
}
export interface SurrogateNodeData extends BaseNodeData {
type: 'surrogate';
enabled?: boolean;
modelType?: 'MLP' | 'GNN' | 'Ensemble';
minTrials?: number;
}
export type CanvasNodeData =
| ModelNodeData
| SolverNodeData
| DesignVarNodeData
| ExtractorNodeData
| ObjectiveNodeData
| ConstraintNodeData
| AlgorithmNodeData
| SurrogateNodeData;
export interface CanvasEdge {
id: string;
source: string;
target: string;
sourceHandle?: string;
targetHandle?: string;
}
// Valid connections
export const VALID_CONNECTIONS: Record<NodeType, NodeType[]> = {
model: ['solver', 'designVar'],
solver: ['extractor'],
designVar: ['model'],
extractor: ['objective', 'constraint'],
objective: ['algorithm'],
constraint: ['algorithm'],
algorithm: ['surrogate'],
surrogate: [],
};