@lssm/module.learning-journey 0.0.0-canary-20251217083314 → 0.0.0-canary-20251220002821
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/LICENSE +21 -0
- package/README.md +3 -0
- package/dist/contracts/models.d.ts +120 -119
- package/dist/contracts/models.d.ts.map +1 -0
- package/dist/contracts/models.js +87 -88
- package/dist/contracts/models.js.map +1 -0
- package/dist/contracts/onboarding.d.ts +169 -168
- package/dist/contracts/onboarding.d.ts.map +1 -0
- package/dist/contracts/onboarding.js +71 -72
- package/dist/contracts/onboarding.js.map +1 -0
- package/dist/contracts/operations.d.ts +72 -71
- package/dist/contracts/operations.d.ts.map +1 -0
- package/dist/contracts/operations.js +2 -1
- package/dist/contracts/operations.js.map +1 -0
- package/dist/contracts/shared.d.ts +2 -1
- package/dist/contracts/shared.d.ts.map +1 -0
- package/dist/contracts/shared.js +2 -1
- package/dist/contracts/shared.js.map +1 -0
- package/dist/docs/learning-journey.docblock.js +2 -1
- package/dist/docs/learning-journey.docblock.js.map +1 -0
- package/dist/engines/srs.d.ts +14 -13
- package/dist/engines/srs.d.ts.map +1 -0
- package/dist/engines/srs.js +30 -30
- package/dist/engines/srs.js.map +1 -0
- package/dist/engines/streak.d.ts +2 -1
- package/dist/engines/streak.d.ts.map +1 -0
- package/dist/engines/streak.js +2 -1
- package/dist/engines/streak.js.map +1 -0
- package/dist/engines/xp.d.ts +2 -1
- package/dist/engines/xp.d.ts.map +1 -0
- package/dist/engines/xp.js +2 -1
- package/dist/engines/xp.js.map +1 -0
- package/dist/entities/ai.d.ts +202 -201
- package/dist/entities/ai.d.ts.map +1 -0
- package/dist/entities/ai.js +114 -114
- package/dist/entities/ai.js.map +1 -0
- package/dist/entities/course.d.ts +152 -151
- package/dist/entities/course.d.ts.map +1 -0
- package/dist/entities/course.js +86 -86
- package/dist/entities/course.js.map +1 -0
- package/dist/entities/flashcard.d.ts +147 -146
- package/dist/entities/flashcard.d.ts.map +1 -0
- package/dist/entities/flashcard.js +85 -85
- package/dist/entities/flashcard.js.map +1 -0
- package/dist/entities/gamification.d.ts +200 -199
- package/dist/entities/gamification.d.ts.map +1 -0
- package/dist/entities/gamification.js +120 -120
- package/dist/entities/gamification.js.map +1 -0
- package/dist/entities/index.d.ts +607 -606
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +2 -1
- package/dist/entities/index.js.map +1 -0
- package/dist/entities/learner.d.ts +194 -193
- package/dist/entities/learner.d.ts.map +1 -0
- package/dist/entities/learner.js +113 -113
- package/dist/entities/learner.js.map +1 -0
- package/dist/entities/onboarding.d.ts +167 -166
- package/dist/entities/onboarding.d.ts.map +1 -0
- package/dist/entities/onboarding.js +93 -93
- package/dist/entities/onboarding.js.map +1 -0
- package/dist/entities/quiz.d.ts +187 -186
- package/dist/entities/quiz.d.ts.map +1 -0
- package/dist/entities/quiz.js +109 -109
- package/dist/entities/quiz.js.map +1 -0
- package/dist/events.d.ts +215 -214
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +109 -110
- package/dist/events.js.map +1 -0
- package/dist/learning-journey.feature.d.ts +2 -1
- package/dist/learning-journey.feature.d.ts.map +1 -0
- package/dist/learning-journey.feature.js +2 -1
- package/dist/learning-journey.feature.js.map +1 -0
- package/dist/libs/contracts/dist/capabilities/openbanking.js +2 -1
- package/dist/libs/contracts/dist/capabilities/openbanking.js.map +1 -0
- package/dist/libs/contracts/dist/contract-registry/schemas.js +2 -1
- package/dist/libs/contracts/dist/contract-registry/schemas.js.map +1 -0
- package/dist/libs/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/index.js +2 -6
- package/dist/libs/contracts/dist/docs/meta.docs.js +30 -0
- package/dist/libs/contracts/dist/docs/meta.docs.js.map +1 -0
- package/dist/libs/contracts/dist/docs/presentations.js +2 -1
- package/dist/libs/contracts/dist/docs/presentations.js.map +1 -0
- package/dist/libs/contracts/dist/docs/registry.js +2 -1
- package/dist/libs/contracts/dist/docs/registry.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/contracts/openapi-export.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/contracts/openapi-export.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/mcp-endpoints.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/mcp-endpoints.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/presentation-runtime.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/presentation-runtime.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/schema/README.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/schema/README.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/studio/learning-events.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/studio/learning-events.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/studio/learning-journeys.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/studio/learning-journeys.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/studio/project-access-teams.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/studio/project-access-teams.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/studio/project-routing.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/studio/project-routing.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/studio/team-invitations.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/studio/team-invitations.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/studio/workspace-ops.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/studio/workspace-ops.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/studio/workspaces.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/studio/workspaces.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/telemetry-ingest.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/telemetry-ingest.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/templates/runtime.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/templates/runtime.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/vscode-extension.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/vscode-extension.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech/workflows/overview.docblock.js +2 -1
- package/dist/libs/contracts/dist/docs/tech/workflows/overview.docblock.js.map +1 -0
- package/dist/libs/contracts/dist/docs/tech-contracts.docs.js +97 -0
- package/dist/libs/contracts/dist/docs/tech-contracts.docs.js.map +1 -0
- package/dist/libs/contracts/dist/events.js +2 -1
- package/dist/libs/contracts/dist/events.js.map +1 -0
- package/dist/libs/contracts/dist/index.js +2 -1
- package/dist/libs/contracts/dist/integrations/contracts.js +65 -66
- package/dist/libs/contracts/dist/integrations/contracts.js.map +1 -0
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/accounts.js +31 -32
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/accounts.js.map +1 -0
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/balances.js +18 -19
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/balances.js.map +1 -0
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/transactions.js +32 -33
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/transactions.js.map +1 -0
- package/dist/libs/contracts/dist/integrations/openbanking/models.js +60 -61
- package/dist/libs/contracts/dist/integrations/openbanking/models.js.map +1 -0
- package/dist/libs/contracts/dist/integrations/openbanking/telemetry.js +2 -1
- package/dist/libs/contracts/dist/integrations/openbanking/telemetry.js.map +1 -0
- package/dist/libs/contracts/dist/integrations/providers/elevenlabs.js +2 -1
- package/dist/libs/contracts/dist/integrations/providers/elevenlabs.js.map +1 -0
- package/dist/libs/contracts/dist/integrations/providers/gcs-storage.js +2 -1
- package/dist/libs/contracts/dist/integrations/providers/gcs-storage.js.map +1 -0
- package/dist/libs/contracts/dist/integrations/providers/gmail.js +2 -1
- package/dist/libs/contracts/dist/integrations/providers/gmail.js.map +1 -0
- package/dist/libs/contracts/dist/integrations/providers/google-calendar.js +2 -1
- package/dist/libs/contracts/dist/integrations/providers/google-calendar.js.map +1 -0
- package/dist/libs/contracts/dist/integrations/providers/mistral.js +2 -1
- package/dist/libs/contracts/dist/integrations/providers/mistral.js.map +1 -0
- package/dist/libs/contracts/dist/integrations/providers/postmark.js +2 -1
- package/dist/libs/contracts/dist/integrations/providers/postmark.js.map +1 -0
- package/dist/libs/contracts/dist/integrations/providers/powens.js +2 -1
- package/dist/libs/contracts/dist/integrations/providers/powens.js.map +1 -0
- package/dist/libs/contracts/dist/integrations/providers/qdrant.js +2 -1
- package/dist/libs/contracts/dist/integrations/providers/qdrant.js.map +1 -0
- package/dist/libs/contracts/dist/integrations/providers/stripe.js +2 -1
- package/dist/libs/contracts/dist/integrations/providers/stripe.js.map +1 -0
- package/dist/libs/contracts/dist/integrations/providers/twilio-sms.js +2 -1
- package/dist/libs/contracts/dist/integrations/providers/twilio-sms.js.map +1 -0
- package/dist/libs/contracts/dist/knowledge/contracts.js +44 -45
- package/dist/libs/contracts/dist/knowledge/contracts.js.map +1 -0
- package/dist/libs/contracts/dist/knowledge/spaces/email-threads.js +2 -1
- package/dist/libs/contracts/dist/knowledge/spaces/email-threads.js.map +1 -0
- package/dist/libs/contracts/dist/knowledge/spaces/financial-docs.js +2 -1
- package/dist/libs/contracts/dist/knowledge/spaces/financial-docs.js.map +1 -0
- package/dist/libs/contracts/dist/knowledge/spaces/financial-overview.js +2 -1
- package/dist/libs/contracts/dist/knowledge/spaces/financial-overview.js.map +1 -0
- package/dist/libs/contracts/dist/knowledge/spaces/product-canon.js +2 -1
- package/dist/libs/contracts/dist/knowledge/spaces/product-canon.js.map +1 -0
- package/dist/libs/contracts/dist/knowledge/spaces/support-faq.js +2 -1
- package/dist/libs/contracts/dist/knowledge/spaces/support-faq.js.map +1 -0
- package/dist/libs/contracts/dist/knowledge/spaces/uploaded-docs.js +2 -1
- package/dist/libs/contracts/dist/knowledge/spaces/uploaded-docs.js.map +1 -0
- package/dist/libs/contracts/dist/llm/exporters.js +2 -1
- package/dist/libs/contracts/dist/llm/exporters.js.map +1 -0
- package/dist/libs/contracts/dist/onboarding-base.js +22 -23
- package/dist/libs/contracts/dist/onboarding-base.js.map +1 -0
- package/dist/libs/contracts/dist/ownership.js +4 -2
- package/dist/libs/contracts/dist/ownership.js.map +1 -0
- package/dist/libs/contracts/dist/presentations.v2.js +2 -1
- package/dist/libs/contracts/dist/presentations.v2.js.map +1 -0
- package/dist/libs/contracts/dist/regenerator/service.js +2 -1
- package/dist/libs/contracts/dist/regenerator/service.js.map +1 -0
- package/dist/libs/contracts/dist/schema/dist/index.js +3873 -6
- package/dist/libs/contracts/dist/schema/dist/index.js.map +1 -0
- package/dist/libs/contracts/dist/spec.js +2 -1
- package/dist/libs/contracts/dist/spec.js.map +1 -0
- package/dist/libs/schema/dist/index.js +4889 -6
- package/dist/libs/schema/dist/index.js.map +1 -0
- package/dist/track-spec.d.ts +2 -1
- package/dist/track-spec.d.ts.map +1 -0
- package/package.json +13 -6
- package/dist/libs/contracts/dist/docs/PUBLISHING.docblock.js +0 -16
- package/dist/libs/contracts/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +0 -16
- package/dist/libs/contracts/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +0 -16
- package/dist/libs/contracts/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +0 -16
- package/dist/libs/contracts/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +0 -16
- package/dist/libs/contracts/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +0 -16
- package/dist/libs/contracts/dist/schema/dist/EnumType.js +0 -2
- package/dist/libs/contracts/dist/schema/dist/FieldType.js +0 -49
- package/dist/libs/contracts/dist/schema/dist/ScalarTypeEnum.js +0 -236
- package/dist/libs/contracts/dist/schema/dist/SchemaModel.js +0 -34
- package/dist/libs/contracts/dist/schema/dist/entity/defineEntity.js +0 -1
- package/dist/libs/contracts/dist/schema/dist/entity/index.js +0 -2
- package/dist/libs/contracts/dist/schema/dist/entity/types.js +0 -1
- package/dist/libs/schema/dist/EnumType.js +0 -2
- package/dist/libs/schema/dist/FieldType.js +0 -49
- package/dist/libs/schema/dist/ScalarTypeEnum.js +0 -236
- package/dist/libs/schema/dist/SchemaModel.js +0 -39
- package/dist/libs/schema/dist/entity/defineEntity.js +0 -236
- package/dist/libs/schema/dist/entity/index.js +0 -2
- package/dist/libs/schema/dist/entity/types.js +0 -1
package/dist/entities/ai.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import "../libs/schema/dist/index.js";
|
|
1
|
+
import { L5, Z5, _5, b5 } from "../libs/schema/dist/index.js";
|
|
3
2
|
|
|
4
3
|
//#region src/entities/ai.ts
|
|
5
4
|
/**
|
|
6
5
|
* Learning style enum.
|
|
7
6
|
*/
|
|
8
|
-
const LearningStyleEnum =
|
|
7
|
+
const LearningStyleEnum = Z5({
|
|
9
8
|
name: "LearningStyle",
|
|
10
9
|
values: [
|
|
11
10
|
"VISUAL",
|
|
@@ -20,7 +19,7 @@ const LearningStyleEnum = defineEntityEnum({
|
|
|
20
19
|
/**
|
|
21
20
|
* Recommendation type enum.
|
|
22
21
|
*/
|
|
23
|
-
const RecommendationTypeEnum =
|
|
22
|
+
const RecommendationTypeEnum = Z5({
|
|
24
23
|
name: "RecommendationType",
|
|
25
24
|
values: [
|
|
26
25
|
"COURSE",
|
|
@@ -36,331 +35,331 @@ const RecommendationTypeEnum = defineEntityEnum({
|
|
|
36
35
|
/**
|
|
37
36
|
* LearnerProfile entity - AI personalization profile.
|
|
38
37
|
*/
|
|
39
|
-
const LearnerProfileEntity =
|
|
38
|
+
const LearnerProfileEntity = L5({
|
|
40
39
|
name: "LearnerProfile",
|
|
41
40
|
description: "AI personalization profile for a learner.",
|
|
42
41
|
schema: "lssm_learning",
|
|
43
42
|
map: "learner_profile",
|
|
44
43
|
fields: {
|
|
45
|
-
id:
|
|
46
|
-
learnerId:
|
|
47
|
-
learningStyle:
|
|
44
|
+
id: _5.id({ description: "Unique profile identifier" }),
|
|
45
|
+
learnerId: _5.foreignKey({ description: "Learner" }),
|
|
46
|
+
learningStyle: _5.enum("LearningStyle", {
|
|
48
47
|
default: "MIXED",
|
|
49
48
|
description: "Preferred learning style"
|
|
50
49
|
}),
|
|
51
|
-
preferredDifficulty:
|
|
50
|
+
preferredDifficulty: _5.string({
|
|
52
51
|
default: "\"adaptive\"",
|
|
53
52
|
description: "Difficulty preference"
|
|
54
53
|
}),
|
|
55
|
-
preferredSessionLength:
|
|
54
|
+
preferredSessionLength: _5.int({
|
|
56
55
|
default: 30,
|
|
57
56
|
description: "Preferred session length in minutes"
|
|
58
57
|
}),
|
|
59
|
-
interests:
|
|
58
|
+
interests: _5.json({
|
|
60
59
|
isOptional: true,
|
|
61
60
|
description: "Topic interests"
|
|
62
61
|
}),
|
|
63
|
-
goals:
|
|
62
|
+
goals: _5.json({
|
|
64
63
|
isOptional: true,
|
|
65
64
|
description: "Learning goals"
|
|
66
65
|
}),
|
|
67
|
-
pacePreference:
|
|
66
|
+
pacePreference: _5.string({
|
|
68
67
|
default: "\"normal\"",
|
|
69
68
|
description: "Learning pace: slow, normal, fast"
|
|
70
69
|
}),
|
|
71
|
-
bestTimeOfDay:
|
|
70
|
+
bestTimeOfDay: _5.string({
|
|
72
71
|
isOptional: true,
|
|
73
72
|
description: "Best time for learning"
|
|
74
73
|
}),
|
|
75
|
-
averageSessionLength:
|
|
74
|
+
averageSessionLength: _5.int({
|
|
76
75
|
isOptional: true,
|
|
77
76
|
description: "Average session length"
|
|
78
77
|
}),
|
|
79
|
-
daysActivePerWeek:
|
|
78
|
+
daysActivePerWeek: _5.int({
|
|
80
79
|
isOptional: true,
|
|
81
80
|
description: "Days active per week"
|
|
82
81
|
}),
|
|
83
|
-
avgQuizScore:
|
|
82
|
+
avgQuizScore: _5.int({
|
|
84
83
|
isOptional: true,
|
|
85
84
|
description: "Average quiz score"
|
|
86
85
|
}),
|
|
87
|
-
avgLessonCompletionTime:
|
|
86
|
+
avgLessonCompletionTime: _5.int({
|
|
88
87
|
isOptional: true,
|
|
89
88
|
description: "Avg lesson completion time"
|
|
90
89
|
}),
|
|
91
|
-
strengths:
|
|
90
|
+
strengths: _5.json({
|
|
92
91
|
isOptional: true,
|
|
93
92
|
description: "Identified strengths"
|
|
94
93
|
}),
|
|
95
|
-
weaknesses:
|
|
94
|
+
weaknesses: _5.json({
|
|
96
95
|
isOptional: true,
|
|
97
96
|
description: "Areas for improvement"
|
|
98
97
|
}),
|
|
99
|
-
lastAnalyzedAt:
|
|
98
|
+
lastAnalyzedAt: _5.dateTime({
|
|
100
99
|
isOptional: true,
|
|
101
100
|
description: "Last AI analysis"
|
|
102
101
|
}),
|
|
103
|
-
metadata:
|
|
102
|
+
metadata: _5.json({
|
|
104
103
|
isOptional: true,
|
|
105
104
|
description: "Additional metadata"
|
|
106
105
|
}),
|
|
107
|
-
createdAt:
|
|
108
|
-
updatedAt:
|
|
109
|
-
learner:
|
|
106
|
+
createdAt: _5.createdAt(),
|
|
107
|
+
updatedAt: _5.updatedAt(),
|
|
108
|
+
learner: _5.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
|
|
110
109
|
},
|
|
111
|
-
indexes: [
|
|
110
|
+
indexes: [b5.unique(["learnerId"], { name: "learner_profile_unique" }), b5.on(["learningStyle"])],
|
|
112
111
|
enums: [LearningStyleEnum]
|
|
113
112
|
});
|
|
114
113
|
/**
|
|
115
114
|
* SkillMap entity - tracks skill proficiency.
|
|
116
115
|
*/
|
|
117
|
-
const SkillMapEntity =
|
|
116
|
+
const SkillMapEntity = L5({
|
|
118
117
|
name: "SkillMap",
|
|
119
118
|
description: "Maps learner proficiency across skills.",
|
|
120
119
|
schema: "lssm_learning",
|
|
121
120
|
map: "skill_map",
|
|
122
121
|
fields: {
|
|
123
|
-
id:
|
|
124
|
-
learnerId:
|
|
125
|
-
skillId:
|
|
126
|
-
skillName:
|
|
127
|
-
skillCategory:
|
|
122
|
+
id: _5.id({ description: "Unique skill map identifier" }),
|
|
123
|
+
learnerId: _5.foreignKey({ description: "Learner" }),
|
|
124
|
+
skillId: _5.string({ description: "Skill identifier" }),
|
|
125
|
+
skillName: _5.string({ description: "Skill name" }),
|
|
126
|
+
skillCategory: _5.string({
|
|
128
127
|
isOptional: true,
|
|
129
128
|
description: "Skill category"
|
|
130
129
|
}),
|
|
131
|
-
level:
|
|
130
|
+
level: _5.int({
|
|
132
131
|
default: 0,
|
|
133
132
|
description: "Proficiency level (0-100)"
|
|
134
133
|
}),
|
|
135
|
-
confidence:
|
|
134
|
+
confidence: _5.decimal({
|
|
136
135
|
default: .5,
|
|
137
136
|
description: "Confidence in assessment"
|
|
138
137
|
}),
|
|
139
|
-
lessonsCompleted:
|
|
138
|
+
lessonsCompleted: _5.int({
|
|
140
139
|
default: 0,
|
|
141
140
|
description: "Related lessons completed"
|
|
142
141
|
}),
|
|
143
|
-
quizzesCompleted:
|
|
142
|
+
quizzesCompleted: _5.int({
|
|
144
143
|
default: 0,
|
|
145
144
|
description: "Related quizzes completed"
|
|
146
145
|
}),
|
|
147
|
-
practiceTime:
|
|
146
|
+
practiceTime: _5.int({
|
|
148
147
|
default: 0,
|
|
149
148
|
description: "Practice time in minutes"
|
|
150
149
|
}),
|
|
151
|
-
lastPracticedAt:
|
|
150
|
+
lastPracticedAt: _5.dateTime({
|
|
152
151
|
isOptional: true,
|
|
153
152
|
description: "Last practice time"
|
|
154
153
|
}),
|
|
155
|
-
learningVelocity:
|
|
154
|
+
learningVelocity: _5.decimal({
|
|
156
155
|
isOptional: true,
|
|
157
156
|
description: "Learning speed for this skill"
|
|
158
157
|
}),
|
|
159
|
-
predictedTimeToMastery:
|
|
158
|
+
predictedTimeToMastery: _5.int({
|
|
160
159
|
isOptional: true,
|
|
161
160
|
description: "Predicted time to mastery (minutes)"
|
|
162
161
|
}),
|
|
163
|
-
createdAt:
|
|
164
|
-
updatedAt:
|
|
165
|
-
learner:
|
|
162
|
+
createdAt: _5.createdAt(),
|
|
163
|
+
updatedAt: _5.updatedAt(),
|
|
164
|
+
learner: _5.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
|
|
166
165
|
},
|
|
167
166
|
indexes: [
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
167
|
+
b5.unique(["learnerId", "skillId"], { name: "skill_map_unique" }),
|
|
168
|
+
b5.on(["skillId", "level"]),
|
|
169
|
+
b5.on(["learnerId", "level"])
|
|
171
170
|
]
|
|
172
171
|
});
|
|
173
172
|
/**
|
|
174
173
|
* LearningPath entity - AI-generated learning paths.
|
|
175
174
|
*/
|
|
176
|
-
const LearningPathEntity =
|
|
175
|
+
const LearningPathEntity = L5({
|
|
177
176
|
name: "LearningPath",
|
|
178
177
|
description: "AI-generated personalized learning path.",
|
|
179
178
|
schema: "lssm_learning",
|
|
180
179
|
map: "learning_path",
|
|
181
180
|
fields: {
|
|
182
|
-
id:
|
|
183
|
-
learnerId:
|
|
184
|
-
name:
|
|
185
|
-
description:
|
|
181
|
+
id: _5.id({ description: "Unique path identifier" }),
|
|
182
|
+
learnerId: _5.foreignKey({ description: "Learner" }),
|
|
183
|
+
name: _5.string({ description: "Path name" }),
|
|
184
|
+
description: _5.string({
|
|
186
185
|
isOptional: true,
|
|
187
186
|
description: "Path description"
|
|
188
187
|
}),
|
|
189
|
-
goal:
|
|
188
|
+
goal: _5.string({
|
|
190
189
|
isOptional: true,
|
|
191
190
|
description: "Path goal"
|
|
192
191
|
}),
|
|
193
|
-
steps:
|
|
194
|
-
currentStepIndex:
|
|
192
|
+
steps: _5.json({ description: "Ordered list of learning steps" }),
|
|
193
|
+
currentStepIndex: _5.int({
|
|
195
194
|
default: 0,
|
|
196
195
|
description: "Current step index"
|
|
197
196
|
}),
|
|
198
|
-
progress:
|
|
197
|
+
progress: _5.int({
|
|
199
198
|
default: 0,
|
|
200
199
|
description: "Completion percentage"
|
|
201
200
|
}),
|
|
202
|
-
completedSteps:
|
|
201
|
+
completedSteps: _5.int({
|
|
203
202
|
default: 0,
|
|
204
203
|
description: "Steps completed"
|
|
205
204
|
}),
|
|
206
|
-
totalSteps:
|
|
205
|
+
totalSteps: _5.int({
|
|
207
206
|
default: 0,
|
|
208
207
|
description: "Total steps"
|
|
209
208
|
}),
|
|
210
|
-
generatedAt:
|
|
211
|
-
adaptedFrom:
|
|
209
|
+
generatedAt: _5.dateTime({ description: "When path was generated" }),
|
|
210
|
+
adaptedFrom: _5.string({
|
|
212
211
|
isOptional: true,
|
|
213
212
|
description: "Original path ID if adapted"
|
|
214
213
|
}),
|
|
215
|
-
generationParams:
|
|
214
|
+
generationParams: _5.json({
|
|
216
215
|
isOptional: true,
|
|
217
216
|
description: "AI generation parameters"
|
|
218
217
|
}),
|
|
219
|
-
adaptationHistory:
|
|
218
|
+
adaptationHistory: _5.json({
|
|
220
219
|
isOptional: true,
|
|
221
220
|
description: "Path adaptation history"
|
|
222
221
|
}),
|
|
223
|
-
isActive:
|
|
222
|
+
isActive: _5.boolean({
|
|
224
223
|
default: true,
|
|
225
224
|
description: "Whether path is active"
|
|
226
225
|
}),
|
|
227
|
-
isCompleted:
|
|
226
|
+
isCompleted: _5.boolean({
|
|
228
227
|
default: false,
|
|
229
228
|
description: "Whether path is completed"
|
|
230
229
|
}),
|
|
231
|
-
startedAt:
|
|
230
|
+
startedAt: _5.dateTime({
|
|
232
231
|
isOptional: true,
|
|
233
232
|
description: "When started"
|
|
234
233
|
}),
|
|
235
|
-
completedAt:
|
|
234
|
+
completedAt: _5.dateTime({
|
|
236
235
|
isOptional: true,
|
|
237
236
|
description: "When completed"
|
|
238
237
|
}),
|
|
239
|
-
estimatedCompletionDate:
|
|
238
|
+
estimatedCompletionDate: _5.dateTime({
|
|
240
239
|
isOptional: true,
|
|
241
240
|
description: "Estimated completion"
|
|
242
241
|
}),
|
|
243
|
-
createdAt:
|
|
244
|
-
updatedAt:
|
|
245
|
-
learner:
|
|
242
|
+
createdAt: _5.createdAt(),
|
|
243
|
+
updatedAt: _5.updatedAt(),
|
|
244
|
+
learner: _5.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
|
|
246
245
|
},
|
|
247
|
-
indexes: [
|
|
246
|
+
indexes: [b5.on(["learnerId", "isActive"]), b5.on(["generatedAt"])]
|
|
248
247
|
});
|
|
249
248
|
/**
|
|
250
249
|
* Recommendation entity - AI-powered learning recommendations.
|
|
251
250
|
*/
|
|
252
|
-
const RecommendationEntity =
|
|
251
|
+
const RecommendationEntity = L5({
|
|
253
252
|
name: "Recommendation",
|
|
254
253
|
description: "AI-powered learning recommendation.",
|
|
255
254
|
schema: "lssm_learning",
|
|
256
255
|
map: "recommendation",
|
|
257
256
|
fields: {
|
|
258
|
-
id:
|
|
259
|
-
learnerId:
|
|
260
|
-
type:
|
|
261
|
-
itemId:
|
|
262
|
-
itemType:
|
|
263
|
-
score:
|
|
264
|
-
confidence:
|
|
265
|
-
reason:
|
|
266
|
-
factors:
|
|
257
|
+
id: _5.id({ description: "Unique recommendation identifier" }),
|
|
258
|
+
learnerId: _5.foreignKey({ description: "Learner" }),
|
|
259
|
+
type: _5.enum("RecommendationType", { description: "Recommendation type" }),
|
|
260
|
+
itemId: _5.string({ description: "Recommended item ID" }),
|
|
261
|
+
itemType: _5.string({ description: "Item type (course, lesson, deck, etc.)" }),
|
|
262
|
+
score: _5.decimal({ description: "Recommendation score (0-1)" }),
|
|
263
|
+
confidence: _5.decimal({ description: "Confidence in recommendation" }),
|
|
264
|
+
reason: _5.string({ description: "Human-readable reason" }),
|
|
265
|
+
factors: _5.json({
|
|
267
266
|
isOptional: true,
|
|
268
267
|
description: "Factors that contributed to recommendation"
|
|
269
268
|
}),
|
|
270
|
-
status:
|
|
269
|
+
status: _5.string({
|
|
271
270
|
default: "\"pending\"",
|
|
272
271
|
description: "Status: pending, viewed, accepted, dismissed"
|
|
273
272
|
}),
|
|
274
|
-
viewedAt:
|
|
273
|
+
viewedAt: _5.dateTime({
|
|
275
274
|
isOptional: true,
|
|
276
275
|
description: "When viewed"
|
|
277
276
|
}),
|
|
278
|
-
acceptedAt:
|
|
277
|
+
acceptedAt: _5.dateTime({
|
|
279
278
|
isOptional: true,
|
|
280
279
|
description: "When accepted"
|
|
281
280
|
}),
|
|
282
|
-
dismissedAt:
|
|
281
|
+
dismissedAt: _5.dateTime({
|
|
283
282
|
isOptional: true,
|
|
284
283
|
description: "When dismissed"
|
|
285
284
|
}),
|
|
286
|
-
feedback:
|
|
285
|
+
feedback: _5.string({
|
|
287
286
|
isOptional: true,
|
|
288
287
|
description: "User feedback"
|
|
289
288
|
}),
|
|
290
|
-
feedbackRating:
|
|
289
|
+
feedbackRating: _5.int({
|
|
291
290
|
isOptional: true,
|
|
292
291
|
description: "Feedback rating (1-5)"
|
|
293
292
|
}),
|
|
294
|
-
expiresAt:
|
|
293
|
+
expiresAt: _5.dateTime({
|
|
295
294
|
isOptional: true,
|
|
296
295
|
description: "When recommendation expires"
|
|
297
296
|
}),
|
|
298
|
-
createdAt:
|
|
299
|
-
updatedAt:
|
|
300
|
-
learner:
|
|
297
|
+
createdAt: _5.createdAt(),
|
|
298
|
+
updatedAt: _5.updatedAt(),
|
|
299
|
+
learner: _5.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
|
|
301
300
|
},
|
|
302
301
|
indexes: [
|
|
303
|
-
|
|
302
|
+
b5.on([
|
|
304
303
|
"learnerId",
|
|
305
304
|
"status",
|
|
306
305
|
"score"
|
|
307
306
|
]),
|
|
308
|
-
|
|
309
|
-
|
|
307
|
+
b5.on(["type", "status"]),
|
|
308
|
+
b5.on(["expiresAt"])
|
|
310
309
|
],
|
|
311
310
|
enums: [RecommendationTypeEnum]
|
|
312
311
|
});
|
|
313
312
|
/**
|
|
314
313
|
* LearningGap entity - identified knowledge gaps.
|
|
315
314
|
*/
|
|
316
|
-
const LearningGapEntity =
|
|
315
|
+
const LearningGapEntity = L5({
|
|
317
316
|
name: "LearningGap",
|
|
318
317
|
description: "Identified learning gap.",
|
|
319
318
|
schema: "lssm_learning",
|
|
320
319
|
map: "learning_gap",
|
|
321
320
|
fields: {
|
|
322
|
-
id:
|
|
323
|
-
learnerId:
|
|
324
|
-
skillId:
|
|
325
|
-
skillName:
|
|
326
|
-
severity:
|
|
321
|
+
id: _5.id({ description: "Unique gap identifier" }),
|
|
322
|
+
learnerId: _5.foreignKey({ description: "Learner" }),
|
|
323
|
+
skillId: _5.string({ description: "Skill with gap" }),
|
|
324
|
+
skillName: _5.string({ description: "Skill name" }),
|
|
325
|
+
severity: _5.string({
|
|
327
326
|
default: "\"moderate\"",
|
|
328
327
|
description: "Gap severity: minor, moderate, major"
|
|
329
328
|
}),
|
|
330
|
-
confidence:
|
|
331
|
-
evidence:
|
|
329
|
+
confidence: _5.decimal({ description: "Confidence in gap detection" }),
|
|
330
|
+
evidence: _5.json({
|
|
332
331
|
isOptional: true,
|
|
333
332
|
description: "Evidence for gap"
|
|
334
333
|
}),
|
|
335
|
-
relatedQuestions:
|
|
334
|
+
relatedQuestions: _5.json({
|
|
336
335
|
isOptional: true,
|
|
337
336
|
description: "Questions that revealed gap"
|
|
338
337
|
}),
|
|
339
|
-
suggestedRemediation:
|
|
338
|
+
suggestedRemediation: _5.json({
|
|
340
339
|
isOptional: true,
|
|
341
340
|
description: "Suggested remediation"
|
|
342
341
|
}),
|
|
343
|
-
remediationProgress:
|
|
342
|
+
remediationProgress: _5.int({
|
|
344
343
|
default: 0,
|
|
345
344
|
description: "Remediation progress"
|
|
346
345
|
}),
|
|
347
|
-
status:
|
|
346
|
+
status: _5.string({
|
|
348
347
|
default: "\"open\"",
|
|
349
348
|
description: "Status: open, in_progress, resolved"
|
|
350
349
|
}),
|
|
351
|
-
resolvedAt:
|
|
350
|
+
resolvedAt: _5.dateTime({
|
|
352
351
|
isOptional: true,
|
|
353
352
|
description: "When resolved"
|
|
354
353
|
}),
|
|
355
|
-
detectedAt:
|
|
356
|
-
createdAt:
|
|
357
|
-
updatedAt:
|
|
358
|
-
learner:
|
|
354
|
+
detectedAt: _5.dateTime({ description: "When gap was detected" }),
|
|
355
|
+
createdAt: _5.createdAt(),
|
|
356
|
+
updatedAt: _5.updatedAt(),
|
|
357
|
+
learner: _5.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
|
|
359
358
|
},
|
|
360
359
|
indexes: [
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
360
|
+
b5.on(["learnerId", "status"]),
|
|
361
|
+
b5.on(["skillId", "status"]),
|
|
362
|
+
b5.on(["severity", "status"])
|
|
364
363
|
]
|
|
365
364
|
});
|
|
366
365
|
const aiEntities = [
|
|
@@ -373,4 +372,5 @@ const aiEntities = [
|
|
|
373
372
|
const aiEnums = [LearningStyleEnum, RecommendationTypeEnum];
|
|
374
373
|
|
|
375
374
|
//#endregion
|
|
376
|
-
export { LearnerProfileEntity, LearningGapEntity, LearningPathEntity, LearningStyleEnum, RecommendationEntity, RecommendationTypeEnum, SkillMapEntity, aiEntities, aiEnums };
|
|
375
|
+
export { LearnerProfileEntity, LearningGapEntity, LearningPathEntity, LearningStyleEnum, RecommendationEntity, RecommendationTypeEnum, SkillMapEntity, aiEntities, aiEnums };
|
|
376
|
+
//# sourceMappingURL=ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.js","names":["defineEntityEnum","defineEntity","field","index"],"sources":["../../src/entities/ai.ts"],"sourcesContent":["import { defineEntity, defineEntityEnum, field, index } from '@lssm/lib.schema';\n\n/**\n * Learning style enum.\n */\nexport const LearningStyleEnum = defineEntityEnum({\n name: 'LearningStyle',\n values: ['VISUAL', 'AUDITORY', 'READING', 'KINESTHETIC', 'MIXED'] as const,\n schema: 'lssm_learning',\n description: 'Preferred learning style.',\n});\n\n/**\n * Recommendation type enum.\n */\nexport const RecommendationTypeEnum = defineEntityEnum({\n name: 'RecommendationType',\n values: [\n 'COURSE',\n 'LESSON',\n 'REVIEW',\n 'PRACTICE',\n 'ASSESSMENT',\n 'DECK',\n ] as const,\n schema: 'lssm_learning',\n description: 'Type of learning recommendation.',\n});\n\n/**\n * LearnerProfile entity - AI personalization profile.\n */\nexport const LearnerProfileEntity = defineEntity({\n name: 'LearnerProfile',\n description: 'AI personalization profile for a learner.',\n schema: 'lssm_learning',\n map: 'learner_profile',\n fields: {\n id: field.id({ description: 'Unique profile identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n\n // Learning preferences\n learningStyle: field.enum('LearningStyle', {\n default: 'MIXED',\n description: 'Preferred learning style',\n }),\n preferredDifficulty: field.string({\n default: '\"adaptive\"',\n description: 'Difficulty preference',\n }),\n preferredSessionLength: field.int({\n default: 30,\n description: 'Preferred session length in minutes',\n }),\n\n // Interests and goals\n interests: field.json({ isOptional: true, description: 'Topic interests' }),\n goals: field.json({ isOptional: true, description: 'Learning goals' }),\n\n // Pace\n pacePreference: field.string({\n default: '\"normal\"',\n description: 'Learning pace: slow, normal, fast',\n }),\n\n // Engagement patterns\n bestTimeOfDay: field.string({\n isOptional: true,\n description: 'Best time for learning',\n }),\n averageSessionLength: field.int({\n isOptional: true,\n description: 'Average session length',\n }),\n daysActivePerWeek: field.int({\n isOptional: true,\n description: 'Days active per week',\n }),\n\n // Performance\n avgQuizScore: field.int({\n isOptional: true,\n description: 'Average quiz score',\n }),\n avgLessonCompletionTime: field.int({\n isOptional: true,\n description: 'Avg lesson completion time',\n }),\n\n // AI analysis\n strengths: field.json({\n isOptional: true,\n description: 'Identified strengths',\n }),\n weaknesses: field.json({\n isOptional: true,\n description: 'Areas for improvement',\n }),\n\n // Metadata\n lastAnalyzedAt: field.dateTime({\n isOptional: true,\n description: 'Last AI analysis',\n }),\n metadata: field.json({\n isOptional: true,\n description: 'Additional metadata',\n }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n learner: field.belongsTo('Learner', ['learnerId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.unique(['learnerId'], { name: 'learner_profile_unique' }),\n index.on(['learningStyle']),\n ],\n enums: [LearningStyleEnum],\n});\n\n/**\n * SkillMap entity - tracks skill proficiency.\n */\nexport const SkillMapEntity = defineEntity({\n name: 'SkillMap',\n description: 'Maps learner proficiency across skills.',\n schema: 'lssm_learning',\n map: 'skill_map',\n fields: {\n id: field.id({ description: 'Unique skill map identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n\n // Skill\n skillId: field.string({ description: 'Skill identifier' }),\n skillName: field.string({ description: 'Skill name' }),\n skillCategory: field.string({\n isOptional: true,\n description: 'Skill category',\n }),\n\n // Proficiency\n level: field.int({ default: 0, description: 'Proficiency level (0-100)' }),\n confidence: field.decimal({\n default: 0.5,\n description: 'Confidence in assessment',\n }),\n\n // Progress\n lessonsCompleted: field.int({\n default: 0,\n description: 'Related lessons completed',\n }),\n quizzesCompleted: field.int({\n default: 0,\n description: 'Related quizzes completed',\n }),\n practiceTime: field.int({\n default: 0,\n description: 'Practice time in minutes',\n }),\n\n // Last activity\n lastPracticedAt: field.dateTime({\n isOptional: true,\n description: 'Last practice time',\n }),\n\n // AI analysis\n learningVelocity: field.decimal({\n isOptional: true,\n description: 'Learning speed for this skill',\n }),\n predictedTimeToMastery: field.int({\n isOptional: true,\n description: 'Predicted time to mastery (minutes)',\n }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n learner: field.belongsTo('Learner', ['learnerId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.unique(['learnerId', 'skillId'], { name: 'skill_map_unique' }),\n index.on(['skillId', 'level']),\n index.on(['learnerId', 'level']),\n ],\n});\n\n/**\n * LearningPath entity - AI-generated learning paths.\n */\nexport const LearningPathEntity = defineEntity({\n name: 'LearningPath',\n description: 'AI-generated personalized learning path.',\n schema: 'lssm_learning',\n map: 'learning_path',\n fields: {\n id: field.id({ description: 'Unique path identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n\n // Path info\n name: field.string({ description: 'Path name' }),\n description: field.string({\n isOptional: true,\n description: 'Path description',\n }),\n goal: field.string({ isOptional: true, description: 'Path goal' }),\n\n // Steps\n steps: field.json({ description: 'Ordered list of learning steps' }),\n currentStepIndex: field.int({\n default: 0,\n description: 'Current step index',\n }),\n\n // Progress\n progress: field.int({ default: 0, description: 'Completion percentage' }),\n completedSteps: field.int({ default: 0, description: 'Steps completed' }),\n totalSteps: field.int({ default: 0, description: 'Total steps' }),\n\n // Generation\n generatedAt: field.dateTime({ description: 'When path was generated' }),\n adaptedFrom: field.string({\n isOptional: true,\n description: 'Original path ID if adapted',\n }),\n\n // AI metadata\n generationParams: field.json({\n isOptional: true,\n description: 'AI generation parameters',\n }),\n adaptationHistory: field.json({\n isOptional: true,\n description: 'Path adaptation history',\n }),\n\n // Status\n isActive: field.boolean({\n default: true,\n description: 'Whether path is active',\n }),\n isCompleted: field.boolean({\n default: false,\n description: 'Whether path is completed',\n }),\n\n // Timeline\n startedAt: field.dateTime({\n isOptional: true,\n description: 'When started',\n }),\n completedAt: field.dateTime({\n isOptional: true,\n description: 'When completed',\n }),\n estimatedCompletionDate: field.dateTime({\n isOptional: true,\n description: 'Estimated completion',\n }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n learner: field.belongsTo('Learner', ['learnerId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [index.on(['learnerId', 'isActive']), index.on(['generatedAt'])],\n});\n\n/**\n * Recommendation entity - AI-powered learning recommendations.\n */\nexport const RecommendationEntity = defineEntity({\n name: 'Recommendation',\n description: 'AI-powered learning recommendation.',\n schema: 'lssm_learning',\n map: 'recommendation',\n fields: {\n id: field.id({ description: 'Unique recommendation identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n\n // Recommendation\n type: field.enum('RecommendationType', {\n description: 'Recommendation type',\n }),\n itemId: field.string({ description: 'Recommended item ID' }),\n itemType: field.string({\n description: 'Item type (course, lesson, deck, etc.)',\n }),\n\n // Scoring\n score: field.decimal({ description: 'Recommendation score (0-1)' }),\n confidence: field.decimal({ description: 'Confidence in recommendation' }),\n\n // Reasoning\n reason: field.string({ description: 'Human-readable reason' }),\n factors: field.json({\n isOptional: true,\n description: 'Factors that contributed to recommendation',\n }),\n\n // Status\n status: field.string({\n default: '\"pending\"',\n description: 'Status: pending, viewed, accepted, dismissed',\n }),\n viewedAt: field.dateTime({ isOptional: true, description: 'When viewed' }),\n acceptedAt: field.dateTime({\n isOptional: true,\n description: 'When accepted',\n }),\n dismissedAt: field.dateTime({\n isOptional: true,\n description: 'When dismissed',\n }),\n\n // Feedback\n feedback: field.string({ isOptional: true, description: 'User feedback' }),\n feedbackRating: field.int({\n isOptional: true,\n description: 'Feedback rating (1-5)',\n }),\n\n // Expiry\n expiresAt: field.dateTime({\n isOptional: true,\n description: 'When recommendation expires',\n }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n learner: field.belongsTo('Learner', ['learnerId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.on(['learnerId', 'status', 'score']),\n index.on(['type', 'status']),\n index.on(['expiresAt']),\n ],\n enums: [RecommendationTypeEnum],\n});\n\n/**\n * LearningGap entity - identified knowledge gaps.\n */\nexport const LearningGapEntity = defineEntity({\n name: 'LearningGap',\n description: 'Identified learning gap.',\n schema: 'lssm_learning',\n map: 'learning_gap',\n fields: {\n id: field.id({ description: 'Unique gap identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n\n // Gap info\n skillId: field.string({ description: 'Skill with gap' }),\n skillName: field.string({ description: 'Skill name' }),\n\n // Severity\n severity: field.string({\n default: '\"moderate\"',\n description: 'Gap severity: minor, moderate, major',\n }),\n confidence: field.decimal({ description: 'Confidence in gap detection' }),\n\n // Evidence\n evidence: field.json({ isOptional: true, description: 'Evidence for gap' }),\n relatedQuestions: field.json({\n isOptional: true,\n description: 'Questions that revealed gap',\n }),\n\n // Remediation\n suggestedRemediation: field.json({\n isOptional: true,\n description: 'Suggested remediation',\n }),\n remediationProgress: field.int({\n default: 0,\n description: 'Remediation progress',\n }),\n\n // Status\n status: field.string({\n default: '\"open\"',\n description: 'Status: open, in_progress, resolved',\n }),\n resolvedAt: field.dateTime({\n isOptional: true,\n description: 'When resolved',\n }),\n\n // Timestamps\n detectedAt: field.dateTime({ description: 'When gap was detected' }),\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n learner: field.belongsTo('Learner', ['learnerId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.on(['learnerId', 'status']),\n index.on(['skillId', 'status']),\n index.on(['severity', 'status']),\n ],\n});\n\nexport const aiEntities = [\n LearnerProfileEntity,\n SkillMapEntity,\n LearningPathEntity,\n RecommendationEntity,\n LearningGapEntity,\n];\n\nexport const aiEnums = [LearningStyleEnum, RecommendationTypeEnum];\n"],"mappings":"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"}
|