@zds-ai/cli 0.1.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/LICENSE +21 -0
- package/README.md +497 -0
- package/dist/agent/grok-agent.d.ts +250 -0
- package/dist/agent/grok-agent.js +2480 -0
- package/dist/agent/grok-agent.js.map +1 -0
- package/dist/agent/index.d.ts +14 -0
- package/dist/agent/index.js +136 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/commands/mcp.d.ts +2 -0
- package/dist/commands/mcp.js +239 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/grok/client.d.ts +55 -0
- package/dist/grok/client.js +276 -0
- package/dist/grok/client.js.map +1 -0
- package/dist/grok/tools.d.ts +8 -0
- package/dist/grok/tools.js +878 -0
- package/dist/grok/tools.js.map +1 -0
- package/dist/hooks/use-enhanced-input.d.ts +38 -0
- package/dist/hooks/use-enhanced-input.js +228 -0
- package/dist/hooks/use-enhanced-input.js.map +1 -0
- package/dist/hooks/use-input-handler.d.ts +36 -0
- package/dist/hooks/use-input-handler.js +1099 -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 +61 -0
- package/dist/hooks/use-input-history.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +869 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/client.d.ts +41 -0
- package/dist/mcp/client.js +224 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/config.d.ts +13 -0
- package/dist/mcp/config.js +56 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/transports.d.ts +53 -0
- package/dist/mcp/transports.js +256 -0
- package/dist/mcp/transports.js.map +1 -0
- package/dist/tools/character-tool.d.ts +27 -0
- package/dist/tools/character-tool.js +194 -0
- package/dist/tools/character-tool.js.map +1 -0
- package/dist/tools/clear-cache-tool.d.ts +14 -0
- package/dist/tools/clear-cache-tool.js +82 -0
- package/dist/tools/clear-cache-tool.js.map +1 -0
- package/dist/tools/confirmation-tool.d.ts +16 -0
- package/dist/tools/confirmation-tool.js +72 -0
- package/dist/tools/confirmation-tool.js.map +1 -0
- package/dist/tools/env-tool.d.ts +17 -0
- package/dist/tools/env-tool.js +89 -0
- package/dist/tools/env-tool.js.map +1 -0
- package/dist/tools/file-conversion-tool.d.ts +16 -0
- package/dist/tools/file-conversion-tool.js +181 -0
- package/dist/tools/file-conversion-tool.js.map +1 -0
- package/dist/tools/image-tool.d.ts +22 -0
- package/dist/tools/image-tool.js +268 -0
- package/dist/tools/image-tool.js.map +1 -0
- package/dist/tools/index.d.ts +14 -0
- package/dist/tools/index.js +15 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/internet-tool.d.ts +11 -0
- package/dist/tools/internet-tool.js +108 -0
- package/dist/tools/internet-tool.js.map +1 -0
- package/dist/tools/introspect-tool.d.ts +11 -0
- package/dist/tools/introspect-tool.js +243 -0
- package/dist/tools/introspect-tool.js.map +1 -0
- package/dist/tools/morph-editor.d.ts +38 -0
- package/dist/tools/morph-editor.js +318 -0
- package/dist/tools/morph-editor.js.map +1 -0
- package/dist/tools/restart-tool.d.ts +7 -0
- package/dist/tools/restart-tool.js +24 -0
- package/dist/tools/restart-tool.js.map +1 -0
- package/dist/tools/search.d.ts +71 -0
- package/dist/tools/search.js +340 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/task-tool.d.ts +19 -0
- package/dist/tools/task-tool.js +115 -0
- package/dist/tools/task-tool.js.map +1 -0
- package/dist/tools/text-editor.d.ts +35 -0
- package/dist/tools/text-editor.js +669 -0
- package/dist/tools/text-editor.js.map +1 -0
- package/dist/tools/tool-discovery.d.ts +20 -0
- package/dist/tools/tool-discovery.js +45 -0
- package/dist/tools/tool-discovery.js.map +1 -0
- package/dist/tools/zsh.d.ts +13 -0
- package/dist/tools/zsh.js +168 -0
- package/dist/tools/zsh.js.map +1 -0
- package/dist/types/index.d.ts +31 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/app.d.ts +7 -0
- package/dist/ui/app.js +99 -0
- package/dist/ui/app.js.map +1 -0
- package/dist/ui/components/active-task-status.d.ts +7 -0
- package/dist/ui/components/active-task-status.js +37 -0
- package/dist/ui/components/active-task-status.js.map +1 -0
- package/dist/ui/components/api-key-input.d.ts +7 -0
- package/dist/ui/components/api-key-input.js +80 -0
- package/dist/ui/components/api-key-input.js.map +1 -0
- package/dist/ui/components/backend-status.d.ts +7 -0
- package/dist/ui/components/backend-status.js +85 -0
- package/dist/ui/components/backend-status.js.map +1 -0
- package/dist/ui/components/chat-history.d.ts +8 -0
- package/dist/ui/components/chat-history.js +187 -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 +63 -0
- package/dist/ui/components/chat-input.js.map +1 -0
- package/dist/ui/components/chat-interface.d.ts +9 -0
- package/dist/ui/components/chat-interface.js +389 -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 +22 -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 +105 -0
- package/dist/ui/components/confirmation-dialog.js.map +1 -0
- package/dist/ui/components/context-status.d.ts +7 -0
- package/dist/ui/components/context-status.js +36 -0
- package/dist/ui/components/context-status.js.map +1 -0
- package/dist/ui/components/diff-renderer.d.ts +13 -0
- package/dist/ui/components/diff-renderer.js +206 -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 +64 -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 +57 -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 +17 -0
- package/dist/ui/components/model-selection.js.map +1 -0
- package/dist/ui/components/mood-status.d.ts +7 -0
- package/dist/ui/components/mood-status.js +34 -0
- package/dist/ui/components/mood-status.js.map +1 -0
- package/dist/ui/components/persona-status.d.ts +7 -0
- package/dist/ui/components/persona-status.js +34 -0
- package/dist/ui/components/persona-status.js.map +1 -0
- package/dist/ui/shared/max-sized-box.d.ts +8 -0
- package/dist/ui/shared/max-sized-box.js +6 -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 +7 -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 +15 -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 +40 -0
- package/dist/ui/utils/markdown-renderer.js.map +1 -0
- package/dist/utils/auth-helper.d.ts +63 -0
- package/dist/utils/auth-helper.js +129 -0
- package/dist/utils/auth-helper.js.map +1 -0
- package/dist/utils/chat-history-manager-sqlite.d.ts +92 -0
- package/dist/utils/chat-history-manager-sqlite.js +334 -0
- package/dist/utils/chat-history-manager-sqlite.js.map +1 -0
- package/dist/utils/chat-history-manager.d.ts +87 -0
- package/dist/utils/chat-history-manager.js +273 -0
- package/dist/utils/chat-history-manager.js.map +1 -0
- package/dist/utils/chat-history-manager.json-backup.d.ts +69 -0
- package/dist/utils/chat-history-manager.json-backup.js +215 -0
- package/dist/utils/chat-history-manager.json-backup.js.map +1 -0
- package/dist/utils/confirmation-service.d.ts +46 -0
- package/dist/utils/confirmation-service.js +165 -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 +30 -0
- package/dist/utils/custom-instructions.js.map +1 -0
- package/dist/utils/database-connection.d.ts +27 -0
- package/dist/utils/database-connection.js +81 -0
- package/dist/utils/database-connection.js.map +1 -0
- package/dist/utils/database-schema.d.ts +17 -0
- package/dist/utils/database-schema.js +93 -0
- package/dist/utils/database-schema.js.map +1 -0
- package/dist/utils/error-logger.d.ts +13 -0
- package/dist/utils/error-logger.js +56 -0
- package/dist/utils/error-logger.js.map +1 -0
- package/dist/utils/hook-executor.d.ts +59 -0
- package/dist/utils/hook-executor.js +351 -0
- package/dist/utils/hook-executor.js.map +1 -0
- package/dist/utils/model-config.d.ts +28 -0
- package/dist/utils/model-config.js +42 -0
- package/dist/utils/model-config.js.map +1 -0
- package/dist/utils/path-utils.d.ts +4 -0
- package/dist/utils/path-utils.js +12 -0
- package/dist/utils/path-utils.js.map +1 -0
- package/dist/utils/settings-manager.d.ts +169 -0
- package/dist/utils/settings-manager.js +403 -0
- package/dist/utils/settings-manager.js.map +1 -0
- package/dist/utils/settings.d.ts +1 -0
- package/dist/utils/settings.js +4 -0
- package/dist/utils/settings.js.map +1 -0
- package/dist/utils/slash-commands.d.ts +25 -0
- package/dist/utils/slash-commands.js +454 -0
- package/dist/utils/slash-commands.js.map +1 -0
- package/dist/utils/startup-hook.d.ts +13 -0
- package/dist/utils/startup-hook.js +44 -0
- package/dist/utils/startup-hook.js.map +1 -0
- package/dist/utils/text-utils.d.ts +80 -0
- package/dist/utils/text-utils.js +182 -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 +78 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/package.json +102 -0
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
import { ConfirmationService } from "./confirmation-service.js";
|
|
2
|
+
/**
|
|
3
|
+
* Process slash commands
|
|
4
|
+
* Returns true if command was handled, false if it should be processed as normal input
|
|
5
|
+
*/
|
|
6
|
+
export async function processSlashCommand(input, context) {
|
|
7
|
+
const { agent, addChatEntry, clearInput, resetHistory, setProcessingStates, setTotalTokenUsage, isHeadless, isInkMode } = context;
|
|
8
|
+
const trimmedInput = input.trim();
|
|
9
|
+
// !<command> - execute shell command in interactive modes only
|
|
10
|
+
// In headless mode, pass to LLM unmodified
|
|
11
|
+
if (trimmedInput.startsWith("!")) {
|
|
12
|
+
// In headless mode, don't handle - let it pass to LLM
|
|
13
|
+
if (isHeadless) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
// Interactive modes (Ink and no-ink): execute the command
|
|
17
|
+
const command = trimmedInput.substring(1).trim();
|
|
18
|
+
if (command) {
|
|
19
|
+
// Execute the command
|
|
20
|
+
const result = await agent.executeCommand(command, true); // skip confirmation
|
|
21
|
+
// Add user message and tool result to chat history
|
|
22
|
+
const userEntry = {
|
|
23
|
+
type: "user",
|
|
24
|
+
content: trimmedInput,
|
|
25
|
+
timestamp: new Date(),
|
|
26
|
+
};
|
|
27
|
+
addChatEntry(userEntry);
|
|
28
|
+
const commandEntry = {
|
|
29
|
+
type: "tool_result",
|
|
30
|
+
content: result.success
|
|
31
|
+
? result.output || "Command completed"
|
|
32
|
+
: result.error || "Command failed",
|
|
33
|
+
timestamp: new Date(),
|
|
34
|
+
toolCall: {
|
|
35
|
+
id: `user_execute_${Date.now()}`,
|
|
36
|
+
type: "function",
|
|
37
|
+
function: {
|
|
38
|
+
name: "execute",
|
|
39
|
+
arguments: JSON.stringify({ command: command }),
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
toolResult: result,
|
|
43
|
+
};
|
|
44
|
+
addChatEntry(commandEntry);
|
|
45
|
+
if (clearInput)
|
|
46
|
+
clearInput();
|
|
47
|
+
// Return true - command executed, don't send to LLM as prompt
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return true; // Empty command after !
|
|
51
|
+
}
|
|
52
|
+
// /clear command
|
|
53
|
+
if (trimmedInput === "/clear") {
|
|
54
|
+
try {
|
|
55
|
+
// Set processing state if available
|
|
56
|
+
if (setProcessingStates) {
|
|
57
|
+
setProcessingStates({ isProcessing: true });
|
|
58
|
+
}
|
|
59
|
+
// Clear agent's internal context
|
|
60
|
+
await agent.clearCache();
|
|
61
|
+
// Reset confirmation service session flags
|
|
62
|
+
const confirmationService = ConfirmationService.getInstance();
|
|
63
|
+
confirmationService.resetSession();
|
|
64
|
+
// Reset states
|
|
65
|
+
if (setProcessingStates) {
|
|
66
|
+
setProcessingStates({
|
|
67
|
+
isProcessing: false,
|
|
68
|
+
isStreaming: false,
|
|
69
|
+
tokenCount: 0,
|
|
70
|
+
processingTime: 0,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// Reset total token usage
|
|
74
|
+
if (setTotalTokenUsage) {
|
|
75
|
+
setTotalTokenUsage(0);
|
|
76
|
+
}
|
|
77
|
+
// Clear input and history if available
|
|
78
|
+
if (clearInput)
|
|
79
|
+
clearInput();
|
|
80
|
+
if (resetHistory)
|
|
81
|
+
resetHistory();
|
|
82
|
+
// In headless mode, just output confirmation
|
|
83
|
+
if (isHeadless) {
|
|
84
|
+
console.log("Chat history cleared");
|
|
85
|
+
}
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
const errorMessage = `ERROR: Failed to clear cache: ${error instanceof Error ? error.message : String(error)}`;
|
|
90
|
+
if (isHeadless) {
|
|
91
|
+
console.error(errorMessage);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const errorEntry = {
|
|
95
|
+
type: "system",
|
|
96
|
+
content: errorMessage,
|
|
97
|
+
timestamp: new Date(),
|
|
98
|
+
};
|
|
99
|
+
addChatEntry(errorEntry);
|
|
100
|
+
}
|
|
101
|
+
if (setProcessingStates) {
|
|
102
|
+
setProcessingStates({
|
|
103
|
+
isProcessing: false,
|
|
104
|
+
isStreaming: false,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// /introspect command
|
|
111
|
+
if (trimmedInput.startsWith("/introspect")) {
|
|
112
|
+
const parts = trimmedInput.split(" ");
|
|
113
|
+
const target = parts[1] || "help";
|
|
114
|
+
const toolResult = await agent["introspect"].introspect(target);
|
|
115
|
+
const content = toolResult.success ? toolResult.output : toolResult.error;
|
|
116
|
+
if (isHeadless) {
|
|
117
|
+
console.log(content);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
const introspectEntry = {
|
|
121
|
+
type: "assistant",
|
|
122
|
+
content,
|
|
123
|
+
timestamp: new Date(),
|
|
124
|
+
preserveFormatting: true,
|
|
125
|
+
};
|
|
126
|
+
addChatEntry(introspectEntry);
|
|
127
|
+
if (clearInput)
|
|
128
|
+
clearInput();
|
|
129
|
+
}
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
// /help command
|
|
133
|
+
if (trimmedInput === "/help") {
|
|
134
|
+
const helpText = `Grok CLI Help:
|
|
135
|
+
|
|
136
|
+
Built-in Commands:
|
|
137
|
+
/clear - Clear chat history (current session + persisted)
|
|
138
|
+
/context - Show context usage info
|
|
139
|
+
/context view - View full context in pager (markdown format)
|
|
140
|
+
/context edit - Edit context JSON file (opens in $EDITOR)
|
|
141
|
+
/help - Show this help
|
|
142
|
+
/ink - Switch to Ink UI mode (restart required)
|
|
143
|
+
/introspect - Show available tools (internal and MCP)
|
|
144
|
+
/models - Switch between available models
|
|
145
|
+
/no-ink - Switch to plain console mode (restart required)
|
|
146
|
+
/restart - Restart the application (exit code 51)
|
|
147
|
+
/exit - Exit application
|
|
148
|
+
exit, quit - Exit application
|
|
149
|
+
|
|
150
|
+
CLI Options:
|
|
151
|
+
--fresh - Start with a fresh session (don't load previous history)
|
|
152
|
+
|
|
153
|
+
Git Commands:
|
|
154
|
+
/commit-and-push - AI-generated commit + push to remote
|
|
155
|
+
|
|
156
|
+
Enhanced Input Features:
|
|
157
|
+
↑/↓ Arrow - Navigate command history
|
|
158
|
+
Ctrl+C - Clear input (press twice to exit)
|
|
159
|
+
Ctrl+D - Exit on blank line
|
|
160
|
+
Ctrl+←/→ - Move by word
|
|
161
|
+
Ctrl+A/E - Move to line start/end
|
|
162
|
+
Ctrl+W - Delete word before cursor
|
|
163
|
+
Ctrl+K - Delete to end of line
|
|
164
|
+
Ctrl+U - Delete to start of line
|
|
165
|
+
ESC - Cancel current action / close menus
|
|
166
|
+
ESC (twice) - Clear input line
|
|
167
|
+
Shift+Tab - Toggle auto-edit mode (bypass confirmations)
|
|
168
|
+
|
|
169
|
+
Direct Commands (executed immediately):
|
|
170
|
+
!command - Execute any shell command directly
|
|
171
|
+
ls [path] - List directory contents
|
|
172
|
+
pwd - Show current directory
|
|
173
|
+
cd <path> - Change directory
|
|
174
|
+
cat <file> - View file contents
|
|
175
|
+
mkdir <dir> - Create directory
|
|
176
|
+
touch <file>- Create empty file
|
|
177
|
+
|
|
178
|
+
Model Configuration:
|
|
179
|
+
Edit ~/.grok/models.json to add custom models (Claude, GPT, Gemini, etc.)
|
|
180
|
+
|
|
181
|
+
History Persistence:
|
|
182
|
+
Chat history is automatically saved and restored between sessions.
|
|
183
|
+
Use /clear to reset both current and persisted history.
|
|
184
|
+
|
|
185
|
+
For complex operations, just describe what you want in natural language.
|
|
186
|
+
Examples:
|
|
187
|
+
"edit package.json and add a new script"
|
|
188
|
+
"create a new React component called Header"
|
|
189
|
+
"show me all TypeScript files in this project"`;
|
|
190
|
+
if (isHeadless) {
|
|
191
|
+
console.log(helpText);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
const helpEntry = {
|
|
195
|
+
type: "assistant",
|
|
196
|
+
content: helpText,
|
|
197
|
+
timestamp: new Date(),
|
|
198
|
+
};
|
|
199
|
+
addChatEntry(helpEntry);
|
|
200
|
+
if (clearInput)
|
|
201
|
+
clearInput();
|
|
202
|
+
}
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
// /restart command
|
|
206
|
+
if (trimmedInput === "/restart") {
|
|
207
|
+
// Call the restart tool which exits with code 51
|
|
208
|
+
await agent["restartTool"].restart();
|
|
209
|
+
return true; // This line won't be reached but TypeScript needs it
|
|
210
|
+
}
|
|
211
|
+
// /ink command - switch to Ink UI mode
|
|
212
|
+
if (trimmedInput === "/ink") {
|
|
213
|
+
if (isHeadless) {
|
|
214
|
+
console.error("ERROR: /ink requires interactive mode");
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
// Check if already in ink mode
|
|
218
|
+
if (isInkMode) {
|
|
219
|
+
const alreadyEntry = {
|
|
220
|
+
type: "system",
|
|
221
|
+
content: "You are already in Ink UI mode",
|
|
222
|
+
timestamp: new Date(),
|
|
223
|
+
};
|
|
224
|
+
addChatEntry(alreadyEntry);
|
|
225
|
+
if (clearInput)
|
|
226
|
+
clearInput();
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
const switchEntry = {
|
|
230
|
+
type: "assistant",
|
|
231
|
+
content: "Switching to Ink UI mode...",
|
|
232
|
+
timestamp: new Date(),
|
|
233
|
+
};
|
|
234
|
+
addChatEntry(switchEntry);
|
|
235
|
+
// Exit with code 52 - wrapper will add --no-ink=false or remove --no-ink and restart
|
|
236
|
+
process.exit(52);
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
239
|
+
// /no-ink command - switch to plain console mode
|
|
240
|
+
if (trimmedInput === "/no-ink") {
|
|
241
|
+
if (isHeadless) {
|
|
242
|
+
console.error("ERROR: /no-ink requires interactive mode");
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
// Check if already in plain console mode
|
|
246
|
+
if (!isInkMode) {
|
|
247
|
+
const alreadyEntry = {
|
|
248
|
+
type: "system",
|
|
249
|
+
content: "You are already in plain console mode",
|
|
250
|
+
timestamp: new Date(),
|
|
251
|
+
};
|
|
252
|
+
addChatEntry(alreadyEntry);
|
|
253
|
+
if (clearInput)
|
|
254
|
+
clearInput();
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
const switchEntry = {
|
|
258
|
+
type: "assistant",
|
|
259
|
+
content: "Switching to plain console mode...",
|
|
260
|
+
timestamp: new Date(),
|
|
261
|
+
};
|
|
262
|
+
addChatEntry(switchEntry);
|
|
263
|
+
// Exit with code 53 - wrapper will add --no-ink and restart
|
|
264
|
+
process.exit(53);
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
// /exit command
|
|
268
|
+
if (trimmedInput === "/exit") {
|
|
269
|
+
process.exit(0);
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
// /context command
|
|
273
|
+
if (trimmedInput.startsWith("/context")) {
|
|
274
|
+
const parts = trimmedInput.split(" ");
|
|
275
|
+
const subcommand = parts[1];
|
|
276
|
+
if (subcommand === "view" || subcommand === "edit") {
|
|
277
|
+
// These commands require interactive mode
|
|
278
|
+
if (isHeadless) {
|
|
279
|
+
console.error(`ERROR: /context ${subcommand} requires interactive mode`);
|
|
280
|
+
return true;
|
|
281
|
+
}
|
|
282
|
+
// In interactive mode, let the UI handler deal with it
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
// Default: show context usage info (redirect to /introspect context)
|
|
287
|
+
const toolResult = await agent["introspect"].introspect("context");
|
|
288
|
+
const content = toolResult.success ? toolResult.output : toolResult.error;
|
|
289
|
+
if (isHeadless) {
|
|
290
|
+
console.log(content);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
const contextEntry = {
|
|
294
|
+
type: "assistant",
|
|
295
|
+
content,
|
|
296
|
+
timestamp: new Date(),
|
|
297
|
+
};
|
|
298
|
+
addChatEntry(contextEntry);
|
|
299
|
+
if (clearInput)
|
|
300
|
+
clearInput();
|
|
301
|
+
}
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// /persona command
|
|
306
|
+
if (trimmedInput.startsWith("/persona")) {
|
|
307
|
+
const parts = trimmedInput.split(" ");
|
|
308
|
+
if (parts.length < 2) {
|
|
309
|
+
const helpText = "Usage: /persona <text> [color]\nExample: /persona debugging red";
|
|
310
|
+
if (isHeadless) {
|
|
311
|
+
console.log(helpText);
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
const helpEntry = {
|
|
315
|
+
type: "assistant",
|
|
316
|
+
content: helpText,
|
|
317
|
+
timestamp: new Date(),
|
|
318
|
+
};
|
|
319
|
+
addChatEntry(helpEntry);
|
|
320
|
+
if (clearInput)
|
|
321
|
+
clearInput();
|
|
322
|
+
}
|
|
323
|
+
return true;
|
|
324
|
+
}
|
|
325
|
+
const persona = parts[1];
|
|
326
|
+
const color = parts[2];
|
|
327
|
+
const result = await agent.setPersona(persona, color);
|
|
328
|
+
const confirmText = result.success
|
|
329
|
+
? `Persona set to: ${persona}${color ? ` (${color})` : ''}`
|
|
330
|
+
: `Failed to set persona: ${result.error || 'Unknown error'}`;
|
|
331
|
+
if (isHeadless) {
|
|
332
|
+
console.log(confirmText);
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
const confirmEntry = {
|
|
336
|
+
type: "assistant",
|
|
337
|
+
content: confirmText,
|
|
338
|
+
timestamp: new Date(),
|
|
339
|
+
};
|
|
340
|
+
addChatEntry(confirmEntry);
|
|
341
|
+
if (clearInput)
|
|
342
|
+
clearInput();
|
|
343
|
+
}
|
|
344
|
+
return true;
|
|
345
|
+
}
|
|
346
|
+
// /mood command
|
|
347
|
+
if (trimmedInput.startsWith("/mood")) {
|
|
348
|
+
const parts = trimmedInput.split(" ");
|
|
349
|
+
if (parts.length < 2) {
|
|
350
|
+
const helpText = "Usage: /mood <text> [color]\nExample: /mood focused green";
|
|
351
|
+
if (isHeadless) {
|
|
352
|
+
console.log(helpText);
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
const helpEntry = {
|
|
356
|
+
type: "assistant",
|
|
357
|
+
content: helpText,
|
|
358
|
+
timestamp: new Date(),
|
|
359
|
+
};
|
|
360
|
+
addChatEntry(helpEntry);
|
|
361
|
+
if (clearInput)
|
|
362
|
+
clearInput();
|
|
363
|
+
}
|
|
364
|
+
return true;
|
|
365
|
+
}
|
|
366
|
+
const mood = parts[1];
|
|
367
|
+
const color = parts[2];
|
|
368
|
+
const result = await agent.setMood(mood, color);
|
|
369
|
+
const confirmText = result.success
|
|
370
|
+
? `Mood set to: ${mood}${color ? ` (${color})` : ''}`
|
|
371
|
+
: `Failed to set mood: ${result.error || 'Unknown error'}`;
|
|
372
|
+
if (isHeadless) {
|
|
373
|
+
console.log(confirmText);
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
const confirmEntry = {
|
|
377
|
+
type: "assistant",
|
|
378
|
+
content: confirmText,
|
|
379
|
+
timestamp: new Date(),
|
|
380
|
+
};
|
|
381
|
+
addChatEntry(confirmEntry);
|
|
382
|
+
if (clearInput)
|
|
383
|
+
clearInput();
|
|
384
|
+
}
|
|
385
|
+
return true;
|
|
386
|
+
}
|
|
387
|
+
// /models command - interactive selection not supported in headless
|
|
388
|
+
if (trimmedInput === "/models") {
|
|
389
|
+
if (isHeadless) {
|
|
390
|
+
console.error("ERROR: /models requires interactive mode or use /models <model-name>");
|
|
391
|
+
return true;
|
|
392
|
+
}
|
|
393
|
+
// Let UI handler show the interactive menu
|
|
394
|
+
return false;
|
|
395
|
+
}
|
|
396
|
+
// /models <model> command with argument
|
|
397
|
+
if (trimmedInput.startsWith("/models ")) {
|
|
398
|
+
const modelArg = trimmedInput.split(" ")[1];
|
|
399
|
+
const { loadModelConfig } = await import("./model-config.js");
|
|
400
|
+
const availableModels = loadModelConfig();
|
|
401
|
+
const modelNames = availableModels.map((m) => m.model);
|
|
402
|
+
if (modelNames.includes(modelArg)) {
|
|
403
|
+
agent.setModel(modelArg);
|
|
404
|
+
// Update project current model if not headless
|
|
405
|
+
if (!isHeadless) {
|
|
406
|
+
const { updateCurrentModel } = await import("./model-config.js");
|
|
407
|
+
updateCurrentModel(modelArg);
|
|
408
|
+
}
|
|
409
|
+
const confirmText = `✓ Switched to model: ${modelArg}`;
|
|
410
|
+
if (isHeadless) {
|
|
411
|
+
console.log(confirmText);
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
const confirmEntry = {
|
|
415
|
+
type: "assistant",
|
|
416
|
+
content: confirmText,
|
|
417
|
+
timestamp: new Date(),
|
|
418
|
+
};
|
|
419
|
+
addChatEntry(confirmEntry);
|
|
420
|
+
if (clearInput)
|
|
421
|
+
clearInput();
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
const errorText = `Invalid model: ${modelArg}\n\nAvailable models: ${modelNames.join(", ")}`;
|
|
426
|
+
if (isHeadless) {
|
|
427
|
+
console.error(errorText);
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
const errorEntry = {
|
|
431
|
+
type: "assistant",
|
|
432
|
+
content: errorText,
|
|
433
|
+
timestamp: new Date(),
|
|
434
|
+
};
|
|
435
|
+
addChatEntry(errorEntry);
|
|
436
|
+
if (clearInput)
|
|
437
|
+
clearInput();
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
return true;
|
|
441
|
+
}
|
|
442
|
+
// /commit-and-push command - not well suited for headless but let it through
|
|
443
|
+
if (trimmedInput === "/commit-and-push") {
|
|
444
|
+
if (isHeadless) {
|
|
445
|
+
console.error("ERROR: /commit-and-push not supported in headless mode");
|
|
446
|
+
return true;
|
|
447
|
+
}
|
|
448
|
+
// Let UI handler deal with the streaming response
|
|
449
|
+
return false;
|
|
450
|
+
}
|
|
451
|
+
// Not a recognized slash command
|
|
452
|
+
return false;
|
|
453
|
+
}
|
|
454
|
+
//# sourceMappingURL=slash-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../../src/utils/slash-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { GrokAgent } from "../agent/grok-agent.js";
|
|
2
|
+
/**
|
|
3
|
+
* Execute the startup hook command if configured
|
|
4
|
+
* Returns the output to be added to the system prompt
|
|
5
|
+
*/
|
|
6
|
+
export declare function executeStartupHook(): Promise<string | undefined>;
|
|
7
|
+
/**
|
|
8
|
+
* Create a GrokAgent with startup hook execution and initialization
|
|
9
|
+
* @param runStartupHook - Whether to run the startup hook (default: true, set false for restored sessions)
|
|
10
|
+
* @param temperature - Temperature for API requests (0.0-2.0, default: 0.7)
|
|
11
|
+
* @param maxTokens - Maximum tokens for API responses (positive integer, default: undefined = API default)
|
|
12
|
+
*/
|
|
13
|
+
export declare function createGrokAgent(apiKey: string, baseURL?: string, model?: string, maxToolRounds?: number, debugLogFile?: string, runStartupHook?: boolean, temperature?: number, maxTokens?: number): Promise<GrokAgent>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { getSettingsManager } from "./settings-manager.js";
|
|
2
|
+
import { GrokAgent } from "../agent/grok-agent.js";
|
|
3
|
+
import { exec } from "child_process";
|
|
4
|
+
import { promisify } from "util";
|
|
5
|
+
const execAsync = promisify(exec);
|
|
6
|
+
/**
|
|
7
|
+
* Execute the startup hook command if configured
|
|
8
|
+
* Returns the output to be added to the system prompt
|
|
9
|
+
*/
|
|
10
|
+
export async function executeStartupHook() {
|
|
11
|
+
const manager = getSettingsManager();
|
|
12
|
+
const startupHook = manager.getStartupHook();
|
|
13
|
+
if (!startupHook) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const shell = process.env.SHELL || '/bin/zsh';
|
|
18
|
+
const { stdout, stderr } = await execAsync(startupHook, {
|
|
19
|
+
timeout: 10000, // 10 second timeout
|
|
20
|
+
maxBuffer: 1024 * 1024, // 1MB max output
|
|
21
|
+
shell,
|
|
22
|
+
});
|
|
23
|
+
// Combine stdout and stderr
|
|
24
|
+
const output = (stdout + (stderr ? `\nSTDERR:\n${stderr}` : "")).trim();
|
|
25
|
+
return output || undefined;
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
console.warn("Startup hook failed:", error.message);
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a GrokAgent with startup hook execution and initialization
|
|
34
|
+
* @param runStartupHook - Whether to run the startup hook (default: true, set false for restored sessions)
|
|
35
|
+
* @param temperature - Temperature for API requests (0.0-2.0, default: 0.7)
|
|
36
|
+
* @param maxTokens - Maximum tokens for API responses (positive integer, default: undefined = API default)
|
|
37
|
+
*/
|
|
38
|
+
export async function createGrokAgent(apiKey, baseURL, model, maxToolRounds, debugLogFile, runStartupHook = true, temperature, maxTokens) {
|
|
39
|
+
const startupHookOutput = runStartupHook ? await executeStartupHook() : undefined;
|
|
40
|
+
const agent = new GrokAgent(apiKey, baseURL, model, maxToolRounds, debugLogFile, startupHookOutput, temperature, maxTokens);
|
|
41
|
+
await agent.initialize();
|
|
42
|
+
return agent;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=startup-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startup-hook.js","sourceRoot":"","sources":["../../src/utils/startup-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAE7C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC;QAC9C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE;YACtD,OAAO,EAAE,KAAK,EAAE,oBAAoB;YACpC,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,iBAAiB;YACzC,KAAK;SACN,CAAC,CAAC;QAEH,4BAA4B;QAC5B,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxE,OAAO,MAAM,IAAI,SAAS,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,OAAgB,EAChB,KAAc,EACd,aAAsB,EACtB,YAAqB,EACrB,iBAA0B,IAAI,EAC9B,WAAoB,EACpB,SAAkB;IAElB,MAAM,iBAAiB,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAClF,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC5H,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;IACzB,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -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
|
+
};
|