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.
Files changed (54) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/bin/agentdb.js +6 -0
  3. package/dist/mcp/learning/core/experience-buffer.d.ts +61 -0
  4. package/dist/mcp/learning/core/experience-buffer.d.ts.map +1 -0
  5. package/dist/mcp/learning/core/experience-buffer.js +175 -0
  6. package/dist/mcp/learning/core/experience-buffer.js.map +1 -0
  7. package/dist/mcp/learning/core/experience-buffer.mjs +170 -0
  8. package/dist/mcp/learning/core/experience-recorder.d.ts +40 -0
  9. package/dist/mcp/learning/core/experience-recorder.d.ts.map +1 -0
  10. package/dist/mcp/learning/core/experience-recorder.js +200 -0
  11. package/dist/mcp/learning/core/experience-recorder.js.map +1 -0
  12. package/dist/mcp/learning/core/experience-recorder.mjs +195 -0
  13. package/dist/mcp/learning/core/learning-manager.d.ts +66 -0
  14. package/dist/mcp/learning/core/learning-manager.d.ts.map +1 -0
  15. package/dist/mcp/learning/core/learning-manager.js +252 -0
  16. package/dist/mcp/learning/core/learning-manager.js.map +1 -0
  17. package/dist/mcp/learning/core/learning-manager.mjs +247 -0
  18. package/dist/mcp/learning/core/policy-optimizer.d.ts +53 -0
  19. package/dist/mcp/learning/core/policy-optimizer.d.ts.map +1 -0
  20. package/dist/mcp/learning/core/policy-optimizer.js +251 -0
  21. package/dist/mcp/learning/core/policy-optimizer.js.map +1 -0
  22. package/dist/mcp/learning/core/policy-optimizer.mjs +246 -0
  23. package/dist/mcp/learning/core/reward-estimator.d.ts +44 -0
  24. package/dist/mcp/learning/core/reward-estimator.d.ts.map +1 -0
  25. package/dist/mcp/learning/core/reward-estimator.js +158 -0
  26. package/dist/mcp/learning/core/reward-estimator.js.map +1 -0
  27. package/dist/mcp/learning/core/reward-estimator.mjs +153 -0
  28. package/dist/mcp/learning/core/session-manager.d.ts +63 -0
  29. package/dist/mcp/learning/core/session-manager.d.ts.map +1 -0
  30. package/dist/mcp/learning/core/session-manager.js +202 -0
  31. package/dist/mcp/learning/core/session-manager.js.map +1 -0
  32. package/dist/mcp/learning/core/session-manager.mjs +197 -0
  33. package/dist/mcp/learning/index.d.ts +19 -0
  34. package/dist/mcp/learning/index.d.ts.map +1 -0
  35. package/dist/mcp/learning/index.js +30 -0
  36. package/dist/mcp/learning/index.js.map +1 -0
  37. package/dist/mcp/learning/index.mjs +19 -0
  38. package/dist/mcp/learning/tools/mcp-learning-tools.d.ts +369 -0
  39. package/dist/mcp/learning/tools/mcp-learning-tools.d.ts.map +1 -0
  40. package/dist/mcp/learning/tools/mcp-learning-tools.js +361 -0
  41. package/dist/mcp/learning/tools/mcp-learning-tools.js.map +1 -0
  42. package/dist/mcp/learning/tools/mcp-learning-tools.mjs +356 -0
  43. package/dist/mcp/learning/types/index.d.ts +138 -0
  44. package/dist/mcp/learning/types/index.d.ts.map +1 -0
  45. package/dist/mcp/learning/types/index.js +6 -0
  46. package/dist/mcp/learning/types/index.js.map +1 -0
  47. package/dist/mcp/learning/types/index.mjs +4 -0
  48. package/dist/mcp-server.d.ts +2 -0
  49. package/dist/mcp-server.d.ts.map +1 -1
  50. package/dist/mcp-server.js +72 -4
  51. package/dist/mcp-server.js.map +1 -1
  52. package/dist/mcp-server.mjs +72 -4
  53. package/examples/mcp-learning-example.ts +220 -0
  54. 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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"}