locdotech-ai 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.
Files changed (167) hide show
  1. package/README.md +104 -0
  2. package/bin/ai.js +16 -0
  3. package/dist/api/client.d.ts +75 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +86 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/api/index.d.ts +4 -0
  8. package/dist/api/index.d.ts.map +1 -0
  9. package/dist/api/index.js +4 -0
  10. package/dist/api/index.js.map +1 -0
  11. package/dist/api/streaming.d.ts +15 -0
  12. package/dist/api/streaming.d.ts.map +1 -0
  13. package/dist/api/streaming.js +87 -0
  14. package/dist/api/streaming.js.map +1 -0
  15. package/dist/api/websocket.d.ts +20 -0
  16. package/dist/api/websocket.d.ts.map +1 -0
  17. package/dist/api/websocket.js +80 -0
  18. package/dist/api/websocket.js.map +1 -0
  19. package/dist/cli.d.ts +15 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +72 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/commands/clear.d.ts +3 -0
  24. package/dist/commands/clear.d.ts.map +1 -0
  25. package/dist/commands/clear.js +13 -0
  26. package/dist/commands/clear.js.map +1 -0
  27. package/dist/commands/config.d.ts +3 -0
  28. package/dist/commands/config.d.ts.map +1 -0
  29. package/dist/commands/config.js +116 -0
  30. package/dist/commands/config.js.map +1 -0
  31. package/dist/commands/help.d.ts +3 -0
  32. package/dist/commands/help.d.ts.map +1 -0
  33. package/dist/commands/help.js +42 -0
  34. package/dist/commands/help.js.map +1 -0
  35. package/dist/commands/history.d.ts +3 -0
  36. package/dist/commands/history.d.ts.map +1 -0
  37. package/dist/commands/history.js +62 -0
  38. package/dist/commands/history.js.map +1 -0
  39. package/dist/commands/index.d.ts +30 -0
  40. package/dist/commands/index.d.ts.map +1 -0
  41. package/dist/commands/index.js +54 -0
  42. package/dist/commands/index.js.map +1 -0
  43. package/dist/commands/model.d.ts +3 -0
  44. package/dist/commands/model.d.ts.map +1 -0
  45. package/dist/commands/model.js +57 -0
  46. package/dist/commands/model.js.map +1 -0
  47. package/dist/commands/quit.d.ts +3 -0
  48. package/dist/commands/quit.d.ts.map +1 -0
  49. package/dist/commands/quit.js +16 -0
  50. package/dist/commands/quit.js.map +1 -0
  51. package/dist/commands/status.d.ts +3 -0
  52. package/dist/commands/status.d.ts.map +1 -0
  53. package/dist/commands/status.js +39 -0
  54. package/dist/commands/status.js.map +1 -0
  55. package/dist/config/index.d.ts +2 -0
  56. package/dist/config/index.d.ts.map +1 -0
  57. package/dist/config/index.js +2 -0
  58. package/dist/config/index.js.map +1 -0
  59. package/dist/config/settings.d.ts +18 -0
  60. package/dist/config/settings.d.ts.map +1 -0
  61. package/dist/config/settings.js +56 -0
  62. package/dist/config/settings.js.map +1 -0
  63. package/dist/index.d.ts +3 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +100 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/tools/bash.d.ts +41 -0
  68. package/dist/tools/bash.d.ts.map +1 -0
  69. package/dist/tools/bash.js +100 -0
  70. package/dist/tools/bash.js.map +1 -0
  71. package/dist/tools/file.d.ts +107 -0
  72. package/dist/tools/file.d.ts.map +1 -0
  73. package/dist/tools/file.js +189 -0
  74. package/dist/tools/file.js.map +1 -0
  75. package/dist/tools/glob.d.ts +38 -0
  76. package/dist/tools/glob.d.ts.map +1 -0
  77. package/dist/tools/glob.js +84 -0
  78. package/dist/tools/glob.js.map +1 -0
  79. package/dist/tools/grep.d.ts +76 -0
  80. package/dist/tools/grep.d.ts.map +1 -0
  81. package/dist/tools/grep.js +166 -0
  82. package/dist/tools/grep.js.map +1 -0
  83. package/dist/tools/index.d.ts +29 -0
  84. package/dist/tools/index.d.ts.map +1 -0
  85. package/dist/tools/index.js +130 -0
  86. package/dist/tools/index.js.map +1 -0
  87. package/dist/tools/mcp.d.ts +59 -0
  88. package/dist/tools/mcp.d.ts.map +1 -0
  89. package/dist/tools/mcp.js +155 -0
  90. package/dist/tools/mcp.js.map +1 -0
  91. package/dist/ui/App.d.ts +6 -0
  92. package/dist/ui/App.d.ts.map +1 -0
  93. package/dist/ui/App.js +161 -0
  94. package/dist/ui/App.js.map +1 -0
  95. package/dist/ui/components/CodeBlock.d.ts +9 -0
  96. package/dist/ui/components/CodeBlock.d.ts.map +1 -0
  97. package/dist/ui/components/CodeBlock.js +83 -0
  98. package/dist/ui/components/CodeBlock.js.map +1 -0
  99. package/dist/ui/components/Input.d.ts +11 -0
  100. package/dist/ui/components/Input.d.ts.map +1 -0
  101. package/dist/ui/components/Input.js +93 -0
  102. package/dist/ui/components/Input.js.map +1 -0
  103. package/dist/ui/components/Message.d.ts +7 -0
  104. package/dist/ui/components/Message.d.ts.map +1 -0
  105. package/dist/ui/components/Message.js +86 -0
  106. package/dist/ui/components/Message.js.map +1 -0
  107. package/dist/ui/components/ModelSelector.d.ts +7 -0
  108. package/dist/ui/components/ModelSelector.d.ts.map +1 -0
  109. package/dist/ui/components/ModelSelector.js +23 -0
  110. package/dist/ui/components/ModelSelector.js.map +1 -0
  111. package/dist/ui/components/Permission.d.ts +9 -0
  112. package/dist/ui/components/Permission.d.ts.map +1 -0
  113. package/dist/ui/components/Permission.js +41 -0
  114. package/dist/ui/components/Permission.js.map +1 -0
  115. package/dist/ui/components/StatusBar.d.ts +11 -0
  116. package/dist/ui/components/StatusBar.d.ts.map +1 -0
  117. package/dist/ui/components/StatusBar.js +9 -0
  118. package/dist/ui/components/StatusBar.js.map +1 -0
  119. package/dist/ui/components/TaskList.d.ts +12 -0
  120. package/dist/ui/components/TaskList.d.ts.map +1 -0
  121. package/dist/ui/components/TaskList.js +21 -0
  122. package/dist/ui/components/TaskList.js.map +1 -0
  123. package/dist/ui/components/ToolCall.d.ts +16 -0
  124. package/dist/ui/components/ToolCall.d.ts.map +1 -0
  125. package/dist/ui/components/ToolCall.js +50 -0
  126. package/dist/ui/components/ToolCall.js.map +1 -0
  127. package/dist/ui/components/index.d.ts +8 -0
  128. package/dist/ui/components/index.d.ts.map +1 -0
  129. package/dist/ui/components/index.js +8 -0
  130. package/dist/ui/components/index.js.map +1 -0
  131. package/dist/ui/hooks/index.d.ts +4 -0
  132. package/dist/ui/hooks/index.d.ts.map +1 -0
  133. package/dist/ui/hooks/index.js +4 -0
  134. package/dist/ui/hooks/index.js.map +1 -0
  135. package/dist/ui/hooks/useChat.d.ts +42 -0
  136. package/dist/ui/hooks/useChat.d.ts.map +1 -0
  137. package/dist/ui/hooks/useChat.js +305 -0
  138. package/dist/ui/hooks/useChat.js.map +1 -0
  139. package/dist/ui/hooks/useHistory.d.ts +14 -0
  140. package/dist/ui/hooks/useHistory.d.ts.map +1 -0
  141. package/dist/ui/hooks/useHistory.js +123 -0
  142. package/dist/ui/hooks/useHistory.js.map +1 -0
  143. package/dist/ui/hooks/useTools.d.ts +19 -0
  144. package/dist/ui/hooks/useTools.d.ts.map +1 -0
  145. package/dist/ui/hooks/useTools.js +54 -0
  146. package/dist/ui/hooks/useTools.js.map +1 -0
  147. package/dist/ui/themes/index.d.ts +21 -0
  148. package/dist/ui/themes/index.d.ts.map +1 -0
  149. package/dist/ui/themes/index.js +40 -0
  150. package/dist/ui/themes/index.js.map +1 -0
  151. package/dist/utils/auth.d.ts +5 -0
  152. package/dist/utils/auth.d.ts.map +1 -0
  153. package/dist/utils/auth.js +42 -0
  154. package/dist/utils/auth.js.map +1 -0
  155. package/dist/utils/format.d.ts +11 -0
  156. package/dist/utils/format.d.ts.map +1 -0
  157. package/dist/utils/format.js +71 -0
  158. package/dist/utils/format.js.map +1 -0
  159. package/dist/utils/index.d.ts +4 -0
  160. package/dist/utils/index.d.ts.map +1 -0
  161. package/dist/utils/index.js +4 -0
  162. package/dist/utils/index.js.map +1 -0
  163. package/dist/utils/logger.d.ts +18 -0
  164. package/dist/utils/logger.d.ts.map +1 -0
  165. package/dist/utils/logger.js +61 -0
  166. package/dist/utils/logger.js.map +1 -0
  167. package/package.json +64 -0
@@ -0,0 +1,3 @@
1
+ import { Command } from './index.js';
2
+ export declare const configCommand: Command;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,MAAM,YAAY,CAAC;AAGrD,eAAO,MAAM,aAAa,EAAE,OA2H3B,CAAC"}
@@ -0,0 +1,116 @@
1
+ import { loadSettings, saveSettings, resetSettings, getConfigPath } from '../config/index.js';
2
+ export const configCommand = {
3
+ name: 'config',
4
+ description: 'Show or edit configuration',
5
+ aliases: ['settings'],
6
+ async execute(context) {
7
+ const args = context.args?.trim();
8
+ const settings = loadSettings();
9
+ // No args - show current config
10
+ if (!args) {
11
+ const output = `
12
+ Current Configuration:
13
+ ━━━━━━━━━━━━━━━━━━━━━━
14
+ API URL: ${settings.apiUrl}
15
+ WS URL: ${settings.wsUrl}
16
+ Model: ${settings.model}
17
+ API Key: ${settings.apiKey ? '********' + settings.apiKey.slice(-4) : 'Not set'}
18
+ Auto Accept: ${settings.autoAccept}
19
+ Theme: ${settings.theme}
20
+ Max Tokens: ${settings.maxTokens}
21
+ Temperature: ${settings.temperature}
22
+
23
+ Usage:
24
+ /config <key> <value> - Set a configuration value
25
+ /config apiKey <key> - Set API key
26
+ /config model <name> - Set default model
27
+ /config autoAccept on - Enable auto-accept
28
+ /config reset - Reset all settings (clear API key)
29
+ /config reset apiKey - Reset only API key
30
+ `.trim();
31
+ console.log(output);
32
+ return output;
33
+ }
34
+ // Parse key value
35
+ const parts = args.split(' ');
36
+ const key = parts[0];
37
+ const value = parts.slice(1).join(' ');
38
+ // Handle reset command
39
+ if (key === 'reset') {
40
+ if (value === 'apiKey' || value === 'key') {
41
+ // Reset only API key
42
+ saveSettings({ apiKey: '' });
43
+ const output = `
44
+ API Key has been reset.
45
+ Run 'ai' again to enter a new API key.
46
+ Or use: /config apiKey <your-new-key>
47
+ `.trim();
48
+ console.log(output);
49
+ return output;
50
+ }
51
+ else {
52
+ // Reset all settings
53
+ resetSettings();
54
+ const output = `
55
+ All settings have been reset to defaults.
56
+ Config file deleted: ${getConfigPath()}
57
+ Run 'ai' again to set up a new API key.
58
+ `.trim();
59
+ console.log(output);
60
+ return output;
61
+ }
62
+ }
63
+ // Handle show path command
64
+ if (key === 'path') {
65
+ const configPath = getConfigPath();
66
+ console.log(`Config file: ${configPath}`);
67
+ return `Config file: ${configPath}`;
68
+ }
69
+ const settingsKey = key;
70
+ if (!value) {
71
+ return `Current value of ${settingsKey}: ${settings[settingsKey]}`;
72
+ }
73
+ // Validate and set value
74
+ const validKeys = [
75
+ 'apiKey',
76
+ 'apiUrl',
77
+ 'wsUrl',
78
+ 'model',
79
+ 'autoAccept',
80
+ 'theme',
81
+ 'maxTokens',
82
+ 'temperature',
83
+ ];
84
+ if (!validKeys.includes(settingsKey)) {
85
+ return `Unknown configuration key: ${settingsKey}. Valid keys: ${validKeys.join(', ')}`;
86
+ }
87
+ // Type conversion
88
+ let typedValue = value;
89
+ if (key === 'autoAccept') {
90
+ typedValue = value === 'true' || value === 'on' || value === '1';
91
+ if (context.setAutoAccept) {
92
+ context.setAutoAccept(typedValue);
93
+ }
94
+ }
95
+ else if (key === 'maxTokens') {
96
+ typedValue = parseInt(value, 10);
97
+ if (isNaN(typedValue) || typedValue < 1) {
98
+ return 'maxTokens must be a positive integer';
99
+ }
100
+ }
101
+ else if (key === 'temperature') {
102
+ typedValue = parseFloat(value);
103
+ if (isNaN(typedValue) || typedValue < 0 || typedValue > 2) {
104
+ return 'temperature must be a number between 0 and 2';
105
+ }
106
+ }
107
+ else if (key === 'theme') {
108
+ if (value !== 'dark' && value !== 'light') {
109
+ return 'theme must be "dark" or "light"';
110
+ }
111
+ }
112
+ saveSettings({ [key]: typedValue });
113
+ return `Configuration updated: ${key} = ${typedValue}`;
114
+ },
115
+ };
116
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from './index.js';
2
+ export declare const helpCommand: Command;
3
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,MAAM,YAAY,CAAC;AAErD,eAAO,MAAM,WAAW,EAAE,OA0CzB,CAAC"}
@@ -0,0 +1,42 @@
1
+ export const helpCommand = {
2
+ name: 'help',
3
+ description: 'Show available commands',
4
+ aliases: ['h', '?'],
5
+ async execute(context) {
6
+ const help = `
7
+ ╔═══════════════════════════════════════════════════════════╗
8
+ ║ AI Router CLI Help ║
9
+ ╚═══════════════════════════════════════════════════════════╝
10
+
11
+ Available Commands:
12
+ /help, /h, /? - Show this help message
13
+ /clear, /c - Clear conversation history
14
+ /config - Show/edit configuration
15
+ /model [name] - Show or change current model
16
+ /status - Show connection status
17
+ /history - Show command history
18
+ /export [file] - Export conversation to file
19
+ /copy - Copy last response to clipboard
20
+ /vim - Toggle vim mode (not implemented)
21
+ /quit, /exit, /q - Exit the CLI
22
+
23
+ Keyboard Shortcuts:
24
+ Ctrl+C - Abort current request / Exit
25
+ Ctrl+L - Clear screen
26
+ Ctrl+D - Exit (when input is empty)
27
+ Ctrl+U - Clear current line
28
+ Shift+Tab - Toggle auto-accept mode
29
+ Up/Down Arrow - Navigate command history
30
+
31
+ Tool Permissions:
32
+ y - Approve tool execution
33
+ n - Reject tool execution
34
+ a - Approve all pending tools
35
+
36
+ For more information, visit: https://github.com/locdotech/ai-router-cli
37
+ `.trim();
38
+ console.log(help);
39
+ return help;
40
+ },
41
+ };
42
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,yBAAyB;IACtC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;IAEnB,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BhB,CAAC,IAAI,EAAE,CAAC;QAEL,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from './index.js';
2
+ export declare const historyCommand: Command;
3
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,MAAM,YAAY,CAAC;AAYrD,eAAO,MAAM,cAAc,EAAE,OAgE5B,CAAC"}
@@ -0,0 +1,62 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ const HISTORY_FILE = path.join(os.homedir(), '.ai-router', 'history.json');
5
+ export const historyCommand = {
6
+ name: 'history',
7
+ description: 'Show command history',
8
+ aliases: ['hist'],
9
+ async execute(context) {
10
+ const args = context.args?.trim();
11
+ // Check for clear subcommand
12
+ if (args === 'clear') {
13
+ try {
14
+ if (fs.existsSync(HISTORY_FILE)) {
15
+ fs.unlinkSync(HISTORY_FILE);
16
+ }
17
+ return 'History cleared.';
18
+ }
19
+ catch (error) {
20
+ return `Failed to clear history: ${error instanceof Error ? error.message : String(error)}`;
21
+ }
22
+ }
23
+ // Load and display history
24
+ try {
25
+ if (!fs.existsSync(HISTORY_FILE)) {
26
+ return 'No history found.';
27
+ }
28
+ const data = fs.readFileSync(HISTORY_FILE, 'utf-8');
29
+ const entries = JSON.parse(data);
30
+ if (entries.length === 0) {
31
+ return 'No history found.';
32
+ }
33
+ // Parse limit from args
34
+ const limit = args ? parseInt(args, 10) : 20;
35
+ const displayEntries = entries.slice(-limit);
36
+ const output = displayEntries
37
+ .map((entry, index) => {
38
+ const num = entries.length - displayEntries.length + index + 1;
39
+ const time = new Date(entry.timestamp).toLocaleString();
40
+ const content = entry.content.length > 60
41
+ ? entry.content.slice(0, 60) + '...'
42
+ : entry.content;
43
+ return ` ${String(num).padStart(4)} │ ${time} │ ${content}`;
44
+ })
45
+ .join('\n');
46
+ console.log(`
47
+ Command History (last ${displayEntries.length} of ${entries.length}):
48
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
49
+ ${output}
50
+
51
+ Usage:
52
+ /history [n] - Show last n entries (default: 20)
53
+ /history clear - Clear all history
54
+ `.trim());
55
+ return output;
56
+ }
57
+ catch (error) {
58
+ return `Failed to load history: ${error instanceof Error ? error.message : String(error)}`;
59
+ }
60
+ },
61
+ };
62
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { Settings } from '../config/index.js';
2
+ export interface CommandContext {
3
+ args?: string;
4
+ clearMessages?: () => void;
5
+ setAutoAccept?: (value: boolean) => void;
6
+ settings?: Settings;
7
+ exit?: () => void;
8
+ }
9
+ export interface Command {
10
+ name: string;
11
+ description: string;
12
+ aliases?: string[];
13
+ execute: (context: CommandContext) => Promise<string>;
14
+ }
15
+ declare class CommandRegistry {
16
+ private commands;
17
+ register(command: Command): void;
18
+ get(name: string): Command | undefined;
19
+ getAll(): Command[];
20
+ has(name: string): boolean;
21
+ }
22
+ export declare const commandRegistry: CommandRegistry;
23
+ export * from './help.js';
24
+ export * from './clear.js';
25
+ export * from './config.js';
26
+ export * from './model.js';
27
+ export * from './status.js';
28
+ export * from './history.js';
29
+ export * from './quit.js';
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAS9C,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACvD;AAED,cAAM,eAAe;IACnB,OAAO,CAAC,QAAQ,CAA8B;IAE9C,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAWhC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAItC,MAAM,IAAI,OAAO,EAAE;IAenB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAG3B;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC;AAWrD,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { helpCommand } from './help.js';
2
+ import { clearCommand } from './clear.js';
3
+ import { configCommand } from './config.js';
4
+ import { modelCommand } from './model.js';
5
+ import { statusCommand } from './status.js';
6
+ import { historyCommand } from './history.js';
7
+ import { quitCommand } from './quit.js';
8
+ class CommandRegistry {
9
+ commands = new Map();
10
+ register(command) {
11
+ this.commands.set(command.name.toLowerCase(), command);
12
+ // Register aliases
13
+ if (command.aliases) {
14
+ for (const alias of command.aliases) {
15
+ this.commands.set(alias.toLowerCase(), command);
16
+ }
17
+ }
18
+ }
19
+ get(name) {
20
+ return this.commands.get(name.toLowerCase());
21
+ }
22
+ getAll() {
23
+ // Return unique commands (no duplicates from aliases)
24
+ const seen = new Set();
25
+ const commands = [];
26
+ for (const command of this.commands.values()) {
27
+ if (!seen.has(command.name)) {
28
+ seen.add(command.name);
29
+ commands.push(command);
30
+ }
31
+ }
32
+ return commands;
33
+ }
34
+ has(name) {
35
+ return this.commands.has(name.toLowerCase());
36
+ }
37
+ }
38
+ export const commandRegistry = new CommandRegistry();
39
+ // Register built-in commands
40
+ commandRegistry.register(helpCommand);
41
+ commandRegistry.register(clearCommand);
42
+ commandRegistry.register(configCommand);
43
+ commandRegistry.register(modelCommand);
44
+ commandRegistry.register(statusCommand);
45
+ commandRegistry.register(historyCommand);
46
+ commandRegistry.register(quitCommand);
47
+ export * from './help.js';
48
+ export * from './clear.js';
49
+ export * from './config.js';
50
+ export * from './model.js';
51
+ export * from './status.js';
52
+ export * from './history.js';
53
+ export * from './quit.js';
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAiBxC,MAAM,eAAe;IACX,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE9C,QAAQ,CAAC,OAAgB;QACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;QAEvD,mBAAmB;QACnB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM;QACJ,sDAAsD;QACtD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,QAAQ,GAAc,EAAE,CAAC;QAE/B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/C,CAAC;CACF;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;AAErD,6BAA6B;AAC7B,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACtC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AACvC,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AACxC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AACvC,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AACxC,eAAe,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AACzC,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAEtC,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from './index.js';
2
+ export declare const modelCommand: Command;
3
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,MAAM,YAAY,CAAC;AAarD,eAAO,MAAM,YAAY,EAAE,OAsD1B,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { loadSettings, saveSettings } from '../config/index.js';
2
+ const AVAILABLE_MODELS = [
3
+ { id: 'songluan', name: 'Song Luan', description: 'MCP Agent (default)' },
4
+ { id: 'gpt-4', name: 'GPT-4', description: 'OpenAI GPT-4' },
5
+ { id: 'gpt-4-turbo', name: 'GPT-4 Turbo', description: 'OpenAI GPT-4 Turbo' },
6
+ { id: 'gpt-3.5-turbo', name: 'GPT-3.5 Turbo', description: 'OpenAI GPT-3.5' },
7
+ { id: 'claude-3-opus', name: 'Claude 3 Opus', description: 'Anthropic Claude 3 Opus' },
8
+ { id: 'claude-3-sonnet', name: 'Claude 3 Sonnet', description: 'Anthropic Claude 3 Sonnet' },
9
+ { id: 'claude-3-haiku', name: 'Claude 3 Haiku', description: 'Anthropic Claude 3 Haiku' },
10
+ ];
11
+ export const modelCommand = {
12
+ name: 'model',
13
+ description: 'Show or change current model',
14
+ aliases: ['m'],
15
+ async execute(context) {
16
+ const args = context.args?.trim();
17
+ const settings = loadSettings();
18
+ // No args - show current model and available models
19
+ if (!args) {
20
+ const modelList = AVAILABLE_MODELS.map((m, index) => {
21
+ const isCurrent = m.id === settings.model;
22
+ const marker = isCurrent ? '→' : ' ';
23
+ return ` ${marker} [${index + 1}] ${m.id.padEnd(18)} - ${m.description}`;
24
+ }).join('\n');
25
+ const output = `
26
+ Current Model: ${settings.model}
27
+
28
+ Available Models:
29
+ ${modelList}
30
+
31
+ Usage: /model <number> or /model <model-id>
32
+ Example: /model 1 or /model gpt-4
33
+ `.trim();
34
+ console.log(output);
35
+ return output;
36
+ }
37
+ // Set new model
38
+ let newModel = args.trim();
39
+ // Check if input is a number (select by index)
40
+ const num = parseInt(newModel, 10);
41
+ if (!isNaN(num) && num >= 1 && num <= AVAILABLE_MODELS.length) {
42
+ newModel = AVAILABLE_MODELS[num - 1].id;
43
+ }
44
+ else {
45
+ newModel = newModel.toLowerCase();
46
+ }
47
+ // Check if model exists (or allow custom)
48
+ const knownModel = AVAILABLE_MODELS.find((m) => m.id === newModel);
49
+ saveSettings({ model: newModel });
50
+ const output = knownModel
51
+ ? `✓ Model changed to: ${knownModel.name} (${knownModel.id})`
52
+ : `✓ Model changed to: ${newModel} (custom model)`;
53
+ console.log(output);
54
+ return output;
55
+ },
56
+ };
57
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from './index.js';
2
+ export declare const quitCommand: Command;
3
+ //# sourceMappingURL=quit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quit.d.ts","sourceRoot":"","sources":["../../src/commands/quit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,MAAM,YAAY,CAAC;AAErD,eAAO,MAAM,WAAW,EAAE,OAczB,CAAC"}
@@ -0,0 +1,16 @@
1
+ export const quitCommand = {
2
+ name: 'quit',
3
+ description: 'Exit the CLI',
4
+ aliases: ['exit', 'q'],
5
+ async execute(context) {
6
+ console.log('Goodbye!');
7
+ if (context.exit) {
8
+ context.exit();
9
+ }
10
+ else {
11
+ process.exit(0);
12
+ }
13
+ return '';
14
+ },
15
+ };
16
+ //# sourceMappingURL=quit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quit.js","sourceRoot":"","sources":["../../src/commands/quit.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,cAAc;IAC3B,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC;IAEtB,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from './index.js';
2
+ export declare const statusCommand: Command;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,MAAM,YAAY,CAAC;AAIrD,eAAO,MAAM,aAAa,EAAE,OAuC3B,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { loadSettings } from '../config/index.js';
2
+ import { client } from '../api/client.js';
3
+ export const statusCommand = {
4
+ name: 'status',
5
+ description: 'Show connection and system status',
6
+ aliases: ['s'],
7
+ async execute(context) {
8
+ const settings = loadSettings();
9
+ console.log('Checking connection...');
10
+ let connectionStatus = 'Unknown';
11
+ try {
12
+ const isConnected = await client.testConnection();
13
+ connectionStatus = isConnected ? '✓ Connected' : '✕ Disconnected';
14
+ }
15
+ catch (error) {
16
+ connectionStatus = `✕ Error: ${error instanceof Error ? error.message : String(error)}`;
17
+ }
18
+ const output = `
19
+ System Status
20
+ ━━━━━━━━━━━━━
21
+ API Server: ${settings.apiUrl}
22
+ Connection: ${connectionStatus}
23
+ Model: ${settings.model}
24
+ Auto Accept: ${settings.autoAccept ? 'Enabled' : 'Disabled'}
25
+
26
+ Environment:
27
+ Node.js: ${process.version}
28
+ Platform: ${process.platform}
29
+ Working Dir: ${process.cwd()}
30
+
31
+ Memory Usage:
32
+ Heap Used: ${Math.round(process.memoryUsage().heapUsed / 1024 / 1024)} MB
33
+ Heap Total: ${Math.round(process.memoryUsage().heapTotal / 1024 / 1024)} MB
34
+ `.trim();
35
+ console.log(output);
36
+ return output;
37
+ },
38
+ };
39
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,MAAM,CAAC,MAAM,aAAa,GAAY;IACpC,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,mCAAmC;IAChD,OAAO,EAAE,CAAC,GAAG,CAAC;IAEd,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAEhC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAEtC,IAAI,gBAAgB,GAAG,SAAS,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;YAClD,gBAAgB,GAAG,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gBAAgB,GAAG,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1F,CAAC;QAED,MAAM,MAAM,GAAG;;;mBAGA,QAAQ,CAAC,MAAM;mBACf,gBAAgB;mBAChB,QAAQ,CAAC,KAAK;mBACd,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;;;mBAG5C,OAAO,CAAC,OAAO;mBACf,OAAO,CAAC,QAAQ;mBAChB,OAAO,CAAC,GAAG,EAAE;;;mBAGb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;mBACxD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;CAC3E,CAAC,IAAI,EAAE,CAAC;QAEL,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './settings.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './settings.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface Settings {
2
+ apiKey: string;
3
+ apiUrl: string;
4
+ wsUrl: string;
5
+ model: string;
6
+ autoAccept: boolean;
7
+ theme: 'dark' | 'light';
8
+ maxTokens: number;
9
+ temperature: number;
10
+ }
11
+ export declare function ensureConfigDir(): void;
12
+ export declare function loadSettings(): Settings;
13
+ export declare function saveSettings(settings: Partial<Settings>): Settings;
14
+ export declare function getApiKey(): string;
15
+ export declare function setApiKey(key: string): void;
16
+ export declare function resetSettings(): void;
17
+ export declare function getConfigPath(): string;
18
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/config/settings.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAgBD,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED,wBAAgB,YAAY,IAAI,QAAQ,CAavC;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CASlE;AAED,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAIpC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -0,0 +1,56 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ const DEFAULT_SETTINGS = {
5
+ apiKey: '',
6
+ apiUrl: 'http://103.1.236.240:4001',
7
+ wsUrl: 'ws://103.1.236.240:4002',
8
+ model: 'songluan',
9
+ autoAccept: false,
10
+ theme: 'dark',
11
+ maxTokens: 8192,
12
+ temperature: 0.7,
13
+ };
14
+ const CONFIG_DIR = path.join(os.homedir(), '.ai-router');
15
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
16
+ export function ensureConfigDir() {
17
+ if (!fs.existsSync(CONFIG_DIR)) {
18
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
19
+ }
20
+ }
21
+ export function loadSettings() {
22
+ ensureConfigDir();
23
+ if (fs.existsSync(CONFIG_FILE)) {
24
+ try {
25
+ const data = fs.readFileSync(CONFIG_FILE, 'utf-8');
26
+ return { ...DEFAULT_SETTINGS, ...JSON.parse(data) };
27
+ }
28
+ catch {
29
+ return DEFAULT_SETTINGS;
30
+ }
31
+ }
32
+ return DEFAULT_SETTINGS;
33
+ }
34
+ export function saveSettings(settings) {
35
+ ensureConfigDir();
36
+ const current = loadSettings();
37
+ const updated = { ...current, ...settings };
38
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(updated, null, 2));
39
+ return updated;
40
+ }
41
+ export function getApiKey() {
42
+ const settings = loadSettings();
43
+ return settings.apiKey || process.env.AI_ROUTER_API_KEY || '';
44
+ }
45
+ export function setApiKey(key) {
46
+ saveSettings({ apiKey: key });
47
+ }
48
+ export function resetSettings() {
49
+ if (fs.existsSync(CONFIG_FILE)) {
50
+ fs.unlinkSync(CONFIG_FILE);
51
+ }
52
+ }
53
+ export function getConfigPath() {
54
+ return CONFIG_FILE;
55
+ }
56
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/config/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAazB,MAAM,gBAAgB,GAAa;IACjC,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,2BAA2B;IACnC,KAAK,EAAE,yBAAyB;IAChC,KAAK,EAAE,UAAU;IACjB,UAAU,EAAE,KAAK;IACjB,KAAK,EAAE,MAAM;IACb,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,GAAG;CACjB,CAAC;AAEF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACzD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,eAAe,EAAE,CAAC;IAElB,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,EAAE,GAAG,gBAAgB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,gBAAgB,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAA2B;IACtD,eAAe,EAAE,CAAC;IAElB,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;IAE5C,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEhE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,OAAO,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}