@mainwp/control 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +583 -0
  3. package/bin/_exit.js +12 -0
  4. package/bin/dev.js +7 -0
  5. package/bin/run.js +7 -0
  6. package/dist/chat/chat-engine.d.ts +213 -0
  7. package/dist/chat/chat-engine.d.ts.map +1 -0
  8. package/dist/chat/chat-engine.js +636 -0
  9. package/dist/chat/chat-engine.js.map +1 -0
  10. package/dist/chat/index.d.ts +10 -0
  11. package/dist/chat/index.d.ts.map +1 -0
  12. package/dist/chat/index.js +14 -0
  13. package/dist/chat/index.js.map +1 -0
  14. package/dist/chat/providers/anthropic.d.ts +52 -0
  15. package/dist/chat/providers/anthropic.d.ts.map +1 -0
  16. package/dist/chat/providers/anthropic.js +292 -0
  17. package/dist/chat/providers/anthropic.js.map +1 -0
  18. package/dist/chat/providers/gemini.d.ts +52 -0
  19. package/dist/chat/providers/gemini.d.ts.map +1 -0
  20. package/dist/chat/providers/gemini.js +284 -0
  21. package/dist/chat/providers/gemini.js.map +1 -0
  22. package/dist/chat/providers/index.d.ts +19 -0
  23. package/dist/chat/providers/index.d.ts.map +1 -0
  24. package/dist/chat/providers/index.js +23 -0
  25. package/dist/chat/providers/index.js.map +1 -0
  26. package/dist/chat/providers/local.d.ts +37 -0
  27. package/dist/chat/providers/local.d.ts.map +1 -0
  28. package/dist/chat/providers/local.js +130 -0
  29. package/dist/chat/providers/local.js.map +1 -0
  30. package/dist/chat/providers/openai-compatible.d.ts +155 -0
  31. package/dist/chat/providers/openai-compatible.d.ts.map +1 -0
  32. package/dist/chat/providers/openai-compatible.js +264 -0
  33. package/dist/chat/providers/openai-compatible.js.map +1 -0
  34. package/dist/chat/providers/openai.d.ts +24 -0
  35. package/dist/chat/providers/openai.d.ts.map +1 -0
  36. package/dist/chat/providers/openai.js +62 -0
  37. package/dist/chat/providers/openai.js.map +1 -0
  38. package/dist/chat/providers/openrouter.d.ts +26 -0
  39. package/dist/chat/providers/openrouter.d.ts.map +1 -0
  40. package/dist/chat/providers/openrouter.js +65 -0
  41. package/dist/chat/providers/openrouter.js.map +1 -0
  42. package/dist/chat/providers/provider-fetch.d.ts +15 -0
  43. package/dist/chat/providers/provider-fetch.d.ts.map +1 -0
  44. package/dist/chat/providers/provider-fetch.js +35 -0
  45. package/dist/chat/providers/provider-fetch.js.map +1 -0
  46. package/dist/chat/providers/provider.d.ts +214 -0
  47. package/dist/chat/providers/provider.d.ts.map +1 -0
  48. package/dist/chat/providers/provider.js +166 -0
  49. package/dist/chat/providers/provider.js.map +1 -0
  50. package/dist/chat/providers/sse-reader.d.ts +21 -0
  51. package/dist/chat/providers/sse-reader.d.ts.map +1 -0
  52. package/dist/chat/providers/sse-reader.js +48 -0
  53. package/dist/chat/providers/sse-reader.js.map +1 -0
  54. package/dist/chat/system-prompt.d.ts +33 -0
  55. package/dist/chat/system-prompt.d.ts.map +1 -0
  56. package/dist/chat/system-prompt.js +166 -0
  57. package/dist/chat/system-prompt.js.map +1 -0
  58. package/dist/chat/tool-envelope.d.ts +72 -0
  59. package/dist/chat/tool-envelope.d.ts.map +1 -0
  60. package/dist/chat/tool-envelope.js +263 -0
  61. package/dist/chat/tool-envelope.js.map +1 -0
  62. package/dist/commands/abilities/info.d.ts +21 -0
  63. package/dist/commands/abilities/info.d.ts.map +1 -0
  64. package/dist/commands/abilities/info.js +80 -0
  65. package/dist/commands/abilities/info.js.map +1 -0
  66. package/dist/commands/abilities/list.d.ts +19 -0
  67. package/dist/commands/abilities/list.d.ts.map +1 -0
  68. package/dist/commands/abilities/list.js +98 -0
  69. package/dist/commands/abilities/list.js.map +1 -0
  70. package/dist/commands/abilities/run.d.ts +75 -0
  71. package/dist/commands/abilities/run.d.ts.map +1 -0
  72. package/dist/commands/abilities/run.js +468 -0
  73. package/dist/commands/abilities/run.js.map +1 -0
  74. package/dist/commands/chat.d.ts +54 -0
  75. package/dist/commands/chat.d.ts.map +1 -0
  76. package/dist/commands/chat.js +384 -0
  77. package/dist/commands/chat.js.map +1 -0
  78. package/dist/commands/config/show.d.ts +54 -0
  79. package/dist/commands/config/show.d.ts.map +1 -0
  80. package/dist/commands/config/show.js +324 -0
  81. package/dist/commands/config/show.js.map +1 -0
  82. package/dist/commands/doctor.d.ts +77 -0
  83. package/dist/commands/doctor.d.ts.map +1 -0
  84. package/dist/commands/doctor.js +412 -0
  85. package/dist/commands/doctor.js.map +1 -0
  86. package/dist/commands/jobs/watch.d.ts +50 -0
  87. package/dist/commands/jobs/watch.d.ts.map +1 -0
  88. package/dist/commands/jobs/watch.js +269 -0
  89. package/dist/commands/jobs/watch.js.map +1 -0
  90. package/dist/commands/login.d.ts +25 -0
  91. package/dist/commands/login.d.ts.map +1 -0
  92. package/dist/commands/login.js +165 -0
  93. package/dist/commands/login.js.map +1 -0
  94. package/dist/commands/profile/delete.d.ts +22 -0
  95. package/dist/commands/profile/delete.d.ts.map +1 -0
  96. package/dist/commands/profile/delete.js +57 -0
  97. package/dist/commands/profile/delete.js.map +1 -0
  98. package/dist/commands/profile/list.d.ts +19 -0
  99. package/dist/commands/profile/list.d.ts.map +1 -0
  100. package/dist/commands/profile/list.js +53 -0
  101. package/dist/commands/profile/list.js.map +1 -0
  102. package/dist/commands/profile/use.d.ts +22 -0
  103. package/dist/commands/profile/use.d.ts.map +1 -0
  104. package/dist/commands/profile/use.js +46 -0
  105. package/dist/commands/profile/use.js.map +1 -0
  106. package/dist/config/fs-utils.d.ts +14 -0
  107. package/dist/config/fs-utils.d.ts.map +1 -0
  108. package/dist/config/fs-utils.js +31 -0
  109. package/dist/config/fs-utils.js.map +1 -0
  110. package/dist/config/keychain.d.ts +53 -0
  111. package/dist/config/keychain.d.ts.map +1 -0
  112. package/dist/config/keychain.js +175 -0
  113. package/dist/config/keychain.js.map +1 -0
  114. package/dist/config/profile-store.d.ts +85 -0
  115. package/dist/config/profile-store.d.ts.map +1 -0
  116. package/dist/config/profile-store.js +228 -0
  117. package/dist/config/profile-store.js.map +1 -0
  118. package/dist/config/settings.d.ts +71 -0
  119. package/dist/config/settings.d.ts.map +1 -0
  120. package/dist/config/settings.js +151 -0
  121. package/dist/config/settings.js.map +1 -0
  122. package/dist/core/abilities-executor.d.ts +126 -0
  123. package/dist/core/abilities-executor.d.ts.map +1 -0
  124. package/dist/core/abilities-executor.js +264 -0
  125. package/dist/core/abilities-executor.js.map +1 -0
  126. package/dist/core/batch-manager.d.ts +113 -0
  127. package/dist/core/batch-manager.d.ts.map +1 -0
  128. package/dist/core/batch-manager.js +244 -0
  129. package/dist/core/batch-manager.js.map +1 -0
  130. package/dist/core/http-client.d.ts +111 -0
  131. package/dist/core/http-client.d.ts.map +1 -0
  132. package/dist/core/http-client.js +329 -0
  133. package/dist/core/http-client.js.map +1 -0
  134. package/dist/core/safety-controller.d.ts +114 -0
  135. package/dist/core/safety-controller.d.ts.map +1 -0
  136. package/dist/core/safety-controller.js +229 -0
  137. package/dist/core/safety-controller.js.map +1 -0
  138. package/dist/hooks/command-not-found.d.ts +12 -0
  139. package/dist/hooks/command-not-found.d.ts.map +1 -0
  140. package/dist/hooks/command-not-found.js +58 -0
  141. package/dist/hooks/command-not-found.js.map +1 -0
  142. package/dist/index.d.ts +7 -0
  143. package/dist/index.d.ts.map +1 -0
  144. package/dist/index.js +7 -0
  145. package/dist/index.js.map +1 -0
  146. package/dist/lib/base-command.d.ts +123 -0
  147. package/dist/lib/base-command.d.ts.map +1 -0
  148. package/dist/lib/base-command.js +285 -0
  149. package/dist/lib/base-command.js.map +1 -0
  150. package/dist/output/formatter.d.ts +48 -0
  151. package/dist/output/formatter.d.ts.map +1 -0
  152. package/dist/output/formatter.js +138 -0
  153. package/dist/output/formatter.js.map +1 -0
  154. package/dist/output/json-envelope.d.ts +43 -0
  155. package/dist/output/json-envelope.d.ts.map +1 -0
  156. package/dist/output/json-envelope.js +73 -0
  157. package/dist/output/json-envelope.js.map +1 -0
  158. package/dist/utils/audit-logger.d.ts +97 -0
  159. package/dist/utils/audit-logger.d.ts.map +1 -0
  160. package/dist/utils/audit-logger.js +169 -0
  161. package/dist/utils/audit-logger.js.map +1 -0
  162. package/dist/utils/colors.d.ts +29 -0
  163. package/dist/utils/colors.d.ts.map +1 -0
  164. package/dist/utils/colors.js +36 -0
  165. package/dist/utils/colors.js.map +1 -0
  166. package/dist/utils/errors.d.ts +107 -0
  167. package/dist/utils/errors.d.ts.map +1 -0
  168. package/dist/utils/errors.js +149 -0
  169. package/dist/utils/errors.js.map +1 -0
  170. package/dist/utils/exit-codes.d.ts +21 -0
  171. package/dist/utils/exit-codes.d.ts.map +1 -0
  172. package/dist/utils/exit-codes.js +20 -0
  173. package/dist/utils/exit-codes.js.map +1 -0
  174. package/dist/utils/format.d.ts +64 -0
  175. package/dist/utils/format.d.ts.map +1 -0
  176. package/dist/utils/format.js +69 -0
  177. package/dist/utils/format.js.map +1 -0
  178. package/dist/utils/prompt.d.ts +34 -0
  179. package/dist/utils/prompt.d.ts.map +1 -0
  180. package/dist/utils/prompt.js +132 -0
  181. package/dist/utils/prompt.js.map +1 -0
  182. package/dist/utils/retry.d.ts +59 -0
  183. package/dist/utils/retry.d.ts.map +1 -0
  184. package/dist/utils/retry.js +96 -0
  185. package/dist/utils/retry.js.map +1 -0
  186. package/dist/utils/terminal-sanitizer.d.ts +60 -0
  187. package/dist/utils/terminal-sanitizer.d.ts.map +1 -0
  188. package/dist/utils/terminal-sanitizer.js +166 -0
  189. package/dist/utils/terminal-sanitizer.js.map +1 -0
  190. package/dist/validation/input-sanitizer.d.ts +76 -0
  191. package/dist/validation/input-sanitizer.d.ts.map +1 -0
  192. package/dist/validation/input-sanitizer.js +199 -0
  193. package/dist/validation/input-sanitizer.js.map +1 -0
  194. package/dist/validation/schema-validator.d.ts +75 -0
  195. package/dist/validation/schema-validator.d.ts.map +1 -0
  196. package/dist/validation/schema-validator.js +147 -0
  197. package/dist/validation/schema-validator.js.map +1 -0
  198. package/oclif.manifest.json +857 -0
  199. package/package.json +101 -0
  200. package/scripts/completions/README.md +221 -0
  201. package/scripts/completions/mainwpcontrol.bash +193 -0
  202. package/scripts/completions/mainwpcontrol.zsh +267 -0
  203. package/scripts/completions/profile-completer.sh +35 -0
  204. package/scripts/completions/regenerate.sh +78 -0
@@ -0,0 +1,636 @@
1
+ /**
2
+ * Chat Engine for mainwpcontrol
3
+ *
4
+ * LLM interaction loop with safety enforcement.
5
+ *
6
+ * CRITICAL INVARIANTS (from PLAN.md, CHAT_PROMPT.md):
7
+ * - AI proposes tool calls; ChatEngine executes via AbilitiesExecutor
8
+ * - AI NEVER executes directly
9
+ * - Destructive actions always preview first
10
+ * - Max tool calls per turn enforced
11
+ * - JSON retry logic (max 2 retries)
12
+ */
13
+ import { buildConfiguredPrompt, defaultConfig as defaultPromptConfig, } from './system-prompt.js';
14
+ import { parseResponse, isRetryable, buildRetryPrompt, } from './tool-envelope.js';
15
+ import { SafetyController, } from '../core/safety-controller.js';
16
+ import { abilityToTool } from './providers/provider.js';
17
+ import { logDestructiveActionSafe } from '../utils/audit-logger.js';
18
+ import { getInputSanitizer } from '../validation/input-sanitizer.js';
19
+ /**
20
+ * Chat engine class
21
+ *
22
+ * SAFETY: All execution flows through SafetyController and AbilitiesExecutor.
23
+ * ChatEngine never bypasses safety checks.
24
+ *
25
+ * Context window management: The engine maintains a sliding window of messages
26
+ * to prevent unbounded memory growth. The system prompt is always preserved,
27
+ * and message coherence (user-assistant pairs, tool call-result pairs) is maintained.
28
+ */
29
+ export class ChatEngine {
30
+ provider;
31
+ executor;
32
+ safetyController;
33
+ maxToolCallsPerTurn;
34
+ maxParseRetries;
35
+ model;
36
+ temperature;
37
+ promptConfig;
38
+ maxContextMessages;
39
+ stream;
40
+ onStreamChunk;
41
+ messages = [];
42
+ abilities = [];
43
+ tools = [];
44
+ pendingPreview = null;
45
+ initialized = false;
46
+ constructor(options) {
47
+ this.provider = options.provider;
48
+ this.executor = options.executor;
49
+ this.safetyController = new SafetyController();
50
+ this.maxToolCallsPerTurn = options.maxToolCallsPerTurn ?? 3;
51
+ this.maxParseRetries = options.maxParseRetries ?? 2;
52
+ this.model = options.model;
53
+ this.temperature = options.temperature;
54
+ this.stream = options.stream ?? false;
55
+ // Only assign if defined to satisfy exactOptionalPropertyTypes
56
+ if (options.onStreamChunk !== undefined) {
57
+ this.onStreamChunk = options.onStreamChunk;
58
+ }
59
+ // Build prompt config, handling optional properties correctly
60
+ const mergedPromptConfig = {
61
+ ...defaultPromptConfig,
62
+ ...options.promptConfig,
63
+ maxToolCalls: options.maxToolCallsPerTurn ?? defaultPromptConfig.maxToolCalls,
64
+ maxParseRetries: options.maxParseRetries ?? defaultPromptConfig.maxParseRetries,
65
+ };
66
+ // Context window configuration: resolve from options, promptConfig, or default
67
+ // This ensures the default limit (20) is applied unless explicitly overridden
68
+ const resolvedContextMessages = options.maxContextMessages ??
69
+ options.promptConfig?.maxContextMessages ??
70
+ defaultPromptConfig.maxContextMessages;
71
+ this.maxContextMessages = resolvedContextMessages;
72
+ // Sync the resolved value into promptConfig for system prompt generation
73
+ if (resolvedContextMessages !== undefined) {
74
+ mergedPromptConfig.maxContextMessages = resolvedContextMessages;
75
+ }
76
+ // Handle optional token limit (reserved for future use)
77
+ const contextTokens = options.maxContextTokens ?? options.promptConfig?.maxContextTokens;
78
+ if (contextTokens !== undefined) {
79
+ mergedPromptConfig.maxContextTokens = contextTokens;
80
+ }
81
+ this.promptConfig = mergedPromptConfig;
82
+ }
83
+ /**
84
+ * Initialize the chat session
85
+ */
86
+ async initialize() {
87
+ if (this.initialized)
88
+ return;
89
+ // Load abilities
90
+ this.abilities = await this.executor.listAbilities();
91
+ // Convert to tool definitions
92
+ this.tools = this.abilities.map((a) => abilityToTool(a.name, a.description, a.input_schema));
93
+ // Build system prompt
94
+ const systemPrompt = buildConfiguredPrompt(this.abilities, this.promptConfig);
95
+ // Initialize message history
96
+ this.messages = [{ role: 'system', content: systemPrompt }];
97
+ this.initialized = true;
98
+ }
99
+ /**
100
+ * Send a user message and process the response
101
+ */
102
+ async sendMessage(userMessage) {
103
+ if (!this.initialized) {
104
+ await this.initialize();
105
+ }
106
+ // Handle pending preview approval
107
+ if (this.pendingPreview) {
108
+ return this.handlePreviewResponse(userMessage);
109
+ }
110
+ // Add user message
111
+ this.messages.push({ role: 'user', content: userMessage });
112
+ // Truncate BEFORE LLM call to ensure the LLM sees a bounded context
113
+ // This prevents sending unbounded history to the provider
114
+ this.truncateHistory();
115
+ // Process with LLM
116
+ const responses = await this.processLLMResponse();
117
+ // Truncate again after processing for storage (handles messages added during tool calling)
118
+ this.truncateHistory();
119
+ return responses;
120
+ }
121
+ /**
122
+ * Handle response to a pending preview
123
+ */
124
+ async handlePreviewResponse(userMessage) {
125
+ const preview = this.pendingPreview;
126
+ this.pendingPreview = null;
127
+ const lower = userMessage.toLowerCase().trim();
128
+ const approved = lower === 'yes' ||
129
+ lower === 'y' ||
130
+ lower === 'approve' ||
131
+ lower === 'confirm';
132
+ if (!approved) {
133
+ // User declined
134
+ this.messages.push({
135
+ role: 'user',
136
+ content: userMessage,
137
+ });
138
+ this.messages.push({
139
+ role: 'assistant',
140
+ content: JSON.stringify({
141
+ answer: 'Operation cancelled. The destructive action was not executed.',
142
+ }),
143
+ });
144
+ // Log audit entry for declined action (fire-and-forget)
145
+ await logDestructiveActionSafe({
146
+ abilityName: preview.ability.name,
147
+ preview: {
148
+ summary: preview.preview.summary,
149
+ affectedCount: preview.preview.affected.length,
150
+ },
151
+ userDecision: 'declined',
152
+ input: preview.input,
153
+ });
154
+ // Truncate after preview resolution (safe boundary)
155
+ this.truncateHistory();
156
+ return [
157
+ {
158
+ type: 'message',
159
+ content: 'Operation cancelled. The destructive action was not executed.',
160
+ },
161
+ ];
162
+ }
163
+ // User approved - execute with confirm
164
+ this.messages.push({
165
+ role: 'user',
166
+ content: 'User approved: yes',
167
+ });
168
+ const result = await this.executor.execute(preview.ability.name, preview.input, { confirm: true });
169
+ // Log audit entry for approved and executed action (fire-and-forget)
170
+ const executionAudit = {
171
+ success: result.success,
172
+ };
173
+ if (result.error?.message) {
174
+ executionAudit.error = getInputSanitizer().sanitizeErrorMessage(result.error.message);
175
+ }
176
+ await logDestructiveActionSafe({
177
+ abilityName: preview.ability.name,
178
+ preview: {
179
+ summary: preview.preview.summary,
180
+ affectedCount: preview.preview.affected.length,
181
+ },
182
+ userDecision: 'approved',
183
+ execution: executionAudit,
184
+ input: preview.input,
185
+ });
186
+ // Add result to context
187
+ const toolResultMsg = {
188
+ role: 'tool',
189
+ content: JSON.stringify(result),
190
+ toolCallId: `execute_${preview.ability.name}`,
191
+ toolName: preview.ability.name,
192
+ };
193
+ this.messages.push(toolResultMsg);
194
+ // Truncate after preview resolution (safe boundary)
195
+ this.truncateHistory();
196
+ return [
197
+ {
198
+ type: 'tool_result',
199
+ tool: preview.ability.name,
200
+ result,
201
+ preview: preview.preview,
202
+ },
203
+ ];
204
+ }
205
+ /**
206
+ * Process LLM response with tool calling loop
207
+ */
208
+ async processLLMResponse() {
209
+ const responses = [];
210
+ let toolCallCount = 0;
211
+ let retryCount = 0;
212
+ while (toolCallCount < this.maxToolCallsPerTurn) {
213
+ // Call LLM
214
+ const chatOptions = {
215
+ model: this.model,
216
+ temperature: this.temperature,
217
+ tools: this.tools,
218
+ };
219
+ // Get LLM response (streaming or non-streaming)
220
+ let llmResponse;
221
+ if (this.stream && this.provider.chatStream && this.provider.capabilities.streaming) {
222
+ const stream = this.provider.chatStream(this.messages, chatOptions);
223
+ llmResponse = await this.accumulateStream(stream);
224
+ }
225
+ else {
226
+ llmResponse = await this.provider.chat(this.messages, chatOptions);
227
+ }
228
+ // Don't process tool calls from interrupted streams — arguments may be incomplete
229
+ if (llmResponse.finishReason === 'error') {
230
+ responses.push({
231
+ type: 'error',
232
+ error: 'Response interrupted — please try again',
233
+ });
234
+ break;
235
+ }
236
+ // Parse response
237
+ const parseResult = parseResponse(llmResponse, {
238
+ abilities: this.abilities,
239
+ validateToolExists: true,
240
+ });
241
+ // Handle parse errors with retry
242
+ if (parseResult.response.type === 'error') {
243
+ if (isRetryable(parseResult) && retryCount < this.maxParseRetries) {
244
+ retryCount++;
245
+ // Add retry prompt
246
+ this.messages.push({
247
+ role: 'assistant',
248
+ content: llmResponse.content,
249
+ });
250
+ this.messages.push({
251
+ role: 'user',
252
+ content: buildRetryPrompt(parseResult),
253
+ });
254
+ continue;
255
+ }
256
+ // Unrecoverable error
257
+ responses.push({
258
+ type: 'error',
259
+ error: parseResult.response.error,
260
+ });
261
+ break;
262
+ }
263
+ retryCount = 0; // Reset on successful parse
264
+ // Handle answer
265
+ if (parseResult.response.type === 'answer') {
266
+ this.messages.push({
267
+ role: 'assistant',
268
+ content: llmResponse.content,
269
+ });
270
+ responses.push({
271
+ type: 'message',
272
+ content: parseResult.response.answer,
273
+ });
274
+ break;
275
+ }
276
+ // Handle tool call
277
+ const toolResponse = parseResult.response;
278
+ toolCallCount++;
279
+ // Add assistant message with tool call
280
+ this.messages.push({
281
+ role: 'assistant',
282
+ content: llmResponse.content,
283
+ });
284
+ // Execute tool
285
+ const toolResult = await this.executeTool(toolResponse.tool, toolResponse.input);
286
+ if (toolResult.type === 'preview') {
287
+ // Preview requires user approval - stop here
288
+ responses.push(toolResult);
289
+ break;
290
+ }
291
+ responses.push(toolResult);
292
+ // Add tool result to context
293
+ if (toolResult.type === 'tool_result') {
294
+ const resultContent = toolResult.result.success
295
+ ? JSON.stringify(toolResult.result.data)
296
+ : JSON.stringify(toolResult.result.error);
297
+ this.messages.push({
298
+ role: 'tool',
299
+ content: resultContent,
300
+ toolCallId: toolResponse.id ?? `call_${toolCallCount}`,
301
+ toolName: toolResponse.tool,
302
+ });
303
+ // Truncate between tool-call iterations to enforce context limit
304
+ // This ensures each provider.chat call receives a bounded history
305
+ // Note: truncateHistory() already skips when pendingPreview is set
306
+ this.truncateHistory();
307
+ }
308
+ else if (toolResult.type === 'error') {
309
+ this.messages.push({
310
+ role: 'tool',
311
+ content: JSON.stringify({ error: toolResult.error }),
312
+ toolCallId: toolResponse.id ?? `call_${toolCallCount}`,
313
+ toolName: toolResponse.tool,
314
+ });
315
+ break; // Stop on error
316
+ }
317
+ }
318
+ // If we hit max tool calls, add a notice
319
+ if (toolCallCount >= this.maxToolCallsPerTurn) {
320
+ responses.push({
321
+ type: 'message',
322
+ content: `Reached maximum tool calls (${this.maxToolCallsPerTurn}). Please continue if needed.`,
323
+ });
324
+ }
325
+ return responses;
326
+ }
327
+ /**
328
+ * Execute a tool with safety checks
329
+ *
330
+ * CRITICAL: All execution goes through SafetyController
331
+ */
332
+ async executeTool(toolName, input) {
333
+ // Find ability
334
+ const ability = await this.executor.getAbility(toolName);
335
+ if (!ability) {
336
+ return {
337
+ type: 'error',
338
+ error: `Unknown ability: ${toolName}`,
339
+ };
340
+ }
341
+ // Check if destructive
342
+ const classification = this.safetyController.classify(ability);
343
+ if (classification.requiresSafetyFlow) {
344
+ // SAFETY: Destructive actions always preview first
345
+ // AI cannot skip this step
346
+ return this.executeWithPreview(ability, input);
347
+ }
348
+ // Safe to execute directly
349
+ try {
350
+ const result = await this.executor.execute(ability.name, input);
351
+ return {
352
+ type: 'tool_result',
353
+ tool: ability.name,
354
+ result,
355
+ };
356
+ }
357
+ catch (error) {
358
+ return {
359
+ type: 'error',
360
+ error: error instanceof Error ? error.message : String(error),
361
+ };
362
+ }
363
+ }
364
+ /**
365
+ * Execute destructive action with preview
366
+ */
367
+ async executeWithPreview(ability, input) {
368
+ try {
369
+ // Execute with dry_run
370
+ const previewResult = await this.executor.execute(ability.name, input, { dryRun: true });
371
+ if (!previewResult.success) {
372
+ return {
373
+ type: 'error',
374
+ error: previewResult.error?.message ?? 'Preview failed',
375
+ };
376
+ }
377
+ // Format preview
378
+ const preview = this.safetyController.formatPreviewResult(ability, input, previewResult);
379
+ // Store pending preview for approval
380
+ this.pendingPreview = { ability, input, preview };
381
+ return {
382
+ type: 'preview',
383
+ preview,
384
+ requiresApproval: true,
385
+ };
386
+ }
387
+ catch (error) {
388
+ return {
389
+ type: 'error',
390
+ error: error instanceof Error ? error.message : String(error),
391
+ };
392
+ }
393
+ }
394
+ /**
395
+ * Accumulate streaming chunks into a complete LLM response.
396
+ * This method consumes an AsyncGenerator<StreamChunk> and reconstructs
397
+ * a complete LLMResponse compatible with the existing parseResponse() logic.
398
+ *
399
+ * @param stream - The streaming generator from the provider
400
+ * @returns A complete LLMResponse with accumulated content and tool calls
401
+ */
402
+ async accumulateStream(stream) {
403
+ let content = '';
404
+ // Providers yield complete tool calls (not deltas), so we collect them directly
405
+ const toolCalls = [];
406
+ try {
407
+ for await (const chunk of stream) {
408
+ // Handle content chunks
409
+ if (chunk.content) {
410
+ content += chunk.content;
411
+ // Call callback for progressive display
412
+ if (this.onStreamChunk) {
413
+ this.onStreamChunk(chunk.content);
414
+ }
415
+ }
416
+ // Handle tool call chunks - providers yield each complete tool call as a separate chunk
417
+ // before the done chunk, so push each one immediately
418
+ if (chunk.toolCall && chunk.toolCall.id && chunk.toolCall.name) {
419
+ toolCalls.push({
420
+ id: chunk.toolCall.id,
421
+ name: chunk.toolCall.name,
422
+ arguments: chunk.toolCall.arguments ?? {},
423
+ });
424
+ }
425
+ // When done flag is set, we've collected all tool calls
426
+ if (chunk.done) {
427
+ break;
428
+ }
429
+ }
430
+ }
431
+ catch (error) {
432
+ // If streaming fails mid-response, return what we have so far
433
+ if (content || toolCalls.length > 0) {
434
+ console.error(`[ChatEngine] Stream interrupted: ${error instanceof Error ? error.message : String(error)}`);
435
+ return {
436
+ content,
437
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
438
+ finishReason: 'error',
439
+ model: this.provider.getDefaultModel(),
440
+ };
441
+ }
442
+ // If no content accumulated, re-throw
443
+ throw error;
444
+ }
445
+ // Return accumulated LLMResponse
446
+ const parsedToolCalls = toolCalls;
447
+ return {
448
+ content,
449
+ toolCalls: parsedToolCalls.length > 0 ? parsedToolCalls : undefined,
450
+ finishReason: parsedToolCalls.length > 0 ? 'tool_calls' : 'stop',
451
+ model: this.provider.getDefaultModel(),
452
+ };
453
+ }
454
+ /**
455
+ * Check if there's a pending preview awaiting approval
456
+ */
457
+ hasPendingPreview() {
458
+ return this.pendingPreview !== null;
459
+ }
460
+ /**
461
+ * Get the pending preview
462
+ */
463
+ getPendingPreview() {
464
+ return this.pendingPreview?.preview ?? null;
465
+ }
466
+ /**
467
+ * Cancel pending preview
468
+ */
469
+ cancelPendingPreview() {
470
+ this.pendingPreview = null;
471
+ }
472
+ /**
473
+ * Get conversation history (for debugging)
474
+ */
475
+ getHistory() {
476
+ return [...this.messages];
477
+ }
478
+ /**
479
+ * Clear conversation history (keep system prompt)
480
+ */
481
+ clearHistory() {
482
+ if (this.messages.length > 0) {
483
+ const systemPrompt = this.messages[0];
484
+ if (systemPrompt) {
485
+ this.messages = [systemPrompt];
486
+ }
487
+ }
488
+ this.pendingPreview = null;
489
+ }
490
+ /**
491
+ * Get message count (excluding system prompt)
492
+ */
493
+ getMessageCount() {
494
+ return this.messages.length - 1;
495
+ }
496
+ /**
497
+ * Estimate tokens for a set of messages using character count as a rough proxy.
498
+ * Uses character_count / 4 as a heuristic (common approximation for English text).
499
+ *
500
+ * NOTE: This is a rough estimate. Actual token counts from LLMResponse.usage
501
+ * are more accurate when available.
502
+ *
503
+ * @param messages - Messages to estimate tokens for
504
+ * @returns Estimated token count
505
+ */
506
+ estimateTokens(messages) {
507
+ let totalChars = 0;
508
+ for (const msg of messages) {
509
+ if (typeof msg.content === 'string') {
510
+ totalChars += msg.content.length;
511
+ }
512
+ }
513
+ // Character count / 4 is a common heuristic for English text tokenization
514
+ return Math.ceil(totalChars / 4);
515
+ }
516
+ /**
517
+ * Check if context truncation should occur based on message count limits.
518
+ * Token-based limits are reserved for future implementation.
519
+ *
520
+ * @returns true if truncation should occur, false if:
521
+ * - maxContextMessages is undefined (no limit)
522
+ * - maxContextMessages is 0 (explicit unlimited)
523
+ * - message count is within limit
524
+ */
525
+ shouldTruncate() {
526
+ if (this.maxContextMessages === undefined || this.maxContextMessages === 0) {
527
+ return false; // No limit configured or explicitly unlimited
528
+ }
529
+ return this.getMessageCount() > this.maxContextMessages;
530
+ }
531
+ /**
532
+ * Find the index where truncation should start, respecting message boundaries.
533
+ * This ensures we keep complete user-assistant exchanges and tool call-result pairs.
534
+ *
535
+ * @returns Index in the messages array where truncation should start (exclusive of system prompt)
536
+ */
537
+ findTruncationPoint() {
538
+ if (this.maxContextMessages === undefined || this.maxContextMessages <= 0) {
539
+ return 1; // Keep only system prompt
540
+ }
541
+ // Calculate how many messages to keep (plus 1 for system prompt)
542
+ const targetLength = this.maxContextMessages + 1;
543
+ if (this.messages.length <= targetLength) {
544
+ return this.messages.length; // No truncation needed
545
+ }
546
+ // Start from where we'd ideally cut
547
+ const idealTruncationIndex = this.messages.length - this.maxContextMessages;
548
+ // Ensure we don't cut the system prompt
549
+ let truncationIndex = Math.max(1, idealTruncationIndex);
550
+ // Walk forward to find a safe boundary (start of a user message)
551
+ // This ensures we don't split:
552
+ // - user message + assistant response
553
+ // - tool call + tool result
554
+ // - retry prompts from their original failed attempt
555
+ const maxSearchIndex = this.messages.length;
556
+ while (truncationIndex < maxSearchIndex) {
557
+ const msg = this.messages[truncationIndex];
558
+ // Safe to cut at the start of a user message
559
+ if (msg && msg.role === 'user') {
560
+ break;
561
+ }
562
+ truncationIndex++;
563
+ }
564
+ // Fallback: if no user boundary found, keep at least maxContextMessages
565
+ // This ensures we don't drop all messages when the limit is very small
566
+ if (truncationIndex >= this.messages.length) {
567
+ truncationIndex = Math.max(1, idealTruncationIndex);
568
+ }
569
+ return truncationIndex;
570
+ }
571
+ /**
572
+ * Truncate message history using a sliding window approach.
573
+ * Preserves:
574
+ * - System prompt (always first message)
575
+ * - Messages since pending preview (if any)
576
+ * - Most recent N messages where N = maxContextMessages
577
+ * - Complete message exchanges (user-assistant, tool call-result pairs)
578
+ */
579
+ truncateHistory() {
580
+ if (!this.shouldTruncate()) {
581
+ return;
582
+ }
583
+ // Safety: Never truncate if there's a pending preview
584
+ // This preserves context for the approval decision
585
+ if (this.pendingPreview !== null) {
586
+ return;
587
+ }
588
+ const systemPrompt = this.messages[0];
589
+ if (!systemPrompt) {
590
+ return;
591
+ }
592
+ const truncationIndex = this.findTruncationPoint();
593
+ const messagesBefore = this.messages.length;
594
+ // Keep system prompt + messages from truncation point onwards
595
+ this.messages = [systemPrompt, ...this.messages.slice(truncationIndex)];
596
+ // Debug logging (only if significant truncation occurred)
597
+ const messagesRemoved = messagesBefore - this.messages.length;
598
+ if (messagesRemoved > 0 && process.env['DEBUG']) {
599
+ console.debug(`[ChatEngine] Truncated ${messagesRemoved} messages (${messagesBefore - 1} -> ${this.messages.length - 1})`);
600
+ }
601
+ }
602
+ /**
603
+ * Get context window statistics for monitoring.
604
+ *
605
+ * @returns Object with current message count, max limit, and estimated tokens
606
+ */
607
+ getContextStats() {
608
+ return {
609
+ messageCount: this.getMessageCount(),
610
+ maxMessages: this.maxContextMessages,
611
+ estimatedTokens: this.estimateTokens(this.messages),
612
+ };
613
+ }
614
+ /**
615
+ * Get loaded abilities
616
+ */
617
+ getAbilities() {
618
+ return [...this.abilities];
619
+ }
620
+ /**
621
+ * Get provider info
622
+ */
623
+ getProviderInfo() {
624
+ return {
625
+ name: this.provider.name,
626
+ model: this.model ?? this.provider.getDefaultModel(),
627
+ };
628
+ }
629
+ }
630
+ /**
631
+ * Create a chat engine
632
+ */
633
+ export function createChatEngine(options) {
634
+ return new ChatEngine(options);
635
+ }
636
+ //# sourceMappingURL=chat-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-engine.js","sourceRoot":"","sources":["../../src/chat/chat-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Chat Module Index
3
+ *
4
+ * Re-exports all chat components.
5
+ */
6
+ export * from './system-prompt.js';
7
+ export * from './tool-envelope.js';
8
+ export * from './chat-engine.js';
9
+ export * from './providers/index.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chat/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,oBAAoB,CAAC;AAGnC,cAAc,oBAAoB,CAAC;AAGnC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,sBAAsB,CAAC"}