@ai.ntellect/core 0.7.7 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +158 -81
- package/index.ts +462 -22
- package/package copy.json +21 -0
- package/package.json +9 -44
- package/tsconfig.json +108 -22
- package/types.ts +62 -0
- package/utils/executor.ts +42 -0
- package/.mocharc.json +0 -5
- package/dist/graph/controller.d.ts +0 -31
- package/dist/graph/controller.d.ts.map +0 -1
- package/dist/graph/controller.js +0 -71
- package/dist/graph/controller.js.map +0 -1
- package/dist/graph/event-manager.d.ts +0 -92
- package/dist/graph/event-manager.d.ts.map +0 -1
- package/dist/graph/event-manager.js +0 -244
- package/dist/graph/event-manager.js.map +0 -1
- package/dist/graph/index.d.ts +0 -159
- package/dist/graph/index.d.ts.map +0 -1
- package/dist/graph/index.js +0 -303
- package/dist/graph/index.js.map +0 -1
- package/dist/graph/logger.d.ts +0 -46
- package/dist/graph/logger.d.ts.map +0 -1
- package/dist/graph/logger.js +0 -69
- package/dist/graph/logger.js.map +0 -1
- package/dist/graph/node.d.ts +0 -92
- package/dist/graph/node.d.ts.map +0 -1
- package/dist/graph/node.js +0 -249
- package/dist/graph/node.js.map +0 -1
- package/dist/graph/observer.d.ts +0 -113
- package/dist/graph/observer.d.ts.map +0 -1
- package/dist/graph/observer.js +0 -198
- package/dist/graph/observer.js.map +0 -1
- package/dist/index.d.ts +0 -26
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -42
- package/dist/index.js.map +0 -1
- package/dist/interfaces/index.d.ts +0 -447
- package/dist/interfaces/index.d.ts.map +0 -1
- package/dist/interfaces/index.js +0 -75
- package/dist/interfaces/index.js.map +0 -1
- package/dist/modules/agenda/adapters/node-cron/index.d.ts +0 -17
- package/dist/modules/agenda/adapters/node-cron/index.d.ts.map +0 -1
- package/dist/modules/agenda/adapters/node-cron/index.js +0 -30
- package/dist/modules/agenda/adapters/node-cron/index.js.map +0 -1
- package/dist/modules/agenda/index.d.ts +0 -63
- package/dist/modules/agenda/index.d.ts.map +0 -1
- package/dist/modules/agenda/index.js +0 -141
- package/dist/modules/agenda/index.js.map +0 -1
- package/dist/modules/embedding/adapters/ai/index.d.ts +0 -29
- package/dist/modules/embedding/adapters/ai/index.d.ts.map +0 -1
- package/dist/modules/embedding/adapters/ai/index.js +0 -58
- package/dist/modules/embedding/adapters/ai/index.js.map +0 -1
- package/dist/modules/embedding/index.d.ts +0 -36
- package/dist/modules/embedding/index.d.ts.map +0 -1
- package/dist/modules/embedding/index.js +0 -60
- package/dist/modules/embedding/index.js.map +0 -1
- package/dist/modules/memory/adapters/in-memory/index.d.ts +0 -120
- package/dist/modules/memory/adapters/in-memory/index.d.ts.map +0 -1
- package/dist/modules/memory/adapters/in-memory/index.js +0 -211
- package/dist/modules/memory/adapters/in-memory/index.js.map +0 -1
- package/dist/modules/memory/adapters/meilisearch/index.d.ts +0 -110
- package/dist/modules/memory/adapters/meilisearch/index.d.ts.map +0 -1
- package/dist/modules/memory/adapters/meilisearch/index.js +0 -321
- package/dist/modules/memory/adapters/meilisearch/index.js.map +0 -1
- package/dist/modules/memory/adapters/redis/index.d.ts +0 -82
- package/dist/modules/memory/adapters/redis/index.d.ts.map +0 -1
- package/dist/modules/memory/adapters/redis/index.js +0 -159
- package/dist/modules/memory/adapters/redis/index.js.map +0 -1
- package/dist/modules/memory/index.d.ts +0 -67
- package/dist/modules/memory/index.d.ts.map +0 -1
- package/dist/modules/memory/index.js +0 -104
- package/dist/modules/memory/index.js.map +0 -1
- package/dist/types/index.d.ts +0 -166
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +0 -1
- package/dist/utils/generate-action-schema.d.ts +0 -5
- package/dist/utils/generate-action-schema.d.ts.map +0 -1
- package/dist/utils/generate-action-schema.js +0 -44
- package/dist/utils/generate-action-schema.js.map +0 -1
- package/dist/utils/header-builder.d.ts +0 -12
- package/dist/utils/header-builder.d.ts.map +0 -1
- package/dist/utils/header-builder.js +0 -35
- package/dist/utils/header-builder.js.map +0 -1
- package/graph/controller.ts +0 -74
- package/graph/event-manager.ts +0 -295
- package/graph/index.ts +0 -397
- package/graph/logger.ts +0 -70
- package/graph/node.ts +0 -305
- package/graph/observer.ts +0 -368
- package/interfaces/index.ts +0 -545
- package/modules/agenda/adapters/node-cron/index.ts +0 -25
- package/modules/agenda/index.ts +0 -146
- package/modules/embedding/adapters/ai/index.ts +0 -42
- package/modules/embedding/index.ts +0 -45
- package/modules/memory/adapters/in-memory/index.ts +0 -207
- package/modules/memory/adapters/meilisearch/index.ts +0 -361
- package/modules/memory/adapters/redis/index.ts +0 -164
- package/modules/memory/index.ts +0 -93
- package/test/graph/controller.test.ts +0 -187
- package/test/graph/event-manager.test.ts +0 -72
- package/test/graph/index.test.ts +0 -768
- package/test/graph/node.test.ts +0 -510
- package/test/graph/observer.test.ts +0 -398
- package/test/modules/agenda/node-cron.test.ts +0 -307
- package/test/modules/memory/adapters/in-memory.test.ts +0 -153
- package/test/modules/memory/adapters/meilisearch.test.ts +0 -287
- package/test/modules/memory/base.test.ts +0 -230
- package/types/index.ts +0 -184
- package/utils/generate-action-schema.ts +0 -46
- package/utils/header-builder.ts +0 -40
package/graph/index.ts
DELETED
@@ -1,397 +0,0 @@
|
|
1
|
-
import { EventEmitter } from "events";
|
2
|
-
import { BehaviorSubject, Subject } from "rxjs";
|
3
|
-
import { ZodSchema } from "zod";
|
4
|
-
import { GraphObservable, IEventEmitter } from "../interfaces";
|
5
|
-
import { GraphContext, GraphDefinition, GraphEvent, Node } from "../types";
|
6
|
-
import { GraphEventManager } from "./event-manager";
|
7
|
-
import { GraphLogger } from "./logger";
|
8
|
-
import { GraphNode, NodeParams } from "./node";
|
9
|
-
import { GraphObserver } from "./observer";
|
10
|
-
|
11
|
-
/**
|
12
|
-
* @module GraphFlow
|
13
|
-
* @description A flexible workflow engine that manages the execution of nodes in a graph-like structure.
|
14
|
-
*
|
15
|
-
* Key features:
|
16
|
-
* - Multiple branches support
|
17
|
-
* - Conditional branching (runs first matching condition, or all if none have conditions)
|
18
|
-
* - Event-driven nodes
|
19
|
-
* - Zod validation of context/inputs/outputs
|
20
|
-
* - Automatic retry on node failures
|
21
|
-
*
|
22
|
-
* @template T - Extends ZodSchema for type validation
|
23
|
-
*/
|
24
|
-
export class GraphFlow<T extends ZodSchema> {
|
25
|
-
private context: GraphContext<T>;
|
26
|
-
public validator?: T;
|
27
|
-
private eventEmitter: IEventEmitter;
|
28
|
-
private globalErrorHandler?: (error: Error, context: GraphContext<T>) => void;
|
29
|
-
private graphEvents?: string[];
|
30
|
-
private entryNode?: string;
|
31
|
-
private verbose: boolean = false;
|
32
|
-
public nodes: Map<string, Node<T, any>>;
|
33
|
-
|
34
|
-
private eventSubject: Subject<GraphEvent<T>> = new Subject();
|
35
|
-
private stateSubject: BehaviorSubject<GraphContext<T>>;
|
36
|
-
private destroySubject: Subject<void> = new Subject();
|
37
|
-
|
38
|
-
public observer: GraphObserver<T>;
|
39
|
-
private logger: GraphLogger;
|
40
|
-
private eventManager: GraphEventManager<T>;
|
41
|
-
private nodeExecutor: GraphNode<T>;
|
42
|
-
|
43
|
-
/**
|
44
|
-
* Creates a new instance of GraphFlow
|
45
|
-
* @param {string} name - The name of the graph flow
|
46
|
-
* @param {GraphDefinition<T>} config - Configuration object containing nodes, schema, context, and error handlers
|
47
|
-
* @param {Object} options - Optional options for the graph flow
|
48
|
-
*/
|
49
|
-
constructor(
|
50
|
-
public name: string,
|
51
|
-
config: GraphDefinition<T>,
|
52
|
-
options: { verbose?: boolean } = {}
|
53
|
-
) {
|
54
|
-
this.nodes = new Map(
|
55
|
-
config.nodes.map((node: Node<T, any>) => [node.name, node])
|
56
|
-
);
|
57
|
-
this.validator = config.schema;
|
58
|
-
this.context = config.schema.parse(config.context) as GraphContext<T>;
|
59
|
-
this.globalErrorHandler = config.onError;
|
60
|
-
this.eventEmitter =
|
61
|
-
config.eventEmitter || (new EventEmitter() as IEventEmitter);
|
62
|
-
this.graphEvents = config.events;
|
63
|
-
this.verbose = options.verbose ?? false;
|
64
|
-
|
65
|
-
this.stateSubject = new BehaviorSubject<GraphContext<T>>(this.context);
|
66
|
-
|
67
|
-
this.logger = new GraphLogger(name, options.verbose);
|
68
|
-
this.eventManager = new GraphEventManager(
|
69
|
-
this.eventEmitter,
|
70
|
-
this.nodes,
|
71
|
-
name,
|
72
|
-
this.context,
|
73
|
-
config.events,
|
74
|
-
config.entryNode,
|
75
|
-
config.onError
|
76
|
-
);
|
77
|
-
this.nodeExecutor = new GraphNode(
|
78
|
-
this.nodes as Map<string, Node<T, any>>,
|
79
|
-
this.logger,
|
80
|
-
this.eventManager,
|
81
|
-
this.eventSubject,
|
82
|
-
this.stateSubject
|
83
|
-
);
|
84
|
-
|
85
|
-
this.setupEventStreams();
|
86
|
-
this.setupEventListeners();
|
87
|
-
this.setupGraphEventListeners();
|
88
|
-
|
89
|
-
this.observer = new GraphObserver(
|
90
|
-
this,
|
91
|
-
this.eventSubject,
|
92
|
-
this.stateSubject,
|
93
|
-
this.destroySubject
|
94
|
-
);
|
95
|
-
}
|
96
|
-
|
97
|
-
/**
|
98
|
-
* Sets up event listeners for node-based events
|
99
|
-
* @private
|
100
|
-
* @description Attaches all node-based event triggers while preserving external listeners
|
101
|
-
*/
|
102
|
-
private setupEventStreams(): void {
|
103
|
-
this.eventManager.on("nodeStarted", (data) => {
|
104
|
-
this.addLog(`Event: Node "${data.name}" started`);
|
105
|
-
});
|
106
|
-
|
107
|
-
this.eventManager.on("nodeCompleted", (data) => {
|
108
|
-
this.addLog(`Event: Node "${data.name}" completed`);
|
109
|
-
});
|
110
|
-
|
111
|
-
this.eventManager.on("nodeError", (data) => {
|
112
|
-
let errorMessage = "Unknown error";
|
113
|
-
if (data.error) {
|
114
|
-
errorMessage =
|
115
|
-
data.error instanceof Error
|
116
|
-
? data.error.message
|
117
|
-
: data.error.errors?.[0]?.message ||
|
118
|
-
data.error.message ||
|
119
|
-
"Unknown error";
|
120
|
-
}
|
121
|
-
this.addLog(`Event: Node "${data.name}" error: ${errorMessage}`);
|
122
|
-
});
|
123
|
-
|
124
|
-
this.eventManager.on("nodeStateChanged", (data) => {
|
125
|
-
this.addLog(`Event: Node "${data.name}" state changed`);
|
126
|
-
});
|
127
|
-
}
|
128
|
-
|
129
|
-
/**
|
130
|
-
* Sets up event listeners for node-based events
|
131
|
-
* @private
|
132
|
-
* @description Attaches all node-based event triggers while preserving external listeners
|
133
|
-
*/
|
134
|
-
private setupEventListeners(): void {
|
135
|
-
this.eventManager.setupEventListeners();
|
136
|
-
}
|
137
|
-
|
138
|
-
/**
|
139
|
-
* Sets up event listeners for graph-based events
|
140
|
-
* @private
|
141
|
-
* @description Attaches all graph-based event triggers
|
142
|
-
*/
|
143
|
-
private setupGraphEventListeners(): void {
|
144
|
-
this.eventManager.setupGraphEventListeners();
|
145
|
-
}
|
146
|
-
|
147
|
-
/**
|
148
|
-
* Executes a specific node in the graph
|
149
|
-
* @private
|
150
|
-
* @param {string} nodeName - Name of the node to execute
|
151
|
-
* @param {GraphContext<T>} context - Current execution context
|
152
|
-
* @param {any} inputs - Input parameters for the node
|
153
|
-
* @param {boolean} triggeredByEvent - Whether the execution was triggered by an event
|
154
|
-
* @returns {Promise<void>}
|
155
|
-
*/
|
156
|
-
private async executeNode(
|
157
|
-
nodeName: string,
|
158
|
-
context: GraphContext<T>,
|
159
|
-
inputs: any,
|
160
|
-
triggeredByEvent: boolean = false
|
161
|
-
): Promise<void> {
|
162
|
-
return this.nodeExecutor.executeNode(
|
163
|
-
nodeName,
|
164
|
-
context,
|
165
|
-
inputs,
|
166
|
-
triggeredByEvent
|
167
|
-
);
|
168
|
-
}
|
169
|
-
|
170
|
-
private addLog(message: string): void {
|
171
|
-
this.logger.addLog(message);
|
172
|
-
}
|
173
|
-
|
174
|
-
public getLogs(): string[] {
|
175
|
-
return this.logger.getLogs();
|
176
|
-
}
|
177
|
-
|
178
|
-
public clearLogs(): void {
|
179
|
-
this.logger.clearLogs();
|
180
|
-
}
|
181
|
-
|
182
|
-
/**
|
183
|
-
* Get the observer instance for monitoring graph state and events
|
184
|
-
*/
|
185
|
-
public observe(
|
186
|
-
options: {
|
187
|
-
debounce?: number;
|
188
|
-
delay?: number;
|
189
|
-
stream?: boolean;
|
190
|
-
properties?: (keyof GraphContext<T> extends string
|
191
|
-
? keyof GraphContext<T>
|
192
|
-
: never)[];
|
193
|
-
onStreamLetter?: (data: { letter: string; property: string }) => void;
|
194
|
-
onStreamComplete?: () => void;
|
195
|
-
} = {}
|
196
|
-
): GraphObservable<T> {
|
197
|
-
return this.observer.state(options) as GraphObservable<T>;
|
198
|
-
}
|
199
|
-
|
200
|
-
/**
|
201
|
-
* Enable or disable verbose logging
|
202
|
-
* @param {boolean} enabled - Whether to enable verbose logging
|
203
|
-
*/
|
204
|
-
public setVerbose(enabled: boolean): void {
|
205
|
-
this.logger.setVerbose(enabled);
|
206
|
-
}
|
207
|
-
|
208
|
-
/**
|
209
|
-
* Get current verbose setting
|
210
|
-
* @returns {boolean} Current verbose setting
|
211
|
-
*/
|
212
|
-
public isVerbose(): boolean {
|
213
|
-
return this.logger.isVerbose();
|
214
|
-
}
|
215
|
-
|
216
|
-
/**
|
217
|
-
* Executes the graph flow starting from a specific node
|
218
|
-
* @param {string} startNode - Name of the node to start execution from
|
219
|
-
* @param {any} inputs - Optional input parameters for the start node
|
220
|
-
* @param {Partial<GraphContext<T>>} context - Optional context to merge
|
221
|
-
* @param {NodeParams} params - Optional node parameters
|
222
|
-
* @returns {Promise<GraphContext<T>>} Final context after execution
|
223
|
-
*/
|
224
|
-
public async execute(
|
225
|
-
startNode: string,
|
226
|
-
params?: NodeParams,
|
227
|
-
context?: Partial<GraphContext<T>>
|
228
|
-
): Promise<GraphContext<T>> {
|
229
|
-
if (context) {
|
230
|
-
Object.assign(this.context, context);
|
231
|
-
}
|
232
|
-
|
233
|
-
this.eventEmitter.emit("graphStarted", { name: this.name });
|
234
|
-
|
235
|
-
try {
|
236
|
-
const node = this.nodes.get(startNode);
|
237
|
-
if (!node) throw new Error(`Node "${startNode}" not found`);
|
238
|
-
|
239
|
-
if (node.params && !params) {
|
240
|
-
throw new Error(`Params required for node "${startNode}"`);
|
241
|
-
}
|
242
|
-
|
243
|
-
await this.nodeExecutor.executeNode(
|
244
|
-
startNode,
|
245
|
-
this.context,
|
246
|
-
params,
|
247
|
-
false
|
248
|
-
);
|
249
|
-
|
250
|
-
this.eventEmitter.emit("graphCompleted", {
|
251
|
-
name: this.name,
|
252
|
-
context: this.context,
|
253
|
-
});
|
254
|
-
|
255
|
-
return this.getContext();
|
256
|
-
} catch (error) {
|
257
|
-
this.eventEmitter.emit("graphError", { name: this.name, error });
|
258
|
-
this.globalErrorHandler?.(error as Error, this.context);
|
259
|
-
throw error;
|
260
|
-
}
|
261
|
-
}
|
262
|
-
|
263
|
-
/**
|
264
|
-
* Emits an event to trigger event-based nodes
|
265
|
-
* @param {string} eventName - Name of the event to emit
|
266
|
-
* @param {Partial<GraphContext<T>>} data - Optional data to merge with context
|
267
|
-
* @returns {Promise<void>}
|
268
|
-
*/
|
269
|
-
public async emit(
|
270
|
-
eventName: string,
|
271
|
-
data?: Partial<GraphContext<T>>
|
272
|
-
): Promise<void> {
|
273
|
-
const event: GraphEvent<T> = {
|
274
|
-
type: eventName,
|
275
|
-
payload: data,
|
276
|
-
timestamp: Date.now(),
|
277
|
-
};
|
278
|
-
this.eventSubject.next(event);
|
279
|
-
await new Promise((resolve) => setTimeout(resolve, 0));
|
280
|
-
}
|
281
|
-
|
282
|
-
/**
|
283
|
-
* Registers an event handler
|
284
|
-
* @param {string} eventName - Name of the event to listen for
|
285
|
-
* @param {Function} handler - Handler function to execute when event is emitted
|
286
|
-
*/
|
287
|
-
public on(eventName: string, handler: (...args: any[]) => void): void {
|
288
|
-
this.eventManager.on(eventName, handler);
|
289
|
-
}
|
290
|
-
|
291
|
-
/**
|
292
|
-
* Updates the graph definition with new configuration
|
293
|
-
* @param {GraphDefinition<T>} definition - New graph definition
|
294
|
-
*/
|
295
|
-
public load(definition: GraphDefinition<T>): void {
|
296
|
-
// Clear all existing nodes
|
297
|
-
this.nodes.clear();
|
298
|
-
// Wipe out old node-based event listeners
|
299
|
-
// (We keep external test listeners like "nodeStarted" or "nodeCompleted".)
|
300
|
-
if (definition.nodes?.length) {
|
301
|
-
const allEvents = new Set<string>();
|
302
|
-
definition.nodes.forEach((n) =>
|
303
|
-
n.events?.forEach((evt) => allEvents.add(evt))
|
304
|
-
);
|
305
|
-
for (const evt of allEvents) {
|
306
|
-
this.eventEmitter.removeAllListeners(evt);
|
307
|
-
}
|
308
|
-
}
|
309
|
-
|
310
|
-
// Add in new nodes
|
311
|
-
definition.nodes.forEach((node) => this.nodes.set(node.name, node));
|
312
|
-
|
313
|
-
// Parse the new context
|
314
|
-
this.context = definition.schema.parse(
|
315
|
-
definition.context
|
316
|
-
) as GraphContext<T>;
|
317
|
-
this.validator = definition.schema;
|
318
|
-
|
319
|
-
// Store entry node
|
320
|
-
this.entryNode = definition.entryNode;
|
321
|
-
// Store graph events
|
322
|
-
this.graphEvents = definition.events;
|
323
|
-
|
324
|
-
// Re-setup only node-based event triggers
|
325
|
-
for (const node of this.nodes.values()) {
|
326
|
-
if (node.events && node.events.length > 0) {
|
327
|
-
node.events.forEach((event) => {
|
328
|
-
this.eventEmitter.on(
|
329
|
-
event,
|
330
|
-
async (data?: Partial<GraphContext<T>>) => {
|
331
|
-
const freshContext = structuredClone(this.context);
|
332
|
-
if (data) Object.assign(freshContext, data);
|
333
|
-
await this.executeNode(node.name, freshContext, undefined, true);
|
334
|
-
}
|
335
|
-
);
|
336
|
-
});
|
337
|
-
}
|
338
|
-
}
|
339
|
-
|
340
|
-
// Re-setup graph event listeners
|
341
|
-
this.setupGraphEventListeners();
|
342
|
-
}
|
343
|
-
|
344
|
-
/**
|
345
|
-
* Gets a copy of the current context
|
346
|
-
* @returns {GraphContext<T>} A deep copy of the current context
|
347
|
-
*/
|
348
|
-
public getContext(): GraphContext<T> {
|
349
|
-
return structuredClone(this.context);
|
350
|
-
}
|
351
|
-
|
352
|
-
/**
|
353
|
-
* Logs a message with optional data
|
354
|
-
* @param {string} message - Message to log
|
355
|
-
* @param {any} data - Optional data to log
|
356
|
-
*/
|
357
|
-
public log(message: string, data?: any): void {
|
358
|
-
this.logger.log(message, data);
|
359
|
-
}
|
360
|
-
|
361
|
-
/**
|
362
|
-
* Adds a new node to the graph
|
363
|
-
* @param {Node<T>} node - Node to add
|
364
|
-
* @throws {Error} If node with same name already exists
|
365
|
-
*/
|
366
|
-
public addNode(node: Node<T, any>): void {
|
367
|
-
this.nodes.set(node.name, node);
|
368
|
-
this.eventManager.setupEventListeners();
|
369
|
-
}
|
370
|
-
|
371
|
-
/**
|
372
|
-
* Removes a node from the graph
|
373
|
-
* @param {string} nodeName - Name of the node to remove
|
374
|
-
*/
|
375
|
-
public removeNode(nodeName: string): void {
|
376
|
-
this.nodes.delete(nodeName);
|
377
|
-
this.eventManager.setupEventListeners();
|
378
|
-
}
|
379
|
-
|
380
|
-
/**
|
381
|
-
* Returns all nodes in the graph
|
382
|
-
* @returns {Node<T>[]} Array of all nodes
|
383
|
-
*/
|
384
|
-
public getNodes(): Node<T, any>[] {
|
385
|
-
return Array.from(this.nodes.values());
|
386
|
-
}
|
387
|
-
|
388
|
-
/**
|
389
|
-
* Cleanup resources
|
390
|
-
*/
|
391
|
-
public destroy(): void {
|
392
|
-
this.destroySubject.next();
|
393
|
-
this.destroySubject.complete();
|
394
|
-
this.eventSubject.complete();
|
395
|
-
this.stateSubject.complete();
|
396
|
-
}
|
397
|
-
}
|
package/graph/logger.ts
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Handles logging operations for a graph instance
|
3
|
-
* Provides methods for adding, retrieving, and managing logs with optional verbose output
|
4
|
-
*/
|
5
|
-
export class GraphLogger {
|
6
|
-
private logs: string[] = [];
|
7
|
-
private verbose: boolean = false;
|
8
|
-
|
9
|
-
/**
|
10
|
-
* Creates a new GraphLogger instance
|
11
|
-
* @param graphName - The name of the graph this logger is associated with
|
12
|
-
* @param verbose - Whether to output logs to console in real-time
|
13
|
-
*/
|
14
|
-
constructor(private graphName: string, verbose: boolean = false) {
|
15
|
-
this.verbose = verbose;
|
16
|
-
}
|
17
|
-
|
18
|
-
/**
|
19
|
-
* Adds a new log entry with timestamp
|
20
|
-
* @param message - The message to log
|
21
|
-
*/
|
22
|
-
public addLog(message: string): void {
|
23
|
-
const timestamp = new Date().toISOString();
|
24
|
-
const logMessage = `[${timestamp}] ${message}`;
|
25
|
-
this.logs.push(logMessage);
|
26
|
-
if (this.verbose) {
|
27
|
-
console.log(`${this.graphName} - ${message}`);
|
28
|
-
}
|
29
|
-
}
|
30
|
-
|
31
|
-
/**
|
32
|
-
* Returns a copy of all stored logs
|
33
|
-
* @returns Array of log messages
|
34
|
-
*/
|
35
|
-
public getLogs(): string[] {
|
36
|
-
return [...this.logs];
|
37
|
-
}
|
38
|
-
|
39
|
-
/**
|
40
|
-
* Clears all stored logs
|
41
|
-
*/
|
42
|
-
public clearLogs(): void {
|
43
|
-
this.logs = [];
|
44
|
-
}
|
45
|
-
|
46
|
-
/**
|
47
|
-
* Sets the verbose mode
|
48
|
-
* @param enabled - Whether to enable verbose mode
|
49
|
-
*/
|
50
|
-
public setVerbose(enabled: boolean): void {
|
51
|
-
this.verbose = enabled;
|
52
|
-
}
|
53
|
-
|
54
|
-
/**
|
55
|
-
* Gets the current verbose mode status
|
56
|
-
* @returns Current verbose mode state
|
57
|
-
*/
|
58
|
-
public isVerbose(): boolean {
|
59
|
-
return this.verbose;
|
60
|
-
}
|
61
|
-
|
62
|
-
/**
|
63
|
-
* Logs a message to console with graph name prefix
|
64
|
-
* @param message - The message to log
|
65
|
-
* @param data - Optional data to log
|
66
|
-
*/
|
67
|
-
log(message: string, data?: any): void {
|
68
|
-
console.log(`[Graph ${this.graphName}] ${message}`, data);
|
69
|
-
}
|
70
|
-
}
|