@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,338 @@
1
+ /**
2
+ * Queue Service for background job processing
3
+ * Based on patterns from mila-ai but enhanced with TypeScript and better error handling
4
+ */
5
+ import { EventEmitter } from "events";
6
+ import { createLogger } from "../core/index.js";
7
+ import { getStorageService } from "../core/storageService.js";
8
+ let logger; // Will be initialized when needed
9
+ function ensureLogger() {
10
+ if (!logger) {
11
+ logger = createLogger("QueueService");
12
+ }
13
+ return logger;
14
+ }
15
+ export class QueueService extends EventEmitter {
16
+ jobs;
17
+ handlers;
18
+ isRunning;
19
+ activeJobs;
20
+ config;
21
+ pollingTimer;
22
+ fileHandler = getStorageService();
23
+ constructor(config = {}) {
24
+ super();
25
+ this.config = {
26
+ maxConcurrentJobs: config.maxConcurrentJobs || 3,
27
+ pollingInterval: config.pollingInterval || 5000,
28
+ maxRetries: config.maxRetries || 3,
29
+ enablePersistence: config.enablePersistence || false,
30
+ };
31
+ this.jobs = new Map();
32
+ this.handlers = new Map();
33
+ this.isRunning = false;
34
+ this.activeJobs = 0;
35
+ ensureLogger().debug("QueueService initialized", this.config);
36
+ }
37
+ /**
38
+ * Register a job handler
39
+ */
40
+ registerHandler(jobType, handler) {
41
+ this.handlers.set(jobType, handler);
42
+ ensureLogger().debug(`Registered handler for job type: ${jobType}`);
43
+ }
44
+ /**
45
+ * Add a job to the queue
46
+ */
47
+ async addJob(type, data, priority = 0) {
48
+ const jobId = `${type}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
49
+ const job = {
50
+ id: jobId,
51
+ type,
52
+ data,
53
+ status: "pending",
54
+ priority,
55
+ retries: 0,
56
+ maxRetries: this.config.maxRetries,
57
+ createdAt: new Date(),
58
+ updatedAt: new Date(),
59
+ };
60
+ this.jobs.set(jobId, job);
61
+ if (this.config.enablePersistence) {
62
+ await this.persistJob(job);
63
+ }
64
+ this.emit("job:added", job);
65
+ ensureLogger().info(`Added job ${jobId} of type ${type}`);
66
+ // Check if this is a high-priority job that should preempt current processing
67
+ if (this.isRunning && priority > 5) {
68
+ // Check if we have capacity and if new job has higher priority than any processing job
69
+ const processingJobs = Array.from(this.jobs.values()).filter((j) => j.status === "processing");
70
+ if (this.activeJobs < this.config.maxConcurrentJobs) {
71
+ // We have free workers, process immediately
72
+ this.processNextJob();
73
+ }
74
+ else if (processingJobs.some((j) => j.priority < priority)) {
75
+ // New job has higher priority than some processing jobs
76
+ ensureLogger().info(`High priority job ${jobId} added, triggering immediate processing`);
77
+ this.processNextJob();
78
+ }
79
+ }
80
+ else if (this.isRunning) {
81
+ // Normal priority job, process normally
82
+ this.processNextJob();
83
+ }
84
+ return jobId;
85
+ }
86
+ /**
87
+ * Start processing jobs
88
+ */
89
+ async start() {
90
+ if (this.isRunning) {
91
+ ensureLogger().warn("Queue is already running");
92
+ return;
93
+ }
94
+ this.isRunning = true;
95
+ ensureLogger().debug("Starting queue processing");
96
+ if (this.config.enablePersistence) {
97
+ await this.loadPersistedJobs();
98
+ }
99
+ this.startPolling();
100
+ this.emit("queue:started");
101
+ }
102
+ /**
103
+ * Stop processing jobs
104
+ */
105
+ async stop() {
106
+ if (!this.isRunning) {
107
+ ensureLogger().warn("Queue is not running");
108
+ return;
109
+ }
110
+ this.isRunning = false;
111
+ if (this.pollingTimer) {
112
+ clearInterval(this.pollingTimer);
113
+ this.pollingTimer = undefined;
114
+ }
115
+ ensureLogger().info("Stopping queue processing");
116
+ // Wait for active jobs to complete
117
+ while (this.activeJobs > 0) {
118
+ await new Promise((resolve) => setTimeout(resolve, 100));
119
+ }
120
+ this.emit("queue:stopped");
121
+ ensureLogger().info("Queue processing stopped");
122
+ }
123
+ /**
124
+ * Process the next job in the queue
125
+ */
126
+ async processNextJob() {
127
+ if (!this.isRunning)
128
+ return;
129
+ if (this.activeJobs >= this.config.maxConcurrentJobs) {
130
+ ensureLogger().debug(`Max concurrent jobs reached (${this.activeJobs}/${this.config.maxConcurrentJobs})`);
131
+ return;
132
+ }
133
+ const job = this.getNextPendingJob();
134
+ if (!job) {
135
+ ensureLogger().debug("No pending jobs found");
136
+ return;
137
+ }
138
+ const handler = this.handlers.get(job.type);
139
+ if (!handler) {
140
+ ensureLogger().error(`No handler registered for job type: ${job.type}`);
141
+ await this.failJob(job, "No handler registered");
142
+ return;
143
+ }
144
+ this.activeJobs++;
145
+ job.status = "processing";
146
+ job.processedAt = new Date();
147
+ job.updatedAt = new Date();
148
+ ensureLogger().info(`Processing job ${job.id} (${job.type}), Active: ${this.activeJobs}`);
149
+ this.emit("job:started", job);
150
+ try {
151
+ await handler(job);
152
+ await this.completeJob(job);
153
+ }
154
+ catch (_error) {
155
+ await this.handleJobError(job, _error);
156
+ }
157
+ finally {
158
+ this.activeJobs--;
159
+ // Process next job immediately if available
160
+ if (this.isRunning) {
161
+ setImmediate(() => this.processNextJob());
162
+ }
163
+ }
164
+ }
165
+ /**
166
+ * Get the next pending job based on priority
167
+ */
168
+ getNextPendingJob() {
169
+ const pendingJobs = Array.from(this.jobs.values())
170
+ .filter((job) => job.status === "pending")
171
+ .sort((a, b) => {
172
+ // Higher priority first
173
+ if (a.priority !== b.priority) {
174
+ return b.priority - a.priority;
175
+ }
176
+ // Earlier jobs first
177
+ return a.createdAt.getTime() - b.createdAt.getTime();
178
+ });
179
+ return pendingJobs[0] || null;
180
+ }
181
+ /**
182
+ * Mark a job as completed
183
+ */
184
+ async completeJob(job) {
185
+ job.status = "completed";
186
+ job.updatedAt = new Date();
187
+ ensureLogger().info(`Job ${job.id} completed successfully`);
188
+ this.emit("job:completed", job);
189
+ if (this.config.enablePersistence) {
190
+ await this.persistJob(job);
191
+ }
192
+ // Remove completed jobs after some time to prevent memory leak
193
+ setTimeout(() => {
194
+ this.jobs.delete(job.id);
195
+ }, 60000); // Keep for 1 minute
196
+ }
197
+ /**
198
+ * Handle job error
199
+ */
200
+ async handleJobError(job, error) {
201
+ job.retries++;
202
+ job.error = error.message;
203
+ job.updatedAt = new Date();
204
+ ensureLogger().error(`Job ${job.id} failed: ${error.message}`, error);
205
+ if (job.retries < job.maxRetries) {
206
+ job.status = "pending"; // Retry
207
+ ensureLogger().info(`Job ${job.id} will be retried (${job.retries}/${job.maxRetries})`);
208
+ this.emit("job:retry", job);
209
+ }
210
+ else {
211
+ await this.failJob(job, error.message);
212
+ }
213
+ if (this.config.enablePersistence) {
214
+ await this.persistJob(job);
215
+ }
216
+ }
217
+ /**
218
+ * Mark a job as failed
219
+ */
220
+ async failJob(job, reason) {
221
+ job.status = "failed";
222
+ job.error = reason;
223
+ job.updatedAt = new Date();
224
+ ensureLogger().error(`Job ${job.id} failed permanently: ${reason}`);
225
+ this.emit("job:failed", job);
226
+ if (this.config.enablePersistence) {
227
+ // Move failed job to dead-letter queue directory
228
+ await this.moveToDeadLetterQueue(job);
229
+ }
230
+ }
231
+ /**
232
+ * Move failed job to dead-letter queue
233
+ */
234
+ async moveToDeadLetterQueue(job) {
235
+ try {
236
+ // Save to data directory with failed_ prefix
237
+ await this.fileHandler.saveFile(`failed_${job.id}_${Date.now()}.json`, JSON.stringify(job, null, 2), "data", { overwrite: true });
238
+ // Remove original queue file from main queue directory
239
+ await this.fileHandler.deleteFile(`queue_${job.id}.json`, "data");
240
+ ensureLogger().info(`Moved failed job ${job.id} to dead-letter queue`);
241
+ }
242
+ catch (_error) {
243
+ ensureLogger().error("Failed to move job to dead-letter queue:", _error);
244
+ }
245
+ }
246
+ /**
247
+ * Start polling for jobs
248
+ */
249
+ startPolling() {
250
+ this.pollingTimer = setInterval(() => {
251
+ this.processNextJob();
252
+ }, this.config.pollingInterval);
253
+ // Process immediately
254
+ this.processNextJob();
255
+ }
256
+ /**
257
+ * Persist job to file
258
+ */
259
+ async persistJob(job) {
260
+ try {
261
+ await this.fileHandler.saveFile(`queue_${job.id}.json`, JSON.stringify(job, null, 2), "data", { overwrite: true });
262
+ }
263
+ catch (_error) {
264
+ ensureLogger().error("Failed to persist job", _error);
265
+ }
266
+ }
267
+ /**
268
+ * Load persisted jobs
269
+ */
270
+ async loadPersistedJobs() {
271
+ try {
272
+ const files = await this.fileHandler.listFiles("data", /^queue_.*\.json$/);
273
+ for (const file of files) {
274
+ try {
275
+ const content = await this.fileHandler.readFile(file.name, "data");
276
+ const job = JSON.parse(content.toString());
277
+ // Convert date strings back to Date objects
278
+ job.createdAt = new Date(job.createdAt);
279
+ job.updatedAt = new Date(job.updatedAt);
280
+ if (job.processedAt) {
281
+ job.processedAt = new Date(job.processedAt);
282
+ }
283
+ // Reset processing jobs to pending
284
+ if (job.status === "processing") {
285
+ job.status = "pending";
286
+ }
287
+ this.jobs.set(job.id, job);
288
+ }
289
+ catch (_error) {
290
+ ensureLogger().error(`Failed to load job from ${file.name}`, _error);
291
+ }
292
+ }
293
+ ensureLogger().debug(`Loaded ${this.jobs.size} persisted jobs`);
294
+ }
295
+ catch (_error) {
296
+ ensureLogger().error("Failed to load persisted jobs", _error);
297
+ }
298
+ }
299
+ /**
300
+ * Get queue statistics
301
+ */
302
+ getStats() {
303
+ const jobs = Array.from(this.jobs.values());
304
+ return {
305
+ total: jobs.length,
306
+ pending: jobs.filter((j) => j.status === "pending").length,
307
+ processing: jobs.filter((j) => j.status === "processing").length,
308
+ completed: jobs.filter((j) => j.status === "completed").length,
309
+ failed: jobs.filter((j) => j.status === "failed").length,
310
+ activeJobs: this.activeJobs,
311
+ };
312
+ }
313
+ /**
314
+ * Get job by ID
315
+ */
316
+ getJob(jobId) {
317
+ return this.jobs.get(jobId);
318
+ }
319
+ /**
320
+ * Get all jobs
321
+ */
322
+ getAllJobs() {
323
+ return Array.from(this.jobs.values());
324
+ }
325
+ /**
326
+ * Clear completed and failed jobs
327
+ */
328
+ clearFinishedJobs() {
329
+ for (const [id, job] of this.jobs) {
330
+ if (job.status === "completed" || job.status === "failed") {
331
+ this.jobs.delete(id);
332
+ }
333
+ }
334
+ ensureLogger().info("Cleared finished jobs");
335
+ }
336
+ }
337
+ export default QueueService;
338
+ //# sourceMappingURL=queueService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queueService.js","sourceRoot":"","sources":["../../src/services/queueService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Settings Service
3
+ * Manages application settings with persistence, validation, and real-time updates
4
+ */
5
+ import { EventEmitter } from "events";
6
+ import { ZodSchema } from "zod";
7
+ export interface SettingsCategory {
8
+ id: string;
9
+ label: string;
10
+ description?: string;
11
+ icon?: string;
12
+ schema?: ZodSchema;
13
+ fields: SettingsField[];
14
+ order?: number;
15
+ }
16
+ export interface SettingsField {
17
+ key: string;
18
+ label: string;
19
+ type: "text" | "number" | "boolean" | "select" | "multiselect" | "json" | "password" | "email" | "url" | "color" | "date" | "time" | "datetime";
20
+ description?: string;
21
+ placeholder?: string;
22
+ defaultValue?: any;
23
+ required?: boolean;
24
+ validation?: ZodSchema;
25
+ options?: Array<{
26
+ value: any;
27
+ label: string;
28
+ description?: string;
29
+ }>;
30
+ min?: number;
31
+ max?: number;
32
+ step?: number;
33
+ pattern?: string;
34
+ readonly?: boolean;
35
+ hidden?: boolean;
36
+ dependsOn?: {
37
+ field: string;
38
+ value: any;
39
+ };
40
+ transform?: (value: any) => any;
41
+ format?: (value: any) => string;
42
+ }
43
+ export interface SettingsOptions {
44
+ storagePath?: string;
45
+ autoSave?: boolean;
46
+ saveDebounce?: number;
47
+ encryptSensitive?: boolean;
48
+ sensitiveFields?: string[];
49
+ }
50
+ export declare class SettingsService extends EventEmitter {
51
+ private options;
52
+ private categories;
53
+ private settings;
54
+ private storagePath?;
55
+ private autoSave;
56
+ private saveDebounce;
57
+ private saveTimeout?;
58
+ private sensitiveFields;
59
+ constructor(options?: SettingsOptions);
60
+ /**
61
+ * Register a settings category
62
+ */
63
+ registerCategory(category: SettingsCategory): void;
64
+ /**
65
+ * Load settings from storage
66
+ */
67
+ load(): Promise<void>;
68
+ /**
69
+ * Save settings to storage
70
+ */
71
+ save(): Promise<void>;
72
+ /**
73
+ * Get a setting value
74
+ */
75
+ get<T = any>(key: string, defaultValue?: T): T;
76
+ /**
77
+ * Set a setting value
78
+ */
79
+ set(key: string, value: any): Promise<void>;
80
+ /**
81
+ * Update multiple settings
82
+ */
83
+ update(updates: Record<string, any>): Promise<void>;
84
+ /**
85
+ * Get all settings
86
+ */
87
+ getAll(): Record<string, any>;
88
+ /**
89
+ * Get settings by category
90
+ */
91
+ getByCategory(categoryId: string): Record<string, any>;
92
+ /**
93
+ * Get all categories
94
+ */
95
+ getCategories(): SettingsCategory[];
96
+ /**
97
+ * Get category by ID
98
+ */
99
+ getCategory(id: string): SettingsCategory | undefined;
100
+ /**
101
+ * Validate all settings
102
+ */
103
+ validate(): {
104
+ valid: boolean;
105
+ errors: Record<string, string>;
106
+ };
107
+ /**
108
+ * Reset settings to defaults
109
+ */
110
+ reset(categoryId?: string): void;
111
+ /**
112
+ * Export settings
113
+ */
114
+ export(categoryId?: string): string;
115
+ /**
116
+ * Import settings
117
+ */
118
+ import(data: string): Promise<void>;
119
+ private findField;
120
+ private scheduleSave;
121
+ private encryptSensitiveFields;
122
+ private decryptSensitiveFields;
123
+ private getNestedValue;
124
+ private setNestedValue;
125
+ }
126
+ /**
127
+ * Create common settings categories
128
+ */
129
+ export declare const CommonSettingsCategories: {
130
+ general: () => SettingsCategory;
131
+ server: () => SettingsCategory;
132
+ logging: () => SettingsCategory;
133
+ };
134
+ export default SettingsService;
135
+ //# sourceMappingURL=settingsService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settingsService.d.ts","sourceRoot":"","sources":["../../src/services/settingsService.ts"],"names":[],"mappings":"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"}