agentdb 1.0.1 → 1.0.2
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 +30 -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,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ExperienceRecorder - Captures and stores learning experiences
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ExperienceRecorder = void 0;
|
|
7
|
+
const reward_estimator_js_1 = require("./reward-estimator.js");
|
|
8
|
+
class ExperienceRecorder {
|
|
9
|
+
constructor(db) {
|
|
10
|
+
this.actionCounter = 0;
|
|
11
|
+
this.db = db;
|
|
12
|
+
this.rewardEstimator = new reward_estimator_js_1.RewardEstimator();
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Record a tool execution as a learning experience
|
|
16
|
+
*/
|
|
17
|
+
async recordToolExecution(toolName, args, result, context, outcome) {
|
|
18
|
+
const state = await this.captureState(context);
|
|
19
|
+
const action = {
|
|
20
|
+
tool: toolName,
|
|
21
|
+
params: args,
|
|
22
|
+
timestamp: Date.now(),
|
|
23
|
+
};
|
|
24
|
+
const reward = await this.rewardEstimator.calculateReward(outcome, context);
|
|
25
|
+
const nextState = await this.captureState({
|
|
26
|
+
...context,
|
|
27
|
+
isTerminal: outcome.success || !!outcome.error,
|
|
28
|
+
});
|
|
29
|
+
const experience = {
|
|
30
|
+
state,
|
|
31
|
+
action,
|
|
32
|
+
reward: reward.combined,
|
|
33
|
+
nextState,
|
|
34
|
+
done: context.isTerminal,
|
|
35
|
+
timestamp: Date.now(),
|
|
36
|
+
metadata: {
|
|
37
|
+
userId: context.userId,
|
|
38
|
+
sessionId: context.sessionId,
|
|
39
|
+
taskType: context.taskType,
|
|
40
|
+
actionId: `action_${this.actionCounter++}`,
|
|
41
|
+
rewardBreakdown: reward,
|
|
42
|
+
outcome: {
|
|
43
|
+
success: outcome.success,
|
|
44
|
+
executionTime: outcome.executionTime,
|
|
45
|
+
tokensUsed: outcome.tokensUsed,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
// Store experience in vector database
|
|
50
|
+
await this.storeExperience(experience);
|
|
51
|
+
return experience;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Capture current state representation
|
|
55
|
+
*/
|
|
56
|
+
async captureState(context) {
|
|
57
|
+
const state = {
|
|
58
|
+
taskDescription: context.metadata?.taskDescription || '',
|
|
59
|
+
availableTools: context.metadata?.availableTools || [],
|
|
60
|
+
previousActions: context.metadata?.previousActions || [],
|
|
61
|
+
constraints: context.metadata?.constraints,
|
|
62
|
+
context: {
|
|
63
|
+
sessionId: context.sessionId,
|
|
64
|
+
taskType: context.taskType,
|
|
65
|
+
timestamp: context.timestamp,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
// Generate state embedding for similarity search
|
|
69
|
+
state.embedding = await this.generateStateEmbedding(state);
|
|
70
|
+
return state;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Generate vector embedding for state
|
|
74
|
+
*/
|
|
75
|
+
async generateStateEmbedding(state) {
|
|
76
|
+
// Simple hash-based embedding (in production, use a proper embedding model)
|
|
77
|
+
const text = JSON.stringify({
|
|
78
|
+
task: state.taskDescription,
|
|
79
|
+
tools: state.availableTools,
|
|
80
|
+
type: state.context?.taskType,
|
|
81
|
+
});
|
|
82
|
+
// Create a simple hash-based embedding (768 dimensions)
|
|
83
|
+
const embedding = new Float32Array(768);
|
|
84
|
+
for (let i = 0; i < text.length; i++) {
|
|
85
|
+
const index = text.charCodeAt(i) % 768;
|
|
86
|
+
embedding[index] += 1;
|
|
87
|
+
}
|
|
88
|
+
// Normalize
|
|
89
|
+
const magnitude = Math.sqrt(embedding.reduce((sum, val) => sum + val * val, 0));
|
|
90
|
+
if (magnitude > 0) {
|
|
91
|
+
for (let i = 0; i < embedding.length; i++) {
|
|
92
|
+
embedding[i] /= magnitude;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return embedding;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Store experience in vector database
|
|
99
|
+
*/
|
|
100
|
+
async storeExperience(experience) {
|
|
101
|
+
if (!experience.state.embedding) {
|
|
102
|
+
throw new Error('State embedding is required');
|
|
103
|
+
}
|
|
104
|
+
await this.db.insert({
|
|
105
|
+
embedding: Array.from(experience.state.embedding),
|
|
106
|
+
metadata: {
|
|
107
|
+
type: 'learning_experience',
|
|
108
|
+
sessionId: experience.metadata.sessionId,
|
|
109
|
+
userId: experience.metadata.userId,
|
|
110
|
+
taskType: experience.metadata.taskType,
|
|
111
|
+
actionId: experience.metadata.actionId,
|
|
112
|
+
action: experience.action,
|
|
113
|
+
reward: experience.reward,
|
|
114
|
+
done: experience.done,
|
|
115
|
+
timestamp: experience.timestamp,
|
|
116
|
+
state: {
|
|
117
|
+
taskDescription: experience.state.taskDescription,
|
|
118
|
+
availableTools: experience.state.availableTools,
|
|
119
|
+
previousActionsCount: experience.state.previousActions.length,
|
|
120
|
+
},
|
|
121
|
+
outcome: experience.metadata.outcome,
|
|
122
|
+
rewardBreakdown: experience.metadata.rewardBreakdown,
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Retrieve similar experiences
|
|
128
|
+
*/
|
|
129
|
+
async retrieveSimilarExperiences(state, k = 10) {
|
|
130
|
+
if (!state.embedding) {
|
|
131
|
+
state.embedding = await this.generateStateEmbedding(state);
|
|
132
|
+
}
|
|
133
|
+
const results = await this.db.search(Array.from(state.embedding), k);
|
|
134
|
+
return results.map((result) => ({
|
|
135
|
+
state: {
|
|
136
|
+
taskDescription: result.metadata.state.taskDescription,
|
|
137
|
+
availableTools: result.metadata.state.availableTools,
|
|
138
|
+
previousActions: [],
|
|
139
|
+
embedding: result.embedding,
|
|
140
|
+
},
|
|
141
|
+
action: result.metadata.action,
|
|
142
|
+
reward: result.metadata.reward,
|
|
143
|
+
nextState: {
|
|
144
|
+
taskDescription: '',
|
|
145
|
+
availableTools: [],
|
|
146
|
+
previousActions: [],
|
|
147
|
+
},
|
|
148
|
+
done: result.metadata.done,
|
|
149
|
+
timestamp: result.metadata.timestamp,
|
|
150
|
+
metadata: {
|
|
151
|
+
userId: result.metadata.userId,
|
|
152
|
+
sessionId: result.metadata.sessionId,
|
|
153
|
+
taskType: result.metadata.taskType,
|
|
154
|
+
actionId: result.metadata.actionId,
|
|
155
|
+
},
|
|
156
|
+
}));
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get experiences by session
|
|
160
|
+
*/
|
|
161
|
+
async getSessionExperiences(sessionId) {
|
|
162
|
+
// Query by metadata filter
|
|
163
|
+
const allResults = await this.db.search(Array(768).fill(0), 1000);
|
|
164
|
+
// Filter by session ID
|
|
165
|
+
const sessionResults = allResults.filter((result) => result.metadata.sessionId === sessionId);
|
|
166
|
+
return sessionResults.map((result) => ({
|
|
167
|
+
state: {
|
|
168
|
+
taskDescription: result.metadata.state.taskDescription,
|
|
169
|
+
availableTools: result.metadata.state.availableTools,
|
|
170
|
+
previousActions: [],
|
|
171
|
+
embedding: result.embedding,
|
|
172
|
+
},
|
|
173
|
+
action: result.metadata.action,
|
|
174
|
+
reward: result.metadata.reward,
|
|
175
|
+
nextState: {
|
|
176
|
+
taskDescription: '',
|
|
177
|
+
availableTools: [],
|
|
178
|
+
previousActions: [],
|
|
179
|
+
},
|
|
180
|
+
done: result.metadata.done,
|
|
181
|
+
timestamp: result.metadata.timestamp,
|
|
182
|
+
metadata: {
|
|
183
|
+
userId: result.metadata.userId,
|
|
184
|
+
sessionId: result.metadata.sessionId,
|
|
185
|
+
taskType: result.metadata.taskType,
|
|
186
|
+
actionId: result.metadata.actionId,
|
|
187
|
+
},
|
|
188
|
+
}));
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Update experience with feedback
|
|
192
|
+
*/
|
|
193
|
+
async updateExperienceReward(actionId, feedbackReward) {
|
|
194
|
+
// In a real implementation, this would update the stored experience
|
|
195
|
+
// For now, we log the feedback
|
|
196
|
+
console.log(`Updated reward for ${actionId}: ${feedbackReward}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
exports.ExperienceRecorder = ExperienceRecorder;
|
|
200
|
+
//# sourceMappingURL=experience-recorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"experience-recorder.js","sourceRoot":"","sources":["../../../../src/mcp/learning/core/experience-recorder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExperienceRecorder - Captures and stores learning experiences
|
|
3
|
+
*/
|
|
4
|
+
import { RewardEstimator } from './reward-estimator.mjs';
|
|
5
|
+
export class ExperienceRecorder {
|
|
6
|
+
constructor(db) {
|
|
7
|
+
this.actionCounter = 0;
|
|
8
|
+
this.db = db;
|
|
9
|
+
this.rewardEstimator = new RewardEstimator();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Record a tool execution as a learning experience
|
|
13
|
+
*/
|
|
14
|
+
async recordToolExecution(toolName, args, result, context, outcome) {
|
|
15
|
+
const state = await this.captureState(context);
|
|
16
|
+
const action = {
|
|
17
|
+
tool: toolName,
|
|
18
|
+
params: args,
|
|
19
|
+
timestamp: Date.now(),
|
|
20
|
+
};
|
|
21
|
+
const reward = await this.rewardEstimator.calculateReward(outcome, context);
|
|
22
|
+
const nextState = await this.captureState({
|
|
23
|
+
...context,
|
|
24
|
+
isTerminal: outcome.success || !!outcome.error,
|
|
25
|
+
});
|
|
26
|
+
const experience = {
|
|
27
|
+
state,
|
|
28
|
+
action,
|
|
29
|
+
reward: reward.combined,
|
|
30
|
+
nextState,
|
|
31
|
+
done: context.isTerminal,
|
|
32
|
+
timestamp: Date.now(),
|
|
33
|
+
metadata: {
|
|
34
|
+
userId: context.userId,
|
|
35
|
+
sessionId: context.sessionId,
|
|
36
|
+
taskType: context.taskType,
|
|
37
|
+
actionId: `action_${this.actionCounter++}`,
|
|
38
|
+
rewardBreakdown: reward,
|
|
39
|
+
outcome: {
|
|
40
|
+
success: outcome.success,
|
|
41
|
+
executionTime: outcome.executionTime,
|
|
42
|
+
tokensUsed: outcome.tokensUsed,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
// Store experience in vector database
|
|
47
|
+
await this.storeExperience(experience);
|
|
48
|
+
return experience;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Capture current state representation
|
|
52
|
+
*/
|
|
53
|
+
async captureState(context) {
|
|
54
|
+
const state = {
|
|
55
|
+
taskDescription: context.metadata?.taskDescription || '',
|
|
56
|
+
availableTools: context.metadata?.availableTools || [],
|
|
57
|
+
previousActions: context.metadata?.previousActions || [],
|
|
58
|
+
constraints: context.metadata?.constraints,
|
|
59
|
+
context: {
|
|
60
|
+
sessionId: context.sessionId,
|
|
61
|
+
taskType: context.taskType,
|
|
62
|
+
timestamp: context.timestamp,
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
// Generate state embedding for similarity search
|
|
66
|
+
state.embedding = await this.generateStateEmbedding(state);
|
|
67
|
+
return state;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Generate vector embedding for state
|
|
71
|
+
*/
|
|
72
|
+
async generateStateEmbedding(state) {
|
|
73
|
+
// Simple hash-based embedding (in production, use a proper embedding model)
|
|
74
|
+
const text = JSON.stringify({
|
|
75
|
+
task: state.taskDescription,
|
|
76
|
+
tools: state.availableTools,
|
|
77
|
+
type: state.context?.taskType,
|
|
78
|
+
});
|
|
79
|
+
// Create a simple hash-based embedding (768 dimensions)
|
|
80
|
+
const embedding = new Float32Array(768);
|
|
81
|
+
for (let i = 0; i < text.length; i++) {
|
|
82
|
+
const index = text.charCodeAt(i) % 768;
|
|
83
|
+
embedding[index] += 1;
|
|
84
|
+
}
|
|
85
|
+
// Normalize
|
|
86
|
+
const magnitude = Math.sqrt(embedding.reduce((sum, val) => sum + val * val, 0));
|
|
87
|
+
if (magnitude > 0) {
|
|
88
|
+
for (let i = 0; i < embedding.length; i++) {
|
|
89
|
+
embedding[i] /= magnitude;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return embedding;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Store experience in vector database
|
|
96
|
+
*/
|
|
97
|
+
async storeExperience(experience) {
|
|
98
|
+
if (!experience.state.embedding) {
|
|
99
|
+
throw new Error('State embedding is required');
|
|
100
|
+
}
|
|
101
|
+
await this.db.insert({
|
|
102
|
+
embedding: Array.from(experience.state.embedding),
|
|
103
|
+
metadata: {
|
|
104
|
+
type: 'learning_experience',
|
|
105
|
+
sessionId: experience.metadata.sessionId,
|
|
106
|
+
userId: experience.metadata.userId,
|
|
107
|
+
taskType: experience.metadata.taskType,
|
|
108
|
+
actionId: experience.metadata.actionId,
|
|
109
|
+
action: experience.action,
|
|
110
|
+
reward: experience.reward,
|
|
111
|
+
done: experience.done,
|
|
112
|
+
timestamp: experience.timestamp,
|
|
113
|
+
state: {
|
|
114
|
+
taskDescription: experience.state.taskDescription,
|
|
115
|
+
availableTools: experience.state.availableTools,
|
|
116
|
+
previousActionsCount: experience.state.previousActions.length,
|
|
117
|
+
},
|
|
118
|
+
outcome: experience.metadata.outcome,
|
|
119
|
+
rewardBreakdown: experience.metadata.rewardBreakdown,
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Retrieve similar experiences
|
|
125
|
+
*/
|
|
126
|
+
async retrieveSimilarExperiences(state, k = 10) {
|
|
127
|
+
if (!state.embedding) {
|
|
128
|
+
state.embedding = await this.generateStateEmbedding(state);
|
|
129
|
+
}
|
|
130
|
+
const results = await this.db.search(Array.from(state.embedding), k);
|
|
131
|
+
return results.map((result) => ({
|
|
132
|
+
state: {
|
|
133
|
+
taskDescription: result.metadata.state.taskDescription,
|
|
134
|
+
availableTools: result.metadata.state.availableTools,
|
|
135
|
+
previousActions: [],
|
|
136
|
+
embedding: result.embedding,
|
|
137
|
+
},
|
|
138
|
+
action: result.metadata.action,
|
|
139
|
+
reward: result.metadata.reward,
|
|
140
|
+
nextState: {
|
|
141
|
+
taskDescription: '',
|
|
142
|
+
availableTools: [],
|
|
143
|
+
previousActions: [],
|
|
144
|
+
},
|
|
145
|
+
done: result.metadata.done,
|
|
146
|
+
timestamp: result.metadata.timestamp,
|
|
147
|
+
metadata: {
|
|
148
|
+
userId: result.metadata.userId,
|
|
149
|
+
sessionId: result.metadata.sessionId,
|
|
150
|
+
taskType: result.metadata.taskType,
|
|
151
|
+
actionId: result.metadata.actionId,
|
|
152
|
+
},
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get experiences by session
|
|
157
|
+
*/
|
|
158
|
+
async getSessionExperiences(sessionId) {
|
|
159
|
+
// Query by metadata filter
|
|
160
|
+
const allResults = await this.db.search(Array(768).fill(0), 1000);
|
|
161
|
+
// Filter by session ID
|
|
162
|
+
const sessionResults = allResults.filter((result) => result.metadata.sessionId === sessionId);
|
|
163
|
+
return sessionResults.map((result) => ({
|
|
164
|
+
state: {
|
|
165
|
+
taskDescription: result.metadata.state.taskDescription,
|
|
166
|
+
availableTools: result.metadata.state.availableTools,
|
|
167
|
+
previousActions: [],
|
|
168
|
+
embedding: result.embedding,
|
|
169
|
+
},
|
|
170
|
+
action: result.metadata.action,
|
|
171
|
+
reward: result.metadata.reward,
|
|
172
|
+
nextState: {
|
|
173
|
+
taskDescription: '',
|
|
174
|
+
availableTools: [],
|
|
175
|
+
previousActions: [],
|
|
176
|
+
},
|
|
177
|
+
done: result.metadata.done,
|
|
178
|
+
timestamp: result.metadata.timestamp,
|
|
179
|
+
metadata: {
|
|
180
|
+
userId: result.metadata.userId,
|
|
181
|
+
sessionId: result.metadata.sessionId,
|
|
182
|
+
taskType: result.metadata.taskType,
|
|
183
|
+
actionId: result.metadata.actionId,
|
|
184
|
+
},
|
|
185
|
+
}));
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Update experience with feedback
|
|
189
|
+
*/
|
|
190
|
+
async updateExperienceReward(actionId, feedbackReward) {
|
|
191
|
+
// In a real implementation, this would update the stored experience
|
|
192
|
+
// For now, we log the feedback
|
|
193
|
+
console.log(`Updated reward for ${actionId}: ${feedbackReward}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LearningManager - Main orchestration layer for MCP learning integration
|
|
3
|
+
*/
|
|
4
|
+
import type { SQLiteVectorDB } from '../../../core/vector-db.js';
|
|
5
|
+
import type { Experience, Outcome, ActionPrediction, TrainingOptions, TrainingMetrics, LearningSession, FeedbackInput, LearningMetrics, TransferMetrics, State } from '../types/index.js';
|
|
6
|
+
export declare class LearningManager {
|
|
7
|
+
private db;
|
|
8
|
+
private experienceRecorder;
|
|
9
|
+
private rewardEstimator;
|
|
10
|
+
private sessionManager;
|
|
11
|
+
private policyOptimizers;
|
|
12
|
+
constructor(db: SQLiteVectorDB);
|
|
13
|
+
/**
|
|
14
|
+
* Start a new learning session
|
|
15
|
+
*/
|
|
16
|
+
startSession(userId: string, sessionType: 'coding' | 'research' | 'debugging' | 'general', plugin?: string, config?: Record<string, any>): Promise<LearningSession>;
|
|
17
|
+
/**
|
|
18
|
+
* End a learning session
|
|
19
|
+
*/
|
|
20
|
+
endSession(sessionId: string): Promise<LearningSession>;
|
|
21
|
+
/**
|
|
22
|
+
* Record a tool execution as learning experience
|
|
23
|
+
*/
|
|
24
|
+
recordExperience(sessionId: string, toolName: string, args: any, result: any, outcome: Outcome): Promise<Experience>;
|
|
25
|
+
/**
|
|
26
|
+
* Predict next best action
|
|
27
|
+
*/
|
|
28
|
+
predictAction(sessionId: string, currentState: State, availableTools: string[]): Promise<ActionPrediction>;
|
|
29
|
+
/**
|
|
30
|
+
* Provide user feedback on action
|
|
31
|
+
*/
|
|
32
|
+
provideFeedback(sessionId: string, actionId: string, feedback: FeedbackInput): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Train policy on collected experiences
|
|
35
|
+
*/
|
|
36
|
+
train(sessionId: string, options?: TrainingOptions): Promise<TrainingMetrics>;
|
|
37
|
+
/**
|
|
38
|
+
* Get learning metrics
|
|
39
|
+
*/
|
|
40
|
+
getMetrics(sessionId: string, period?: 'session' | 'day' | 'week' | 'month' | 'all'): Promise<LearningMetrics>;
|
|
41
|
+
/**
|
|
42
|
+
* Transfer learning between tasks
|
|
43
|
+
*/
|
|
44
|
+
transferLearning(sourceSessionId: string, targetSessionId: string, similarity?: number): Promise<TransferMetrics>;
|
|
45
|
+
/**
|
|
46
|
+
* Explain a prediction
|
|
47
|
+
*/
|
|
48
|
+
explainPrediction(sessionId: string, state: State): Promise<{
|
|
49
|
+
reasoning: string;
|
|
50
|
+
similarExperiences: Experience[];
|
|
51
|
+
confidenceFactors: Record<string, number>;
|
|
52
|
+
}>;
|
|
53
|
+
/**
|
|
54
|
+
* Calculate consistency of actions in similar experiences
|
|
55
|
+
*/
|
|
56
|
+
private calculateConsistency;
|
|
57
|
+
/**
|
|
58
|
+
* Get session info
|
|
59
|
+
*/
|
|
60
|
+
getSessionInfo(sessionId: string): LearningSession | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* Restore sessions from database
|
|
63
|
+
*/
|
|
64
|
+
restoreSessions(userId?: string): Promise<LearningSession[]>;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=learning-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning-manager.d.ts","sourceRoot":"","sources":["../../../../src/mcp/learning/core/learning-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EACV,UAAU,EAEV,OAAO,EACP,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,eAAe,EACf,aAAa,EACb,eAAe,EACf,eAAe,EACf,KAAK,EACN,MAAM,mBAAmB,CAAC;AAM3B,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,gBAAgB,CAA2C;gBAEvD,EAAE,EAAE,cAAc;IAO9B;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,EAC5D,MAAM,GAAE,MAAqB,EAC7B,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAC/B,OAAO,CAAC,eAAe,CAAC;IAmB3B;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAc7D;;OAEG;IACG,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,UAAU,CAAC;IAkCtB;;OAEG;IACG,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,KAAK,EACnB,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,gBAAgB,CAAC;IAS5B;;OAEG;IACG,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC;IAUhB;;OAEG;IACG,KAAK,CACT,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,eAAe,CAAC;IAS3B;;OAEG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAiB,GAC/D,OAAO,CAAC,eAAe,CAAC;IAkF3B;;OAEG;IACG,gBAAgB,CACpB,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,EACvB,UAAU,GAAE,MAAY,GACvB,OAAO,CAAC,eAAe,CAAC;IA6C3B;;OAEG;IACG,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC;QACT,SAAS,EAAE,MAAM,CAAC;QAClB,kBAAkB,EAAE,UAAU,EAAE,CAAC;QACjC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC3C,CAAC;IAuBF;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAa5B;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI9D;;OAEG;IACG,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAGnE"}
|