agentdb 1.0.1 → 1.0.3
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/CHANGELOG.md +36 -0
- package/bin/agentdb.js +6 -0
- package/dist/mcp/learning/core/experience-buffer.d.ts +61 -0
- package/dist/mcp/learning/core/experience-buffer.d.ts.map +1 -0
- package/dist/mcp/learning/core/experience-buffer.js +175 -0
- package/dist/mcp/learning/core/experience-buffer.js.map +1 -0
- package/dist/mcp/learning/core/experience-buffer.mjs +170 -0
- package/dist/mcp/learning/core/experience-recorder.d.ts +40 -0
- package/dist/mcp/learning/core/experience-recorder.d.ts.map +1 -0
- package/dist/mcp/learning/core/experience-recorder.js +200 -0
- package/dist/mcp/learning/core/experience-recorder.js.map +1 -0
- package/dist/mcp/learning/core/experience-recorder.mjs +195 -0
- package/dist/mcp/learning/core/learning-manager.d.ts +66 -0
- package/dist/mcp/learning/core/learning-manager.d.ts.map +1 -0
- package/dist/mcp/learning/core/learning-manager.js +252 -0
- package/dist/mcp/learning/core/learning-manager.js.map +1 -0
- package/dist/mcp/learning/core/learning-manager.mjs +247 -0
- package/dist/mcp/learning/core/policy-optimizer.d.ts +53 -0
- package/dist/mcp/learning/core/policy-optimizer.d.ts.map +1 -0
- package/dist/mcp/learning/core/policy-optimizer.js +251 -0
- package/dist/mcp/learning/core/policy-optimizer.js.map +1 -0
- package/dist/mcp/learning/core/policy-optimizer.mjs +246 -0
- package/dist/mcp/learning/core/reward-estimator.d.ts +44 -0
- package/dist/mcp/learning/core/reward-estimator.d.ts.map +1 -0
- package/dist/mcp/learning/core/reward-estimator.js +158 -0
- package/dist/mcp/learning/core/reward-estimator.js.map +1 -0
- package/dist/mcp/learning/core/reward-estimator.mjs +153 -0
- package/dist/mcp/learning/core/session-manager.d.ts +63 -0
- package/dist/mcp/learning/core/session-manager.d.ts.map +1 -0
- package/dist/mcp/learning/core/session-manager.js +202 -0
- package/dist/mcp/learning/core/session-manager.js.map +1 -0
- package/dist/mcp/learning/core/session-manager.mjs +197 -0
- package/dist/mcp/learning/index.d.ts +19 -0
- package/dist/mcp/learning/index.d.ts.map +1 -0
- package/dist/mcp/learning/index.js +30 -0
- package/dist/mcp/learning/index.js.map +1 -0
- package/dist/mcp/learning/index.mjs +19 -0
- package/dist/mcp/learning/tools/mcp-learning-tools.d.ts +369 -0
- package/dist/mcp/learning/tools/mcp-learning-tools.d.ts.map +1 -0
- package/dist/mcp/learning/tools/mcp-learning-tools.js +361 -0
- package/dist/mcp/learning/tools/mcp-learning-tools.js.map +1 -0
- package/dist/mcp/learning/tools/mcp-learning-tools.mjs +356 -0
- package/dist/mcp/learning/types/index.d.ts +138 -0
- package/dist/mcp/learning/types/index.d.ts.map +1 -0
- package/dist/mcp/learning/types/index.js +6 -0
- package/dist/mcp/learning/types/index.js.map +1 -0
- package/dist/mcp/learning/types/index.mjs +4 -0
- package/dist/mcp-server.d.ts +2 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +72 -4
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-server.mjs +72 -4
- package/examples/mcp-learning-example.ts +220 -0
- package/package.json +1 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RewardEstimator - Calculates multi-dimensional rewards for actions
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RewardEstimator = void 0;
|
|
7
|
+
class RewardEstimator {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.weights = {
|
|
10
|
+
success: 0.4,
|
|
11
|
+
efficiency: 0.3,
|
|
12
|
+
quality: 0.2,
|
|
13
|
+
cost: 0.1,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Calculate comprehensive reward signal
|
|
18
|
+
*/
|
|
19
|
+
async calculateReward(outcome, context) {
|
|
20
|
+
const dimensions = {
|
|
21
|
+
success: this.calculateSuccessReward(outcome),
|
|
22
|
+
efficiency: this.calculateEfficiencyReward(outcome),
|
|
23
|
+
quality: this.calculateQualityReward(outcome),
|
|
24
|
+
cost: this.calculateCostReward(outcome),
|
|
25
|
+
};
|
|
26
|
+
const automatic = dimensions.success * this.weights.success +
|
|
27
|
+
dimensions.efficiency * this.weights.efficiency +
|
|
28
|
+
dimensions.quality * this.weights.quality +
|
|
29
|
+
dimensions.cost * this.weights.cost;
|
|
30
|
+
const objective = this.calculateObjectiveReward(outcome, context);
|
|
31
|
+
return {
|
|
32
|
+
automatic,
|
|
33
|
+
userFeedback: undefined,
|
|
34
|
+
objective,
|
|
35
|
+
combined: automatic * 0.7 + objective * 0.3,
|
|
36
|
+
dimensions,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Calculate reward with user feedback
|
|
41
|
+
*/
|
|
42
|
+
async calculateRewardWithFeedback(outcome, context, userRating) {
|
|
43
|
+
const baseReward = await this.calculateReward(outcome, context);
|
|
44
|
+
// Incorporate user feedback (0-1 scale)
|
|
45
|
+
const combined = baseReward.automatic * 0.5 +
|
|
46
|
+
baseReward.objective * 0.2 +
|
|
47
|
+
userRating * 0.3;
|
|
48
|
+
return {
|
|
49
|
+
...baseReward,
|
|
50
|
+
userFeedback: userRating,
|
|
51
|
+
combined,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Success dimension: binary success/failure
|
|
56
|
+
*/
|
|
57
|
+
calculateSuccessReward(outcome) {
|
|
58
|
+
return outcome.success ? 1.0 : 0.0;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Efficiency dimension: execution time
|
|
62
|
+
*/
|
|
63
|
+
calculateEfficiencyReward(outcome) {
|
|
64
|
+
// Reward faster execution (exponential decay)
|
|
65
|
+
// Assumes 5 seconds is "good", longer is worse
|
|
66
|
+
const targetTime = 5000; // 5 seconds in ms
|
|
67
|
+
const timePenalty = Math.exp(-outcome.executionTime / targetTime);
|
|
68
|
+
return outcome.success ? timePenalty : timePenalty * 0.5;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Quality dimension: based on error presence and result completeness
|
|
72
|
+
*/
|
|
73
|
+
calculateQualityReward(outcome) {
|
|
74
|
+
if (outcome.error) {
|
|
75
|
+
return 0.0;
|
|
76
|
+
}
|
|
77
|
+
// Check result completeness (simple heuristic)
|
|
78
|
+
const hasResult = outcome.result !== null && outcome.result !== undefined;
|
|
79
|
+
const isComplete = hasResult &&
|
|
80
|
+
(typeof outcome.result !== 'object' ||
|
|
81
|
+
Object.keys(outcome.result).length > 0);
|
|
82
|
+
if (isComplete) {
|
|
83
|
+
return 1.0;
|
|
84
|
+
}
|
|
85
|
+
else if (hasResult) {
|
|
86
|
+
return 0.5;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
return 0.0;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Cost dimension: token usage efficiency
|
|
94
|
+
*/
|
|
95
|
+
calculateCostReward(outcome) {
|
|
96
|
+
if (!outcome.tokensUsed) {
|
|
97
|
+
return 0.5; // neutral if no token data
|
|
98
|
+
}
|
|
99
|
+
// Reward lower token usage (with diminishing returns)
|
|
100
|
+
// Assumes 500 tokens is "good", more is worse
|
|
101
|
+
const targetTokens = 500;
|
|
102
|
+
const tokenEfficiency = Math.exp(-outcome.tokensUsed / targetTokens);
|
|
103
|
+
return tokenEfficiency;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Objective metrics reward
|
|
107
|
+
*/
|
|
108
|
+
calculateObjectiveReward(outcome, context) {
|
|
109
|
+
// Task-specific objective metrics
|
|
110
|
+
const metrics = [];
|
|
111
|
+
// Success is most important
|
|
112
|
+
metrics.push(outcome.success ? 1.0 : 0.0);
|
|
113
|
+
// Speed matters for all tasks
|
|
114
|
+
if (outcome.executionTime < 1000) {
|
|
115
|
+
metrics.push(1.0);
|
|
116
|
+
}
|
|
117
|
+
else if (outcome.executionTime < 5000) {
|
|
118
|
+
metrics.push(0.7);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
metrics.push(0.3);
|
|
122
|
+
}
|
|
123
|
+
// Coding tasks: prefer efficient solutions
|
|
124
|
+
if (context.taskType === 'coding') {
|
|
125
|
+
const efficiency = outcome.tokensUsed
|
|
126
|
+
? Math.min(1.0, 1000 / outcome.tokensUsed)
|
|
127
|
+
: 0.5;
|
|
128
|
+
metrics.push(efficiency);
|
|
129
|
+
}
|
|
130
|
+
// Research tasks: prefer comprehensive results
|
|
131
|
+
if (context.taskType === 'research') {
|
|
132
|
+
const completeness = outcome.metadata?.resultCount
|
|
133
|
+
? Math.min(1.0, outcome.metadata.resultCount / 10)
|
|
134
|
+
: 0.5;
|
|
135
|
+
metrics.push(completeness);
|
|
136
|
+
}
|
|
137
|
+
return metrics.reduce((sum, val) => sum + val, 0) / metrics.length;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Update reward weights based on user preferences
|
|
141
|
+
*/
|
|
142
|
+
setRewardWeights(weights) {
|
|
143
|
+
this.weights = { ...this.weights, ...weights };
|
|
144
|
+
// Normalize weights to sum to 1
|
|
145
|
+
const total = Object.values(this.weights).reduce((sum, val) => sum + val, 0);
|
|
146
|
+
Object.keys(this.weights).forEach((key) => {
|
|
147
|
+
this.weights[key] /= total;
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get current reward weights
|
|
152
|
+
*/
|
|
153
|
+
getRewardWeights() {
|
|
154
|
+
return { ...this.weights };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.RewardEstimator = RewardEstimator;
|
|
158
|
+
//# sourceMappingURL=reward-estimator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reward-estimator.js","sourceRoot":"","sources":["../../../../src/mcp/learning/core/reward-estimator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RewardEstimator - Calculates multi-dimensional rewards for actions
|
|
3
|
+
*/
|
|
4
|
+
export class RewardEstimator {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.weights = {
|
|
7
|
+
success: 0.4,
|
|
8
|
+
efficiency: 0.3,
|
|
9
|
+
quality: 0.2,
|
|
10
|
+
cost: 0.1,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Calculate comprehensive reward signal
|
|
15
|
+
*/
|
|
16
|
+
async calculateReward(outcome, context) {
|
|
17
|
+
const dimensions = {
|
|
18
|
+
success: this.calculateSuccessReward(outcome),
|
|
19
|
+
efficiency: this.calculateEfficiencyReward(outcome),
|
|
20
|
+
quality: this.calculateQualityReward(outcome),
|
|
21
|
+
cost: this.calculateCostReward(outcome),
|
|
22
|
+
};
|
|
23
|
+
const automatic = dimensions.success * this.weights.success +
|
|
24
|
+
dimensions.efficiency * this.weights.efficiency +
|
|
25
|
+
dimensions.quality * this.weights.quality +
|
|
26
|
+
dimensions.cost * this.weights.cost;
|
|
27
|
+
const objective = this.calculateObjectiveReward(outcome, context);
|
|
28
|
+
return {
|
|
29
|
+
automatic,
|
|
30
|
+
userFeedback: undefined,
|
|
31
|
+
objective,
|
|
32
|
+
combined: automatic * 0.7 + objective * 0.3,
|
|
33
|
+
dimensions,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Calculate reward with user feedback
|
|
38
|
+
*/
|
|
39
|
+
async calculateRewardWithFeedback(outcome, context, userRating) {
|
|
40
|
+
const baseReward = await this.calculateReward(outcome, context);
|
|
41
|
+
// Incorporate user feedback (0-1 scale)
|
|
42
|
+
const combined = baseReward.automatic * 0.5 +
|
|
43
|
+
baseReward.objective * 0.2 +
|
|
44
|
+
userRating * 0.3;
|
|
45
|
+
return {
|
|
46
|
+
...baseReward,
|
|
47
|
+
userFeedback: userRating,
|
|
48
|
+
combined,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Success dimension: binary success/failure
|
|
53
|
+
*/
|
|
54
|
+
calculateSuccessReward(outcome) {
|
|
55
|
+
return outcome.success ? 1.0 : 0.0;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Efficiency dimension: execution time
|
|
59
|
+
*/
|
|
60
|
+
calculateEfficiencyReward(outcome) {
|
|
61
|
+
// Reward faster execution (exponential decay)
|
|
62
|
+
// Assumes 5 seconds is "good", longer is worse
|
|
63
|
+
const targetTime = 5000; // 5 seconds in ms
|
|
64
|
+
const timePenalty = Math.exp(-outcome.executionTime / targetTime);
|
|
65
|
+
return outcome.success ? timePenalty : timePenalty * 0.5;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Quality dimension: based on error presence and result completeness
|
|
69
|
+
*/
|
|
70
|
+
calculateQualityReward(outcome) {
|
|
71
|
+
if (outcome.error) {
|
|
72
|
+
return 0.0;
|
|
73
|
+
}
|
|
74
|
+
// Check result completeness (simple heuristic)
|
|
75
|
+
const hasResult = outcome.result !== null && outcome.result !== undefined;
|
|
76
|
+
const isComplete = hasResult &&
|
|
77
|
+
(typeof outcome.result !== 'object' ||
|
|
78
|
+
Object.keys(outcome.result).length > 0);
|
|
79
|
+
if (isComplete) {
|
|
80
|
+
return 1.0;
|
|
81
|
+
}
|
|
82
|
+
else if (hasResult) {
|
|
83
|
+
return 0.5;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
return 0.0;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Cost dimension: token usage efficiency
|
|
91
|
+
*/
|
|
92
|
+
calculateCostReward(outcome) {
|
|
93
|
+
if (!outcome.tokensUsed) {
|
|
94
|
+
return 0.5; // neutral if no token data
|
|
95
|
+
}
|
|
96
|
+
// Reward lower token usage (with diminishing returns)
|
|
97
|
+
// Assumes 500 tokens is "good", more is worse
|
|
98
|
+
const targetTokens = 500;
|
|
99
|
+
const tokenEfficiency = Math.exp(-outcome.tokensUsed / targetTokens);
|
|
100
|
+
return tokenEfficiency;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Objective metrics reward
|
|
104
|
+
*/
|
|
105
|
+
calculateObjectiveReward(outcome, context) {
|
|
106
|
+
// Task-specific objective metrics
|
|
107
|
+
const metrics = [];
|
|
108
|
+
// Success is most important
|
|
109
|
+
metrics.push(outcome.success ? 1.0 : 0.0);
|
|
110
|
+
// Speed matters for all tasks
|
|
111
|
+
if (outcome.executionTime < 1000) {
|
|
112
|
+
metrics.push(1.0);
|
|
113
|
+
}
|
|
114
|
+
else if (outcome.executionTime < 5000) {
|
|
115
|
+
metrics.push(0.7);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
metrics.push(0.3);
|
|
119
|
+
}
|
|
120
|
+
// Coding tasks: prefer efficient solutions
|
|
121
|
+
if (context.taskType === 'coding') {
|
|
122
|
+
const efficiency = outcome.tokensUsed
|
|
123
|
+
? Math.min(1.0, 1000 / outcome.tokensUsed)
|
|
124
|
+
: 0.5;
|
|
125
|
+
metrics.push(efficiency);
|
|
126
|
+
}
|
|
127
|
+
// Research tasks: prefer comprehensive results
|
|
128
|
+
if (context.taskType === 'research') {
|
|
129
|
+
const completeness = outcome.metadata?.resultCount
|
|
130
|
+
? Math.min(1.0, outcome.metadata.resultCount / 10)
|
|
131
|
+
: 0.5;
|
|
132
|
+
metrics.push(completeness);
|
|
133
|
+
}
|
|
134
|
+
return metrics.reduce((sum, val) => sum + val, 0) / metrics.length;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Update reward weights based on user preferences
|
|
138
|
+
*/
|
|
139
|
+
setRewardWeights(weights) {
|
|
140
|
+
this.weights = { ...this.weights, ...weights };
|
|
141
|
+
// Normalize weights to sum to 1
|
|
142
|
+
const total = Object.values(this.weights).reduce((sum, val) => sum + val, 0);
|
|
143
|
+
Object.keys(this.weights).forEach((key) => {
|
|
144
|
+
this.weights[key] /= total;
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get current reward weights
|
|
149
|
+
*/
|
|
150
|
+
getRewardWeights() {
|
|
151
|
+
return { ...this.weights };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionManager - Manages learning session lifecycle and state
|
|
3
|
+
*/
|
|
4
|
+
import type { SQLiteVectorDB } from '../../../core/vector-db.js';
|
|
5
|
+
import type { LearningSession } from '../types/index.js';
|
|
6
|
+
export declare class SessionManager {
|
|
7
|
+
private db;
|
|
8
|
+
private activeSessions;
|
|
9
|
+
constructor(db: SQLiteVectorDB);
|
|
10
|
+
/**
|
|
11
|
+
* Create a new learning session
|
|
12
|
+
*/
|
|
13
|
+
createSession(userId: string, sessionType: 'coding' | 'research' | 'debugging' | 'general', plugin: string, config?: Record<string, any>): Promise<LearningSession>;
|
|
14
|
+
/**
|
|
15
|
+
* Get active session by ID
|
|
16
|
+
*/
|
|
17
|
+
getSession(sessionId: string): LearningSession | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Get all active sessions for a user
|
|
20
|
+
*/
|
|
21
|
+
getUserSessions(userId: string): LearningSession[];
|
|
22
|
+
/**
|
|
23
|
+
* Pause a learning session
|
|
24
|
+
*/
|
|
25
|
+
pauseSession(sessionId: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Resume a paused session
|
|
28
|
+
*/
|
|
29
|
+
resumeSession(sessionId: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* End a learning session
|
|
32
|
+
*/
|
|
33
|
+
endSession(sessionId: string): Promise<LearningSession>;
|
|
34
|
+
/**
|
|
35
|
+
* Update session experience count
|
|
36
|
+
*/
|
|
37
|
+
incrementExperienceCount(sessionId: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Update session policy
|
|
40
|
+
*/
|
|
41
|
+
updateSessionPolicy(sessionId: string, policy: any): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Get session metrics
|
|
44
|
+
*/
|
|
45
|
+
getSessionMetrics(sessionId: string): {
|
|
46
|
+
duration: number;
|
|
47
|
+
experienceCount: number;
|
|
48
|
+
status: string;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Persist session to vector database
|
|
52
|
+
*/
|
|
53
|
+
private persistSession;
|
|
54
|
+
/**
|
|
55
|
+
* Restore sessions from database
|
|
56
|
+
*/
|
|
57
|
+
restoreSessions(userId?: string): Promise<LearningSession[]>;
|
|
58
|
+
/**
|
|
59
|
+
* Cleanup old sessions
|
|
60
|
+
*/
|
|
61
|
+
cleanupOldSessions(maxAge?: number): Promise<number>;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../../../src/mcp/learning/core/session-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,mBAAmB,CAAC;AAE3E,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,cAAc,CAA2C;gBAErD,EAAE,EAAE,cAAc;IAI9B;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,EAC5D,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAC/B,OAAO,CAAC,eAAe,CAAC;IAoB3B;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI1D;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE;IAMlD;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpD;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcrD;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAc7D;;OAEG;IACH,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOjD;;OAEG;IACG,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxE;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG;QACpC,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC;KAChB;IAgBD;;OAEG;YACW,cAAc;IA0C5B;;OAEG;IACG,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA8BlE;;OAEG;IACG,kBAAkB,CAAC,MAAM,GAAE,MAAgC,GAAG,OAAO,CAAC,MAAM,CAAC;CAcpF"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SessionManager - Manages learning session lifecycle and state
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SessionManager = void 0;
|
|
7
|
+
class SessionManager {
|
|
8
|
+
constructor(db) {
|
|
9
|
+
this.activeSessions = new Map();
|
|
10
|
+
this.db = db;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Create a new learning session
|
|
14
|
+
*/
|
|
15
|
+
async createSession(userId, sessionType, plugin, config = {}) {
|
|
16
|
+
const sessionId = `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
17
|
+
const session = {
|
|
18
|
+
sessionId,
|
|
19
|
+
userId,
|
|
20
|
+
sessionType,
|
|
21
|
+
plugin,
|
|
22
|
+
status: 'active',
|
|
23
|
+
startTime: Date.now(),
|
|
24
|
+
experienceCount: 0,
|
|
25
|
+
config,
|
|
26
|
+
};
|
|
27
|
+
this.activeSessions.set(sessionId, session);
|
|
28
|
+
await this.persistSession(session);
|
|
29
|
+
return session;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get active session by ID
|
|
33
|
+
*/
|
|
34
|
+
getSession(sessionId) {
|
|
35
|
+
return this.activeSessions.get(sessionId);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get all active sessions for a user
|
|
39
|
+
*/
|
|
40
|
+
getUserSessions(userId) {
|
|
41
|
+
return Array.from(this.activeSessions.values()).filter((session) => session.userId === userId && session.status === 'active');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Pause a learning session
|
|
45
|
+
*/
|
|
46
|
+
async pauseSession(sessionId) {
|
|
47
|
+
const session = this.activeSessions.get(sessionId);
|
|
48
|
+
if (!session) {
|
|
49
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
50
|
+
}
|
|
51
|
+
session.status = 'paused';
|
|
52
|
+
await this.persistSession(session);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Resume a paused session
|
|
56
|
+
*/
|
|
57
|
+
async resumeSession(sessionId) {
|
|
58
|
+
const session = this.activeSessions.get(sessionId);
|
|
59
|
+
if (!session) {
|
|
60
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
61
|
+
}
|
|
62
|
+
if (session.status !== 'paused') {
|
|
63
|
+
throw new Error(`Session ${sessionId} is not paused`);
|
|
64
|
+
}
|
|
65
|
+
session.status = 'active';
|
|
66
|
+
await this.persistSession(session);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* End a learning session
|
|
70
|
+
*/
|
|
71
|
+
async endSession(sessionId) {
|
|
72
|
+
const session = this.activeSessions.get(sessionId);
|
|
73
|
+
if (!session) {
|
|
74
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
75
|
+
}
|
|
76
|
+
session.status = 'ended';
|
|
77
|
+
session.endTime = Date.now();
|
|
78
|
+
await this.persistSession(session);
|
|
79
|
+
this.activeSessions.delete(sessionId);
|
|
80
|
+
return session;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Update session experience count
|
|
84
|
+
*/
|
|
85
|
+
incrementExperienceCount(sessionId) {
|
|
86
|
+
const session = this.activeSessions.get(sessionId);
|
|
87
|
+
if (session) {
|
|
88
|
+
session.experienceCount++;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Update session policy
|
|
93
|
+
*/
|
|
94
|
+
async updateSessionPolicy(sessionId, policy) {
|
|
95
|
+
const session = this.activeSessions.get(sessionId);
|
|
96
|
+
if (!session) {
|
|
97
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
98
|
+
}
|
|
99
|
+
session.currentPolicy = policy;
|
|
100
|
+
await this.persistSession(session);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get session metrics
|
|
104
|
+
*/
|
|
105
|
+
getSessionMetrics(sessionId) {
|
|
106
|
+
const session = this.activeSessions.get(sessionId);
|
|
107
|
+
if (!session) {
|
|
108
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
109
|
+
}
|
|
110
|
+
const endTime = session.endTime || Date.now();
|
|
111
|
+
const duration = endTime - session.startTime;
|
|
112
|
+
return {
|
|
113
|
+
duration,
|
|
114
|
+
experienceCount: session.experienceCount,
|
|
115
|
+
status: session.status,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Persist session to vector database
|
|
120
|
+
*/
|
|
121
|
+
async persistSession(session) {
|
|
122
|
+
// Create a simple embedding for session metadata
|
|
123
|
+
const sessionText = JSON.stringify({
|
|
124
|
+
userId: session.userId,
|
|
125
|
+
sessionType: session.sessionType,
|
|
126
|
+
plugin: session.plugin,
|
|
127
|
+
});
|
|
128
|
+
const embedding = new Float32Array(768);
|
|
129
|
+
for (let i = 0; i < sessionText.length; i++) {
|
|
130
|
+
const index = sessionText.charCodeAt(i) % 768;
|
|
131
|
+
embedding[index] += 1;
|
|
132
|
+
}
|
|
133
|
+
// Normalize
|
|
134
|
+
const magnitude = Math.sqrt(embedding.reduce((sum, val) => sum + val * val, 0));
|
|
135
|
+
if (magnitude > 0) {
|
|
136
|
+
for (let i = 0; i < embedding.length; i++) {
|
|
137
|
+
embedding[i] /= magnitude;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
await this.db.insert({
|
|
141
|
+
embedding: Array.from(embedding),
|
|
142
|
+
metadata: {
|
|
143
|
+
type: 'learning_session',
|
|
144
|
+
sessionId: session.sessionId,
|
|
145
|
+
userId: session.userId,
|
|
146
|
+
sessionType: session.sessionType,
|
|
147
|
+
plugin: session.plugin,
|
|
148
|
+
status: session.status,
|
|
149
|
+
startTime: session.startTime,
|
|
150
|
+
endTime: session.endTime,
|
|
151
|
+
experienceCount: session.experienceCount,
|
|
152
|
+
config: session.config,
|
|
153
|
+
currentPolicy: session.currentPolicy,
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Restore sessions from database
|
|
159
|
+
*/
|
|
160
|
+
async restoreSessions(userId) {
|
|
161
|
+
const filter = { type: 'learning_session', status: 'active' };
|
|
162
|
+
if (userId) {
|
|
163
|
+
filter.userId = userId;
|
|
164
|
+
}
|
|
165
|
+
const results = await this.db.search(Array(768).fill(0), 1000);
|
|
166
|
+
const sessions = [];
|
|
167
|
+
for (const result of results) {
|
|
168
|
+
const session = {
|
|
169
|
+
sessionId: result.metadata.sessionId,
|
|
170
|
+
userId: result.metadata.userId,
|
|
171
|
+
sessionType: result.metadata.sessionType,
|
|
172
|
+
plugin: result.metadata.plugin,
|
|
173
|
+
status: result.metadata.status,
|
|
174
|
+
startTime: result.metadata.startTime,
|
|
175
|
+
endTime: result.metadata.endTime,
|
|
176
|
+
experienceCount: result.metadata.experienceCount,
|
|
177
|
+
config: result.metadata.config,
|
|
178
|
+
currentPolicy: result.metadata.currentPolicy,
|
|
179
|
+
};
|
|
180
|
+
this.activeSessions.set(session.sessionId, session);
|
|
181
|
+
sessions.push(session);
|
|
182
|
+
}
|
|
183
|
+
return sessions;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Cleanup old sessions
|
|
187
|
+
*/
|
|
188
|
+
async cleanupOldSessions(maxAge = 7 * 24 * 60 * 60 * 1000) {
|
|
189
|
+
const cutoff = Date.now() - maxAge;
|
|
190
|
+
let cleaned = 0;
|
|
191
|
+
for (const [sessionId, session] of this.activeSessions.entries()) {
|
|
192
|
+
const endTime = session.endTime || Date.now();
|
|
193
|
+
if (endTime < cutoff && session.status === 'ended') {
|
|
194
|
+
this.activeSessions.delete(sessionId);
|
|
195
|
+
cleaned++;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return cleaned;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
exports.SessionManager = SessionManager;
|
|
202
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../../src/mcp/learning/core/session-manager.ts"],"names":[],"mappings":"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"}
|