@graph-ir/core 0.2.0

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 (92) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -0
  3. package/dist/generation/id-generator.d.ts +81 -0
  4. package/dist/generation/id-generator.d.ts.map +1 -0
  5. package/dist/generation/id-generator.js +193 -0
  6. package/dist/generation/id-generator.js.map +1 -0
  7. package/dist/generation/index.d.ts +7 -0
  8. package/dist/generation/index.d.ts.map +1 -0
  9. package/dist/generation/index.js +7 -0
  10. package/dist/generation/index.js.map +1 -0
  11. package/dist/index.d.ts +12 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +26 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/output/ci.d.ts +36 -0
  16. package/dist/output/ci.d.ts.map +1 -0
  17. package/dist/output/ci.js +145 -0
  18. package/dist/output/ci.js.map +1 -0
  19. package/dist/output/index.d.ts +20 -0
  20. package/dist/output/index.d.ts.map +1 -0
  21. package/dist/output/index.js +40 -0
  22. package/dist/output/index.js.map +1 -0
  23. package/dist/output/json.d.ts +24 -0
  24. package/dist/output/json.d.ts.map +1 -0
  25. package/dist/output/json.js +49 -0
  26. package/dist/output/json.js.map +1 -0
  27. package/dist/output/pretty.d.ts +44 -0
  28. package/dist/output/pretty.d.ts.map +1 -0
  29. package/dist/output/pretty.js +227 -0
  30. package/dist/output/pretty.js.map +1 -0
  31. package/dist/output/types.d.ts +63 -0
  32. package/dist/output/types.d.ts.map +1 -0
  33. package/dist/output/types.js +5 -0
  34. package/dist/output/types.js.map +1 -0
  35. package/dist/schemas/graph-ir.schema.json +360 -0
  36. package/dist/skills/diff.d.ts +73 -0
  37. package/dist/skills/diff.d.ts.map +1 -0
  38. package/dist/skills/diff.js +315 -0
  39. package/dist/skills/diff.js.map +1 -0
  40. package/dist/skills/migrate.d.ts +40 -0
  41. package/dist/skills/migrate.d.ts.map +1 -0
  42. package/dist/skills/migrate.js +288 -0
  43. package/dist/skills/migrate.js.map +1 -0
  44. package/dist/skills/visualize.d.ts +30 -0
  45. package/dist/skills/visualize.d.ts.map +1 -0
  46. package/dist/skills/visualize.js +254 -0
  47. package/dist/skills/visualize.js.map +1 -0
  48. package/dist/symbols/index.d.ts +12 -0
  49. package/dist/symbols/index.d.ts.map +1 -0
  50. package/dist/symbols/index.js +12 -0
  51. package/dist/symbols/index.js.map +1 -0
  52. package/dist/symbols/notation-registry.d.ts +61 -0
  53. package/dist/symbols/notation-registry.d.ts.map +1 -0
  54. package/dist/symbols/notation-registry.js +114 -0
  55. package/dist/symbols/notation-registry.js.map +1 -0
  56. package/dist/symbols/symbol-registry.d.ts +58 -0
  57. package/dist/symbols/symbol-registry.d.ts.map +1 -0
  58. package/dist/symbols/symbol-registry.js +88 -0
  59. package/dist/symbols/symbol-registry.js.map +1 -0
  60. package/dist/symbols/types.d.ts +166 -0
  61. package/dist/symbols/types.d.ts.map +1 -0
  62. package/dist/symbols/types.js +13 -0
  63. package/dist/symbols/types.js.map +1 -0
  64. package/dist/testing/diff.d.ts +46 -0
  65. package/dist/testing/diff.d.ts.map +1 -0
  66. package/dist/testing/diff.js +400 -0
  67. package/dist/testing/diff.js.map +1 -0
  68. package/dist/testing/index.d.ts +10 -0
  69. package/dist/testing/index.d.ts.map +1 -0
  70. package/dist/testing/index.js +10 -0
  71. package/dist/testing/index.js.map +1 -0
  72. package/dist/testing/snapshot.d.ts +95 -0
  73. package/dist/testing/snapshot.d.ts.map +1 -0
  74. package/dist/testing/snapshot.js +172 -0
  75. package/dist/testing/snapshot.js.map +1 -0
  76. package/dist/types.d.ts +240 -0
  77. package/dist/types.d.ts.map +1 -0
  78. package/dist/types.js +7 -0
  79. package/dist/types.js.map +1 -0
  80. package/dist/validation/index.d.ts +9 -0
  81. package/dist/validation/index.d.ts.map +1 -0
  82. package/dist/validation/index.js +8 -0
  83. package/dist/validation/index.js.map +1 -0
  84. package/dist/validation/ir-validator.d.ts +51 -0
  85. package/dist/validation/ir-validator.d.ts.map +1 -0
  86. package/dist/validation/ir-validator.js +349 -0
  87. package/dist/validation/ir-validator.js.map +1 -0
  88. package/dist/validation/validator.d.ts +13 -0
  89. package/dist/validation/validator.d.ts.map +1 -0
  90. package/dist/validation/validator.js +19 -0
  91. package/dist/validation/validator.js.map +1 -0
  92. package/package.json +73 -0
@@ -0,0 +1,315 @@
1
+ /**
2
+ * IR Diff Skill
3
+ *
4
+ * Compare two Graph-IR files and display semantic differences.
5
+ */
6
+ const DEFAULT_IGNORE = ['sourceInfo', 'position'];
7
+ /**
8
+ * Compare two Graph-IR objects
9
+ */
10
+ export function diffIR(base, target, options = {}) {
11
+ const ignore = new Set([...DEFAULT_IGNORE, ...(options.ignore || [])]);
12
+ const format = options.format || 'pretty';
13
+ try {
14
+ // Index nodes and edges by ID
15
+ const baseNodes = new Map(base.nodes.map((n) => [n.id, n]));
16
+ const targetNodes = new Map(target.nodes.map((n) => [n.id, n]));
17
+ const baseEdges = new Map(base.edges.map((e) => [e.id, e]));
18
+ const targetEdges = new Map(target.edges.map((e) => [e.id, e]));
19
+ // Find node changes
20
+ const nodesAdded = [];
21
+ const nodesRemoved = [];
22
+ const nodesModified = [];
23
+ // Added nodes (in target, not in base)
24
+ for (const [id, node] of targetNodes) {
25
+ if (!baseNodes.has(id)) {
26
+ nodesAdded.push({ id, type: node.type, label: node.label });
27
+ }
28
+ }
29
+ // Removed nodes (in base, not in target)
30
+ for (const [id, node] of baseNodes) {
31
+ if (!targetNodes.has(id)) {
32
+ nodesRemoved.push({ id, type: node.type, label: node.label });
33
+ }
34
+ }
35
+ // Modified nodes (in both, but different)
36
+ for (const [id, baseNode] of baseNodes) {
37
+ const targetNode = targetNodes.get(id);
38
+ if (targetNode) {
39
+ const changes = compareObjects(baseNode, targetNode, ignore);
40
+ if (changes.length > 0) {
41
+ nodesModified.push({ id, changes });
42
+ }
43
+ }
44
+ }
45
+ // Find edge changes
46
+ const edgesAdded = [];
47
+ const edgesRemoved = [];
48
+ const edgesModified = [];
49
+ // Added edges
50
+ for (const [id, edge] of targetEdges) {
51
+ if (!baseEdges.has(id)) {
52
+ edgesAdded.push({
53
+ id,
54
+ source: edge.source,
55
+ target: edge.target,
56
+ label: edge.label,
57
+ });
58
+ }
59
+ }
60
+ // Removed edges
61
+ for (const [id, edge] of baseEdges) {
62
+ if (!targetEdges.has(id)) {
63
+ edgesRemoved.push({
64
+ id,
65
+ source: edge.source,
66
+ target: edge.target,
67
+ label: edge.label,
68
+ });
69
+ }
70
+ }
71
+ // Modified edges
72
+ for (const [id, baseEdge] of baseEdges) {
73
+ const targetEdge = targetEdges.get(id);
74
+ if (targetEdge) {
75
+ const changes = compareObjects(baseEdge, targetEdge, ignore);
76
+ if (changes.length > 0) {
77
+ edgesModified.push({ id, changes });
78
+ }
79
+ }
80
+ }
81
+ const changes = {
82
+ nodes: { added: nodesAdded, removed: nodesRemoved, modified: nodesModified },
83
+ edges: { added: edgesAdded, removed: edgesRemoved, modified: edgesModified },
84
+ };
85
+ const summary = {
86
+ nodes: {
87
+ added: nodesAdded.length,
88
+ modified: nodesModified.length,
89
+ removed: nodesRemoved.length,
90
+ },
91
+ edges: {
92
+ added: edgesAdded.length,
93
+ modified: edgesModified.length,
94
+ removed: edgesRemoved.length,
95
+ },
96
+ };
97
+ // Format output
98
+ let output;
99
+ if (options.statsOnly) {
100
+ output = formatStatsOnly(summary, base.nodes.length, target.nodes.length);
101
+ }
102
+ else {
103
+ switch (format) {
104
+ case 'json':
105
+ output = JSON.stringify({ changes, summary }, null, 2);
106
+ break;
107
+ case 'markdown':
108
+ output = formatMarkdown(changes, summary);
109
+ break;
110
+ case 'pretty':
111
+ default:
112
+ output = formatPretty(changes, summary);
113
+ break;
114
+ }
115
+ }
116
+ return { success: true, changes, summary, output, errors: [] };
117
+ }
118
+ catch (e) {
119
+ return {
120
+ success: false,
121
+ changes: {
122
+ nodes: { added: [], removed: [], modified: [] },
123
+ edges: { added: [], removed: [], modified: [] },
124
+ },
125
+ summary: {
126
+ nodes: { added: 0, modified: 0, removed: 0 },
127
+ edges: { added: 0, modified: 0, removed: 0 },
128
+ },
129
+ output: '',
130
+ errors: [e instanceof Error ? e.message : 'Unknown error'],
131
+ };
132
+ }
133
+ }
134
+ /**
135
+ * Deep compare two objects and return field changes
136
+ */
137
+ function compareObjects(base, target, ignore, prefix = '') {
138
+ const changes = [];
139
+ const allKeys = new Set([...Object.keys(base), ...Object.keys(target)]);
140
+ for (const key of allKeys) {
141
+ if (ignore.has(key))
142
+ continue;
143
+ const path = prefix ? `${prefix}.${key}` : key;
144
+ const baseVal = base[key];
145
+ const targetVal = target[key];
146
+ if (baseVal === undefined && targetVal !== undefined) {
147
+ changes.push({ path, from: undefined, to: targetVal });
148
+ }
149
+ else if (baseVal !== undefined && targetVal === undefined) {
150
+ changes.push({ path, from: baseVal, to: undefined });
151
+ }
152
+ else if (typeof baseVal === 'object' && typeof targetVal === 'object') {
153
+ if (baseVal === null || targetVal === null) {
154
+ if (baseVal !== targetVal) {
155
+ changes.push({ path, from: baseVal, to: targetVal });
156
+ }
157
+ }
158
+ else if (Array.isArray(baseVal) && Array.isArray(targetVal)) {
159
+ if (JSON.stringify(baseVal) !== JSON.stringify(targetVal)) {
160
+ changes.push({ path, from: baseVal, to: targetVal });
161
+ }
162
+ }
163
+ else {
164
+ const nested = compareObjects(baseVal, targetVal, ignore, path);
165
+ changes.push(...nested);
166
+ }
167
+ }
168
+ else if (baseVal !== targetVal) {
169
+ changes.push({ path, from: baseVal, to: targetVal });
170
+ }
171
+ }
172
+ return changes;
173
+ }
174
+ function formatStatsOnly(summary, baseCount, targetCount) {
175
+ const lines = [];
176
+ const { nodes, edges } = summary;
177
+ lines.push(`Nodes: +${nodes.added} added, ${nodes.modified} modified, -${nodes.removed} removed (${baseCount} → ${targetCount})`);
178
+ lines.push(`Edges: +${edges.added} added, ${edges.modified} modified, -${edges.removed} removed`);
179
+ return lines.join('\n');
180
+ }
181
+ function formatPretty(changes, summary) {
182
+ const lines = [];
183
+ lines.push('Graph-IR Diff');
184
+ lines.push('═'.repeat(40));
185
+ lines.push('');
186
+ // Nodes section
187
+ lines.push('NODES');
188
+ lines.push('─'.repeat(20));
189
+ if (changes.nodes.added.length === 0 &&
190
+ changes.nodes.removed.length === 0 &&
191
+ changes.nodes.modified.length === 0) {
192
+ lines.push('(no changes)');
193
+ }
194
+ else {
195
+ for (const node of changes.nodes.added) {
196
+ lines.push(`+ Added: ${node.id}`);
197
+ lines.push(` type: ${node.type}`);
198
+ if (node.label)
199
+ lines.push(` label: "${node.label}"`);
200
+ lines.push('');
201
+ }
202
+ for (const mod of changes.nodes.modified) {
203
+ lines.push(`~ Modified: ${mod.id}`);
204
+ for (const change of mod.changes) {
205
+ lines.push(` - ${change.path}: ${JSON.stringify(change.from)}`);
206
+ lines.push(` + ${change.path}: ${JSON.stringify(change.to)}`);
207
+ }
208
+ lines.push('');
209
+ }
210
+ for (const node of changes.nodes.removed) {
211
+ lines.push(`- Removed: ${node.id}`);
212
+ lines.push(` type: ${node.type}`);
213
+ if (node.label)
214
+ lines.push(` label: "${node.label}"`);
215
+ lines.push('');
216
+ }
217
+ }
218
+ lines.push('');
219
+ // Edges section
220
+ lines.push('EDGES');
221
+ lines.push('─'.repeat(20));
222
+ if (changes.edges.added.length === 0 &&
223
+ changes.edges.removed.length === 0 &&
224
+ changes.edges.modified.length === 0) {
225
+ lines.push('(no changes)');
226
+ }
227
+ else {
228
+ for (const edge of changes.edges.added) {
229
+ lines.push(`+ Added: ${edge.id}`);
230
+ lines.push(` ${edge.source} → ${edge.target}`);
231
+ if (edge.label)
232
+ lines.push(` label: "${edge.label}"`);
233
+ lines.push('');
234
+ }
235
+ for (const mod of changes.edges.modified) {
236
+ lines.push(`~ Modified: ${mod.id}`);
237
+ for (const change of mod.changes) {
238
+ lines.push(` - ${change.path}: ${JSON.stringify(change.from)}`);
239
+ lines.push(` + ${change.path}: ${JSON.stringify(change.to)}`);
240
+ }
241
+ lines.push('');
242
+ }
243
+ for (const edge of changes.edges.removed) {
244
+ lines.push(`- Removed: ${edge.id}`);
245
+ lines.push(` ${edge.source} → ${edge.target}`);
246
+ if (edge.label)
247
+ lines.push(` label: "${edge.label}"`);
248
+ lines.push('');
249
+ }
250
+ }
251
+ // Summary
252
+ lines.push('');
253
+ lines.push('SUMMARY');
254
+ lines.push('─'.repeat(20));
255
+ lines.push(`Nodes: +${summary.nodes.added} ~${summary.nodes.modified} -${summary.nodes.removed}`);
256
+ lines.push(`Edges: +${summary.edges.added} ~${summary.edges.modified} -${summary.edges.removed}`);
257
+ return lines.join('\n');
258
+ }
259
+ function formatMarkdown(changes, summary) {
260
+ const lines = [];
261
+ lines.push('## Graph-IR Changes');
262
+ lines.push('');
263
+ // Nodes table
264
+ lines.push('### Nodes');
265
+ lines.push('');
266
+ if (changes.nodes.added.length === 0 &&
267
+ changes.nodes.removed.length === 0 &&
268
+ changes.nodes.modified.length === 0) {
269
+ lines.push('_No changes_');
270
+ }
271
+ else {
272
+ lines.push('| Change | ID | Type | Details |');
273
+ lines.push('|--------|-----|------|---------|');
274
+ for (const node of changes.nodes.added) {
275
+ lines.push(`| + Added | \`${node.id}\` | ${node.type} | ${node.label || ''} |`);
276
+ }
277
+ for (const mod of changes.nodes.modified) {
278
+ const details = mod.changes.map((c) => c.path).join(', ');
279
+ lines.push(`| ~ Modified | \`${mod.id}\` | - | ${details} |`);
280
+ }
281
+ for (const node of changes.nodes.removed) {
282
+ lines.push(`| - Removed | \`${node.id}\` | ${node.type} | ${node.label || ''} |`);
283
+ }
284
+ }
285
+ lines.push('');
286
+ // Edges table
287
+ lines.push('### Edges');
288
+ lines.push('');
289
+ if (changes.edges.added.length === 0 &&
290
+ changes.edges.removed.length === 0 &&
291
+ changes.edges.modified.length === 0) {
292
+ lines.push('_No changes_');
293
+ }
294
+ else {
295
+ lines.push('| Change | Connection | Label |');
296
+ lines.push('|--------|------------|-------|');
297
+ for (const edge of changes.edges.added) {
298
+ lines.push(`| + Added | \`${edge.source}\` → \`${edge.target}\` | ${edge.label || ''} |`);
299
+ }
300
+ for (const mod of changes.edges.modified) {
301
+ const details = mod.changes.map((c) => c.path).join(', ');
302
+ lines.push(`| ~ Modified | \`${mod.id}\` | ${details} |`);
303
+ }
304
+ for (const edge of changes.edges.removed) {
305
+ lines.push(`| - Removed | \`${edge.source}\` → \`${edge.target}\` | ${edge.label || ''} |`);
306
+ }
307
+ }
308
+ lines.push('');
309
+ // Summary
310
+ lines.push('### Summary');
311
+ lines.push(`- **Nodes**: +${summary.nodes.added} added, ${summary.nodes.modified} modified, -${summary.nodes.removed} removed`);
312
+ lines.push(`- **Edges**: +${summary.edges.added} added, ${summary.edges.modified} modified, -${summary.edges.removed} removed`);
313
+ return lines.join('\n');
314
+ }
315
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/skills/diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgEH,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AAElD;;GAEG;AACH,MAAM,UAAU,MAAM,CACpB,IAAa,EACb,MAAe,EACf,UAAuB,EAAE;IAEzB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,cAAc,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC;IAE1C,IAAI,CAAC;QACH,8BAA8B;QAC9B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEhE,oBAAoB;QACpB,MAAM,UAAU,GAAiB,EAAE,CAAC;QACpC,MAAM,YAAY,GAAiB,EAAE,CAAC;QACtC,MAAM,aAAa,GAAuB,EAAE,CAAC;QAE7C,uCAAuC;QACvC,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACvB,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACzB,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;YACvC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,cAAc,CAC5B,QAA8C,EAC9C,UAAgD,EAChD,MAAM,CACP,CAAC;gBACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,MAAM,UAAU,GAAiB,EAAE,CAAC;QACpC,MAAM,YAAY,GAAiB,EAAE,CAAC;QACtC,MAAM,aAAa,GAAuB,EAAE,CAAC;QAE7C,cAAc;QACd,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACvB,UAAU,CAAC,IAAI,CAAC;oBACd,EAAE;oBACF,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACzB,YAAY,CAAC,IAAI,CAAC;oBAChB,EAAE;oBACF,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;YACvC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,cAAc,CAC5B,QAA8C,EAC9C,UAAgD,EAChD,MAAM,CACP,CAAC;gBACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG;YACd,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE;YAC5E,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE;SAC7E,CAAC;QAEF,MAAM,OAAO,GAAG;YACd,KAAK,EAAE;gBACL,KAAK,EAAE,UAAU,CAAC,MAAM;gBACxB,QAAQ,EAAE,aAAa,CAAC,MAAM;gBAC9B,OAAO,EAAE,YAAY,CAAC,MAAM;aAC7B;YACD,KAAK,EAAE;gBACL,KAAK,EAAE,UAAU,CAAC,MAAM;gBACxB,QAAQ,EAAE,aAAa,CAAC,MAAM;gBAC9B,OAAO,EAAE,YAAY,CAAC,MAAM;aAC7B;SACF,CAAC;QAEF,gBAAgB;QAChB,IAAI,MAAc,CAAC;QACnB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,MAAM;oBACT,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;oBACvD,MAAM;gBACR,KAAK,UAAU;oBACb,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBAC1C,MAAM;gBACR,KAAK,QAAQ,CAAC;gBACd;oBACE,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACxC,MAAM;YACV,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACjE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE;gBACP,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;gBAC/C,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;aAChD;YACD,OAAO,EAAE;gBACP,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;gBAC5C,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;aAC7C;YACD,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;SAC3D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,IAA6B,EAC7B,MAA+B,EAC/B,MAAmB,EACnB,SAAiB,EAAE;IAEnB,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAExE,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAE9B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAE9B,IAAI,OAAO,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,OAAO,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YACxE,IAAI,OAAO,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBAC3C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9D,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC1D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,cAAc,CAC3B,OAAkC,EAClC,SAAoC,EACpC,MAAM,EACN,IAAI,CACL,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CACtB,OAA8B,EAC9B,SAAiB,EACjB,WAAmB;IAEnB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAEjC,KAAK,CAAC,IAAI,CACR,WAAW,KAAK,CAAC,KAAK,WAAW,KAAK,CAAC,QAAQ,eAAe,KAAK,CAAC,OAAO,aAAa,SAAS,MAAM,WAAW,GAAG,CACtH,CAAC;IACF,KAAK,CAAC,IAAI,CACR,WAAW,KAAK,CAAC,KAAK,WAAW,KAAK,CAAC,QAAQ,eAAe,KAAK,CAAC,OAAO,UAAU,CACtF,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CACnB,OAA8B,EAC9B,OAA8B;IAE9B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,gBAAgB;IAChB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjE,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,gBAAgB;IAChB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAChD,IAAI,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjE,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAChD,IAAI,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,UAAU;IACV,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,KAAK,CAAC,IAAI,CACR,YAAY,OAAO,CAAC,KAAK,CAAC,KAAK,MAAM,OAAO,CAAC,KAAK,CAAC,QAAQ,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CACzF,CAAC;IACF,KAAK,CAAC,IAAI,CACR,YAAY,OAAO,CAAC,KAAK,CAAC,KAAK,MAAM,OAAO,CAAC,KAAK,CAAC,QAAQ,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CACzF,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,cAAc,CACrB,OAA8B,EAC9B,OAA8B;IAE9B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,cAAc;IACd,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAEhD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,EAAE,QAAQ,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,KAAK,IAAI,EAAE,IAAI,CAAC,CAAC;QAClF,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,EAAE,YAAY,OAAO,IAAI,CAAC,CAAC;QAChE,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,EAAE,QAAQ,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,KAAK,IAAI,EAAE,IAAI,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,cAAc;IACd,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAE9C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,MAAM,UAAU,IAAI,CAAC,MAAM,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5F,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,EAAE,QAAQ,OAAO,IAAI,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,MAAM,UAAU,IAAI,CAAC,MAAM,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,UAAU;IACV,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1B,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,KAAK,CAAC,KAAK,WAAW,OAAO,CAAC,KAAK,CAAC,QAAQ,eAAe,OAAO,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;IAChI,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,KAAK,CAAC,KAAK,WAAW,OAAO,CAAC,KAAK,CAAC,QAAQ,eAAe,OAAO,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;IAEhI,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * IR Migrate Skill
3
+ *
4
+ * Migrate Graph-IR files between schema versions.
5
+ */
6
+ import type { GraphIR } from '@graph-ir/core';
7
+ export interface MigrationOptions {
8
+ /** Source version (auto-detect if not specified) */
9
+ fromVersion?: string;
10
+ /** Target version (latest if not specified) */
11
+ toVersion?: string;
12
+ /** Show what would change without modifying */
13
+ dryRun?: boolean;
14
+ /** Force migration even if validation fails */
15
+ force?: boolean;
16
+ }
17
+ export interface MigrationResult {
18
+ success: boolean;
19
+ migrated: GraphIR | null;
20
+ fromVersion: string;
21
+ toVersion: string;
22
+ changes: MigrationChange[];
23
+ errors: string[];
24
+ warnings: string[];
25
+ }
26
+ export interface MigrationChange {
27
+ type: 'add' | 'rename' | 'remove' | 'transform';
28
+ path: string;
29
+ description: string;
30
+ value?: unknown;
31
+ }
32
+ /**
33
+ * Migrate a Graph-IR to the target version
34
+ */
35
+ export declare function migrateIR(ir: unknown, options?: MigrationOptions): MigrationResult;
36
+ /**
37
+ * Format migration result for display
38
+ */
39
+ export declare function formatMigrationResult(result: MigrationResult, dryRun: boolean): string;
40
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/skills/migrate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA6GD;;GAEG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,OAAO,EACX,OAAO,GAAE,gBAAqB,GAC7B,eAAe,CAsFjB;AA4ED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CA6CtF"}
@@ -0,0 +1,288 @@
1
+ /**
2
+ * IR Migrate Skill
3
+ *
4
+ * Migrate Graph-IR files between schema versions.
5
+ */
6
+ // Current schema version
7
+ const CURRENT_VERSION = '1.0.0';
8
+ // Define migrations between versions
9
+ const MIGRATIONS = [
10
+ // Example: 0.9.0 -> 1.0.0
11
+ {
12
+ fromVersion: '0.9.0',
13
+ toVersion: '1.0.0',
14
+ changes: [
15
+ {
16
+ type: 'rename',
17
+ path: 'nodes[*].props',
18
+ description: 'Rename "props" to "properties"',
19
+ },
20
+ {
21
+ type: 'rename',
22
+ path: 'edges[*].from',
23
+ description: 'Rename "from" to "source"',
24
+ },
25
+ {
26
+ type: 'rename',
27
+ path: 'edges[*].to',
28
+ description: 'Rename "to" to "target"',
29
+ },
30
+ {
31
+ type: 'add',
32
+ path: 'edges[*].id',
33
+ description: 'Add required edge IDs',
34
+ },
35
+ ],
36
+ migrate: (ir) => {
37
+ const result = { ...ir };
38
+ // Rename node props -> properties
39
+ if (Array.isArray(result.nodes)) {
40
+ result.nodes = result.nodes.map((node, index) => {
41
+ const newNode = { ...node };
42
+ if ('props' in newNode) {
43
+ newNode.properties = newNode.props;
44
+ delete newNode.props;
45
+ }
46
+ return newNode;
47
+ });
48
+ }
49
+ // Rename edge from/to -> source/target and add IDs
50
+ if (Array.isArray(result.edges)) {
51
+ result.edges = result.edges.map((edge, index) => {
52
+ const newEdge = { ...edge };
53
+ if ('from' in newEdge) {
54
+ newEdge.source = newEdge.from;
55
+ delete newEdge.from;
56
+ }
57
+ if ('to' in newEdge) {
58
+ newEdge.target = newEdge.to;
59
+ delete newEdge.to;
60
+ }
61
+ if (!('id' in newEdge)) {
62
+ newEdge.id = `e${index + 1}`;
63
+ }
64
+ return newEdge;
65
+ });
66
+ }
67
+ result.version = '1.0.0';
68
+ return result;
69
+ },
70
+ },
71
+ // Example: 0.8.0 -> 0.9.0
72
+ {
73
+ fromVersion: '0.8.0',
74
+ toVersion: '0.9.0',
75
+ changes: [
76
+ {
77
+ type: 'add',
78
+ path: 'version',
79
+ description: 'Add required version field',
80
+ value: '0.9.0',
81
+ },
82
+ {
83
+ type: 'add',
84
+ path: 'id',
85
+ description: 'Add required graph ID',
86
+ },
87
+ ],
88
+ migrate: (ir) => {
89
+ const result = { ...ir };
90
+ if (!result.version) {
91
+ result.version = '0.9.0';
92
+ }
93
+ if (!result.id) {
94
+ result.id = 'migrated-graph';
95
+ }
96
+ return result;
97
+ },
98
+ },
99
+ ];
100
+ /**
101
+ * Migrate a Graph-IR to the target version
102
+ */
103
+ export function migrateIR(ir, options = {}) {
104
+ const errors = [];
105
+ const warnings = [];
106
+ const allChanges = [];
107
+ // Detect source version
108
+ const fromVersion = options.fromVersion || detectVersion(ir);
109
+ const toVersion = options.toVersion || CURRENT_VERSION;
110
+ if (!fromVersion) {
111
+ return {
112
+ success: false,
113
+ migrated: null,
114
+ fromVersion: 'unknown',
115
+ toVersion,
116
+ changes: [],
117
+ errors: ['Could not detect source version. Please specify --from <version>'],
118
+ warnings: [],
119
+ };
120
+ }
121
+ // Already at target version?
122
+ if (fromVersion === toVersion) {
123
+ return {
124
+ success: true,
125
+ migrated: ir,
126
+ fromVersion,
127
+ toVersion,
128
+ changes: [],
129
+ errors: [],
130
+ warnings: ['Already at target version'],
131
+ };
132
+ }
133
+ // Build migration path
134
+ const path = buildMigrationPath(fromVersion, toVersion);
135
+ if (path.length === 0) {
136
+ return {
137
+ success: false,
138
+ migrated: null,
139
+ fromVersion,
140
+ toVersion,
141
+ changes: [],
142
+ errors: [`No migration path found from ${fromVersion} to ${toVersion}`],
143
+ warnings: [],
144
+ };
145
+ }
146
+ // Apply migrations
147
+ let current = ir;
148
+ for (const migration of path) {
149
+ allChanges.push(...migration.changes);
150
+ if (!options.dryRun) {
151
+ try {
152
+ current = migration.migrate(current);
153
+ }
154
+ catch (e) {
155
+ const errorMsg = e instanceof Error ? e.message : 'Unknown migration error';
156
+ if (options.force) {
157
+ warnings.push(`Migration ${migration.fromVersion} → ${migration.toVersion} failed: ${errorMsg}`);
158
+ }
159
+ else {
160
+ return {
161
+ success: false,
162
+ migrated: null,
163
+ fromVersion,
164
+ toVersion,
165
+ changes: allChanges,
166
+ errors: [`Migration failed at ${migration.fromVersion} → ${migration.toVersion}: ${errorMsg}`],
167
+ warnings,
168
+ };
169
+ }
170
+ }
171
+ }
172
+ }
173
+ return {
174
+ success: true,
175
+ migrated: options.dryRun ? null : current,
176
+ fromVersion,
177
+ toVersion,
178
+ changes: allChanges,
179
+ errors,
180
+ warnings,
181
+ };
182
+ }
183
+ /**
184
+ * Detect the version of a Graph-IR object
185
+ */
186
+ function detectVersion(ir) {
187
+ if (!ir || typeof ir !== 'object') {
188
+ return null;
189
+ }
190
+ const obj = ir;
191
+ // Check explicit version field
192
+ if (typeof obj.version === 'string') {
193
+ return obj.version;
194
+ }
195
+ // Infer version from structure
196
+ if (Array.isArray(obj.nodes) && obj.nodes.length > 0) {
197
+ const firstNode = obj.nodes[0];
198
+ // v0.9.0: has 'props' instead of 'properties'
199
+ if ('props' in firstNode && !('properties' in firstNode)) {
200
+ return '0.9.0';
201
+ }
202
+ }
203
+ if (Array.isArray(obj.edges) && obj.edges.length > 0) {
204
+ const firstEdge = obj.edges[0];
205
+ // v0.9.0: has 'from'/'to' instead of 'source'/'target'
206
+ if (('from' in firstEdge || 'to' in firstEdge) &&
207
+ !('source' in firstEdge || 'target' in firstEdge)) {
208
+ return '0.9.0';
209
+ }
210
+ }
211
+ // No version field but has modern structure
212
+ if (!obj.version && obj.id && Array.isArray(obj.nodes) && Array.isArray(obj.edges)) {
213
+ // Could be 1.0.0 without version field
214
+ return '1.0.0';
215
+ }
216
+ // Very old version without id field
217
+ if (!obj.id && !obj.version) {
218
+ return '0.8.0';
219
+ }
220
+ return null;
221
+ }
222
+ /**
223
+ * Build the migration path from source to target version
224
+ */
225
+ function buildMigrationPath(from, to) {
226
+ const path = [];
227
+ let current = from;
228
+ // Simple linear search - could be optimized with graph traversal
229
+ while (current !== to) {
230
+ const migration = MIGRATIONS.find((m) => m.fromVersion === current);
231
+ if (!migration) {
232
+ break;
233
+ }
234
+ path.push(migration);
235
+ current = migration.toVersion;
236
+ }
237
+ // Verify we reached target
238
+ if (current !== to) {
239
+ return [];
240
+ }
241
+ return path;
242
+ }
243
+ /**
244
+ * Format migration result for display
245
+ */
246
+ export function formatMigrationResult(result, dryRun) {
247
+ const lines = [];
248
+ if (dryRun) {
249
+ lines.push('Migration Plan (Dry Run)');
250
+ }
251
+ else {
252
+ lines.push('Migration Result');
253
+ }
254
+ lines.push('═'.repeat(40));
255
+ lines.push(`Version: ${result.fromVersion} → ${result.toVersion}`);
256
+ lines.push('');
257
+ if (result.changes.length === 0) {
258
+ lines.push('No changes needed');
259
+ }
260
+ else {
261
+ lines.push(`Changes (${result.changes.length}):`);
262
+ for (const change of result.changes) {
263
+ const icon = change.type === 'add' ? '+' :
264
+ change.type === 'remove' ? '-' :
265
+ change.type === 'rename' ? '~' : '→';
266
+ lines.push(` ${icon} ${change.description}`);
267
+ lines.push(` Path: ${change.path}`);
268
+ }
269
+ }
270
+ if (result.warnings.length > 0) {
271
+ lines.push('');
272
+ lines.push('Warnings:');
273
+ for (const warning of result.warnings) {
274
+ lines.push(` ⚠ ${warning}`);
275
+ }
276
+ }
277
+ if (result.errors.length > 0) {
278
+ lines.push('');
279
+ lines.push('Errors:');
280
+ for (const error of result.errors) {
281
+ lines.push(` ✗ ${error}`);
282
+ }
283
+ }
284
+ lines.push('');
285
+ lines.push(result.success ? '✓ Migration successful' : '✗ Migration failed');
286
+ return lines.join('\n');
287
+ }
288
+ //# sourceMappingURL=migrate.js.map