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.
- package/README.md +104 -0
- package/bin/ai.js +16 -0
- package/dist/api/client.d.ts +75 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +86 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/index.d.ts +4 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +4 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/streaming.d.ts +15 -0
- package/dist/api/streaming.d.ts.map +1 -0
- package/dist/api/streaming.js +87 -0
- package/dist/api/streaming.js.map +1 -0
- package/dist/api/websocket.d.ts +20 -0
- package/dist/api/websocket.d.ts.map +1 -0
- package/dist/api/websocket.js +80 -0
- package/dist/api/websocket.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +72 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/clear.d.ts +3 -0
- package/dist/commands/clear.d.ts.map +1 -0
- package/dist/commands/clear.js +13 -0
- package/dist/commands/clear.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +116 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/help.d.ts +3 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +42 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/history.d.ts +3 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +62 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/index.d.ts +30 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +54 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/model.d.ts +3 -0
- package/dist/commands/model.d.ts.map +1 -0
- package/dist/commands/model.js +57 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/quit.d.ts +3 -0
- package/dist/commands/quit.d.ts.map +1 -0
- package/dist/commands/quit.js +16 -0
- package/dist/commands/quit.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +39 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/settings.d.ts +18 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +56 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +100 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/bash.d.ts +41 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +100 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/file.d.ts +107 -0
- package/dist/tools/file.d.ts.map +1 -0
- package/dist/tools/file.js +189 -0
- package/dist/tools/file.js.map +1 -0
- package/dist/tools/glob.d.ts +38 -0
- package/dist/tools/glob.d.ts.map +1 -0
- package/dist/tools/glob.js +84 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +76 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +166 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +29 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +130 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/mcp.d.ts +59 -0
- package/dist/tools/mcp.d.ts.map +1 -0
- package/dist/tools/mcp.js +155 -0
- package/dist/tools/mcp.js.map +1 -0
- package/dist/ui/App.d.ts +6 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +161 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/components/CodeBlock.d.ts +9 -0
- package/dist/ui/components/CodeBlock.d.ts.map +1 -0
- package/dist/ui/components/CodeBlock.js +83 -0
- package/dist/ui/components/CodeBlock.js.map +1 -0
- package/dist/ui/components/Input.d.ts +11 -0
- package/dist/ui/components/Input.d.ts.map +1 -0
- package/dist/ui/components/Input.js +93 -0
- package/dist/ui/components/Input.js.map +1 -0
- package/dist/ui/components/Message.d.ts +7 -0
- package/dist/ui/components/Message.d.ts.map +1 -0
- package/dist/ui/components/Message.js +86 -0
- package/dist/ui/components/Message.js.map +1 -0
- package/dist/ui/components/ModelSelector.d.ts +7 -0
- package/dist/ui/components/ModelSelector.d.ts.map +1 -0
- package/dist/ui/components/ModelSelector.js +23 -0
- package/dist/ui/components/ModelSelector.js.map +1 -0
- package/dist/ui/components/Permission.d.ts +9 -0
- package/dist/ui/components/Permission.d.ts.map +1 -0
- package/dist/ui/components/Permission.js +41 -0
- package/dist/ui/components/Permission.js.map +1 -0
- package/dist/ui/components/StatusBar.d.ts +11 -0
- package/dist/ui/components/StatusBar.d.ts.map +1 -0
- package/dist/ui/components/StatusBar.js +9 -0
- package/dist/ui/components/StatusBar.js.map +1 -0
- package/dist/ui/components/TaskList.d.ts +12 -0
- package/dist/ui/components/TaskList.d.ts.map +1 -0
- package/dist/ui/components/TaskList.js +21 -0
- package/dist/ui/components/TaskList.js.map +1 -0
- package/dist/ui/components/ToolCall.d.ts +16 -0
- package/dist/ui/components/ToolCall.d.ts.map +1 -0
- package/dist/ui/components/ToolCall.js +50 -0
- package/dist/ui/components/ToolCall.js.map +1 -0
- package/dist/ui/components/index.d.ts +8 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/index.js +8 -0
- package/dist/ui/components/index.js.map +1 -0
- package/dist/ui/hooks/index.d.ts +4 -0
- package/dist/ui/hooks/index.d.ts.map +1 -0
- package/dist/ui/hooks/index.js +4 -0
- package/dist/ui/hooks/index.js.map +1 -0
- package/dist/ui/hooks/useChat.d.ts +42 -0
- package/dist/ui/hooks/useChat.d.ts.map +1 -0
- package/dist/ui/hooks/useChat.js +305 -0
- package/dist/ui/hooks/useChat.js.map +1 -0
- package/dist/ui/hooks/useHistory.d.ts +14 -0
- package/dist/ui/hooks/useHistory.d.ts.map +1 -0
- package/dist/ui/hooks/useHistory.js +123 -0
- package/dist/ui/hooks/useHistory.js.map +1 -0
- package/dist/ui/hooks/useTools.d.ts +19 -0
- package/dist/ui/hooks/useTools.d.ts.map +1 -0
- package/dist/ui/hooks/useTools.js +54 -0
- package/dist/ui/hooks/useTools.js.map +1 -0
- package/dist/ui/themes/index.d.ts +21 -0
- package/dist/ui/themes/index.d.ts.map +1 -0
- package/dist/ui/themes/index.js +40 -0
- package/dist/ui/themes/index.js.map +1 -0
- package/dist/utils/auth.d.ts +5 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +42 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/format.d.ts +11 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +71 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +18 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +61 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +64 -0
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
|
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|