@principal-ai/principal-view-core 0.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/README.md +126 -0
  2. package/dist/ConfigurationLoader.d.ts +76 -0
  3. package/dist/ConfigurationLoader.d.ts.map +1 -0
  4. package/dist/ConfigurationLoader.js +144 -0
  5. package/dist/ConfigurationLoader.js.map +1 -0
  6. package/dist/ConfigurationValidator.d.ts +31 -0
  7. package/dist/ConfigurationValidator.d.ts.map +1 -0
  8. package/dist/ConfigurationValidator.js +242 -0
  9. package/dist/ConfigurationValidator.js.map +1 -0
  10. package/dist/EventProcessor.d.ts +49 -0
  11. package/dist/EventProcessor.d.ts.map +1 -0
  12. package/dist/EventProcessor.js +215 -0
  13. package/dist/EventProcessor.js.map +1 -0
  14. package/dist/EventRecorderService.d.ts +305 -0
  15. package/dist/EventRecorderService.d.ts.map +1 -0
  16. package/dist/EventRecorderService.js +463 -0
  17. package/dist/EventRecorderService.js.map +1 -0
  18. package/dist/LibraryLoader.d.ts +63 -0
  19. package/dist/LibraryLoader.d.ts.map +1 -0
  20. package/dist/LibraryLoader.js +188 -0
  21. package/dist/LibraryLoader.js.map +1 -0
  22. package/dist/PathBasedEventProcessor.d.ts +90 -0
  23. package/dist/PathBasedEventProcessor.d.ts.map +1 -0
  24. package/dist/PathBasedEventProcessor.js +239 -0
  25. package/dist/PathBasedEventProcessor.js.map +1 -0
  26. package/dist/SessionManager.d.ts +194 -0
  27. package/dist/SessionManager.d.ts.map +1 -0
  28. package/dist/SessionManager.js +299 -0
  29. package/dist/SessionManager.js.map +1 -0
  30. package/dist/ValidationEngine.d.ts +31 -0
  31. package/dist/ValidationEngine.d.ts.map +1 -0
  32. package/dist/ValidationEngine.js +158 -0
  33. package/dist/ValidationEngine.js.map +1 -0
  34. package/dist/helpers/GraphInstrumentationHelper.d.ts +93 -0
  35. package/dist/helpers/GraphInstrumentationHelper.d.ts.map +1 -0
  36. package/dist/helpers/GraphInstrumentationHelper.js +248 -0
  37. package/dist/helpers/GraphInstrumentationHelper.js.map +1 -0
  38. package/dist/index.d.ts +33 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +34 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/rules/config.d.ts +57 -0
  43. package/dist/rules/config.d.ts.map +1 -0
  44. package/dist/rules/config.js +382 -0
  45. package/dist/rules/config.js.map +1 -0
  46. package/dist/rules/engine.d.ts +70 -0
  47. package/dist/rules/engine.d.ts.map +1 -0
  48. package/dist/rules/engine.js +252 -0
  49. package/dist/rules/engine.js.map +1 -0
  50. package/dist/rules/implementations/connection-type-references.d.ts +7 -0
  51. package/dist/rules/implementations/connection-type-references.d.ts.map +1 -0
  52. package/dist/rules/implementations/connection-type-references.js +104 -0
  53. package/dist/rules/implementations/connection-type-references.js.map +1 -0
  54. package/dist/rules/implementations/dead-end-states.d.ts +17 -0
  55. package/dist/rules/implementations/dead-end-states.d.ts.map +1 -0
  56. package/dist/rules/implementations/dead-end-states.js +72 -0
  57. package/dist/rules/implementations/dead-end-states.js.map +1 -0
  58. package/dist/rules/implementations/index.d.ts +24 -0
  59. package/dist/rules/implementations/index.d.ts.map +1 -0
  60. package/dist/rules/implementations/index.js +62 -0
  61. package/dist/rules/implementations/index.js.map +1 -0
  62. package/dist/rules/implementations/library-node-type-match.d.ts +17 -0
  63. package/dist/rules/implementations/library-node-type-match.d.ts.map +1 -0
  64. package/dist/rules/implementations/library-node-type-match.js +123 -0
  65. package/dist/rules/implementations/library-node-type-match.js.map +1 -0
  66. package/dist/rules/implementations/minimum-node-sources.d.ts +22 -0
  67. package/dist/rules/implementations/minimum-node-sources.d.ts.map +1 -0
  68. package/dist/rules/implementations/minimum-node-sources.js +54 -0
  69. package/dist/rules/implementations/minimum-node-sources.js.map +1 -0
  70. package/dist/rules/implementations/no-unknown-fields.d.ts +7 -0
  71. package/dist/rules/implementations/no-unknown-fields.d.ts.map +1 -0
  72. package/dist/rules/implementations/no-unknown-fields.js +211 -0
  73. package/dist/rules/implementations/no-unknown-fields.js.map +1 -0
  74. package/dist/rules/implementations/orphaned-edge-types.d.ts +7 -0
  75. package/dist/rules/implementations/orphaned-edge-types.d.ts.map +1 -0
  76. package/dist/rules/implementations/orphaned-edge-types.js +47 -0
  77. package/dist/rules/implementations/orphaned-edge-types.js.map +1 -0
  78. package/dist/rules/implementations/orphaned-node-types.d.ts +7 -0
  79. package/dist/rules/implementations/orphaned-node-types.d.ts.map +1 -0
  80. package/dist/rules/implementations/orphaned-node-types.js +50 -0
  81. package/dist/rules/implementations/orphaned-node-types.js.map +1 -0
  82. package/dist/rules/implementations/required-metadata.d.ts +7 -0
  83. package/dist/rules/implementations/required-metadata.d.ts.map +1 -0
  84. package/dist/rules/implementations/required-metadata.js +57 -0
  85. package/dist/rules/implementations/required-metadata.js.map +1 -0
  86. package/dist/rules/implementations/state-transition-references.d.ts +7 -0
  87. package/dist/rules/implementations/state-transition-references.d.ts.map +1 -0
  88. package/dist/rules/implementations/state-transition-references.js +135 -0
  89. package/dist/rules/implementations/state-transition-references.js.map +1 -0
  90. package/dist/rules/implementations/unreachable-states.d.ts +7 -0
  91. package/dist/rules/implementations/unreachable-states.d.ts.map +1 -0
  92. package/dist/rules/implementations/unreachable-states.js +80 -0
  93. package/dist/rules/implementations/unreachable-states.js.map +1 -0
  94. package/dist/rules/implementations/valid-action-patterns.d.ts +17 -0
  95. package/dist/rules/implementations/valid-action-patterns.d.ts.map +1 -0
  96. package/dist/rules/implementations/valid-action-patterns.js +109 -0
  97. package/dist/rules/implementations/valid-action-patterns.js.map +1 -0
  98. package/dist/rules/implementations/valid-color-format.d.ts +7 -0
  99. package/dist/rules/implementations/valid-color-format.d.ts.map +1 -0
  100. package/dist/rules/implementations/valid-color-format.js +91 -0
  101. package/dist/rules/implementations/valid-color-format.js.map +1 -0
  102. package/dist/rules/implementations/valid-edge-types.d.ts +7 -0
  103. package/dist/rules/implementations/valid-edge-types.d.ts.map +1 -0
  104. package/dist/rules/implementations/valid-edge-types.js +244 -0
  105. package/dist/rules/implementations/valid-edge-types.js.map +1 -0
  106. package/dist/rules/implementations/valid-node-types.d.ts +7 -0
  107. package/dist/rules/implementations/valid-node-types.d.ts.map +1 -0
  108. package/dist/rules/implementations/valid-node-types.js +175 -0
  109. package/dist/rules/implementations/valid-node-types.js.map +1 -0
  110. package/dist/rules/index.d.ts +28 -0
  111. package/dist/rules/index.d.ts.map +1 -0
  112. package/dist/rules/index.js +45 -0
  113. package/dist/rules/index.js.map +1 -0
  114. package/dist/rules/types.d.ts +309 -0
  115. package/dist/rules/types.d.ts.map +1 -0
  116. package/dist/rules/types.js +35 -0
  117. package/dist/rules/types.js.map +1 -0
  118. package/dist/types/canvas.d.ts +409 -0
  119. package/dist/types/canvas.d.ts.map +1 -0
  120. package/dist/types/canvas.js +70 -0
  121. package/dist/types/canvas.js.map +1 -0
  122. package/dist/types/index.d.ts +311 -0
  123. package/dist/types/index.d.ts.map +1 -0
  124. package/dist/types/index.js +13 -0
  125. package/dist/types/index.js.map +1 -0
  126. package/dist/types/library.d.ts +185 -0
  127. package/dist/types/library.d.ts.map +1 -0
  128. package/dist/types/library.js +15 -0
  129. package/dist/types/library.js.map +1 -0
  130. package/dist/types/path-based-config.d.ts +230 -0
  131. package/dist/types/path-based-config.d.ts.map +1 -0
  132. package/dist/types/path-based-config.js +9 -0
  133. package/dist/types/path-based-config.js.map +1 -0
  134. package/dist/utils/CanvasConverter.d.ts +118 -0
  135. package/dist/utils/CanvasConverter.d.ts.map +1 -0
  136. package/dist/utils/CanvasConverter.js +315 -0
  137. package/dist/utils/CanvasConverter.js.map +1 -0
  138. package/dist/utils/GraphConverter.d.ts +18 -0
  139. package/dist/utils/GraphConverter.d.ts.map +1 -0
  140. package/dist/utils/GraphConverter.js +61 -0
  141. package/dist/utils/GraphConverter.js.map +1 -0
  142. package/dist/utils/LibraryConverter.d.ts +113 -0
  143. package/dist/utils/LibraryConverter.d.ts.map +1 -0
  144. package/dist/utils/LibraryConverter.js +166 -0
  145. package/dist/utils/LibraryConverter.js.map +1 -0
  146. package/dist/utils/PathMatcher.d.ts +55 -0
  147. package/dist/utils/PathMatcher.d.ts.map +1 -0
  148. package/dist/utils/PathMatcher.js +172 -0
  149. package/dist/utils/PathMatcher.js.map +1 -0
  150. package/dist/utils/YamlParser.d.ts +36 -0
  151. package/dist/utils/YamlParser.d.ts.map +1 -0
  152. package/dist/utils/YamlParser.js +63 -0
  153. package/dist/utils/YamlParser.js.map +1 -0
  154. package/package.json +47 -0
  155. package/src/ConfigurationLoader.test.ts +490 -0
  156. package/src/ConfigurationLoader.ts +185 -0
  157. package/src/ConfigurationValidator.test.ts +200 -0
  158. package/src/ConfigurationValidator.ts +283 -0
  159. package/src/EventProcessor.test.ts +405 -0
  160. package/src/EventProcessor.ts +250 -0
  161. package/src/EventRecorderService.test.ts +541 -0
  162. package/src/EventRecorderService.ts +744 -0
  163. package/src/LibraryLoader.ts +215 -0
  164. package/src/PathBasedEventProcessor.test.ts +567 -0
  165. package/src/PathBasedEventProcessor.ts +332 -0
  166. package/src/SessionManager.test.ts +424 -0
  167. package/src/SessionManager.ts +470 -0
  168. package/src/ValidationEngine.test.ts +371 -0
  169. package/src/ValidationEngine.ts +196 -0
  170. package/src/helpers/GraphInstrumentationHelper.test.ts +340 -0
  171. package/src/helpers/GraphInstrumentationHelper.ts +326 -0
  172. package/src/index.ts +85 -0
  173. package/src/rules/config.test.ts +278 -0
  174. package/src/rules/config.ts +459 -0
  175. package/src/rules/engine.test.ts +332 -0
  176. package/src/rules/engine.ts +318 -0
  177. package/src/rules/implementations/connection-type-references.ts +117 -0
  178. package/src/rules/implementations/dead-end-states.ts +101 -0
  179. package/src/rules/implementations/index.ts +73 -0
  180. package/src/rules/implementations/library-node-type-match.ts +148 -0
  181. package/src/rules/implementations/minimum-node-sources.ts +82 -0
  182. package/src/rules/implementations/no-unknown-fields.ts +342 -0
  183. package/src/rules/implementations/orphaned-edge-types.ts +55 -0
  184. package/src/rules/implementations/orphaned-node-types.ts +58 -0
  185. package/src/rules/implementations/required-metadata.ts +64 -0
  186. package/src/rules/implementations/state-transition-references.ts +151 -0
  187. package/src/rules/implementations/unreachable-states.ts +94 -0
  188. package/src/rules/implementations/valid-action-patterns.ts +136 -0
  189. package/src/rules/implementations/valid-color-format.ts +140 -0
  190. package/src/rules/implementations/valid-edge-types.ts +258 -0
  191. package/src/rules/implementations/valid-node-types.ts +189 -0
  192. package/src/rules/index.ts +95 -0
  193. package/src/rules/types.ts +426 -0
  194. package/src/types/canvas.ts +496 -0
  195. package/src/types/index.ts +382 -0
  196. package/src/types/library.ts +233 -0
  197. package/src/types/path-based-config.ts +281 -0
  198. package/src/utils/CanvasConverter.ts +431 -0
  199. package/src/utils/GraphConverter.test.ts +195 -0
  200. package/src/utils/GraphConverter.ts +71 -0
  201. package/src/utils/LibraryConverter.ts +245 -0
  202. package/src/utils/PathMatcher.test.ts +148 -0
  203. package/src/utils/PathMatcher.ts +183 -0
  204. package/src/utils/YamlParser.ts +75 -0
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Path-based configuration extensions for Milestone 1 & 2
3
+ *
4
+ * These types extend the core GraphConfiguration to support:
5
+ * - Path-based log association (Milestone 1)
6
+ * - Action pattern refinement (Milestone 2)
7
+ */
8
+ /**
9
+ * Log levels (matches logger package)
10
+ */
11
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
12
+ /**
13
+ * Extended node type definition with source path mapping
14
+ */
15
+ export interface PathBasedNodeTypeDefinition {
16
+ /** Base node type properties (inherited from NodeTypeDefinition) */
17
+ shape: 'circle' | 'rectangle' | 'hexagon' | 'diamond' | 'custom';
18
+ icon?: string;
19
+ color?: string;
20
+ size?: {
21
+ width: number;
22
+ height: number;
23
+ };
24
+ dataSchema: {
25
+ [field: string]: {
26
+ type: 'string' | 'number' | 'boolean' | 'object' | 'array';
27
+ required?: boolean;
28
+ displayInLabel?: boolean;
29
+ };
30
+ };
31
+ states?: Record<string, {
32
+ color?: string;
33
+ icon?: string;
34
+ label?: string;
35
+ }>;
36
+ layout?: {
37
+ layer?: number;
38
+ cluster?: string;
39
+ };
40
+ /** Manual position for 'manual' layout mode */
41
+ position?: {
42
+ x: number;
43
+ y: number;
44
+ };
45
+ /** MILESTONE 1: Source path mapping */
46
+ sources?: string[];
47
+ /** MILESTONE 2: Optional action patterns for refinement */
48
+ actions?: ActionPattern[];
49
+ }
50
+ /**
51
+ * Action pattern for extracting structured events from logs (Milestone 2)
52
+ */
53
+ export interface ActionPattern {
54
+ /** Regex pattern to match log message (with named capture groups) */
55
+ pattern: string;
56
+ /** Event type to emit when pattern matches */
57
+ event: string;
58
+ /** Component state to transition to (optional) */
59
+ state?: string;
60
+ /** Metadata template - extracts data from capture groups */
61
+ metadata?: Record<string, string>;
62
+ /** Whether this action should trigger edge animations */
63
+ triggerEdges?: string[];
64
+ }
65
+ /**
66
+ * Extended edge definition with action-based activation (Milestone 2)
67
+ */
68
+ export interface PathBasedEdgeTypeDefinition {
69
+ /** Base edge properties */
70
+ style: 'solid' | 'dashed' | 'dotted' | 'animated';
71
+ color?: string;
72
+ width?: number;
73
+ directed?: boolean;
74
+ animated?: boolean;
75
+ label?: {
76
+ field?: string;
77
+ position?: 'start' | 'middle' | 'end';
78
+ };
79
+ animation?: {
80
+ type: 'flow' | 'pulse' | 'particle' | 'glow';
81
+ duration?: number;
82
+ color?: string;
83
+ };
84
+ /** MILESTONE 2: Edge activation triggers */
85
+ activatedBy?: EdgeActivationTrigger[];
86
+ }
87
+ /**
88
+ * Configuration for activating edges based on component actions
89
+ */
90
+ export interface EdgeActivationTrigger {
91
+ /** Action that triggers this edge animation */
92
+ action: string;
93
+ /** Animation type to play */
94
+ animation: 'flow' | 'particle' | 'pulse' | 'glow';
95
+ /** Animation direction */
96
+ direction?: 'forward' | 'backward' | 'bidirectional';
97
+ /** Animation duration in milliseconds */
98
+ duration?: number;
99
+ }
100
+ /**
101
+ * Extended graph configuration with path-based support
102
+ */
103
+ export interface PathBasedGraphConfiguration {
104
+ metadata: {
105
+ name: string;
106
+ version: string;
107
+ description?: string;
108
+ };
109
+ /** Node types with source path mapping */
110
+ nodeTypes: Record<string, PathBasedNodeTypeDefinition>;
111
+ /** Edge types with action-based activation */
112
+ edgeTypes: Record<string, PathBasedEdgeTypeDefinition>;
113
+ /** Allowed connections between node types */
114
+ allowedConnections: Array<{
115
+ from: string;
116
+ to: string;
117
+ via: string;
118
+ constraints?: {
119
+ maxInstances?: number;
120
+ bidirectional?: boolean;
121
+ exclusive?: boolean;
122
+ };
123
+ }>;
124
+ /** Optional validation rules */
125
+ validation?: any;
126
+ /** Display preferences */
127
+ display?: any;
128
+ /** Path-based configuration options */
129
+ pathBasedConfig?: PathBasedConfigOptions;
130
+ }
131
+ /**
132
+ * Configuration options for path-based log association
133
+ */
134
+ export interface PathBasedConfigOptions {
135
+ /** Project root for normalizing paths */
136
+ projectRoot?: string;
137
+ /** Whether to enable source capture (default: true) */
138
+ captureSource?: boolean;
139
+ /** Whether to enable action pattern matching (default: false in M1, true in M2) */
140
+ enableActionPatterns?: boolean;
141
+ /** Default log level for filtering (default: 'info') */
142
+ logLevel?: LogLevel;
143
+ /** Whether to ignore logs without source information (default: false) */
144
+ ignoreUnsourced?: boolean;
145
+ }
146
+ /**
147
+ * Component activity event (Milestone 1)
148
+ * Generated when a log is associated with a component by source path
149
+ */
150
+ export interface ComponentActivityEvent {
151
+ type: 'component-activity';
152
+ /** Component ID (node type) */
153
+ componentId: string;
154
+ /**
155
+ * Instance identifier for multi-instance components.
156
+ * If provided, targets a specific node instance (e.g., "client-1").
157
+ * If undefined, targets the node type as a whole.
158
+ */
159
+ instanceId?: string;
160
+ /** Timestamp of the log */
161
+ timestamp: number;
162
+ /** Log level */
163
+ level: LogLevel;
164
+ /** Log message */
165
+ message: string;
166
+ /** Source location */
167
+ source: {
168
+ file: string;
169
+ line?: number;
170
+ column?: number;
171
+ };
172
+ /** Additional log arguments */
173
+ args?: any[];
174
+ }
175
+ /**
176
+ * Component action event (Milestone 2)
177
+ * Generated when a log matches an action pattern
178
+ */
179
+ export interface ComponentActionEvent {
180
+ type: 'component-action';
181
+ /** Component ID (node type) */
182
+ componentId: string;
183
+ /**
184
+ * Instance identifier for multi-instance components.
185
+ * If provided, targets a specific node instance (e.g., "client-1").
186
+ * If undefined, targets the node type as a whole.
187
+ */
188
+ instanceId?: string;
189
+ /** Action type (from pattern) */
190
+ action: string;
191
+ /** New state (if specified in pattern) */
192
+ state?: string;
193
+ /** Timestamp of the log */
194
+ timestamp: number;
195
+ /** Extracted metadata from capture groups */
196
+ metadata?: Record<string, any>;
197
+ /** Source location */
198
+ source: {
199
+ file: string;
200
+ line?: number;
201
+ column?: number;
202
+ };
203
+ }
204
+ /**
205
+ * Edge animation event (Milestone 2)
206
+ * Generated when a component action triggers edge activation
207
+ */
208
+ export interface EdgeAnimationEvent {
209
+ type: 'edge-animation';
210
+ /** Edge ID to animate */
211
+ edgeId: string;
212
+ /** Animation type */
213
+ animation: 'flow' | 'particle' | 'pulse' | 'glow';
214
+ /** Animation direction */
215
+ direction?: 'forward' | 'backward' | 'bidirectional';
216
+ /** Animation duration */
217
+ duration: number;
218
+ /** Timestamp */
219
+ timestamp: number;
220
+ /** Source action that triggered this */
221
+ triggeredBy?: {
222
+ componentId: string;
223
+ action: string;
224
+ };
225
+ }
226
+ /**
227
+ * Union type of all path-based events
228
+ */
229
+ export type PathBasedEvent = ComponentActivityEvent | ComponentActionEvent | EdgeAnimationEvent;
230
+ //# sourceMappingURL=path-based-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-based-config.d.ts","sourceRoot":"","sources":["../../src/types/path-based-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Path-based configuration extensions for Milestone 1 & 2
3
+ *
4
+ * These types extend the core GraphConfiguration to support:
5
+ * - Path-based log association (Milestone 1)
6
+ * - Action pattern refinement (Milestone 2)
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=path-based-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-based-config.js","sourceRoot":"","sources":["../../src/types/path-based-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Canvas Converter
3
+ *
4
+ * Utilities for converting between Extended Canvas format and React Flow nodes/edges.
5
+ */
6
+ import type { ExtendedCanvas } from '../types/canvas';
7
+ import type { NodeState, EdgeState } from '../types';
8
+ /**
9
+ * React Flow node format
10
+ */
11
+ export interface ReactFlowNode {
12
+ id: string;
13
+ type: string;
14
+ position: {
15
+ x: number;
16
+ y: number;
17
+ };
18
+ data: {
19
+ label: string;
20
+ nodeType: string;
21
+ shape?: string;
22
+ icon?: string;
23
+ color?: string;
24
+ width?: number;
25
+ height?: number;
26
+ states?: Record<string, {
27
+ color?: string;
28
+ icon?: string;
29
+ label?: string;
30
+ }>;
31
+ sources?: string[];
32
+ actions?: any[];
33
+ canvasType?: 'text' | 'file' | 'link' | 'group';
34
+ text?: string;
35
+ file?: string;
36
+ url?: string;
37
+ [key: string]: any;
38
+ };
39
+ style?: {
40
+ width?: number;
41
+ height?: number;
42
+ };
43
+ }
44
+ /**
45
+ * React Flow edge format
46
+ */
47
+ export interface ReactFlowEdge {
48
+ id: string;
49
+ source: string;
50
+ target: string;
51
+ type?: string;
52
+ sourceHandle?: string;
53
+ targetHandle?: string;
54
+ label?: string;
55
+ data?: {
56
+ edgeType: string;
57
+ style?: string;
58
+ color?: string;
59
+ width?: number;
60
+ animation?: {
61
+ type: string;
62
+ duration?: number;
63
+ color?: string;
64
+ };
65
+ activatedBy?: any[];
66
+ [key: string]: any;
67
+ };
68
+ style?: {
69
+ stroke?: string;
70
+ strokeWidth?: number;
71
+ strokeDasharray?: string;
72
+ };
73
+ animated?: boolean;
74
+ markerEnd?: {
75
+ type: string;
76
+ color?: string;
77
+ };
78
+ }
79
+ /**
80
+ * Canvas Converter utility class
81
+ */
82
+ export declare class CanvasConverter {
83
+ /**
84
+ * Convert Extended Canvas to React Flow nodes and edges
85
+ */
86
+ static canvasToReactFlow(canvas: ExtendedCanvas): {
87
+ nodes: ReactFlowNode[];
88
+ edges: ReactFlowEdge[];
89
+ };
90
+ /**
91
+ * Convert a single canvas node to React Flow node
92
+ */
93
+ private static convertNode;
94
+ /**
95
+ * Get display label for a node
96
+ */
97
+ private static getNodeLabel;
98
+ /**
99
+ * Convert a single canvas edge to React Flow edge
100
+ */
101
+ private static convertEdge;
102
+ /**
103
+ * Convert Extended Canvas to internal NodeState/EdgeState format
104
+ */
105
+ static canvasToGraph(canvas: ExtendedCanvas): {
106
+ nodes: NodeState[];
107
+ edges: EdgeState[];
108
+ };
109
+ /**
110
+ * Convert React Flow nodes/edges back to Extended Canvas format
111
+ */
112
+ static reactFlowToCanvas(nodes: ReactFlowNode[], edges: ReactFlowEdge[], metadata?: {
113
+ name?: string;
114
+ version?: string;
115
+ description?: string;
116
+ }): ExtendedCanvas;
117
+ }
118
+ //# sourceMappingURL=CanvasConverter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CanvasConverter.d.ts","sourceRoot":"","sources":["../../src/utils/CanvasConverter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,315 @@
1
+ /**
2
+ * Canvas Converter
3
+ *
4
+ * Utilities for converting between Extended Canvas format and React Flow nodes/edges.
5
+ */
6
+ import { resolveCanvasColor } from '../types/canvas';
7
+ /**
8
+ * Convert canvas side to React Flow handle position
9
+ */
10
+ function sideToHandle(side) {
11
+ if (!side)
12
+ return undefined;
13
+ // React Flow uses 'top', 'right', 'bottom', 'left' - same as canvas
14
+ return side;
15
+ }
16
+ /**
17
+ * Convert edge style to stroke-dasharray
18
+ */
19
+ function styleToStrokeDasharray(style) {
20
+ switch (style) {
21
+ case 'dashed':
22
+ return '5,5';
23
+ case 'dotted':
24
+ return '2,2';
25
+ default:
26
+ return undefined;
27
+ }
28
+ }
29
+ /**
30
+ * Canvas Converter utility class
31
+ */
32
+ export class CanvasConverter {
33
+ /**
34
+ * Convert Extended Canvas to React Flow nodes and edges
35
+ */
36
+ static canvasToReactFlow(canvas) {
37
+ const nodes = [];
38
+ const edges = [];
39
+ // Convert nodes
40
+ if (canvas.nodes) {
41
+ for (const node of canvas.nodes) {
42
+ nodes.push(this.convertNode(node, canvas));
43
+ }
44
+ }
45
+ // Convert edges
46
+ if (canvas.edges) {
47
+ for (const edge of canvas.edges) {
48
+ edges.push(this.convertEdge(edge, canvas));
49
+ }
50
+ }
51
+ return { nodes, edges };
52
+ }
53
+ /**
54
+ * Convert a single canvas node to React Flow node
55
+ */
56
+ static convertNode(node, canvas) {
57
+ const pv = node.pv;
58
+ const color = resolveCanvasColor(node.color);
59
+ // Build the data object based on canvas node type
60
+ const data = {
61
+ label: this.getNodeLabel(node),
62
+ nodeType: pv?.nodeType || node.id,
63
+ canvasType: node.type,
64
+ shape: pv?.shape || 'rectangle',
65
+ icon: pv?.icon,
66
+ color: pv?.states?.idle?.color || color,
67
+ width: node.width,
68
+ height: node.height,
69
+ };
70
+ // Add type-specific data
71
+ if (node.type === 'text') {
72
+ data.text = node.text;
73
+ }
74
+ else if (node.type === 'file') {
75
+ data.file = node.file;
76
+ }
77
+ else if (node.type === 'link') {
78
+ data.url = node.url;
79
+ }
80
+ else if (node.type === 'group') {
81
+ data.label = node.label || data.label;
82
+ }
83
+ // Add PV extensions if present
84
+ if (pv) {
85
+ data.states = pv.states;
86
+ data.sources = pv.sources;
87
+ data.actions = pv.actions;
88
+ if (pv.dataSchema) {
89
+ data.dataSchema = pv.dataSchema;
90
+ }
91
+ }
92
+ return {
93
+ id: node.id,
94
+ type: pv?.shape || 'default',
95
+ position: { x: node.x, y: node.y },
96
+ data,
97
+ style: {
98
+ width: node.width,
99
+ height: node.height,
100
+ },
101
+ };
102
+ }
103
+ /**
104
+ * Get display label for a node
105
+ */
106
+ static getNodeLabel(node) {
107
+ if (node.pv?.nodeType) {
108
+ return node.pv.nodeType;
109
+ }
110
+ switch (node.type) {
111
+ case 'text':
112
+ // Use first line of text as label
113
+ const firstLine = node.text.split('\n')[0];
114
+ return firstLine.replace(/^#+ /, '').substring(0, 50);
115
+ case 'file':
116
+ // Use filename as label
117
+ return node.file.split('/').pop() || node.file;
118
+ case 'link':
119
+ return node.url;
120
+ case 'group':
121
+ return node.label || 'Group';
122
+ }
123
+ }
124
+ /**
125
+ * Convert a single canvas edge to React Flow edge
126
+ */
127
+ static convertEdge(edge, canvas) {
128
+ const pv = edge.pv;
129
+ const edgeTypeDef = pv?.edgeType ? canvas.pv?.edgeTypes?.[pv.edgeType] : undefined;
130
+ const color = resolveCanvasColor(edge.color) || edgeTypeDef?.color;
131
+ const rfEdge = {
132
+ id: edge.id,
133
+ source: edge.fromNode,
134
+ target: edge.toNode,
135
+ sourceHandle: sideToHandle(edge.fromSide),
136
+ targetHandle: sideToHandle(edge.toSide),
137
+ label: edge.label,
138
+ data: {
139
+ edgeType: pv?.edgeType || 'default',
140
+ style: pv?.style || edgeTypeDef?.style || 'solid',
141
+ color,
142
+ width: pv?.width || edgeTypeDef?.width || 2,
143
+ animation: pv?.animation || edgeTypeDef?.animation,
144
+ activatedBy: pv?.activatedBy || edgeTypeDef?.activatedBy,
145
+ },
146
+ style: {
147
+ stroke: color,
148
+ strokeWidth: pv?.width || edgeTypeDef?.width || 2,
149
+ strokeDasharray: styleToStrokeDasharray(pv?.style || edgeTypeDef?.style),
150
+ },
151
+ animated: pv?.style === 'animated' || edgeTypeDef?.style === 'animated',
152
+ };
153
+ // Add marker based on canvas endpoint settings
154
+ if (edge.toEnd !== 'none') {
155
+ rfEdge.markerEnd = {
156
+ type: 'arrowclosed',
157
+ color,
158
+ };
159
+ }
160
+ return rfEdge;
161
+ }
162
+ /**
163
+ * Convert Extended Canvas to internal NodeState/EdgeState format
164
+ */
165
+ static canvasToGraph(canvas) {
166
+ const nodes = [];
167
+ const edges = [];
168
+ const now = Date.now();
169
+ // Convert nodes
170
+ if (canvas.nodes) {
171
+ for (const node of canvas.nodes) {
172
+ const pv = node.pv;
173
+ nodes.push({
174
+ id: node.id,
175
+ type: pv?.nodeType || node.type,
176
+ data: {
177
+ label: this.getNodeLabel(node),
178
+ shape: pv?.shape || 'rectangle',
179
+ icon: pv?.icon,
180
+ // Color priority: pv.fill > node.color
181
+ color: pv?.fill || resolveCanvasColor(node.color),
182
+ // Stroke color for borders
183
+ stroke: pv?.stroke,
184
+ width: node.width,
185
+ height: node.height,
186
+ sources: pv?.sources || [],
187
+ actions: pv?.actions || [],
188
+ states: pv?.states,
189
+ canvasType: node.type,
190
+ ...(node.type === 'text' ? { text: node.text } : {}),
191
+ ...(node.type === 'file' ? { file: node.file } : {}),
192
+ ...(node.type === 'link' ? { url: node.url } : {}),
193
+ },
194
+ position: { x: node.x, y: node.y },
195
+ // Don't set a default state - only show state labels when explicitly set via events
196
+ state: undefined,
197
+ createdAt: now,
198
+ updatedAt: now,
199
+ });
200
+ }
201
+ }
202
+ // Convert edges
203
+ if (canvas.edges) {
204
+ for (const edge of canvas.edges) {
205
+ const pv = edge.pv;
206
+ const edgeTypeDef = pv?.edgeType ? canvas.pv?.edgeTypes?.[pv.edgeType] : undefined;
207
+ edges.push({
208
+ id: edge.id,
209
+ type: pv?.edgeType || 'default',
210
+ from: edge.fromNode,
211
+ to: edge.toNode,
212
+ data: {
213
+ label: edge.label,
214
+ style: pv?.style || edgeTypeDef?.style || 'solid',
215
+ color: resolveCanvasColor(edge.color) || edgeTypeDef?.color,
216
+ width: pv?.width || edgeTypeDef?.width,
217
+ animation: pv?.animation || edgeTypeDef?.animation,
218
+ activatedBy: pv?.activatedBy || edgeTypeDef?.activatedBy,
219
+ fromSide: edge.fromSide,
220
+ toSide: edge.toSide,
221
+ },
222
+ createdAt: now,
223
+ updatedAt: now,
224
+ });
225
+ }
226
+ }
227
+ return { nodes, edges };
228
+ }
229
+ /**
230
+ * Convert React Flow nodes/edges back to Extended Canvas format
231
+ */
232
+ static reactFlowToCanvas(nodes, edges, metadata) {
233
+ const canvas = {
234
+ nodes: [],
235
+ edges: [],
236
+ pv: {
237
+ version: metadata?.version || '1.0.0',
238
+ name: metadata?.name || 'Untitled',
239
+ description: metadata?.description,
240
+ edgeTypes: {},
241
+ },
242
+ };
243
+ // Collect edge types
244
+ const edgeTypes = new Map();
245
+ // Convert nodes
246
+ for (const node of nodes) {
247
+ const canvasNode = {
248
+ id: node.id,
249
+ type: node.data.canvasType || 'text',
250
+ x: node.position.x,
251
+ y: node.position.y,
252
+ width: node.style?.width || node.data.width || 150,
253
+ height: node.style?.height || node.data.height || 80,
254
+ text: node.data.text || node.data.label || '',
255
+ };
256
+ // Add color if present
257
+ if (node.data.color) {
258
+ canvasNode.color = node.data.color;
259
+ }
260
+ // Add PV extension if there's custom data
261
+ if (node.data.nodeType || node.data.shape || node.data.sources?.length) {
262
+ canvasNode.pv = {
263
+ nodeType: node.data.nodeType || node.id,
264
+ shape: node.data.shape,
265
+ icon: node.data.icon,
266
+ states: node.data.states,
267
+ sources: node.data.sources,
268
+ actions: node.data.actions,
269
+ dataSchema: node.data.dataSchema,
270
+ };
271
+ }
272
+ canvas.nodes.push(canvasNode);
273
+ }
274
+ // Convert edges
275
+ for (const edge of edges) {
276
+ const canvasEdge = {
277
+ id: edge.id,
278
+ fromNode: edge.source,
279
+ toNode: edge.target,
280
+ fromSide: edge.sourceHandle,
281
+ toSide: edge.targetHandle,
282
+ label: edge.label,
283
+ };
284
+ // Add color
285
+ if (edge.style?.stroke) {
286
+ canvasEdge.color = edge.style.stroke;
287
+ }
288
+ // Add PV extension
289
+ if (edge.data?.edgeType) {
290
+ canvasEdge.pv = {
291
+ edgeType: edge.data.edgeType,
292
+ style: edge.data.style,
293
+ width: edge.data.width,
294
+ animation: edge.data.animation,
295
+ activatedBy: edge.data.activatedBy,
296
+ };
297
+ // Collect edge type definition
298
+ if (!edgeTypes.has(edge.data.edgeType)) {
299
+ edgeTypes.set(edge.data.edgeType, {
300
+ style: edge.data.style,
301
+ color: edge.data.color,
302
+ width: edge.data.width,
303
+ animation: edge.data.animation,
304
+ activatedBy: edge.data.activatedBy,
305
+ });
306
+ }
307
+ }
308
+ canvas.edges.push(canvasEdge);
309
+ }
310
+ // Add collected edge types to canvas
311
+ canvas.pv.edgeTypes = Object.fromEntries(edgeTypes);
312
+ return canvas;
313
+ }
314
+ }
315
+ //# sourceMappingURL=CanvasConverter.js.map