exai 1.0.1

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 (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +117 -0
  3. package/dist/ai/config.d.ts +60 -0
  4. package/dist/ai/config.d.ts.map +1 -0
  5. package/dist/ai/config.js +217 -0
  6. package/dist/ai/config.js.map +1 -0
  7. package/dist/ai/contants.d.ts +4 -0
  8. package/dist/ai/contants.d.ts.map +1 -0
  9. package/dist/ai/contants.js +4 -0
  10. package/dist/ai/contants.js.map +1 -0
  11. package/dist/ai/context-gatherer.d.ts +39 -0
  12. package/dist/ai/context-gatherer.d.ts.map +1 -0
  13. package/dist/ai/context-gatherer.js +107 -0
  14. package/dist/ai/context-gatherer.js.map +1 -0
  15. package/dist/ai/folder-filter.d.ts +17 -0
  16. package/dist/ai/folder-filter.d.ts.map +1 -0
  17. package/dist/ai/folder-filter.js +76 -0
  18. package/dist/ai/folder-filter.js.map +1 -0
  19. package/dist/ai/openrouter.d.ts +42 -0
  20. package/dist/ai/openrouter.d.ts.map +1 -0
  21. package/dist/ai/openrouter.js +224 -0
  22. package/dist/ai/openrouter.js.map +1 -0
  23. package/dist/ai/query-cache.d.ts +49 -0
  24. package/dist/ai/query-cache.d.ts.map +1 -0
  25. package/dist/ai/query-cache.js +274 -0
  26. package/dist/ai/query-cache.js.map +1 -0
  27. package/dist/ai/tree-generator.d.ts +21 -0
  28. package/dist/ai/tree-generator.d.ts.map +1 -0
  29. package/dist/ai/tree-generator.js +141 -0
  30. package/dist/ai/tree-generator.js.map +1 -0
  31. package/dist/cli.d.ts +24 -0
  32. package/dist/cli.d.ts.map +1 -0
  33. package/dist/cli.js +548 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/context/compat.d.ts +8 -0
  36. package/dist/context/compat.d.ts.map +1 -0
  37. package/dist/context/compat.js +8 -0
  38. package/dist/context/compat.js.map +1 -0
  39. package/dist/context/compress.d.ts +27 -0
  40. package/dist/context/compress.d.ts.map +1 -0
  41. package/dist/context/compress.js +162 -0
  42. package/dist/context/compress.js.map +1 -0
  43. package/dist/context/filter.d.ts +25 -0
  44. package/dist/context/filter.d.ts.map +1 -0
  45. package/dist/context/filter.js +175 -0
  46. package/dist/context/filter.js.map +1 -0
  47. package/dist/context/gather.d.ts +97 -0
  48. package/dist/context/gather.d.ts.map +1 -0
  49. package/dist/context/gather.js +155 -0
  50. package/dist/context/gather.js.map +1 -0
  51. package/dist/context/index.d.ts +10 -0
  52. package/dist/context/index.d.ts.map +1 -0
  53. package/dist/context/index.js +10 -0
  54. package/dist/context/index.js.map +1 -0
  55. package/dist/context/reader.d.ts +49 -0
  56. package/dist/context/reader.d.ts.map +1 -0
  57. package/dist/context/reader.js +148 -0
  58. package/dist/context/reader.js.map +1 -0
  59. package/dist/context/tree.d.ts +22 -0
  60. package/dist/context/tree.d.ts.map +1 -0
  61. package/dist/context/tree.js +72 -0
  62. package/dist/context/tree.js.map +1 -0
  63. package/dist/factory/connection-factory.d.ts +16 -0
  64. package/dist/factory/connection-factory.d.ts.map +1 -0
  65. package/dist/factory/connection-factory.js +91 -0
  66. package/dist/factory/connection-factory.js.map +1 -0
  67. package/dist/factory/element-factory.d.ts +16 -0
  68. package/dist/factory/element-factory.d.ts.map +1 -0
  69. package/dist/factory/element-factory.js +78 -0
  70. package/dist/factory/element-factory.js.map +1 -0
  71. package/dist/factory/image-factory.d.ts +38 -0
  72. package/dist/factory/image-factory.d.ts.map +1 -0
  73. package/dist/factory/image-factory.js +169 -0
  74. package/dist/factory/image-factory.js.map +1 -0
  75. package/dist/factory/index.d.ts +9 -0
  76. package/dist/factory/index.d.ts.map +1 -0
  77. package/dist/factory/index.js +9 -0
  78. package/dist/factory/index.js.map +1 -0
  79. package/dist/factory/node-factory.d.ts +24 -0
  80. package/dist/factory/node-factory.d.ts.map +1 -0
  81. package/dist/factory/node-factory.js +85 -0
  82. package/dist/factory/node-factory.js.map +1 -0
  83. package/dist/factory/text-factory.d.ts +42 -0
  84. package/dist/factory/text-factory.d.ts.map +1 -0
  85. package/dist/factory/text-factory.js +148 -0
  86. package/dist/factory/text-factory.js.map +1 -0
  87. package/dist/generator/excalidraw-generator.d.ts +17 -0
  88. package/dist/generator/excalidraw-generator.d.ts.map +1 -0
  89. package/dist/generator/excalidraw-generator.js +189 -0
  90. package/dist/generator/excalidraw-generator.js.map +1 -0
  91. package/dist/generator/index.d.ts +5 -0
  92. package/dist/generator/index.d.ts.map +1 -0
  93. package/dist/generator/index.js +5 -0
  94. package/dist/generator/index.js.map +1 -0
  95. package/dist/index.d.ts +23 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +36 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/layout/arrow-router.d.ts +48 -0
  100. package/dist/layout/arrow-router.d.ts.map +1 -0
  101. package/dist/layout/arrow-router.js +103 -0
  102. package/dist/layout/arrow-router.js.map +1 -0
  103. package/dist/layout/elk-layout.d.ts +11 -0
  104. package/dist/layout/elk-layout.d.ts.map +1 -0
  105. package/dist/layout/elk-layout.js +295 -0
  106. package/dist/layout/elk-layout.js.map +1 -0
  107. package/dist/layout/index.d.ts +6 -0
  108. package/dist/layout/index.d.ts.map +1 -0
  109. package/dist/layout/index.js +6 -0
  110. package/dist/layout/index.js.map +1 -0
  111. package/dist/parser/dot-parser.d.ts +23 -0
  112. package/dist/parser/dot-parser.d.ts.map +1 -0
  113. package/dist/parser/dot-parser.js +277 -0
  114. package/dist/parser/dot-parser.js.map +1 -0
  115. package/dist/parser/dsl-parser.d.ts +31 -0
  116. package/dist/parser/dsl-parser.d.ts.map +1 -0
  117. package/dist/parser/dsl-parser.js +455 -0
  118. package/dist/parser/dsl-parser.js.map +1 -0
  119. package/dist/parser/index.d.ts +7 -0
  120. package/dist/parser/index.d.ts.map +1 -0
  121. package/dist/parser/index.js +7 -0
  122. package/dist/parser/index.js.map +1 -0
  123. package/dist/parser/json-parser.d.ts +16 -0
  124. package/dist/parser/json-parser.d.ts.map +1 -0
  125. package/dist/parser/json-parser.js +76 -0
  126. package/dist/parser/json-parser.js.map +1 -0
  127. package/dist/types/dsl.d.ts +194 -0
  128. package/dist/types/dsl.d.ts.map +1 -0
  129. package/dist/types/dsl.js +14 -0
  130. package/dist/types/dsl.js.map +1 -0
  131. package/dist/types/excalidraw.d.ts +190 -0
  132. package/dist/types/excalidraw.d.ts.map +1 -0
  133. package/dist/types/excalidraw.js +36 -0
  134. package/dist/types/excalidraw.js.map +1 -0
  135. package/dist/types/index.d.ts +6 -0
  136. package/dist/types/index.d.ts.map +1 -0
  137. package/dist/types/index.js +6 -0
  138. package/dist/types/index.js.map +1 -0
  139. package/package.json +64 -0
package/dist/cli.js ADDED
@@ -0,0 +1,548 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Excalidraw CLI
4
+ *
5
+ * Create Excalidraw flowcharts from DSL, JSON, or DOT input.
6
+ */
7
+ import { Command } from 'commander';
8
+ import { readFileSync, writeFileSync, existsSync } from 'fs';
9
+ import { resolve, join } from 'path';
10
+ import { tmpdir } from 'os';
11
+ import { parseDSL } from './parser/dsl-parser.js';
12
+ import { parseJSONString } from './parser/json-parser.js';
13
+ import { parseDOT } from './parser/dot-parser.js';
14
+ import { layoutGraph } from './layout/elk-layout.js';
15
+ import { generateExcalidraw, serializeExcalidraw } from './generator/excalidraw-generator.js';
16
+ import { generateFlowchartInput } from './ai/openrouter.js';
17
+ import { gatherContext } from './ai/context-gatherer.js';
18
+ import { clearCache, getCacheStats } from './ai/query-cache.js';
19
+ import { loadConfig, CONFIG_TEMPLATE } from './ai/config.js';
20
+ const program = new Command();
21
+ /**
22
+ * Get compression options based on mode
23
+ */
24
+ function getCompressionOptions(mode) {
25
+ switch (mode) {
26
+ case 'aggressive':
27
+ return {
28
+ removeComments: true,
29
+ minifyWhitespace: true,
30
+ extractSignaturesOnly: true,
31
+ maxFileLines: 50,
32
+ preserveImports: true,
33
+ preserveExports: true,
34
+ preserveTypes: true,
35
+ preserveFunctionSignatures: true,
36
+ };
37
+ case 'minimal':
38
+ return {
39
+ removeComments: false,
40
+ minifyWhitespace: true,
41
+ extractSignaturesOnly: false,
42
+ maxFileLines: 200,
43
+ preserveImports: true,
44
+ preserveExports: true,
45
+ preserveTypes: true,
46
+ preserveFunctionSignatures: true,
47
+ };
48
+ case 'balanced':
49
+ default:
50
+ return {
51
+ removeComments: true,
52
+ minifyWhitespace: true,
53
+ extractSignaturesOnly: false,
54
+ maxFileLines: 100,
55
+ preserveImports: true,
56
+ preserveExports: true,
57
+ preserveTypes: true,
58
+ preserveFunctionSignatures: true,
59
+ };
60
+ }
61
+ }
62
+ program
63
+ .name('exai')
64
+ .description('Create Excalidraw flowcharts from DSL, JSON, or DOT')
65
+ .version('1.0.1');
66
+ /**
67
+ * Create command - main flowchart creation
68
+ */
69
+ program
70
+ .command('create')
71
+ .description('Create an Excalidraw flowchart')
72
+ .argument('[input]', 'Input file path (DSL, JSON, or DOT)')
73
+ .option('-o, --output <file>', 'Output file path', 'flowchart.excalidraw')
74
+ .option('-f, --format <type>', 'Input format: dsl, json, dot (default: dsl)', 'dsl')
75
+ .option('--inline <dsl>', 'Inline DSL/DOT string')
76
+ .option('--stdin', 'Read input from stdin')
77
+ .option('-d, --direction <dir>', 'Flow direction: TB, BT, LR, RL (default: TB)')
78
+ .option('-s, --spacing <n>', 'Node spacing in pixels', '50')
79
+ .option('--verbose', 'Verbose output')
80
+ .action(async (inputFile, options, command) => {
81
+ try {
82
+ let input;
83
+ let format = options.format;
84
+ const formatExplicitlySet = command.getOptionValueSource('format') === 'cli';
85
+ // Get input from various sources
86
+ if (options.inline) {
87
+ input = options.inline;
88
+ }
89
+ else if (options.stdin) {
90
+ input = readFileSync(0, 'utf-8'); // Read from stdin
91
+ }
92
+ else if (inputFile) {
93
+ input = readFileSync(inputFile, 'utf-8');
94
+ // Auto-detect format from file extension (only if --format not explicitly set)
95
+ if (!formatExplicitlySet) {
96
+ if (inputFile.endsWith('.json')) {
97
+ format = 'json';
98
+ }
99
+ else if (inputFile.endsWith('.dot') || inputFile.endsWith('.gv')) {
100
+ format = 'dot';
101
+ }
102
+ }
103
+ }
104
+ else {
105
+ console.error('Error: No input provided. Use --inline, --stdin, or provide an input file.');
106
+ process.exit(1);
107
+ }
108
+ if (options.verbose) {
109
+ console.log(`Input format: ${format}`);
110
+ console.log(`Input length: ${input.length} characters`);
111
+ }
112
+ // Parse input
113
+ let graph;
114
+ if (format === 'json') {
115
+ graph = parseJSONString(input);
116
+ }
117
+ else if (format === 'dot') {
118
+ graph = parseDOT(input);
119
+ }
120
+ else {
121
+ graph = parseDSL(input);
122
+ }
123
+ // Apply CLI options
124
+ if (options.direction) {
125
+ const dir = options.direction.toUpperCase();
126
+ if (['TB', 'BT', 'LR', 'RL'].includes(dir)) {
127
+ graph.options.direction = dir;
128
+ }
129
+ }
130
+ if (options.spacing) {
131
+ const spacing = parseInt(options.spacing, 10);
132
+ if (!isNaN(spacing)) {
133
+ graph.options.nodeSpacing = spacing;
134
+ }
135
+ }
136
+ if (options.verbose) {
137
+ console.log(`Parsed ${graph.nodes.length} nodes and ${graph.edges.length} edges`);
138
+ console.log(`Layout direction: ${graph.options.direction}`);
139
+ }
140
+ // Layout the graph
141
+ const layoutedGraph = await layoutGraph(graph);
142
+ if (options.verbose) {
143
+ console.log(`Layout complete. Canvas size: ${layoutedGraph.width}x${layoutedGraph.height}`);
144
+ }
145
+ // Generate Excalidraw file
146
+ const excalidrawFile = generateExcalidraw(layoutedGraph);
147
+ const output = serializeExcalidraw(excalidrawFile);
148
+ // Write output
149
+ if (options.output === '-') {
150
+ process.stdout.write(output);
151
+ }
152
+ else {
153
+ const absolutePath = resolve(options.output);
154
+ writeFileSync(absolutePath, output, 'utf-8');
155
+ console.log(`✅ Created: ${absolutePath}`);
156
+ console.log(`📦 Size: ${(output.length / 1024).toFixed(1)}KB`);
157
+ }
158
+ }
159
+ catch (error) {
160
+ console.error('Error:', error instanceof Error ? error.message : error);
161
+ process.exit(1);
162
+ }
163
+ });
164
+ /**
165
+ * Parse command - parse and validate input without generating
166
+ */
167
+ program
168
+ .command('parse')
169
+ .description('Parse and validate input without generating output')
170
+ .argument('<input>', 'Input file path')
171
+ .option('-f, --format <type>', 'Input format: dsl, json, dot (default: dsl)', 'dsl')
172
+ .action((inputFile, options, command) => {
173
+ try {
174
+ const input = readFileSync(inputFile, 'utf-8');
175
+ let format = options.format;
176
+ const formatExplicitlySet = command.getOptionValueSource('format') === 'cli';
177
+ // Auto-detect format from file extension (only if --format not explicitly set)
178
+ if (!formatExplicitlySet) {
179
+ if (inputFile.endsWith('.json')) {
180
+ format = 'json';
181
+ }
182
+ else if (inputFile.endsWith('.dot') || inputFile.endsWith('.gv')) {
183
+ format = 'dot';
184
+ }
185
+ }
186
+ // Parse input
187
+ let graph;
188
+ if (format === 'json') {
189
+ graph = parseJSONString(input);
190
+ }
191
+ else if (format === 'dot') {
192
+ graph = parseDOT(input);
193
+ }
194
+ else {
195
+ graph = parseDSL(input);
196
+ }
197
+ console.log('Parse successful!');
198
+ console.log(` Nodes: ${graph.nodes.length}`);
199
+ console.log(` Edges: ${graph.edges.length}`);
200
+ console.log(` Direction: ${graph.options.direction}`);
201
+ console.log('\nNodes:');
202
+ for (const node of graph.nodes) {
203
+ console.log(` - [${node.type}] ${node.label}`);
204
+ }
205
+ console.log('\nEdges:');
206
+ for (const edge of graph.edges) {
207
+ const sourceNode = graph.nodes.find((n) => n.id === edge.source);
208
+ const targetNode = graph.nodes.find((n) => n.id === edge.target);
209
+ const label = edge.label ? ` "${edge.label}"` : '';
210
+ console.log(` - ${sourceNode?.label} ->${label} ${targetNode?.label}`);
211
+ }
212
+ }
213
+ catch (error) {
214
+ console.error('Parse error:', error instanceof Error ? error.message : error);
215
+ process.exit(1);
216
+ }
217
+ });
218
+ /**
219
+ * AI command - generate flowchart from natural language
220
+ */
221
+ program
222
+ .command('ai')
223
+ .description('Generate an Excalidraw flowchart from natural language using AI')
224
+ .argument('<prompt>', 'Natural language description of the flowchart')
225
+ .option('-o, --output <file>', 'Output file path', 'flowchart.excalidraw')
226
+ .option('-f, --format <type>', 'AI output format: dsl, json (default: dsl)', 'dsl')
227
+ .option('-d, --direction <dir>', 'Flow direction: TB, BT, LR, RL')
228
+ .option('-s, --spacing <n>', 'Node spacing in pixels')
229
+ .option('-c, --context <path>', 'Include file or folder as context (can be used multiple times)', (value, previous) => previous.concat([value]), [])
230
+ .option('--model <model>', 'OpenRouter model (default: moonshotai/kimi-k2.5)')
231
+ .option('--api-key <key>', 'OpenRouter API key (overrides OPENROUTER_API_KEY env var)')
232
+ .option('--temperature <n>', 'Model temperature 0-2 (default: 0)', '0')
233
+ .option('--exclude <pattern>', 'Exclude pattern for context gathering (can be used multiple times)', (value, previous) => previous.concat([value]), [])
234
+ .option('--allow-test-files', 'Include test files in context (default: excluded)')
235
+ .option('--no-compress', 'Disable context compression')
236
+ .option('--compress-mode <mode>', 'Compression mode: balanced, aggressive, minimal (default: balanced)', 'balanced')
237
+ .option('--no-cache', 'Disable LLM response caching')
238
+ .option('--only-context', 'Only gather and display context, do not generate diagram')
239
+ .option('--config-path <path>', 'Path to config JSON file')
240
+ .option('--verbose', 'Verbose output')
241
+ .action(async (prompt, options, command) => {
242
+ try {
243
+ const startTime = Date.now();
244
+ // Load config file if provided and merge with CLI options
245
+ // Priority: CLI flags > config file > env vars > hardcoded defaults
246
+ let config = {};
247
+ if (options.configPath) {
248
+ config = loadConfig(options.configPath);
249
+ // Helper: use CLI value if explicitly set, otherwise config value
250
+ const src = (name) => command.getOptionValueSource(name);
251
+ // AI / LLM
252
+ if (config.model !== undefined && src('model') !== 'cli')
253
+ options.model = config.model;
254
+ if (config.apiKey !== undefined && src('apiKey') !== 'cli')
255
+ options.apiKey = config.apiKey;
256
+ if (config.temperature !== undefined && src('temperature') !== 'cli')
257
+ options.temperature = String(config.temperature);
258
+ // Output
259
+ if (config.format !== undefined && src('format') !== 'cli')
260
+ options.format = config.format;
261
+ if (config.output !== undefined && src('output') !== 'cli')
262
+ options.output = config.output;
263
+ if (config.direction !== undefined && src('direction') !== 'cli')
264
+ options.direction = config.direction;
265
+ if (config.spacing !== undefined && src('spacing') !== 'cli')
266
+ options.spacing = String(config.spacing);
267
+ // Context gathering
268
+ if (config.context !== undefined && src('context') !== 'cli')
269
+ options.context = config.context;
270
+ if (config.exclude !== undefined && src('exclude') !== 'cli')
271
+ options.exclude = config.exclude;
272
+ if (config.allowTestFiles !== undefined && src('allowTestFiles') !== 'cli')
273
+ options.allowTestFiles = config.allowTestFiles;
274
+ // Compression
275
+ if (config.compress !== undefined && src('compress') !== 'cli')
276
+ options.compress = config.compress;
277
+ if (config.compressMode !== undefined && src('compressMode') !== 'cli')
278
+ options.compressMode = config.compressMode;
279
+ // Cache
280
+ if (config.cache !== undefined && src('cache') !== 'cli')
281
+ options.cache = config.cache;
282
+ // Misc
283
+ if (config.verbose !== undefined && src('verbose') !== 'cli')
284
+ options.verbose = config.verbose;
285
+ if (options.verbose) {
286
+ console.log(`📄 Config loaded from: ${resolve(options.configPath)}`);
287
+ }
288
+ }
289
+ const format = options.format;
290
+ // Validate format
291
+ if (format !== 'dsl' && format !== 'json') {
292
+ console.error(`Error: Invalid format "${format}". Must be "dsl" or "json".`);
293
+ process.exit(1);
294
+ }
295
+ // Parse temperature
296
+ const temperature = parseFloat(options.temperature);
297
+ if (isNaN(temperature) || temperature < 0 || temperature > 2) {
298
+ console.error('Error: Temperature must be a number between 0 and 2.');
299
+ process.exit(1);
300
+ }
301
+ // Determine model to use
302
+ const model = options.model || process.env.OPENROUTER_MODEL || 'moonshotai/kimi-k2.5';
303
+ console.log('🚀 Excalidraw AI Generation Started');
304
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
305
+ console.log(`📝 Prompt: ${prompt}`);
306
+ console.log(`🤖 Model: ${model}`);
307
+ console.log(`📊 Format: ${format.toUpperCase()}`);
308
+ if (options.context && options.context.length > 0) {
309
+ console.log(`📁 Context: ${options.context.length} path(s)`);
310
+ }
311
+ if (options.exclude && options.exclude.length > 0) {
312
+ console.log(`🚫 Excludes: ${options.exclude.join(', ')}`);
313
+ }
314
+ if (options.allowTestFiles) {
315
+ console.log(`🧪 Test files: included`);
316
+ }
317
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
318
+ // Gather context if provided
319
+ let contextString;
320
+ if (options.context && options.context.length > 0) {
321
+ try {
322
+ console.log('📂 [1/5] Gathering Context...');
323
+ if (options.verbose) {
324
+ console.log(` CLI received context paths:`);
325
+ options.context.forEach((p) => console.log(` - ${p}`));
326
+ }
327
+ const contextStart = Date.now();
328
+ // Determine compression options: config.compressOptions overrides mode presets
329
+ const compressionMode = options.compressMode || 'balanced';
330
+ const modeDefaults = getCompressionOptions(compressionMode);
331
+ const compressionOptions = config.compressOptions
332
+ ? { ...modeDefaults, ...config.compressOptions }
333
+ : modeDefaults;
334
+ const contextResult = await gatherContext(options.context, {
335
+ apiKey: options.apiKey,
336
+ filterModel: config.filterModel,
337
+ verbose: options.verbose,
338
+ compress: options.compress !== false,
339
+ compressOptions: compressionOptions,
340
+ useCache: options.cache !== false,
341
+ excludePatterns: options.exclude,
342
+ allowTestFiles: options.allowTestFiles ?? false,
343
+ maxFileSize: config.maxFileSize,
344
+ maxDepth: config.maxDepth,
345
+ maxTreeItems: config.maxTreeItems,
346
+ cacheTtlDays: config.cacheTtlDays,
347
+ cacheMaxEntries: config.cacheMaxEntries,
348
+ });
349
+ contextString = contextResult.markdown;
350
+ const contextTime = Date.now() - contextStart;
351
+ let contextMsg = `✓ Context gathered (${(contextString.length / 1024).toFixed(1)}KB in ${contextTime}ms)`;
352
+ if (contextResult.compression && options.compress !== false) {
353
+ contextMsg += ` - ${contextResult.compression.ratio.toFixed(1)}% compression`;
354
+ }
355
+ if (contextResult.fromCache) {
356
+ contextMsg += ` [FROM CACHE]`;
357
+ }
358
+ console.log(contextMsg);
359
+ if (options.verbose) {
360
+ const t = contextResult.timing;
361
+ let summary = `Context gathering: ${(contextString.length / 1024).toFixed(1)}KB `;
362
+ if (contextResult.compression) {
363
+ summary += `(${contextResult.compression.ratio.toFixed(1)}% compressed) `;
364
+ }
365
+ summary += `(tree: ${t.treeMs}ms, filter: ${t.filterMs}ms, read: ${t.readMs}ms`;
366
+ if (t.compressMs) {
367
+ summary += `, compress: ${t.compressMs}ms`;
368
+ }
369
+ summary += `)`;
370
+ console.log(` ${summary}`);
371
+ console.log(` Cache key: ${contextResult.cacheKey}`);
372
+ }
373
+ console.log();
374
+ // If --only-context flag is set, display context and exit
375
+ if (options.onlyContext) {
376
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
377
+ console.log('📋 Context Output (use this for AI prompts):');
378
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
379
+ console.log(contextString);
380
+ console.log('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
381
+ console.log(`✅ Context gathering complete!`);
382
+ console.log(`📦 Size: ${(contextString.length / 1024).toFixed(1)}KB`);
383
+ if (contextResult.cacheKey) {
384
+ const cachePath = join(tmpdir(), 'exai-cache', contextResult.cacheKey);
385
+ console.log(`🔑 Cache key: ${contextResult.cacheKey}`);
386
+ console.log(`📁 Cache path: ${cachePath}`);
387
+ }
388
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
389
+ process.exit(0);
390
+ }
391
+ }
392
+ catch (error) {
393
+ console.error('❌ Context gathering error:', error instanceof Error ? error.message : error);
394
+ process.exit(1);
395
+ }
396
+ }
397
+ // Generate input using AI
398
+ console.log('🤖 [2/5] Calling AI to generate flowchart...');
399
+ const aiStart = Date.now();
400
+ const input = await generateFlowchartInput(prompt, format, {
401
+ model: options.model,
402
+ apiKey: options.apiKey,
403
+ temperature,
404
+ context: contextString,
405
+ verbose: options.verbose,
406
+ useCache: options.cache !== false,
407
+ cacheOptions: {
408
+ ttlDays: config.cacheTtlDays,
409
+ maxEntries: config.cacheMaxEntries,
410
+ },
411
+ });
412
+ const aiTime = Date.now() - aiStart;
413
+ console.log(`✓ AI generation complete (${input.length} chars in ${aiTime}ms)`);
414
+ if (options.verbose) {
415
+ console.log(`\n${format.toUpperCase()} Output:`);
416
+ console.log('─────────────────────────────────────────');
417
+ console.log(input);
418
+ console.log('─────────────────────────────────────────');
419
+ }
420
+ console.log();
421
+ // Parse AI-generated input
422
+ console.log('📊 [3/5] Parsing flowchart structure...');
423
+ const parseStart = Date.now();
424
+ let graph;
425
+ if (format === 'json') {
426
+ graph = parseJSONString(input);
427
+ }
428
+ else {
429
+ graph = parseDSL(input);
430
+ }
431
+ // Apply CLI options (same as create command)
432
+ if (options.direction) {
433
+ const dir = options.direction.toUpperCase();
434
+ if (['TB', 'BT', 'LR', 'RL'].includes(dir)) {
435
+ graph.options.direction = dir;
436
+ }
437
+ }
438
+ if (options.spacing) {
439
+ const spacing = parseInt(options.spacing, 10);
440
+ if (!isNaN(spacing)) {
441
+ graph.options.nodeSpacing = spacing;
442
+ }
443
+ }
444
+ const parseTime = Date.now() - parseStart;
445
+ console.log(`✓ Parsed: ${graph.nodes.length} nodes, ${graph.edges.length} edges (${parseTime}ms)`);
446
+ console.log(` Direction: ${graph.options.direction}, Spacing: ${graph.options.nodeSpacing}px`);
447
+ console.log();
448
+ // Layout the graph
449
+ console.log('📐 [4/5] Computing layout with ELK...');
450
+ const layoutStart = Date.now();
451
+ const layoutedGraph = await layoutGraph(graph, options.verbose);
452
+ const layoutTime = Date.now() - layoutStart;
453
+ console.log(`✓ Layout complete: ${layoutedGraph.width}x${layoutedGraph.height}px canvas (${layoutTime}ms)`);
454
+ console.log();
455
+ // Generate Excalidraw file
456
+ console.log('🎨 [5/5] Generating Excalidraw file...');
457
+ const genStart = Date.now();
458
+ const excalidrawFile = generateExcalidraw(layoutedGraph);
459
+ const output = serializeExcalidraw(excalidrawFile);
460
+ const genTime = Date.now() - genStart;
461
+ console.log(`✓ Generated Excalidraw file (${(output.length / 1024).toFixed(1)}KB in ${genTime}ms)`);
462
+ console.log();
463
+ // Write output
464
+ if (options.output === '-') {
465
+ process.stdout.write(output);
466
+ }
467
+ else {
468
+ const absolutePath = resolve(options.output);
469
+ writeFileSync(absolutePath, output, 'utf-8');
470
+ const totalTime = Date.now() - startTime;
471
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
472
+ console.log(`✅ Success! File created at:`);
473
+ console.log(`📄 ${absolutePath}`);
474
+ console.log(`📦 Size: ${(output.length / 1024).toFixed(1)}KB`);
475
+ console.log(`⏱️ Total time: ${(totalTime / 1000).toFixed(2)}s`);
476
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
477
+ }
478
+ }
479
+ catch (error) {
480
+ console.error('\n❌ Error:', error instanceof Error ? error.message : error);
481
+ process.exit(1);
482
+ }
483
+ });
484
+ /**
485
+ * Cache command - manage LLM response cache
486
+ */
487
+ program
488
+ .command('cache')
489
+ .description('Manage LLM response cache')
490
+ .argument('<action>', 'Action: clear, stats')
491
+ .action((action) => {
492
+ try {
493
+ if (action === 'clear') {
494
+ const cleared = clearCache({ verbose: true });
495
+ console.log(`✓ Cleared ${cleared} cache entries`);
496
+ }
497
+ else if (action === 'stats') {
498
+ const stats = getCacheStats();
499
+ console.log('Cache Statistics:');
500
+ console.log(` Total Entries: ${stats.totalEntries}`);
501
+ console.log(` Total Size: ${(stats.totalSize / 1024).toFixed(2)} KB`);
502
+ if (stats.oldestEntry) {
503
+ const age = Math.floor((Date.now() - stats.oldestEntry) / 1000 / 60 / 60 / 24);
504
+ console.log(` Oldest Entry: ${age} days ago`);
505
+ }
506
+ if (stats.newestEntry) {
507
+ const age = Math.floor((Date.now() - stats.newestEntry) / 1000 / 60);
508
+ console.log(` Newest Entry: ${age} minutes ago`);
509
+ }
510
+ }
511
+ else {
512
+ console.error(`Error: Unknown action "${action}". Use "clear" or "stats".`);
513
+ process.exit(1);
514
+ }
515
+ }
516
+ catch (error) {
517
+ console.error('Error:', error instanceof Error ? error.message : error);
518
+ process.exit(1);
519
+ }
520
+ });
521
+ /**
522
+ * Init command - create a starter config file
523
+ */
524
+ program
525
+ .command('init')
526
+ .description('Create a starter config file')
527
+ .argument('[path]', 'Output path for config file', 'exai.config.json')
528
+ .action((outputPath) => {
529
+ try {
530
+ const absolutePath = resolve(outputPath);
531
+ if (existsSync(absolutePath)) {
532
+ console.error(`Error: File already exists: ${absolutePath}`);
533
+ console.error('Delete it first or choose a different path.');
534
+ process.exit(1);
535
+ }
536
+ const content = JSON.stringify(CONFIG_TEMPLATE, null, 2) + '\n';
537
+ writeFileSync(absolutePath, content, 'utf-8');
538
+ console.log(`Created config file: ${absolutePath}`);
539
+ console.log(`Use it with: exai ai "prompt" --config-path ${outputPath}`);
540
+ }
541
+ catch (error) {
542
+ console.error('Error:', error instanceof Error ? error.message : error);
543
+ process.exit(1);
544
+ }
545
+ });
546
+ // Parse arguments and run
547
+ program.parse();
548
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Re-exports from node built-ins.
3
+ * Exists so gather.ts can import path/fs utils from one place,
4
+ * and tests can verify imports without mocking node internals.
5
+ */
6
+ export { resolve, basename } from 'path';
7
+ export { existsSync, statSync } from 'fs';
8
+ //# sourceMappingURL=compat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../src/context/compat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Re-exports from node built-ins.
3
+ * Exists so gather.ts can import path/fs utils from one place,
4
+ * and tests can verify imports without mocking node internals.
5
+ */
6
+ export { resolve, basename } from 'path';
7
+ export { existsSync, statSync } from 'fs';
8
+ //# sourceMappingURL=compat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compat.js","sourceRoot":"","sources":["../../src/context/compat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Context Compressor - Reduces context size while preserving essential information.
3
+ * Works on FileEntry[] directly (no markdown re-parsing needed).
4
+ */
5
+ import type { FileEntry } from './reader.js';
6
+ export interface CompressOptions {
7
+ removeComments?: boolean;
8
+ minifyWhitespace?: boolean;
9
+ extractSignaturesOnly?: boolean;
10
+ maxFileLines?: number;
11
+ preserveImports?: boolean;
12
+ preserveExports?: boolean;
13
+ preserveTypes?: boolean;
14
+ preserveFunctionSignatures?: boolean;
15
+ }
16
+ export interface CompressResult {
17
+ files: FileEntry[];
18
+ originalSize: number;
19
+ compressedSize: number;
20
+ compressionRatio: number;
21
+ filesProcessed: number;
22
+ }
23
+ /**
24
+ * Compress file entries, reducing content size while preserving structure.
25
+ */
26
+ export declare function compressFiles(files: FileEntry[], options?: CompressOptions): CompressResult;
27
+ //# sourceMappingURL=compress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compress.d.ts","sourceRoot":"","sources":["../../src/context/compress.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAkBD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,EAAE,EAClB,OAAO,GAAE,eAAoB,GAC5B,cAAc,CAsChB"}