@principal-ai/principal-view-core 0.5.6
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 +126 -0
- package/dist/ConfigurationLoader.d.ts +76 -0
- package/dist/ConfigurationLoader.d.ts.map +1 -0
- package/dist/ConfigurationLoader.js +144 -0
- package/dist/ConfigurationLoader.js.map +1 -0
- package/dist/ConfigurationValidator.d.ts +31 -0
- package/dist/ConfigurationValidator.d.ts.map +1 -0
- package/dist/ConfigurationValidator.js +242 -0
- package/dist/ConfigurationValidator.js.map +1 -0
- package/dist/EventProcessor.d.ts +49 -0
- package/dist/EventProcessor.d.ts.map +1 -0
- package/dist/EventProcessor.js +215 -0
- package/dist/EventProcessor.js.map +1 -0
- package/dist/EventRecorderService.d.ts +305 -0
- package/dist/EventRecorderService.d.ts.map +1 -0
- package/dist/EventRecorderService.js +463 -0
- package/dist/EventRecorderService.js.map +1 -0
- package/dist/LibraryLoader.d.ts +63 -0
- package/dist/LibraryLoader.d.ts.map +1 -0
- package/dist/LibraryLoader.js +188 -0
- package/dist/LibraryLoader.js.map +1 -0
- package/dist/PathBasedEventProcessor.d.ts +90 -0
- package/dist/PathBasedEventProcessor.d.ts.map +1 -0
- package/dist/PathBasedEventProcessor.js +239 -0
- package/dist/PathBasedEventProcessor.js.map +1 -0
- package/dist/SessionManager.d.ts +194 -0
- package/dist/SessionManager.d.ts.map +1 -0
- package/dist/SessionManager.js +299 -0
- package/dist/SessionManager.js.map +1 -0
- package/dist/ValidationEngine.d.ts +31 -0
- package/dist/ValidationEngine.d.ts.map +1 -0
- package/dist/ValidationEngine.js +158 -0
- package/dist/ValidationEngine.js.map +1 -0
- package/dist/helpers/GraphInstrumentationHelper.d.ts +93 -0
- package/dist/helpers/GraphInstrumentationHelper.d.ts.map +1 -0
- package/dist/helpers/GraphInstrumentationHelper.js +248 -0
- package/dist/helpers/GraphInstrumentationHelper.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/rules/config.d.ts +57 -0
- package/dist/rules/config.d.ts.map +1 -0
- package/dist/rules/config.js +382 -0
- package/dist/rules/config.js.map +1 -0
- package/dist/rules/engine.d.ts +70 -0
- package/dist/rules/engine.d.ts.map +1 -0
- package/dist/rules/engine.js +252 -0
- package/dist/rules/engine.js.map +1 -0
- package/dist/rules/implementations/connection-type-references.d.ts +7 -0
- package/dist/rules/implementations/connection-type-references.d.ts.map +1 -0
- package/dist/rules/implementations/connection-type-references.js +104 -0
- package/dist/rules/implementations/connection-type-references.js.map +1 -0
- package/dist/rules/implementations/dead-end-states.d.ts +17 -0
- package/dist/rules/implementations/dead-end-states.d.ts.map +1 -0
- package/dist/rules/implementations/dead-end-states.js +72 -0
- package/dist/rules/implementations/dead-end-states.js.map +1 -0
- package/dist/rules/implementations/index.d.ts +24 -0
- package/dist/rules/implementations/index.d.ts.map +1 -0
- package/dist/rules/implementations/index.js +62 -0
- package/dist/rules/implementations/index.js.map +1 -0
- package/dist/rules/implementations/library-node-type-match.d.ts +17 -0
- package/dist/rules/implementations/library-node-type-match.d.ts.map +1 -0
- package/dist/rules/implementations/library-node-type-match.js +123 -0
- package/dist/rules/implementations/library-node-type-match.js.map +1 -0
- package/dist/rules/implementations/minimum-node-sources.d.ts +22 -0
- package/dist/rules/implementations/minimum-node-sources.d.ts.map +1 -0
- package/dist/rules/implementations/minimum-node-sources.js +54 -0
- package/dist/rules/implementations/minimum-node-sources.js.map +1 -0
- package/dist/rules/implementations/no-unknown-fields.d.ts +7 -0
- package/dist/rules/implementations/no-unknown-fields.d.ts.map +1 -0
- package/dist/rules/implementations/no-unknown-fields.js +211 -0
- package/dist/rules/implementations/no-unknown-fields.js.map +1 -0
- package/dist/rules/implementations/orphaned-edge-types.d.ts +7 -0
- package/dist/rules/implementations/orphaned-edge-types.d.ts.map +1 -0
- package/dist/rules/implementations/orphaned-edge-types.js +47 -0
- package/dist/rules/implementations/orphaned-edge-types.js.map +1 -0
- package/dist/rules/implementations/orphaned-node-types.d.ts +7 -0
- package/dist/rules/implementations/orphaned-node-types.d.ts.map +1 -0
- package/dist/rules/implementations/orphaned-node-types.js +50 -0
- package/dist/rules/implementations/orphaned-node-types.js.map +1 -0
- package/dist/rules/implementations/required-metadata.d.ts +7 -0
- package/dist/rules/implementations/required-metadata.d.ts.map +1 -0
- package/dist/rules/implementations/required-metadata.js +57 -0
- package/dist/rules/implementations/required-metadata.js.map +1 -0
- package/dist/rules/implementations/state-transition-references.d.ts +7 -0
- package/dist/rules/implementations/state-transition-references.d.ts.map +1 -0
- package/dist/rules/implementations/state-transition-references.js +135 -0
- package/dist/rules/implementations/state-transition-references.js.map +1 -0
- package/dist/rules/implementations/unreachable-states.d.ts +7 -0
- package/dist/rules/implementations/unreachable-states.d.ts.map +1 -0
- package/dist/rules/implementations/unreachable-states.js +80 -0
- package/dist/rules/implementations/unreachable-states.js.map +1 -0
- package/dist/rules/implementations/valid-action-patterns.d.ts +17 -0
- package/dist/rules/implementations/valid-action-patterns.d.ts.map +1 -0
- package/dist/rules/implementations/valid-action-patterns.js +109 -0
- package/dist/rules/implementations/valid-action-patterns.js.map +1 -0
- package/dist/rules/implementations/valid-color-format.d.ts +7 -0
- package/dist/rules/implementations/valid-color-format.d.ts.map +1 -0
- package/dist/rules/implementations/valid-color-format.js +91 -0
- package/dist/rules/implementations/valid-color-format.js.map +1 -0
- package/dist/rules/implementations/valid-edge-types.d.ts +7 -0
- package/dist/rules/implementations/valid-edge-types.d.ts.map +1 -0
- package/dist/rules/implementations/valid-edge-types.js +244 -0
- package/dist/rules/implementations/valid-edge-types.js.map +1 -0
- package/dist/rules/implementations/valid-node-types.d.ts +7 -0
- package/dist/rules/implementations/valid-node-types.d.ts.map +1 -0
- package/dist/rules/implementations/valid-node-types.js +175 -0
- package/dist/rules/implementations/valid-node-types.js.map +1 -0
- package/dist/rules/index.d.ts +28 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +45 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/types.d.ts +309 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +35 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/types/canvas.d.ts +409 -0
- package/dist/types/canvas.d.ts.map +1 -0
- package/dist/types/canvas.js +70 -0
- package/dist/types/canvas.js.map +1 -0
- package/dist/types/index.d.ts +311 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +13 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/library.d.ts +185 -0
- package/dist/types/library.d.ts.map +1 -0
- package/dist/types/library.js +15 -0
- package/dist/types/library.js.map +1 -0
- package/dist/types/path-based-config.d.ts +230 -0
- package/dist/types/path-based-config.d.ts.map +1 -0
- package/dist/types/path-based-config.js +9 -0
- package/dist/types/path-based-config.js.map +1 -0
- package/dist/utils/CanvasConverter.d.ts +118 -0
- package/dist/utils/CanvasConverter.d.ts.map +1 -0
- package/dist/utils/CanvasConverter.js +315 -0
- package/dist/utils/CanvasConverter.js.map +1 -0
- package/dist/utils/GraphConverter.d.ts +18 -0
- package/dist/utils/GraphConverter.d.ts.map +1 -0
- package/dist/utils/GraphConverter.js +61 -0
- package/dist/utils/GraphConverter.js.map +1 -0
- package/dist/utils/LibraryConverter.d.ts +113 -0
- package/dist/utils/LibraryConverter.d.ts.map +1 -0
- package/dist/utils/LibraryConverter.js +166 -0
- package/dist/utils/LibraryConverter.js.map +1 -0
- package/dist/utils/PathMatcher.d.ts +55 -0
- package/dist/utils/PathMatcher.d.ts.map +1 -0
- package/dist/utils/PathMatcher.js +172 -0
- package/dist/utils/PathMatcher.js.map +1 -0
- package/dist/utils/YamlParser.d.ts +36 -0
- package/dist/utils/YamlParser.d.ts.map +1 -0
- package/dist/utils/YamlParser.js +63 -0
- package/dist/utils/YamlParser.js.map +1 -0
- package/package.json +47 -0
- package/src/ConfigurationLoader.test.ts +490 -0
- package/src/ConfigurationLoader.ts +185 -0
- package/src/ConfigurationValidator.test.ts +200 -0
- package/src/ConfigurationValidator.ts +283 -0
- package/src/EventProcessor.test.ts +405 -0
- package/src/EventProcessor.ts +250 -0
- package/src/EventRecorderService.test.ts +541 -0
- package/src/EventRecorderService.ts +744 -0
- package/src/LibraryLoader.ts +215 -0
- package/src/PathBasedEventProcessor.test.ts +567 -0
- package/src/PathBasedEventProcessor.ts +332 -0
- package/src/SessionManager.test.ts +424 -0
- package/src/SessionManager.ts +470 -0
- package/src/ValidationEngine.test.ts +371 -0
- package/src/ValidationEngine.ts +196 -0
- package/src/helpers/GraphInstrumentationHelper.test.ts +340 -0
- package/src/helpers/GraphInstrumentationHelper.ts +326 -0
- package/src/index.ts +85 -0
- package/src/rules/config.test.ts +278 -0
- package/src/rules/config.ts +459 -0
- package/src/rules/engine.test.ts +332 -0
- package/src/rules/engine.ts +318 -0
- package/src/rules/implementations/connection-type-references.ts +117 -0
- package/src/rules/implementations/dead-end-states.ts +101 -0
- package/src/rules/implementations/index.ts +73 -0
- package/src/rules/implementations/library-node-type-match.ts +148 -0
- package/src/rules/implementations/minimum-node-sources.ts +82 -0
- package/src/rules/implementations/no-unknown-fields.ts +342 -0
- package/src/rules/implementations/orphaned-edge-types.ts +55 -0
- package/src/rules/implementations/orphaned-node-types.ts +58 -0
- package/src/rules/implementations/required-metadata.ts +64 -0
- package/src/rules/implementations/state-transition-references.ts +151 -0
- package/src/rules/implementations/unreachable-states.ts +94 -0
- package/src/rules/implementations/valid-action-patterns.ts +136 -0
- package/src/rules/implementations/valid-color-format.ts +140 -0
- package/src/rules/implementations/valid-edge-types.ts +258 -0
- package/src/rules/implementations/valid-node-types.ts +189 -0
- package/src/rules/index.ts +95 -0
- package/src/rules/types.ts +426 -0
- package/src/types/canvas.ts +496 -0
- package/src/types/index.ts +382 -0
- package/src/types/library.ts +233 -0
- package/src/types/path-based-config.ts +281 -0
- package/src/utils/CanvasConverter.ts +431 -0
- package/src/utils/GraphConverter.test.ts +195 -0
- package/src/utils/GraphConverter.ts +71 -0
- package/src/utils/LibraryConverter.ts +245 -0
- package/src/utils/PathMatcher.test.ts +148 -0
- package/src/utils/PathMatcher.ts +183 -0
- package/src/utils/YamlParser.ts +75 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionManager - Manages event recording sessions
|
|
3
|
+
*
|
|
4
|
+
* Sessions group events by test case or recording context.
|
|
5
|
+
* Each session contains a sequence of GraphEvents that can be
|
|
6
|
+
* replayed through the EventControllerPanel.
|
|
7
|
+
*/
|
|
8
|
+
import type { GraphEvent } from './types';
|
|
9
|
+
/**
|
|
10
|
+
* Session status
|
|
11
|
+
*/
|
|
12
|
+
export type SessionStatus = 'recording' | 'completed' | 'error';
|
|
13
|
+
/**
|
|
14
|
+
* Session result when completed
|
|
15
|
+
*/
|
|
16
|
+
export type SessionResult = 'pass' | 'fail' | 'skip';
|
|
17
|
+
/**
|
|
18
|
+
* Metadata associated with a session
|
|
19
|
+
*/
|
|
20
|
+
export interface SessionMetadata {
|
|
21
|
+
/** Test file path */
|
|
22
|
+
testFile?: string;
|
|
23
|
+
/** Test case name */
|
|
24
|
+
testName?: string;
|
|
25
|
+
/** Test suite name */
|
|
26
|
+
testSuite?: string;
|
|
27
|
+
/** Custom tags for filtering */
|
|
28
|
+
tags?: string[];
|
|
29
|
+
/** Test result (set when session completes) */
|
|
30
|
+
result?: SessionResult;
|
|
31
|
+
/** Error message if test failed */
|
|
32
|
+
error?: string;
|
|
33
|
+
/** Duration in milliseconds */
|
|
34
|
+
duration?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* An event recording session
|
|
38
|
+
*/
|
|
39
|
+
export interface EventSession {
|
|
40
|
+
/** Unique session identifier */
|
|
41
|
+
id: string;
|
|
42
|
+
/** Human-readable name (e.g., test name) */
|
|
43
|
+
name: string;
|
|
44
|
+
/** When recording started */
|
|
45
|
+
startedAt: number;
|
|
46
|
+
/** When recording ended (undefined if still recording) */
|
|
47
|
+
endedAt?: number;
|
|
48
|
+
/** Status of the session */
|
|
49
|
+
status: SessionStatus;
|
|
50
|
+
/** Recorded events */
|
|
51
|
+
events: GraphEvent[];
|
|
52
|
+
/** Session metadata */
|
|
53
|
+
metadata: SessionMetadata;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Options for creating a session
|
|
57
|
+
*/
|
|
58
|
+
export interface CreateSessionOptions {
|
|
59
|
+
/** Session name */
|
|
60
|
+
name: string;
|
|
61
|
+
/** Optional metadata */
|
|
62
|
+
metadata?: SessionMetadata;
|
|
63
|
+
/** Optional custom ID (auto-generated if not provided) */
|
|
64
|
+
id?: string;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Options for ending a session
|
|
68
|
+
*/
|
|
69
|
+
export interface EndSessionOptions {
|
|
70
|
+
/** Test result */
|
|
71
|
+
result?: SessionResult;
|
|
72
|
+
/** Error message if failed */
|
|
73
|
+
error?: string;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Session change callback
|
|
77
|
+
*/
|
|
78
|
+
export type SessionChangeCallback = (sessions: EventSession[]) => void;
|
|
79
|
+
/**
|
|
80
|
+
* SessionManager configuration
|
|
81
|
+
*/
|
|
82
|
+
export interface SessionManagerConfig {
|
|
83
|
+
/** Maximum events per session (default: 10000) */
|
|
84
|
+
maxEventsPerSession?: number;
|
|
85
|
+
/** Maximum number of sessions to keep (default: 100) */
|
|
86
|
+
maxSessions?: number;
|
|
87
|
+
/** Auto-cleanup sessions older than this (ms, default: 3600000 = 1 hour) */
|
|
88
|
+
sessionRetention?: number;
|
|
89
|
+
/** Whether to auto-cleanup old sessions (default: true) */
|
|
90
|
+
autoCleanup?: boolean;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Manages event recording sessions
|
|
94
|
+
*/
|
|
95
|
+
export declare class SessionManager {
|
|
96
|
+
private sessions;
|
|
97
|
+
private activeSessionId;
|
|
98
|
+
private listeners;
|
|
99
|
+
private config;
|
|
100
|
+
private cleanupInterval;
|
|
101
|
+
constructor(config?: SessionManagerConfig);
|
|
102
|
+
/**
|
|
103
|
+
* Generate a unique session ID
|
|
104
|
+
*/
|
|
105
|
+
private generateId;
|
|
106
|
+
/**
|
|
107
|
+
* Notify all listeners of session changes
|
|
108
|
+
*/
|
|
109
|
+
private notifyListeners;
|
|
110
|
+
/**
|
|
111
|
+
* Start auto-cleanup interval
|
|
112
|
+
*/
|
|
113
|
+
private startAutoCleanup;
|
|
114
|
+
/**
|
|
115
|
+
* Stop auto-cleanup interval
|
|
116
|
+
*/
|
|
117
|
+
private stopAutoCleanup;
|
|
118
|
+
/**
|
|
119
|
+
* Clean up sessions older than retention period
|
|
120
|
+
*/
|
|
121
|
+
private cleanupOldSessions;
|
|
122
|
+
/**
|
|
123
|
+
* Create a new session
|
|
124
|
+
*/
|
|
125
|
+
createSession(options: CreateSessionOptions): EventSession;
|
|
126
|
+
/**
|
|
127
|
+
* Get session by ID
|
|
128
|
+
*/
|
|
129
|
+
getSession(id: string): EventSession | undefined;
|
|
130
|
+
/**
|
|
131
|
+
* Get the currently active (recording) session
|
|
132
|
+
*/
|
|
133
|
+
getActiveSession(): EventSession | undefined;
|
|
134
|
+
/**
|
|
135
|
+
* List all sessions, sorted by start time (newest first)
|
|
136
|
+
*/
|
|
137
|
+
listSessions(): EventSession[];
|
|
138
|
+
/**
|
|
139
|
+
* Add an event to a session
|
|
140
|
+
*/
|
|
141
|
+
addEvent(sessionId: string, event: GraphEvent): void;
|
|
142
|
+
/**
|
|
143
|
+
* Add an event to the active session (convenience method)
|
|
144
|
+
*/
|
|
145
|
+
addEventToActive(event: GraphEvent): void;
|
|
146
|
+
/**
|
|
147
|
+
* End a session
|
|
148
|
+
*/
|
|
149
|
+
endSession(sessionId: string, options?: EndSessionOptions): void;
|
|
150
|
+
/**
|
|
151
|
+
* End the active session (convenience method)
|
|
152
|
+
*/
|
|
153
|
+
endActiveSession(options?: EndSessionOptions): void;
|
|
154
|
+
/**
|
|
155
|
+
* Mark a session as errored
|
|
156
|
+
*/
|
|
157
|
+
errorSession(sessionId: string, error: string): void;
|
|
158
|
+
/**
|
|
159
|
+
* Delete a session
|
|
160
|
+
*/
|
|
161
|
+
deleteSession(id: string): boolean;
|
|
162
|
+
/**
|
|
163
|
+
* Clear all sessions
|
|
164
|
+
*/
|
|
165
|
+
clearSessions(): void;
|
|
166
|
+
/**
|
|
167
|
+
* Export a session to JSON string
|
|
168
|
+
*/
|
|
169
|
+
exportSession(id: string): string;
|
|
170
|
+
/**
|
|
171
|
+
* Import a session from JSON string
|
|
172
|
+
*/
|
|
173
|
+
importSession(json: string): EventSession;
|
|
174
|
+
/**
|
|
175
|
+
* Subscribe to session changes
|
|
176
|
+
* Returns unsubscribe function
|
|
177
|
+
*/
|
|
178
|
+
onSessionChange(callback: SessionChangeCallback): () => void;
|
|
179
|
+
/**
|
|
180
|
+
* Get session statistics
|
|
181
|
+
*/
|
|
182
|
+
getStats(): {
|
|
183
|
+
totalSessions: number;
|
|
184
|
+
activeSessions: number;
|
|
185
|
+
totalEvents: number;
|
|
186
|
+
oldestSession: number | null;
|
|
187
|
+
newestSession: number | null;
|
|
188
|
+
};
|
|
189
|
+
/**
|
|
190
|
+
* Dispose of the session manager
|
|
191
|
+
*/
|
|
192
|
+
dispose(): void;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=SessionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../src/SessionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionManager - Manages event recording sessions
|
|
3
|
+
*
|
|
4
|
+
* Sessions group events by test case or recording context.
|
|
5
|
+
* Each session contains a sequence of GraphEvents that can be
|
|
6
|
+
* replayed through the EventControllerPanel.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Manages event recording sessions
|
|
10
|
+
*/
|
|
11
|
+
export class SessionManager {
|
|
12
|
+
constructor(config = {}) {
|
|
13
|
+
this.sessions = new Map();
|
|
14
|
+
this.activeSessionId = null;
|
|
15
|
+
this.listeners = new Set();
|
|
16
|
+
this.cleanupInterval = null;
|
|
17
|
+
this.config = {
|
|
18
|
+
maxEventsPerSession: config.maxEventsPerSession ?? 10000,
|
|
19
|
+
maxSessions: config.maxSessions ?? 100,
|
|
20
|
+
sessionRetention: config.sessionRetention ?? 3600000, // 1 hour
|
|
21
|
+
autoCleanup: config.autoCleanup ?? true,
|
|
22
|
+
};
|
|
23
|
+
// Start auto-cleanup if enabled
|
|
24
|
+
if (this.config.autoCleanup) {
|
|
25
|
+
this.startAutoCleanup();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Generate a unique session ID
|
|
30
|
+
*/
|
|
31
|
+
generateId() {
|
|
32
|
+
return `session-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Notify all listeners of session changes
|
|
36
|
+
*/
|
|
37
|
+
notifyListeners() {
|
|
38
|
+
const sessions = this.listSessions();
|
|
39
|
+
for (const listener of this.listeners) {
|
|
40
|
+
try {
|
|
41
|
+
listener(sessions);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
console.error('Session listener error:', error);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Start auto-cleanup interval
|
|
50
|
+
*/
|
|
51
|
+
startAutoCleanup() {
|
|
52
|
+
// Clean up every minute
|
|
53
|
+
this.cleanupInterval = setInterval(() => {
|
|
54
|
+
this.cleanupOldSessions();
|
|
55
|
+
}, 60000);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Stop auto-cleanup interval
|
|
59
|
+
*/
|
|
60
|
+
stopAutoCleanup() {
|
|
61
|
+
if (this.cleanupInterval) {
|
|
62
|
+
clearInterval(this.cleanupInterval);
|
|
63
|
+
this.cleanupInterval = null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Clean up sessions older than retention period
|
|
68
|
+
*/
|
|
69
|
+
cleanupOldSessions() {
|
|
70
|
+
const now = Date.now();
|
|
71
|
+
const cutoff = now - this.config.sessionRetention;
|
|
72
|
+
for (const [id, session] of this.sessions) {
|
|
73
|
+
// Don't cleanup active session
|
|
74
|
+
if (id === this.activeSessionId)
|
|
75
|
+
continue;
|
|
76
|
+
// Cleanup completed/error sessions past retention
|
|
77
|
+
if (session.status !== 'recording' && session.startedAt < cutoff) {
|
|
78
|
+
this.sessions.delete(id);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Enforce max sessions limit
|
|
82
|
+
if (this.sessions.size > this.config.maxSessions) {
|
|
83
|
+
const sortedSessions = Array.from(this.sessions.entries())
|
|
84
|
+
.filter(([id]) => id !== this.activeSessionId)
|
|
85
|
+
.sort((a, b) => a[1].startedAt - b[1].startedAt);
|
|
86
|
+
const toDelete = sortedSessions.slice(0, this.sessions.size - this.config.maxSessions);
|
|
87
|
+
for (const [id] of toDelete) {
|
|
88
|
+
this.sessions.delete(id);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
this.notifyListeners();
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Create a new session
|
|
95
|
+
*/
|
|
96
|
+
createSession(options) {
|
|
97
|
+
const id = options.id || this.generateId();
|
|
98
|
+
// Check if session already exists
|
|
99
|
+
if (this.sessions.has(id)) {
|
|
100
|
+
throw new Error(`Session with ID "${id}" already exists`);
|
|
101
|
+
}
|
|
102
|
+
const session = {
|
|
103
|
+
id,
|
|
104
|
+
name: options.name,
|
|
105
|
+
startedAt: Date.now(),
|
|
106
|
+
status: 'recording',
|
|
107
|
+
events: [],
|
|
108
|
+
metadata: options.metadata || {},
|
|
109
|
+
};
|
|
110
|
+
this.sessions.set(id, session);
|
|
111
|
+
this.activeSessionId = id;
|
|
112
|
+
this.notifyListeners();
|
|
113
|
+
return session;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get session by ID
|
|
117
|
+
*/
|
|
118
|
+
getSession(id) {
|
|
119
|
+
return this.sessions.get(id);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get the currently active (recording) session
|
|
123
|
+
*/
|
|
124
|
+
getActiveSession() {
|
|
125
|
+
if (!this.activeSessionId)
|
|
126
|
+
return undefined;
|
|
127
|
+
return this.sessions.get(this.activeSessionId);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* List all sessions, sorted by start time (newest first)
|
|
131
|
+
*/
|
|
132
|
+
listSessions() {
|
|
133
|
+
return Array.from(this.sessions.values())
|
|
134
|
+
.sort((a, b) => b.startedAt - a.startedAt);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Add an event to a session
|
|
138
|
+
*/
|
|
139
|
+
addEvent(sessionId, event) {
|
|
140
|
+
const session = this.sessions.get(sessionId);
|
|
141
|
+
if (!session) {
|
|
142
|
+
throw new Error(`Session "${sessionId}" not found`);
|
|
143
|
+
}
|
|
144
|
+
if (session.status !== 'recording') {
|
|
145
|
+
throw new Error(`Session "${sessionId}" is not recording (status: ${session.status})`);
|
|
146
|
+
}
|
|
147
|
+
// Check max events limit
|
|
148
|
+
if (session.events.length >= this.config.maxEventsPerSession) {
|
|
149
|
+
console.warn(`Session "${sessionId}" reached max events limit (${this.config.maxEventsPerSession})`);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
session.events.push(event);
|
|
153
|
+
this.notifyListeners();
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Add an event to the active session (convenience method)
|
|
157
|
+
*/
|
|
158
|
+
addEventToActive(event) {
|
|
159
|
+
if (!this.activeSessionId) {
|
|
160
|
+
throw new Error('No active session');
|
|
161
|
+
}
|
|
162
|
+
this.addEvent(this.activeSessionId, event);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* End a session
|
|
166
|
+
*/
|
|
167
|
+
endSession(sessionId, options = {}) {
|
|
168
|
+
const session = this.sessions.get(sessionId);
|
|
169
|
+
if (!session) {
|
|
170
|
+
throw new Error(`Session "${sessionId}" not found`);
|
|
171
|
+
}
|
|
172
|
+
if (session.status !== 'recording') {
|
|
173
|
+
throw new Error(`Session "${sessionId}" is not recording (status: ${session.status})`);
|
|
174
|
+
}
|
|
175
|
+
session.endedAt = Date.now();
|
|
176
|
+
session.status = 'completed';
|
|
177
|
+
session.metadata.result = options.result;
|
|
178
|
+
session.metadata.error = options.error;
|
|
179
|
+
session.metadata.duration = session.endedAt - session.startedAt;
|
|
180
|
+
// Clear active session if this was it
|
|
181
|
+
if (this.activeSessionId === sessionId) {
|
|
182
|
+
this.activeSessionId = null;
|
|
183
|
+
}
|
|
184
|
+
this.notifyListeners();
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* End the active session (convenience method)
|
|
188
|
+
*/
|
|
189
|
+
endActiveSession(options = {}) {
|
|
190
|
+
if (!this.activeSessionId) {
|
|
191
|
+
throw new Error('No active session');
|
|
192
|
+
}
|
|
193
|
+
this.endSession(this.activeSessionId, options);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Mark a session as errored
|
|
197
|
+
*/
|
|
198
|
+
errorSession(sessionId, error) {
|
|
199
|
+
const session = this.sessions.get(sessionId);
|
|
200
|
+
if (!session) {
|
|
201
|
+
throw new Error(`Session "${sessionId}" not found`);
|
|
202
|
+
}
|
|
203
|
+
session.endedAt = Date.now();
|
|
204
|
+
session.status = 'error';
|
|
205
|
+
session.metadata.error = error;
|
|
206
|
+
session.metadata.duration = session.endedAt - session.startedAt;
|
|
207
|
+
if (this.activeSessionId === sessionId) {
|
|
208
|
+
this.activeSessionId = null;
|
|
209
|
+
}
|
|
210
|
+
this.notifyListeners();
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Delete a session
|
|
214
|
+
*/
|
|
215
|
+
deleteSession(id) {
|
|
216
|
+
if (this.activeSessionId === id) {
|
|
217
|
+
this.activeSessionId = null;
|
|
218
|
+
}
|
|
219
|
+
const deleted = this.sessions.delete(id);
|
|
220
|
+
if (deleted) {
|
|
221
|
+
this.notifyListeners();
|
|
222
|
+
}
|
|
223
|
+
return deleted;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Clear all sessions
|
|
227
|
+
*/
|
|
228
|
+
clearSessions() {
|
|
229
|
+
this.sessions.clear();
|
|
230
|
+
this.activeSessionId = null;
|
|
231
|
+
this.notifyListeners();
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Export a session to JSON string
|
|
235
|
+
*/
|
|
236
|
+
exportSession(id) {
|
|
237
|
+
const session = this.sessions.get(id);
|
|
238
|
+
if (!session) {
|
|
239
|
+
throw new Error(`Session "${id}" not found`);
|
|
240
|
+
}
|
|
241
|
+
return JSON.stringify(session, null, 2);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Import a session from JSON string
|
|
245
|
+
*/
|
|
246
|
+
importSession(json) {
|
|
247
|
+
const session = JSON.parse(json);
|
|
248
|
+
// Validate required fields
|
|
249
|
+
if (!session.id || !session.name || !session.events) {
|
|
250
|
+
throw new Error('Invalid session format: missing required fields');
|
|
251
|
+
}
|
|
252
|
+
// Generate new ID if session with same ID exists
|
|
253
|
+
if (this.sessions.has(session.id)) {
|
|
254
|
+
session.id = this.generateId();
|
|
255
|
+
}
|
|
256
|
+
// Mark as completed (imported sessions can't be recorded to)
|
|
257
|
+
session.status = 'completed';
|
|
258
|
+
this.sessions.set(session.id, session);
|
|
259
|
+
this.notifyListeners();
|
|
260
|
+
return session;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Subscribe to session changes
|
|
264
|
+
* Returns unsubscribe function
|
|
265
|
+
*/
|
|
266
|
+
onSessionChange(callback) {
|
|
267
|
+
this.listeners.add(callback);
|
|
268
|
+
// Immediately call with current sessions
|
|
269
|
+
callback(this.listSessions());
|
|
270
|
+
return () => {
|
|
271
|
+
this.listeners.delete(callback);
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get session statistics
|
|
276
|
+
*/
|
|
277
|
+
getStats() {
|
|
278
|
+
const sessions = this.listSessions();
|
|
279
|
+
const activeSessions = sessions.filter(s => s.status === 'recording').length;
|
|
280
|
+
const totalEvents = sessions.reduce((sum, s) => sum + s.events.length, 0);
|
|
281
|
+
return {
|
|
282
|
+
totalSessions: sessions.length,
|
|
283
|
+
activeSessions,
|
|
284
|
+
totalEvents,
|
|
285
|
+
oldestSession: sessions.length > 0 ? sessions[sessions.length - 1].startedAt : null,
|
|
286
|
+
newestSession: sessions.length > 0 ? sessions[0].startedAt : null,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Dispose of the session manager
|
|
291
|
+
*/
|
|
292
|
+
dispose() {
|
|
293
|
+
this.stopAutoCleanup();
|
|
294
|
+
this.listeners.clear();
|
|
295
|
+
this.sessions.clear();
|
|
296
|
+
this.activeSessionId = null;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=SessionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../src/SessionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { GraphEvent, GraphState, ValidationResult, ValidationRules, Violation } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* ValidationEngine checks events against defined rules
|
|
4
|
+
*/
|
|
5
|
+
export declare class ValidationEngine {
|
|
6
|
+
private rules;
|
|
7
|
+
private violationCount;
|
|
8
|
+
private warningCount;
|
|
9
|
+
constructor(rules: ValidationRules);
|
|
10
|
+
/**
|
|
11
|
+
* Validate an event against all rules
|
|
12
|
+
*/
|
|
13
|
+
validate(event: GraphEvent, state: GraphState): ValidationResult;
|
|
14
|
+
/**
|
|
15
|
+
* Check constraints across the entire graph state
|
|
16
|
+
*/
|
|
17
|
+
checkConstraints(state: GraphState): Violation[];
|
|
18
|
+
/**
|
|
19
|
+
* Validate connection rules
|
|
20
|
+
*/
|
|
21
|
+
private validateConnection;
|
|
22
|
+
/**
|
|
23
|
+
* Validate state transitions
|
|
24
|
+
*/
|
|
25
|
+
private validateStateTransition;
|
|
26
|
+
/**
|
|
27
|
+
* Create violation for unexpected event
|
|
28
|
+
*/
|
|
29
|
+
private createUnexpectedEventViolation;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=ValidationEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidationEngine.d.ts","sourceRoot":"","sources":["../src/ValidationEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,SAAS,EAEV,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,YAAY,CAAK;gBAEb,KAAK,EAAE,eAAe;IAIlC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,gBAAgB;IAsChE;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE;IA+BhD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6C1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAoC/B;;OAEG;IACH,OAAO,CAAC,8BAA8B;CASvC"}
|