@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.
- package/LICENSE +21 -0
- package/README.md +652 -0
- package/dist/api/logsRouter.d.ts +20 -0
- package/dist/api/logsRouter.d.ts.map +1 -0
- package/dist/api/logsRouter.js +515 -0
- package/dist/api/logsRouter.js.map +1 -0
- package/dist/cli/dev-server.d.ts +7 -0
- package/dist/cli/dev-server.d.ts.map +1 -0
- package/dist/cli/dev-server.js +640 -0
- package/dist/cli/dev-server.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +26 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/StandardServer.d.ts +129 -0
- package/dist/core/StandardServer.d.ts.map +1 -0
- package/dist/core/StandardServer.js +453 -0
- package/dist/core/StandardServer.js.map +1 -0
- package/dist/core/apiResponse.d.ts +69 -0
- package/dist/core/apiResponse.d.ts.map +1 -0
- package/dist/core/apiResponse.js +127 -0
- package/dist/core/apiResponse.js.map +1 -0
- package/dist/core/healthCheck.d.ts +160 -0
- package/dist/core/healthCheck.d.ts.map +1 -0
- package/dist/core/healthCheck.js +398 -0
- package/dist/core/healthCheck.js.map +1 -0
- package/dist/core/index.d.ts +40 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +40 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +117 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +826 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/portUtils.d.ts +71 -0
- package/dist/core/portUtils.d.ts.map +1 -0
- package/dist/core/portUtils.js +240 -0
- package/dist/core/portUtils.js.map +1 -0
- package/dist/core/storageService.d.ts +119 -0
- package/dist/core/storageService.d.ts.map +1 -0
- package/dist/core/storageService.js +405 -0
- package/dist/core/storageService.js.map +1 -0
- package/dist/desktop/bundler.d.ts +40 -0
- package/dist/desktop/bundler.d.ts.map +1 -0
- package/dist/desktop/bundler.js +176 -0
- package/dist/desktop/bundler.js.map +1 -0
- package/dist/desktop/index.d.ts +25 -0
- package/dist/desktop/index.d.ts.map +1 -0
- package/dist/desktop/index.js +15 -0
- package/dist/desktop/index.js.map +1 -0
- package/dist/desktop/native-modules.d.ts +66 -0
- package/dist/desktop/native-modules.d.ts.map +1 -0
- package/dist/desktop/native-modules.js +200 -0
- package/dist/desktop/native-modules.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/LogCategories.d.ts +87 -0
- package/dist/logging/LogCategories.d.ts.map +1 -0
- package/dist/logging/LogCategories.js +205 -0
- package/dist/logging/LogCategories.js.map +1 -0
- package/dist/middleware/aiErrorHandler.d.ts +31 -0
- package/dist/middleware/aiErrorHandler.d.ts.map +1 -0
- package/dist/middleware/aiErrorHandler.js +181 -0
- package/dist/middleware/aiErrorHandler.js.map +1 -0
- package/dist/middleware/auth.d.ts +101 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +230 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/cors.d.ts +56 -0
- package/dist/middleware/cors.d.ts.map +1 -0
- package/dist/middleware/cors.js +123 -0
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware/errorHandler.d.ts +13 -0
- package/dist/middleware/errorHandler.d.ts.map +1 -0
- package/dist/middleware/errorHandler.js +85 -0
- package/dist/middleware/errorHandler.js.map +1 -0
- package/dist/middleware/fileUpload.d.ts +62 -0
- package/dist/middleware/fileUpload.d.ts.map +1 -0
- package/dist/middleware/fileUpload.js +175 -0
- package/dist/middleware/fileUpload.js.map +1 -0
- package/dist/middleware/health.d.ts +48 -0
- package/dist/middleware/health.d.ts.map +1 -0
- package/dist/middleware/health.js +143 -0
- package/dist/middleware/health.js.map +1 -0
- package/dist/middleware/index.d.ts +20 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +18 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/openapi.d.ts +64 -0
- package/dist/middleware/openapi.d.ts.map +1 -0
- package/dist/middleware/openapi.js +258 -0
- package/dist/middleware/openapi.js.map +1 -0
- package/dist/middleware/requestLogging.d.ts +22 -0
- package/dist/middleware/requestLogging.d.ts.map +1 -0
- package/dist/middleware/requestLogging.js +61 -0
- package/dist/middleware/requestLogging.js.map +1 -0
- package/dist/middleware/session.d.ts +84 -0
- package/dist/middleware/session.d.ts.map +1 -0
- package/dist/middleware/session.js +189 -0
- package/dist/middleware/session.js.map +1 -0
- package/dist/middleware/validation.d.ts +1337 -0
- package/dist/middleware/validation.d.ts.map +1 -0
- package/dist/middleware/validation.js +483 -0
- package/dist/middleware/validation.js.map +1 -0
- package/dist/services/aiService.d.ts +180 -0
- package/dist/services/aiService.d.ts.map +1 -0
- package/dist/services/aiService.js +547 -0
- package/dist/services/aiService.js.map +1 -0
- package/dist/services/conversationStorage.d.ts +38 -0
- package/dist/services/conversationStorage.d.ts.map +1 -0
- package/dist/services/conversationStorage.js +158 -0
- package/dist/services/conversationStorage.js.map +1 -0
- package/dist/services/crossPlatformBuffer.d.ts +84 -0
- package/dist/services/crossPlatformBuffer.d.ts.map +1 -0
- package/dist/services/crossPlatformBuffer.js +246 -0
- package/dist/services/crossPlatformBuffer.js.map +1 -0
- package/dist/services/index.d.ts +17 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +18 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/networkService.d.ts +81 -0
- package/dist/services/networkService.d.ts.map +1 -0
- package/dist/services/networkService.js +268 -0
- package/dist/services/networkService.js.map +1 -0
- package/dist/services/queueService.d.ts +112 -0
- package/dist/services/queueService.d.ts.map +1 -0
- package/dist/services/queueService.js +338 -0
- package/dist/services/queueService.js.map +1 -0
- package/dist/services/settingsService.d.ts +135 -0
- package/dist/services/settingsService.d.ts.map +1 -0
- package/dist/services/settingsService.js +425 -0
- package/dist/services/settingsService.js.map +1 -0
- package/dist/services/systemMonitor.d.ts +208 -0
- package/dist/services/systemMonitor.d.ts.map +1 -0
- package/dist/services/systemMonitor.js +693 -0
- package/dist/services/systemMonitor.js.map +1 -0
- package/dist/services/updateService.d.ts +78 -0
- package/dist/services/updateService.d.ts.map +1 -0
- package/dist/services/updateService.js +252 -0
- package/dist/services/updateService.js.map +1 -0
- package/dist/services/websocketEvents.d.ts +372 -0
- package/dist/services/websocketEvents.d.ts.map +1 -0
- package/dist/services/websocketEvents.js +338 -0
- package/dist/services/websocketEvents.js.map +1 -0
- package/dist/services/websocketServer.d.ts +80 -0
- package/dist/services/websocketServer.d.ts.map +1 -0
- package/dist/services/websocketServer.js +299 -0
- package/dist/services/websocketServer.js.map +1 -0
- package/dist/settings/SettingsSchema.d.ts +151 -0
- package/dist/settings/SettingsSchema.d.ts.map +1 -0
- package/dist/settings/SettingsSchema.js +424 -0
- package/dist/settings/SettingsSchema.js.map +1 -0
- package/dist/testing/TestServer.d.ts +69 -0
- package/dist/testing/TestServer.d.ts.map +1 -0
- package/dist/testing/TestServer.js +250 -0
- package/dist/testing/TestServer.js.map +1 -0
- package/dist/types/index.d.ts +137 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/appPaths.d.ts +74 -0
- package/dist/utils/appPaths.d.ts.map +1 -0
- package/dist/utils/appPaths.js +162 -0
- package/dist/utils/appPaths.js.map +1 -0
- package/dist/utils/fs-utils.d.ts +50 -0
- package/dist/utils/fs-utils.d.ts.map +1 -0
- package/dist/utils/fs-utils.js +114 -0
- package/dist/utils/fs-utils.js.map +1 -0
- package/dist/utils/index.d.ts +12 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/standardConfig.d.ts +61 -0
- package/dist/utils/standardConfig.d.ts.map +1 -0
- package/dist/utils/standardConfig.js +109 -0
- package/dist/utils/standardConfig.js.map +1 -0
- package/dist/utils/startupBanner.d.ts +34 -0
- package/dist/utils/startupBanner.d.ts.map +1 -0
- package/dist/utils/startupBanner.js +169 -0
- package/dist/utils/startupBanner.js.map +1 -0
- package/dist/utils/startupLogger.d.ts +45 -0
- package/dist/utils/startupLogger.d.ts.map +1 -0
- package/dist/utils/startupLogger.js +200 -0
- package/dist/utils/startupLogger.js.map +1 -0
- package/package.json +151 -0
- package/src/api/logsRouter.ts +600 -0
- package/src/cli/dev-server.ts +803 -0
- package/src/cli/index.ts +31 -0
- package/src/core/StandardServer.ts +587 -0
- package/src/core/apiResponse.ts +202 -0
- package/src/core/healthCheck.ts +565 -0
- package/src/core/index.ts +80 -0
- package/src/core/logger.ts +1092 -0
- package/src/core/portUtils.ts +319 -0
- package/src/core/storageService.ts +595 -0
- package/src/desktop/bundler.ts +271 -0
- package/src/desktop/index.ts +18 -0
- package/src/desktop/native-modules.ts +289 -0
- package/src/index.ts +142 -0
- package/src/logging/LogCategories.ts +302 -0
- package/src/middleware/aiErrorHandler.ts +278 -0
- package/src/middleware/auth.ts +329 -0
- package/src/middleware/cors.ts +187 -0
- package/src/middleware/errorHandler.ts +103 -0
- package/src/middleware/fileUpload.ts +252 -0
- package/src/middleware/health.ts +206 -0
- package/src/middleware/index.ts +71 -0
- package/src/middleware/openapi.ts +305 -0
- package/src/middleware/requestLogging.ts +92 -0
- package/src/middleware/session.ts +238 -0
- package/src/middleware/validation.ts +603 -0
- package/src/services/aiService.ts +789 -0
- package/src/services/conversationStorage.ts +232 -0
- package/src/services/crossPlatformBuffer.ts +341 -0
- package/src/services/index.ts +47 -0
- package/src/services/networkService.ts +351 -0
- package/src/services/queueService.ts +446 -0
- package/src/services/settingsService.ts +549 -0
- package/src/services/systemMonitor.ts +936 -0
- package/src/services/updateService.ts +334 -0
- package/src/services/websocketEvents.ts +409 -0
- package/src/services/websocketServer.ts +394 -0
- package/src/settings/SettingsSchema.ts +664 -0
- package/src/testing/TestServer.ts +312 -0
- package/src/types/index.ts +154 -0
- package/src/utils/appPaths.ts +196 -0
- package/src/utils/fs-utils.ts +130 -0
- package/src/utils/index.ts +15 -0
- package/src/utils/standardConfig.ts +178 -0
- package/src/utils/startupBanner.ts +287 -0
- package/src/utils/startupLogger.ts +268 -0
- package/ui/dist/index.d.mts +1221 -0
- package/ui/dist/index.d.ts +1221 -0
- package/ui/dist/index.js +73 -0
- package/ui/dist/index.js.map +1 -0
- package/ui/dist/index.mjs +73 -0
- 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"}
|