@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,57 @@
1
+ /**
2
+ * Rule: required-metadata
3
+ * Ensures configuration has required metadata fields (name, version)
4
+ */
5
+ export const requiredMetadata = {
6
+ id: 'required-metadata',
7
+ name: 'Required Metadata',
8
+ description: 'Configuration must have name and version in metadata',
9
+ impact: 'Missing metadata makes configurations hard to identify and version',
10
+ severity: 'error',
11
+ category: 'schema',
12
+ enabled: true,
13
+ fixable: false,
14
+ async check(context) {
15
+ const violations = [];
16
+ const { configuration, configPath } = context;
17
+ if (!configuration.metadata) {
18
+ violations.push({
19
+ ruleId: 'required-metadata',
20
+ severity: 'error',
21
+ file: configPath,
22
+ path: 'metadata',
23
+ message: 'Configuration is missing metadata section',
24
+ impact: 'Cannot identify or version this configuration',
25
+ suggestion: 'Add a metadata section with name and version fields',
26
+ fixable: false,
27
+ });
28
+ return violations;
29
+ }
30
+ if (!configuration.metadata.name) {
31
+ violations.push({
32
+ ruleId: 'required-metadata',
33
+ severity: 'error',
34
+ file: configPath,
35
+ path: 'metadata.name',
36
+ message: 'Configuration metadata is missing required "name" field',
37
+ impact: 'Cannot identify this configuration',
38
+ suggestion: 'Add a name field to metadata',
39
+ fixable: false,
40
+ });
41
+ }
42
+ if (!configuration.metadata.version) {
43
+ violations.push({
44
+ ruleId: 'required-metadata',
45
+ severity: 'error',
46
+ file: configPath,
47
+ path: 'metadata.version',
48
+ message: 'Configuration metadata is missing required "version" field',
49
+ impact: 'Cannot track configuration versions',
50
+ suggestion: 'Add a version field (e.g., "1.0.0") to metadata',
51
+ fixable: false,
52
+ });
53
+ }
54
+ return violations;
55
+ },
56
+ };
57
+ //# sourceMappingURL=required-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"required-metadata.js","sourceRoot":"","sources":["../../../src/rules/implementations/required-metadata.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAAc;IACzC,EAAE,EAAE,mBAAmB;IACvB,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,sDAAsD;IACnE,MAAM,EAAE,oEAAoE;IAC5E,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,KAAK;IAEd,KAAK,CAAC,KAAK,CAAC,OAAyB;QACnC,MAAM,UAAU,GAAyB,EAAE,CAAC;QAC5C,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAE9C,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,mBAAmB;gBAC3B,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,2CAA2C;gBACpD,MAAM,EAAE,+CAA+C;gBACvD,UAAU,EAAE,qDAAqD;gBACjE,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjC,UAAU,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,mBAAmB;gBAC3B,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,yDAAyD;gBAClE,MAAM,EAAE,oCAAoC;gBAC5C,UAAU,EAAE,8BAA8B;gBAC1C,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACpC,UAAU,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,mBAAmB;gBAC3B,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,4DAA4D;gBACrE,MAAM,EAAE,qCAAqC;gBAC7C,UAAU,EAAE,iDAAiD;gBAC7D,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;QACL,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Rule: state-transition-references
3
+ * Ensures state transitions only reference defined states
4
+ */
5
+ import type { GraphRule } from '../types';
6
+ export declare const stateTransitionReferences: GraphRule;
7
+ //# sourceMappingURL=state-transition-references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-transition-references.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/state-transition-references.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,UAAU,CAAC;AAEhF,eAAO,MAAM,yBAAyB,EAAE,SAkHvC,CAAC"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Rule: state-transition-references
3
+ * Ensures state transitions only reference defined states
4
+ */
5
+ export const stateTransitionReferences = {
6
+ id: 'state-transition-references',
7
+ name: 'State Transition References',
8
+ description: 'State transitions must reference states defined in nodeTypes',
9
+ impact: 'Invalid state references will cause state validation to fail',
10
+ severity: 'error',
11
+ category: 'reference',
12
+ enabled: true,
13
+ fixable: false,
14
+ async check(context) {
15
+ const violations = [];
16
+ const { configuration, configPath } = context;
17
+ if (!configuration.validation?.stateTransitions) {
18
+ return violations;
19
+ }
20
+ // Build a map of nodeType -> defined states
21
+ const statesByNodeType = new Map();
22
+ if (configuration.nodeTypes) {
23
+ for (const [typeId, nodeType] of Object.entries(configuration.nodeTypes)) {
24
+ if (nodeType.states) {
25
+ statesByNodeType.set(typeId, new Set(Object.keys(nodeType.states)));
26
+ }
27
+ }
28
+ }
29
+ // Check each state transition rule
30
+ for (const [nodeTypeId, transitions] of Object.entries(configuration.validation.stateTransitions)) {
31
+ const basePath = `validation.stateTransitions.${nodeTypeId}`;
32
+ // Check if nodeType exists
33
+ if (!configuration.nodeTypes?.[nodeTypeId]) {
34
+ violations.push({
35
+ ruleId: 'state-transition-references',
36
+ severity: 'error',
37
+ file: configPath,
38
+ path: basePath,
39
+ message: `State transitions defined for undefined nodeType "${nodeTypeId}"`,
40
+ impact: 'These state transitions will never apply',
41
+ suggestion: `Available nodeTypes: ${Object.keys(configuration.nodeTypes ?? {}).join(', ') || '(none defined)'}`,
42
+ fixable: false,
43
+ });
44
+ continue;
45
+ }
46
+ // Check if nodeType has states defined
47
+ const definedStates = statesByNodeType.get(nodeTypeId);
48
+ if (!definedStates || definedStates.size === 0) {
49
+ violations.push({
50
+ ruleId: 'state-transition-references',
51
+ severity: 'error',
52
+ file: configPath,
53
+ path: basePath,
54
+ message: `State transitions defined for nodeType "${nodeTypeId}" which has no states`,
55
+ impact: 'These state transitions will never apply',
56
+ suggestion: `Add states to nodeTypes.${nodeTypeId}.states`,
57
+ fixable: false,
58
+ });
59
+ continue;
60
+ }
61
+ // Check each transition
62
+ if (Array.isArray(transitions)) {
63
+ for (let i = 0; i < transitions.length; i++) {
64
+ const transition = transitions[i];
65
+ const transitionPath = `${basePath}[${i}]`;
66
+ // Check 'from' state
67
+ if (transition.from && !definedStates.has(transition.from)) {
68
+ const suggestion = findSimilar(transition.from, definedStates);
69
+ violations.push({
70
+ ruleId: 'state-transition-references',
71
+ severity: 'error',
72
+ file: configPath,
73
+ path: `${transitionPath}.from`,
74
+ message: `Transition references undefined state "${transition.from}" in nodeType "${nodeTypeId}"`,
75
+ impact: 'This transition will never match',
76
+ suggestion: suggestion
77
+ ? `Did you mean "${suggestion}"?`
78
+ : `Available states: ${[...definedStates].join(', ')}`,
79
+ fixable: false,
80
+ });
81
+ }
82
+ // Check 'to' states
83
+ if (Array.isArray(transition.to)) {
84
+ for (let j = 0; j < transition.to.length; j++) {
85
+ const toState = transition.to[j];
86
+ if (!definedStates.has(toState)) {
87
+ const suggestion = findSimilar(toState, definedStates);
88
+ violations.push({
89
+ ruleId: 'state-transition-references',
90
+ severity: 'error',
91
+ file: configPath,
92
+ path: `${transitionPath}.to[${j}]`,
93
+ message: `Transition references undefined state "${toState}" in nodeType "${nodeTypeId}"`,
94
+ impact: 'This transition target is invalid',
95
+ suggestion: suggestion
96
+ ? `Did you mean "${suggestion}"?`
97
+ : `Available states: ${[...definedStates].join(', ')}`,
98
+ fixable: false,
99
+ });
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ return violations;
107
+ },
108
+ };
109
+ /**
110
+ * Find a similar string from a set (for "did you mean" suggestions)
111
+ */
112
+ function findSimilar(input, candidates) {
113
+ const inputLower = input.toLowerCase();
114
+ for (const candidate of candidates) {
115
+ const candidateLower = candidate.toLowerCase();
116
+ // Exact substring match
117
+ if (inputLower.includes(candidateLower) || candidateLower.includes(inputLower)) {
118
+ return candidate;
119
+ }
120
+ // Small edit distance
121
+ if (Math.abs(input.length - candidate.length) <= 2) {
122
+ let differences = 0;
123
+ const minLen = Math.min(inputLower.length, candidateLower.length);
124
+ for (let i = 0; i < minLen; i++) {
125
+ if (inputLower[i] !== candidateLower[i])
126
+ differences++;
127
+ }
128
+ differences += Math.abs(input.length - candidate.length);
129
+ if (differences <= 2)
130
+ return candidate;
131
+ }
132
+ }
133
+ return null;
134
+ }
135
+ //# sourceMappingURL=state-transition-references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-transition-references.js","sourceRoot":"","sources":["../../../src/rules/implementations/state-transition-references.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Rule: unreachable-states
3
+ * Warns when states have no entry transitions (cannot be reached)
4
+ */
5
+ import type { GraphRule } from '../types';
6
+ export declare const unreachableStates: GraphRule;
7
+ //# sourceMappingURL=unreachable-states.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unreachable-states.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/unreachable-states.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,UAAU,CAAC;AAEhF,eAAO,MAAM,iBAAiB,EAAE,SAsF/B,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Rule: unreachable-states
3
+ * Warns when states have no entry transitions (cannot be reached)
4
+ */
5
+ export const unreachableStates = {
6
+ id: 'unreachable-states',
7
+ name: 'Unreachable States',
8
+ description: 'States should have at least one entry transition or be an initial state',
9
+ impact: 'Unreachable states can never be entered and may indicate configuration errors',
10
+ severity: 'error',
11
+ category: 'structure',
12
+ enabled: true,
13
+ fixable: false,
14
+ async check(context) {
15
+ const violations = [];
16
+ const { configuration, configPath } = context;
17
+ if (!configuration.nodeTypes) {
18
+ return violations;
19
+ }
20
+ // For each nodeType with states, check if all states are reachable
21
+ for (const [typeId, nodeType] of Object.entries(configuration.nodeTypes)) {
22
+ if (!nodeType.states || Object.keys(nodeType.states).length === 0) {
23
+ continue;
24
+ }
25
+ const stateIds = Object.keys(nodeType.states);
26
+ // If there's only one state, it's implicitly the initial state
27
+ if (stateIds.length <= 1) {
28
+ continue;
29
+ }
30
+ // Get state transitions for this nodeType
31
+ const transitions = configuration.validation?.stateTransitions?.[typeId];
32
+ if (!transitions || !Array.isArray(transitions) || transitions.length === 0) {
33
+ // No transitions defined - all states except the first are unreachable
34
+ // The first state is conventionally the initial state
35
+ for (let i = 1; i < stateIds.length; i++) {
36
+ violations.push({
37
+ ruleId: 'unreachable-states',
38
+ severity: 'error',
39
+ file: configPath,
40
+ path: `nodeTypes.${typeId}.states.${stateIds[i]}`,
41
+ message: `State "${stateIds[i]}" in node type "${typeId}" has no entry transitions`,
42
+ impact: 'This state can never be reached',
43
+ suggestion: `Add a state transition to "${stateIds[i]}" in validation.stateTransitions.${typeId}`,
44
+ fixable: false,
45
+ });
46
+ }
47
+ continue;
48
+ }
49
+ // Build set of states that can be reached (are targets of transitions)
50
+ const reachableStates = new Set();
51
+ // First state is assumed to be the initial state
52
+ reachableStates.add(stateIds[0]);
53
+ // Add all states that are targets of transitions
54
+ for (const transition of transitions) {
55
+ if (Array.isArray(transition.to)) {
56
+ for (const toState of transition.to) {
57
+ reachableStates.add(toState);
58
+ }
59
+ }
60
+ }
61
+ // Check for unreachable states
62
+ for (const stateId of stateIds) {
63
+ if (!reachableStates.has(stateId)) {
64
+ violations.push({
65
+ ruleId: 'unreachable-states',
66
+ severity: 'error',
67
+ file: configPath,
68
+ path: `nodeTypes.${typeId}.states.${stateId}`,
69
+ message: `State "${stateId}" in node type "${typeId}" has no entry transitions`,
70
+ impact: 'This state can never be reached',
71
+ suggestion: `Add a state transition to "${stateId}" in validation.stateTransitions.${typeId}`,
72
+ fixable: false,
73
+ });
74
+ }
75
+ }
76
+ }
77
+ return violations;
78
+ },
79
+ };
80
+ //# sourceMappingURL=unreachable-states.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unreachable-states.js","sourceRoot":"","sources":["../../../src/rules/implementations/unreachable-states.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Rule: valid-action-patterns
3
+ * Ensures action pattern regex is syntactically valid
4
+ */
5
+ import type { GraphRule, RuleOptions } from '../types';
6
+ /**
7
+ * Options for valid-action-patterns rule
8
+ */
9
+ export interface ValidActionPatternsOptions extends RuleOptions {
10
+ /**
11
+ * Enable strict mode - also validates capture group references
12
+ * @default false
13
+ */
14
+ strictMode: boolean;
15
+ }
16
+ export declare const validActionPatterns: GraphRule<ValidActionPatternsOptions>;
17
+ //# sourceMappingURL=valid-action-patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valid-action-patterns.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/valid-action-patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,WAAW,EAAE,MAAM,UAAU,CAAC;AAE7F;;GAEG;AACH,MAAM,WAAW,0BAA2B,SAAQ,WAAW;IAC7D;;;OAGG;IACH,UAAU,EAAE,OAAO,CAAC;CACrB;AAMD,eAAO,MAAM,mBAAmB,EAAE,SAAS,CAAC,0BAA0B,CAgGrE,CAAC"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Rule: valid-action-patterns
3
+ * Ensures action pattern regex is syntactically valid
4
+ */
5
+ const DEFAULT_OPTIONS = {
6
+ strictMode: false,
7
+ };
8
+ export const validActionPatterns = {
9
+ id: 'valid-action-patterns',
10
+ name: 'Valid Action Patterns',
11
+ description: 'Action pattern regex must be syntactically valid',
12
+ impact: 'Invalid regex patterns will cause runtime errors during log processing',
13
+ severity: 'error',
14
+ category: 'pattern',
15
+ enabled: true,
16
+ fixable: false,
17
+ defaultOptions: DEFAULT_OPTIONS,
18
+ async check(context) {
19
+ const violations = [];
20
+ const { configuration, configPath, options } = context;
21
+ if (!configuration.nodeTypes) {
22
+ return violations;
23
+ }
24
+ for (const [typeId, nodeType] of Object.entries(configuration.nodeTypes)) {
25
+ // Check if nodeType has actions (from path-based config extension)
26
+ const nodeTypeAny = nodeType;
27
+ const actions = nodeTypeAny.actions;
28
+ if (!Array.isArray(actions)) {
29
+ continue;
30
+ }
31
+ for (let i = 0; i < actions.length; i++) {
32
+ const action = actions[i];
33
+ const pattern = action.pattern;
34
+ const basePath = `nodeTypes.${typeId}.actions[${i}]`;
35
+ if (typeof pattern !== 'string') {
36
+ violations.push({
37
+ ruleId: 'valid-action-patterns',
38
+ severity: 'error',
39
+ file: configPath,
40
+ path: `${basePath}.pattern`,
41
+ message: `Action pattern must be a string`,
42
+ impact: 'Pattern matching will fail',
43
+ suggestion: 'Provide a valid regex pattern string',
44
+ fixable: false,
45
+ });
46
+ continue;
47
+ }
48
+ // Test if regex is valid
49
+ try {
50
+ new RegExp(pattern);
51
+ }
52
+ catch (error) {
53
+ const errorMessage = error instanceof Error ? error.message : String(error);
54
+ violations.push({
55
+ ruleId: 'valid-action-patterns',
56
+ severity: 'error',
57
+ file: configPath,
58
+ path: `${basePath}.pattern`,
59
+ message: `Invalid regex pattern "${pattern}": ${errorMessage}`,
60
+ impact: 'Pattern matching will fail at runtime',
61
+ suggestion: 'Fix the regex syntax error',
62
+ fixable: false,
63
+ });
64
+ continue;
65
+ }
66
+ // In strict mode, validate capture group references in metadata
67
+ if (options.strictMode) {
68
+ const metadata = action.metadata;
69
+ if (metadata) {
70
+ // Extract capture group names from pattern
71
+ const captureGroupNames = extractCaptureGroupNames(pattern);
72
+ for (const [metaKey, metaValue] of Object.entries(metadata)) {
73
+ if (typeof metaValue === 'string' && metaValue.startsWith('$')) {
74
+ const groupName = metaValue.slice(1);
75
+ if (!captureGroupNames.has(groupName)) {
76
+ violations.push({
77
+ ruleId: 'valid-action-patterns',
78
+ severity: 'error',
79
+ file: configPath,
80
+ path: `${basePath}.metadata.${metaKey}`,
81
+ message: `Metadata references undefined capture group "$${groupName}"`,
82
+ impact: 'Metadata extraction will fail',
83
+ suggestion: `Available capture groups: ${[...captureGroupNames].join(', ') || '(none)'}`,
84
+ fixable: false,
85
+ });
86
+ }
87
+ }
88
+ }
89
+ }
90
+ }
91
+ }
92
+ }
93
+ return violations;
94
+ },
95
+ };
96
+ /**
97
+ * Extract named capture group names from a regex pattern
98
+ */
99
+ function extractCaptureGroupNames(pattern) {
100
+ const names = new Set();
101
+ // Match named capture groups: (?<name>...)
102
+ const namedGroupRegex = /\(\?<([a-zA-Z_][a-zA-Z0-9_]*)>/g;
103
+ let match;
104
+ while ((match = namedGroupRegex.exec(pattern)) !== null) {
105
+ names.add(match[1]);
106
+ }
107
+ return names;
108
+ }
109
+ //# sourceMappingURL=valid-action-patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valid-action-patterns.js","sourceRoot":"","sources":["../../../src/rules/implementations/valid-action-patterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Rule: valid-color-format
3
+ * Ensures all color values are valid hex codes
4
+ */
5
+ import type { GraphRule } from '../types';
6
+ export declare const validColorFormat: GraphRule;
7
+ //# sourceMappingURL=valid-color-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valid-color-format.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/valid-color-format.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,UAAU,CAAC;AAOhF,eAAO,MAAM,gBAAgB,EAAE,SAkG9B,CAAC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Rule: valid-color-format
3
+ * Ensures all color values are valid hex codes
4
+ */
5
+ /**
6
+ * Regex for valid hex color codes (#RGB or #RRGGBB)
7
+ */
8
+ const HEX_COLOR_REGEX = /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/;
9
+ export const validColorFormat = {
10
+ id: 'valid-color-format',
11
+ name: 'Valid Color Format',
12
+ description: 'Color values must be valid hex codes (#RGB or #RRGGBB)',
13
+ impact: 'Invalid colors may render incorrectly or cause visualization errors',
14
+ severity: 'error',
15
+ category: 'schema',
16
+ enabled: true,
17
+ fixable: true,
18
+ async check(context) {
19
+ const violations = [];
20
+ const { configuration, configPath } = context;
21
+ // Check nodeTypes colors
22
+ if (configuration.nodeTypes) {
23
+ for (const [typeId, nodeType] of Object.entries(configuration.nodeTypes)) {
24
+ // Check node color
25
+ if (nodeType.color && !isValidColor(nodeType.color)) {
26
+ violations.push(createColorViolation(configPath, `nodeTypes.${typeId}.color`, nodeType.color, `node type "${typeId}"`));
27
+ }
28
+ // Check node stroke color
29
+ if (nodeType.stroke && !isValidColor(nodeType.stroke)) {
30
+ violations.push(createColorViolation(configPath, `nodeTypes.${typeId}.stroke`, nodeType.stroke, `node type "${typeId}" stroke`));
31
+ }
32
+ // Check state colors
33
+ if (nodeType.states) {
34
+ for (const [stateName, stateDef] of Object.entries(nodeType.states)) {
35
+ if (stateDef.color && !isValidColor(stateDef.color)) {
36
+ violations.push(createColorViolation(configPath, `nodeTypes.${typeId}.states.${stateName}.color`, stateDef.color, `state "${stateName}" in node type "${typeId}"`));
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
42
+ // Check edgeTypes colors
43
+ if (configuration.edgeTypes) {
44
+ for (const [typeId, edgeType] of Object.entries(configuration.edgeTypes)) {
45
+ // Check edge color
46
+ if (edgeType.color && !isValidColor(edgeType.color)) {
47
+ violations.push(createColorViolation(configPath, `edgeTypes.${typeId}.color`, edgeType.color, `edge type "${typeId}"`));
48
+ }
49
+ // Check animation color
50
+ if (edgeType.animation?.color && !isValidColor(edgeType.animation.color)) {
51
+ violations.push(createColorViolation(configPath, `edgeTypes.${typeId}.animation.color`, edgeType.animation.color, `animation in edge type "${typeId}"`));
52
+ }
53
+ }
54
+ }
55
+ // Check display theme colors
56
+ if (configuration.display?.theme) {
57
+ const theme = configuration.display.theme;
58
+ const themeColors = ['primary', 'success', 'warning', 'danger', 'info'];
59
+ for (const colorKey of themeColors) {
60
+ const colorValue = theme[colorKey];
61
+ if (colorValue && !isValidColor(colorValue)) {
62
+ violations.push(createColorViolation(configPath, `display.theme.${colorKey}`, colorValue, `theme ${colorKey} color`));
63
+ }
64
+ }
65
+ }
66
+ return violations;
67
+ },
68
+ };
69
+ /**
70
+ * Check if a color value is valid
71
+ */
72
+ function isValidColor(color) {
73
+ return HEX_COLOR_REGEX.test(color);
74
+ }
75
+ /**
76
+ * Create a color format violation
77
+ */
78
+ function createColorViolation(configPath, path, value, description) {
79
+ return {
80
+ ruleId: 'valid-color-format',
81
+ severity: 'error',
82
+ file: configPath,
83
+ path,
84
+ message: `Invalid color format "${value}" for ${description}`,
85
+ impact: 'Color may not render correctly',
86
+ suggestion: 'Use hex format: #RGB or #RRGGBB (e.g., #3b82f6 or #f00)',
87
+ fixable: true,
88
+ fixData: { path, value, description },
89
+ };
90
+ }
91
+ //# sourceMappingURL=valid-color-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valid-color-format.js","sourceRoot":"","sources":["../../../src/rules/implementations/valid-color-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Rule: valid-edge-types
3
+ * Ensures edgeTypes have required fields and valid values
4
+ */
5
+ import type { GraphRule } from '../types';
6
+ export declare const validEdgeTypes: GraphRule;
7
+ //# sourceMappingURL=valid-edge-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valid-edge-types.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/valid-edge-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,UAAU,CAAC;AAsBhF,eAAO,MAAM,cAAc,EAAE,SAsO5B,CAAC"}