@sudosandwich/limps 2.12.0 → 2.13.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 (191) hide show
  1. package/README.md +184 -73
  2. package/dist/cli/config-cmd.d.ts.map +1 -1
  3. package/dist/cli/config-cmd.js +3 -3
  4. package/dist/cli/config-cmd.js.map +1 -1
  5. package/dist/cli/graph-check.d.ts +15 -0
  6. package/dist/cli/graph-check.d.ts.map +1 -0
  7. package/dist/cli/graph-check.js +36 -0
  8. package/dist/cli/graph-check.js.map +1 -0
  9. package/dist/cli/graph-db.d.ts +4 -0
  10. package/dist/cli/graph-db.d.ts.map +1 -0
  11. package/dist/cli/graph-db.js +14 -0
  12. package/dist/cli/graph-db.js.map +1 -0
  13. package/dist/cli/graph-entity.d.ts +11 -0
  14. package/dist/cli/graph-entity.d.ts.map +1 -0
  15. package/dist/cli/graph-entity.js +18 -0
  16. package/dist/cli/graph-entity.js.map +1 -0
  17. package/dist/cli/graph-health.d.ts +19 -0
  18. package/dist/cli/graph-health.d.ts.map +1 -0
  19. package/dist/cli/graph-health.js +59 -0
  20. package/dist/cli/graph-health.js.map +1 -0
  21. package/dist/cli/graph-overlap.d.ts +12 -0
  22. package/dist/cli/graph-overlap.d.ts.map +1 -0
  23. package/dist/cli/graph-overlap.js +21 -0
  24. package/dist/cli/graph-overlap.js.map +1 -0
  25. package/dist/cli/graph-reindex.d.ts +14 -0
  26. package/dist/cli/graph-reindex.d.ts.map +1 -0
  27. package/dist/cli/graph-reindex.js +49 -0
  28. package/dist/cli/graph-reindex.js.map +1 -0
  29. package/dist/cli/graph-search.d.ts +15 -0
  30. package/dist/cli/graph-search.d.ts.map +1 -0
  31. package/dist/cli/graph-search.js +37 -0
  32. package/dist/cli/graph-search.js.map +1 -0
  33. package/dist/cli/graph-suggest.d.ts +12 -0
  34. package/dist/cli/graph-suggest.d.ts.map +1 -0
  35. package/dist/cli/graph-suggest.js +35 -0
  36. package/dist/cli/graph-suggest.js.map +1 -0
  37. package/dist/cli/graph-trace.d.ts +17 -0
  38. package/dist/cli/graph-trace.d.ts.map +1 -0
  39. package/dist/cli/graph-trace.js +30 -0
  40. package/dist/cli/graph-trace.js.map +1 -0
  41. package/dist/cli/graph-watch.d.ts +10 -0
  42. package/dist/cli/graph-watch.d.ts.map +1 -0
  43. package/dist/cli/graph-watch.js +18 -0
  44. package/dist/cli/graph-watch.js.map +1 -0
  45. package/dist/cli/mcp-client-adapter.d.ts +14 -5
  46. package/dist/cli/mcp-client-adapter.d.ts.map +1 -1
  47. package/dist/cli/mcp-client-adapter.js +14 -3
  48. package/dist/cli/mcp-client-adapter.js.map +1 -1
  49. package/dist/cli/mcp-clients.d.ts +2 -2
  50. package/dist/cli/mcp-clients.d.ts.map +1 -1
  51. package/dist/cli/mcp-clients.js +15 -0
  52. package/dist/cli/mcp-clients.js.map +1 -1
  53. package/dist/cli/plan-repair.d.ts +26 -0
  54. package/dist/cli/plan-repair.d.ts.map +1 -1
  55. package/dist/cli/plan-repair.js +84 -0
  56. package/dist/cli/plan-repair.js.map +1 -1
  57. package/dist/commands/config/sync-mcp.d.ts +1 -0
  58. package/dist/commands/config/sync-mcp.d.ts.map +1 -1
  59. package/dist/commands/config/sync-mcp.js +2 -2
  60. package/dist/commands/config/sync-mcp.js.map +1 -1
  61. package/dist/commands/graph/check.d.ts +16 -0
  62. package/dist/commands/graph/check.d.ts.map +1 -0
  63. package/dist/commands/graph/check.js +88 -0
  64. package/dist/commands/graph/check.js.map +1 -0
  65. package/dist/commands/graph/entity.d.ts +16 -0
  66. package/dist/commands/graph/entity.d.ts.map +1 -0
  67. package/dist/commands/graph/entity.js +83 -0
  68. package/dist/commands/graph/entity.js.map +1 -0
  69. package/dist/commands/graph/health.d.ts +16 -0
  70. package/dist/commands/graph/health.d.ts.map +1 -0
  71. package/dist/commands/graph/health.js +78 -0
  72. package/dist/commands/graph/health.js.map +1 -0
  73. package/dist/commands/graph/index.d.ts +3 -0
  74. package/dist/commands/graph/index.d.ts.map +1 -0
  75. package/dist/commands/graph/index.js +33 -0
  76. package/dist/commands/graph/index.js.map +1 -0
  77. package/dist/commands/graph/overlap.d.ts +18 -0
  78. package/dist/commands/graph/overlap.d.ts.map +1 -0
  79. package/dist/commands/graph/overlap.js +88 -0
  80. package/dist/commands/graph/overlap.js.map +1 -0
  81. package/dist/commands/graph/reindex.d.ts +18 -0
  82. package/dist/commands/graph/reindex.d.ts.map +1 -0
  83. package/dist/commands/graph/reindex.js +92 -0
  84. package/dist/commands/graph/reindex.js.map +1 -0
  85. package/dist/commands/graph/search.d.ts +18 -0
  86. package/dist/commands/graph/search.d.ts.map +1 -0
  87. package/dist/commands/graph/search.js +105 -0
  88. package/dist/commands/graph/search.js.map +1 -0
  89. package/dist/commands/graph/suggest.d.ts +16 -0
  90. package/dist/commands/graph/suggest.d.ts.map +1 -0
  91. package/dist/commands/graph/suggest.js +88 -0
  92. package/dist/commands/graph/suggest.js.map +1 -0
  93. package/dist/commands/graph/trace.d.ts +22 -0
  94. package/dist/commands/graph/trace.d.ts.map +1 -0
  95. package/dist/commands/graph/trace.js +97 -0
  96. package/dist/commands/graph/trace.js.map +1 -0
  97. package/dist/commands/graph/watch.d.ts +17 -0
  98. package/dist/commands/graph/watch.d.ts.map +1 -0
  99. package/dist/commands/graph/watch.js +48 -0
  100. package/dist/commands/graph/watch.js.map +1 -0
  101. package/dist/commands/index.d.ts.map +1 -1
  102. package/dist/commands/index.js +1 -1
  103. package/dist/commands/index.js.map +1 -1
  104. package/dist/commands/repair-plans.d.ts.map +1 -1
  105. package/dist/commands/repair-plans.js +74 -10
  106. package/dist/commands/repair-plans.js.map +1 -1
  107. package/dist/config.d.ts +23 -0
  108. package/dist/config.d.ts.map +1 -1
  109. package/dist/config.js +49 -0
  110. package/dist/config.js.map +1 -1
  111. package/dist/graph/conflict-detector.d.ts +27 -0
  112. package/dist/graph/conflict-detector.d.ts.map +1 -0
  113. package/dist/graph/conflict-detector.js +168 -0
  114. package/dist/graph/conflict-detector.js.map +1 -0
  115. package/dist/graph/extractor.d.ts +10 -0
  116. package/dist/graph/extractor.d.ts.map +1 -0
  117. package/dist/graph/extractor.js +266 -0
  118. package/dist/graph/extractor.js.map +1 -0
  119. package/dist/graph/notifier.d.ts +16 -0
  120. package/dist/graph/notifier.d.ts.map +1 -0
  121. package/dist/graph/notifier.js +61 -0
  122. package/dist/graph/notifier.js.map +1 -0
  123. package/dist/graph/parser.d.ts +10 -0
  124. package/dist/graph/parser.d.ts.map +1 -0
  125. package/dist/graph/parser.js +54 -0
  126. package/dist/graph/parser.js.map +1 -0
  127. package/dist/graph/patterns.d.ts +16 -0
  128. package/dist/graph/patterns.d.ts.map +1 -0
  129. package/dist/graph/patterns.js +23 -0
  130. package/dist/graph/patterns.js.map +1 -0
  131. package/dist/graph/resolver.d.ts +23 -0
  132. package/dist/graph/resolver.d.ts.map +1 -0
  133. package/dist/graph/resolver.js +98 -0
  134. package/dist/graph/resolver.js.map +1 -0
  135. package/dist/graph/similarity.d.ts +38 -0
  136. package/dist/graph/similarity.d.ts.map +1 -0
  137. package/dist/graph/similarity.js +74 -0
  138. package/dist/graph/similarity.js.map +1 -0
  139. package/dist/graph/storage.js +2 -2
  140. package/dist/graph/watcher.d.ts +23 -0
  141. package/dist/graph/watcher.d.ts.map +1 -0
  142. package/dist/graph/watcher.js +94 -0
  143. package/dist/graph/watcher.js.map +1 -0
  144. package/dist/resources/plans-summary.d.ts.map +1 -1
  145. package/dist/resources/plans-summary.js +7 -5
  146. package/dist/resources/plans-summary.js.map +1 -1
  147. package/dist/retrieval/bfs.d.ts +27 -0
  148. package/dist/retrieval/bfs.d.ts.map +1 -0
  149. package/dist/retrieval/bfs.js +77 -0
  150. package/dist/retrieval/bfs.js.map +1 -0
  151. package/dist/retrieval/hybrid.d.ts +25 -0
  152. package/dist/retrieval/hybrid.d.ts.map +1 -0
  153. package/dist/retrieval/hybrid.js +84 -0
  154. package/dist/retrieval/hybrid.js.map +1 -0
  155. package/dist/retrieval/recipes.d.ts +20 -0
  156. package/dist/retrieval/recipes.d.ts.map +1 -0
  157. package/dist/retrieval/recipes.js +123 -0
  158. package/dist/retrieval/recipes.js.map +1 -0
  159. package/dist/retrieval/router.d.ts +7 -0
  160. package/dist/retrieval/router.d.ts.map +1 -0
  161. package/dist/retrieval/router.js +51 -0
  162. package/dist/retrieval/router.js.map +1 -0
  163. package/dist/retrieval/rrf.d.ts +21 -0
  164. package/dist/retrieval/rrf.d.ts.map +1 -0
  165. package/dist/retrieval/rrf.js +27 -0
  166. package/dist/retrieval/rrf.js.map +1 -0
  167. package/dist/retrieval/types.d.ts +60 -0
  168. package/dist/retrieval/types.d.ts.map +1 -0
  169. package/dist/retrieval/types.js +18 -0
  170. package/dist/retrieval/types.js.map +1 -0
  171. package/dist/rlm/sandbox.d.ts.map +1 -1
  172. package/dist/rlm/sandbox.js +8 -1
  173. package/dist/rlm/sandbox.js.map +1 -1
  174. package/dist/tools/configure-scoring.d.ts.map +1 -1
  175. package/dist/tools/configure-scoring.js +3 -0
  176. package/dist/tools/configure-scoring.js.map +1 -1
  177. package/dist/tools/graph.d.ts +32 -0
  178. package/dist/tools/graph.d.ts.map +1 -0
  179. package/dist/tools/graph.js +105 -0
  180. package/dist/tools/graph.js.map +1 -0
  181. package/dist/tools/index.d.ts +1 -1
  182. package/dist/tools/index.d.ts.map +1 -1
  183. package/dist/tools/index.js +21 -0
  184. package/dist/tools/index.js.map +1 -1
  185. package/dist/tools/process-doc.d.ts.map +1 -1
  186. package/dist/tools/process-doc.js +14 -0
  187. package/dist/tools/process-doc.js.map +1 -1
  188. package/dist/tools/process-docs.d.ts.map +1 -1
  189. package/dist/tools/process-docs.js +14 -0
  190. package/dist/tools/process-docs.js.map +1 -1
  191. package/package.json +2 -1
@@ -0,0 +1,266 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from 'fs';
2
+ import { basename, dirname, join } from 'path';
3
+ import { PATTERNS } from './patterns.js';
4
+ import { parseFrontmatter } from './parser.js';
5
+ function withGlobal(pattern) {
6
+ return new RegExp(pattern.source, pattern.flags.includes('g') ? pattern.flags : `${pattern.flags}g`);
7
+ }
8
+ const TAG_STOP_LIST = new Set([
9
+ 'gap',
10
+ 'wip',
11
+ 'pass',
12
+ 'blocked',
13
+ 'draft',
14
+ 'todo',
15
+ 'fixme',
16
+ 'hack',
17
+ 'note',
18
+ ]);
19
+ function normalizeTag(value) {
20
+ const cleaned = value.trim().toLowerCase();
21
+ if (!cleaned || !/^[a-z][\w-]*$/.test(cleaned)) {
22
+ return null;
23
+ }
24
+ if (TAG_STOP_LIST.has(cleaned)) {
25
+ return null;
26
+ }
27
+ return cleaned;
28
+ }
29
+ function toAgentCanonicalId(planId, ref) {
30
+ const trimmed = ref.trim();
31
+ if (/^\d{4}#\d{3}$/.test(trimmed)) {
32
+ return `agent:${trimmed}`;
33
+ }
34
+ if (/^\d{3}$/.test(trimmed)) {
35
+ return `agent:${planId}#${trimmed}`;
36
+ }
37
+ if (trimmed.startsWith('agent:')) {
38
+ return trimmed;
39
+ }
40
+ return `agent:${planId}#${trimmed.padStart(3, '0')}`;
41
+ }
42
+ function inferPlanRoot(inputPath) {
43
+ const stats = statSync(inputPath);
44
+ if (stats.isDirectory()) {
45
+ return inputPath;
46
+ }
47
+ return dirname(inputPath);
48
+ }
49
+ function findPlanMarkdown(planRoot) {
50
+ const candidates = readdirSync(planRoot).filter((name) => name.toLowerCase().endsWith('.md'));
51
+ const preferred = candidates.find((name) => /-plan\.md$/i.test(name));
52
+ if (preferred) {
53
+ return join(planRoot, preferred);
54
+ }
55
+ return candidates.length > 0 ? join(planRoot, candidates[0]) : null;
56
+ }
57
+ function getMatches(content, pattern, captureIndex = 1) {
58
+ const values = [];
59
+ for (const match of content.matchAll(withGlobal(pattern))) {
60
+ const value = match[captureIndex]?.trim();
61
+ if (value) {
62
+ values.push(value);
63
+ }
64
+ }
65
+ return values;
66
+ }
67
+ export class EntityExtractor {
68
+ extractPlan(planPath) {
69
+ const result = { entities: [], relationships: [], warnings: [] };
70
+ const now = new Date().toISOString();
71
+ if (!existsSync(planPath)) {
72
+ result.warnings.push(`Plan path does not exist: ${planPath}`);
73
+ return result;
74
+ }
75
+ const planRoot = inferPlanRoot(planPath);
76
+ const folderName = basename(planRoot);
77
+ const planIdMatch = folderName.match(/^(\d{4})/);
78
+ if (!planIdMatch?.[1]) {
79
+ result.warnings.push(`Could not infer plan ID from folder: ${folderName}`);
80
+ return result;
81
+ }
82
+ const planId = planIdMatch[1];
83
+ const entitiesByCanonical = new Map();
84
+ const relationshipKeys = new Set();
85
+ let nextEntityId = 1;
86
+ let nextRelationshipId = 1;
87
+ const upsertEntity = (type, canonicalId, name, sourcePath, metadata = {}) => {
88
+ const existing = entitiesByCanonical.get(canonicalId);
89
+ if (existing) {
90
+ if (Object.keys(metadata).length > 0) {
91
+ existing.metadata = { ...existing.metadata, ...metadata };
92
+ }
93
+ return existing;
94
+ }
95
+ const entity = {
96
+ id: nextEntityId++,
97
+ type,
98
+ canonicalId,
99
+ name,
100
+ sourcePath,
101
+ metadata,
102
+ createdAt: now,
103
+ updatedAt: now,
104
+ };
105
+ entitiesByCanonical.set(canonicalId, entity);
106
+ return entity;
107
+ };
108
+ const upsertRelationship = (sourceCanonicalId, targetCanonicalId, relationType, metadata = {}) => {
109
+ if (sourceCanonicalId === targetCanonicalId) {
110
+ return;
111
+ }
112
+ const source = entitiesByCanonical.get(sourceCanonicalId);
113
+ const target = entitiesByCanonical.get(targetCanonicalId);
114
+ if (!source || !target) {
115
+ return;
116
+ }
117
+ const key = `${source.canonicalId}|${target.canonicalId}|${relationType}`;
118
+ if (relationshipKeys.has(key)) {
119
+ return;
120
+ }
121
+ relationshipKeys.add(key);
122
+ result.relationships.push({
123
+ id: nextRelationshipId++,
124
+ sourceId: source.id,
125
+ targetId: target.id,
126
+ relationType,
127
+ confidence: 1,
128
+ metadata,
129
+ createdAt: now,
130
+ });
131
+ };
132
+ const ensureFileEntity = (filePath) => {
133
+ const fileCanonical = `file:${filePath}`;
134
+ upsertEntity('file', fileCanonical, filePath, filePath, {});
135
+ return fileCanonical;
136
+ };
137
+ const ensureTagEntity = (tag, sourcePath) => {
138
+ const normalized = normalizeTag(tag);
139
+ if (!normalized) {
140
+ return null;
141
+ }
142
+ const tagCanonical = `tag:${normalized}`;
143
+ upsertEntity('tag', tagCanonical, normalized, sourcePath, {});
144
+ return tagCanonical;
145
+ };
146
+ const ensureAgentEntity = (agentCanonical) => {
147
+ upsertEntity('agent', agentCanonical, agentCanonical.replace(/^agent:/, 'Agent '), undefined, {});
148
+ return agentCanonical;
149
+ };
150
+ const linkFileReferences = (sourceCanonicalId, filePaths) => {
151
+ for (const filePath of filePaths) {
152
+ const fileCanonical = ensureFileEntity(filePath);
153
+ upsertRelationship(sourceCanonicalId, fileCanonical, 'MODIFIES');
154
+ }
155
+ };
156
+ const linkTagReferences = (sourceCanonicalId, tags, sourcePath) => {
157
+ for (const tag of tags) {
158
+ const tagCanonical = ensureTagEntity(tag, sourcePath);
159
+ if (tagCanonical) {
160
+ upsertRelationship(sourceCanonicalId, tagCanonical, 'TAGGED_WITH');
161
+ }
162
+ }
163
+ };
164
+ const linkDependencyReferences = (sourceCanonicalId, content) => {
165
+ for (const dep of getMatches(content, PATTERNS.inlineDepends)) {
166
+ const depCanonical = ensureAgentEntity(toAgentCanonicalId(planId, dep));
167
+ upsertRelationship(sourceCanonicalId, depCanonical, 'DEPENDS_ON');
168
+ }
169
+ for (const agentMatch of content.matchAll(withGlobal(PATTERNS.agentId))) {
170
+ const refPlanId = agentMatch[1];
171
+ const refAgentId = agentMatch[2];
172
+ if (!refPlanId || !refAgentId) {
173
+ continue;
174
+ }
175
+ const depCanonical = ensureAgentEntity(`agent:${refPlanId}#${refAgentId}`);
176
+ upsertRelationship(sourceCanonicalId, depCanonical, 'DEPENDS_ON');
177
+ }
178
+ for (const planMatch of content.matchAll(withGlobal(PATTERNS.planRef))) {
179
+ const refPlanId = planMatch[1];
180
+ const refAgentId = planMatch[2];
181
+ if (!refPlanId) {
182
+ continue;
183
+ }
184
+ if (refAgentId) {
185
+ const depCanonical = ensureAgentEntity(`agent:${refPlanId}#${refAgentId}`);
186
+ upsertRelationship(sourceCanonicalId, depCanonical, 'DEPENDS_ON');
187
+ continue;
188
+ }
189
+ const refCanonical = `plan:${refPlanId}`;
190
+ upsertEntity('plan', refCanonical, `Plan ${refPlanId}`, undefined, {});
191
+ upsertRelationship(sourceCanonicalId, refCanonical, 'DEPENDS_ON');
192
+ }
193
+ };
194
+ const extractInlineReferences = (sourceCanonicalId, content) => {
195
+ linkFileReferences(sourceCanonicalId, getMatches(content, PATTERNS.inlineFile));
196
+ linkDependencyReferences(sourceCanonicalId, content);
197
+ linkTagReferences(sourceCanonicalId, getMatches(content, PATTERNS.inlineTag));
198
+ };
199
+ const planMarkdownPath = findPlanMarkdown(planRoot);
200
+ if (!planMarkdownPath || !existsSync(planMarkdownPath)) {
201
+ result.warnings.push(`Could not locate plan markdown file in ${planRoot}`);
202
+ return result;
203
+ }
204
+ if (!/-plan\.md$/i.test(planMarkdownPath)) {
205
+ result.warnings.push(`No *-plan.md file found in ${planRoot}; falling back to non-plan file: ${planMarkdownPath}`);
206
+ }
207
+ const planContent = readFileSync(planMarkdownPath, 'utf8');
208
+ const planFrontmatter = parseFrontmatter(planContent);
209
+ const planCanonicalId = `plan:${planId}`;
210
+ const planName = planFrontmatter.title ?? planContent.match(/^#\s+(.+)$/m)?.[1]?.trim() ?? `Plan ${planId}`;
211
+ upsertEntity('plan', planCanonicalId, planName, planMarkdownPath, {
212
+ status: planFrontmatter.status,
213
+ });
214
+ linkTagReferences(planCanonicalId, planFrontmatter.tags ?? [], planMarkdownPath);
215
+ let featureIndex = 0;
216
+ for (const featureMatch of planContent.matchAll(withGlobal(PATTERNS.featureHeader))) {
217
+ const featureNumber = featureMatch[1] ?? String(++featureIndex);
218
+ const featureName = featureMatch[2]?.trim();
219
+ if (!featureName) {
220
+ continue;
221
+ }
222
+ const featureCanonical = `feature:${planId}#${featureNumber}`;
223
+ upsertEntity('feature', featureCanonical, featureName, planMarkdownPath, {});
224
+ upsertRelationship(planCanonicalId, featureCanonical, 'CONTAINS');
225
+ }
226
+ extractInlineReferences(planCanonicalId, planContent);
227
+ const agentsDir = join(planRoot, 'agents');
228
+ if (!existsSync(agentsDir)) {
229
+ result.warnings.push(`Agents directory not found at ${agentsDir}`);
230
+ }
231
+ else {
232
+ const agentFiles = readdirSync(agentsDir)
233
+ .filter((file) => file.endsWith('.agent.md'))
234
+ .sort();
235
+ for (const filename of agentFiles) {
236
+ const agentPath = join(agentsDir, filename);
237
+ const content = readFileSync(agentPath, 'utf8');
238
+ const frontmatter = parseFrontmatter(content);
239
+ const agentNumber = filename.match(/^(\d{3})/)?.[1];
240
+ if (!agentNumber) {
241
+ result.warnings.push(`Could not infer agent number from ${filename}`);
242
+ continue;
243
+ }
244
+ const agentCanonical = `agent:${planId}#${agentNumber}`;
245
+ const agentName = frontmatter.title ??
246
+ content.match(/^#\s*Agent\s+\d{3}:\s*(.+)$/m)?.[1]?.trim() ??
247
+ `Agent ${agentNumber}`;
248
+ upsertEntity('agent', agentCanonical, agentName, agentPath, {
249
+ status: frontmatter.status,
250
+ persona: frontmatter.persona,
251
+ });
252
+ upsertRelationship(planCanonicalId, agentCanonical, 'CONTAINS');
253
+ for (const dep of frontmatter.depends ?? []) {
254
+ const depCanonical = ensureAgentEntity(toAgentCanonicalId(planId, dep));
255
+ upsertRelationship(agentCanonical, depCanonical, 'DEPENDS_ON');
256
+ }
257
+ linkFileReferences(agentCanonical, (frontmatter.files ?? []).map((file) => file.trim()).filter(Boolean));
258
+ linkTagReferences(agentCanonical, frontmatter.tags ?? []);
259
+ extractInlineReferences(agentCanonical, content);
260
+ }
261
+ }
262
+ result.entities = Array.from(entitiesByCanonical.values());
263
+ return result;
264
+ }
265
+ }
266
+ //# sourceMappingURL=extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/graph/extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAQ/C,SAAS,UAAU,CAAC,OAAe;IACjC,OAAO,IAAI,MAAM,CACf,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,CAClE,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,KAAK;IACL,KAAK;IACL,MAAM;IACN,SAAS;IACT,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;CACP,CAAC,CAAC;AAEH,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,IAAI,CAAC,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc,EAAE,GAAW;IACrD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO,SAAS,OAAO,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,MAAM,IAAI,OAAO,EAAE,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,SAAS,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB;IACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9F,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChF,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,OAAe,EAAE,YAAY,GAAG,CAAC;IACpE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC;QAC1C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,OAAO,eAAe;IAC1B,WAAW,CAAC,QAAgB;QAC1B,MAAM,MAAM,GAAqB,EAAE,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACnF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;YAC9D,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,wCAAwC,UAAU,EAAE,CAAC,CAAC;YAC3E,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAE9B,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAkB,CAAC;QACtD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;QAC3C,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAE3B,MAAM,YAAY,GAAG,CACnB,IAAgB,EAChB,WAAmB,EACnB,IAAY,EACZ,UAAmB,EACnB,WAAoC,EAAE,EAC9B,EAAE;YACV,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACtD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrC,QAAQ,CAAC,QAAQ,GAAG,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;gBAC5D,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,MAAM,MAAM,GAAW;gBACrB,EAAE,EAAE,YAAY,EAAE;gBAClB,IAAI;gBACJ,WAAW;gBACX,IAAI;gBACJ,UAAU;gBACV,QAAQ;gBACR,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;aACf,CAAC;YACF,mBAAmB,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAC7C,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QAEF,MAAM,kBAAkB,GAAG,CACzB,iBAAyB,EACzB,iBAAyB,EACzB,YAA0B,EAC1B,WAAoC,EAAE,EAChC,EAAE;YACR,IAAI,iBAAiB,KAAK,iBAAiB,EAAE,CAAC;gBAC5C,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,IAAI,YAAY,EAAE,CAAC;YAC1E,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAE1B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;gBACxB,EAAE,EAAE,kBAAkB,EAAE;gBACxB,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,YAAY;gBACZ,UAAU,EAAE,CAAC;gBACb,QAAQ;gBACR,SAAS,EAAE,GAAG;aACf,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAU,EAAE;YACpD,MAAM,aAAa,GAAG,QAAQ,QAAQ,EAAE,CAAC;YACzC,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC5D,OAAO,aAAa,CAAC;QACvB,CAAC,CAAC;QAEF,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,UAAmB,EAAiB,EAAE;YAC1E,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,YAAY,GAAG,OAAO,UAAU,EAAE,CAAC;YACzC,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YAC9D,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC;QAEF,MAAM,iBAAiB,GAAG,CAAC,cAAsB,EAAU,EAAE;YAC3D,YAAY,CACV,OAAO,EACP,cAAc,EACd,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,EAC3C,SAAS,EACT,EAAE,CACH,CAAC;YACF,OAAO,cAAc,CAAC;QACxB,CAAC,CAAC;QAEF,MAAM,kBAAkB,GAAG,CAAC,iBAAyB,EAAE,SAAmB,EAAQ,EAAE;YAClF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBACjD,kBAAkB,CAAC,iBAAiB,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;YACnE,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,iBAAiB,GAAG,CACxB,iBAAyB,EACzB,IAAc,EACd,UAAmB,EACb,EAAE;YACR,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBACtD,IAAI,YAAY,EAAE,CAAC;oBACjB,kBAAkB,CAAC,iBAAiB,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,wBAAwB,GAAG,CAAC,iBAAyB,EAAE,OAAe,EAAQ,EAAE;YACpF,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC9D,MAAM,YAAY,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBACxE,kBAAkB,CAAC,iBAAiB,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;YACpE,CAAC;YAED,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBACxE,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBACjC,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,EAAE,CAAC;oBAC9B,SAAS;gBACX,CAAC;gBACD,MAAM,YAAY,GAAG,iBAAiB,CAAC,SAAS,SAAS,IAAI,UAAU,EAAE,CAAC,CAAC;gBAC3E,kBAAkB,CAAC,iBAAiB,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;YACpE,CAAC;YAED,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBACvE,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,SAAS;gBACX,CAAC;gBAED,IAAI,UAAU,EAAE,CAAC;oBACf,MAAM,YAAY,GAAG,iBAAiB,CAAC,SAAS,SAAS,IAAI,UAAU,EAAE,CAAC,CAAC;oBAC3E,kBAAkB,CAAC,iBAAiB,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;oBAClE,SAAS;gBACX,CAAC;gBAED,MAAM,YAAY,GAAG,QAAQ,SAAS,EAAE,CAAC;gBACzC,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;gBACvE,kBAAkB,CAAC,iBAAiB,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;YACpE,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,uBAAuB,GAAG,CAAC,iBAAyB,EAAE,OAAe,EAAQ,EAAE;YACnF,kBAAkB,CAAC,iBAAiB,EAAE,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;YAChF,wBAAwB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;YACrD,iBAAiB,CAAC,iBAAiB,EAAE,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAChF,CAAC,CAAC;QAEF,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,gBAAgB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACvD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,0CAA0C,QAAQ,EAAE,CAAC,CAAC;YAC3E,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAClB,8BAA8B,QAAQ,oCAAoC,gBAAgB,EAAE,CAC7F,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,eAAe,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,eAAe,GAAG,QAAQ,MAAM,EAAE,CAAC;QACzC,MAAM,QAAQ,GACZ,eAAe,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,QAAQ,MAAM,EAAE,CAAC;QAE7F,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,gBAAgB,EAAE;YAChE,MAAM,EAAE,eAAe,CAAC,MAAM;SAC/B,CAAC,CAAC;QAEH,iBAAiB,CAAC,eAAe,EAAE,eAAe,CAAC,IAAI,IAAI,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAEjF,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,KAAK,MAAM,YAAY,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YACpF,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC;YAChE,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,SAAS;YACX,CAAC;YACD,MAAM,gBAAgB,GAAG,WAAW,MAAM,IAAI,aAAa,EAAE,CAAC;YAC9D,YAAY,CAAC,SAAS,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;YAC7E,kBAAkB,CAAC,eAAe,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAC;QACpE,CAAC;QAED,uBAAuB,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAEtD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,iCAAiC,SAAS,EAAE,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC;iBACtC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;iBAC5C,IAAI,EAAE,CAAC;YAEV,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;gBAClC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAC5C,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBAChD,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAC9C,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpD,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,qCAAqC,QAAQ,EAAE,CAAC,CAAC;oBACtE,SAAS;gBACX,CAAC;gBAED,MAAM,cAAc,GAAG,SAAS,MAAM,IAAI,WAAW,EAAE,CAAC;gBACxD,MAAM,SAAS,GACb,WAAW,CAAC,KAAK;oBACjB,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;oBAC1D,SAAS,WAAW,EAAE,CAAC;gBAEzB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE;oBAC1D,MAAM,EAAE,WAAW,CAAC,MAAM;oBAC1B,OAAO,EAAE,WAAW,CAAC,OAAO;iBAC7B,CAAC,CAAC;gBACH,kBAAkB,CAAC,eAAe,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;gBAEhE,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;oBAC5C,MAAM,YAAY,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;oBACxE,kBAAkB,CAAC,cAAc,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;gBACjE,CAAC;gBAED,kBAAkB,CAChB,cAAc,EACd,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CACrE,CAAC;gBACF,iBAAiB,CAAC,cAAc,EAAE,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAE1D,uBAAuB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ import type { ConflictReport } from './conflict-detector.js';
2
+ export type NotificationChannel = 'log' | 'file' | 'webhook';
3
+ export interface NotifierConfig {
4
+ channels: NotificationChannel[];
5
+ filePath?: string;
6
+ webhookUrl?: string;
7
+ }
8
+ export declare class Notifier {
9
+ private readonly config;
10
+ constructor(config: NotifierConfig);
11
+ notify(reports: ConflictReport[]): Promise<void>;
12
+ private notifyLog;
13
+ private notifyFile;
14
+ private notifyWebhook;
15
+ }
16
+ //# sourceMappingURL=notifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier.d.ts","sourceRoot":"","sources":["../../src/graph/notifier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAE7C,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBtD,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,UAAU;YAYJ,aAAa;CAkB5B"}
@@ -0,0 +1,61 @@
1
+ import { appendFileSync } from 'fs';
2
+ export class Notifier {
3
+ config;
4
+ constructor(config) {
5
+ this.config = config;
6
+ }
7
+ async notify(reports) {
8
+ if (reports.length === 0)
9
+ return;
10
+ for (const channel of this.config.channels) {
11
+ switch (channel) {
12
+ case 'log':
13
+ this.notifyLog(reports);
14
+ break;
15
+ case 'file':
16
+ this.notifyFile(reports);
17
+ break;
18
+ case 'webhook':
19
+ await this.notifyWebhook(reports);
20
+ break;
21
+ }
22
+ }
23
+ }
24
+ notifyLog(reports) {
25
+ for (const report of reports) {
26
+ const prefix = report.severity === 'error' ? '[ERROR]' : '[WARN]';
27
+ console.error(`${prefix} ${report.type}: ${report.message}`);
28
+ }
29
+ }
30
+ notifyFile(reports) {
31
+ if (!this.config.filePath)
32
+ return;
33
+ for (const report of reports) {
34
+ const line = JSON.stringify({
35
+ timestamp: new Date().toISOString(),
36
+ ...report,
37
+ });
38
+ appendFileSync(this.config.filePath, line + '\n', 'utf-8');
39
+ }
40
+ }
41
+ async notifyWebhook(reports) {
42
+ if (!this.config.webhookUrl)
43
+ return;
44
+ try {
45
+ await fetch(this.config.webhookUrl, {
46
+ method: 'POST',
47
+ headers: { 'Content-Type': 'application/json' },
48
+ body: JSON.stringify({
49
+ timestamp: new Date().toISOString(),
50
+ conflicts: reports,
51
+ count: reports.length,
52
+ }),
53
+ });
54
+ }
55
+ catch (error) {
56
+ const msg = error instanceof Error ? error.message : String(error);
57
+ console.error(`Webhook notification failed: ${msg}`);
58
+ }
59
+ }
60
+ }
61
+ //# sourceMappingURL=notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier.js","sourceRoot":"","sources":["../../src/graph/notifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAWpC,MAAM,OAAO,QAAQ;IACU;IAA7B,YAA6B,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IAEvD,KAAK,CAAC,MAAM,CAAC,OAAyB;QACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEjC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC3C,QAAQ,OAAO,EAAE,CAAC;gBAChB,KAAK,KAAK;oBACR,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;oBACxB,MAAM;gBACR,KAAK,MAAM;oBACT,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;oBACzB,MAAM;gBACR,KAAK,SAAS;oBACZ,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;oBAClC,MAAM;YACV,CAAC;QACH,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,OAAyB;QACzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;YAClE,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,OAAyB;QAC1C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO;QAElC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC1B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,GAAG,MAAM;aACV,CAAC,CAAC;YACH,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,OAAyB;QACnD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO;QAEpC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;gBAClC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,SAAS,EAAE,OAAO;oBAClB,KAAK,EAAE,OAAO,CAAC,MAAM;iBACtB,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,OAAO,CAAC,KAAK,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ export interface ParsedFrontmatter {
2
+ title?: string;
3
+ status?: 'GAP' | 'WIP' | 'PASS' | 'BLOCKED' | 'draft';
4
+ depends?: string[];
5
+ files?: string[];
6
+ tags?: string[];
7
+ persona?: string;
8
+ }
9
+ export declare function parseFrontmatter(content: string): ParsedFrontmatter;
10
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/graph/parser.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACtD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAuBD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CA2CnE"}
@@ -0,0 +1,54 @@
1
+ function parseArray(str) {
2
+ return str
3
+ .split(',')
4
+ .map((part) => part.trim().replace(/^['"]|['"]$/g, ''))
5
+ .filter((part) => part.length > 0);
6
+ }
7
+ function normalizeStatus(value) {
8
+ const normalized = value.trim();
9
+ if (normalized === 'draft') {
10
+ return 'draft';
11
+ }
12
+ const upper = normalized.toUpperCase();
13
+ if (upper === 'GAP' || upper === 'WIP' || upper === 'PASS' || upper === 'BLOCKED') {
14
+ return upper;
15
+ }
16
+ return undefined;
17
+ }
18
+ export function parseFrontmatter(content) {
19
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
20
+ if (!match || !match[1]) {
21
+ return {};
22
+ }
23
+ const yaml = match[1];
24
+ const result = {};
25
+ const titleMatch = yaml.match(/^title:\s*(.+)$/m);
26
+ if (titleMatch?.[1]) {
27
+ result.title = titleMatch[1].trim();
28
+ }
29
+ const statusMatch = yaml.match(/^status:\s*(\w+)$/m);
30
+ if (statusMatch?.[1]) {
31
+ const normalized = normalizeStatus(statusMatch[1]);
32
+ if (normalized) {
33
+ result.status = normalized;
34
+ }
35
+ }
36
+ const personaMatch = yaml.match(/^persona:\s*(\w+)$/m);
37
+ if (personaMatch?.[1]) {
38
+ result.persona = personaMatch[1].trim();
39
+ }
40
+ const dependsMatch = yaml.match(/^(?:depends|depends_on):\s*\[([^\]]*)\]/m);
41
+ if (dependsMatch?.[1]) {
42
+ result.depends = parseArray(dependsMatch[1]);
43
+ }
44
+ const filesMatch = yaml.match(/^files:\s*\[([^\]]*)\]/m);
45
+ if (filesMatch?.[1]) {
46
+ result.files = parseArray(filesMatch[1]);
47
+ }
48
+ const tagsMatch = yaml.match(/^tags:\s*\[([^\]]*)\]/m);
49
+ if (tagsMatch?.[1]) {
50
+ result.tags = parseArray(tagsMatch[1]);
51
+ }
52
+ return result;
53
+ }
54
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/graph/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare const PATTERNS: {
2
+ readonly planId: RegExp;
3
+ readonly planRef: RegExp;
4
+ readonly agentId: RegExp;
5
+ readonly agentHeader: RegExp;
6
+ readonly featureHeader: RegExp;
7
+ readonly featureStatus: RegExp;
8
+ readonly frontmatterFiles: RegExp;
9
+ readonly inlineFile: RegExp;
10
+ readonly frontmatterDepends: RegExp;
11
+ readonly inlineDepends: RegExp;
12
+ readonly frontmatterTags: RegExp;
13
+ readonly inlineTag: RegExp;
14
+ readonly frontmatterStatus: RegExp;
15
+ };
16
+ //# sourceMappingURL=patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/graph/patterns.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;CA2BX,CAAC"}
@@ -0,0 +1,23 @@
1
+ export const PATTERNS = {
2
+ // Plan references
3
+ planId: /(?:plan\s*)?(\d{4})(?:[-\s]+([\w-]+))?/gi,
4
+ planRef: /\bplan\s+(\d{4})(?:#(\d{3}))?/gi,
5
+ // Agent references
6
+ agentId: /(\d{4})#(\d{3})/g,
7
+ agentHeader: /^#\s*Agent\s+(\d{3}):\s*(.+)$/gm,
8
+ // Features
9
+ featureHeader: /^###\s*#(\d+):?\s+(.+)$/gm,
10
+ featureStatus: /Status:\s*`?(GAP|WIP|PASS|BLOCKED)`?/gi,
11
+ // Files (in frontmatter or inline)
12
+ frontmatterFiles: /^files:\s*\[([^\]]+)\]/m,
13
+ inlineFile: /`([\w/.-]+\.(?:ts|js|tsx|jsx|md|json|py|rs|go|sql))`/g,
14
+ // Dependencies
15
+ frontmatterDepends: /^(?:depends|depends_on):\s*\[([^\]]+)\]/m,
16
+ inlineDepends: /depends\s+(?:on\s+)?(?:agent\s+)?(\d{4}#\d{3}|\d{3})/gi,
17
+ // Tags
18
+ frontmatterTags: /^tags:\s*\[([^\]]+)\]/m,
19
+ inlineTag: /#([\w-]+)/g,
20
+ // Status
21
+ frontmatterStatus: /^status:\s*(\w+)/m,
22
+ };
23
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/graph/patterns.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,kBAAkB;IAClB,MAAM,EAAE,0CAA0C;IAClD,OAAO,EAAE,iCAAiC;IAE1C,mBAAmB;IACnB,OAAO,EAAE,kBAAkB;IAC3B,WAAW,EAAE,iCAAiC;IAE9C,WAAW;IACX,aAAa,EAAE,2BAA2B;IAC1C,aAAa,EAAE,wCAAwC;IAEvD,mCAAmC;IACnC,gBAAgB,EAAE,yBAAyB;IAC3C,UAAU,EAAE,uDAAuD;IAEnE,eAAe;IACf,kBAAkB,EAAE,0CAA0C;IAC9D,aAAa,EAAE,wDAAwD;IAEvE,OAAO;IACP,eAAe,EAAE,wBAAwB;IACzC,SAAS,EAAE,YAAY;IAEvB,SAAS;IACT,iBAAiB,EAAE,mBAAmB;CAC9B,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { Entity } from './types.js';
2
+ import type { GraphStorage } from './storage.js';
3
+ import { type EmbeddingStore, type SimilarityScore } from './similarity.js';
4
+ export interface ResolutionMatch {
5
+ a: Entity;
6
+ b: Entity;
7
+ score: SimilarityScore;
8
+ }
9
+ export interface ResolutionResult {
10
+ duplicates: ResolutionMatch[];
11
+ similar: ResolutionMatch[];
12
+ suggestions: string[];
13
+ }
14
+ export declare class EntityResolver {
15
+ private readonly storage;
16
+ private readonly embeddings;
17
+ constructor(storage: GraphStorage, embeddings: EmbeddingStore);
18
+ resolveAll(): ResolutionResult;
19
+ checkNewFeature(name: string, description: string): Entity[];
20
+ private getNeighborCanonicalIds;
21
+ private addSimilarityRelationship;
22
+ }
23
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/graph/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAeD,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADV,OAAO,EAAE,YAAY,EACrB,UAAU,EAAE,cAAc;IAG7C,UAAU,IAAI,gBAAgB;IAiD9B,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE;IAiC5D,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,yBAAyB;CAclC"}
@@ -0,0 +1,98 @@
1
+ import { THRESHOLDS, computeSimilarity, computeStructuralSimilarityFromNeighbors, } from './similarity.js';
2
+ function isDuplicate(score) {
3
+ if (score.combined >= THRESHOLDS.duplicate) {
4
+ return true;
5
+ }
6
+ // Different canonical IDs can still be duplicates when lexical + semantic signals are near-identical.
7
+ return (score.lexical >= THRESHOLDS.duplicateLexical &&
8
+ score.semantic >= THRESHOLDS.duplicateSemantic &&
9
+ score.structural >= THRESHOLDS.duplicateStructural);
10
+ }
11
+ export class EntityResolver {
12
+ storage;
13
+ embeddings;
14
+ constructor(storage, embeddings) {
15
+ this.storage = storage;
16
+ this.embeddings = embeddings;
17
+ }
18
+ resolveAll() {
19
+ const result = { duplicates: [], similar: [], suggestions: [] };
20
+ const features = this.storage.getEntitiesByType('feature');
21
+ for (let i = 0; i < features.length; i++) {
22
+ const featureA = features[i];
23
+ if (!featureA) {
24
+ continue;
25
+ }
26
+ for (let j = i + 1; j < features.length; j++) {
27
+ const featureB = features[j];
28
+ if (!featureB) {
29
+ continue;
30
+ }
31
+ const structural = computeStructuralSimilarityFromNeighbors(this.getNeighborCanonicalIds(featureA), this.getNeighborCanonicalIds(featureB));
32
+ const score = computeSimilarity(featureA, featureB, this.embeddings, { structural });
33
+ if (isDuplicate(score)) {
34
+ result.duplicates.push({ a: featureA, b: featureB, score });
35
+ this.addSimilarityRelationship(featureA, featureB, score);
36
+ continue;
37
+ }
38
+ if (score.combined >= THRESHOLDS.similar) {
39
+ result.similar.push({ a: featureA, b: featureB, score });
40
+ this.addSimilarityRelationship(featureA, featureB, score);
41
+ }
42
+ }
43
+ }
44
+ for (const match of result.duplicates) {
45
+ result.suggestions.push(`DUPLICATE: "${match.a.name}" (${match.a.canonicalId}) and "${match.b.name}" (${match.b.canonicalId}) are ${(match.score.combined * 100).toFixed(0)}% similar. Consider consolidating.`);
46
+ }
47
+ for (const match of result.similar) {
48
+ result.suggestions.push(`SIMILAR: "${match.a.name}" (${match.a.canonicalId}) and "${match.b.name}" (${match.b.canonicalId}) are ${(match.score.combined * 100).toFixed(0)}% similar. Consider linking or clarifying scope.`);
49
+ }
50
+ return result;
51
+ }
52
+ checkNewFeature(name, description) {
53
+ const queryText = `${name} ${description}`.trim();
54
+ if (this.embeddings.embed && this.embeddings.findSimilar) {
55
+ const embedding = this.embeddings.embed(queryText);
56
+ const candidates = this.embeddings.findSimilar(embedding, 10);
57
+ return candidates
58
+ .filter((candidate) => candidate.score >= THRESHOLDS.similar)
59
+ .map((candidate) => this.storage.getEntity(candidate.canonicalId))
60
+ .filter((entity) => entity?.type === 'feature');
61
+ }
62
+ const probe = {
63
+ id: 0,
64
+ type: 'feature',
65
+ canonicalId: 'feature:new',
66
+ name: name.trim(),
67
+ metadata: {},
68
+ createdAt: new Date().toISOString(),
69
+ updatedAt: new Date().toISOString(),
70
+ };
71
+ return this.storage
72
+ .getEntitiesByType('feature')
73
+ .map((entity) => ({
74
+ entity,
75
+ score: computeSimilarity(probe, entity, this.embeddings, { structural: 0 }),
76
+ }))
77
+ .filter((entry) => entry.score.combined >= THRESHOLDS.similar)
78
+ .map((entry) => entry.entity);
79
+ }
80
+ getNeighborCanonicalIds(entity) {
81
+ return new Set(this.storage.getNeighbors(entity.id).map((neighbor) => neighbor.canonicalId));
82
+ }
83
+ addSimilarityRelationship(a, b, score) {
84
+ this.storage.upsertRelationship({
85
+ sourceId: a.id,
86
+ targetId: b.id,
87
+ relationType: 'SIMILAR_TO',
88
+ confidence: score.combined,
89
+ metadata: {
90
+ lexical: score.lexical,
91
+ semantic: score.semantic,
92
+ structural: score.structural,
93
+ detectedAt: new Date().toISOString(),
94
+ },
95
+ });
96
+ }
97
+ }
98
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/graph/resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,wCAAwC,GAGzC,MAAM,iBAAiB,CAAC;AAczB,SAAS,WAAW,CAAC,KAAsB;IACzC,IAAI,KAAK,CAAC,QAAQ,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sGAAsG;IACtG,OAAO,CACL,KAAK,CAAC,OAAO,IAAI,UAAU,CAAC,gBAAgB;QAC5C,KAAK,CAAC,QAAQ,IAAI,UAAU,CAAC,iBAAiB;QAC9C,KAAK,CAAC,UAAU,IAAI,UAAU,CAAC,mBAAmB,CACnD,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,cAAc;IAEN;IACA;IAFnB,YACmB,OAAqB,EACrB,UAA0B;QAD1B,YAAO,GAAP,OAAO,CAAc;QACrB,eAAU,GAAV,UAAU,CAAgB;IAC1C,CAAC;IAEJ,UAAU;QACR,MAAM,MAAM,GAAqB,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAE3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,SAAS;YACX,CAAC;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,SAAS;gBACX,CAAC;gBAED,MAAM,UAAU,GAAG,wCAAwC,CACzD,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,EACtC,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CACvC,CAAC;gBACF,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;gBAErF,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;oBACvB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC5D,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;oBAC1D,SAAS;gBACX,CAAC;gBAED,IAAI,KAAK,CAAC,QAAQ,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;oBACzC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;oBACzD,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtC,MAAM,CAAC,WAAW,CAAC,IAAI,CACrB,eAAe,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,CAAC,WAAW,UAAU,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,CAAC,WAAW,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,oCAAoC,CACxL,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,CAAC,WAAW,CAAC,IAAI,CACrB,aAAa,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,CAAC,WAAW,UAAU,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,CAAC,WAAW,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kDAAkD,CACpM,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,eAAe,CAAC,IAAY,EAAE,WAAmB;QAC/C,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAElD,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YACzD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAE9D,OAAO,UAAU;iBACd,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,IAAI,UAAU,CAAC,OAAO,CAAC;iBAC5D,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;iBACjE,MAAM,CAAC,CAAC,MAAM,EAAoB,EAAE,CAAC,MAAM,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,KAAK,GAAW;YACpB,EAAE,EAAE,CAAC;YACL,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,aAAa;YAC1B,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YACjB,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,OAAO,IAAI,CAAC,OAAO;aAChB,iBAAiB,CAAC,SAAS,CAAC;aAC5B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAChB,MAAM;YACN,KAAK,EAAE,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;SAC5E,CAAC,CAAC;aACF,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,IAAI,UAAU,CAAC,OAAO,CAAC;aAC7D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAEO,uBAAuB,CAAC,MAAc;QAC5C,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/F,CAAC;IAEO,yBAAyB,CAAC,CAAS,EAAE,CAAS,EAAE,KAAsB;QAC5E,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;YAC9B,QAAQ,EAAE,CAAC,CAAC,EAAE;YACd,QAAQ,EAAE,CAAC,CAAC,EAAE;YACd,YAAY,EAAE,YAAY;YAC1B,UAAU,EAAE,KAAK,CAAC,QAAQ;YAC1B,QAAQ,EAAE;gBACR,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACrC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}