learngraph 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/llm/adapters/gemini.js +156 -0
- package/dist/cjs/llm/adapters/gemini.js.map +1 -0
- package/dist/cjs/llm/adapters/index.js +12 -1
- package/dist/cjs/llm/adapters/index.js.map +1 -1
- package/dist/cjs/llm/adapters/mediapipe.js +290 -0
- package/dist/cjs/llm/adapters/mediapipe.js.map +1 -0
- package/dist/cjs/llm/adapters/openrouter.js +190 -0
- package/dist/cjs/llm/adapters/openrouter.js.map +1 -0
- package/dist/cjs/llm/index.js +9 -1
- package/dist/cjs/llm/index.js.map +1 -1
- package/dist/cjs/query/index.js +23 -4
- package/dist/cjs/query/index.js.map +1 -1
- package/dist/cjs/query/path.js +313 -0
- package/dist/cjs/query/path.js.map +1 -0
- package/dist/cjs/query/spaced-repetition.js +298 -0
- package/dist/cjs/query/spaced-repetition.js.map +1 -0
- package/dist/cjs/query/zpd.js +216 -0
- package/dist/cjs/query/zpd.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/llm/adapters/gemini.js +151 -0
- package/dist/esm/llm/adapters/gemini.js.map +1 -0
- package/dist/esm/llm/adapters/index.js +3 -0
- package/dist/esm/llm/adapters/index.js.map +1 -1
- package/dist/esm/llm/adapters/mediapipe.js +252 -0
- package/dist/esm/llm/adapters/mediapipe.js.map +1 -0
- package/dist/esm/llm/adapters/openrouter.js +185 -0
- package/dist/esm/llm/adapters/openrouter.js.map +1 -0
- package/dist/esm/llm/index.js +1 -1
- package/dist/esm/llm/index.js.map +1 -1
- package/dist/esm/query/index.js +11 -5
- package/dist/esm/query/index.js.map +1 -1
- package/dist/esm/query/path.js +308 -0
- package/dist/esm/query/path.js.map +1 -0
- package/dist/esm/query/spaced-repetition.js +292 -0
- package/dist/esm/query/spaced-repetition.js.map +1 -0
- package/dist/esm/query/zpd.js +211 -0
- package/dist/esm/query/zpd.js.map +1 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/llm/adapters/gemini.d.ts +30 -0
- package/dist/types/llm/adapters/gemini.d.ts.map +1 -0
- package/dist/types/llm/adapters/index.d.ts +3 -0
- package/dist/types/llm/adapters/index.d.ts.map +1 -1
- package/dist/types/llm/adapters/mediapipe.d.ts +113 -0
- package/dist/types/llm/adapters/mediapipe.d.ts.map +1 -0
- package/dist/types/llm/adapters/openrouter.d.ts +58 -0
- package/dist/types/llm/adapters/openrouter.d.ts.map +1 -0
- package/dist/types/llm/index.d.ts +2 -2
- package/dist/types/llm/index.d.ts.map +1 -1
- package/dist/types/query/index.d.ts +8 -0
- package/dist/types/query/index.d.ts.map +1 -1
- package/dist/types/query/path.d.ts +102 -0
- package/dist/types/query/path.d.ts.map +1 -0
- package/dist/types/query/spaced-repetition.d.ts +135 -0
- package/dist/types/query/spaced-repetition.d.ts.map +1 -0
- package/dist/types/query/zpd.d.ts +97 -0
- package/dist/types/query/zpd.d.ts.map +1 -0
- package/dist/types/types/llm.d.ts +40 -1
- package/dist/types/types/llm.d.ts.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zone of Proximal Development (ZPD) Calculator
|
|
3
|
+
*
|
|
4
|
+
* Implements Vygotsky's Zone of Proximal Development theory to identify
|
|
5
|
+
* skills that are "just right" for a learner - challenging but achievable.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Default options for ZPD calculation
|
|
11
|
+
*/
|
|
12
|
+
export const ZPD_DEFAULTS = {
|
|
13
|
+
difficultyTolerance: 0.2,
|
|
14
|
+
prioritizeThresholdConcepts: true,
|
|
15
|
+
maxResults: 50,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* ZPD Calculator
|
|
19
|
+
*
|
|
20
|
+
* Calculates the Zone of Proximal Development for a learner based on:
|
|
21
|
+
* 1. Current mastery states
|
|
22
|
+
* 2. Prerequisite graph structure
|
|
23
|
+
* 3. Skill difficulty levels
|
|
24
|
+
*
|
|
25
|
+
* A skill is in the ZPD if:
|
|
26
|
+
* - All prerequisites are mastered
|
|
27
|
+
* - The skill is not yet mastered
|
|
28
|
+
* - The skill difficulty is within tolerance of learner ability
|
|
29
|
+
*/
|
|
30
|
+
export class ZPDCalculator {
|
|
31
|
+
storage;
|
|
32
|
+
constructor(storage) {
|
|
33
|
+
this.storage = storage;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Calculate ZPD for a learner
|
|
37
|
+
*
|
|
38
|
+
* @param learner - Learner profile with mastery states
|
|
39
|
+
* @param options - Calculation options
|
|
40
|
+
* @returns ZPD result with ready skills and blocked skills
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const calculator = new ZPDCalculator(storage);
|
|
45
|
+
*
|
|
46
|
+
* const learner = {
|
|
47
|
+
* masteryStates: new Map([
|
|
48
|
+
* ['skill-1', { skillId: 'skill-1', mastery: 0.9, ... }],
|
|
49
|
+
* ['skill-2', { skillId: 'skill-2', mastery: 0.3, ... }],
|
|
50
|
+
* ])
|
|
51
|
+
* };
|
|
52
|
+
*
|
|
53
|
+
* const zpd = await calculator.calculate(learner);
|
|
54
|
+
* console.log('Ready to learn:', zpd.ready.map(s => s.name));
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
async calculate(learner, options = {}) {
|
|
58
|
+
const opts = { ...ZPD_DEFAULTS, ...options };
|
|
59
|
+
// Get all skills from storage
|
|
60
|
+
let allSkills = await this.storage.findSkills({});
|
|
61
|
+
// Apply filters
|
|
62
|
+
if (opts.filterTags && opts.filterTags.length > 0) {
|
|
63
|
+
allSkills = allSkills.filter((skill) => opts.filterTags.some((tag) => skill.tags.includes(tag)));
|
|
64
|
+
}
|
|
65
|
+
if (opts.filterDomain) {
|
|
66
|
+
allSkills = allSkills.filter((skill) => skill.metadata?.domain === opts.filterDomain);
|
|
67
|
+
}
|
|
68
|
+
// Calculate learner ability level if not provided
|
|
69
|
+
const abilityLevel = learner.abilityLevel ?? this.calculateAbilityLevel(learner);
|
|
70
|
+
// Categorize skills
|
|
71
|
+
const zpd = [];
|
|
72
|
+
const ready = [];
|
|
73
|
+
const blocked = new Map();
|
|
74
|
+
let masteredCount = 0;
|
|
75
|
+
for (const skill of allSkills) {
|
|
76
|
+
const mastery = learner.masteryStates.get(skill.id);
|
|
77
|
+
const masteryLevel = mastery?.mastery ?? 0;
|
|
78
|
+
// Check if already mastered
|
|
79
|
+
if (masteryLevel >= skill.masteryThreshold) {
|
|
80
|
+
masteredCount++;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
// Get prerequisites
|
|
84
|
+
const prerequisites = await this.storage.getPrerequisitesOf(skill.id);
|
|
85
|
+
const unmetPrereqs = [];
|
|
86
|
+
for (const prereq of prerequisites) {
|
|
87
|
+
const prereqMastery = learner.masteryStates.get(prereq.id);
|
|
88
|
+
const prereqLevel = prereqMastery?.mastery ?? 0;
|
|
89
|
+
if (prereqLevel < prereq.masteryThreshold) {
|
|
90
|
+
unmetPrereqs.push(prereq.name);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (unmetPrereqs.length > 0) {
|
|
94
|
+
// Skill is blocked
|
|
95
|
+
blocked.set(skill.id, unmetPrereqs);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
// Skill is in ZPD (prerequisites met, not yet mastered)
|
|
99
|
+
zpd.push(skill);
|
|
100
|
+
// Check if within difficulty tolerance
|
|
101
|
+
const difficultyDelta = skill.difficulty - abilityLevel;
|
|
102
|
+
if (difficultyDelta <= opts.difficultyTolerance) {
|
|
103
|
+
ready.push(skill);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Sort ready skills by priority
|
|
108
|
+
this.sortByPriority(ready, opts.prioritizeThresholdConcepts);
|
|
109
|
+
// Limit results
|
|
110
|
+
const limitedReady = opts.maxResults ? ready.slice(0, opts.maxResults) : ready;
|
|
111
|
+
const limitedZpd = opts.maxResults ? zpd.slice(0, opts.maxResults) : zpd;
|
|
112
|
+
return {
|
|
113
|
+
zpd: limitedZpd,
|
|
114
|
+
ready: limitedReady,
|
|
115
|
+
blocked,
|
|
116
|
+
stats: {
|
|
117
|
+
totalSkills: allSkills.length,
|
|
118
|
+
mastered: masteredCount,
|
|
119
|
+
inZPD: zpd.length,
|
|
120
|
+
blocked: blocked.size,
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get the next recommended skill to learn
|
|
126
|
+
*
|
|
127
|
+
* @param learner - Learner profile
|
|
128
|
+
* @param options - ZPD options
|
|
129
|
+
* @returns The highest priority skill to learn next, or null if none available
|
|
130
|
+
*/
|
|
131
|
+
async getNextSkill(learner, options = {}) {
|
|
132
|
+
const zpd = await this.calculate(learner, { ...options, maxResults: 1 });
|
|
133
|
+
return zpd.ready[0] ?? zpd.zpd[0] ?? null;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Check if a specific skill is in the learner's ZPD
|
|
137
|
+
*
|
|
138
|
+
* @param skillId - Skill to check
|
|
139
|
+
* @param learner - Learner profile
|
|
140
|
+
* @returns Object with inZPD status and blocking prerequisites if any
|
|
141
|
+
*/
|
|
142
|
+
async isInZPD(skillId, learner) {
|
|
143
|
+
const skill = await this.storage.getSkill(skillId);
|
|
144
|
+
if (!skill) {
|
|
145
|
+
return { inZPD: false, blocking: ['Skill not found'] };
|
|
146
|
+
}
|
|
147
|
+
// Check if already mastered
|
|
148
|
+
const mastery = learner.masteryStates.get(skillId);
|
|
149
|
+
if (mastery && mastery.mastery >= skill.masteryThreshold) {
|
|
150
|
+
return { inZPD: false, blocking: [] };
|
|
151
|
+
}
|
|
152
|
+
// Check prerequisites
|
|
153
|
+
const prerequisites = await this.storage.getPrerequisitesOf(skillId);
|
|
154
|
+
const blocking = [];
|
|
155
|
+
for (const prereq of prerequisites) {
|
|
156
|
+
const prereqMastery = learner.masteryStates.get(prereq.id);
|
|
157
|
+
const prereqLevel = prereqMastery?.mastery ?? 0;
|
|
158
|
+
if (prereqLevel < prereq.masteryThreshold) {
|
|
159
|
+
blocking.push(prereq.name);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
inZPD: blocking.length === 0,
|
|
164
|
+
blocking,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Calculate learner ability level from mastery states
|
|
169
|
+
*/
|
|
170
|
+
calculateAbilityLevel(learner) {
|
|
171
|
+
if (learner.masteryStates.size === 0) {
|
|
172
|
+
return 0.3; // Default starting ability
|
|
173
|
+
}
|
|
174
|
+
let totalWeighted = 0;
|
|
175
|
+
let totalWeight = 0;
|
|
176
|
+
for (const state of learner.masteryStates.values()) {
|
|
177
|
+
// Weight by mastery level (higher mastery = more confident estimate)
|
|
178
|
+
const weight = state.mastery;
|
|
179
|
+
totalWeighted += state.mastery * weight;
|
|
180
|
+
totalWeight += weight;
|
|
181
|
+
}
|
|
182
|
+
return totalWeight > 0 ? totalWeighted / totalWeight : 0.3;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Sort skills by learning priority
|
|
186
|
+
*/
|
|
187
|
+
sortByPriority(skills, prioritizeThreshold) {
|
|
188
|
+
skills.sort((a, b) => {
|
|
189
|
+
// Threshold concepts first (if enabled)
|
|
190
|
+
if (prioritizeThreshold) {
|
|
191
|
+
if (a.isThresholdConcept && !b.isThresholdConcept)
|
|
192
|
+
return -1;
|
|
193
|
+
if (!a.isThresholdConcept && b.isThresholdConcept)
|
|
194
|
+
return 1;
|
|
195
|
+
}
|
|
196
|
+
// Then by difficulty (easier first for progressive learning)
|
|
197
|
+
if (a.difficulty !== b.difficulty) {
|
|
198
|
+
return a.difficulty - b.difficulty;
|
|
199
|
+
}
|
|
200
|
+
// Finally by estimated time (shorter first)
|
|
201
|
+
return a.estimatedMinutes - b.estimatedMinutes;
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Create a ZPD calculator
|
|
207
|
+
*/
|
|
208
|
+
export function createZPDCalculator(storage) {
|
|
209
|
+
return new ZPDCalculator(storage);
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=zpd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zpd.js","sourceRoot":"","sources":["../../../src/query/zpd.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Gemini LLM adapter
|
|
3
|
+
*
|
|
4
|
+
* @packageDocumentation
|
|
5
|
+
*/
|
|
6
|
+
import type { LLMProvider, GeminiConfig, CompletionRequest, CompletionResponse } from '../../types/llm.js';
|
|
7
|
+
import { BaseLLMAdapter } from './base.js';
|
|
8
|
+
/**
|
|
9
|
+
* Adapter for Google Gemini models
|
|
10
|
+
*
|
|
11
|
+
* Supports:
|
|
12
|
+
* - gemini-2.0-flash-exp
|
|
13
|
+
* - gemini-1.5-pro
|
|
14
|
+
* - gemini-1.5-flash
|
|
15
|
+
* - gemini-1.0-pro
|
|
16
|
+
*/
|
|
17
|
+
export declare class GeminiAdapter extends BaseLLMAdapter {
|
|
18
|
+
private readonly baseUrl;
|
|
19
|
+
constructor(config: GeminiConfig);
|
|
20
|
+
get provider(): LLMProvider;
|
|
21
|
+
complete(request: CompletionRequest): Promise<CompletionResponse>;
|
|
22
|
+
private buildRequest;
|
|
23
|
+
private executeRequest;
|
|
24
|
+
private parseResponse;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a Gemini adapter from environment variables
|
|
28
|
+
*/
|
|
29
|
+
export declare function createGeminiAdapter(model?: string, overrides?: Partial<GeminiConfig>): GeminiAdapter;
|
|
30
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../../src/llm/adapters/gemini.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAY,MAAM,WAAW,CAAC;AAsCrD;;;;;;;;GAQG;AACH,qBAAa,aAAc,SAAQ,cAAc;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,YAAY;IAOhC,IAAI,QAAQ,IAAI,WAAW,CAE1B;IAEK,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA2BvE,OAAO,CAAC,YAAY;YAgCN,cAAc;IAyC5B,OAAO,CAAC,aAAa;CA6CtB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,SAAyB,EAC9B,SAAS,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAChC,aAAa,CAkBf"}
|
|
@@ -8,4 +8,7 @@ export type { LLMErrorCode } from './base.js';
|
|
|
8
8
|
export { OpenAIAdapter, createOpenAIAdapter } from './openai.js';
|
|
9
9
|
export { AnthropicAdapter, createAnthropicAdapter } from './anthropic.js';
|
|
10
10
|
export { OllamaAdapter, createOllamaAdapter } from './ollama.js';
|
|
11
|
+
export { GeminiAdapter, createGeminiAdapter } from './gemini.js';
|
|
12
|
+
export { OpenRouterAdapter, createOpenRouterAdapter, OPENROUTER_MODELS } from './openrouter.js';
|
|
13
|
+
export { MediaPipeAdapter, createMediaPipeAdapter, MEDIAPIPE_MODELS } from './mediapipe.js';
|
|
11
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/llm/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACrE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/llm/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACrE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MediaPipe LLM Inference adapter for local Gemma models
|
|
3
|
+
*
|
|
4
|
+
* This adapter integrates with Google's MediaPipe LLM Inference Task API
|
|
5
|
+
* to run Gemma models locally using WebGPU acceleration.
|
|
6
|
+
*
|
|
7
|
+
* Supported models:
|
|
8
|
+
* - Gemma 2B / 7B
|
|
9
|
+
* - Gemma 2 2B
|
|
10
|
+
* - Gemma 3n (2B, 4B parameters)
|
|
11
|
+
*
|
|
12
|
+
* Requirements:
|
|
13
|
+
* - WebGPU-capable browser or Node.js with WebGPU support
|
|
14
|
+
* - @mediapipe/tasks-genai package
|
|
15
|
+
* - Downloaded model weights (.bin file)
|
|
16
|
+
*
|
|
17
|
+
* @packageDocumentation
|
|
18
|
+
*/
|
|
19
|
+
import type { LLMProvider, MediaPipeConfig, CompletionRequest, CompletionResponse } from '../../types/llm.js';
|
|
20
|
+
import { BaseLLMAdapter } from './base.js';
|
|
21
|
+
/**
|
|
22
|
+
* Gemma model variants for MediaPipe
|
|
23
|
+
*/
|
|
24
|
+
export declare const MEDIAPIPE_MODELS: {
|
|
25
|
+
readonly 'gemma-2b': "gemma-2b-it-gpu-int4.bin";
|
|
26
|
+
readonly 'gemma-7b': "gemma-7b-it-gpu-int8.bin";
|
|
27
|
+
readonly 'gemma2-2b': "gemma2-2b-it-gpu-int4.bin";
|
|
28
|
+
readonly 'gemma3n-e2b': "gemma-3n-E2B-it-int4.task";
|
|
29
|
+
readonly 'gemma3n-e4b': "gemma-3n-E4B-it-int4.task";
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Adapter for MediaPipe LLM Inference API
|
|
33
|
+
*
|
|
34
|
+
* Runs Gemma models locally using WebGPU acceleration.
|
|
35
|
+
* The adapter lazily loads the model on first use.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* import { MediaPipeAdapter } from 'learngraph/llm';
|
|
40
|
+
*
|
|
41
|
+
* const adapter = new MediaPipeAdapter({
|
|
42
|
+
* provider: 'mediapipe',
|
|
43
|
+
* model: 'gemma3n-e2b',
|
|
44
|
+
* modelPath: '/models/gemma-3n-E2B-it-int4.task',
|
|
45
|
+
* });
|
|
46
|
+
*
|
|
47
|
+
* // Use with orchestrator
|
|
48
|
+
* const orchestrator = createOrchestrator(adapter);
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare class MediaPipeAdapter extends BaseLLMAdapter {
|
|
52
|
+
private inference;
|
|
53
|
+
private readonly modelPath;
|
|
54
|
+
private readonly randomSeed?;
|
|
55
|
+
private readonly topK;
|
|
56
|
+
private readonly loraRanks?;
|
|
57
|
+
private initPromise;
|
|
58
|
+
constructor(config: MediaPipeConfig);
|
|
59
|
+
get provider(): LLMProvider;
|
|
60
|
+
/**
|
|
61
|
+
* Check if MediaPipe is configured (model path exists)
|
|
62
|
+
*/
|
|
63
|
+
isConfigured(): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Initialize the MediaPipe LLM Inference engine
|
|
66
|
+
* Called automatically on first request
|
|
67
|
+
*/
|
|
68
|
+
initialize(): Promise<void>;
|
|
69
|
+
private doInitialize;
|
|
70
|
+
/**
|
|
71
|
+
* Load MediaPipe library dynamically
|
|
72
|
+
*/
|
|
73
|
+
private loadMediaPipe;
|
|
74
|
+
complete(request: CompletionRequest): Promise<CompletionResponse>;
|
|
75
|
+
/**
|
|
76
|
+
* Build a prompt string from chat messages
|
|
77
|
+
* Uses Gemma's instruction format
|
|
78
|
+
*/
|
|
79
|
+
private buildPrompt;
|
|
80
|
+
/**
|
|
81
|
+
* Parse the generated response
|
|
82
|
+
*/
|
|
83
|
+
private parseGeneratedResponse;
|
|
84
|
+
/**
|
|
85
|
+
* Close the inference engine and release resources
|
|
86
|
+
*/
|
|
87
|
+
close(): void;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create a MediaPipe adapter for local Gemma models
|
|
91
|
+
*
|
|
92
|
+
* @param modelPath - Path to the model file (.bin or .task)
|
|
93
|
+
* @param model - Model identifier (for reference)
|
|
94
|
+
* @param overrides - Additional configuration options
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* // Using a Gemma 3n model
|
|
99
|
+
* const adapter = createMediaPipeAdapter(
|
|
100
|
+
* '/models/gemma-3n-E2B-it-int4.task',
|
|
101
|
+
* 'gemma3n-e2b'
|
|
102
|
+
* );
|
|
103
|
+
*
|
|
104
|
+
* // With custom options
|
|
105
|
+
* const adapter = createMediaPipeAdapter(
|
|
106
|
+
* '/models/gemma2-2b-it-gpu-int4.bin',
|
|
107
|
+
* 'gemma2-2b',
|
|
108
|
+
* { maxTokens: 2048, temperature: 0.5 }
|
|
109
|
+
* );
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export declare function createMediaPipeAdapter(modelPath: string, model?: string, overrides?: Partial<Omit<MediaPipeConfig, 'provider' | 'modelPath'>>): MediaPipeAdapter;
|
|
113
|
+
//# sourceMappingURL=mediapipe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mediapipe.d.ts","sourceRoot":"","sources":["../../../../src/llm/adapters/mediapipe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAY,MAAM,WAAW,CAAC;AAoCrD;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;CAMnB,CAAC;AAEX;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,gBAAiB,SAAQ,cAAc;IAClD,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,WAAW,CAA8B;gBAErC,MAAM,EAAE,eAAe;IAYnC,IAAI,QAAQ,IAAI,WAAW,CAE1B;IAED;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAcnB,YAAY;IAuC1B;;OAEG;YACW,aAAa;IAarB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAqCvE;;;OAGG;IACH,OAAO,CAAC,WAAW;IA6BnB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA6B9B;;OAEG;IACH,KAAK,IAAI,IAAI;CAOd;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,KAAK,SAAY,EACjB,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,WAAW,CAAC,CAAC,GACnE,gBAAgB,CASlB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenRouter LLM adapter
|
|
3
|
+
*
|
|
4
|
+
* OpenRouter provides access to many models through a single API:
|
|
5
|
+
* - OpenAI (GPT-4, GPT-3.5)
|
|
6
|
+
* - Anthropic (Claude)
|
|
7
|
+
* - Google (Gemini, PaLM)
|
|
8
|
+
* - Meta (Llama)
|
|
9
|
+
* - Mistral
|
|
10
|
+
* - And many more
|
|
11
|
+
*
|
|
12
|
+
* @packageDocumentation
|
|
13
|
+
*/
|
|
14
|
+
import type { LLMProvider, OpenRouterConfig, CompletionRequest, CompletionResponse } from '../../types/llm.js';
|
|
15
|
+
import { BaseLLMAdapter } from './base.js';
|
|
16
|
+
/**
|
|
17
|
+
* Popular models available on OpenRouter
|
|
18
|
+
*/
|
|
19
|
+
export declare const OPENROUTER_MODELS: {
|
|
20
|
+
readonly 'openai/gpt-4o': "openai/gpt-4o";
|
|
21
|
+
readonly 'openai/gpt-4-turbo': "openai/gpt-4-turbo";
|
|
22
|
+
readonly 'openai/gpt-3.5-turbo': "openai/gpt-3.5-turbo";
|
|
23
|
+
readonly 'anthropic/claude-3.5-sonnet': "anthropic/claude-3.5-sonnet";
|
|
24
|
+
readonly 'anthropic/claude-3-opus': "anthropic/claude-3-opus";
|
|
25
|
+
readonly 'anthropic/claude-3-haiku': "anthropic/claude-3-haiku";
|
|
26
|
+
readonly 'google/gemini-pro': "google/gemini-pro";
|
|
27
|
+
readonly 'google/gemini-pro-1.5': "google/gemini-pro-1.5";
|
|
28
|
+
readonly 'meta-llama/llama-3.1-70b-instruct': "meta-llama/llama-3.1-70b-instruct";
|
|
29
|
+
readonly 'meta-llama/llama-3.1-8b-instruct': "meta-llama/llama-3.1-8b-instruct";
|
|
30
|
+
readonly 'mistralai/mistral-large': "mistralai/mistral-large";
|
|
31
|
+
readonly 'mistralai/mistral-medium': "mistralai/mistral-medium";
|
|
32
|
+
readonly 'mistralai/mixtral-8x7b-instruct': "mistralai/mixtral-8x7b-instruct";
|
|
33
|
+
readonly 'deepseek/deepseek-chat': "deepseek/deepseek-chat";
|
|
34
|
+
readonly 'deepseek/deepseek-coder': "deepseek/deepseek-coder";
|
|
35
|
+
readonly 'qwen/qwen-2.5-72b-instruct': "qwen/qwen-2.5-72b-instruct";
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Adapter for OpenRouter API
|
|
39
|
+
*
|
|
40
|
+
* OpenRouter provides unified access to 100+ models from various providers.
|
|
41
|
+
* See https://openrouter.ai/docs for full documentation.
|
|
42
|
+
*/
|
|
43
|
+
export declare class OpenRouterAdapter extends BaseLLMAdapter {
|
|
44
|
+
private readonly baseUrl;
|
|
45
|
+
private readonly siteUrl?;
|
|
46
|
+
private readonly appName?;
|
|
47
|
+
constructor(config: OpenRouterConfig);
|
|
48
|
+
get provider(): LLMProvider;
|
|
49
|
+
complete(request: CompletionRequest): Promise<CompletionResponse>;
|
|
50
|
+
private buildRequest;
|
|
51
|
+
private executeRequest;
|
|
52
|
+
private parseResponse;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create an OpenRouter adapter from environment variables
|
|
56
|
+
*/
|
|
57
|
+
export declare function createOpenRouterAdapter(model?: string, overrides?: Partial<OpenRouterConfig>): OpenRouterAdapter;
|
|
58
|
+
//# sourceMappingURL=openrouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../../../src/llm/adapters/openrouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAY,MAAM,WAAW,CAAC;AAqCrD;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CA8BpB,CAAC;AAEX;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,cAAc;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAS;gBAEtB,MAAM,EAAE,gBAAgB;IAWpC,IAAI,QAAQ,IAAI,WAAW,CAE1B;IAEK,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA2BvE,OAAO,CAAC,YAAY;YAmBN,cAAc;IA0D5B,OAAO,CAAC,aAAa;CA6CtB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,SAAgC,EACrC,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GACpC,iBAAiB,CAenB"}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @packageDocumentation
|
|
5
5
|
*/
|
|
6
|
-
export type { LLMProvider, LLMConfig, OpenAIConfig, AnthropicConfig, OllamaConfig, MessageRole, ChatMessage, CompletionRequest, CompletionResponse, SkillExtractionRequest, ExtractedSkillLLM, SkillExtractionResponse, PrerequisiteInferenceRequest, InferredPrerequisite, PrerequisiteInferenceResponse, BloomAnalysisRequest, BloomAnalysisResponse, DecompositionRequest, DecompositionResponse, LLMAdapter, LLMOrchestrator as ILLMOrchestrator, } from '../types/llm.js';
|
|
7
|
-
export { BaseLLMAdapter, LLMError, DEFAULT_CONFIG, OpenAIAdapter, createOpenAIAdapter, AnthropicAdapter, createAnthropicAdapter, OllamaAdapter, createOllamaAdapter, } from './adapters/index.js';
|
|
6
|
+
export type { LLMProvider, LLMConfig, OpenAIConfig, AnthropicConfig, OllamaConfig, GeminiConfig, OpenRouterConfig, MediaPipeConfig, MessageRole, ChatMessage, CompletionRequest, CompletionResponse, SkillExtractionRequest, ExtractedSkillLLM, SkillExtractionResponse, PrerequisiteInferenceRequest, InferredPrerequisite, PrerequisiteInferenceResponse, BloomAnalysisRequest, BloomAnalysisResponse, DecompositionRequest, DecompositionResponse, LLMAdapter, LLMOrchestrator as ILLMOrchestrator, } from '../types/llm.js';
|
|
7
|
+
export { BaseLLMAdapter, LLMError, DEFAULT_CONFIG, OpenAIAdapter, createOpenAIAdapter, AnthropicAdapter, createAnthropicAdapter, OllamaAdapter, createOllamaAdapter, GeminiAdapter, createGeminiAdapter, OpenRouterAdapter, createOpenRouterAdapter, OPENROUTER_MODELS, MediaPipeAdapter, createMediaPipeAdapter, MEDIAPIPE_MODELS, } from './adapters/index.js';
|
|
8
8
|
export type { LLMErrorCode } from './adapters/index.js';
|
|
9
9
|
export { LLMOrchestrator, createOrchestrator } from './orchestrator.js';
|
|
10
10
|
export { SYSTEM_PROMPTS, EXTRACTION_SCHEMA, PREREQUISITE_SCHEMA, BLOOM_ANALYSIS_SCHEMA, DECOMPOSITION_SCHEMA, buildExtractionPrompt, buildPrerequisitePrompt, buildBloomPrompt, buildDecompositionPrompt, } from './prompts.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,YAAY,EACV,WAAW,EACX,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,4BAA4B,EAC5B,oBAAoB,EACpB,6BAA6B,EAC7B,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,UAAU,EACV,eAAe,IAAI,gBAAgB,GACpC,MAAM,iBAAiB,CAAC;AAKzB,OAAO,EACL,cAAc,EACd,QAAQ,EACR,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,YAAY,EACV,WAAW,EACX,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,4BAA4B,EAC5B,oBAAoB,EACpB,6BAA6B,EAC7B,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,UAAU,EACV,eAAe,IAAI,gBAAgB,GACpC,MAAM,iBAAiB,CAAC;AAKzB,OAAO,EACL,cAAc,EACd,QAAQ,EACR,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAKxE,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,cAAc,CAAC"}
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Query and traversal engines
|
|
3
3
|
*
|
|
4
|
+
* This module provides intelligent query engines for:
|
|
5
|
+
* - Zone of Proximal Development (ZPD) calculation
|
|
6
|
+
* - Learning path generation
|
|
7
|
+
* - Spaced repetition scheduling
|
|
8
|
+
*
|
|
4
9
|
* @packageDocumentation
|
|
5
10
|
*/
|
|
6
11
|
export type { QueryOperator, QueryFilter, QuerySort, QueryPagination, SkillQuery, ZPDResult, LearningPath, LearningSession, ReviewSchedule, ReviewItem, ZPDOptions, PathOptions, ReviewOptions, } from '../types/query.js';
|
|
12
|
+
export { ZPDCalculator, createZPDCalculator, ZPD_DEFAULTS, type LearnerProfile, } from './zpd.js';
|
|
13
|
+
export { PathGenerator, createPathGenerator, PATH_DEFAULTS, type LearnerState, } from './path.js';
|
|
14
|
+
export { SpacedRepetitionScheduler, createSpacedRepetitionScheduler, calculateSM2, REVIEW_DEFAULTS, SM2_CONSTANTS, type ReviewQuality, type ReviewState, type SM2Result, } from './spaced-repetition.js';
|
|
7
15
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/query/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/query/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,YAAY,EACV,aAAa,EACb,WAAW,EACX,SAAS,EACT,eAAe,EACf,UAAU,EACV,SAAS,EACT,YAAY,EACZ,eAAe,EACf,cAAc,EACd,UAAU,EACV,UAAU,EACV,WAAW,EACX,aAAa,GACd,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,KAAK,cAAc,GACpB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,KAAK,YAAY,GAClB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,yBAAyB,EACzB,+BAA+B,EAC/B,YAAY,EACZ,eAAe,EACf,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,SAAS,GACf,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Learning Path Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates personalized learning paths from current state to target skills.
|
|
5
|
+
* Uses topological sorting and groups skills into manageable sessions.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import type { SkillId } from '../types/skill.js';
|
|
10
|
+
import type { MasteryState } from '../types/mastery.js';
|
|
11
|
+
import type { GraphStorage } from '../types/storage.js';
|
|
12
|
+
import type { LearningPath, PathOptions } from '../types/query.js';
|
|
13
|
+
/**
|
|
14
|
+
* Default options for path generation
|
|
15
|
+
*/
|
|
16
|
+
export declare const PATH_DEFAULTS: Required<PathOptions>;
|
|
17
|
+
/**
|
|
18
|
+
* Learner state for path generation
|
|
19
|
+
*/
|
|
20
|
+
export interface LearnerState {
|
|
21
|
+
/** Mastery states for skills (keyed by skill ID) */
|
|
22
|
+
masteryStates: Map<SkillId, MasteryState>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Learning Path Generator
|
|
26
|
+
*
|
|
27
|
+
* Generates optimal learning paths to reach target skills by:
|
|
28
|
+
* 1. Finding all unmastered prerequisites
|
|
29
|
+
* 2. Topologically sorting based on dependencies
|
|
30
|
+
* 3. Grouping into sessions based on cognitive load
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const generator = new PathGenerator(storage);
|
|
35
|
+
*
|
|
36
|
+
* const path = await generator.generatePath(
|
|
37
|
+
* 'advanced-skill',
|
|
38
|
+
* learnerState,
|
|
39
|
+
* { sessionMinutes: 45 }
|
|
40
|
+
* );
|
|
41
|
+
*
|
|
42
|
+
* console.log(`Path has ${path.skills.length} skills`);
|
|
43
|
+
* console.log(`Estimated time: ${path.totalMinutes} minutes`);
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare class PathGenerator {
|
|
47
|
+
private readonly storage;
|
|
48
|
+
constructor(storage: GraphStorage);
|
|
49
|
+
/**
|
|
50
|
+
* Generate a learning path to a target skill
|
|
51
|
+
*
|
|
52
|
+
* @param targetId - The skill to learn
|
|
53
|
+
* @param learner - Current learner state
|
|
54
|
+
* @param options - Path generation options
|
|
55
|
+
* @returns Learning path with skills grouped into sessions
|
|
56
|
+
*/
|
|
57
|
+
generatePath(targetId: SkillId, learner: LearnerState, options?: PathOptions): Promise<LearningPath | null>;
|
|
58
|
+
/**
|
|
59
|
+
* Generate paths to multiple target skills
|
|
60
|
+
*
|
|
61
|
+
* @param targetIds - Skills to learn
|
|
62
|
+
* @param learner - Current learner state
|
|
63
|
+
* @param options - Path generation options
|
|
64
|
+
* @returns Array of learning paths
|
|
65
|
+
*/
|
|
66
|
+
generatePaths(targetIds: SkillId[], learner: LearnerState, options?: PathOptions): Promise<LearningPath[]>;
|
|
67
|
+
/**
|
|
68
|
+
* Get a merged learning path for multiple targets
|
|
69
|
+
* Combines all required skills and eliminates duplicates
|
|
70
|
+
*/
|
|
71
|
+
generateMergedPath(targetIds: SkillId[], learner: LearnerState, options?: PathOptions): Promise<LearningPath | null>;
|
|
72
|
+
/**
|
|
73
|
+
* Get all transitive prerequisites of a skill
|
|
74
|
+
*/
|
|
75
|
+
private getTransitivePrerequisites;
|
|
76
|
+
/**
|
|
77
|
+
* Filter skills to only unmastered ones
|
|
78
|
+
*/
|
|
79
|
+
private filterUnmastered;
|
|
80
|
+
/**
|
|
81
|
+
* Topologically sort skills based on prerequisites
|
|
82
|
+
* Skills with no unmastered prerequisites come first
|
|
83
|
+
*/
|
|
84
|
+
private topologicalSort;
|
|
85
|
+
/**
|
|
86
|
+
* Group skills into learning sessions based on target duration
|
|
87
|
+
*/
|
|
88
|
+
private groupIntoSessions;
|
|
89
|
+
/**
|
|
90
|
+
* Create a learning session from a group of skills
|
|
91
|
+
*/
|
|
92
|
+
private createSession;
|
|
93
|
+
/**
|
|
94
|
+
* Determine the focus/theme of a session
|
|
95
|
+
*/
|
|
96
|
+
private determineFocus;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Create a path generator
|
|
100
|
+
*/
|
|
101
|
+
export declare function createPathGenerator(storage: GraphStorage): PathGenerator;
|
|
102
|
+
//# sourceMappingURL=path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/query/path.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAa,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAmB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEpF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,WAAW,CAI/C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oDAAoD;IACpD,aAAa,EAAE,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,YAAY;IAElD;;;;;;;OAOG;IACG,YAAY,CAChB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IA4D/B;;;;;;;OAOG;IACG,aAAa,CACjB,SAAS,EAAE,OAAO,EAAE,EACpB,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,YAAY,EAAE,CAAC;IAa1B;;;OAGG;IACG,kBAAkB,CACtB,SAAS,EAAE,OAAO,EAAE,EACpB,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAiE/B;;OAEG;YACW,0BAA0B;IAyBxC;;OAEG;YACW,gBAAgB;IAmB9B;;;OAGG;YACW,eAAe;IA0C7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA+BzB;;OAEG;IACH,OAAO,CAAC,aAAa;IA0BrB;;OAEG;IACH,OAAO,CAAC,cAAc;CAqBvB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CAExE"}
|