@wundr.io/cli 1.0.12 → 1.0.14

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 (233) hide show
  1. package/dist/ai/ai-service.d.ts +152 -0
  2. package/dist/ai/ai-service.d.ts.map +1 -0
  3. package/dist/ai/ai-service.js +430 -0
  4. package/dist/ai/ai-service.js.map +1 -0
  5. package/dist/ai/claude-client.d.ts +130 -0
  6. package/dist/ai/claude-client.d.ts.map +1 -0
  7. package/dist/ai/claude-client.js +340 -0
  8. package/dist/ai/claude-client.js.map +1 -0
  9. package/dist/ai/conversation-manager.d.ts +164 -0
  10. package/dist/ai/conversation-manager.d.ts.map +1 -0
  11. package/dist/ai/conversation-manager.js +614 -0
  12. package/dist/ai/conversation-manager.js.map +1 -0
  13. package/dist/ai/index.d.ts +5 -0
  14. package/dist/ai/index.d.ts.map +1 -0
  15. package/dist/ai/index.js +8 -0
  16. package/dist/ai/index.js.map +1 -0
  17. package/dist/cli.d.ts +36 -0
  18. package/dist/cli.d.ts.map +1 -0
  19. package/dist/cli.js +192 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/commands/ai.d.ts +89 -0
  22. package/dist/commands/ai.d.ts.map +1 -0
  23. package/dist/commands/ai.js +954 -0
  24. package/dist/commands/ai.js.map +1 -0
  25. package/dist/commands/alignment.d.ts +78 -0
  26. package/dist/commands/alignment.d.ts.map +1 -0
  27. package/dist/commands/alignment.js +817 -0
  28. package/dist/commands/alignment.js.map +1 -0
  29. package/dist/commands/analyze-optimized.d.ts +14 -0
  30. package/dist/commands/analyze-optimized.d.ts.map +1 -0
  31. package/dist/commands/analyze-optimized.js +609 -0
  32. package/dist/commands/analyze-optimized.js.map +1 -0
  33. package/dist/commands/analyze.d.ts +65 -0
  34. package/dist/commands/analyze.d.ts.map +1 -0
  35. package/dist/commands/analyze.js +435 -0
  36. package/dist/commands/analyze.js.map +1 -0
  37. package/dist/commands/batch.d.ts +93 -0
  38. package/dist/commands/batch.d.ts.map +1 -0
  39. package/dist/commands/batch.js +854 -0
  40. package/dist/commands/batch.js.map +1 -0
  41. package/dist/commands/chat.d.ts +72 -0
  42. package/dist/commands/chat.d.ts.map +1 -0
  43. package/dist/commands/chat.js +678 -0
  44. package/dist/commands/chat.js.map +1 -0
  45. package/dist/commands/claude-init.d.ts +28 -0
  46. package/dist/commands/claude-init.d.ts.map +1 -0
  47. package/dist/commands/claude-init.js +591 -0
  48. package/dist/commands/claude-init.js.map +1 -0
  49. package/dist/commands/claude-setup.d.ts +119 -0
  50. package/dist/commands/claude-setup.d.ts.map +1 -0
  51. package/dist/commands/claude-setup.js +1079 -0
  52. package/dist/commands/claude-setup.js.map +1 -0
  53. package/dist/commands/computer-setup.d.ts +8 -0
  54. package/dist/commands/computer-setup.d.ts.map +1 -0
  55. package/dist/commands/computer-setup.js +877 -0
  56. package/dist/commands/computer-setup.js.map +1 -0
  57. package/dist/commands/create-command.d.ts +7 -0
  58. package/dist/commands/create-command.d.ts.map +1 -0
  59. package/dist/commands/create-command.js +158 -0
  60. package/dist/commands/create-command.js.map +1 -0
  61. package/dist/commands/create.d.ts +74 -0
  62. package/dist/commands/create.d.ts.map +1 -0
  63. package/dist/commands/create.js +556 -0
  64. package/dist/commands/create.js.map +1 -0
  65. package/dist/commands/dashboard.d.ts +91 -0
  66. package/dist/commands/dashboard.d.ts.map +1 -0
  67. package/dist/commands/dashboard.js +538 -0
  68. package/dist/commands/dashboard.js.map +1 -0
  69. package/dist/commands/govern.d.ts +70 -0
  70. package/dist/commands/govern.d.ts.map +1 -0
  71. package/dist/commands/govern.js +481 -0
  72. package/dist/commands/govern.js.map +1 -0
  73. package/dist/commands/governance.d.ts +17 -0
  74. package/dist/commands/governance.d.ts.map +1 -0
  75. package/dist/commands/governance.js +703 -0
  76. package/dist/commands/governance.js.map +1 -0
  77. package/dist/commands/guardian.d.ts +20 -0
  78. package/dist/commands/guardian.d.ts.map +1 -0
  79. package/dist/commands/guardian.js +597 -0
  80. package/dist/commands/guardian.js.map +1 -0
  81. package/dist/commands/init.d.ts +59 -0
  82. package/dist/commands/init.d.ts.map +1 -0
  83. package/dist/commands/init.js +650 -0
  84. package/dist/commands/init.js.map +1 -0
  85. package/dist/commands/orchestrator.d.ts +7 -0
  86. package/dist/commands/orchestrator.d.ts.map +1 -0
  87. package/dist/commands/orchestrator.js +578 -0
  88. package/dist/commands/orchestrator.js.map +1 -0
  89. package/dist/commands/performance-optimizer.d.ts +30 -0
  90. package/dist/commands/performance-optimizer.d.ts.map +1 -0
  91. package/dist/commands/performance-optimizer.js +650 -0
  92. package/dist/commands/performance-optimizer.js.map +1 -0
  93. package/dist/commands/plugins.d.ts +87 -0
  94. package/dist/commands/plugins.d.ts.map +1 -0
  95. package/dist/commands/plugins.js +685 -0
  96. package/dist/commands/plugins.js.map +1 -0
  97. package/dist/commands/rag.d.ts +7 -0
  98. package/dist/commands/rag.d.ts.map +1 -0
  99. package/dist/commands/rag.js +751 -0
  100. package/dist/commands/rag.js.map +1 -0
  101. package/dist/commands/session.d.ts +41 -0
  102. package/dist/commands/session.d.ts.map +1 -0
  103. package/dist/commands/session.js +441 -0
  104. package/dist/commands/session.js.map +1 -0
  105. package/dist/commands/setup.d.ts +24 -0
  106. package/dist/commands/setup.d.ts.map +1 -0
  107. package/dist/commands/setup.js +172 -0
  108. package/dist/commands/setup.js.map +1 -0
  109. package/dist/commands/test-init.d.ts +9 -0
  110. package/dist/commands/test-init.d.ts.map +1 -0
  111. package/dist/commands/test-init.js +222 -0
  112. package/dist/commands/test-init.js.map +1 -0
  113. package/dist/commands/test.d.ts +25 -0
  114. package/dist/commands/test.d.ts.map +1 -0
  115. package/dist/commands/test.js +217 -0
  116. package/dist/commands/test.js.map +1 -0
  117. package/dist/commands/watch.d.ts +76 -0
  118. package/dist/commands/watch.d.ts.map +1 -0
  119. package/dist/commands/watch.js +613 -0
  120. package/dist/commands/watch.js.map +1 -0
  121. package/dist/commands/worktree.d.ts +63 -0
  122. package/dist/commands/worktree.d.ts.map +1 -0
  123. package/dist/commands/worktree.js +774 -0
  124. package/dist/commands/worktree.js.map +1 -0
  125. package/dist/context/context-manager.d.ts +155 -0
  126. package/dist/context/context-manager.d.ts.map +1 -0
  127. package/dist/context/context-manager.js +383 -0
  128. package/dist/context/context-manager.js.map +1 -0
  129. package/dist/context/index.d.ts +3 -0
  130. package/dist/context/index.d.ts.map +1 -0
  131. package/dist/context/index.js +6 -0
  132. package/dist/context/index.js.map +1 -0
  133. package/dist/context/session-manager.d.ts +207 -0
  134. package/dist/context/session-manager.d.ts.map +1 -0
  135. package/dist/context/session-manager.js +686 -0
  136. package/dist/context/session-manager.js.map +1 -0
  137. package/dist/framework/command-interface.d.ts +349 -0
  138. package/dist/framework/command-interface.d.ts.map +1 -0
  139. package/dist/framework/command-interface.js +101 -0
  140. package/dist/framework/command-interface.js.map +1 -0
  141. package/dist/framework/command-registry.d.ts +173 -0
  142. package/dist/framework/command-registry.d.ts.map +1 -0
  143. package/dist/framework/command-registry.js +734 -0
  144. package/dist/framework/command-registry.js.map +1 -0
  145. package/dist/framework/completion-exporter.d.ts +79 -0
  146. package/dist/framework/completion-exporter.d.ts.map +1 -0
  147. package/dist/framework/completion-exporter.js +259 -0
  148. package/dist/framework/completion-exporter.js.map +1 -0
  149. package/dist/framework/debug-logger.d.ts +163 -0
  150. package/dist/framework/debug-logger.d.ts.map +1 -0
  151. package/dist/framework/debug-logger.js +373 -0
  152. package/dist/framework/debug-logger.js.map +1 -0
  153. package/dist/framework/error-handler.d.ts +196 -0
  154. package/dist/framework/error-handler.d.ts.map +1 -0
  155. package/dist/framework/error-handler.js +613 -0
  156. package/dist/framework/error-handler.js.map +1 -0
  157. package/dist/framework/help-generator.d.ts +78 -0
  158. package/dist/framework/help-generator.d.ts.map +1 -0
  159. package/dist/framework/help-generator.js +414 -0
  160. package/dist/framework/help-generator.js.map +1 -0
  161. package/dist/framework/index.d.ts +62 -0
  162. package/dist/framework/index.d.ts.map +1 -0
  163. package/dist/framework/index.js +95 -0
  164. package/dist/framework/index.js.map +1 -0
  165. package/dist/framework/interactive-repl.d.ts +138 -0
  166. package/dist/framework/interactive-repl.d.ts.map +1 -0
  167. package/dist/framework/interactive-repl.js +567 -0
  168. package/dist/framework/interactive-repl.js.map +1 -0
  169. package/dist/framework/output-formatter.d.ts +274 -0
  170. package/dist/framework/output-formatter.d.ts.map +1 -0
  171. package/dist/framework/output-formatter.js +545 -0
  172. package/dist/framework/output-formatter.js.map +1 -0
  173. package/dist/framework/progress-manager.d.ts +192 -0
  174. package/dist/framework/progress-manager.d.ts.map +1 -0
  175. package/dist/framework/progress-manager.js +408 -0
  176. package/dist/framework/progress-manager.js.map +1 -0
  177. package/dist/index.d.ts +8 -0
  178. package/dist/index.d.ts.map +1 -0
  179. package/dist/index.js +51 -0
  180. package/dist/index.js.map +1 -0
  181. package/dist/interactive/interactive-mode.d.ts +76 -0
  182. package/dist/interactive/interactive-mode.d.ts.map +1 -0
  183. package/dist/interactive/interactive-mode.js +732 -0
  184. package/dist/interactive/interactive-mode.js.map +1 -0
  185. package/dist/nlp/command-mapper.d.ts +174 -0
  186. package/dist/nlp/command-mapper.d.ts.map +1 -0
  187. package/dist/nlp/command-mapper.js +624 -0
  188. package/dist/nlp/command-mapper.js.map +1 -0
  189. package/dist/nlp/command-parser.d.ts +106 -0
  190. package/dist/nlp/command-parser.d.ts.map +1 -0
  191. package/dist/nlp/command-parser.js +417 -0
  192. package/dist/nlp/command-parser.js.map +1 -0
  193. package/dist/nlp/index.d.ts +5 -0
  194. package/dist/nlp/index.d.ts.map +1 -0
  195. package/dist/nlp/index.js +8 -0
  196. package/dist/nlp/index.js.map +1 -0
  197. package/dist/nlp/intent-classifier.d.ts +59 -0
  198. package/dist/nlp/intent-classifier.d.ts.map +1 -0
  199. package/dist/nlp/intent-classifier.js +384 -0
  200. package/dist/nlp/intent-classifier.js.map +1 -0
  201. package/dist/nlp/intent-parser.d.ts +152 -0
  202. package/dist/nlp/intent-parser.d.ts.map +1 -0
  203. package/dist/nlp/intent-parser.js +746 -0
  204. package/dist/nlp/intent-parser.js.map +1 -0
  205. package/dist/plugins/plugin-manager.d.ts +121 -0
  206. package/dist/plugins/plugin-manager.d.ts.map +1 -0
  207. package/dist/plugins/plugin-manager.js +606 -0
  208. package/dist/plugins/plugin-manager.js.map +1 -0
  209. package/dist/types/index.d.ts +224 -0
  210. package/dist/types/index.d.ts.map +1 -0
  211. package/dist/types/index.js +3 -0
  212. package/dist/types/index.js.map +1 -0
  213. package/dist/utils/backup-rollback-manager.d.ts +72 -0
  214. package/dist/utils/backup-rollback-manager.d.ts.map +1 -0
  215. package/dist/utils/backup-rollback-manager.js +288 -0
  216. package/dist/utils/backup-rollback-manager.js.map +1 -0
  217. package/dist/utils/claude-config-installer.d.ts +98 -0
  218. package/dist/utils/claude-config-installer.d.ts.map +1 -0
  219. package/dist/utils/claude-config-installer.js +678 -0
  220. package/dist/utils/claude-config-installer.js.map +1 -0
  221. package/dist/utils/config-manager.d.ts +73 -0
  222. package/dist/utils/config-manager.d.ts.map +1 -0
  223. package/dist/utils/config-manager.js +339 -0
  224. package/dist/utils/config-manager.js.map +1 -0
  225. package/dist/utils/error-handler.d.ts +46 -0
  226. package/dist/utils/error-handler.d.ts.map +1 -0
  227. package/dist/utils/error-handler.js +169 -0
  228. package/dist/utils/error-handler.js.map +1 -0
  229. package/dist/utils/logger.d.ts +25 -0
  230. package/dist/utils/logger.d.ts.map +1 -0
  231. package/dist/utils/logger.js +105 -0
  232. package/dist/utils/logger.js.map +1 -0
  233. package/package.json +6 -6
@@ -0,0 +1,678 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChatCommands = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const path_1 = tslib_1.__importDefault(require("path"));
6
+ const chalk_1 = tslib_1.__importDefault(require("chalk"));
7
+ const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
8
+ const inquirer_1 = tslib_1.__importDefault(require("inquirer"));
9
+ const ai_service_1 = require("../ai/ai-service");
10
+ const error_handler_1 = require("../utils/error-handler");
11
+ const logger_1 = require("../utils/logger");
12
+ /**
13
+ * Chat commands for natural language interface
14
+ */
15
+ class ChatCommands {
16
+ program;
17
+ configManager;
18
+ pluginManager;
19
+ activeSessions = new Map();
20
+ aiService;
21
+ constructor(program, configManager, pluginManager) {
22
+ this.program = program;
23
+ this.configManager = configManager;
24
+ this.pluginManager = pluginManager;
25
+ this.aiService = new ai_service_1.AIService(configManager);
26
+ this.registerCommands();
27
+ }
28
+ registerCommands() {
29
+ const chatCmd = this.program
30
+ .command('chat')
31
+ .alias('c')
32
+ .description('natural language chat interface');
33
+ // Start chat session
34
+ chatCmd
35
+ .command('start')
36
+ .description('start a new chat session')
37
+ .option('--model <model>', 'AI model to use', 'claude-3')
38
+ .option('--context <path>', 'include project context from path')
39
+ .option('--persona <persona>', 'AI persona (developer, architect, reviewer)', 'developer')
40
+ .option('--session-name <name>', 'custom session name')
41
+ .action(async (options) => {
42
+ await this.startChatSession(options);
43
+ });
44
+ // Resume chat session
45
+ chatCmd
46
+ .command('resume <sessionId>')
47
+ .description('resume existing chat session')
48
+ .action(async (sessionId) => {
49
+ await this.resumeChatSession(sessionId);
50
+ });
51
+ // List chat sessions
52
+ chatCmd
53
+ .command('list')
54
+ .alias('ls')
55
+ .description('list chat sessions')
56
+ .option('--active-only', 'show only active sessions')
57
+ .action(async (options) => {
58
+ await this.listChatSessions(options);
59
+ });
60
+ // Send single message
61
+ chatCmd
62
+ .command('ask <message>')
63
+ .description('send a single message and get response')
64
+ .option('--session <sessionId>', 'use specific session')
65
+ .option('--model <model>', 'AI model to use')
66
+ .option('--context <path>', 'include context from path')
67
+ .action(async (message, options) => {
68
+ await this.askSingleQuestion(message, options);
69
+ });
70
+ // Export chat session
71
+ chatCmd
72
+ .command('export <sessionId>')
73
+ .description('export chat session')
74
+ .option('--format <format>', 'export format (json, markdown, txt)', 'markdown')
75
+ .option('--output <path>', 'output file path')
76
+ .action(async (sessionId, options) => {
77
+ await this.exportChatSession(sessionId, options);
78
+ });
79
+ // Import chat session
80
+ chatCmd
81
+ .command('import <file>')
82
+ .description('import chat session')
83
+ .option('--format <format>', 'import format (json, markdown)')
84
+ .action(async (file, options) => {
85
+ await this.importChatSession(file, options);
86
+ });
87
+ // Delete chat session
88
+ chatCmd
89
+ .command('delete <sessionId>')
90
+ .description('delete chat session')
91
+ .option('--force', 'skip confirmation')
92
+ .action(async (sessionId, options) => {
93
+ await this.deleteChatSession(sessionId, options);
94
+ });
95
+ // Configure chat
96
+ chatCmd.command('config').description('configure chat settings');
97
+ chatCmd
98
+ .command('config set <key> <value>')
99
+ .description('set chat configuration')
100
+ .action(async (key, value) => {
101
+ await this.setChatConfig(key, value);
102
+ });
103
+ chatCmd
104
+ .command('config get [key]')
105
+ .description('get chat configuration')
106
+ .action(async (key) => {
107
+ await this.getChatConfig(key);
108
+ });
109
+ // Chat with files
110
+ chatCmd
111
+ .command('file <file>')
112
+ .description('chat about specific file')
113
+ .option('--action <action>', 'action to perform (explain, review, improve)', 'explain')
114
+ .option('--model <model>', 'AI model to use')
115
+ .action(async (file, options) => {
116
+ await this.chatWithFile(file, options);
117
+ });
118
+ // Chat with code
119
+ chatCmd
120
+ .command('code')
121
+ .description('chat about code from clipboard or input')
122
+ .option('--clipboard', 'read code from clipboard')
123
+ .option('--action <action>', 'action to perform (explain, review, improve)', 'explain')
124
+ .action(async (options) => {
125
+ await this.chatWithCode(options);
126
+ });
127
+ // Chat templates
128
+ chatCmd.command('template').description('manage chat templates');
129
+ chatCmd
130
+ .command('template list')
131
+ .description('list available chat templates')
132
+ .action(async () => {
133
+ await this.listChatTemplates();
134
+ });
135
+ chatCmd
136
+ .command('template use <name>')
137
+ .description('start chat with template')
138
+ .option('--vars <vars>', 'template variables (JSON or key=value)')
139
+ .action(async (name, options) => {
140
+ await this.useChatTemplate(name, options);
141
+ });
142
+ }
143
+ /**
144
+ * Start a new chat session
145
+ */
146
+ async startChatSession(options) {
147
+ try {
148
+ logger_1.logger.info('Starting new chat session...');
149
+ const session = await this.createNewSession(options);
150
+ this.activeSessions.set(session.id, session);
151
+ console.log(chalk_1.default.green(`\n🤖 Chat Session Started (${session.model})`));
152
+ console.log(chalk_1.default.gray(`Session ID: ${session.id}`));
153
+ if (session.context) {
154
+ console.log(chalk_1.default.gray(`Context: ${session.context}`));
155
+ }
156
+ console.log(chalk_1.default.gray('Type "exit" to end the session, "help" for commands\n'));
157
+ await this.runChatLoop(session);
158
+ }
159
+ catch (error) {
160
+ throw error_handler_1.errorHandler.createError('WUNDR_CHAT_START_FAILED', 'Failed to start chat session', { options }, true);
161
+ }
162
+ }
163
+ /**
164
+ * Resume existing chat session
165
+ */
166
+ async resumeChatSession(sessionId) {
167
+ try {
168
+ logger_1.logger.info(`Resuming chat session: ${sessionId}`);
169
+ const session = await this.loadChatSession(sessionId);
170
+ if (!session) {
171
+ throw new Error(`Chat session not found: ${sessionId}`);
172
+ }
173
+ this.activeSessions.set(sessionId, session);
174
+ console.log(chalk_1.default.green(`\n🤖 Chat Session Resumed (${session.model})`));
175
+ console.log(chalk_1.default.gray(`Session ID: ${session.id}`));
176
+ console.log(chalk_1.default.gray(`Messages: ${session.history.length}`));
177
+ console.log(chalk_1.default.gray(`Last updated: ${session.updated.toLocaleString()}\n`));
178
+ // Show recent messages
179
+ if (session.history.length > 0) {
180
+ console.log(chalk_1.default.blue('Recent messages:'));
181
+ session.history.slice(-3).forEach(msg => {
182
+ const role = msg.role === 'user' ? 'You' : 'AI';
183
+ const content = msg.content.length > 100
184
+ ? msg.content.substring(0, 100) + '...'
185
+ : msg.content;
186
+ console.log(` ${chalk_1.default.cyan(role)}: ${content}`);
187
+ });
188
+ console.log();
189
+ }
190
+ await this.runChatLoop(session);
191
+ }
192
+ catch (error) {
193
+ throw error_handler_1.errorHandler.createError('WUNDR_CHAT_RESUME_FAILED', 'Failed to resume chat session', { sessionId }, true);
194
+ }
195
+ }
196
+ /**
197
+ * List chat sessions
198
+ */
199
+ async listChatSessions(options) {
200
+ try {
201
+ const sessions = await this.getAllChatSessions();
202
+ const filteredSessions = options.activeOnly
203
+ ? sessions.filter(s => this.activeSessions.has(s.id))
204
+ : sessions;
205
+ if (filteredSessions.length === 0) {
206
+ logger_1.logger.info('No chat sessions found');
207
+ return;
208
+ }
209
+ logger_1.logger.info(`Chat sessions (${filteredSessions.length}):`);
210
+ const sessionData = filteredSessions.map(session => ({
211
+ ID: session.id,
212
+ Model: session.model,
213
+ Messages: session.history.length,
214
+ Created: session.created.toLocaleDateString(),
215
+ Updated: session.updated.toLocaleDateString(),
216
+ Active: this.activeSessions.has(session.id) ? '✓' : '✗',
217
+ }));
218
+ console.table(sessionData);
219
+ }
220
+ catch (error) {
221
+ throw error_handler_1.errorHandler.createError('WUNDR_CHAT_LIST_FAILED', 'Failed to list chat sessions', { options }, true);
222
+ }
223
+ }
224
+ /**
225
+ * Ask a single question
226
+ */
227
+ async askSingleQuestion(message, options) {
228
+ try {
229
+ logger_1.logger.debug('Processing single question...');
230
+ let session;
231
+ if (options.session) {
232
+ session = await this.loadChatSession(options.session);
233
+ if (!session) {
234
+ throw new Error(`Chat session not found: ${options.session}`);
235
+ }
236
+ }
237
+ else {
238
+ session = await this.createNewSession({
239
+ model: options.model,
240
+ context: options.context,
241
+ });
242
+ }
243
+ const response = await this.sendMessage(session, message);
244
+ console.log(chalk_1.default.cyan('\nAI Response:'));
245
+ console.log(response);
246
+ console.log();
247
+ // Save session if it was created for this question
248
+ if (!options.session) {
249
+ await this.saveChatSession(session);
250
+ logger_1.logger.debug(`Session saved: ${session.id}`);
251
+ }
252
+ }
253
+ catch (error) {
254
+ throw error_handler_1.errorHandler.createError('WUNDR_CHAT_ASK_FAILED', 'Failed to process question', { message, options }, true);
255
+ }
256
+ }
257
+ /**
258
+ * Export chat session
259
+ */
260
+ async exportChatSession(sessionId, options) {
261
+ try {
262
+ logger_1.logger.info(`Exporting chat session: ${sessionId}`);
263
+ const session = await this.loadChatSession(sessionId);
264
+ if (!session) {
265
+ throw new Error(`Chat session not found: ${sessionId}`);
266
+ }
267
+ let exportedContent;
268
+ switch (options.format) {
269
+ case 'json':
270
+ exportedContent = JSON.stringify(session, null, 2);
271
+ break;
272
+ case 'markdown':
273
+ exportedContent = this.convertToMarkdown(session);
274
+ break;
275
+ case 'txt':
276
+ exportedContent = this.convertToText(session);
277
+ break;
278
+ default:
279
+ throw new Error(`Unsupported export format: ${options.format}`);
280
+ }
281
+ const outputPath = options.output || `chat-${sessionId}.${options.format}`;
282
+ await fs_extra_1.default.writeFile(outputPath, exportedContent);
283
+ logger_1.logger.success(`Chat session exported: ${outputPath}`);
284
+ }
285
+ catch (error) {
286
+ throw error_handler_1.errorHandler.createError('WUNDR_CHAT_EXPORT_FAILED', 'Failed to export chat session', { sessionId, options }, true);
287
+ }
288
+ }
289
+ /**
290
+ * Import chat session
291
+ */
292
+ async importChatSession(file, options) {
293
+ try {
294
+ logger_1.logger.info(`Importing chat session: ${file}`);
295
+ if (!(await fs_extra_1.default.pathExists(file))) {
296
+ throw new Error(`File not found: ${file}`);
297
+ }
298
+ let session;
299
+ switch (options.format) {
300
+ case 'json':
301
+ session = await fs_extra_1.default.readJson(file);
302
+ break;
303
+ case 'markdown':
304
+ session = await this.parseMarkdown(file);
305
+ break;
306
+ default:
307
+ throw new Error(`Unsupported import format: ${options.format}`);
308
+ }
309
+ // Generate new ID for imported session
310
+ session.id = `imported-${Date.now()}`;
311
+ session.created = new Date();
312
+ session.updated = new Date();
313
+ await this.saveChatSession(session);
314
+ logger_1.logger.success(`Chat session imported: ${session.id}`);
315
+ }
316
+ catch (error) {
317
+ throw error_handler_1.errorHandler.createError('WUNDR_CHAT_IMPORT_FAILED', 'Failed to import chat session', { file, options }, true);
318
+ }
319
+ }
320
+ /**
321
+ * Delete chat session
322
+ */
323
+ async deleteChatSession(sessionId, options) {
324
+ try {
325
+ const session = await this.loadChatSession(sessionId);
326
+ if (!session) {
327
+ throw new Error(`Chat session not found: ${sessionId}`);
328
+ }
329
+ if (!options.force) {
330
+ const { confirm } = await inquirer_1.default.prompt([
331
+ {
332
+ type: 'confirm',
333
+ name: 'confirm',
334
+ message: `Delete chat session ${sessionId}? (${session.history.length} messages)`,
335
+ default: false,
336
+ },
337
+ ]);
338
+ if (!confirm) {
339
+ logger_1.logger.info('Deletion cancelled');
340
+ return;
341
+ }
342
+ }
343
+ await this.deleteChatSessionFile(sessionId);
344
+ this.activeSessions.delete(sessionId);
345
+ logger_1.logger.success(`Chat session deleted: ${sessionId}`);
346
+ }
347
+ catch (error) {
348
+ throw error_handler_1.errorHandler.createError('WUNDR_CHAT_DELETE_FAILED', 'Failed to delete chat session', { sessionId, options }, true);
349
+ }
350
+ }
351
+ /**
352
+ * Chat with specific file
353
+ */
354
+ async chatWithFile(file, options) {
355
+ try {
356
+ if (!(await fs_extra_1.default.pathExists(file))) {
357
+ throw new Error(`File not found: ${file}`);
358
+ }
359
+ const fileContent = await fs_extra_1.default.readFile(file, 'utf8');
360
+ const fileName = path_1.default.basename(file);
361
+ const actionPrompts = {
362
+ explain: `Please explain this code from ${fileName}:`,
363
+ review: `Please review this code from ${fileName} for potential issues:`,
364
+ improve: `Please suggest improvements for this code from ${fileName}:`,
365
+ };
366
+ const prompt = actionPrompts[options.action] ||
367
+ actionPrompts.explain;
368
+ const message = `${prompt}\n\n\`\`\`\n${fileContent}\n\`\`\``;
369
+ await this.askSingleQuestion(message, { model: options.model });
370
+ }
371
+ catch (error) {
372
+ throw error_handler_1.errorHandler.createError('WUNDR_CHAT_FILE_FAILED', 'Failed to chat with file', { file, options }, true);
373
+ }
374
+ }
375
+ /**
376
+ * Chat with code
377
+ */
378
+ async chatWithCode(options) {
379
+ try {
380
+ let code;
381
+ if (options.clipboard) {
382
+ // Read from clipboard (would need clipboard library)
383
+ code = 'Code from clipboard'; // Placeholder
384
+ }
385
+ else {
386
+ const { codeInput } = await inquirer_1.default.prompt([
387
+ {
388
+ type: 'editor',
389
+ name: 'codeInput',
390
+ message: 'Enter your code:',
391
+ },
392
+ ]);
393
+ code = codeInput;
394
+ }
395
+ const actionPrompts = {
396
+ explain: 'Please explain this code:',
397
+ review: 'Please review this code for potential issues:',
398
+ improve: 'Please suggest improvements for this code:',
399
+ };
400
+ const prompt = actionPrompts[options.action] ||
401
+ actionPrompts.explain;
402
+ const message = `${prompt}\n\n\`\`\`\n${code}\n\`\`\``;
403
+ await this.askSingleQuestion(message, {});
404
+ }
405
+ catch (error) {
406
+ throw error_handler_1.errorHandler.createError('WUNDR_CHAT_CODE_FAILED', 'Failed to chat with code', { options }, true);
407
+ }
408
+ }
409
+ /**
410
+ * Helper methods for chat operations
411
+ */
412
+ async createNewSession(options) {
413
+ const config = this.configManager.getConfig();
414
+ return {
415
+ id: options.sessionName || `session-${Date.now()}`,
416
+ model: options.model || config.ai.model,
417
+ context: options.context,
418
+ history: [],
419
+ created: new Date(),
420
+ updated: new Date(),
421
+ };
422
+ }
423
+ async runChatLoop(session) {
424
+ while (true) {
425
+ try {
426
+ const { message } = await inquirer_1.default.prompt([
427
+ {
428
+ type: 'input',
429
+ name: 'message',
430
+ message: chalk_1.default.green('You:'),
431
+ validate: input => input.length > 0 || 'Message cannot be empty',
432
+ },
433
+ ]);
434
+ if (message.toLowerCase() === 'exit') {
435
+ break;
436
+ }
437
+ if (message.toLowerCase() === 'help') {
438
+ this.showChatHelp();
439
+ continue;
440
+ }
441
+ if (message.startsWith('/')) {
442
+ await this.handleChatCommand(session, message);
443
+ continue;
444
+ }
445
+ const response = await this.sendMessage(session, message);
446
+ console.log(chalk_1.default.cyan(`\nAI: ${response}\n`));
447
+ }
448
+ catch (error) {
449
+ logger_1.logger.error('Chat error:', error);
450
+ console.log(chalk_1.default.red('Sorry, there was an error processing your message.\n'));
451
+ }
452
+ }
453
+ // Save session when exiting
454
+ await this.saveChatSession(session);
455
+ this.activeSessions.delete(session.id);
456
+ logger_1.logger.success('Chat session ended and saved');
457
+ }
458
+ async sendMessage(session, message) {
459
+ // Add user message to history
460
+ const userMessage = {
461
+ role: 'user',
462
+ content: message,
463
+ timestamp: new Date(),
464
+ };
465
+ session.history.push(userMessage);
466
+ // Call AI service (mock implementation)
467
+ const response = await this.callAI(session, message);
468
+ // Add AI response to history
469
+ const aiMessage = {
470
+ role: 'assistant',
471
+ content: response,
472
+ timestamp: new Date(),
473
+ };
474
+ session.history.push(aiMessage);
475
+ session.updated = new Date();
476
+ return response;
477
+ }
478
+ async callAI(session, message) {
479
+ if (!this.aiService.isReady()) {
480
+ throw new Error('AI service not configured. Set ANTHROPIC_API_KEY environment variable to enable chat.');
481
+ }
482
+ return this.aiService.sendMessage(session.id, message);
483
+ }
484
+ showChatHelp() {
485
+ console.log(chalk_1.default.blue('\nChat Commands:'));
486
+ console.log(' exit - End the chat session');
487
+ console.log(' help - Show this help message');
488
+ console.log(' /clear - Clear chat history');
489
+ console.log(' /save - Save chat session');
490
+ console.log(' /export - Export chat session');
491
+ console.log(' /context - Show current context');
492
+ console.log(' /model - Change AI model');
493
+ console.log();
494
+ }
495
+ async handleChatCommand(session, command) {
496
+ const [cmd, ...args] = command.slice(1).split(' ');
497
+ switch (cmd) {
498
+ case 'clear':
499
+ session.history = [];
500
+ console.log(chalk_1.default.green('Chat history cleared\n'));
501
+ break;
502
+ case 'save':
503
+ await this.saveChatSession(session);
504
+ console.log(chalk_1.default.green(`Session saved: ${session.id}\n`));
505
+ break;
506
+ case 'export':
507
+ const format = args[0] || 'markdown';
508
+ await this.exportChatSession(session.id, {
509
+ format,
510
+ output: `${session.id}.${format}`,
511
+ });
512
+ break;
513
+ case 'context':
514
+ console.log(chalk_1.default.blue('Current Context:'));
515
+ console.log(` Model: ${session.model}`);
516
+ console.log(` Messages: ${session.history.length}`);
517
+ console.log(` Context: ${session.context || 'None'}\n`);
518
+ break;
519
+ case 'model':
520
+ if (args[0]) {
521
+ session.model = args[0];
522
+ console.log(chalk_1.default.green(`Model changed to: ${args[0]}\n`));
523
+ }
524
+ else {
525
+ console.log(chalk_1.default.yellow('Current model: ' + session.model + '\n'));
526
+ }
527
+ break;
528
+ default:
529
+ console.log(chalk_1.default.red(`Unknown command: /${cmd}\n`));
530
+ }
531
+ }
532
+ async saveChatSession(session) {
533
+ const sessionPath = path_1.default.join(process.cwd(), '.wundr', 'chat', `${session.id}.json`);
534
+ await fs_extra_1.default.ensureDir(path_1.default.dirname(sessionPath));
535
+ await fs_extra_1.default.writeJson(sessionPath, session, { spaces: 2 });
536
+ }
537
+ async loadChatSession(sessionId) {
538
+ const sessionPath = path_1.default.join(process.cwd(), '.wundr', 'chat', `${sessionId}.json`);
539
+ if (await fs_extra_1.default.pathExists(sessionPath)) {
540
+ const data = await fs_extra_1.default.readJson(sessionPath);
541
+ data.created = new Date(data.created);
542
+ data.updated = new Date(data.updated);
543
+ data.history = data.history.map((msg) => ({
544
+ ...msg,
545
+ timestamp: new Date(msg.timestamp),
546
+ }));
547
+ return data;
548
+ }
549
+ return null;
550
+ }
551
+ async getAllChatSessions() {
552
+ const chatDir = path_1.default.join(process.cwd(), '.wundr', 'chat');
553
+ if (!(await fs_extra_1.default.pathExists(chatDir))) {
554
+ return [];
555
+ }
556
+ const files = await fs_extra_1.default.readdir(chatDir);
557
+ const jsonFiles = files.filter(f => f.endsWith('.json'));
558
+ const sessions = [];
559
+ for (const file of jsonFiles) {
560
+ try {
561
+ const sessionId = path_1.default.basename(file, '.json');
562
+ const session = await this.loadChatSession(sessionId);
563
+ if (session) {
564
+ sessions.push(session);
565
+ }
566
+ }
567
+ catch (error) {
568
+ logger_1.logger.debug(`Failed to load session ${file}:`, error);
569
+ }
570
+ }
571
+ return sessions;
572
+ }
573
+ async deleteChatSessionFile(sessionId) {
574
+ const sessionPath = path_1.default.join(process.cwd(), '.wundr', 'chat', `${sessionId}.json`);
575
+ if (await fs_extra_1.default.pathExists(sessionPath)) {
576
+ await fs_extra_1.default.remove(sessionPath);
577
+ }
578
+ }
579
+ convertToMarkdown(session) {
580
+ let markdown = `# Chat Session: ${session.id}\n\n`;
581
+ markdown += `**Model:** ${session.model}\n`;
582
+ markdown += `**Created:** ${session.created.toLocaleString()}\n`;
583
+ markdown += `**Updated:** ${session.updated.toLocaleString()}\n`;
584
+ if (session.context) {
585
+ markdown += `**Context:** ${session.context}\n`;
586
+ }
587
+ markdown += `**Messages:** ${session.history.length}\n\n`;
588
+ markdown += '---\n\n';
589
+ session.history.forEach(msg => {
590
+ const role = msg.role === 'user' ? '**You**' : '**AI**';
591
+ markdown += `${role} (${msg.timestamp.toLocaleTimeString()}):\n\n`;
592
+ markdown += `${msg.content}\n\n`;
593
+ markdown += '---\n\n';
594
+ });
595
+ return markdown;
596
+ }
597
+ convertToText(session) {
598
+ let text = `Chat Session: ${session.id}\n`;
599
+ text += `Model: ${session.model}\n`;
600
+ text += `Created: ${session.created.toLocaleString()}\n`;
601
+ text += `Updated: ${session.updated.toLocaleString()}\n`;
602
+ text += `Messages: ${session.history.length}\n\n`;
603
+ text += '='.repeat(50) + '\n\n';
604
+ session.history.forEach(msg => {
605
+ const role = msg.role === 'user' ? 'You' : 'AI';
606
+ text += `[${msg.timestamp.toLocaleTimeString()}] ${role}:\n`;
607
+ text += `${msg.content}\n\n`;
608
+ text += '-'.repeat(30) + '\n\n';
609
+ });
610
+ return text;
611
+ }
612
+ async parseMarkdown(file) {
613
+ // Implementation to parse markdown format back to session
614
+ const content = await fs_extra_1.default.readFile(file, 'utf8');
615
+ // This is a simplified parser - a real implementation would be more robust
616
+ return {
617
+ id: `parsed-${Date.now()}`,
618
+ model: 'claude-3',
619
+ history: [],
620
+ created: new Date(),
621
+ updated: new Date(),
622
+ };
623
+ }
624
+ // Configuration methods
625
+ async setChatConfig(key, value) {
626
+ this.configManager.set(`chat.${key}`, value);
627
+ await this.configManager.saveConfig();
628
+ logger_1.logger.success(`Chat configuration updated: ${key} = ${value}`);
629
+ }
630
+ async getChatConfig(key) {
631
+ if (key) {
632
+ const value = this.configManager.get(`chat.${key}`);
633
+ console.log(`${key}: ${value}`);
634
+ }
635
+ else {
636
+ const chatConfig = this.configManager.get('chat') || {};
637
+ console.log(JSON.stringify(chatConfig, null, 2));
638
+ }
639
+ }
640
+ // Template methods
641
+ async listChatTemplates() {
642
+ const templates = [
643
+ 'code-review',
644
+ 'explain-code',
645
+ 'debug-help',
646
+ 'architecture-review',
647
+ 'performance-optimization',
648
+ ];
649
+ console.log('Available chat templates:');
650
+ templates.forEach(template => {
651
+ console.log(` - ${template}`);
652
+ });
653
+ }
654
+ async useChatTemplate(name, options) {
655
+ const templates = {
656
+ 'code-review': 'Please review the following code for best practices, potential bugs, and improvements:',
657
+ 'explain-code': 'Please explain what this code does and how it works:',
658
+ 'debug-help': "I'm having trouble with this code. Can you help me debug it?",
659
+ 'architecture-review': 'Please review this architectural design and suggest improvements:',
660
+ 'performance-optimization': 'Please suggest performance optimizations for this code:',
661
+ };
662
+ const template = templates[name];
663
+ if (!template) {
664
+ throw new Error(`Template not found: ${name}`);
665
+ }
666
+ // Process template variables if provided
667
+ let processedTemplate = template;
668
+ if (options.vars) {
669
+ const variables = JSON.parse(options.vars);
670
+ Object.entries(variables).forEach(([key, value]) => {
671
+ processedTemplate = processedTemplate.replace(`{{${key}}}`, String(value));
672
+ });
673
+ }
674
+ await this.askSingleQuestion(processedTemplate, {});
675
+ }
676
+ }
677
+ exports.ChatCommands = ChatCommands;
678
+ //# sourceMappingURL=chat.js.map