@nils.del/supergrok 1.0.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.
- package/.env +45 -0
- package/.grok/settings.json +13 -0
- package/dist/agent/index.d.ts +35 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +244 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +242 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/client.d.ts +33 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +134 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/config.d.ts +15 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +123 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/transports.d.ts +24 -0
- package/dist/mcp/transports.d.ts.map +1 -0
- package/dist/mcp/transports.js +91 -0
- package/dist/mcp/transports.js.map +1 -0
- package/dist/tools/bash.d.ts +28 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +70 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/index.d.ts +77 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +80 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/text-editor.d.ts +69 -0
- package/dist/tools/text-editor.d.ts.map +1 -0
- package/dist/tools/text-editor.js +178 -0
- package/dist/tools/text-editor.js.map +1 -0
- package/dist/tools/types.d.ts +14 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/ui/readline-ui.d.ts +32 -0
- package/dist/ui/readline-ui.d.ts.map +1 -0
- package/dist/ui/readline-ui.js +256 -0
- package/dist/ui/readline-ui.js.map +1 -0
- package/dist/utils/settings.d.ts +20 -0
- package/dist/utils/settings.d.ts.map +1 -0
- package/dist/utils/settings.js +101 -0
- package/dist/utils/settings.js.map +1 -0
- package/package.json +51 -0
- package/src/agent/index.ts +302 -0
- package/src/index.ts +275 -0
- package/src/mcp/client.ts +178 -0
- package/src/mcp/config.ts +149 -0
- package/src/mcp/transports.ts +142 -0
- package/src/tools/bash.ts +84 -0
- package/src/tools/index.ts +91 -0
- package/src/tools/text-editor.ts +222 -0
- package/src/tools/types.ts +14 -0
- package/src/ui/readline-ui.ts +294 -0
- package/src/utils/settings.ts +129 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import * as readline from 'readline';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { GrokAgent, StreamChunk, ChatEntry } from '../agent/index.js';
|
|
4
|
+
import { getMCPManager } from '../mcp/client.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A readline-based UI that doesn't have the Ink flickering issues.
|
|
8
|
+
*
|
|
9
|
+
* Key differences from Ink-based UI:
|
|
10
|
+
* 1. Uses Node.js readline which has proper terminal handling on Linux
|
|
11
|
+
* 2. Line-based output instead of full-screen rendering
|
|
12
|
+
* 3. Input is captured properly even during MCP operations
|
|
13
|
+
* 4. No React rendering overhead
|
|
14
|
+
*/
|
|
15
|
+
export class ReadlineUI {
|
|
16
|
+
private agent: GrokAgent;
|
|
17
|
+
private rl: readline.Interface;
|
|
18
|
+
private isProcessing = false;
|
|
19
|
+
private currentSpinner: NodeJS.Timeout | null = null;
|
|
20
|
+
private spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
21
|
+
private spinnerIndex = 0;
|
|
22
|
+
|
|
23
|
+
constructor(agent: GrokAgent) {
|
|
24
|
+
this.agent = agent;
|
|
25
|
+
|
|
26
|
+
// Create readline interface with proper configuration for raw mode
|
|
27
|
+
this.rl = readline.createInterface({
|
|
28
|
+
input: process.stdin,
|
|
29
|
+
output: process.stdout,
|
|
30
|
+
terminal: true,
|
|
31
|
+
historySize: 100,
|
|
32
|
+
prompt: chalk.cyan('❯ ')
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Handle Ctrl+C gracefully
|
|
36
|
+
this.rl.on('close', () => {
|
|
37
|
+
this.cleanup();
|
|
38
|
+
process.exit(0);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Handle SIGINT (Ctrl+C)
|
|
42
|
+
process.on('SIGINT', () => {
|
|
43
|
+
if (this.isProcessing) {
|
|
44
|
+
this.agent.abortCurrentOperation();
|
|
45
|
+
this.stopSpinner();
|
|
46
|
+
console.log(chalk.yellow('\n[Aborted]'));
|
|
47
|
+
this.isProcessing = false;
|
|
48
|
+
this.prompt();
|
|
49
|
+
} else {
|
|
50
|
+
console.log(chalk.gray('\nGoodbye!'));
|
|
51
|
+
this.cleanup();
|
|
52
|
+
process.exit(0);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private cleanup(): void {
|
|
58
|
+
this.stopSpinner();
|
|
59
|
+
this.rl.close();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
private startSpinner(message: string): void {
|
|
63
|
+
this.spinnerIndex = 0;
|
|
64
|
+
process.stdout.write(`\r${chalk.yellow(this.spinnerFrames[0])} ${message}`);
|
|
65
|
+
|
|
66
|
+
this.currentSpinner = setInterval(() => {
|
|
67
|
+
this.spinnerIndex = (this.spinnerIndex + 1) % this.spinnerFrames.length;
|
|
68
|
+
process.stdout.write(`\r${chalk.yellow(this.spinnerFrames[this.spinnerIndex])} ${message}`);
|
|
69
|
+
}, 80);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private stopSpinner(): void {
|
|
73
|
+
if (this.currentSpinner) {
|
|
74
|
+
clearInterval(this.currentSpinner);
|
|
75
|
+
this.currentSpinner = null;
|
|
76
|
+
process.stdout.write('\r\x1b[K'); // Clear the line
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private prompt(): void {
|
|
81
|
+
this.rl.prompt();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private printHeader(): void {
|
|
85
|
+
console.log();
|
|
86
|
+
console.log(chalk.magenta.bold(' ╔═══════════════════════════════════════════╗'));
|
|
87
|
+
console.log(chalk.magenta.bold(' ║') + chalk.cyan.bold(' GROK CLI (Fixed Edition) ') + chalk.magenta.bold('║'));
|
|
88
|
+
console.log(chalk.magenta.bold(' ║') + chalk.gray(' No Ink flickering • Works with MCP ') + chalk.magenta.bold('║'));
|
|
89
|
+
console.log(chalk.magenta.bold(' ╚═══════════════════════════════════════════╝'));
|
|
90
|
+
console.log();
|
|
91
|
+
console.log(chalk.gray(' Type your message and press Enter. Commands:'));
|
|
92
|
+
console.log(chalk.gray(' /help - Show help /clear - Clear history /exit - Quit'));
|
|
93
|
+
console.log(chalk.gray(' Ctrl+C - Cancel operation or exit'));
|
|
94
|
+
console.log();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
private async showMCPStatus(): Promise<void> {
|
|
98
|
+
const mcpManager = getMCPManager();
|
|
99
|
+
await mcpManager.ensureServersInitialized();
|
|
100
|
+
|
|
101
|
+
const servers = mcpManager.getServers();
|
|
102
|
+
const tools = mcpManager.getTools();
|
|
103
|
+
|
|
104
|
+
if (servers.length > 0) {
|
|
105
|
+
console.log(chalk.green(` ✓ MCP: ${servers.length} server(s), ${tools.length} tool(s)`));
|
|
106
|
+
servers.forEach(server => {
|
|
107
|
+
const serverTools = tools.filter(t => t.serverName === server);
|
|
108
|
+
console.log(chalk.gray(` • ${server}: ${serverTools.length} tools`));
|
|
109
|
+
});
|
|
110
|
+
console.log();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private printToolCall(name: string, args: string): void {
|
|
115
|
+
const shortArgs = args.length > 100 ? args.substring(0, 100) + '...' : args;
|
|
116
|
+
console.log(chalk.blue(` ⚡ ${name}`));
|
|
117
|
+
console.log(chalk.gray(` ${shortArgs}`));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private printToolResult(result: { success: boolean; output?: string; error?: string }): void {
|
|
121
|
+
if (result.success) {
|
|
122
|
+
const output = result.output || 'Success';
|
|
123
|
+
const lines = output.split('\n');
|
|
124
|
+
const displayLines = lines.length > 10 ? [...lines.slice(0, 10), `... (${lines.length - 10} more lines)`] : lines;
|
|
125
|
+
console.log(chalk.green(' ✓ ') + chalk.gray(displayLines.join('\n ')));
|
|
126
|
+
} else {
|
|
127
|
+
console.log(chalk.red(' ✗ ') + chalk.red(result.error || 'Error'));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
private handleCommand(input: string): boolean {
|
|
132
|
+
const command = input.trim().toLowerCase();
|
|
133
|
+
|
|
134
|
+
switch (command) {
|
|
135
|
+
case '/help':
|
|
136
|
+
console.log();
|
|
137
|
+
console.log(chalk.cyan('Available Commands:'));
|
|
138
|
+
console.log(chalk.gray(' /help - Show this help message'));
|
|
139
|
+
console.log(chalk.gray(' /clear - Clear conversation history'));
|
|
140
|
+
console.log(chalk.gray(' /model - Show current model'));
|
|
141
|
+
console.log(chalk.gray(' /mcp - Show MCP server status'));
|
|
142
|
+
console.log(chalk.gray(' /exit - Exit the application'));
|
|
143
|
+
console.log();
|
|
144
|
+
console.log(chalk.cyan('Keyboard Shortcuts:'));
|
|
145
|
+
console.log(chalk.gray(' Ctrl+C - Cancel current operation or exit'));
|
|
146
|
+
console.log(chalk.gray(' Up/Down - Navigate command history'));
|
|
147
|
+
console.log();
|
|
148
|
+
return true;
|
|
149
|
+
|
|
150
|
+
case '/clear':
|
|
151
|
+
this.agent.clearHistory();
|
|
152
|
+
console.clear();
|
|
153
|
+
this.printHeader();
|
|
154
|
+
console.log(chalk.green(' ✓ Conversation cleared'));
|
|
155
|
+
console.log();
|
|
156
|
+
return true;
|
|
157
|
+
|
|
158
|
+
case '/model':
|
|
159
|
+
console.log(chalk.cyan(` Current model: ${this.agent.getCurrentModel()}`));
|
|
160
|
+
console.log();
|
|
161
|
+
return true;
|
|
162
|
+
|
|
163
|
+
case '/mcp':
|
|
164
|
+
this.showMCPStatus();
|
|
165
|
+
return true;
|
|
166
|
+
|
|
167
|
+
case '/exit':
|
|
168
|
+
case 'exit':
|
|
169
|
+
case 'quit':
|
|
170
|
+
console.log(chalk.gray('Goodbye!'));
|
|
171
|
+
this.cleanup();
|
|
172
|
+
process.exit(0);
|
|
173
|
+
return true;
|
|
174
|
+
|
|
175
|
+
default:
|
|
176
|
+
if (input.startsWith('/')) {
|
|
177
|
+
console.log(chalk.red(` Unknown command: ${input}`));
|
|
178
|
+
console.log(chalk.gray(' Type /help for available commands'));
|
|
179
|
+
console.log();
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
private async processMessage(input: string): Promise<void> {
|
|
187
|
+
this.isProcessing = true;
|
|
188
|
+
console.log();
|
|
189
|
+
|
|
190
|
+
try {
|
|
191
|
+
let lastContent = '';
|
|
192
|
+
let isFirstContent = true;
|
|
193
|
+
let toolCount = 0;
|
|
194
|
+
|
|
195
|
+
for await (const chunk of this.agent.processUserMessageStream(input)) {
|
|
196
|
+
switch (chunk.type) {
|
|
197
|
+
case 'content':
|
|
198
|
+
if (chunk.content) {
|
|
199
|
+
if (isFirstContent) {
|
|
200
|
+
process.stdout.write(chalk.white(' '));
|
|
201
|
+
isFirstContent = false;
|
|
202
|
+
}
|
|
203
|
+
process.stdout.write(chunk.content);
|
|
204
|
+
lastContent += chunk.content;
|
|
205
|
+
}
|
|
206
|
+
break;
|
|
207
|
+
|
|
208
|
+
case 'tool_calls':
|
|
209
|
+
if (lastContent) {
|
|
210
|
+
console.log();
|
|
211
|
+
lastContent = '';
|
|
212
|
+
}
|
|
213
|
+
console.log();
|
|
214
|
+
|
|
215
|
+
if (chunk.toolCalls) {
|
|
216
|
+
for (const tc of chunk.toolCalls) {
|
|
217
|
+
toolCount++;
|
|
218
|
+
this.printToolCall(tc.function.name, tc.function.arguments);
|
|
219
|
+
this.startSpinner(`Executing tool ${toolCount}...`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
isFirstContent = true;
|
|
223
|
+
break;
|
|
224
|
+
|
|
225
|
+
case 'tool_result':
|
|
226
|
+
this.stopSpinner();
|
|
227
|
+
if (chunk.toolResult) {
|
|
228
|
+
this.printToolResult(chunk.toolResult);
|
|
229
|
+
}
|
|
230
|
+
console.log();
|
|
231
|
+
break;
|
|
232
|
+
|
|
233
|
+
case 'done':
|
|
234
|
+
if (lastContent && !lastContent.endsWith('\n')) {
|
|
235
|
+
console.log();
|
|
236
|
+
}
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
} catch (error: any) {
|
|
241
|
+
this.stopSpinner();
|
|
242
|
+
console.log(chalk.red(`\n Error: ${error.message}`));
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
console.log();
|
|
246
|
+
this.isProcessing = false;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
async start(initialMessage?: string): Promise<void> {
|
|
250
|
+
// Clear screen and print header
|
|
251
|
+
console.clear();
|
|
252
|
+
this.printHeader();
|
|
253
|
+
|
|
254
|
+
// Show MCP status
|
|
255
|
+
await this.showMCPStatus();
|
|
256
|
+
|
|
257
|
+
// Show current model
|
|
258
|
+
console.log(chalk.yellow(` Model: ${this.agent.getCurrentModel()}`));
|
|
259
|
+
console.log();
|
|
260
|
+
|
|
261
|
+
// Process initial message if provided
|
|
262
|
+
if (initialMessage) {
|
|
263
|
+
console.log(chalk.cyan('❯ ') + initialMessage);
|
|
264
|
+
await this.processMessage(initialMessage);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Main input loop
|
|
268
|
+
this.rl.on('line', async (input) => {
|
|
269
|
+
const trimmed = input.trim();
|
|
270
|
+
|
|
271
|
+
if (!trimmed) {
|
|
272
|
+
this.prompt();
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Check for commands
|
|
277
|
+
if (this.handleCommand(trimmed)) {
|
|
278
|
+
this.prompt();
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Process as a message to the AI
|
|
283
|
+
await this.processMessage(trimmed);
|
|
284
|
+
this.prompt();
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
this.prompt();
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export async function runReadlineUI(agent: GrokAgent, initialMessage?: string): Promise<void> {
|
|
292
|
+
const ui = new ReadlineUI(agent);
|
|
293
|
+
await ui.start(initialMessage);
|
|
294
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
|
|
5
|
+
export interface UserSettings {
|
|
6
|
+
apiKey?: string;
|
|
7
|
+
baseURL?: string;
|
|
8
|
+
defaultModel?: string;
|
|
9
|
+
models?: string[];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface ProjectSettings {
|
|
13
|
+
model?: string;
|
|
14
|
+
mcpServers?: Record<string, any>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function getUserSettingsPath(): string {
|
|
18
|
+
return path.join(os.homedir(), '.grok', 'user-settings.json');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function getProjectSettingsPath(): string {
|
|
22
|
+
return path.join(process.cwd(), '.grok', 'settings.json');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function loadUserSettings(): UserSettings {
|
|
26
|
+
const settingsPath = getUserSettingsPath();
|
|
27
|
+
|
|
28
|
+
if (!fs.existsSync(settingsPath)) {
|
|
29
|
+
return {};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
return JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
|
|
34
|
+
} catch (error) {
|
|
35
|
+
return {};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function loadProjectSettings(): ProjectSettings {
|
|
40
|
+
const settingsPath = getProjectSettingsPath();
|
|
41
|
+
|
|
42
|
+
if (!fs.existsSync(settingsPath)) {
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
return JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
|
|
48
|
+
} catch (error) {
|
|
49
|
+
return {};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function saveUserSettings(settings: UserSettings): void {
|
|
54
|
+
const settingsPath = getUserSettingsPath();
|
|
55
|
+
const settingsDir = path.dirname(settingsPath);
|
|
56
|
+
|
|
57
|
+
if (!fs.existsSync(settingsDir)) {
|
|
58
|
+
fs.mkdirSync(settingsDir, { recursive: true });
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function saveProjectSettings(settings: ProjectSettings): void {
|
|
65
|
+
const settingsPath = getProjectSettingsPath();
|
|
66
|
+
const settingsDir = path.dirname(settingsPath);
|
|
67
|
+
|
|
68
|
+
if (!fs.existsSync(settingsDir)) {
|
|
69
|
+
fs.mkdirSync(settingsDir, { recursive: true });
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function getApiKey(): string | undefined {
|
|
76
|
+
return process.env.GROK_API_KEY || loadUserSettings().apiKey;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function getBaseURL(): string {
|
|
80
|
+
return process.env.GROK_BASE_URL || loadUserSettings().baseURL || 'https://api.x.ai/v1';
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function getCurrentModel(): string {
|
|
84
|
+
const envModel = process.env.GROK_MODEL;
|
|
85
|
+
if (envModel) return envModel;
|
|
86
|
+
|
|
87
|
+
const projectSettings = loadProjectSettings();
|
|
88
|
+
if (projectSettings.model) return projectSettings.model;
|
|
89
|
+
|
|
90
|
+
const userSettings = loadUserSettings();
|
|
91
|
+
if (userSettings.defaultModel) return userSettings.defaultModel;
|
|
92
|
+
|
|
93
|
+
return 'grok-3-fast';
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function getAvailableModels(): string[] {
|
|
97
|
+
const userSettings = loadUserSettings();
|
|
98
|
+
return userSettings.models || [
|
|
99
|
+
'grok-code-fast-1',
|
|
100
|
+
'grok-4-latest',
|
|
101
|
+
'grok-3-latest',
|
|
102
|
+
'grok-3-fast',
|
|
103
|
+
'grok-3-mini-fast'
|
|
104
|
+
];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function loadCustomInstructions(): string | null {
|
|
108
|
+
// Check project-level instructions first
|
|
109
|
+
const projectPath = path.join(process.cwd(), '.grok', 'GROK.md');
|
|
110
|
+
if (fs.existsSync(projectPath)) {
|
|
111
|
+
try {
|
|
112
|
+
return fs.readFileSync(projectPath, 'utf-8');
|
|
113
|
+
} catch (error) {
|
|
114
|
+
// Ignore errors
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Fall back to global instructions
|
|
119
|
+
const globalPath = path.join(os.homedir(), '.grok', 'GROK.md');
|
|
120
|
+
if (fs.existsSync(globalPath)) {
|
|
121
|
+
try {
|
|
122
|
+
return fs.readFileSync(globalPath, 'utf-8');
|
|
123
|
+
} catch (error) {
|
|
124
|
+
// Ignore errors
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return null;
|
|
129
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "bundler",
|
|
6
|
+
"lib": ["ES2022"],
|
|
7
|
+
"outDir": "./dist",
|
|
8
|
+
"rootDir": "./src",
|
|
9
|
+
"strict": true,
|
|
10
|
+
"esModuleInterop": true,
|
|
11
|
+
"skipLibCheck": true,
|
|
12
|
+
"forceConsistentCasingInFileNames": true,
|
|
13
|
+
"declaration": true,
|
|
14
|
+
"declarationMap": true,
|
|
15
|
+
"sourceMap": true,
|
|
16
|
+
"resolveJsonModule": true
|
|
17
|
+
},
|
|
18
|
+
"include": ["src/**/*"],
|
|
19
|
+
"exclude": ["node_modules", "dist"]
|
|
20
|
+
}
|