@superdangerous/app-framework 4.9.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 (239) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +652 -0
  3. package/dist/api/logsRouter.d.ts +20 -0
  4. package/dist/api/logsRouter.d.ts.map +1 -0
  5. package/dist/api/logsRouter.js +515 -0
  6. package/dist/api/logsRouter.js.map +1 -0
  7. package/dist/cli/dev-server.d.ts +7 -0
  8. package/dist/cli/dev-server.d.ts.map +1 -0
  9. package/dist/cli/dev-server.js +640 -0
  10. package/dist/cli/dev-server.js.map +1 -0
  11. package/dist/cli/index.d.ts +7 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +26 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/core/StandardServer.d.ts +129 -0
  16. package/dist/core/StandardServer.d.ts.map +1 -0
  17. package/dist/core/StandardServer.js +453 -0
  18. package/dist/core/StandardServer.js.map +1 -0
  19. package/dist/core/apiResponse.d.ts +69 -0
  20. package/dist/core/apiResponse.d.ts.map +1 -0
  21. package/dist/core/apiResponse.js +127 -0
  22. package/dist/core/apiResponse.js.map +1 -0
  23. package/dist/core/healthCheck.d.ts +160 -0
  24. package/dist/core/healthCheck.d.ts.map +1 -0
  25. package/dist/core/healthCheck.js +398 -0
  26. package/dist/core/healthCheck.js.map +1 -0
  27. package/dist/core/index.d.ts +40 -0
  28. package/dist/core/index.d.ts.map +1 -0
  29. package/dist/core/index.js +40 -0
  30. package/dist/core/index.js.map +1 -0
  31. package/dist/core/logger.d.ts +117 -0
  32. package/dist/core/logger.d.ts.map +1 -0
  33. package/dist/core/logger.js +826 -0
  34. package/dist/core/logger.js.map +1 -0
  35. package/dist/core/portUtils.d.ts +71 -0
  36. package/dist/core/portUtils.d.ts.map +1 -0
  37. package/dist/core/portUtils.js +240 -0
  38. package/dist/core/portUtils.js.map +1 -0
  39. package/dist/core/storageService.d.ts +119 -0
  40. package/dist/core/storageService.d.ts.map +1 -0
  41. package/dist/core/storageService.js +405 -0
  42. package/dist/core/storageService.js.map +1 -0
  43. package/dist/desktop/bundler.d.ts +40 -0
  44. package/dist/desktop/bundler.d.ts.map +1 -0
  45. package/dist/desktop/bundler.js +176 -0
  46. package/dist/desktop/bundler.js.map +1 -0
  47. package/dist/desktop/index.d.ts +25 -0
  48. package/dist/desktop/index.d.ts.map +1 -0
  49. package/dist/desktop/index.js +15 -0
  50. package/dist/desktop/index.js.map +1 -0
  51. package/dist/desktop/native-modules.d.ts +66 -0
  52. package/dist/desktop/native-modules.d.ts.map +1 -0
  53. package/dist/desktop/native-modules.js +200 -0
  54. package/dist/desktop/native-modules.js.map +1 -0
  55. package/dist/index.d.ts +29 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +39 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/logging/LogCategories.d.ts +87 -0
  60. package/dist/logging/LogCategories.d.ts.map +1 -0
  61. package/dist/logging/LogCategories.js +205 -0
  62. package/dist/logging/LogCategories.js.map +1 -0
  63. package/dist/middleware/aiErrorHandler.d.ts +31 -0
  64. package/dist/middleware/aiErrorHandler.d.ts.map +1 -0
  65. package/dist/middleware/aiErrorHandler.js +181 -0
  66. package/dist/middleware/aiErrorHandler.js.map +1 -0
  67. package/dist/middleware/auth.d.ts +101 -0
  68. package/dist/middleware/auth.d.ts.map +1 -0
  69. package/dist/middleware/auth.js +230 -0
  70. package/dist/middleware/auth.js.map +1 -0
  71. package/dist/middleware/cors.d.ts +56 -0
  72. package/dist/middleware/cors.d.ts.map +1 -0
  73. package/dist/middleware/cors.js +123 -0
  74. package/dist/middleware/cors.js.map +1 -0
  75. package/dist/middleware/errorHandler.d.ts +13 -0
  76. package/dist/middleware/errorHandler.d.ts.map +1 -0
  77. package/dist/middleware/errorHandler.js +85 -0
  78. package/dist/middleware/errorHandler.js.map +1 -0
  79. package/dist/middleware/fileUpload.d.ts +62 -0
  80. package/dist/middleware/fileUpload.d.ts.map +1 -0
  81. package/dist/middleware/fileUpload.js +175 -0
  82. package/dist/middleware/fileUpload.js.map +1 -0
  83. package/dist/middleware/health.d.ts +48 -0
  84. package/dist/middleware/health.d.ts.map +1 -0
  85. package/dist/middleware/health.js +143 -0
  86. package/dist/middleware/health.js.map +1 -0
  87. package/dist/middleware/index.d.ts +20 -0
  88. package/dist/middleware/index.d.ts.map +1 -0
  89. package/dist/middleware/index.js +18 -0
  90. package/dist/middleware/index.js.map +1 -0
  91. package/dist/middleware/openapi.d.ts +64 -0
  92. package/dist/middleware/openapi.d.ts.map +1 -0
  93. package/dist/middleware/openapi.js +258 -0
  94. package/dist/middleware/openapi.js.map +1 -0
  95. package/dist/middleware/requestLogging.d.ts +22 -0
  96. package/dist/middleware/requestLogging.d.ts.map +1 -0
  97. package/dist/middleware/requestLogging.js +61 -0
  98. package/dist/middleware/requestLogging.js.map +1 -0
  99. package/dist/middleware/session.d.ts +84 -0
  100. package/dist/middleware/session.d.ts.map +1 -0
  101. package/dist/middleware/session.js +189 -0
  102. package/dist/middleware/session.js.map +1 -0
  103. package/dist/middleware/validation.d.ts +1337 -0
  104. package/dist/middleware/validation.d.ts.map +1 -0
  105. package/dist/middleware/validation.js +483 -0
  106. package/dist/middleware/validation.js.map +1 -0
  107. package/dist/services/aiService.d.ts +180 -0
  108. package/dist/services/aiService.d.ts.map +1 -0
  109. package/dist/services/aiService.js +547 -0
  110. package/dist/services/aiService.js.map +1 -0
  111. package/dist/services/conversationStorage.d.ts +38 -0
  112. package/dist/services/conversationStorage.d.ts.map +1 -0
  113. package/dist/services/conversationStorage.js +158 -0
  114. package/dist/services/conversationStorage.js.map +1 -0
  115. package/dist/services/crossPlatformBuffer.d.ts +84 -0
  116. package/dist/services/crossPlatformBuffer.d.ts.map +1 -0
  117. package/dist/services/crossPlatformBuffer.js +246 -0
  118. package/dist/services/crossPlatformBuffer.js.map +1 -0
  119. package/dist/services/index.d.ts +17 -0
  120. package/dist/services/index.d.ts.map +1 -0
  121. package/dist/services/index.js +18 -0
  122. package/dist/services/index.js.map +1 -0
  123. package/dist/services/networkService.d.ts +81 -0
  124. package/dist/services/networkService.d.ts.map +1 -0
  125. package/dist/services/networkService.js +268 -0
  126. package/dist/services/networkService.js.map +1 -0
  127. package/dist/services/queueService.d.ts +112 -0
  128. package/dist/services/queueService.d.ts.map +1 -0
  129. package/dist/services/queueService.js +338 -0
  130. package/dist/services/queueService.js.map +1 -0
  131. package/dist/services/settingsService.d.ts +135 -0
  132. package/dist/services/settingsService.d.ts.map +1 -0
  133. package/dist/services/settingsService.js +425 -0
  134. package/dist/services/settingsService.js.map +1 -0
  135. package/dist/services/systemMonitor.d.ts +208 -0
  136. package/dist/services/systemMonitor.d.ts.map +1 -0
  137. package/dist/services/systemMonitor.js +693 -0
  138. package/dist/services/systemMonitor.js.map +1 -0
  139. package/dist/services/updateService.d.ts +78 -0
  140. package/dist/services/updateService.d.ts.map +1 -0
  141. package/dist/services/updateService.js +252 -0
  142. package/dist/services/updateService.js.map +1 -0
  143. package/dist/services/websocketEvents.d.ts +372 -0
  144. package/dist/services/websocketEvents.d.ts.map +1 -0
  145. package/dist/services/websocketEvents.js +338 -0
  146. package/dist/services/websocketEvents.js.map +1 -0
  147. package/dist/services/websocketServer.d.ts +80 -0
  148. package/dist/services/websocketServer.d.ts.map +1 -0
  149. package/dist/services/websocketServer.js +299 -0
  150. package/dist/services/websocketServer.js.map +1 -0
  151. package/dist/settings/SettingsSchema.d.ts +151 -0
  152. package/dist/settings/SettingsSchema.d.ts.map +1 -0
  153. package/dist/settings/SettingsSchema.js +424 -0
  154. package/dist/settings/SettingsSchema.js.map +1 -0
  155. package/dist/testing/TestServer.d.ts +69 -0
  156. package/dist/testing/TestServer.d.ts.map +1 -0
  157. package/dist/testing/TestServer.js +250 -0
  158. package/dist/testing/TestServer.js.map +1 -0
  159. package/dist/types/index.d.ts +137 -0
  160. package/dist/types/index.d.ts.map +1 -0
  161. package/dist/types/index.js +5 -0
  162. package/dist/types/index.js.map +1 -0
  163. package/dist/utils/appPaths.d.ts +74 -0
  164. package/dist/utils/appPaths.d.ts.map +1 -0
  165. package/dist/utils/appPaths.js +162 -0
  166. package/dist/utils/appPaths.js.map +1 -0
  167. package/dist/utils/fs-utils.d.ts +50 -0
  168. package/dist/utils/fs-utils.d.ts.map +1 -0
  169. package/dist/utils/fs-utils.js +114 -0
  170. package/dist/utils/fs-utils.js.map +1 -0
  171. package/dist/utils/index.d.ts +12 -0
  172. package/dist/utils/index.d.ts.map +1 -0
  173. package/dist/utils/index.js +10 -0
  174. package/dist/utils/index.js.map +1 -0
  175. package/dist/utils/standardConfig.d.ts +61 -0
  176. package/dist/utils/standardConfig.d.ts.map +1 -0
  177. package/dist/utils/standardConfig.js +109 -0
  178. package/dist/utils/standardConfig.js.map +1 -0
  179. package/dist/utils/startupBanner.d.ts +34 -0
  180. package/dist/utils/startupBanner.d.ts.map +1 -0
  181. package/dist/utils/startupBanner.js +169 -0
  182. package/dist/utils/startupBanner.js.map +1 -0
  183. package/dist/utils/startupLogger.d.ts +45 -0
  184. package/dist/utils/startupLogger.d.ts.map +1 -0
  185. package/dist/utils/startupLogger.js +200 -0
  186. package/dist/utils/startupLogger.js.map +1 -0
  187. package/package.json +151 -0
  188. package/src/api/logsRouter.ts +600 -0
  189. package/src/cli/dev-server.ts +803 -0
  190. package/src/cli/index.ts +31 -0
  191. package/src/core/StandardServer.ts +587 -0
  192. package/src/core/apiResponse.ts +202 -0
  193. package/src/core/healthCheck.ts +565 -0
  194. package/src/core/index.ts +80 -0
  195. package/src/core/logger.ts +1092 -0
  196. package/src/core/portUtils.ts +319 -0
  197. package/src/core/storageService.ts +595 -0
  198. package/src/desktop/bundler.ts +271 -0
  199. package/src/desktop/index.ts +18 -0
  200. package/src/desktop/native-modules.ts +289 -0
  201. package/src/index.ts +142 -0
  202. package/src/logging/LogCategories.ts +302 -0
  203. package/src/middleware/aiErrorHandler.ts +278 -0
  204. package/src/middleware/auth.ts +329 -0
  205. package/src/middleware/cors.ts +187 -0
  206. package/src/middleware/errorHandler.ts +103 -0
  207. package/src/middleware/fileUpload.ts +252 -0
  208. package/src/middleware/health.ts +206 -0
  209. package/src/middleware/index.ts +71 -0
  210. package/src/middleware/openapi.ts +305 -0
  211. package/src/middleware/requestLogging.ts +92 -0
  212. package/src/middleware/session.ts +238 -0
  213. package/src/middleware/validation.ts +603 -0
  214. package/src/services/aiService.ts +789 -0
  215. package/src/services/conversationStorage.ts +232 -0
  216. package/src/services/crossPlatformBuffer.ts +341 -0
  217. package/src/services/index.ts +47 -0
  218. package/src/services/networkService.ts +351 -0
  219. package/src/services/queueService.ts +446 -0
  220. package/src/services/settingsService.ts +549 -0
  221. package/src/services/systemMonitor.ts +936 -0
  222. package/src/services/updateService.ts +334 -0
  223. package/src/services/websocketEvents.ts +409 -0
  224. package/src/services/websocketServer.ts +394 -0
  225. package/src/settings/SettingsSchema.ts +664 -0
  226. package/src/testing/TestServer.ts +312 -0
  227. package/src/types/index.ts +154 -0
  228. package/src/utils/appPaths.ts +196 -0
  229. package/src/utils/fs-utils.ts +130 -0
  230. package/src/utils/index.ts +15 -0
  231. package/src/utils/standardConfig.ts +178 -0
  232. package/src/utils/startupBanner.ts +287 -0
  233. package/src/utils/startupLogger.ts +268 -0
  234. package/ui/dist/index.d.mts +1221 -0
  235. package/ui/dist/index.d.ts +1221 -0
  236. package/ui/dist/index.js +73 -0
  237. package/ui/dist/index.js.map +1 -0
  238. package/ui/dist/index.mjs +73 -0
  239. package/ui/dist/index.mjs.map +1 -0
@@ -0,0 +1,547 @@
1
+ /**
2
+ * AI Service Interface for multiple AI providers
3
+ * Provides a unified interface for OpenAI, Claude, and other AI services
4
+ */
5
+ import { EventEmitter } from "events";
6
+ import { createLogger } from "../core/index.js";
7
+ import { getStorageService } from "../core/storageService.js";
8
+ import OpenAI from "openai";
9
+ import * as crypto from "node:crypto";
10
+ /**
11
+ * Custom AI Error class that preserves structured error information
12
+ */
13
+ export class AIError extends Error {
14
+ statusCode;
15
+ errorType;
16
+ provider;
17
+ constructor(message, statusCode = 500, errorType = "AI_ERROR", provider = "unknown") {
18
+ super(message);
19
+ this.name = "AIError";
20
+ this.statusCode = statusCode;
21
+ this.errorType = errorType;
22
+ this.provider = provider;
23
+ }
24
+ }
25
+ /**
26
+ * Simple LRU Cache implementation to prevent memory leaks
27
+ */
28
+ class LRUCache {
29
+ cache = new Map();
30
+ maxSize;
31
+ constructor(maxSize = 1000) {
32
+ this.maxSize = maxSize;
33
+ }
34
+ get(key) {
35
+ if (this.cache.has(key)) {
36
+ // Move to end (most recent)
37
+ const value = this.cache.get(key);
38
+ this.cache.delete(key);
39
+ this.cache.set(key, value);
40
+ return value;
41
+ }
42
+ return undefined;
43
+ }
44
+ set(key, value) {
45
+ if (this.cache.has(key)) {
46
+ // Update existing
47
+ this.cache.delete(key);
48
+ }
49
+ else if (this.cache.size >= this.maxSize) {
50
+ // Remove oldest (first entry)
51
+ const firstKey = this.cache.keys().next().value;
52
+ if (firstKey !== undefined) {
53
+ this.cache.delete(firstKey);
54
+ }
55
+ }
56
+ this.cache.set(key, value);
57
+ }
58
+ has(key) {
59
+ return this.cache.has(key);
60
+ }
61
+ clear() {
62
+ this.cache.clear();
63
+ }
64
+ get size() {
65
+ return this.cache.size;
66
+ }
67
+ }
68
+ let logger; // Will be initialized when needed
69
+ function ensureLogger() {
70
+ if (!logger) {
71
+ logger = createLogger("AIService");
72
+ }
73
+ return logger;
74
+ }
75
+ /**
76
+ * Abstract base class for AI providers
77
+ */
78
+ export class AIProvider {
79
+ config;
80
+ constructor(config) {
81
+ this.config = config;
82
+ }
83
+ }
84
+ /**
85
+ * Model cost configuration
86
+ */
87
+ const MODEL_COSTS = {
88
+ "gpt-3.5-turbo": { input: 0.0005, output: 0.0015 },
89
+ "gpt-4": { input: 0.01, output: 0.03 },
90
+ "gpt-4-turbo": { input: 0.01, output: 0.03 },
91
+ "gpt-4-turbo-preview": { input: 0.01, output: 0.03 },
92
+ "gpt-4o": { input: 0.005, output: 0.015 },
93
+ "gpt-4o-mini": { input: 0.00015, output: 0.0006 },
94
+ };
95
+ /**
96
+ * OpenAI Provider Implementation
97
+ */
98
+ export class OpenAIProvider extends AIProvider {
99
+ client = null;
100
+ models;
101
+ constructor(config) {
102
+ super(config);
103
+ // Set default models or use provided ones
104
+ this.models = {
105
+ chat: config.models?.chat || config.model || "gpt-3.5-turbo",
106
+ template: config.models?.template || "gpt-4-turbo-preview",
107
+ fileAnalysis: config.models?.fileAnalysis || "gpt-4-turbo",
108
+ validation: config.models?.validation || "gpt-3.5-turbo",
109
+ };
110
+ if (config.apiKey) {
111
+ this.initializeClient();
112
+ }
113
+ }
114
+ initializeClient() {
115
+ if (this.client)
116
+ return;
117
+ try {
118
+ const apiKey = this.config.apiKey || process.env.OPENAI_API_KEY;
119
+ if (!apiKey) {
120
+ throw new AIError("OpenAI API key not configured. Set OPENAI_API_KEY environment variable or provide apiKey in config.", 401, "AUTH_ERROR", "openai");
121
+ }
122
+ // Basic validation - OpenAI keys start with 'sk-'
123
+ if (!apiKey.startsWith("sk-")) {
124
+ throw new AIError("Invalid OpenAI API key format", 401, "AUTH_ERROR", "openai");
125
+ }
126
+ this.client = new OpenAI({
127
+ apiKey,
128
+ baseURL: this.config.baseURL,
129
+ });
130
+ ensureLogger().info("OpenAI client initialized");
131
+ }
132
+ catch (_error) {
133
+ ensureLogger().error("Failed to initialize OpenAI client:", _error);
134
+ if (_error instanceof AIError) {
135
+ throw _error;
136
+ }
137
+ throw new AIError("Failed to initialize OpenAI client", 500, "INIT_ERROR", "openai");
138
+ }
139
+ }
140
+ validateConfig() {
141
+ return !!this.config.apiKey;
142
+ }
143
+ async analyze(prompt, options = {}) {
144
+ const messages = [];
145
+ if (options.systemPrompt) {
146
+ messages.push({ role: "system", content: options.systemPrompt });
147
+ }
148
+ messages.push({ role: "user", content: prompt });
149
+ return this.chat(messages, options);
150
+ }
151
+ async chat(messages, options = {}) {
152
+ try {
153
+ if (!this.client) {
154
+ this.initializeClient();
155
+ }
156
+ const model = options.analysisType === "template"
157
+ ? this.models.template
158
+ : options.analysisType === "fileAnalysis"
159
+ ? this.models.fileAnalysis
160
+ : options.analysisType === "validation"
161
+ ? this.models.validation
162
+ : this.models.chat;
163
+ ensureLogger().debug("Sending request to OpenAI", {
164
+ model,
165
+ messageCount: messages.length,
166
+ });
167
+ const completion = await this.client.chat.completions.create({
168
+ model,
169
+ messages: messages,
170
+ temperature: options.temperature ?? this.config.temperature ?? 0.7,
171
+ max_tokens: options.maxTokens ?? this.config.maxTokens ?? 2000,
172
+ ...(options.responseFormat && {
173
+ response_format: options.responseFormat,
174
+ }),
175
+ });
176
+ const content = completion.choices[0].message.content || "";
177
+ const cost = this.calculateCost(completion.usage, model);
178
+ const response = {
179
+ content,
180
+ model,
181
+ usage: completion.usage
182
+ ? {
183
+ promptTokens: completion.usage.prompt_tokens,
184
+ completionTokens: completion.usage.completion_tokens,
185
+ totalTokens: completion.usage.total_tokens,
186
+ }
187
+ : undefined,
188
+ cost,
189
+ };
190
+ if (this.config.enableLogging) {
191
+ ensureLogger().info("OpenAI request completed", {
192
+ model,
193
+ tokens: completion.usage?.total_tokens,
194
+ cost,
195
+ });
196
+ }
197
+ return response;
198
+ }
199
+ catch (_error) {
200
+ ensureLogger().error("OpenAI API error", _error);
201
+ throw this.handleOpenAIError(_error);
202
+ }
203
+ }
204
+ calculateCost(usage, model) {
205
+ if (!usage)
206
+ return 0;
207
+ const costs = MODEL_COSTS[model] || MODEL_COSTS["gpt-3.5-turbo"];
208
+ const inputCost = (usage.prompt_tokens / 1000) * costs.input;
209
+ const outputCost = (usage.completion_tokens / 1000) * costs.output;
210
+ return Math.round((inputCost + outputCost) * 1000000) / 1000000;
211
+ }
212
+ handleOpenAIError(error) {
213
+ if (error.response?.status === 401) {
214
+ return new AIError("Invalid API key", 401, "AUTH_ERROR", "openai");
215
+ }
216
+ if (error.response?.status === 429) {
217
+ return new AIError("Rate limit exceeded. Please try again later.", 429, "RATE_LIMIT", "openai");
218
+ }
219
+ if (error.response?.status === 503) {
220
+ return new AIError("OpenAI service temporarily unavailable", 503, "SERVICE_UNAVAILABLE", "openai");
221
+ }
222
+ if (error.message?.includes("timeout")) {
223
+ return new AIError("Request timed out. Please try again.", 408, "TIMEOUT", "openai");
224
+ }
225
+ // Preserve original error info if not a known error type
226
+ const statusCode = error.response?.status || error.statusCode || 500;
227
+ const errorType = error.type || "UNKNOWN_ERROR";
228
+ return new AIError(error.message || "Unknown error occurred", statusCode, errorType, "openai");
229
+ }
230
+ }
231
+ /**
232
+ * Mock Provider for testing
233
+ */
234
+ export class MockAIProvider extends AIProvider {
235
+ validateConfig() {
236
+ return true;
237
+ }
238
+ async analyze(prompt, _options = {}) {
239
+ return {
240
+ content: `Mock analysis for: ${prompt.substring(0, 50)}...`,
241
+ model: "mock",
242
+ usage: {
243
+ promptTokens: 10,
244
+ completionTokens: 5,
245
+ totalTokens: 15,
246
+ },
247
+ cost: 0,
248
+ };
249
+ }
250
+ async chat(messages, _options = {}) {
251
+ return {
252
+ content: `Mock chat response for ${messages.length} messages`,
253
+ model: "mock",
254
+ usage: {
255
+ promptTokens: 10,
256
+ completionTokens: 5,
257
+ totalTokens: 15,
258
+ },
259
+ cost: 0,
260
+ };
261
+ }
262
+ }
263
+ /**
264
+ * Main AI Service with caching and model routing
265
+ */
266
+ export class AIService extends EventEmitter {
267
+ providers;
268
+ cache;
269
+ fileHandler = getStorageService();
270
+ defaultProvider;
271
+ constructor() {
272
+ super();
273
+ this.providers = new Map();
274
+ this.cache = new LRUCache(1000); // Limit cache to 1000 entries to prevent memory leaks
275
+ this.defaultProvider = "mock";
276
+ ensureLogger().debug("AIService initialized");
277
+ }
278
+ /**
279
+ * Register an AI provider
280
+ */
281
+ registerProvider(name, config) {
282
+ let provider;
283
+ switch (config.provider) {
284
+ case "openai":
285
+ provider = new OpenAIProvider(config);
286
+ break;
287
+ case "mock":
288
+ provider = new MockAIProvider(config);
289
+ break;
290
+ default:
291
+ throw new Error(`Unknown provider: ${config.provider}`);
292
+ }
293
+ if (!provider.validateConfig()) {
294
+ throw new Error(`Invalid configuration for provider: ${name}`);
295
+ }
296
+ this.providers.set(name, provider);
297
+ if (!this.defaultProvider || this.providers.size === 1) {
298
+ this.defaultProvider = name;
299
+ }
300
+ ensureLogger().info(`Registered AI provider: ${name} (${config.provider})`);
301
+ }
302
+ /**
303
+ * Set default provider
304
+ */
305
+ setDefaultProvider(name) {
306
+ if (!this.providers.has(name)) {
307
+ throw new Error(`Provider not found: ${name}`);
308
+ }
309
+ this.defaultProvider = name;
310
+ ensureLogger().info(`Set default provider to: ${name}`);
311
+ }
312
+ /**
313
+ * Analyze content using AI
314
+ */
315
+ async analyze(prompt, options = {}) {
316
+ const providerName = options.provider || this.defaultProvider;
317
+ const provider = this.providers.get(providerName);
318
+ if (!provider) {
319
+ throw new Error(`Provider not found: ${providerName}`);
320
+ }
321
+ // Check cache if enabled
322
+ const cacheKey = this.getCacheKey(prompt, options);
323
+ if (options.useCache !== false && this.cache.has(cacheKey)) {
324
+ const cached = this.cache.get(cacheKey);
325
+ ensureLogger().debug("Returning cached response", { cacheKey });
326
+ return { ...cached, cached: true };
327
+ }
328
+ // Log the analysis request
329
+ this.emit("analysis:start", { prompt, options, provider: providerName });
330
+ try {
331
+ const response = await provider.analyze(prompt, options);
332
+ // Cache the response
333
+ this.cache.set(cacheKey, response);
334
+ // Log usage for tracking
335
+ if (response.usage) {
336
+ await this.logUsage(providerName, response);
337
+ }
338
+ this.emit("analysis:complete", { response, provider: providerName });
339
+ return response;
340
+ }
341
+ catch (_error) {
342
+ this.emit("analysis:error", { error: _error, provider: providerName });
343
+ throw _error;
344
+ }
345
+ }
346
+ /**
347
+ * Chat with AI
348
+ */
349
+ async chat(messages, options = {}) {
350
+ const providerName = options.provider || this.defaultProvider;
351
+ const provider = this.providers.get(providerName);
352
+ if (!provider) {
353
+ throw new Error(`Provider not found: ${providerName}`);
354
+ }
355
+ // Check cache if enabled
356
+ const cacheKey = this.getCacheKey(JSON.stringify(messages), options);
357
+ if (options.useCache !== false && this.cache.has(cacheKey)) {
358
+ const cached = this.cache.get(cacheKey);
359
+ ensureLogger().debug("Returning cached response", { cacheKey });
360
+ return { ...cached, cached: true };
361
+ }
362
+ this.emit("chat:start", { messages, options, provider: providerName });
363
+ try {
364
+ const response = await provider.chat(messages, options);
365
+ // Cache the response
366
+ this.cache.set(cacheKey, response);
367
+ // Log usage for tracking
368
+ if (response.usage) {
369
+ await this.logUsage(providerName, response);
370
+ }
371
+ this.emit("chat:complete", { response, provider: providerName });
372
+ return response;
373
+ }
374
+ catch (_error) {
375
+ this.emit("chat:error", { error: _error, provider: providerName });
376
+ throw _error;
377
+ }
378
+ }
379
+ /**
380
+ * Generate template from conversation
381
+ */
382
+ async generateTemplate(messages, options = {}) {
383
+ const providerName = options.provider || this.defaultProvider;
384
+ // Add template generation request
385
+ const generationRequest = {
386
+ role: "user",
387
+ content: "Based on our conversation, generate a template. Return ONLY the JSON template, no explanation.",
388
+ };
389
+ const allMessages = [...messages, generationRequest];
390
+ // Use structured output for template generation
391
+ const response = await this.chat(allMessages, {
392
+ ...options,
393
+ analysisType: "template",
394
+ temperature: options.temperature ?? 0.2,
395
+ maxTokens: options.maxTokens ?? 4000,
396
+ responseFormat: { type: "json_object" },
397
+ provider: providerName,
398
+ });
399
+ // Parse and validate the template
400
+ let template;
401
+ try {
402
+ template = JSON.parse(response.content);
403
+ }
404
+ catch (_e) {
405
+ throw new Error("Generated template is not valid JSON");
406
+ }
407
+ return {
408
+ ...response,
409
+ template,
410
+ };
411
+ }
412
+ /**
413
+ * Analyze uploaded file
414
+ */
415
+ async analyzeFile(fileContent, fileType, deviceInfo = {}, options = {}) {
416
+ const messages = [
417
+ {
418
+ role: "system",
419
+ content: options.systemPrompt ||
420
+ "You are an expert at analyzing device documentation and extracting data point information.",
421
+ },
422
+ {
423
+ role: "user",
424
+ content: `Analyze this ${fileType} file for device "${deviceInfo.name || "Unknown"}" by ${deviceInfo.manufacturer || "Unknown"}:\n\n${fileContent}\n\nExtract all data points, registers, and configuration information.`,
425
+ },
426
+ ];
427
+ const response = await this.chat(messages, {
428
+ ...options,
429
+ analysisType: "fileAnalysis",
430
+ temperature: options.temperature ?? 0.3,
431
+ maxTokens: options.maxTokens ?? 4000,
432
+ provider: options.provider,
433
+ });
434
+ // Try to extract data points from the response
435
+ let dataPoints = [];
436
+ try {
437
+ // Attempt to parse JSON data points from the response
438
+ const jsonMatch = response.content.match(/\[[\s\S]*\]/);
439
+ if (jsonMatch) {
440
+ dataPoints = JSON.parse(jsonMatch[0]);
441
+ }
442
+ }
443
+ catch (_e) {
444
+ // If parsing fails, return empty array
445
+ ensureLogger().debug("Could not parse data points from file analysis");
446
+ }
447
+ return {
448
+ ...response,
449
+ analysis: response.content,
450
+ dataPoints,
451
+ };
452
+ }
453
+ /**
454
+ * Select best model for task
455
+ */
456
+ selectModel(criteria) {
457
+ // Simple model selection logic - can be enhanced
458
+ if (criteria.costSensitive) {
459
+ return {
460
+ provider: "openai",
461
+ model: "gpt-3.5-turbo",
462
+ reason: "Cost-optimized model",
463
+ };
464
+ }
465
+ if (criteria.requiresReasoning || criteria.complexity === "high") {
466
+ return {
467
+ provider: "openai",
468
+ model: "gpt-4",
469
+ reason: "Advanced reasoning required",
470
+ };
471
+ }
472
+ if (criteria.contentLength && criteria.contentLength > 8000) {
473
+ return {
474
+ provider: "anthropic",
475
+ model: "claude-3-opus",
476
+ reason: "Long context window needed",
477
+ };
478
+ }
479
+ return {
480
+ provider: "openai",
481
+ model: "gpt-4-turbo",
482
+ reason: "Default balanced model",
483
+ };
484
+ }
485
+ /**
486
+ * Generate cache key
487
+ */
488
+ getCacheKey(content, options) {
489
+ const hash = crypto
490
+ .createHash("sha256")
491
+ .update(content + JSON.stringify(options))
492
+ .digest("hex");
493
+ return hash.substring(0, 16);
494
+ }
495
+ /**
496
+ * Log AI usage for tracking
497
+ */
498
+ async logUsage(provider, response) {
499
+ const usage = {
500
+ provider,
501
+ model: response.model,
502
+ timestamp: new Date().toISOString(),
503
+ tokens: response.usage,
504
+ cost: response.cost,
505
+ };
506
+ try {
507
+ await this.fileHandler.saveFile(`ai_usage_${Date.now()}.json`, JSON.stringify(usage, null, 2), "logs", { overwrite: false });
508
+ }
509
+ catch (_error) {
510
+ ensureLogger().error("Failed to log AI usage", _error);
511
+ }
512
+ }
513
+ /**
514
+ * Clear cache
515
+ */
516
+ clearCache() {
517
+ this.cache.clear();
518
+ ensureLogger().info("AI response cache cleared");
519
+ }
520
+ /**
521
+ * Get usage statistics
522
+ */
523
+ async getUsageStats(_startDate, _endDate) {
524
+ // Implementation would read from usage logs
525
+ return {
526
+ totalTokens: 0,
527
+ totalCost: 0,
528
+ byProvider: {},
529
+ };
530
+ }
531
+ }
532
+ // Export singleton instance with lazy initialization
533
+ let _aiService = null;
534
+ export function getAIService() {
535
+ if (!_aiService) {
536
+ _aiService = new AIService();
537
+ }
538
+ return _aiService;
539
+ }
540
+ // For backward compatibility - use a Proxy to lazy-load
541
+ export const aiService = new Proxy({}, {
542
+ get(_target, prop) {
543
+ return getAIService()[prop];
544
+ },
545
+ });
546
+ export default AIService;
547
+ //# sourceMappingURL=aiService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiService.js","sourceRoot":"","sources":["../../src/services/aiService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Conversation Storage Service
3
+ * Provides persistent storage for AI conversations using lowdb
4
+ */
5
+ interface Message {
6
+ role: "user" | "assistant" | "system";
7
+ content: string;
8
+ timestamp?: string;
9
+ }
10
+ interface Conversation {
11
+ id: string;
12
+ title?: string;
13
+ messages: Message[];
14
+ metadata?: Record<string, any>;
15
+ createdAt: string;
16
+ updatedAt: string;
17
+ }
18
+ interface ConversationsDB {
19
+ conversations: Record<string, Conversation>;
20
+ }
21
+ declare class ConversationStorage {
22
+ private db;
23
+ private initialized;
24
+ initialize(): Promise<void>;
25
+ getConversation(conversationId: string): Promise<Conversation | null>;
26
+ saveConversation(conversationId: string, conversation: Partial<Conversation>): Promise<Conversation>;
27
+ deleteConversation(conversationId: string): Promise<boolean>;
28
+ getAllConversations(): Promise<Conversation[]>;
29
+ getRecentConversations(limit?: number): Promise<Conversation[]>;
30
+ addMessage(conversationId: string, message: Message): Promise<Conversation>;
31
+ clearAllConversations(): Promise<void>;
32
+ exportConversations(): Promise<ConversationsDB>;
33
+ importConversations(data: ConversationsDB): Promise<void>;
34
+ getConversationStats(): Promise<Record<string, any>>;
35
+ }
36
+ export declare function getConversationStorage(): ConversationStorage;
37
+ export default ConversationStorage;
38
+ //# sourceMappingURL=conversationStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversationStorage.d.ts","sourceRoot":"","sources":["../../src/services/conversationStorage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,UAAU,OAAO;IACf,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,eAAe;IACvB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC7C;AAMD,cAAM,mBAAmB;IACvB,OAAO,CAAC,EAAE,CAAqC;IAC/C,OAAO,CAAC,WAAW,CAAkB;IAE/B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuC3B,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAKrE,gBAAgB,CACpB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,GAClC,OAAO,CAAC,YAAY,CAAC;IAqBlB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAa5D,mBAAmB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAK9C,sBAAsB,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAYnE,UAAU,CACd,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,YAAY,CAAC;IAwBlB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtC,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC;IAK/C,mBAAmB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzD,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CA6B3D;AAKD,wBAAgB,sBAAsB,IAAI,mBAAmB,CAK5D;AAED,eAAe,mBAAmB,CAAC"}