@sashabogi/foundation 0.1.5 → 0.1.7

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 (109) hide show
  1. package/dist/cli/setup-wizard.d.ts +30 -0
  2. package/dist/cli/setup-wizard.d.ts.map +1 -0
  3. package/dist/cli/setup-wizard.js +1645 -0
  4. package/dist/cli/setup-wizard.js.map +1 -0
  5. package/dist/cli/test-connection.d.ts +76 -0
  6. package/dist/cli/test-connection.d.ts.map +1 -0
  7. package/dist/cli/test-connection.js +697 -0
  8. package/dist/cli/test-connection.js.map +1 -0
  9. package/dist/cli.d.ts +3 -1
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +133 -5
  12. package/dist/cli.js.map +1 -1
  13. package/dist/providers/anthropic.d.ts +178 -0
  14. package/dist/providers/anthropic.d.ts.map +1 -0
  15. package/dist/providers/anthropic.js +514 -0
  16. package/dist/providers/anthropic.js.map +1 -0
  17. package/dist/providers/base.d.ts +154 -0
  18. package/dist/providers/base.d.ts.map +1 -0
  19. package/dist/providers/base.js +227 -0
  20. package/dist/providers/base.js.map +1 -0
  21. package/dist/providers/deepseek.d.ts +23 -0
  22. package/dist/providers/deepseek.d.ts.map +1 -0
  23. package/dist/providers/deepseek.js +31 -0
  24. package/dist/providers/deepseek.js.map +1 -0
  25. package/dist/providers/fireworks.d.ts +23 -0
  26. package/dist/providers/fireworks.d.ts.map +1 -0
  27. package/dist/providers/fireworks.js +31 -0
  28. package/dist/providers/fireworks.js.map +1 -0
  29. package/dist/providers/gemini.d.ts +85 -0
  30. package/dist/providers/gemini.d.ts.map +1 -0
  31. package/dist/providers/gemini.js +414 -0
  32. package/dist/providers/gemini.js.map +1 -0
  33. package/dist/providers/groq.d.ts +23 -0
  34. package/dist/providers/groq.d.ts.map +1 -0
  35. package/dist/providers/groq.js +31 -0
  36. package/dist/providers/groq.js.map +1 -0
  37. package/dist/providers/index.d.ts +23 -0
  38. package/dist/providers/index.d.ts.map +1 -0
  39. package/dist/providers/index.js +27 -0
  40. package/dist/providers/index.js.map +1 -0
  41. package/dist/providers/kimi-code.d.ts +32 -0
  42. package/dist/providers/kimi-code.d.ts.map +1 -0
  43. package/dist/providers/kimi-code.js +46 -0
  44. package/dist/providers/kimi-code.js.map +1 -0
  45. package/dist/providers/kimi.d.ts +19 -0
  46. package/dist/providers/kimi.d.ts.map +1 -0
  47. package/dist/providers/kimi.js +27 -0
  48. package/dist/providers/kimi.js.map +1 -0
  49. package/dist/providers/manager.d.ts +144 -0
  50. package/dist/providers/manager.d.ts.map +1 -0
  51. package/dist/providers/manager.js +279 -0
  52. package/dist/providers/manager.js.map +1 -0
  53. package/dist/providers/ollama.d.ts +83 -0
  54. package/dist/providers/ollama.d.ts.map +1 -0
  55. package/dist/providers/ollama.js +450 -0
  56. package/dist/providers/ollama.js.map +1 -0
  57. package/dist/providers/openai.d.ts +91 -0
  58. package/dist/providers/openai.d.ts.map +1 -0
  59. package/dist/providers/openai.js +445 -0
  60. package/dist/providers/openai.js.map +1 -0
  61. package/dist/providers/openrouter.d.ts +23 -0
  62. package/dist/providers/openrouter.d.ts.map +1 -0
  63. package/dist/providers/openrouter.js +31 -0
  64. package/dist/providers/openrouter.js.map +1 -0
  65. package/dist/providers/perplexity.d.ts +34 -0
  66. package/dist/providers/perplexity.d.ts.map +1 -0
  67. package/dist/providers/perplexity.js +58 -0
  68. package/dist/providers/perplexity.js.map +1 -0
  69. package/dist/providers/together.d.ts +23 -0
  70. package/dist/providers/together.d.ts.map +1 -0
  71. package/dist/providers/together.js +31 -0
  72. package/dist/providers/together.js.map +1 -0
  73. package/dist/providers/types.d.ts +229 -0
  74. package/dist/providers/types.d.ts.map +1 -0
  75. package/dist/providers/types.js +73 -0
  76. package/dist/providers/types.js.map +1 -0
  77. package/dist/providers/zai.d.ts +19 -0
  78. package/dist/providers/zai.d.ts.map +1 -0
  79. package/dist/providers/zai.js +27 -0
  80. package/dist/providers/zai.js.map +1 -0
  81. package/dist/services/provider.service.d.ts +28 -0
  82. package/dist/services/provider.service.d.ts.map +1 -1
  83. package/dist/services/provider.service.js +137 -13
  84. package/dist/services/provider.service.js.map +1 -1
  85. package/dist/tools/demerzel/engine.d.ts +67 -0
  86. package/dist/tools/demerzel/engine.d.ts.map +1 -0
  87. package/dist/tools/demerzel/engine.js +401 -0
  88. package/dist/tools/demerzel/engine.js.map +1 -0
  89. package/dist/tools/demerzel/enhanced-snapshot.d.ts +67 -0
  90. package/dist/tools/demerzel/enhanced-snapshot.d.ts.map +1 -0
  91. package/dist/tools/demerzel/enhanced-snapshot.js +481 -0
  92. package/dist/tools/demerzel/enhanced-snapshot.js.map +1 -0
  93. package/dist/tools/demerzel/index.d.ts +11 -0
  94. package/dist/tools/demerzel/index.d.ts.map +1 -1
  95. package/dist/tools/demerzel/index.js +656 -85
  96. package/dist/tools/demerzel/index.js.map +1 -1
  97. package/dist/tools/demerzel/prompts.d.ts +26 -0
  98. package/dist/tools/demerzel/prompts.d.ts.map +1 -0
  99. package/dist/tools/demerzel/prompts.js +181 -0
  100. package/dist/tools/demerzel/prompts.js.map +1 -0
  101. package/dist/tools/demerzel/semantic-search.d.ts +54 -0
  102. package/dist/tools/demerzel/semantic-search.d.ts.map +1 -0
  103. package/dist/tools/demerzel/semantic-search.js +205 -0
  104. package/dist/tools/demerzel/semantic-search.js.map +1 -0
  105. package/dist/tools/demerzel/snapshot.d.ts +30 -0
  106. package/dist/tools/demerzel/snapshot.d.ts.map +1 -0
  107. package/dist/tools/demerzel/snapshot.js +169 -0
  108. package/dist/tools/demerzel/snapshot.js.map +1 -0
  109. package/package.json +2 -1
@@ -0,0 +1,401 @@
1
+ /**
2
+ * Demerzel RLM Engine
3
+ *
4
+ * Recursive Language Model engine for document analysis.
5
+ * Based on the Matryoshka RLM approach by Dmitri Sotnikov.
6
+ *
7
+ * The engine uses an LLM to generate Nucleus DSL commands that are
8
+ * executed against documents, enabling analysis of content far
9
+ * exceeding typical context limits.
10
+ *
11
+ * Ported from Argus to Foundation.
12
+ */
13
+ import { readFileSync } from 'fs';
14
+ import { buildSystemPrompt, getTurnLimit } from './prompts.js';
15
+ /**
16
+ * Execute a Nucleus command against document content
17
+ */
18
+ function executeNucleus(command, content, bindings) {
19
+ // Parse the S-expression
20
+ const parsed = parseSExpression(command);
21
+ if (!parsed) {
22
+ throw new Error(`Failed to parse command: ${command}`);
23
+ }
24
+ return evaluateExpr(parsed, content, bindings);
25
+ }
26
+ function parseSExpression(input) {
27
+ const tokens = tokenize(input.trim());
28
+ if (tokens.length === 0)
29
+ return null;
30
+ let pos = 0;
31
+ function parse() {
32
+ const token = tokens[pos++];
33
+ if (token === '(') {
34
+ const list = [];
35
+ while (tokens[pos] !== ')' && pos < tokens.length) {
36
+ list.push(parse());
37
+ }
38
+ pos++; // consume ')'
39
+ return list;
40
+ }
41
+ else if (token.startsWith('"')) {
42
+ // String literal
43
+ return token.slice(1, -1).replace(/\\"/g, '"');
44
+ }
45
+ else if (/^-?\d+(\.\d+)?$/.test(token)) {
46
+ return token; // Keep as string, convert when needed
47
+ }
48
+ else {
49
+ return token; // Symbol
50
+ }
51
+ }
52
+ return parse();
53
+ }
54
+ function tokenize(input) {
55
+ const tokens = [];
56
+ let i = 0;
57
+ while (i < input.length) {
58
+ const char = input[i];
59
+ if (/\s/.test(char)) {
60
+ i++;
61
+ continue;
62
+ }
63
+ if (char === '(' || char === ')') {
64
+ tokens.push(char);
65
+ i++;
66
+ continue;
67
+ }
68
+ if (char === '"') {
69
+ let str = '"';
70
+ i++;
71
+ while (i < input.length && input[i] !== '"') {
72
+ if (input[i] === '\\' && i + 1 < input.length) {
73
+ str += input[i] + input[i + 1];
74
+ i += 2;
75
+ }
76
+ else {
77
+ str += input[i];
78
+ i++;
79
+ }
80
+ }
81
+ str += '"';
82
+ i++;
83
+ tokens.push(str);
84
+ continue;
85
+ }
86
+ // Symbol or number
87
+ let sym = '';
88
+ while (i < input.length && !/[\s()]/.test(input[i])) {
89
+ sym += input[i];
90
+ i++;
91
+ }
92
+ tokens.push(sym);
93
+ }
94
+ return tokens;
95
+ }
96
+ function evaluateExpr(expr, content, bindings) {
97
+ if (typeof expr === 'string') {
98
+ // Variable lookup
99
+ if (bindings.has(expr)) {
100
+ return bindings.get(expr);
101
+ }
102
+ // Number
103
+ if (/^-?\d+(\.\d+)?$/.test(expr)) {
104
+ return parseFloat(expr);
105
+ }
106
+ return expr;
107
+ }
108
+ if (!Array.isArray(expr) || expr.length === 0) {
109
+ return expr;
110
+ }
111
+ const [op, ...args] = expr;
112
+ switch (op) {
113
+ case 'grep': {
114
+ const pattern = evaluateExpr(args[0], content, bindings);
115
+ const flags = args[1] ? evaluateExpr(args[1], content, bindings) : '';
116
+ const regex = new RegExp(pattern, flags + 'g');
117
+ // Cache lines array to avoid re-splitting on every grep (major memory optimization)
118
+ let lines = bindings.get('__cached_lines__');
119
+ if (!lines) {
120
+ lines = content.split('\n');
121
+ bindings.set('__cached_lines__', lines);
122
+ }
123
+ const matches = [];
124
+ const MAX_MATCHES = 1000; // Prevent memory explosion
125
+ let charIndex = 0;
126
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
127
+ const line = lines[lineNum];
128
+ let match;
129
+ const lineRegex = new RegExp(pattern, flags + 'g');
130
+ while ((match = lineRegex.exec(line)) !== null) {
131
+ matches.push({
132
+ match: match[0],
133
+ line: line,
134
+ lineNum: lineNum + 1,
135
+ index: charIndex + match.index,
136
+ groups: match.slice(1),
137
+ });
138
+ if (matches.length >= MAX_MATCHES) {
139
+ return matches;
140
+ }
141
+ }
142
+ charIndex += line.length + 1;
143
+ }
144
+ return matches;
145
+ }
146
+ case 'count': {
147
+ const arr = evaluateExpr(args[0], content, bindings);
148
+ if (Array.isArray(arr))
149
+ return arr.length;
150
+ return 0;
151
+ }
152
+ case 'map': {
153
+ const arr = evaluateExpr(args[0], content, bindings);
154
+ const lambdaExpr = args[1];
155
+ if (!Array.isArray(lambdaExpr) || lambdaExpr[0] !== 'lambda') {
156
+ throw new Error('map requires a lambda expression');
157
+ }
158
+ const params = lambdaExpr[1];
159
+ const body = lambdaExpr[2];
160
+ const paramName = Array.isArray(params) ? params[0] : params;
161
+ return arr.map(item => {
162
+ const localBindings = new Map(bindings);
163
+ localBindings.set(paramName, item);
164
+ return evaluateExpr(body, content, localBindings);
165
+ });
166
+ }
167
+ case 'filter': {
168
+ const arr = evaluateExpr(args[0], content, bindings);
169
+ const lambdaExpr = args[1];
170
+ if (!Array.isArray(lambdaExpr) || lambdaExpr[0] !== 'lambda') {
171
+ throw new Error('filter requires a lambda expression');
172
+ }
173
+ const params = lambdaExpr[1];
174
+ const body = lambdaExpr[2];
175
+ const paramName = Array.isArray(params) ? params[0] : params;
176
+ return arr.filter(item => {
177
+ const localBindings = new Map(bindings);
178
+ localBindings.set(paramName, item);
179
+ return evaluateExpr(body, content, localBindings);
180
+ });
181
+ }
182
+ case 'first': {
183
+ const arr = evaluateExpr(args[0], content, bindings);
184
+ return arr[0];
185
+ }
186
+ case 'last': {
187
+ const arr = evaluateExpr(args[0], content, bindings);
188
+ return arr[arr.length - 1];
189
+ }
190
+ case 'take': {
191
+ const arr = evaluateExpr(args[0], content, bindings);
192
+ const n = evaluateExpr(args[1], content, bindings);
193
+ return arr.slice(0, n);
194
+ }
195
+ case 'sort': {
196
+ const arr = evaluateExpr(args[0], content, bindings);
197
+ const key = evaluateExpr(args[1], content, bindings);
198
+ return [...arr].sort((a, b) => {
199
+ const aVal = a[key];
200
+ const bVal = b[key];
201
+ if (typeof aVal === 'number' && typeof bVal === 'number') {
202
+ return aVal - bVal;
203
+ }
204
+ return String(aVal).localeCompare(String(bVal));
205
+ });
206
+ }
207
+ case 'match': {
208
+ const str = evaluateExpr(args[0], content, bindings);
209
+ const strValue = typeof str === 'object' && str !== null && 'line' in str
210
+ ? str.line
211
+ : String(str);
212
+ const pattern = evaluateExpr(args[1], content, bindings);
213
+ const group = args[2] ? evaluateExpr(args[2], content, bindings) : 0;
214
+ const regex = new RegExp(pattern);
215
+ const match = strValue.match(regex);
216
+ if (match) {
217
+ return match[group] || null;
218
+ }
219
+ return null;
220
+ }
221
+ default:
222
+ throw new Error(`Unknown command: ${op}`);
223
+ }
224
+ }
225
+ /**
226
+ * Extract Nucleus command from LLM response
227
+ */
228
+ function extractCommand(response) {
229
+ // Check for final answer
230
+ const finalMatch = response.match(/<<<FINAL>>>([\s\S]*?)<<<END>>>/);
231
+ if (finalMatch) {
232
+ return { finalAnswer: finalMatch[1].trim() };
233
+ }
234
+ // Look for S-expression
235
+ const sexpMatch = response.match(/\([^)]*(?:\([^)]*\)[^)]*)*\)/);
236
+ if (sexpMatch) {
237
+ return { command: sexpMatch[0] };
238
+ }
239
+ return {};
240
+ }
241
+ /**
242
+ * Run RLM analysis on a document
243
+ */
244
+ export async function analyze(provider, documentPath, query, options = {}) {
245
+ const { maxTurns = 15, verbose = false, onProgress, } = options;
246
+ // Use dynamic turn limit based on query type, but cap at maxTurns
247
+ const dynamicLimit = Math.min(getTurnLimit(query), maxTurns);
248
+ // Load document
249
+ const content = readFileSync(documentPath, 'utf-8');
250
+ // Get document stats for context (count newlines without splitting)
251
+ const fileCount = (content.match(/^FILE:/gm) || []).length;
252
+ const lineCount = (content.match(/\n/g) || []).length + 1;
253
+ const bindings = new Map();
254
+ const commands = [];
255
+ const messages = [
256
+ {
257
+ role: 'system',
258
+ content: buildSystemPrompt(query),
259
+ },
260
+ {
261
+ role: 'user',
262
+ content: `CODEBASE SNAPSHOT:
263
+ - Total size: ${content.length.toLocaleString()} characters
264
+ - Files: ${fileCount}
265
+ - Lines: ${lineCount.toLocaleString()}
266
+
267
+ Files are marked with "FILE: ./path/to/file" headers.
268
+
269
+ QUERY: ${query}
270
+
271
+ Begin analysis. You have ${dynamicLimit} turns maximum - provide final answer before then.`,
272
+ },
273
+ ];
274
+ for (let turn = 1; turn <= dynamicLimit; turn++) {
275
+ // Force final answer on last turn
276
+ const isLastTurn = turn === dynamicLimit;
277
+ const isNearEnd = turn >= dynamicLimit - 2;
278
+ if (verbose) {
279
+ console.error(`\n[Turn ${turn}/${dynamicLimit}] Querying LLM...`);
280
+ }
281
+ // Get LLM response
282
+ const result = await provider.complete(messages);
283
+ const response = result.content;
284
+ if (verbose) {
285
+ console.error(`[Turn ${turn}] Response: ${response.slice(0, 200)}...`);
286
+ }
287
+ // Extract command or final answer
288
+ const extracted = extractCommand(response);
289
+ if (extracted.finalAnswer) {
290
+ return {
291
+ answer: extracted.finalAnswer,
292
+ turns: turn,
293
+ commands,
294
+ success: true,
295
+ };
296
+ }
297
+ if (!extracted.command) {
298
+ // No command found, add to messages and continue
299
+ messages.push({ role: 'assistant', content: response });
300
+ messages.push({ role: 'user', content: 'Please provide a Nucleus command or final answer.' });
301
+ continue;
302
+ }
303
+ const command = extracted.command;
304
+ commands.push(command);
305
+ if (verbose) {
306
+ console.error(`[Turn ${turn}] Command: ${command}`);
307
+ }
308
+ // Execute command
309
+ try {
310
+ const cmdResult = executeNucleus(command, content, bindings);
311
+ // Store result in bindings
312
+ bindings.set('RESULTS', cmdResult);
313
+ bindings.set(`_${turn}`, cmdResult);
314
+ const resultStr = JSON.stringify(cmdResult, null, 2);
315
+ const truncatedResult = resultStr.length > 2000
316
+ ? resultStr.slice(0, 2000) + '...[truncated]'
317
+ : resultStr;
318
+ if (verbose) {
319
+ console.error(`[Turn ${turn}] Result: ${truncatedResult.slice(0, 500)}...`);
320
+ }
321
+ onProgress?.(turn, command, cmdResult);
322
+ // Add to conversation with nudge if near end
323
+ messages.push({ role: 'assistant', content: command });
324
+ let userMessage = `Result:\n${truncatedResult}`;
325
+ if (isNearEnd && !isLastTurn) {
326
+ userMessage += `\n\n[Warning] ${dynamicLimit - turn} turns remaining. Start forming your final answer.`;
327
+ }
328
+ messages.push({ role: 'user', content: userMessage });
329
+ // FORCE final answer on last turn - make one more LLM call
330
+ if (isLastTurn) {
331
+ messages.push({
332
+ role: 'user',
333
+ content: 'STOP SEARCHING. Based on everything you found, provide your final answer NOW using <<<FINAL>>>your answer<<<END>>>'
334
+ });
335
+ const finalResult = await provider.complete(messages);
336
+ const finalExtracted = extractCommand(finalResult.content);
337
+ if (finalExtracted.finalAnswer) {
338
+ return {
339
+ answer: finalExtracted.finalAnswer,
340
+ turns: turn,
341
+ commands,
342
+ success: true,
343
+ };
344
+ }
345
+ // Even if not properly formatted, return whatever we got
346
+ return {
347
+ answer: finalResult.content,
348
+ turns: turn,
349
+ commands,
350
+ success: true,
351
+ };
352
+ }
353
+ }
354
+ catch (error) {
355
+ const errMsg = error instanceof Error ? error.message : String(error);
356
+ if (verbose) {
357
+ console.error(`[Turn ${turn}] Error: ${errMsg}`);
358
+ }
359
+ messages.push({ role: 'assistant', content: command });
360
+ messages.push({ role: 'user', content: `Error executing command: ${errMsg}` });
361
+ }
362
+ }
363
+ return {
364
+ answer: 'Maximum turns reached without final answer',
365
+ turns: dynamicLimit,
366
+ commands,
367
+ success: false,
368
+ error: 'Max turns reached',
369
+ };
370
+ }
371
+ /**
372
+ * Fast grep search without AI
373
+ */
374
+ export function searchDocument(documentPath, pattern, options = {}) {
375
+ const content = readFileSync(documentPath, 'utf-8');
376
+ const flags = options.caseInsensitive ? 'gi' : 'g';
377
+ const regex = new RegExp(pattern, flags);
378
+ const lines = content.split('\n');
379
+ const matches = [];
380
+ let charIndex = 0;
381
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
382
+ const line = lines[lineNum];
383
+ let match;
384
+ const lineRegex = new RegExp(pattern, flags);
385
+ while ((match = lineRegex.exec(line)) !== null) {
386
+ matches.push({
387
+ match: match[0],
388
+ line: line,
389
+ lineNum: lineNum + 1,
390
+ index: charIndex + match.index,
391
+ groups: match.slice(1),
392
+ });
393
+ if (options.maxResults && matches.length >= options.maxResults) {
394
+ return matches;
395
+ }
396
+ }
397
+ charIndex += line.length + 1;
398
+ }
399
+ return matches;
400
+ }
401
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/tools/demerzel/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Demerzel Enhanced Snapshot
3
+ *
4
+ * Extends basic snapshots with structural metadata:
5
+ * - Import graph (who imports whom)
6
+ * - Export index (symbols -> files)
7
+ * - Function/class signatures
8
+ * - File dependency tree
9
+ * - Complexity scores
10
+ * - Test file mapping
11
+ * - Recent git changes
12
+ *
13
+ * This enables understanding architecture without reading individual files.
14
+ *
15
+ * Ported from Argus to Foundation.
16
+ */
17
+ import { SnapshotOptions, SnapshotResult } from './snapshot.js';
18
+ export interface ImportInfo {
19
+ source: string;
20
+ target: string;
21
+ resolved?: string;
22
+ symbols: string[];
23
+ isDefault: boolean;
24
+ isType: boolean;
25
+ }
26
+ export interface ExportInfo {
27
+ file: string;
28
+ symbol: string;
29
+ type: 'function' | 'class' | 'const' | 'let' | 'var' | 'type' | 'interface' | 'enum' | 'default' | 'unknown';
30
+ signature?: string;
31
+ line: number;
32
+ }
33
+ export interface FileMetadata {
34
+ path: string;
35
+ imports: ImportInfo[];
36
+ exports: ExportInfo[];
37
+ size: number;
38
+ lines: number;
39
+ }
40
+ export interface ComplexityInfo {
41
+ file: string;
42
+ score: number;
43
+ level: 'low' | 'medium' | 'high';
44
+ }
45
+ export interface RecentChangeInfo {
46
+ file: string;
47
+ commits: number;
48
+ authors: number;
49
+ }
50
+ export interface EnhancedSnapshotResult extends SnapshotResult {
51
+ metadata: {
52
+ imports: ImportInfo[];
53
+ exports: ExportInfo[];
54
+ fileIndex: Record<string, FileMetadata>;
55
+ importGraph: Record<string, string[]>;
56
+ exportGraph: Record<string, string[]>;
57
+ symbolIndex: Record<string, string[]>;
58
+ complexityScores: ComplexityInfo[];
59
+ testFileMap: Record<string, string[]>;
60
+ recentChanges: RecentChangeInfo[] | null;
61
+ };
62
+ }
63
+ /**
64
+ * Create an enhanced snapshot with structural metadata
65
+ */
66
+ export declare function createEnhancedSnapshot(projectPath: string, outputPath: string, options?: SnapshotOptions): EnhancedSnapshotResult;
67
+ //# sourceMappingURL=enhanced-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhanced-snapshot.d.ts","sourceRoot":"","sources":["../../../src/tools/demerzel/enhanced-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,EAAkB,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEhF,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IAC7G,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC5D,QAAQ,EAAE;QACR,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACxC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,gBAAgB,EAAE,cAAc,EAAE,CAAC;QACnC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,aAAa,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;KAC1C,CAAC;CACH;AAgVD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,eAAoB,GAC5B,sBAAsB,CAyKxB"}