@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.
Files changed (204) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +497 -0
  3. package/dist/agent/grok-agent.d.ts +250 -0
  4. package/dist/agent/grok-agent.js +2480 -0
  5. package/dist/agent/grok-agent.js.map +1 -0
  6. package/dist/agent/index.d.ts +14 -0
  7. package/dist/agent/index.js +136 -0
  8. package/dist/agent/index.js.map +1 -0
  9. package/dist/commands/mcp.d.ts +2 -0
  10. package/dist/commands/mcp.js +239 -0
  11. package/dist/commands/mcp.js.map +1 -0
  12. package/dist/grok/client.d.ts +55 -0
  13. package/dist/grok/client.js +276 -0
  14. package/dist/grok/client.js.map +1 -0
  15. package/dist/grok/tools.d.ts +8 -0
  16. package/dist/grok/tools.js +878 -0
  17. package/dist/grok/tools.js.map +1 -0
  18. package/dist/hooks/use-enhanced-input.d.ts +38 -0
  19. package/dist/hooks/use-enhanced-input.js +228 -0
  20. package/dist/hooks/use-enhanced-input.js.map +1 -0
  21. package/dist/hooks/use-input-handler.d.ts +36 -0
  22. package/dist/hooks/use-input-handler.js +1099 -0
  23. package/dist/hooks/use-input-handler.js.map +1 -0
  24. package/dist/hooks/use-input-history.d.ts +9 -0
  25. package/dist/hooks/use-input-history.js +61 -0
  26. package/dist/hooks/use-input-history.js.map +1 -0
  27. package/dist/index.d.ts +2 -0
  28. package/dist/index.js +869 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/mcp/client.d.ts +41 -0
  31. package/dist/mcp/client.js +224 -0
  32. package/dist/mcp/client.js.map +1 -0
  33. package/dist/mcp/config.d.ts +13 -0
  34. package/dist/mcp/config.js +56 -0
  35. package/dist/mcp/config.js.map +1 -0
  36. package/dist/mcp/transports.d.ts +53 -0
  37. package/dist/mcp/transports.js +256 -0
  38. package/dist/mcp/transports.js.map +1 -0
  39. package/dist/tools/character-tool.d.ts +27 -0
  40. package/dist/tools/character-tool.js +194 -0
  41. package/dist/tools/character-tool.js.map +1 -0
  42. package/dist/tools/clear-cache-tool.d.ts +14 -0
  43. package/dist/tools/clear-cache-tool.js +82 -0
  44. package/dist/tools/clear-cache-tool.js.map +1 -0
  45. package/dist/tools/confirmation-tool.d.ts +16 -0
  46. package/dist/tools/confirmation-tool.js +72 -0
  47. package/dist/tools/confirmation-tool.js.map +1 -0
  48. package/dist/tools/env-tool.d.ts +17 -0
  49. package/dist/tools/env-tool.js +89 -0
  50. package/dist/tools/env-tool.js.map +1 -0
  51. package/dist/tools/file-conversion-tool.d.ts +16 -0
  52. package/dist/tools/file-conversion-tool.js +181 -0
  53. package/dist/tools/file-conversion-tool.js.map +1 -0
  54. package/dist/tools/image-tool.d.ts +22 -0
  55. package/dist/tools/image-tool.js +268 -0
  56. package/dist/tools/image-tool.js.map +1 -0
  57. package/dist/tools/index.d.ts +14 -0
  58. package/dist/tools/index.js +15 -0
  59. package/dist/tools/index.js.map +1 -0
  60. package/dist/tools/internet-tool.d.ts +11 -0
  61. package/dist/tools/internet-tool.js +108 -0
  62. package/dist/tools/internet-tool.js.map +1 -0
  63. package/dist/tools/introspect-tool.d.ts +11 -0
  64. package/dist/tools/introspect-tool.js +243 -0
  65. package/dist/tools/introspect-tool.js.map +1 -0
  66. package/dist/tools/morph-editor.d.ts +38 -0
  67. package/dist/tools/morph-editor.js +318 -0
  68. package/dist/tools/morph-editor.js.map +1 -0
  69. package/dist/tools/restart-tool.d.ts +7 -0
  70. package/dist/tools/restart-tool.js +24 -0
  71. package/dist/tools/restart-tool.js.map +1 -0
  72. package/dist/tools/search.d.ts +71 -0
  73. package/dist/tools/search.js +340 -0
  74. package/dist/tools/search.js.map +1 -0
  75. package/dist/tools/task-tool.d.ts +19 -0
  76. package/dist/tools/task-tool.js +115 -0
  77. package/dist/tools/task-tool.js.map +1 -0
  78. package/dist/tools/text-editor.d.ts +35 -0
  79. package/dist/tools/text-editor.js +669 -0
  80. package/dist/tools/text-editor.js.map +1 -0
  81. package/dist/tools/tool-discovery.d.ts +20 -0
  82. package/dist/tools/tool-discovery.js +45 -0
  83. package/dist/tools/tool-discovery.js.map +1 -0
  84. package/dist/tools/zsh.d.ts +13 -0
  85. package/dist/tools/zsh.js +168 -0
  86. package/dist/tools/zsh.js.map +1 -0
  87. package/dist/types/index.d.ts +31 -0
  88. package/dist/types/index.js +2 -0
  89. package/dist/types/index.js.map +1 -0
  90. package/dist/ui/app.d.ts +7 -0
  91. package/dist/ui/app.js +99 -0
  92. package/dist/ui/app.js.map +1 -0
  93. package/dist/ui/components/active-task-status.d.ts +7 -0
  94. package/dist/ui/components/active-task-status.js +37 -0
  95. package/dist/ui/components/active-task-status.js.map +1 -0
  96. package/dist/ui/components/api-key-input.d.ts +7 -0
  97. package/dist/ui/components/api-key-input.js +80 -0
  98. package/dist/ui/components/api-key-input.js.map +1 -0
  99. package/dist/ui/components/backend-status.d.ts +7 -0
  100. package/dist/ui/components/backend-status.js +85 -0
  101. package/dist/ui/components/backend-status.js.map +1 -0
  102. package/dist/ui/components/chat-history.d.ts +8 -0
  103. package/dist/ui/components/chat-history.js +187 -0
  104. package/dist/ui/components/chat-history.js.map +1 -0
  105. package/dist/ui/components/chat-input.d.ts +9 -0
  106. package/dist/ui/components/chat-input.js +63 -0
  107. package/dist/ui/components/chat-input.js.map +1 -0
  108. package/dist/ui/components/chat-interface.d.ts +9 -0
  109. package/dist/ui/components/chat-interface.js +389 -0
  110. package/dist/ui/components/chat-interface.js.map +1 -0
  111. package/dist/ui/components/command-suggestions.d.ts +17 -0
  112. package/dist/ui/components/command-suggestions.js +22 -0
  113. package/dist/ui/components/command-suggestions.js.map +1 -0
  114. package/dist/ui/components/confirmation-dialog.d.ts +11 -0
  115. package/dist/ui/components/confirmation-dialog.js +105 -0
  116. package/dist/ui/components/confirmation-dialog.js.map +1 -0
  117. package/dist/ui/components/context-status.d.ts +7 -0
  118. package/dist/ui/components/context-status.js +36 -0
  119. package/dist/ui/components/context-status.js.map +1 -0
  120. package/dist/ui/components/diff-renderer.d.ts +13 -0
  121. package/dist/ui/components/diff-renderer.js +206 -0
  122. package/dist/ui/components/diff-renderer.js.map +1 -0
  123. package/dist/ui/components/loading-spinner.d.ts +8 -0
  124. package/dist/ui/components/loading-spinner.js +64 -0
  125. package/dist/ui/components/loading-spinner.js.map +1 -0
  126. package/dist/ui/components/mcp-status.d.ts +5 -0
  127. package/dist/ui/components/mcp-status.js +57 -0
  128. package/dist/ui/components/mcp-status.js.map +1 -0
  129. package/dist/ui/components/model-selection.d.ts +12 -0
  130. package/dist/ui/components/model-selection.js +17 -0
  131. package/dist/ui/components/model-selection.js.map +1 -0
  132. package/dist/ui/components/mood-status.d.ts +7 -0
  133. package/dist/ui/components/mood-status.js +34 -0
  134. package/dist/ui/components/mood-status.js.map +1 -0
  135. package/dist/ui/components/persona-status.d.ts +7 -0
  136. package/dist/ui/components/persona-status.js +34 -0
  137. package/dist/ui/components/persona-status.js.map +1 -0
  138. package/dist/ui/shared/max-sized-box.d.ts +8 -0
  139. package/dist/ui/shared/max-sized-box.js +6 -0
  140. package/dist/ui/shared/max-sized-box.js.map +1 -0
  141. package/dist/ui/utils/code-colorizer.d.ts +2 -0
  142. package/dist/ui/utils/code-colorizer.js +7 -0
  143. package/dist/ui/utils/code-colorizer.js.map +1 -0
  144. package/dist/ui/utils/colors.d.ts +14 -0
  145. package/dist/ui/utils/colors.js +15 -0
  146. package/dist/ui/utils/colors.js.map +1 -0
  147. package/dist/ui/utils/markdown-renderer.d.ts +4 -0
  148. package/dist/ui/utils/markdown-renderer.js +40 -0
  149. package/dist/ui/utils/markdown-renderer.js.map +1 -0
  150. package/dist/utils/auth-helper.d.ts +63 -0
  151. package/dist/utils/auth-helper.js +129 -0
  152. package/dist/utils/auth-helper.js.map +1 -0
  153. package/dist/utils/chat-history-manager-sqlite.d.ts +92 -0
  154. package/dist/utils/chat-history-manager-sqlite.js +334 -0
  155. package/dist/utils/chat-history-manager-sqlite.js.map +1 -0
  156. package/dist/utils/chat-history-manager.d.ts +87 -0
  157. package/dist/utils/chat-history-manager.js +273 -0
  158. package/dist/utils/chat-history-manager.js.map +1 -0
  159. package/dist/utils/chat-history-manager.json-backup.d.ts +69 -0
  160. package/dist/utils/chat-history-manager.json-backup.js +215 -0
  161. package/dist/utils/chat-history-manager.json-backup.js.map +1 -0
  162. package/dist/utils/confirmation-service.d.ts +46 -0
  163. package/dist/utils/confirmation-service.js +165 -0
  164. package/dist/utils/confirmation-service.js.map +1 -0
  165. package/dist/utils/custom-instructions.d.ts +1 -0
  166. package/dist/utils/custom-instructions.js +30 -0
  167. package/dist/utils/custom-instructions.js.map +1 -0
  168. package/dist/utils/database-connection.d.ts +27 -0
  169. package/dist/utils/database-connection.js +81 -0
  170. package/dist/utils/database-connection.js.map +1 -0
  171. package/dist/utils/database-schema.d.ts +17 -0
  172. package/dist/utils/database-schema.js +93 -0
  173. package/dist/utils/database-schema.js.map +1 -0
  174. package/dist/utils/error-logger.d.ts +13 -0
  175. package/dist/utils/error-logger.js +56 -0
  176. package/dist/utils/error-logger.js.map +1 -0
  177. package/dist/utils/hook-executor.d.ts +59 -0
  178. package/dist/utils/hook-executor.js +351 -0
  179. package/dist/utils/hook-executor.js.map +1 -0
  180. package/dist/utils/model-config.d.ts +28 -0
  181. package/dist/utils/model-config.js +42 -0
  182. package/dist/utils/model-config.js.map +1 -0
  183. package/dist/utils/path-utils.d.ts +4 -0
  184. package/dist/utils/path-utils.js +12 -0
  185. package/dist/utils/path-utils.js.map +1 -0
  186. package/dist/utils/settings-manager.d.ts +169 -0
  187. package/dist/utils/settings-manager.js +403 -0
  188. package/dist/utils/settings-manager.js.map +1 -0
  189. package/dist/utils/settings.d.ts +1 -0
  190. package/dist/utils/settings.js +4 -0
  191. package/dist/utils/settings.js.map +1 -0
  192. package/dist/utils/slash-commands.d.ts +25 -0
  193. package/dist/utils/slash-commands.js +454 -0
  194. package/dist/utils/slash-commands.js.map +1 -0
  195. package/dist/utils/startup-hook.d.ts +13 -0
  196. package/dist/utils/startup-hook.js +44 -0
  197. package/dist/utils/startup-hook.js.map +1 -0
  198. package/dist/utils/text-utils.d.ts +80 -0
  199. package/dist/utils/text-utils.js +182 -0
  200. package/dist/utils/text-utils.js.map +1 -0
  201. package/dist/utils/token-counter.d.ts +33 -0
  202. package/dist/utils/token-counter.js +78 -0
  203. package/dist/utils/token-counter.js.map +1 -0
  204. 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
+ };