grok-cli-hurry-mode 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/.grok/settings.json +3 -0
- package/LICENSE +21 -0
- package/README.md +452 -0
- package/dist/agent/grok-agent.d.ts +54 -0
- package/dist/agent/grok-agent.js +674 -0
- package/dist/agent/grok-agent.js.map +1 -0
- package/dist/agent/index.d.ts +14 -0
- package/dist/agent/index.js +137 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/commands/mcp.d.ts +2 -0
- package/dist/commands/mcp.js +245 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/grok/client.d.ts +49 -0
- package/dist/grok/client.js +85 -0
- package/dist/grok/client.js.map +1 -0
- package/dist/grok/tools.d.ts +8 -0
- package/dist/grok/tools.js +357 -0
- package/dist/grok/tools.js.map +1 -0
- package/dist/hooks/use-enhanced-input.d.ts +37 -0
- package/dist/hooks/use-enhanced-input.js +217 -0
- package/dist/hooks/use-enhanced-input.js.map +1 -0
- package/dist/hooks/use-input-handler.d.ts +34 -0
- package/dist/hooks/use-input-handler.js +611 -0
- package/dist/hooks/use-input-handler.js.map +1 -0
- package/dist/hooks/use-input-history.d.ts +9 -0
- package/dist/hooks/use-input-history.js +64 -0
- package/dist/hooks/use-input-history.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +151949 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/client.d.ts +29 -0
- package/dist/mcp/client.js +167 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/config.d.ts +13 -0
- package/dist/mcp/config.js +51 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/transports.d.ts +51 -0
- package/dist/mcp/transports.js +229 -0
- package/dist/mcp/transports.js.map +1 -0
- package/dist/node_modules/react/index.js +1841 -0
- package/dist/tools/bash.d.ts +10 -0
- package/dist/tools/bash.js +81 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/confirmation-tool.d.ts +16 -0
- package/dist/tools/confirmation-tool.js +75 -0
- package/dist/tools/confirmation-tool.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.js +16 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/morph-editor.d.ts +36 -0
- package/dist/tools/morph-editor.js +347 -0
- package/dist/tools/morph-editor.js.map +1 -0
- package/dist/tools/search.d.ts +69 -0
- package/dist/tools/search.js +341 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/text-editor.d.ts +16 -0
- package/dist/tools/text-editor.js +565 -0
- package/dist/tools/text-editor.js.map +1 -0
- package/dist/tools/todo-tool.d.ts +20 -0
- package/dist/tools/todo-tool.js +135 -0
- package/dist/tools/todo-tool.js.map +1 -0
- package/dist/types/index.d.ts +30 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/app.d.ts +7 -0
- package/dist/ui/app.js +160 -0
- package/dist/ui/app.js.map +1 -0
- package/dist/ui/components/api-key-input.d.ts +7 -0
- package/dist/ui/components/api-key-input.js +124 -0
- package/dist/ui/components/api-key-input.js.map +1 -0
- package/dist/ui/components/chat-history.d.ts +8 -0
- package/dist/ui/components/chat-history.js +177 -0
- package/dist/ui/components/chat-history.js.map +1 -0
- package/dist/ui/components/chat-input.d.ts +9 -0
- package/dist/ui/components/chat-input.js +87 -0
- package/dist/ui/components/chat-input.js.map +1 -0
- package/dist/ui/components/chat-interface.d.ts +8 -0
- package/dist/ui/components/chat-interface.js +344 -0
- package/dist/ui/components/chat-interface.js.map +1 -0
- package/dist/ui/components/command-suggestions.d.ts +17 -0
- package/dist/ui/components/command-suggestions.js +68 -0
- package/dist/ui/components/command-suggestions.js.map +1 -0
- package/dist/ui/components/confirmation-dialog.d.ts +11 -0
- package/dist/ui/components/confirmation-dialog.js +167 -0
- package/dist/ui/components/confirmation-dialog.js.map +1 -0
- package/dist/ui/components/diff-renderer.d.ts +13 -0
- package/dist/ui/components/diff-renderer.js +217 -0
- package/dist/ui/components/diff-renderer.js.map +1 -0
- package/dist/ui/components/loading-spinner.d.ts +8 -0
- package/dist/ui/components/loading-spinner.js +92 -0
- package/dist/ui/components/loading-spinner.js.map +1 -0
- package/dist/ui/components/mcp-status.d.ts +5 -0
- package/dist/ui/components/mcp-status.js +74 -0
- package/dist/ui/components/mcp-status.js.map +1 -0
- package/dist/ui/components/model-selection.d.ts +12 -0
- package/dist/ui/components/model-selection.js +28 -0
- package/dist/ui/components/model-selection.js.map +1 -0
- package/dist/ui/shared/max-sized-box.d.ts +8 -0
- package/dist/ui/shared/max-sized-box.js +15 -0
- package/dist/ui/shared/max-sized-box.js.map +1 -0
- package/dist/ui/utils/code-colorizer.d.ts +2 -0
- package/dist/ui/utils/code-colorizer.js +18 -0
- package/dist/ui/utils/code-colorizer.js.map +1 -0
- package/dist/ui/utils/colors.d.ts +14 -0
- package/dist/ui/utils/colors.js +18 -0
- package/dist/ui/utils/colors.js.map +1 -0
- package/dist/ui/utils/markdown-renderer.d.ts +4 -0
- package/dist/ui/utils/markdown-renderer.js +29 -0
- package/dist/ui/utils/markdown-renderer.js.map +1 -0
- package/dist/utils/confirmation-service.d.ts +33 -0
- package/dist/utils/confirmation-service.js +113 -0
- package/dist/utils/confirmation-service.js.map +1 -0
- package/dist/utils/custom-instructions.d.ts +1 -0
- package/dist/utils/custom-instructions.js +53 -0
- package/dist/utils/custom-instructions.js.map +1 -0
- package/dist/utils/model-config.d.ts +28 -0
- package/dist/utils/model-config.js +49 -0
- package/dist/utils/model-config.js.map +1 -0
- package/dist/utils/settings-manager.d.ts +94 -0
- package/dist/utils/settings-manager.js +275 -0
- package/dist/utils/settings-manager.js.map +1 -0
- package/dist/utils/settings.d.ts +1 -0
- package/dist/utils/settings.js +8 -0
- package/dist/utils/settings.js.map +1 -0
- package/dist/utils/text-utils.d.ts +80 -0
- package/dist/utils/text-utils.js +197 -0
- package/dist/utils/text-utils.js.map +1 -0
- package/dist/utils/token-counter.d.ts +33 -0
- package/dist/utils/token-counter.js +83 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/dist/yoga.wasm +0 -0
- package/eslint.config.mjs +28 -0
- package/fix.awk +41 -0
- package/grok-logo-screenshot.png +0 -0
- package/package.json +68 -0
- package/sed_cmd.sh +35 -0
- package/temp.txt +29 -0
@@ -0,0 +1,94 @@
|
|
1
|
+
/**
|
2
|
+
* User-level settings stored in ~/.grok/user-settings.json
|
3
|
+
* These are global settings that apply across all projects
|
4
|
+
*/
|
5
|
+
export interface UserSettings {
|
6
|
+
apiKey?: string;
|
7
|
+
baseURL?: string;
|
8
|
+
defaultModel?: string;
|
9
|
+
models?: string[];
|
10
|
+
}
|
11
|
+
/**
|
12
|
+
* Project-level settings stored in .grok/settings.json
|
13
|
+
* These are project-specific settings
|
14
|
+
*/
|
15
|
+
export interface ProjectSettings {
|
16
|
+
model?: string;
|
17
|
+
mcpServers?: Record<string, any>;
|
18
|
+
}
|
19
|
+
/**
|
20
|
+
* Unified settings manager that handles both user-level and project-level settings
|
21
|
+
*/
|
22
|
+
export declare class SettingsManager {
|
23
|
+
private static instance;
|
24
|
+
private userSettingsPath;
|
25
|
+
private projectSettingsPath;
|
26
|
+
private constructor();
|
27
|
+
/**
|
28
|
+
* Get singleton instance
|
29
|
+
*/
|
30
|
+
static getInstance(): SettingsManager;
|
31
|
+
/**
|
32
|
+
* Ensure directory exists for a given file path
|
33
|
+
*/
|
34
|
+
private ensureDirectoryExists;
|
35
|
+
/**
|
36
|
+
* Load user settings from ~/.grok/user-settings.json
|
37
|
+
*/
|
38
|
+
loadUserSettings(): UserSettings;
|
39
|
+
/**
|
40
|
+
* Save user settings to ~/.grok/user-settings.json
|
41
|
+
*/
|
42
|
+
saveUserSettings(settings: Partial<UserSettings>): void;
|
43
|
+
/**
|
44
|
+
* Update a specific user setting
|
45
|
+
*/
|
46
|
+
updateUserSetting<K extends keyof UserSettings>(key: K, value: UserSettings[K]): void;
|
47
|
+
/**
|
48
|
+
* Get a specific user setting
|
49
|
+
*/
|
50
|
+
getUserSetting<K extends keyof UserSettings>(key: K): UserSettings[K];
|
51
|
+
/**
|
52
|
+
* Load project settings from .grok/settings.json
|
53
|
+
*/
|
54
|
+
loadProjectSettings(): ProjectSettings;
|
55
|
+
/**
|
56
|
+
* Save project settings to .grok/settings.json
|
57
|
+
*/
|
58
|
+
saveProjectSettings(settings: Partial<ProjectSettings>): void;
|
59
|
+
/**
|
60
|
+
* Update a specific project setting
|
61
|
+
*/
|
62
|
+
updateProjectSetting<K extends keyof ProjectSettings>(key: K, value: ProjectSettings[K]): void;
|
63
|
+
/**
|
64
|
+
* Get a specific project setting
|
65
|
+
*/
|
66
|
+
getProjectSetting<K extends keyof ProjectSettings>(key: K): ProjectSettings[K];
|
67
|
+
/**
|
68
|
+
* Get the current model with proper fallback logic:
|
69
|
+
* 1. Project-specific model setting
|
70
|
+
* 2. User's default model
|
71
|
+
* 3. System default
|
72
|
+
*/
|
73
|
+
getCurrentModel(): string;
|
74
|
+
/**
|
75
|
+
* Set the current model for the project
|
76
|
+
*/
|
77
|
+
setCurrentModel(model: string): void;
|
78
|
+
/**
|
79
|
+
* Get available models list from user settings
|
80
|
+
*/
|
81
|
+
getAvailableModels(): string[];
|
82
|
+
/**
|
83
|
+
* Get API key from user settings or environment
|
84
|
+
*/
|
85
|
+
getApiKey(): string | undefined;
|
86
|
+
/**
|
87
|
+
* Get base URL from user settings or environment
|
88
|
+
*/
|
89
|
+
getBaseURL(): string;
|
90
|
+
}
|
91
|
+
/**
|
92
|
+
* Convenience function to get the singleton instance
|
93
|
+
*/
|
94
|
+
export declare function getSettingsManager(): SettingsManager;
|
@@ -0,0 +1,275 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
19
|
+
var ownKeys = function(o) {
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
21
|
+
var ar = [];
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
23
|
+
return ar;
|
24
|
+
};
|
25
|
+
return ownKeys(o);
|
26
|
+
};
|
27
|
+
return function (mod) {
|
28
|
+
if (mod && mod.__esModule) return mod;
|
29
|
+
var result = {};
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
31
|
+
__setModuleDefault(result, mod);
|
32
|
+
return result;
|
33
|
+
};
|
34
|
+
})();
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
36
|
+
exports.SettingsManager = void 0;
|
37
|
+
exports.getSettingsManager = getSettingsManager;
|
38
|
+
const fs = __importStar(require("fs"));
|
39
|
+
const path = __importStar(require("path"));
|
40
|
+
const os = __importStar(require("os"));
|
41
|
+
/**
|
42
|
+
* Default values for user settings
|
43
|
+
*/
|
44
|
+
const DEFAULT_USER_SETTINGS = {
|
45
|
+
baseURL: "https://api.x.ai/v1",
|
46
|
+
defaultModel: "grok-code-fast-1",
|
47
|
+
models: [
|
48
|
+
"grok-code-fast-1",
|
49
|
+
"grok-4-latest",
|
50
|
+
"grok-3-latest",
|
51
|
+
"grok-3-fast",
|
52
|
+
"grok-3-mini-fast",
|
53
|
+
],
|
54
|
+
};
|
55
|
+
/**
|
56
|
+
* Default values for project settings
|
57
|
+
*/
|
58
|
+
const DEFAULT_PROJECT_SETTINGS = {
|
59
|
+
model: "grok-code-fast-1",
|
60
|
+
};
|
61
|
+
/**
|
62
|
+
* Unified settings manager that handles both user-level and project-level settings
|
63
|
+
*/
|
64
|
+
class SettingsManager {
|
65
|
+
constructor() {
|
66
|
+
// User settings path: ~/.grok/user-settings.json
|
67
|
+
this.userSettingsPath = path.join(os.homedir(), ".grok", "user-settings.json");
|
68
|
+
// Project settings path: .grok/settings.json (in current working directory)
|
69
|
+
this.projectSettingsPath = path.join(process.cwd(), ".grok", "settings.json");
|
70
|
+
}
|
71
|
+
/**
|
72
|
+
* Get singleton instance
|
73
|
+
*/
|
74
|
+
static getInstance() {
|
75
|
+
if (!SettingsManager.instance) {
|
76
|
+
SettingsManager.instance = new SettingsManager();
|
77
|
+
}
|
78
|
+
return SettingsManager.instance;
|
79
|
+
}
|
80
|
+
/**
|
81
|
+
* Ensure directory exists for a given file path
|
82
|
+
*/
|
83
|
+
ensureDirectoryExists(filePath) {
|
84
|
+
const dir = path.dirname(filePath);
|
85
|
+
if (!fs.existsSync(dir)) {
|
86
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
87
|
+
}
|
88
|
+
}
|
89
|
+
/**
|
90
|
+
* Load user settings from ~/.grok/user-settings.json
|
91
|
+
*/
|
92
|
+
loadUserSettings() {
|
93
|
+
try {
|
94
|
+
if (!fs.existsSync(this.userSettingsPath)) {
|
95
|
+
// Create default user settings if file doesn't exist
|
96
|
+
this.saveUserSettings(DEFAULT_USER_SETTINGS);
|
97
|
+
return { ...DEFAULT_USER_SETTINGS };
|
98
|
+
}
|
99
|
+
const content = fs.readFileSync(this.userSettingsPath, "utf-8");
|
100
|
+
const settings = JSON.parse(content);
|
101
|
+
// Merge with defaults to ensure all required fields exist
|
102
|
+
return { ...DEFAULT_USER_SETTINGS, ...settings };
|
103
|
+
}
|
104
|
+
catch (error) {
|
105
|
+
console.warn("Failed to load user settings:", error instanceof Error ? error.message : "Unknown error");
|
106
|
+
return { ...DEFAULT_USER_SETTINGS };
|
107
|
+
}
|
108
|
+
}
|
109
|
+
/**
|
110
|
+
* Save user settings to ~/.grok/user-settings.json
|
111
|
+
*/
|
112
|
+
saveUserSettings(settings) {
|
113
|
+
try {
|
114
|
+
this.ensureDirectoryExists(this.userSettingsPath);
|
115
|
+
// Read existing settings directly to avoid recursion
|
116
|
+
let existingSettings = { ...DEFAULT_USER_SETTINGS };
|
117
|
+
if (fs.existsSync(this.userSettingsPath)) {
|
118
|
+
try {
|
119
|
+
const content = fs.readFileSync(this.userSettingsPath, "utf-8");
|
120
|
+
const parsed = JSON.parse(content);
|
121
|
+
existingSettings = { ...DEFAULT_USER_SETTINGS, ...parsed };
|
122
|
+
}
|
123
|
+
catch (error) {
|
124
|
+
// If file is corrupted, use defaults
|
125
|
+
console.warn("Corrupted user settings file, using defaults");
|
126
|
+
}
|
127
|
+
}
|
128
|
+
const mergedSettings = { ...existingSettings, ...settings };
|
129
|
+
fs.writeFileSync(this.userSettingsPath, JSON.stringify(mergedSettings, null, 2), { mode: 0o600 } // Secure permissions for API key
|
130
|
+
);
|
131
|
+
}
|
132
|
+
catch (error) {
|
133
|
+
console.error("Failed to save user settings:", error instanceof Error ? error.message : "Unknown error");
|
134
|
+
throw error;
|
135
|
+
}
|
136
|
+
}
|
137
|
+
/**
|
138
|
+
* Update a specific user setting
|
139
|
+
*/
|
140
|
+
updateUserSetting(key, value) {
|
141
|
+
const settings = { [key]: value };
|
142
|
+
this.saveUserSettings(settings);
|
143
|
+
}
|
144
|
+
/**
|
145
|
+
* Get a specific user setting
|
146
|
+
*/
|
147
|
+
getUserSetting(key) {
|
148
|
+
const settings = this.loadUserSettings();
|
149
|
+
return settings[key];
|
150
|
+
}
|
151
|
+
/**
|
152
|
+
* Load project settings from .grok/settings.json
|
153
|
+
*/
|
154
|
+
loadProjectSettings() {
|
155
|
+
try {
|
156
|
+
if (!fs.existsSync(this.projectSettingsPath)) {
|
157
|
+
// Create default project settings if file doesn't exist
|
158
|
+
this.saveProjectSettings(DEFAULT_PROJECT_SETTINGS);
|
159
|
+
return { ...DEFAULT_PROJECT_SETTINGS };
|
160
|
+
}
|
161
|
+
const content = fs.readFileSync(this.projectSettingsPath, "utf-8");
|
162
|
+
const settings = JSON.parse(content);
|
163
|
+
// Merge with defaults
|
164
|
+
return { ...DEFAULT_PROJECT_SETTINGS, ...settings };
|
165
|
+
}
|
166
|
+
catch (error) {
|
167
|
+
console.warn("Failed to load project settings:", error instanceof Error ? error.message : "Unknown error");
|
168
|
+
return { ...DEFAULT_PROJECT_SETTINGS };
|
169
|
+
}
|
170
|
+
}
|
171
|
+
/**
|
172
|
+
* Save project settings to .grok/settings.json
|
173
|
+
*/
|
174
|
+
saveProjectSettings(settings) {
|
175
|
+
try {
|
176
|
+
this.ensureDirectoryExists(this.projectSettingsPath);
|
177
|
+
// Read existing settings directly to avoid recursion
|
178
|
+
let existingSettings = { ...DEFAULT_PROJECT_SETTINGS };
|
179
|
+
if (fs.existsSync(this.projectSettingsPath)) {
|
180
|
+
try {
|
181
|
+
const content = fs.readFileSync(this.projectSettingsPath, "utf-8");
|
182
|
+
const parsed = JSON.parse(content);
|
183
|
+
existingSettings = { ...DEFAULT_PROJECT_SETTINGS, ...parsed };
|
184
|
+
}
|
185
|
+
catch (error) {
|
186
|
+
// If file is corrupted, use defaults
|
187
|
+
console.warn("Corrupted project settings file, using defaults");
|
188
|
+
}
|
189
|
+
}
|
190
|
+
const mergedSettings = { ...existingSettings, ...settings };
|
191
|
+
fs.writeFileSync(this.projectSettingsPath, JSON.stringify(mergedSettings, null, 2));
|
192
|
+
}
|
193
|
+
catch (error) {
|
194
|
+
console.error("Failed to save project settings:", error instanceof Error ? error.message : "Unknown error");
|
195
|
+
throw error;
|
196
|
+
}
|
197
|
+
}
|
198
|
+
/**
|
199
|
+
* Update a specific project setting
|
200
|
+
*/
|
201
|
+
updateProjectSetting(key, value) {
|
202
|
+
const settings = { [key]: value };
|
203
|
+
this.saveProjectSettings(settings);
|
204
|
+
}
|
205
|
+
/**
|
206
|
+
* Get a specific project setting
|
207
|
+
*/
|
208
|
+
getProjectSetting(key) {
|
209
|
+
const settings = this.loadProjectSettings();
|
210
|
+
return settings[key];
|
211
|
+
}
|
212
|
+
/**
|
213
|
+
* Get the current model with proper fallback logic:
|
214
|
+
* 1. Project-specific model setting
|
215
|
+
* 2. User's default model
|
216
|
+
* 3. System default
|
217
|
+
*/
|
218
|
+
getCurrentModel() {
|
219
|
+
const projectModel = this.getProjectSetting("model");
|
220
|
+
if (projectModel) {
|
221
|
+
return projectModel;
|
222
|
+
}
|
223
|
+
const userDefaultModel = this.getUserSetting("defaultModel");
|
224
|
+
if (userDefaultModel) {
|
225
|
+
return userDefaultModel;
|
226
|
+
}
|
227
|
+
return DEFAULT_PROJECT_SETTINGS.model || "grok-code-fast-1";
|
228
|
+
}
|
229
|
+
/**
|
230
|
+
* Set the current model for the project
|
231
|
+
*/
|
232
|
+
setCurrentModel(model) {
|
233
|
+
this.updateProjectSetting("model", model);
|
234
|
+
}
|
235
|
+
/**
|
236
|
+
* Get available models list from user settings
|
237
|
+
*/
|
238
|
+
getAvailableModels() {
|
239
|
+
const models = this.getUserSetting("models");
|
240
|
+
return models || DEFAULT_USER_SETTINGS.models || [];
|
241
|
+
}
|
242
|
+
/**
|
243
|
+
* Get API key from user settings or environment
|
244
|
+
*/
|
245
|
+
getApiKey() {
|
246
|
+
// First check environment variable
|
247
|
+
const envApiKey = process.env.GROK_API_KEY;
|
248
|
+
if (envApiKey) {
|
249
|
+
return envApiKey;
|
250
|
+
}
|
251
|
+
// Then check user settings
|
252
|
+
return this.getUserSetting("apiKey");
|
253
|
+
}
|
254
|
+
/**
|
255
|
+
* Get base URL from user settings or environment
|
256
|
+
*/
|
257
|
+
getBaseURL() {
|
258
|
+
// First check environment variable
|
259
|
+
const envBaseURL = process.env.GROK_BASE_URL;
|
260
|
+
if (envBaseURL) {
|
261
|
+
return envBaseURL;
|
262
|
+
}
|
263
|
+
// Then check user settings
|
264
|
+
const userBaseURL = this.getUserSetting("baseURL");
|
265
|
+
return (userBaseURL || DEFAULT_USER_SETTINGS.baseURL || "https://api.x.ai/v1");
|
266
|
+
}
|
267
|
+
}
|
268
|
+
exports.SettingsManager = SettingsManager;
|
269
|
+
/**
|
270
|
+
* Convenience function to get the singleton instance
|
271
|
+
*/
|
272
|
+
function getSettingsManager() {
|
273
|
+
return SettingsManager.getInstance();
|
274
|
+
}
|
275
|
+
//# sourceMappingURL=settings-manager.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"settings-manager.js","sourceRoot":"","sources":["../../src/utils/settings-manager.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export { getSettingsManager, UserSettings, ProjectSettings } from './settings-manager.js';
|
@@ -0,0 +1,8 @@
|
|
1
|
+
"use strict";
|
2
|
+
// This file is kept for potential future convenience functions
|
3
|
+
// All settings management should use getSettingsManager() from './settings-manager.js'
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
5
|
+
exports.getSettingsManager = void 0;
|
6
|
+
var settings_manager_js_1 = require("./settings-manager.js");
|
7
|
+
Object.defineProperty(exports, "getSettingsManager", { enumerable: true, get: function () { return settings_manager_js_1.getSettingsManager; } });
|
8
|
+
//# sourceMappingURL=settings.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/utils/settings.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,uFAAuF;;;AAEvF,6DAA0F;AAAjF,yHAAA,kBAAkB,OAAA"}
|
@@ -0,0 +1,80 @@
|
|
1
|
+
/**
|
2
|
+
* Text manipulation utilities for terminal input handling
|
3
|
+
* Inspired by Gemini CLI's text processing capabilities
|
4
|
+
*/
|
5
|
+
export interface TextPosition {
|
6
|
+
index: number;
|
7
|
+
line: number;
|
8
|
+
column: number;
|
9
|
+
}
|
10
|
+
export interface TextSelection {
|
11
|
+
start: number;
|
12
|
+
end: number;
|
13
|
+
}
|
14
|
+
/**
|
15
|
+
* Check if a character is a word boundary
|
16
|
+
*/
|
17
|
+
export declare function isWordBoundary(char: string | undefined): boolean;
|
18
|
+
/**
|
19
|
+
* Find the start of the current word at the given position
|
20
|
+
*/
|
21
|
+
export declare function findWordStart(text: string, position: number): number;
|
22
|
+
/**
|
23
|
+
* Find the end of the current word at the given position
|
24
|
+
*/
|
25
|
+
export declare function findWordEnd(text: string, position: number): number;
|
26
|
+
/**
|
27
|
+
* Move cursor to the previous word boundary
|
28
|
+
*/
|
29
|
+
export declare function moveToPreviousWord(text: string, position: number): number;
|
30
|
+
/**
|
31
|
+
* Move cursor to the next word boundary
|
32
|
+
*/
|
33
|
+
export declare function moveToNextWord(text: string, position: number): number;
|
34
|
+
/**
|
35
|
+
* Delete the word before the cursor
|
36
|
+
*/
|
37
|
+
export declare function deleteWordBefore(text: string, position: number): {
|
38
|
+
text: string;
|
39
|
+
position: number;
|
40
|
+
};
|
41
|
+
/**
|
42
|
+
* Delete the word after the cursor
|
43
|
+
*/
|
44
|
+
export declare function deleteWordAfter(text: string, position: number): {
|
45
|
+
text: string;
|
46
|
+
position: number;
|
47
|
+
};
|
48
|
+
/**
|
49
|
+
* Get the current line and column from text position
|
50
|
+
*/
|
51
|
+
export declare function getTextPosition(text: string, index: number): TextPosition;
|
52
|
+
/**
|
53
|
+
* Move to the beginning of the current line
|
54
|
+
*/
|
55
|
+
export declare function moveToLineStart(text: string, position: number): number;
|
56
|
+
/**
|
57
|
+
* Move to the end of the current line
|
58
|
+
*/
|
59
|
+
export declare function moveToLineEnd(text: string, position: number): number;
|
60
|
+
/**
|
61
|
+
* Handle proper Unicode-aware character deletion
|
62
|
+
*/
|
63
|
+
export declare function deleteCharBefore(text: string, position: number): {
|
64
|
+
text: string;
|
65
|
+
position: number;
|
66
|
+
};
|
67
|
+
/**
|
68
|
+
* Handle proper Unicode-aware character deletion forward
|
69
|
+
*/
|
70
|
+
export declare function deleteCharAfter(text: string, position: number): {
|
71
|
+
text: string;
|
72
|
+
position: number;
|
73
|
+
};
|
74
|
+
/**
|
75
|
+
* Insert text at the given position with proper Unicode handling
|
76
|
+
*/
|
77
|
+
export declare function insertText(text: string, position: number, insert: string): {
|
78
|
+
text: string;
|
79
|
+
position: number;
|
80
|
+
};
|
@@ -0,0 +1,197 @@
|
|
1
|
+
"use strict";
|
2
|
+
/**
|
3
|
+
* Text manipulation utilities for terminal input handling
|
4
|
+
* Inspired by Gemini CLI's text processing capabilities
|
5
|
+
*/
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
7
|
+
exports.isWordBoundary = isWordBoundary;
|
8
|
+
exports.findWordStart = findWordStart;
|
9
|
+
exports.findWordEnd = findWordEnd;
|
10
|
+
exports.moveToPreviousWord = moveToPreviousWord;
|
11
|
+
exports.moveToNextWord = moveToNextWord;
|
12
|
+
exports.deleteWordBefore = deleteWordBefore;
|
13
|
+
exports.deleteWordAfter = deleteWordAfter;
|
14
|
+
exports.getTextPosition = getTextPosition;
|
15
|
+
exports.moveToLineStart = moveToLineStart;
|
16
|
+
exports.moveToLineEnd = moveToLineEnd;
|
17
|
+
exports.deleteCharBefore = deleteCharBefore;
|
18
|
+
exports.deleteCharAfter = deleteCharAfter;
|
19
|
+
exports.insertText = insertText;
|
20
|
+
/**
|
21
|
+
* Check if a character is a word boundary
|
22
|
+
*/
|
23
|
+
function isWordBoundary(char) {
|
24
|
+
if (!char)
|
25
|
+
return true;
|
26
|
+
return /\s/.test(char) || /[^\w]/.test(char);
|
27
|
+
}
|
28
|
+
/**
|
29
|
+
* Find the start of the current word at the given position
|
30
|
+
*/
|
31
|
+
function findWordStart(text, position) {
|
32
|
+
if (position <= 0)
|
33
|
+
return 0;
|
34
|
+
let pos = position - 1;
|
35
|
+
while (pos > 0 && !isWordBoundary(text[pos])) {
|
36
|
+
pos--;
|
37
|
+
}
|
38
|
+
// If we stopped at a word boundary, move forward to the actual word start
|
39
|
+
if (pos > 0 && isWordBoundary(text[pos])) {
|
40
|
+
pos++;
|
41
|
+
}
|
42
|
+
return pos;
|
43
|
+
}
|
44
|
+
/**
|
45
|
+
* Find the end of the current word at the given position
|
46
|
+
*/
|
47
|
+
function findWordEnd(text, position) {
|
48
|
+
if (position >= text.length)
|
49
|
+
return text.length;
|
50
|
+
let pos = position;
|
51
|
+
while (pos < text.length && !isWordBoundary(text[pos])) {
|
52
|
+
pos++;
|
53
|
+
}
|
54
|
+
return pos;
|
55
|
+
}
|
56
|
+
/**
|
57
|
+
* Move cursor to the previous word boundary
|
58
|
+
*/
|
59
|
+
function moveToPreviousWord(text, position) {
|
60
|
+
if (position <= 0)
|
61
|
+
return 0;
|
62
|
+
let pos = position - 1;
|
63
|
+
// Skip whitespace
|
64
|
+
while (pos > 0 && isWordBoundary(text[pos])) {
|
65
|
+
pos--;
|
66
|
+
}
|
67
|
+
// Find start of the word
|
68
|
+
while (pos > 0 && !isWordBoundary(text[pos - 1])) {
|
69
|
+
pos--;
|
70
|
+
}
|
71
|
+
return pos;
|
72
|
+
}
|
73
|
+
/**
|
74
|
+
* Move cursor to the next word boundary
|
75
|
+
*/
|
76
|
+
function moveToNextWord(text, position) {
|
77
|
+
if (position >= text.length)
|
78
|
+
return text.length;
|
79
|
+
let pos = position;
|
80
|
+
// Skip current word
|
81
|
+
while (pos < text.length && !isWordBoundary(text[pos])) {
|
82
|
+
pos++;
|
83
|
+
}
|
84
|
+
// Skip whitespace
|
85
|
+
while (pos < text.length && isWordBoundary(text[pos])) {
|
86
|
+
pos++;
|
87
|
+
}
|
88
|
+
return pos;
|
89
|
+
}
|
90
|
+
/**
|
91
|
+
* Delete the word before the cursor
|
92
|
+
*/
|
93
|
+
function deleteWordBefore(text, position) {
|
94
|
+
const wordStart = moveToPreviousWord(text, position);
|
95
|
+
const newText = text.slice(0, wordStart) + text.slice(position);
|
96
|
+
return {
|
97
|
+
text: newText,
|
98
|
+
position: wordStart,
|
99
|
+
};
|
100
|
+
}
|
101
|
+
/**
|
102
|
+
* Delete the word after the cursor
|
103
|
+
*/
|
104
|
+
function deleteWordAfter(text, position) {
|
105
|
+
const wordEnd = moveToNextWord(text, position);
|
106
|
+
const newText = text.slice(0, position) + text.slice(wordEnd);
|
107
|
+
return {
|
108
|
+
text: newText,
|
109
|
+
position,
|
110
|
+
};
|
111
|
+
}
|
112
|
+
/**
|
113
|
+
* Get the current line and column from text position
|
114
|
+
*/
|
115
|
+
function getTextPosition(text, index) {
|
116
|
+
const lines = text.slice(0, index).split('\n');
|
117
|
+
return {
|
118
|
+
index,
|
119
|
+
line: lines.length - 1,
|
120
|
+
column: lines[lines.length - 1].length,
|
121
|
+
};
|
122
|
+
}
|
123
|
+
/**
|
124
|
+
* Move to the beginning of the current line
|
125
|
+
*/
|
126
|
+
function moveToLineStart(text, position) {
|
127
|
+
const beforeCursor = text.slice(0, position);
|
128
|
+
const lastNewlineIndex = beforeCursor.lastIndexOf('\n');
|
129
|
+
return lastNewlineIndex === -1 ? 0 : lastNewlineIndex + 1;
|
130
|
+
}
|
131
|
+
/**
|
132
|
+
* Move to the end of the current line
|
133
|
+
*/
|
134
|
+
function moveToLineEnd(text, position) {
|
135
|
+
const afterCursor = text.slice(position);
|
136
|
+
const nextNewlineIndex = afterCursor.indexOf('\n');
|
137
|
+
return nextNewlineIndex === -1 ? text.length : position + nextNewlineIndex;
|
138
|
+
}
|
139
|
+
/**
|
140
|
+
* Handle proper Unicode-aware character deletion
|
141
|
+
*/
|
142
|
+
function deleteCharBefore(text, position) {
|
143
|
+
if (position <= 0) {
|
144
|
+
return { text, position };
|
145
|
+
}
|
146
|
+
// Handle surrogate pairs and combining characters
|
147
|
+
let deleteCount = 1;
|
148
|
+
const charBefore = text.charAt(position - 1);
|
149
|
+
// Check for high surrogate (first part of surrogate pair)
|
150
|
+
if (position >= 2) {
|
151
|
+
const charBeforeBefore = text.charAt(position - 2);
|
152
|
+
if (charBeforeBefore >= '\uD800' && charBeforeBefore <= '\uDBFF' &&
|
153
|
+
charBefore >= '\uDC00' && charBefore <= '\uDFFF') {
|
154
|
+
deleteCount = 2;
|
155
|
+
}
|
156
|
+
}
|
157
|
+
const newText = text.slice(0, position - deleteCount) + text.slice(position);
|
158
|
+
return {
|
159
|
+
text: newText,
|
160
|
+
position: position - deleteCount,
|
161
|
+
};
|
162
|
+
}
|
163
|
+
/**
|
164
|
+
* Handle proper Unicode-aware character deletion forward
|
165
|
+
*/
|
166
|
+
function deleteCharAfter(text, position) {
|
167
|
+
if (position >= text.length) {
|
168
|
+
return { text, position };
|
169
|
+
}
|
170
|
+
// Handle surrogate pairs and combining characters
|
171
|
+
let deleteCount = 1;
|
172
|
+
const charAfter = text.charAt(position);
|
173
|
+
// Check for high surrogate (first part of surrogate pair)
|
174
|
+
if (position + 1 < text.length) {
|
175
|
+
const charAfterAfter = text.charAt(position + 1);
|
176
|
+
if (charAfter >= '\uD800' && charAfter <= '\uDBFF' &&
|
177
|
+
charAfterAfter >= '\uDC00' && charAfterAfter <= '\uDFFF') {
|
178
|
+
deleteCount = 2;
|
179
|
+
}
|
180
|
+
}
|
181
|
+
const newText = text.slice(0, position) + text.slice(position + deleteCount);
|
182
|
+
return {
|
183
|
+
text: newText,
|
184
|
+
position,
|
185
|
+
};
|
186
|
+
}
|
187
|
+
/**
|
188
|
+
* Insert text at the given position with proper Unicode handling
|
189
|
+
*/
|
190
|
+
function insertText(text, position, insert) {
|
191
|
+
const newText = text.slice(0, position) + insert + text.slice(position);
|
192
|
+
return {
|
193
|
+
text: newText,
|
194
|
+
position: position + insert.length,
|
195
|
+
};
|
196
|
+
}
|
197
|
+
//# sourceMappingURL=text-utils.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"text-utils.js","sourceRoot":"","sources":["../../src/utils/text-utils.ts"],"names":[],"mappings":"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"}
|