@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,284 @@
1
+ /**
2
+ * Google Gemini Provider for mainwpcontrol
3
+ *
4
+ * Implements LLM provider interface for Gemini models.
5
+ */
6
+ import { registerProvider, } from './provider.js';
7
+ import { makeProviderRequest } from './provider-fetch.js';
8
+ import { readSSEStream } from './sse-reader.js';
9
+ /**
10
+ * Available Gemini models
11
+ */
12
+ const GEMINI_MODELS = [
13
+ 'gemini-2.0-flash-exp',
14
+ 'gemini-1.5-pro',
15
+ 'gemini-1.5-flash',
16
+ 'gemini-1.5-flash-8b',
17
+ ];
18
+ const DEFAULT_MODEL = 'gemini-1.5-flash';
19
+ /**
20
+ * Gemini provider implementation
21
+ */
22
+ export class GeminiProvider {
23
+ name = 'gemini';
24
+ capabilities = {
25
+ functionCalling: true,
26
+ streaming: true,
27
+ systemMessages: true,
28
+ vision: true,
29
+ maxContextLength: 1000000, // Gemini 1.5 Pro
30
+ };
31
+ apiKey;
32
+ baseUrl;
33
+ defaultModel;
34
+ timeout;
35
+ constructor(config) {
36
+ this.apiKey = config.apiKey;
37
+ this.baseUrl =
38
+ config.baseUrl ?? 'https://generativelanguage.googleapis.com/v1beta';
39
+ this.defaultModel = config.defaultModel ?? DEFAULT_MODEL;
40
+ this.timeout = config.timeout ?? 60000;
41
+ }
42
+ isConfigured() {
43
+ return Boolean(this.apiKey);
44
+ }
45
+ getModels() {
46
+ return [...GEMINI_MODELS];
47
+ }
48
+ getDefaultModel() {
49
+ return this.defaultModel;
50
+ }
51
+ async chat(messages, options) {
52
+ const model = options?.model ?? this.defaultModel;
53
+ // Extract system message
54
+ const systemMessage = messages.find((m) => m.role === 'system');
55
+ const chatMessages = messages.filter((m) => m.role !== 'system');
56
+ const requestBody = {
57
+ contents: this.convertMessages(chatMessages),
58
+ };
59
+ // System instruction
60
+ if (systemMessage) {
61
+ requestBody['systemInstruction'] = {
62
+ parts: [{ text: systemMessage.content }],
63
+ };
64
+ }
65
+ // Generation config
66
+ const generationConfig = {};
67
+ if (options?.temperature !== undefined) {
68
+ generationConfig['temperature'] = options.temperature;
69
+ }
70
+ if (options?.maxTokens !== undefined) {
71
+ generationConfig['maxOutputTokens'] = options.maxTokens;
72
+ }
73
+ if (options?.stop) {
74
+ generationConfig['stopSequences'] = options.stop;
75
+ }
76
+ if (Object.keys(generationConfig).length > 0) {
77
+ requestBody['generationConfig'] = generationConfig;
78
+ }
79
+ // Tools
80
+ if (options?.tools && options.tools.length > 0) {
81
+ requestBody['tools'] = [this.convertTools(options.tools)];
82
+ }
83
+ const endpoint = `/models/${model}:generateContent`;
84
+ const response = await this.makeRequest(endpoint, requestBody, options?.signal);
85
+ return this.convertResponse(response, model);
86
+ }
87
+ async *chatStream(messages, options) {
88
+ const model = options?.model ?? this.defaultModel;
89
+ // Extract system message
90
+ const systemMessage = messages.find((m) => m.role === 'system');
91
+ const chatMessages = messages.filter((m) => m.role !== 'system');
92
+ const requestBody = {
93
+ contents: this.convertMessages(chatMessages),
94
+ };
95
+ if (systemMessage) {
96
+ requestBody['systemInstruction'] = {
97
+ parts: [{ text: systemMessage.content }],
98
+ };
99
+ }
100
+ const generationConfig = {};
101
+ if (options?.temperature !== undefined) {
102
+ generationConfig['temperature'] = options.temperature;
103
+ }
104
+ if (options?.maxTokens !== undefined) {
105
+ generationConfig['maxOutputTokens'] = options.maxTokens;
106
+ }
107
+ if (Object.keys(generationConfig).length > 0) {
108
+ requestBody['generationConfig'] = generationConfig;
109
+ }
110
+ if (options?.tools && options.tools.length > 0) {
111
+ requestBody['tools'] = [this.convertTools(options.tools)];
112
+ }
113
+ for await (const data of readSSEStream({
114
+ url: `${this.baseUrl}/models/${model}:streamGenerateContent?alt=sse`,
115
+ headers: {
116
+ 'Content-Type': 'application/json',
117
+ 'x-goog-api-key': this.apiKey,
118
+ },
119
+ body: requestBody,
120
+ signal: options?.signal,
121
+ providerName: 'Gemini',
122
+ })) {
123
+ try {
124
+ const chunk = JSON.parse(data);
125
+ const candidate = chunk.candidates?.[0];
126
+ if (!candidate)
127
+ continue;
128
+ for (const part of candidate.content.parts) {
129
+ if ('text' in part) {
130
+ yield { content: part.text, done: false };
131
+ }
132
+ else if ('functionCall' in part) {
133
+ yield {
134
+ toolCall: {
135
+ id: `fc_${Date.now()}`,
136
+ name: part.functionCall.name,
137
+ arguments: part.functionCall.args,
138
+ },
139
+ done: false,
140
+ };
141
+ }
142
+ }
143
+ if (candidate.finishReason === 'STOP') {
144
+ yield { done: true };
145
+ return;
146
+ }
147
+ }
148
+ catch {
149
+ // Invalid JSON, skip line
150
+ }
151
+ }
152
+ yield { done: true };
153
+ }
154
+ /**
155
+ * Convert internal messages to Gemini format
156
+ */
157
+ convertMessages(messages) {
158
+ const result = [];
159
+ for (const msg of messages) {
160
+ if (msg.role === 'system')
161
+ continue;
162
+ if (msg.role === 'tool') {
163
+ // Function response
164
+ result.push({
165
+ role: 'user',
166
+ parts: [
167
+ {
168
+ functionResponse: {
169
+ name: msg.toolName ?? 'unknown',
170
+ response: this.parseToolResponse(msg.content),
171
+ },
172
+ },
173
+ ],
174
+ });
175
+ }
176
+ else {
177
+ result.push({
178
+ role: msg.role === 'assistant' ? 'model' : 'user',
179
+ parts: [{ text: msg.content }],
180
+ });
181
+ }
182
+ }
183
+ return result;
184
+ }
185
+ /**
186
+ * Parse tool response content
187
+ */
188
+ parseToolResponse(content) {
189
+ try {
190
+ return JSON.parse(content);
191
+ }
192
+ catch {
193
+ return { result: content };
194
+ }
195
+ }
196
+ /**
197
+ * Convert tool definitions to Gemini format
198
+ */
199
+ convertTools(tools) {
200
+ return {
201
+ functionDeclarations: tools.map((tool) => ({
202
+ name: tool.name,
203
+ description: tool.description,
204
+ parameters: tool.parameters,
205
+ })),
206
+ };
207
+ }
208
+ /**
209
+ * Convert Gemini response to internal format
210
+ */
211
+ convertResponse(response, model) {
212
+ const candidate = response.candidates?.[0];
213
+ if (!candidate) {
214
+ throw new Error('No response candidate');
215
+ }
216
+ let content = '';
217
+ const toolCalls = [];
218
+ for (const part of candidate.content.parts) {
219
+ if ('text' in part) {
220
+ content += part.text;
221
+ }
222
+ else if ('functionCall' in part) {
223
+ toolCalls.push({
224
+ id: `fc_${Date.now()}_${toolCalls.length}`,
225
+ name: part.functionCall.name,
226
+ arguments: part.functionCall.args,
227
+ });
228
+ }
229
+ }
230
+ return {
231
+ content,
232
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
233
+ finishReason: this.convertFinishReason(candidate.finishReason),
234
+ usage: response.usageMetadata
235
+ ? {
236
+ promptTokens: response.usageMetadata.promptTokenCount,
237
+ completionTokens: response.usageMetadata.candidatesTokenCount,
238
+ totalTokens: response.usageMetadata.totalTokenCount,
239
+ }
240
+ : undefined,
241
+ model,
242
+ };
243
+ }
244
+ /**
245
+ * Convert finish reason
246
+ */
247
+ convertFinishReason(reason) {
248
+ switch (reason) {
249
+ case 'STOP':
250
+ return 'stop';
251
+ case 'MAX_TOKENS':
252
+ return 'length';
253
+ case 'SAFETY':
254
+ return 'content_filter';
255
+ default:
256
+ return 'stop';
257
+ }
258
+ }
259
+ /**
260
+ * Make API request
261
+ */
262
+ async makeRequest(endpoint, body, signal) {
263
+ return makeProviderRequest({
264
+ url: `${this.baseUrl}${endpoint}`,
265
+ headers: {
266
+ 'Content-Type': 'application/json',
267
+ 'x-goog-api-key': this.apiKey,
268
+ },
269
+ body,
270
+ timeout: this.timeout,
271
+ signal,
272
+ providerName: 'Gemini',
273
+ });
274
+ }
275
+ }
276
+ /**
277
+ * Create Gemini provider
278
+ */
279
+ export function createGeminiProvider(config) {
280
+ return new GeminiProvider(config);
281
+ }
282
+ // Register provider
283
+ registerProvider('gemini', createGeminiProvider);
284
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/chat/providers/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * LLM Providers Index
3
+ *
4
+ * Re-exports all provider implementations.
5
+ * Import this file to register all providers.
6
+ */
7
+ export * from './provider.js';
8
+ export { OpenAICompatibleProvider } from './openai-compatible.js';
9
+ export { OpenAIProvider, createOpenAIProvider } from './openai.js';
10
+ export { AnthropicProvider, createAnthropicProvider } from './anthropic.js';
11
+ export { GeminiProvider, createGeminiProvider } from './gemini.js';
12
+ export { OpenRouterProvider, createOpenRouterProvider } from './openrouter.js';
13
+ export { LocalProvider, createLocalProvider } from './local.js';
14
+ import './openai.js';
15
+ import './anthropic.js';
16
+ import './gemini.js';
17
+ import './openrouter.js';
18
+ import './local.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/chat/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,eAAe,CAAC;AAG9B,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGlE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGhE,OAAO,aAAa,CAAC;AACrB,OAAO,gBAAgB,CAAC;AACxB,OAAO,aAAa,CAAC;AACrB,OAAO,iBAAiB,CAAC;AACzB,OAAO,YAAY,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * LLM Providers Index
3
+ *
4
+ * Re-exports all provider implementations.
5
+ * Import this file to register all providers.
6
+ */
7
+ // Core provider interface and utilities
8
+ export * from './provider.js';
9
+ // OpenAI-compatible base class
10
+ export { OpenAICompatibleProvider } from './openai-compatible.js';
11
+ // Provider implementations
12
+ export { OpenAIProvider, createOpenAIProvider } from './openai.js';
13
+ export { AnthropicProvider, createAnthropicProvider } from './anthropic.js';
14
+ export { GeminiProvider, createGeminiProvider } from './gemini.js';
15
+ export { OpenRouterProvider, createOpenRouterProvider } from './openrouter.js';
16
+ export { LocalProvider, createLocalProvider } from './local.js';
17
+ // Register all providers by importing them
18
+ import './openai.js';
19
+ import './anthropic.js';
20
+ import './gemini.js';
21
+ import './openrouter.js';
22
+ import './local.js';
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/chat/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wCAAwC;AACxC,cAAc,eAAe,CAAC;AAE9B,+BAA+B;AAC/B,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAElE,2BAA2B;AAC3B,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEhE,2CAA2C;AAC3C,OAAO,aAAa,CAAC;AACrB,OAAO,gBAAgB,CAAC;AACxB,OAAO,aAAa,CAAC;AACrB,OAAO,iBAAiB,CAAC;AACzB,OAAO,YAAY,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Local LLM Provider for mainwpcontrol
3
+ *
4
+ * Implements LLM provider interface for OpenAI-compatible local endpoints.
5
+ * Supports llama.cpp, Ollama, LM Studio, and other OpenAI-compatible servers.
6
+ */
7
+ import { type LLMProvider, type LLMResponse, type Message, type ChatOptions, type ProviderConfig, type ProviderCapabilities } from './provider.js';
8
+ import { OpenAICompatibleProvider } from './openai-compatible.js';
9
+ /**
10
+ * Local LLM provider implementation
11
+ */
12
+ export declare class LocalProvider extends OpenAICompatibleProvider {
13
+ readonly name = "local";
14
+ readonly capabilities: ProviderCapabilities;
15
+ constructor(config: ProviderConfig);
16
+ isConfigured(): boolean;
17
+ getModels(): string[];
18
+ protected getHeaders(): Record<string, string>;
19
+ /**
20
+ * Override chat to add tool-embedding fallback for servers without function calling
21
+ */
22
+ chat(messages: Message[], options?: ChatOptions): Promise<LLMResponse>;
23
+ /**
24
+ * Generate a tool call ID for streaming when the server doesn't provide one.
25
+ * Local servers often omit tool call IDs.
26
+ */
27
+ protected getStreamToolCallId(index: number): string;
28
+ /**
29
+ * Embed tool definitions in system prompt for servers without function calling
30
+ */
31
+ private embedToolsInSystemPrompt;
32
+ }
33
+ /**
34
+ * Create Local provider
35
+ */
36
+ export declare function createLocalProvider(config: ProviderConfig): LLMProvider;
37
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../src/chat/providers/local.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAE1B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,wBAAwB,EAEzB,MAAM,wBAAwB,CAAC;AAKhC;;GAEG;AACH,qBAAa,aAAc,SAAQ,wBAAwB;IACzD,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAMzC;gBAEU,MAAM,EAAE,cAAc;IAOlC,YAAY,IAAI,OAAO;IAKvB,SAAS,IAAI,MAAM,EAAE;IAKrB,SAAS,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAY9C;;OAEG;IACG,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAkC5E;;;OAGG;cACgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI7D;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAqDjC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW,CAEvE"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Local LLM Provider for mainwpcontrol
3
+ *
4
+ * Implements LLM provider interface for OpenAI-compatible local endpoints.
5
+ * Supports llama.cpp, Ollama, LM Studio, and other OpenAI-compatible servers.
6
+ */
7
+ import { registerProvider, } from './provider.js';
8
+ import { OpenAICompatibleProvider, } from './openai-compatible.js';
9
+ const DEFAULT_BASE_URL = 'http://localhost:8080/v1';
10
+ const DEFAULT_MODEL = 'local';
11
+ /**
12
+ * Local LLM provider implementation
13
+ */
14
+ export class LocalProvider extends OpenAICompatibleProvider {
15
+ name = 'local';
16
+ capabilities = {
17
+ functionCalling: true, // May vary by server
18
+ streaming: true,
19
+ systemMessages: true,
20
+ vision: false, // Typically not supported
21
+ maxContextLength: 8192, // Default, varies by model
22
+ };
23
+ constructor(config) {
24
+ super({ ...config, apiKey: config.apiKey || 'not-needed' }, { baseUrl: DEFAULT_BASE_URL, model: DEFAULT_MODEL, timeout: 120000 });
25
+ }
26
+ isConfigured() {
27
+ // Local providers don't necessarily need an API key
28
+ return Boolean(this.baseUrl);
29
+ }
30
+ getModels() {
31
+ // Local models are dynamic, return default
32
+ return [this.defaultModel];
33
+ }
34
+ getHeaders() {
35
+ const headers = {
36
+ 'Content-Type': 'application/json',
37
+ };
38
+ if (this.apiKey && this.apiKey !== 'not-needed') {
39
+ headers['Authorization'] = `Bearer ${this.apiKey}`;
40
+ }
41
+ return headers;
42
+ }
43
+ /**
44
+ * Override chat to add tool-embedding fallback for servers without function calling
45
+ */
46
+ async chat(messages, options) {
47
+ try {
48
+ return await super.chat(messages, options);
49
+ }
50
+ catch (error) {
51
+ // If function calling fails, try without tools
52
+ if (options?.tools &&
53
+ error instanceof Error &&
54
+ error.message.includes('tool')) {
55
+ // Retry without tools, embedding tool info in system prompt
56
+ const messagesWithToolInfo = this.embedToolsInSystemPrompt(messages, options.tools);
57
+ const model = options?.model ?? this.defaultModel;
58
+ const fallbackBody = {
59
+ model,
60
+ messages: this.convertMessages(messagesWithToolInfo),
61
+ temperature: options?.temperature,
62
+ max_tokens: options?.maxTokens,
63
+ stop: options?.stop,
64
+ };
65
+ const response = await this.makeRequest('/chat/completions', fallbackBody, options?.signal);
66
+ return this.convertResponse(response);
67
+ }
68
+ throw error;
69
+ }
70
+ }
71
+ /**
72
+ * Generate a tool call ID for streaming when the server doesn't provide one.
73
+ * Local servers often omit tool call IDs.
74
+ */
75
+ getStreamToolCallId(index) {
76
+ return `tc_${Date.now()}_${index}`;
77
+ }
78
+ /**
79
+ * Embed tool definitions in system prompt for servers without function calling
80
+ */
81
+ embedToolsInSystemPrompt(messages, tools) {
82
+ const toolInfo = tools
83
+ .map((t) => `- ${t.name}: ${t.description}\n Parameters: ${JSON.stringify(t.parameters, null, 2)}`)
84
+ .join('\n');
85
+ const toolPrompt = `
86
+ You have access to the following tools. To use a tool, respond with a JSON object in this format:
87
+ { "tool": "<tool_name>", "input": { <parameters> } }
88
+
89
+ Available tools:
90
+ ${toolInfo}
91
+
92
+ If you don't need to use a tool, respond with:
93
+ { "answer": "<your response>" }
94
+ `;
95
+ const result = [...messages];
96
+ const systemIdx = result.findIndex((m) => m.role === 'system');
97
+ if (systemIdx >= 0) {
98
+ const existingMsg = result[systemIdx];
99
+ if (existingMsg) {
100
+ const updatedMsg = {
101
+ role: existingMsg.role,
102
+ content: existingMsg.content + '\n\n' + toolPrompt,
103
+ };
104
+ if (existingMsg.toolCallId) {
105
+ updatedMsg.toolCallId = existingMsg.toolCallId;
106
+ }
107
+ if (existingMsg.toolName) {
108
+ updatedMsg.toolName = existingMsg.toolName;
109
+ }
110
+ result[systemIdx] = updatedMsg;
111
+ }
112
+ }
113
+ else {
114
+ result.unshift({
115
+ role: 'system',
116
+ content: toolPrompt,
117
+ });
118
+ }
119
+ return result;
120
+ }
121
+ }
122
+ /**
123
+ * Create Local provider
124
+ */
125
+ export function createLocalProvider(config) {
126
+ return new LocalProvider(config);
127
+ }
128
+ // Register provider
129
+ registerProvider('local', createLocalProvider);
130
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../../src/chat/providers/local.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAOL,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,wBAAwB,GAEzB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AACpD,MAAM,aAAa,GAAG,OAAO,CAAC;AAE9B;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,wBAAwB;IAChD,IAAI,GAAG,OAAO,CAAC;IACf,YAAY,GAAyB;QAC5C,eAAe,EAAE,IAAI,EAAE,qBAAqB;QAC5C,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,IAAI;QACpB,MAAM,EAAE,KAAK,EAAE,0BAA0B;QACzC,gBAAgB,EAAE,IAAI,EAAE,2BAA2B;KACpD,CAAC;IAEF,YAAY,MAAsB;QAChC,KAAK,CACH,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,YAAY,EAAE,EACpD,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,CACrE,CAAC;IACJ,CAAC;IAED,YAAY;QACV,oDAAoD;QACpD,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,SAAS;QACP,2CAA2C;QAC3C,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IAES,UAAU;QAClB,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YAChD,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACrD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,QAAmB,EAAE,OAAqB;QACnD,IAAI,CAAC;YACH,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,+CAA+C;YAC/C,IACE,OAAO,EAAE,KAAK;gBACd,KAAK,YAAY,KAAK;gBACtB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAC9B,CAAC;gBACD,4DAA4D;gBAC5D,MAAM,oBAAoB,GAAG,IAAI,CAAC,wBAAwB,CACxD,QAAQ,EACR,OAAO,CAAC,KAAK,CACd,CAAC;gBACF,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC;gBAClD,MAAM,YAAY,GAA4B;oBAC5C,KAAK;oBACL,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC;oBACpD,WAAW,EAAE,OAAO,EAAE,WAAW;oBACjC,UAAU,EAAE,OAAO,EAAE,SAAS;oBAC9B,IAAI,EAAE,OAAO,EAAE,IAAI;iBACpB,CAAC;gBACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CACrC,mBAAmB,EACnB,YAAY,EACZ,OAAO,EAAE,MAAM,CAChB,CAAC;gBACF,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACxC,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACgB,mBAAmB,CAAC,KAAa;QAClD,OAAO,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,wBAAwB,CAC9B,QAAmB,EACnB,KAIE;QAEF,MAAM,QAAQ,GAAG,KAAK;aACnB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,mBAAmB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAC1F;aACA,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,UAAU,GAAG;;;;;EAKrB,QAAQ;;;;CAIT,CAAC;QAEE,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAE/D,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;YACtC,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,UAAU,GAAY;oBAC1B,IAAI,EAAE,WAAW,CAAC,IAAI;oBACtB,OAAO,EAAE,WAAW,CAAC,OAAO,GAAG,MAAM,GAAG,UAAU;iBACnD,CAAC;gBACF,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;oBAC3B,UAAU,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;gBACjD,CAAC;gBACD,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;oBACzB,UAAU,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;gBAC7C,CAAC;gBACD,MAAM,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC;YACjC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC;gBACb,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,UAAU;aACpB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAsB;IACxD,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,oBAAoB;AACpB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC"}