@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 @@
1
+ {"version":3,"file":"chat-history-manager-sqlite.js","sourceRoot":"","sources":["../../src/utils/chat-history-manager-sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import type { ChatEntry } from "../agent/grok-agent.js";
2
+ export interface SessionState {
3
+ session: string;
4
+ persona: string;
5
+ personaColor: string;
6
+ mood: string;
7
+ moodColor: string;
8
+ activeTask: string;
9
+ activeTaskAction: string;
10
+ activeTaskColor: string;
11
+ cwd: string;
12
+ contextCurrent: number;
13
+ contextMax: number;
14
+ backend: string;
15
+ baseUrl: string;
16
+ apiKeyEnvVar: string;
17
+ model: string;
18
+ }
19
+ export interface ContextData {
20
+ systemPrompt: string;
21
+ chatHistory: ChatEntry[];
22
+ sessionState?: SessionState;
23
+ }
24
+ /**
25
+ * Manages chat history persistence to ~/.grok/chat-history.json or custom path
26
+ */
27
+ export declare class ChatHistoryManager {
28
+ private static instance;
29
+ private static customHistoryFilePath;
30
+ private historyFilePath;
31
+ private constructor();
32
+ /**
33
+ * Set a custom history file path (must be called before getInstance)
34
+ */
35
+ static setCustomHistoryPath(filePath: string): void;
36
+ static getInstance(): ChatHistoryManager;
37
+ /**
38
+ * Get the context file path (main history JSON file)
39
+ */
40
+ getContextFilePath(): string;
41
+ private ensureHistoryDirExists;
42
+ /**
43
+ * Deserialize chat entries from parsed JSON
44
+ */
45
+ private deserializeChatEntries;
46
+ /**
47
+ * Load context (system prompt + chat history)
48
+ * Supports both old format (array) and new format (object)
49
+ */
50
+ loadContext(): ContextData;
51
+ /**
52
+ * Serialize chat entries for JSON storage
53
+ */
54
+ private serializeChatEntries;
55
+ /**
56
+ * Save context (system prompt + chat history + session state) in new format
57
+ */
58
+ saveContext(systemPrompt: string, chatHistory: ChatEntry[], sessionState?: SessionState): void;
59
+ /**
60
+ * Save raw messages log to file (OpenAI format messages)
61
+ */
62
+ saveMessages(messages: any[]): void;
63
+ /**
64
+ * Create a backup of all session files (history, messages, state, debug log)
65
+ */
66
+ backupHistory(): string | null;
67
+ /**
68
+ * Clear all session files (history, messages, state, debug log) with automatic backup
69
+ */
70
+ clearHistory(): void;
71
+ /**
72
+ * Save session state (persona, mood, task, cwd) to file
73
+ */
74
+ saveSessionState(state: SessionState): void;
75
+ /**
76
+ * Load session state from file
77
+ */
78
+ loadSessionState(): SessionState | null;
79
+ /**
80
+ * Get the debug log file path based on the context file
81
+ */
82
+ getDebugLogPath(): string;
83
+ /**
84
+ * Static method to get debug log path (for use before agent is created)
85
+ */
86
+ static getDebugLogPath(): string;
87
+ }
@@ -0,0 +1,273 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import * as os from "os";
4
+ const HISTORY_FILE_NAME = "chat-history.json";
5
+ const HISTORY_DIR = path.join(os.homedir(), ".grok");
6
+ /**
7
+ * Manages chat history persistence to ~/.grok/chat-history.json or custom path
8
+ */
9
+ export class ChatHistoryManager {
10
+ static instance;
11
+ static customHistoryFilePath = null;
12
+ historyFilePath;
13
+ constructor() {
14
+ this.historyFilePath = ChatHistoryManager.customHistoryFilePath || path.join(HISTORY_DIR, HISTORY_FILE_NAME);
15
+ this.ensureHistoryDirExists();
16
+ }
17
+ /**
18
+ * Set a custom history file path (must be called before getInstance)
19
+ */
20
+ static setCustomHistoryPath(filePath) {
21
+ ChatHistoryManager.customHistoryFilePath = filePath;
22
+ }
23
+ static getInstance() {
24
+ if (!ChatHistoryManager.instance) {
25
+ ChatHistoryManager.instance = new ChatHistoryManager();
26
+ }
27
+ return ChatHistoryManager.instance;
28
+ }
29
+ /**
30
+ * Get the context file path (main history JSON file)
31
+ */
32
+ getContextFilePath() {
33
+ return this.historyFilePath;
34
+ }
35
+ ensureHistoryDirExists() {
36
+ const dir = path.dirname(this.historyFilePath);
37
+ if (!fs.existsSync(dir)) {
38
+ fs.mkdirSync(dir, { recursive: true });
39
+ }
40
+ }
41
+ /**
42
+ * Deserialize chat entries from parsed JSON
43
+ */
44
+ deserializeChatEntries(entries) {
45
+ return entries
46
+ .map((entry) => {
47
+ try {
48
+ if (!entry.type || !entry.timestamp) {
49
+ console.warn("Skipping invalid chat entry:", entry);
50
+ return null;
51
+ }
52
+ return {
53
+ ...entry,
54
+ timestamp: new Date(entry.timestamp),
55
+ };
56
+ }
57
+ catch (entryError) {
58
+ console.warn("Failed to parse chat entry:", entry, entryError);
59
+ return null;
60
+ }
61
+ })
62
+ .filter((entry) => entry !== null);
63
+ }
64
+ /**
65
+ * Load context (system prompt + chat history)
66
+ * Supports both old format (array) and new format (object)
67
+ */
68
+ loadContext() {
69
+ try {
70
+ if (!fs.existsSync(this.historyFilePath)) {
71
+ return { systemPrompt: "", chatHistory: [] };
72
+ }
73
+ const data = fs.readFileSync(this.historyFilePath, "utf-8");
74
+ const parsed = JSON.parse(data);
75
+ // New format: {systemPrompt: string, chatHistory: ChatEntry[], sessionState?: SessionState}
76
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed) && 'systemPrompt' in parsed) {
77
+ const contextData = {
78
+ systemPrompt: parsed.systemPrompt || "",
79
+ chatHistory: this.deserializeChatEntries(parsed.chatHistory || []),
80
+ };
81
+ // Load session state from context if present, otherwise try .state.json
82
+ if (parsed.sessionState) {
83
+ contextData.sessionState = parsed.sessionState;
84
+ }
85
+ else {
86
+ const legacySessionState = this.loadSessionState();
87
+ if (legacySessionState) {
88
+ contextData.sessionState = legacySessionState;
89
+ }
90
+ }
91
+ return contextData;
92
+ }
93
+ // Old format: array of ChatEntry (system message at index 0 is systemPrompt)
94
+ if (Array.isArray(parsed)) {
95
+ const entries = this.deserializeChatEntries(parsed);
96
+ const contextData = {
97
+ systemPrompt: "",
98
+ chatHistory: entries,
99
+ };
100
+ // Only extract system prompt if it's at index 0
101
+ if (entries.length > 0 && entries[0].type === "system") {
102
+ contextData.systemPrompt = entries[0].content;
103
+ contextData.chatHistory = entries.slice(1); // Everything after index 0
104
+ }
105
+ // Load session state from .state.json for backward compatibility
106
+ const legacySessionState = this.loadSessionState();
107
+ if (legacySessionState) {
108
+ contextData.sessionState = legacySessionState;
109
+ }
110
+ return contextData;
111
+ }
112
+ console.warn("Unknown context file format");
113
+ return { systemPrompt: "", chatHistory: [] };
114
+ }
115
+ catch (error) {
116
+ console.warn("Failed to load context:", error);
117
+ return { systemPrompt: "", chatHistory: [] };
118
+ }
119
+ }
120
+ /**
121
+ * Serialize chat entries for JSON storage
122
+ */
123
+ serializeChatEntries(entries) {
124
+ return entries.map(entry => ({
125
+ ...entry,
126
+ timestamp: entry.timestamp instanceof Date
127
+ ? entry.timestamp.toISOString()
128
+ : entry.timestamp, // Already a string
129
+ }));
130
+ }
131
+ /**
132
+ * Save context (system prompt + chat history + session state) in new format
133
+ */
134
+ saveContext(systemPrompt, chatHistory, sessionState) {
135
+ try {
136
+ const contextData = {
137
+ systemPrompt,
138
+ chatHistory: this.serializeChatEntries(chatHistory),
139
+ };
140
+ // Include session state if provided
141
+ if (sessionState) {
142
+ contextData.sessionState = sessionState;
143
+ }
144
+ fs.writeFileSync(this.historyFilePath, JSON.stringify(contextData, null, 2));
145
+ }
146
+ catch (error) {
147
+ console.warn("Failed to save context:", error);
148
+ }
149
+ }
150
+ /**
151
+ * Save raw messages log to file (OpenAI format messages)
152
+ */
153
+ saveMessages(messages) {
154
+ try {
155
+ const messagesFilePath = this.historyFilePath.replace('.json', '.messages.json');
156
+ fs.writeFileSync(messagesFilePath, JSON.stringify(messages, null, 2));
157
+ }
158
+ catch (error) {
159
+ console.warn("Failed to save messages log:", error);
160
+ }
161
+ }
162
+ /**
163
+ * Create a backup of all session files (history, messages, state, debug log)
164
+ */
165
+ backupHistory() {
166
+ try {
167
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
168
+ const backupSuffix = `.backup-${timestamp}.json`;
169
+ let backupPath = null;
170
+ // Backup main history file
171
+ if (fs.existsSync(this.historyFilePath)) {
172
+ backupPath = this.historyFilePath.replace('.json', backupSuffix);
173
+ fs.copyFileSync(this.historyFilePath, backupPath);
174
+ }
175
+ // Backup messages file
176
+ const messagesFilePath = this.historyFilePath.replace('.json', '.messages.json');
177
+ if (fs.existsSync(messagesFilePath)) {
178
+ const messagesBackupPath = messagesFilePath.replace('.json', backupSuffix);
179
+ fs.copyFileSync(messagesFilePath, messagesBackupPath);
180
+ }
181
+ // Backup state file
182
+ const stateFilePath = this.historyFilePath.replace('.json', '.state.json');
183
+ if (fs.existsSync(stateFilePath)) {
184
+ const stateBackupPath = stateFilePath.replace('.json', backupSuffix);
185
+ fs.copyFileSync(stateFilePath, stateBackupPath);
186
+ }
187
+ // Backup debug log file
188
+ const debugLogPath = this.historyFilePath.replace('.json', '.debug.log');
189
+ if (fs.existsSync(debugLogPath)) {
190
+ const debugBackupPath = debugLogPath.replace('.log', `.backup-${timestamp}.log`);
191
+ fs.copyFileSync(debugLogPath, debugBackupPath);
192
+ }
193
+ return backupPath;
194
+ }
195
+ catch (error) {
196
+ console.warn("Failed to backup chat history:", error);
197
+ return null;
198
+ }
199
+ }
200
+ /**
201
+ * Clear all session files (history, messages, state, debug log) with automatic backup
202
+ */
203
+ clearHistory() {
204
+ try {
205
+ // First, create a backup
206
+ const backupPath = this.backupHistory();
207
+ // Then clear the files
208
+ if (fs.existsSync(this.historyFilePath)) {
209
+ fs.unlinkSync(this.historyFilePath);
210
+ }
211
+ const messagesFilePath = this.historyFilePath.replace('.json', '.messages.json');
212
+ if (fs.existsSync(messagesFilePath)) {
213
+ fs.unlinkSync(messagesFilePath);
214
+ }
215
+ // Also clear session state
216
+ const stateFilePath = this.historyFilePath.replace('.json', '.state.json');
217
+ if (fs.existsSync(stateFilePath)) {
218
+ fs.unlinkSync(stateFilePath);
219
+ }
220
+ // Also clear debug log
221
+ const debugLogPath = this.historyFilePath.replace('.json', '.debug.log');
222
+ if (fs.existsSync(debugLogPath)) {
223
+ fs.unlinkSync(debugLogPath);
224
+ }
225
+ }
226
+ catch (error) {
227
+ console.warn("Failed to clear chat history:", error);
228
+ }
229
+ }
230
+ /**
231
+ * Save session state (persona, mood, task, cwd) to file
232
+ */
233
+ saveSessionState(state) {
234
+ try {
235
+ const stateFilePath = this.historyFilePath.replace('.json', '.state.json');
236
+ fs.writeFileSync(stateFilePath, JSON.stringify(state, null, 2) + '\n');
237
+ }
238
+ catch (error) {
239
+ console.warn("Failed to save session state:", error);
240
+ }
241
+ }
242
+ /**
243
+ * Load session state from file
244
+ */
245
+ loadSessionState() {
246
+ try {
247
+ const stateFilePath = this.historyFilePath.replace('.json', '.state.json');
248
+ if (!fs.existsSync(stateFilePath)) {
249
+ return null;
250
+ }
251
+ const data = fs.readFileSync(stateFilePath, "utf-8");
252
+ return JSON.parse(data);
253
+ }
254
+ catch (error) {
255
+ console.warn("Failed to load session state:", error);
256
+ return null;
257
+ }
258
+ }
259
+ /**
260
+ * Get the debug log file path based on the context file
261
+ */
262
+ getDebugLogPath() {
263
+ return this.historyFilePath.replace('.json', '.debug.log');
264
+ }
265
+ /**
266
+ * Static method to get debug log path (for use before agent is created)
267
+ */
268
+ static getDebugLogPath() {
269
+ const instance = ChatHistoryManager.getInstance();
270
+ return instance.getDebugLogPath();
271
+ }
272
+ }
273
+ //# sourceMappingURL=chat-history-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-history-manager.js","sourceRoot":"","sources":["../../src/utils/chat-history-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { ChatEntry } from "../agent/grok-agent.js";
2
+ export interface SessionState {
3
+ session: string;
4
+ persona: string;
5
+ personaColor: string;
6
+ mood: string;
7
+ moodColor: string;
8
+ activeTask: string;
9
+ activeTaskAction: string;
10
+ activeTaskColor: string;
11
+ cwd: string;
12
+ contextCurrent: number;
13
+ contextMax: number;
14
+ }
15
+ /**
16
+ * Manages chat history persistence to ~/.grok/chat-history.json or custom path
17
+ */
18
+ export declare class ChatHistoryManager {
19
+ private static instance;
20
+ private static customHistoryFilePath;
21
+ private historyFilePath;
22
+ private constructor();
23
+ /**
24
+ * Set a custom history file path (must be called before getInstance)
25
+ */
26
+ static setCustomHistoryPath(filePath: string): void;
27
+ static getInstance(): ChatHistoryManager;
28
+ /**
29
+ * Get the context file path (main history JSON file)
30
+ */
31
+ getContextFilePath(): string;
32
+ private ensureHistoryDirExists;
33
+ /**
34
+ * Load chat history from file
35
+ */
36
+ loadHistory(): ChatEntry[];
37
+ /**
38
+ * Save chat history to file
39
+ */
40
+ saveHistory(history: ChatEntry[]): void;
41
+ /**
42
+ * Save raw messages log to file (OpenAI format messages)
43
+ */
44
+ saveMessages(messages: any[]): void;
45
+ /**
46
+ * Create a backup of all session files (history, messages, state, debug log)
47
+ */
48
+ backupHistory(): string | null;
49
+ /**
50
+ * Clear all session files (history, messages, state, debug log) with automatic backup
51
+ */
52
+ clearHistory(): void;
53
+ /**
54
+ * Save session state (persona, mood, task, cwd) to file
55
+ */
56
+ saveSessionState(state: SessionState): void;
57
+ /**
58
+ * Load session state from file
59
+ */
60
+ loadSessionState(): SessionState | null;
61
+ /**
62
+ * Get the debug log file path based on the context file
63
+ */
64
+ getDebugLogPath(): string;
65
+ /**
66
+ * Static method to get debug log path (for use before agent is created)
67
+ */
68
+ static getDebugLogPath(): string;
69
+ }
@@ -0,0 +1,215 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import * as os from "os";
4
+ const HISTORY_FILE_NAME = "chat-history.json";
5
+ const HISTORY_DIR = path.join(os.homedir(), ".grok");
6
+ /**
7
+ * Manages chat history persistence to ~/.grok/chat-history.json or custom path
8
+ */
9
+ export class ChatHistoryManager {
10
+ static instance;
11
+ static customHistoryFilePath = null;
12
+ historyFilePath;
13
+ constructor() {
14
+ this.historyFilePath = ChatHistoryManager.customHistoryFilePath || path.join(HISTORY_DIR, HISTORY_FILE_NAME);
15
+ this.ensureHistoryDirExists();
16
+ }
17
+ /**
18
+ * Set a custom history file path (must be called before getInstance)
19
+ */
20
+ static setCustomHistoryPath(filePath) {
21
+ ChatHistoryManager.customHistoryFilePath = filePath;
22
+ }
23
+ static getInstance() {
24
+ if (!ChatHistoryManager.instance) {
25
+ ChatHistoryManager.instance = new ChatHistoryManager();
26
+ }
27
+ return ChatHistoryManager.instance;
28
+ }
29
+ /**
30
+ * Get the context file path (main history JSON file)
31
+ */
32
+ getContextFilePath() {
33
+ return this.historyFilePath;
34
+ }
35
+ ensureHistoryDirExists() {
36
+ const dir = path.dirname(this.historyFilePath);
37
+ if (!fs.existsSync(dir)) {
38
+ fs.mkdirSync(dir, { recursive: true });
39
+ }
40
+ }
41
+ /**
42
+ * Load chat history from file
43
+ */
44
+ loadHistory() {
45
+ try {
46
+ if (!fs.existsSync(this.historyFilePath)) {
47
+ return [];
48
+ }
49
+ const data = fs.readFileSync(this.historyFilePath, "utf-8");
50
+ const parsed = JSON.parse(data);
51
+ // Deserialize dates and validate entries
52
+ return parsed
53
+ .map((entry) => {
54
+ try {
55
+ if (!entry.type || !entry.timestamp) {
56
+ console.warn("Skipping invalid chat entry:", entry);
57
+ return null;
58
+ }
59
+ return {
60
+ ...entry,
61
+ timestamp: new Date(entry.timestamp),
62
+ };
63
+ }
64
+ catch (entryError) {
65
+ console.warn("Failed to parse chat entry:", entry, entryError);
66
+ return null;
67
+ }
68
+ })
69
+ .filter((entry) => entry !== null);
70
+ }
71
+ catch (error) {
72
+ console.warn("Failed to load chat history:", error);
73
+ return [];
74
+ }
75
+ }
76
+ /**
77
+ * Save chat history to file
78
+ */
79
+ saveHistory(history) {
80
+ try {
81
+ // Serialize dates
82
+ const serialized = history.map(entry => ({
83
+ ...entry,
84
+ timestamp: entry.timestamp.toISOString(),
85
+ }));
86
+ fs.writeFileSync(this.historyFilePath, JSON.stringify(serialized, null, 2));
87
+ }
88
+ catch (error) {
89
+ console.warn("Failed to save chat history:", error);
90
+ }
91
+ }
92
+ /**
93
+ * Save raw messages log to file (OpenAI format messages)
94
+ */
95
+ saveMessages(messages) {
96
+ try {
97
+ const messagesFilePath = this.historyFilePath.replace('.json', '.messages.json');
98
+ fs.writeFileSync(messagesFilePath, JSON.stringify(messages, null, 2));
99
+ }
100
+ catch (error) {
101
+ console.warn("Failed to save messages log:", error);
102
+ }
103
+ }
104
+ /**
105
+ * Create a backup of all session files (history, messages, state, debug log)
106
+ */
107
+ backupHistory() {
108
+ try {
109
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
110
+ const backupSuffix = `.backup-${timestamp}.json`;
111
+ let backupPath = null;
112
+ // Backup main history file
113
+ if (fs.existsSync(this.historyFilePath)) {
114
+ backupPath = this.historyFilePath.replace('.json', backupSuffix);
115
+ fs.copyFileSync(this.historyFilePath, backupPath);
116
+ }
117
+ // Backup messages file
118
+ const messagesFilePath = this.historyFilePath.replace('.json', '.messages.json');
119
+ if (fs.existsSync(messagesFilePath)) {
120
+ const messagesBackupPath = messagesFilePath.replace('.json', backupSuffix);
121
+ fs.copyFileSync(messagesFilePath, messagesBackupPath);
122
+ }
123
+ // Backup state file
124
+ const stateFilePath = this.historyFilePath.replace('.json', '.state.json');
125
+ if (fs.existsSync(stateFilePath)) {
126
+ const stateBackupPath = stateFilePath.replace('.json', backupSuffix);
127
+ fs.copyFileSync(stateFilePath, stateBackupPath);
128
+ }
129
+ // Backup debug log file
130
+ const debugLogPath = this.historyFilePath.replace('.json', '.debug.log');
131
+ if (fs.existsSync(debugLogPath)) {
132
+ const debugBackupPath = debugLogPath.replace('.log', `.backup-${timestamp}.log`);
133
+ fs.copyFileSync(debugLogPath, debugBackupPath);
134
+ }
135
+ return backupPath;
136
+ }
137
+ catch (error) {
138
+ console.warn("Failed to backup chat history:", error);
139
+ return null;
140
+ }
141
+ }
142
+ /**
143
+ * Clear all session files (history, messages, state, debug log) with automatic backup
144
+ */
145
+ clearHistory() {
146
+ try {
147
+ // First, create a backup
148
+ const backupPath = this.backupHistory();
149
+ // Then clear the files
150
+ if (fs.existsSync(this.historyFilePath)) {
151
+ fs.unlinkSync(this.historyFilePath);
152
+ }
153
+ const messagesFilePath = this.historyFilePath.replace('.json', '.messages.json');
154
+ if (fs.existsSync(messagesFilePath)) {
155
+ fs.unlinkSync(messagesFilePath);
156
+ }
157
+ // Also clear session state
158
+ const stateFilePath = this.historyFilePath.replace('.json', '.state.json');
159
+ if (fs.existsSync(stateFilePath)) {
160
+ fs.unlinkSync(stateFilePath);
161
+ }
162
+ // Also clear debug log
163
+ const debugLogPath = this.historyFilePath.replace('.json', '.debug.log');
164
+ if (fs.existsSync(debugLogPath)) {
165
+ fs.unlinkSync(debugLogPath);
166
+ }
167
+ }
168
+ catch (error) {
169
+ console.warn("Failed to clear chat history:", error);
170
+ }
171
+ }
172
+ /**
173
+ * Save session state (persona, mood, task, cwd) to file
174
+ */
175
+ saveSessionState(state) {
176
+ try {
177
+ const stateFilePath = this.historyFilePath.replace('.json', '.state.json');
178
+ fs.writeFileSync(stateFilePath, JSON.stringify(state, null, 2));
179
+ }
180
+ catch (error) {
181
+ console.warn("Failed to save session state:", error);
182
+ }
183
+ }
184
+ /**
185
+ * Load session state from file
186
+ */
187
+ loadSessionState() {
188
+ try {
189
+ const stateFilePath = this.historyFilePath.replace('.json', '.state.json');
190
+ if (!fs.existsSync(stateFilePath)) {
191
+ return null;
192
+ }
193
+ const data = fs.readFileSync(stateFilePath, "utf-8");
194
+ return JSON.parse(data);
195
+ }
196
+ catch (error) {
197
+ console.warn("Failed to load session state:", error);
198
+ return null;
199
+ }
200
+ }
201
+ /**
202
+ * Get the debug log file path based on the context file
203
+ */
204
+ getDebugLogPath() {
205
+ return this.historyFilePath.replace('.json', '.debug.log');
206
+ }
207
+ /**
208
+ * Static method to get debug log path (for use before agent is created)
209
+ */
210
+ static getDebugLogPath() {
211
+ const instance = ChatHistoryManager.getInstance();
212
+ return instance.getDebugLogPath();
213
+ }
214
+ }
215
+ //# sourceMappingURL=chat-history-manager.json-backup.js.map