@ai.ntellect/core 0.6.16 → 0.6.19
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/.mocharc.json +1 -2
- package/README.md +123 -178
- package/dist/graph/controller.js +29 -6
- package/dist/graph/index.js +402 -0
- package/dist/index.js +22 -7
- package/dist/interfaces/index.js +15 -0
- package/dist/modules/agenda/adapters/node-cron/index.js +29 -0
- package/dist/modules/agenda/index.js +140 -0
- package/dist/{services/embedding.js → modules/embedding/adapters/ai/index.js} +24 -7
- package/dist/modules/embedding/index.js +59 -0
- package/dist/modules/memory/adapters/in-memory/index.js +210 -0
- package/dist/{memory → modules/memory}/adapters/meilisearch/index.js +97 -2
- package/dist/{memory → modules/memory}/adapters/redis/index.js +77 -15
- package/dist/modules/memory/index.js +103 -0
- package/dist/utils/{stringifiy-zod-schema.js → generate-action-schema.js} +5 -5
- package/graph/controller.ts +38 -14
- package/graph/index.ts +468 -0
- package/index.ts +25 -7
- package/interfaces/index.ts +346 -28
- package/modules/agenda/adapters/node-cron/index.ts +25 -0
- package/modules/agenda/index.ts +159 -0
- package/modules/embedding/adapters/ai/index.ts +42 -0
- package/modules/embedding/index.ts +45 -0
- package/modules/memory/adapters/in-memory/index.ts +203 -0
- package/{memory → modules/memory}/adapters/meilisearch/index.ts +114 -8
- package/modules/memory/adapters/redis/index.ts +164 -0
- package/modules/memory/index.ts +93 -0
- package/package.json +4 -4
- package/test/graph/index.test.ts +646 -0
- package/test/modules/agenda/node-cron.test.ts +286 -0
- package/test/modules/embedding/ai.test.ts +78 -0
- package/test/modules/memory/adapters/in-memory.test.ts +153 -0
- package/test/{memory → modules/memory}/adapters/meilisearch.test.ts +80 -94
- package/test/modules/memory/adapters/redis.test.ts +169 -0
- package/test/modules/memory/base.test.ts +230 -0
- package/test/services/agenda.test.ts +279 -280
- package/tsconfig.json +0 -3
- package/types/index.ts +82 -203
- package/utils/{stringifiy-zod-schema.ts → generate-action-schema.ts} +3 -3
- package/app/README.md +0 -36
- package/app/app/favicon.ico +0 -0
- package/app/app/globals.css +0 -21
- package/app/app/gun.ts +0 -0
- package/app/app/layout.tsx +0 -18
- package/app/app/page.tsx +0 -321
- package/app/eslint.config.mjs +0 -16
- package/app/next.config.ts +0 -7
- package/app/package-lock.json +0 -5912
- package/app/package.json +0 -31
- package/app/pnpm-lock.yaml +0 -4031
- package/app/postcss.config.mjs +0 -8
- package/app/public/file.svg +0 -1
- package/app/public/globe.svg +0 -1
- package/app/public/next.svg +0 -1
- package/app/public/vercel.svg +0 -1
- package/app/public/window.svg +0 -1
- package/app/tailwind.config.ts +0 -18
- package/app/tsconfig.json +0 -27
- package/dist/graph/graph.js +0 -162
- package/dist/memory/index.js +0 -9
- package/dist/services/agenda.js +0 -115
- package/dist/services/queue.js +0 -142
- package/dist/utils/experimental-graph-rag.js +0 -152
- package/dist/utils/generate-object.js +0 -111
- package/dist/utils/inject-actions.js +0 -16
- package/dist/utils/queue-item-transformer.js +0 -24
- package/dist/utils/sanitize-results.js +0 -60
- package/graph/graph.ts +0 -193
- package/memory/adapters/redis/index.ts +0 -103
- package/memory/index.ts +0 -22
- package/services/agenda.ts +0 -118
- package/services/embedding.ts +0 -26
- package/services/queue.ts +0 -145
- package/test/.env.test +0 -4
- package/test/graph/engine.test.ts +0 -533
- package/test/memory/adapters/redis.test.ts +0 -160
- package/test/memory/base.test.ts +0 -229
- package/test/services/queue.test.ts +0 -286
- package/utils/experimental-graph-rag.ts +0 -170
- package/utils/generate-object.ts +0 -117
- package/utils/inject-actions.ts +0 -19
- package/utils/queue-item-transformer.ts +0 -38
- package/utils/sanitize-results.ts +0 -66
package/index.ts
CHANGED
@@ -1,11 +1,29 @@
|
|
1
|
+
/**
|
2
|
+
* @module @ai.ntellect/core
|
3
|
+
* @description Core module with workflow functionality, providing graph management,
|
4
|
+
* memory storage, agenda scheduling, and embedding capabilities.
|
5
|
+
*
|
6
|
+
* This module exports various components:
|
7
|
+
* - Graph management and controller
|
8
|
+
* - Memory storage adapters (Meilisearch, Redis)
|
9
|
+
* - Agenda scheduling with node-cron adapter
|
10
|
+
* - Embedding functionality with AI adapter
|
11
|
+
* - Utility functions for action schema generation and header building
|
12
|
+
*/
|
13
|
+
|
14
|
+
export * from "./graph";
|
1
15
|
export * from "./graph/controller";
|
2
|
-
export * from "./
|
3
|
-
export * from "./memory";
|
4
|
-
export * from "./memory/adapters/
|
5
|
-
export * from "./memory/adapters/redis";
|
16
|
+
export * from "./modules/memory";
|
17
|
+
export * from "./modules/memory/adapters/meilisearch";
|
18
|
+
export * from "./modules/memory/adapters/redis";
|
6
19
|
|
7
20
|
export * from "./interfaces";
|
8
|
-
export * from "./
|
9
|
-
export * from "./
|
21
|
+
export * from "./modules/agenda";
|
22
|
+
export * from "./modules/agenda/adapters/node-cron";
|
23
|
+
export * from "./modules/embedding";
|
24
|
+
export * from "./modules/embedding/adapters/ai";
|
25
|
+
|
10
26
|
export * from "./types";
|
11
|
-
|
27
|
+
|
28
|
+
export * from "./utils/generate-action-schema";
|
29
|
+
export * from "./utils/header-builder";
|
package/interfaces/index.ts
CHANGED
@@ -1,37 +1,11 @@
|
|
1
|
-
import { BaseMemoryType } from "
|
2
|
-
import { SharedState } from "@/types";
|
3
|
-
|
4
|
-
/* ======================== PERSISTENCE ======================== */
|
5
|
-
|
6
|
-
/**
|
7
|
-
* Interface for persisting graph execution state.
|
8
|
-
*/
|
9
|
-
export interface Persistence<T> {
|
10
|
-
saveState(
|
11
|
-
graphName: string,
|
12
|
-
state: SharedState<T>,
|
13
|
-
currentNode: string
|
14
|
-
): Promise<void>;
|
15
|
-
loadState(
|
16
|
-
graphName: string
|
17
|
-
): Promise<{ state: SharedState<T>; currentNode: string } | null>;
|
18
|
-
}
|
19
|
-
|
20
|
-
/* ======================== REAL-TIME NOTIFICATIONS ======================== */
|
21
|
-
|
22
|
-
/**
|
23
|
-
* Interface for real-time notifications.
|
24
|
-
*/
|
25
|
-
export interface RealTimeNotifier {
|
26
|
-
notify(event: string, data: any): void;
|
27
|
-
}
|
1
|
+
import { BaseMemoryType, CreateMemoryInput, ScheduledRequest } from "../types";
|
28
2
|
|
29
3
|
/* ======================== EMBEDDING SERVICE ======================== */
|
30
4
|
|
31
5
|
/**
|
32
6
|
* Interface for an embedding service that processes text into vector representations.
|
33
7
|
*/
|
34
|
-
export interface
|
8
|
+
export interface EmbeddingModule {
|
35
9
|
/**
|
36
10
|
* Generates an embedding for a single text.
|
37
11
|
* @param {string} text - The input text to embed.
|
@@ -117,3 +91,347 @@ export interface BaseMemoryService {
|
|
117
91
|
*/
|
118
92
|
clearAllMemories(): Promise<void>;
|
119
93
|
}
|
94
|
+
|
95
|
+
/**
|
96
|
+
* Extended interface for memory service operations
|
97
|
+
* @interface
|
98
|
+
*/
|
99
|
+
export interface IMemoryService {
|
100
|
+
/**
|
101
|
+
* Initializes the memory service
|
102
|
+
* @returns {Promise<void>}
|
103
|
+
*/
|
104
|
+
init(): Promise<void>;
|
105
|
+
|
106
|
+
/**
|
107
|
+
* Creates a new memory entry with optional embedding
|
108
|
+
* @param {CreateMemoryInput & { embedding?: number[] }} input - Memory data with optional embedding
|
109
|
+
* @returns {Promise<BaseMemoryType | undefined>} Created memory or undefined
|
110
|
+
*/
|
111
|
+
createMemory(
|
112
|
+
input: CreateMemoryInput & { embedding?: number[] }
|
113
|
+
): Promise<BaseMemoryType | undefined>;
|
114
|
+
|
115
|
+
/**
|
116
|
+
* Retrieves a memory by ID and room ID
|
117
|
+
* @param {string} id - Memory identifier
|
118
|
+
* @param {string} roomId - Room identifier
|
119
|
+
* @returns {Promise<BaseMemoryType | null>} Memory entry or null if not found
|
120
|
+
*/
|
121
|
+
getMemoryById(id: string, roomId: string): Promise<BaseMemoryType | null>;
|
122
|
+
|
123
|
+
/**
|
124
|
+
* Searches for memories based on query and options
|
125
|
+
* @param {string} query - Search query
|
126
|
+
* @param {Object} options - Search options
|
127
|
+
* @returns {Promise<BaseMemoryType[]>} Array of matching memories
|
128
|
+
*/
|
129
|
+
getMemoryByIndex(
|
130
|
+
query: string,
|
131
|
+
options: { roomId: string; limit?: number }
|
132
|
+
): Promise<BaseMemoryType[]>;
|
133
|
+
|
134
|
+
/**
|
135
|
+
* Retrieves all memories for a specific room
|
136
|
+
* @param {string} roomId - Room identifier
|
137
|
+
* @returns {Promise<BaseMemoryType[]>} Array of all memories
|
138
|
+
*/
|
139
|
+
getAllMemories(roomId: string): Promise<BaseMemoryType[]>;
|
140
|
+
|
141
|
+
/**
|
142
|
+
* Deletes a specific memory
|
143
|
+
* @param {string} id - Memory identifier
|
144
|
+
* @param {string} roomId - Room identifier
|
145
|
+
* @returns {Promise<void>}
|
146
|
+
*/
|
147
|
+
clearMemoryById(id: string, roomId: string): Promise<void>;
|
148
|
+
|
149
|
+
/**
|
150
|
+
* Clears all memories
|
151
|
+
* @returns {Promise<void>}
|
152
|
+
*/
|
153
|
+
clearAllMemories(): Promise<void>;
|
154
|
+
}
|
155
|
+
|
156
|
+
/**
|
157
|
+
* Interface for memory adapter implementations
|
158
|
+
* @interface
|
159
|
+
*/
|
160
|
+
export interface IMemoryAdapter {
|
161
|
+
/**
|
162
|
+
* Initializes the memory adapter for a specific room
|
163
|
+
* @param {string} roomId - Room identifier
|
164
|
+
* @returns {Promise<void>}
|
165
|
+
*/
|
166
|
+
init(roomId?: string): Promise<void>;
|
167
|
+
|
168
|
+
/**
|
169
|
+
* Creates a new memory entry in the adapter
|
170
|
+
* @param {CreateMemoryInput & { embedding?: number[] }} input - Memory data with optional embedding
|
171
|
+
* @returns {Promise<BaseMemoryType | undefined>} Created memory or undefined
|
172
|
+
*/
|
173
|
+
createMemory(
|
174
|
+
input: CreateMemoryInput & { embedding?: number[] }
|
175
|
+
): Promise<BaseMemoryType | undefined>;
|
176
|
+
|
177
|
+
/**
|
178
|
+
* Stores a job in the adapter
|
179
|
+
* @param {string} id - Job identifier
|
180
|
+
* @param {ICronJob} job - Cron job instance
|
181
|
+
* @returns {Promise<void>}
|
182
|
+
*/
|
183
|
+
saveJob?(id: string, job: ICronJob): Promise<void>;
|
184
|
+
|
185
|
+
/**
|
186
|
+
* Stores a scheduled request in the adapter
|
187
|
+
* @param {string} id - Request identifier
|
188
|
+
* @param {ScheduledRequest} request - Scheduled request data
|
189
|
+
* @returns {Promise<void>}
|
190
|
+
*/
|
191
|
+
saveRequest?(id: string, request: ScheduledRequest): Promise<void>;
|
192
|
+
|
193
|
+
/**
|
194
|
+
* Retrieves a job by ID
|
195
|
+
* @param {string} id - Job identifier
|
196
|
+
* @returns {Promise<ICronJob | undefined>}
|
197
|
+
*/
|
198
|
+
getJob?(id: string): Promise<ICronJob | undefined>;
|
199
|
+
|
200
|
+
/**
|
201
|
+
* Retrieves a scheduled request by ID
|
202
|
+
* @param {string} id - Request identifier
|
203
|
+
* @returns {Promise<ScheduledRequest | undefined>}
|
204
|
+
*/
|
205
|
+
getRequest?(id: string): Promise<ScheduledRequest | undefined>;
|
206
|
+
|
207
|
+
/**
|
208
|
+
* Deletes a job by ID
|
209
|
+
* @param {string} id - Job identifier
|
210
|
+
* @returns {Promise<void>}
|
211
|
+
*/
|
212
|
+
deleteJob?(id: string): Promise<void>;
|
213
|
+
|
214
|
+
/**
|
215
|
+
* Deletes a scheduled request by ID
|
216
|
+
* @param {string} id - Request identifier
|
217
|
+
* @returns {Promise<void>}
|
218
|
+
*/
|
219
|
+
deleteRequest?(id: string): Promise<void>;
|
220
|
+
|
221
|
+
/**
|
222
|
+
* Retrieves all scheduled requests
|
223
|
+
* @returns {Promise<ScheduledRequest[]>}
|
224
|
+
*/
|
225
|
+
getAllRequests?(): Promise<ScheduledRequest[]>;
|
226
|
+
|
227
|
+
/**
|
228
|
+
* Retrieves a memory by ID and room ID from the adapter
|
229
|
+
* @param {string} id - Memory identifier
|
230
|
+
* @param {string} roomId - Room identifier
|
231
|
+
* @returns {Promise<BaseMemoryType | null>} Memory entry or null if not found
|
232
|
+
*/
|
233
|
+
getMemoryById(id: string, roomId: string): Promise<BaseMemoryType | null>;
|
234
|
+
|
235
|
+
/**
|
236
|
+
* Searches for memories in the adapter
|
237
|
+
* @param {string} query - Search query
|
238
|
+
* @param {Object} options - Search options
|
239
|
+
* @returns {Promise<BaseMemoryType[]>} Array of matching memories
|
240
|
+
*/
|
241
|
+
getMemoryByIndex(
|
242
|
+
query: string,
|
243
|
+
options: { roomId: string; limit?: number }
|
244
|
+
): Promise<BaseMemoryType[]>;
|
245
|
+
|
246
|
+
/**
|
247
|
+
* Retrieves all memories for a room from the adapter
|
248
|
+
* @param {string} roomId - Room identifier
|
249
|
+
* @returns {Promise<BaseMemoryType[]>} Array of all memories
|
250
|
+
*/
|
251
|
+
getAllMemories(roomId: string): Promise<BaseMemoryType[]>;
|
252
|
+
|
253
|
+
/**
|
254
|
+
* Deletes a specific memory from the adapter
|
255
|
+
* @param {string} id - Memory identifier
|
256
|
+
* @param {string} roomId - Room identifier
|
257
|
+
* @returns {Promise<void>}
|
258
|
+
*/
|
259
|
+
clearMemoryById(id: string, roomId: string): Promise<void>;
|
260
|
+
|
261
|
+
/**
|
262
|
+
* Clears all memories from the adapter
|
263
|
+
* @returns {Promise<void>}
|
264
|
+
*/
|
265
|
+
clearAllMemories(): Promise<void>;
|
266
|
+
|
267
|
+
/**
|
268
|
+
* Clears all jobs and requests
|
269
|
+
* @returns {Promise<void>}
|
270
|
+
*/
|
271
|
+
clear?(): Promise<void>;
|
272
|
+
}
|
273
|
+
|
274
|
+
/**
|
275
|
+
* Abstract base class for memory implementations
|
276
|
+
* @abstract
|
277
|
+
*/
|
278
|
+
export abstract class BaseMemory implements IMemoryService {
|
279
|
+
/**
|
280
|
+
* Creates an instance of BaseMemory
|
281
|
+
* @param {IMemoryAdapter} adapter - Memory adapter implementation
|
282
|
+
*/
|
283
|
+
constructor(protected readonly adapter: IMemoryAdapter) {}
|
284
|
+
|
285
|
+
abstract init(): Promise<void>;
|
286
|
+
abstract createMemory(
|
287
|
+
input: CreateMemoryInput & { embedding?: number[] }
|
288
|
+
): Promise<BaseMemoryType | undefined>;
|
289
|
+
abstract getMemoryById(
|
290
|
+
id: string,
|
291
|
+
roomId: string
|
292
|
+
): Promise<BaseMemoryType | null>;
|
293
|
+
abstract getMemoryByIndex(
|
294
|
+
query: string,
|
295
|
+
options: { roomId: string; limit?: number }
|
296
|
+
): Promise<BaseMemoryType[]>;
|
297
|
+
abstract getAllMemories(roomId: string): Promise<BaseMemoryType[]>;
|
298
|
+
abstract clearMemoryById(id: string, roomId: string): Promise<void>;
|
299
|
+
abstract clearAllMemories(): Promise<void>;
|
300
|
+
}
|
301
|
+
|
302
|
+
/**
|
303
|
+
* Interface for event emitter functionality
|
304
|
+
* @interface
|
305
|
+
*/
|
306
|
+
export interface IEventEmitter {
|
307
|
+
/**
|
308
|
+
* Emits an event with optional arguments
|
309
|
+
* @param {string} event - Event name
|
310
|
+
* @param {...any[]} args - Event arguments
|
311
|
+
* @returns {boolean} Whether the event had listeners
|
312
|
+
*/
|
313
|
+
emit(event: string, ...args: any[]): boolean;
|
314
|
+
|
315
|
+
/**
|
316
|
+
* Registers an event listener
|
317
|
+
* @param {string} event - Event name
|
318
|
+
* @param {Function} listener - Event handler
|
319
|
+
*/
|
320
|
+
on(event: string, listener: (...args: any[]) => void): void;
|
321
|
+
|
322
|
+
/**
|
323
|
+
* Removes all listeners for an event
|
324
|
+
* @param {string} [event] - Optional event name
|
325
|
+
*/
|
326
|
+
removeAllListeners(event?: string): void;
|
327
|
+
|
328
|
+
/**
|
329
|
+
* Returns raw listeners for an event
|
330
|
+
* @param {string} event - Event name
|
331
|
+
* @returns {Function[]} Array of listener functions
|
332
|
+
*/
|
333
|
+
rawListeners(event: string): Function[];
|
334
|
+
}
|
335
|
+
|
336
|
+
/**
|
337
|
+
* Interface for cron service functionality
|
338
|
+
* @interface
|
339
|
+
*/
|
340
|
+
export interface ICronService {
|
341
|
+
/**
|
342
|
+
* Schedules a job using cron expression
|
343
|
+
* @param {string} expression - Cron expression
|
344
|
+
* @param {Function} callback - Job callback
|
345
|
+
* @returns {ICronJob} Cron job instance
|
346
|
+
*/
|
347
|
+
schedule(expression: string, callback: () => void): ICronJob;
|
348
|
+
}
|
349
|
+
|
350
|
+
/**
|
351
|
+
* Interface for cron job control
|
352
|
+
* @interface
|
353
|
+
*/
|
354
|
+
export interface ICronJob {
|
355
|
+
/**
|
356
|
+
* Starts the cron job
|
357
|
+
*/
|
358
|
+
start(): void;
|
359
|
+
|
360
|
+
/**
|
361
|
+
* Stops the cron job
|
362
|
+
*/
|
363
|
+
stop(): void;
|
364
|
+
}
|
365
|
+
|
366
|
+
/**
|
367
|
+
* Interface for embedding model operations
|
368
|
+
* @interface
|
369
|
+
*/
|
370
|
+
export interface IEmbeddingModel {
|
371
|
+
/**
|
372
|
+
* Embeds a single text
|
373
|
+
* @param {string} text - Text to embed
|
374
|
+
* @returns {Promise<number[]>} Vector embedding
|
375
|
+
*/
|
376
|
+
embed(text: string): Promise<number[]>;
|
377
|
+
|
378
|
+
/**
|
379
|
+
* Embeds multiple texts
|
380
|
+
* @param {string[]} texts - Array of texts to embed
|
381
|
+
* @returns {Promise<number[][]>} Array of vector embeddings
|
382
|
+
*/
|
383
|
+
embedMany(texts: string[]): Promise<number[][]>;
|
384
|
+
}
|
385
|
+
|
386
|
+
/**
|
387
|
+
* Interface for similarity calculations
|
388
|
+
* @interface
|
389
|
+
*/
|
390
|
+
export interface ISimilarityCalculator {
|
391
|
+
/**
|
392
|
+
* Calculates similarity between two embeddings
|
393
|
+
* @param {number[]} embedding1 - First embedding
|
394
|
+
* @param {number[]} embedding2 - Second embedding
|
395
|
+
* @returns {number} Similarity score
|
396
|
+
*/
|
397
|
+
calculate(embedding1: number[], embedding2: number[]): number;
|
398
|
+
}
|
399
|
+
|
400
|
+
/**
|
401
|
+
* Interface for embedding module operations
|
402
|
+
* @interface
|
403
|
+
*/
|
404
|
+
export interface IEmbeddingModule {
|
405
|
+
/**
|
406
|
+
* Embeds a single text
|
407
|
+
* @param {string} text - Text to embed
|
408
|
+
* @returns {Promise<number[]>} Vector embedding
|
409
|
+
*/
|
410
|
+
embedText(text: string): Promise<number[]>;
|
411
|
+
|
412
|
+
/**
|
413
|
+
* Embeds multiple texts
|
414
|
+
* @param {string[]} texts - Array of texts to embed
|
415
|
+
* @returns {Promise<number[][]>} Array of vector embeddings
|
416
|
+
*/
|
417
|
+
embedMany(texts: string[]): Promise<number[][]>;
|
418
|
+
|
419
|
+
/**
|
420
|
+
* Calculates similarity between two embeddings
|
421
|
+
* @param {number[]} embedding1 - First embedding
|
422
|
+
* @param {number[]} embedding2 - Second embedding
|
423
|
+
* @returns {number} Similarity score
|
424
|
+
*/
|
425
|
+
calculateSimilarity(embedding1: number[], embedding2: number[]): number;
|
426
|
+
}
|
427
|
+
|
428
|
+
export interface IJobStorage {
|
429
|
+
saveJob(id: string, job: ICronJob): Promise<void>;
|
430
|
+
saveRequest(id: string, request: ScheduledRequest): Promise<void>;
|
431
|
+
getJob(id: string): Promise<ICronJob | undefined>;
|
432
|
+
getRequest(id: string): Promise<ScheduledRequest | undefined>;
|
433
|
+
deleteJob(id: string): Promise<void>;
|
434
|
+
deleteRequest(id: string): Promise<void>;
|
435
|
+
getAllRequests(): Promise<ScheduledRequest[]>;
|
436
|
+
clear(): Promise<void>;
|
437
|
+
}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import cron from "node-cron";
|
2
|
+
import { ICronJob, ICronService } from "../../../../interfaces";
|
3
|
+
|
4
|
+
/**
|
5
|
+
* @module NodeCronAdapter
|
6
|
+
* @description Adapter implementation for node-cron service.
|
7
|
+
* Provides a bridge between the application's scheduling interface and the node-cron library.
|
8
|
+
* @implements {ICronService}
|
9
|
+
*/
|
10
|
+
export class NodeCronAdapter implements ICronService {
|
11
|
+
/**
|
12
|
+
* Schedules a new cron job
|
13
|
+
* @param {string} expression - Cron expression defining the schedule
|
14
|
+
* @param {Function} callback - Function to be executed when the schedule triggers
|
15
|
+
* @returns {ICronJob} Interface for controlling the scheduled job
|
16
|
+
*/
|
17
|
+
schedule(expression: string, callback: () => void): ICronJob {
|
18
|
+
const job = cron.schedule(expression, callback);
|
19
|
+
|
20
|
+
return {
|
21
|
+
start: () => job.start(),
|
22
|
+
stop: () => job.stop(),
|
23
|
+
};
|
24
|
+
}
|
25
|
+
}
|
@@ -0,0 +1,159 @@
|
|
1
|
+
import { ICronService, IMemoryAdapter } from "../../interfaces";
|
2
|
+
import { ScheduledRequest } from "../../types";
|
3
|
+
|
4
|
+
/**
|
5
|
+
* @module Agenda
|
6
|
+
* @description A module for scheduling and managing cron-based tasks.
|
7
|
+
* Provides functionality for scheduling requests, managing their lifecycle,
|
8
|
+
* and handling recurring and one-time tasks.
|
9
|
+
*/
|
10
|
+
export class Agenda {
|
11
|
+
/**
|
12
|
+
* Creates an instance of Agenda
|
13
|
+
* @param {ICronService} cronService - The cron service implementation
|
14
|
+
* @param {IMemoryAdapter} storage - The storage service for jobs and requests
|
15
|
+
*/
|
16
|
+
constructor(
|
17
|
+
private readonly cronService: ICronService,
|
18
|
+
private readonly storage: IMemoryAdapter &
|
19
|
+
Required<
|
20
|
+
Pick<
|
21
|
+
IMemoryAdapter,
|
22
|
+
| "saveJob"
|
23
|
+
| "saveRequest"
|
24
|
+
| "getJob"
|
25
|
+
| "getRequest"
|
26
|
+
| "deleteJob"
|
27
|
+
| "deleteRequest"
|
28
|
+
| "getAllRequests"
|
29
|
+
| "clear"
|
30
|
+
>
|
31
|
+
>
|
32
|
+
) {}
|
33
|
+
|
34
|
+
/**
|
35
|
+
* Schedule a new request to be processed later
|
36
|
+
* @param {Object} request - The request configuration
|
37
|
+
* @param {string} request.originalRequest - The original request to be executed
|
38
|
+
* @param {string} request.cronExpression - The cron expression for scheduling
|
39
|
+
* @param {Object} [callbacks] - Optional callback functions
|
40
|
+
* @param {Function} [callbacks.onScheduled] - Called when request is scheduled
|
41
|
+
* @param {Function} [callbacks.onExecuted] - Called when request is executed
|
42
|
+
* @returns {Promise<string>} The ID of the scheduled request
|
43
|
+
*/
|
44
|
+
async scheduleRequest(
|
45
|
+
request: {
|
46
|
+
originalRequest: string;
|
47
|
+
cronExpression: string;
|
48
|
+
},
|
49
|
+
callbacks?: {
|
50
|
+
onScheduled?: (id: string) => void;
|
51
|
+
onExecuted?: (id: string, originalRequest: string) => void;
|
52
|
+
}
|
53
|
+
): Promise<string> {
|
54
|
+
const id = crypto.randomUUID();
|
55
|
+
|
56
|
+
const scheduledRequest: ScheduledRequest = {
|
57
|
+
id,
|
58
|
+
originalRequest: request.originalRequest,
|
59
|
+
cronExpression: request.cronExpression,
|
60
|
+
isRecurring: false,
|
61
|
+
createdAt: new Date(),
|
62
|
+
};
|
63
|
+
|
64
|
+
// Create cron job using the injected service
|
65
|
+
const cronJob = this.cronService.schedule(
|
66
|
+
request.cronExpression,
|
67
|
+
async () => {
|
68
|
+
console.log(`🔄 Executing scheduled request: ${id}`);
|
69
|
+
|
70
|
+
if (callbacks?.onExecuted) {
|
71
|
+
callbacks.onExecuted(id, scheduledRequest.originalRequest);
|
72
|
+
}
|
73
|
+
|
74
|
+
console.log(`✅ Scheduled request executed successfully: ${id}`);
|
75
|
+
|
76
|
+
// Auto-stop for non-recurring tasks
|
77
|
+
if (!scheduledRequest.isRecurring) {
|
78
|
+
await this.cancelScheduledRequest(id);
|
79
|
+
}
|
80
|
+
}
|
81
|
+
);
|
82
|
+
|
83
|
+
// Start job in non-running mode
|
84
|
+
cronJob.stop();
|
85
|
+
|
86
|
+
// Store request and job using storage service
|
87
|
+
await this.storage.saveRequest(id, scheduledRequest);
|
88
|
+
await this.storage.saveJob(id, cronJob);
|
89
|
+
|
90
|
+
if (callbacks?.onScheduled) callbacks.onScheduled(id);
|
91
|
+
|
92
|
+
// Start the job after storing
|
93
|
+
cronJob.start();
|
94
|
+
|
95
|
+
return id;
|
96
|
+
}
|
97
|
+
|
98
|
+
/**
|
99
|
+
* Cancels a scheduled request by its ID
|
100
|
+
* @param {string} requestId - The ID of the request to cancel
|
101
|
+
* @returns {Promise<boolean>} True if the request was found and cancelled, false otherwise
|
102
|
+
*/
|
103
|
+
async cancelScheduledRequest(requestId: string): Promise<boolean> {
|
104
|
+
const cronJob = await this.storage.getJob(requestId);
|
105
|
+
if (cronJob) {
|
106
|
+
try {
|
107
|
+
cronJob.stop();
|
108
|
+
await this.storage.deleteJob(requestId);
|
109
|
+
await this.storage.deleteRequest(requestId);
|
110
|
+
return true;
|
111
|
+
} catch (error) {
|
112
|
+
console.error(`Failed to stop cron job ${requestId}:`, error);
|
113
|
+
return false;
|
114
|
+
}
|
115
|
+
}
|
116
|
+
return false;
|
117
|
+
}
|
118
|
+
|
119
|
+
/**
|
120
|
+
* Retrieves all scheduled requests
|
121
|
+
* @returns {Promise<ScheduledRequest[]>} Array of all scheduled requests
|
122
|
+
*/
|
123
|
+
async getScheduledRequests(): Promise<ScheduledRequest[]> {
|
124
|
+
return this.storage.getAllRequests();
|
125
|
+
}
|
126
|
+
|
127
|
+
/**
|
128
|
+
* Stops all scheduled jobs
|
129
|
+
* @returns {Promise<void>}
|
130
|
+
*/
|
131
|
+
async stopAll(): Promise<void> {
|
132
|
+
const requests = await this.getScheduledRequests();
|
133
|
+
|
134
|
+
for (const request of requests) {
|
135
|
+
await this.cancelScheduledRequest(request.id);
|
136
|
+
}
|
137
|
+
|
138
|
+
await this.storage.clear();
|
139
|
+
}
|
140
|
+
|
141
|
+
/**
|
142
|
+
* Stops the agenda service
|
143
|
+
* @returns {Promise<void>}
|
144
|
+
*/
|
145
|
+
public async stop(): Promise<void> {
|
146
|
+
await this.stopAll();
|
147
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
148
|
+
}
|
149
|
+
|
150
|
+
/**
|
151
|
+
* Cancels requests matching the query
|
152
|
+
* @param {Object} query - Query to match requests against
|
153
|
+
* @returns {Promise<void>}
|
154
|
+
*/
|
155
|
+
public async cancel(query: {}): Promise<void> {
|
156
|
+
await this.stopAll();
|
157
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
158
|
+
}
|
159
|
+
}
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import { embed, EmbeddingModel, embedMany } from "ai";
|
2
|
+
import { IEmbeddingModel } from "../../../../interfaces";
|
3
|
+
|
4
|
+
/**
|
5
|
+
* @module AIEmbeddingAdapter
|
6
|
+
* @description Adapter implementation for AI-based embedding service.
|
7
|
+
* Provides integration with AI models for text embedding generation.
|
8
|
+
* @implements {IEmbeddingModel}
|
9
|
+
*/
|
10
|
+
export class AIEmbeddingAdapter implements IEmbeddingModel {
|
11
|
+
/**
|
12
|
+
* Creates an instance of AIEmbeddingAdapter
|
13
|
+
* @param {EmbeddingModel<string>} model - The AI embedding model to use
|
14
|
+
*/
|
15
|
+
constructor(private readonly model: EmbeddingModel<string>) {}
|
16
|
+
|
17
|
+
/**
|
18
|
+
* Generates an embedding vector for a single text using the AI model
|
19
|
+
* @param {string} text - The text to embed
|
20
|
+
* @returns {Promise<number[]>} The generated embedding vector
|
21
|
+
*/
|
22
|
+
async embed(text: string): Promise<number[]> {
|
23
|
+
const { embedding } = await embed({
|
24
|
+
model: this.model,
|
25
|
+
value: text,
|
26
|
+
});
|
27
|
+
return embedding;
|
28
|
+
}
|
29
|
+
|
30
|
+
/**
|
31
|
+
* Generates embedding vectors for multiple texts using the AI model
|
32
|
+
* @param {string[]} texts - Array of texts to embed
|
33
|
+
* @returns {Promise<number[][]>} Array of generated embedding vectors
|
34
|
+
*/
|
35
|
+
async embedMany(texts: string[]): Promise<number[][]> {
|
36
|
+
const { embeddings } = await embedMany({
|
37
|
+
model: this.model,
|
38
|
+
values: texts,
|
39
|
+
});
|
40
|
+
return embeddings;
|
41
|
+
}
|
42
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
import { cosineSimilarity } from "ai";
|
2
|
+
import { IEmbeddingModel, IEmbeddingModule } from "../../interfaces";
|
3
|
+
|
4
|
+
/**
|
5
|
+
* @module Embedding
|
6
|
+
* @description A module for generating and managing text embeddings.
|
7
|
+
* Provides functionality for converting text into vector representations
|
8
|
+
* and calculating similarities between embeddings.
|
9
|
+
* @implements {IEmbeddingModule}
|
10
|
+
*/
|
11
|
+
export class Embedding implements IEmbeddingModule {
|
12
|
+
/**
|
13
|
+
* Creates an instance of Embedding
|
14
|
+
* @param {IEmbeddingModel} embeddingModel - The embedding model implementation to use
|
15
|
+
*/
|
16
|
+
constructor(private readonly embeddingModel: IEmbeddingModel) {}
|
17
|
+
|
18
|
+
/**
|
19
|
+
* Generates an embedding vector for a single text
|
20
|
+
* @param {string} text - The text to embed
|
21
|
+
* @returns {Promise<number[]>} The embedding vector
|
22
|
+
*/
|
23
|
+
async embedText(text: string): Promise<number[]> {
|
24
|
+
return this.embeddingModel.embed(text);
|
25
|
+
}
|
26
|
+
|
27
|
+
/**
|
28
|
+
* Generates embedding vectors for multiple texts
|
29
|
+
* @param {string[]} texts - Array of texts to embed
|
30
|
+
* @returns {Promise<number[][]>} Array of embedding vectors
|
31
|
+
*/
|
32
|
+
async embedMany(texts: string[]): Promise<number[][]> {
|
33
|
+
return this.embeddingModel.embedMany(texts);
|
34
|
+
}
|
35
|
+
|
36
|
+
/**
|
37
|
+
* Calculates the similarity score between two embeddings
|
38
|
+
* @param {number[]} embedding1 - First embedding vector
|
39
|
+
* @param {number[]} embedding2 - Second embedding vector
|
40
|
+
* @returns {number} Similarity score between 0 and 100
|
41
|
+
*/
|
42
|
+
calculateSimilarity(embedding1: number[], embedding2: number[]): number {
|
43
|
+
return (cosineSimilarity(embedding1, embedding2) + 1) * 50;
|
44
|
+
}
|
45
|
+
}
|