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.
Files changed (60) hide show
  1. package/dist/cjs/index.js +1 -1
  2. package/dist/cjs/llm/adapters/gemini.js +156 -0
  3. package/dist/cjs/llm/adapters/gemini.js.map +1 -0
  4. package/dist/cjs/llm/adapters/index.js +12 -1
  5. package/dist/cjs/llm/adapters/index.js.map +1 -1
  6. package/dist/cjs/llm/adapters/mediapipe.js +290 -0
  7. package/dist/cjs/llm/adapters/mediapipe.js.map +1 -0
  8. package/dist/cjs/llm/adapters/openrouter.js +190 -0
  9. package/dist/cjs/llm/adapters/openrouter.js.map +1 -0
  10. package/dist/cjs/llm/index.js +9 -1
  11. package/dist/cjs/llm/index.js.map +1 -1
  12. package/dist/cjs/query/index.js +23 -4
  13. package/dist/cjs/query/index.js.map +1 -1
  14. package/dist/cjs/query/path.js +313 -0
  15. package/dist/cjs/query/path.js.map +1 -0
  16. package/dist/cjs/query/spaced-repetition.js +298 -0
  17. package/dist/cjs/query/spaced-repetition.js.map +1 -0
  18. package/dist/cjs/query/zpd.js +216 -0
  19. package/dist/cjs/query/zpd.js.map +1 -0
  20. package/dist/esm/index.js +1 -1
  21. package/dist/esm/llm/adapters/gemini.js +151 -0
  22. package/dist/esm/llm/adapters/gemini.js.map +1 -0
  23. package/dist/esm/llm/adapters/index.js +3 -0
  24. package/dist/esm/llm/adapters/index.js.map +1 -1
  25. package/dist/esm/llm/adapters/mediapipe.js +252 -0
  26. package/dist/esm/llm/adapters/mediapipe.js.map +1 -0
  27. package/dist/esm/llm/adapters/openrouter.js +185 -0
  28. package/dist/esm/llm/adapters/openrouter.js.map +1 -0
  29. package/dist/esm/llm/index.js +1 -1
  30. package/dist/esm/llm/index.js.map +1 -1
  31. package/dist/esm/query/index.js +11 -5
  32. package/dist/esm/query/index.js.map +1 -1
  33. package/dist/esm/query/path.js +308 -0
  34. package/dist/esm/query/path.js.map +1 -0
  35. package/dist/esm/query/spaced-repetition.js +292 -0
  36. package/dist/esm/query/spaced-repetition.js.map +1 -0
  37. package/dist/esm/query/zpd.js +211 -0
  38. package/dist/esm/query/zpd.js.map +1 -0
  39. package/dist/types/index.d.ts +1 -1
  40. package/dist/types/llm/adapters/gemini.d.ts +30 -0
  41. package/dist/types/llm/adapters/gemini.d.ts.map +1 -0
  42. package/dist/types/llm/adapters/index.d.ts +3 -0
  43. package/dist/types/llm/adapters/index.d.ts.map +1 -1
  44. package/dist/types/llm/adapters/mediapipe.d.ts +113 -0
  45. package/dist/types/llm/adapters/mediapipe.d.ts.map +1 -0
  46. package/dist/types/llm/adapters/openrouter.d.ts +58 -0
  47. package/dist/types/llm/adapters/openrouter.d.ts.map +1 -0
  48. package/dist/types/llm/index.d.ts +2 -2
  49. package/dist/types/llm/index.d.ts.map +1 -1
  50. package/dist/types/query/index.d.ts +8 -0
  51. package/dist/types/query/index.d.ts.map +1 -1
  52. package/dist/types/query/path.d.ts +102 -0
  53. package/dist/types/query/path.d.ts.map +1 -0
  54. package/dist/types/query/spaced-repetition.d.ts +135 -0
  55. package/dist/types/query/spaced-repetition.d.ts.map +1 -0
  56. package/dist/types/query/zpd.d.ts +97 -0
  57. package/dist/types/query/zpd.d.ts.map +1 -0
  58. package/dist/types/types/llm.d.ts +40 -1
  59. package/dist/types/types/llm.d.ts.map +1 -1
  60. 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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"}
@@ -30,7 +30,7 @@ export * from './types/index.js';
30
30
  /**
31
31
  * Package version
32
32
  */
33
- export declare const VERSION = "0.1.1";
33
+ export declare const VERSION = "0.5.0";
34
34
  /**
35
35
  * Package name
36
36
  */
@@ -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,GACpB,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
+ {"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;;;;GAIG;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"}
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"}