@lssm/module.learning-journey 0.0.0-canary-20251217080011 → 0.0.0-canary-20251219202229
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 +2 -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 +170 -169
- 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 +73 -72
- 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 +2 -1
- package/dist/engines/srs.d.ts.map +1 -0
- package/dist/engines/srs.js +2 -1
- 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 +216 -215
- 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 +7 -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
|
@@ -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/gamification.ts
|
|
5
4
|
/**
|
|
6
5
|
* Achievement type enum.
|
|
7
6
|
*/
|
|
8
|
-
const AchievementTypeEnum =
|
|
7
|
+
const AchievementTypeEnum = Z5({
|
|
9
8
|
name: "AchievementType",
|
|
10
9
|
values: [
|
|
11
10
|
"MILESTONE",
|
|
@@ -21,7 +20,7 @@ const AchievementTypeEnum = defineEntityEnum({
|
|
|
21
20
|
/**
|
|
22
21
|
* Leaderboard period enum.
|
|
23
22
|
*/
|
|
24
|
-
const LeaderboardPeriodEnum =
|
|
23
|
+
const LeaderboardPeriodEnum = Z5({
|
|
25
24
|
name: "LeaderboardPeriod",
|
|
26
25
|
values: [
|
|
27
26
|
"DAILY",
|
|
@@ -35,264 +34,264 @@ const LeaderboardPeriodEnum = defineEntityEnum({
|
|
|
35
34
|
/**
|
|
36
35
|
* Achievement entity - defines an achievement.
|
|
37
36
|
*/
|
|
38
|
-
const AchievementEntity =
|
|
37
|
+
const AchievementEntity = L5({
|
|
39
38
|
name: "Achievement",
|
|
40
39
|
description: "An achievement that can be unlocked.",
|
|
41
40
|
schema: "lssm_learning",
|
|
42
41
|
map: "achievement",
|
|
43
42
|
fields: {
|
|
44
|
-
id:
|
|
45
|
-
key:
|
|
43
|
+
id: _5.id({ description: "Unique achievement identifier" }),
|
|
44
|
+
key: _5.string({
|
|
46
45
|
isUnique: true,
|
|
47
46
|
description: "Achievement key"
|
|
48
47
|
}),
|
|
49
|
-
name:
|
|
50
|
-
description:
|
|
51
|
-
icon:
|
|
48
|
+
name: _5.string({ description: "Achievement name" }),
|
|
49
|
+
description: _5.string({ description: "Achievement description" }),
|
|
50
|
+
icon: _5.string({
|
|
52
51
|
isOptional: true,
|
|
53
52
|
description: "Icon name or URL"
|
|
54
53
|
}),
|
|
55
|
-
color:
|
|
54
|
+
color: _5.string({
|
|
56
55
|
isOptional: true,
|
|
57
56
|
description: "Display color"
|
|
58
57
|
}),
|
|
59
|
-
badgeUrl:
|
|
58
|
+
badgeUrl: _5.string({
|
|
60
59
|
isOptional: true,
|
|
61
60
|
description: "Badge image URL"
|
|
62
61
|
}),
|
|
63
|
-
type:
|
|
62
|
+
type: _5.enum("AchievementType", {
|
|
64
63
|
default: "MILESTONE",
|
|
65
64
|
description: "Achievement type"
|
|
66
65
|
}),
|
|
67
|
-
category:
|
|
66
|
+
category: _5.string({
|
|
68
67
|
isOptional: true,
|
|
69
68
|
description: "Achievement category"
|
|
70
69
|
}),
|
|
71
|
-
rarity:
|
|
70
|
+
rarity: _5.string({
|
|
72
71
|
default: "\"common\"",
|
|
73
72
|
description: "Rarity: common, rare, epic, legendary"
|
|
74
73
|
}),
|
|
75
|
-
xpReward:
|
|
74
|
+
xpReward: _5.int({
|
|
76
75
|
default: 50,
|
|
77
76
|
description: "XP awarded"
|
|
78
77
|
}),
|
|
79
|
-
condition:
|
|
80
|
-
order:
|
|
78
|
+
condition: _5.json({ description: "Unlock condition" }),
|
|
79
|
+
order: _5.int({
|
|
81
80
|
default: 0,
|
|
82
81
|
description: "Display order"
|
|
83
82
|
}),
|
|
84
|
-
isHidden:
|
|
83
|
+
isHidden: _5.boolean({
|
|
85
84
|
default: false,
|
|
86
85
|
description: "Hide until unlocked"
|
|
87
86
|
}),
|
|
88
|
-
isActive:
|
|
87
|
+
isActive: _5.boolean({
|
|
89
88
|
default: true,
|
|
90
89
|
description: "Whether achievement is active"
|
|
91
90
|
}),
|
|
92
|
-
orgId:
|
|
91
|
+
orgId: _5.string({
|
|
93
92
|
isOptional: true,
|
|
94
93
|
description: "Organization scope"
|
|
95
94
|
}),
|
|
96
|
-
metadata:
|
|
95
|
+
metadata: _5.json({
|
|
97
96
|
isOptional: true,
|
|
98
97
|
description: "Additional metadata"
|
|
99
98
|
}),
|
|
100
|
-
createdAt:
|
|
101
|
-
updatedAt:
|
|
102
|
-
learnerAchievements:
|
|
99
|
+
createdAt: _5.createdAt(),
|
|
100
|
+
updatedAt: _5.updatedAt(),
|
|
101
|
+
learnerAchievements: _5.hasMany("LearnerAchievement")
|
|
103
102
|
},
|
|
104
103
|
indexes: [
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
104
|
+
b5.on(["type"]),
|
|
105
|
+
b5.on(["category"]),
|
|
106
|
+
b5.on(["isActive"]),
|
|
107
|
+
b5.on(["orgId"])
|
|
109
108
|
],
|
|
110
109
|
enums: [AchievementTypeEnum]
|
|
111
110
|
});
|
|
112
111
|
/**
|
|
113
112
|
* LearnerAchievement entity - unlocked achievements.
|
|
114
113
|
*/
|
|
115
|
-
const LearnerAchievementEntity =
|
|
114
|
+
const LearnerAchievementEntity = L5({
|
|
116
115
|
name: "LearnerAchievement",
|
|
117
116
|
description: "An achievement unlocked by a learner.",
|
|
118
117
|
schema: "lssm_learning",
|
|
119
118
|
map: "learner_achievement",
|
|
120
119
|
fields: {
|
|
121
|
-
id:
|
|
122
|
-
learnerId:
|
|
123
|
-
achievementId:
|
|
124
|
-
xpEarned:
|
|
120
|
+
id: _5.id({ description: "Unique record identifier" }),
|
|
121
|
+
learnerId: _5.foreignKey({ description: "Learner" }),
|
|
122
|
+
achievementId: _5.foreignKey({ description: "Achievement" }),
|
|
123
|
+
xpEarned: _5.int({
|
|
125
124
|
default: 0,
|
|
126
125
|
description: "XP earned"
|
|
127
126
|
}),
|
|
128
|
-
progress:
|
|
127
|
+
progress: _5.int({
|
|
129
128
|
default: 100,
|
|
130
129
|
description: "Progress percentage"
|
|
131
130
|
}),
|
|
132
|
-
currentValue:
|
|
131
|
+
currentValue: _5.int({
|
|
133
132
|
isOptional: true,
|
|
134
133
|
description: "Current value towards goal"
|
|
135
134
|
}),
|
|
136
|
-
targetValue:
|
|
135
|
+
targetValue: _5.int({
|
|
137
136
|
isOptional: true,
|
|
138
137
|
description: "Target value for completion"
|
|
139
138
|
}),
|
|
140
|
-
unlockedAt:
|
|
141
|
-
createdAt:
|
|
142
|
-
learner:
|
|
143
|
-
achievement:
|
|
139
|
+
unlockedAt: _5.dateTime({ description: "When unlocked" }),
|
|
140
|
+
createdAt: _5.createdAt(),
|
|
141
|
+
learner: _5.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" }),
|
|
142
|
+
achievement: _5.belongsTo("Achievement", ["achievementId"], ["id"], { onDelete: "Cascade" })
|
|
144
143
|
},
|
|
145
144
|
indexes: [
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
145
|
+
b5.unique(["learnerId", "achievementId"], { name: "learner_achievement_unique" }),
|
|
146
|
+
b5.on(["learnerId", "unlockedAt"]),
|
|
147
|
+
b5.on(["achievementId"])
|
|
149
148
|
]
|
|
150
149
|
});
|
|
151
150
|
/**
|
|
152
151
|
* Streak entity - tracks daily learning streaks.
|
|
153
152
|
*/
|
|
154
|
-
const StreakEntity =
|
|
153
|
+
const StreakEntity = L5({
|
|
155
154
|
name: "Streak",
|
|
156
155
|
description: "Tracks daily learning streaks.",
|
|
157
156
|
schema: "lssm_learning",
|
|
158
157
|
map: "streak",
|
|
159
158
|
fields: {
|
|
160
|
-
id:
|
|
161
|
-
learnerId:
|
|
162
|
-
currentStreak:
|
|
159
|
+
id: _5.id({ description: "Unique streak identifier" }),
|
|
160
|
+
learnerId: _5.foreignKey({ description: "Learner" }),
|
|
161
|
+
currentStreak: _5.int({
|
|
163
162
|
default: 0,
|
|
164
163
|
description: "Current streak days"
|
|
165
164
|
}),
|
|
166
|
-
longestStreak:
|
|
165
|
+
longestStreak: _5.int({
|
|
167
166
|
default: 0,
|
|
168
167
|
description: "Longest streak ever"
|
|
169
168
|
}),
|
|
170
|
-
lastActivityAt:
|
|
169
|
+
lastActivityAt: _5.dateTime({
|
|
171
170
|
isOptional: true,
|
|
172
171
|
description: "Last learning activity"
|
|
173
172
|
}),
|
|
174
|
-
lastActivityDate:
|
|
173
|
+
lastActivityDate: _5.string({
|
|
175
174
|
isOptional: true,
|
|
176
175
|
description: "Last activity date (YYYY-MM-DD)"
|
|
177
176
|
}),
|
|
178
|
-
freezesRemaining:
|
|
177
|
+
freezesRemaining: _5.int({
|
|
179
178
|
default: 0,
|
|
180
179
|
description: "Streak freezes available"
|
|
181
180
|
}),
|
|
182
|
-
freezeUsedAt:
|
|
181
|
+
freezeUsedAt: _5.dateTime({
|
|
183
182
|
isOptional: true,
|
|
184
183
|
description: "When last freeze was used"
|
|
185
184
|
}),
|
|
186
|
-
streakHistory:
|
|
185
|
+
streakHistory: _5.json({
|
|
187
186
|
isOptional: true,
|
|
188
187
|
description: "Historical streak data"
|
|
189
188
|
}),
|
|
190
|
-
createdAt:
|
|
191
|
-
updatedAt:
|
|
192
|
-
learner:
|
|
189
|
+
createdAt: _5.createdAt(),
|
|
190
|
+
updatedAt: _5.updatedAt(),
|
|
191
|
+
learner: _5.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
|
|
193
192
|
},
|
|
194
193
|
indexes: [
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
194
|
+
b5.unique(["learnerId"], { name: "streak_learner_unique" }),
|
|
195
|
+
b5.on(["currentStreak"]),
|
|
196
|
+
b5.on(["longestStreak"])
|
|
198
197
|
]
|
|
199
198
|
});
|
|
200
199
|
/**
|
|
201
200
|
* DailyGoal entity - tracks daily XP goals.
|
|
202
201
|
*/
|
|
203
|
-
const DailyGoalEntity =
|
|
202
|
+
const DailyGoalEntity = L5({
|
|
204
203
|
name: "DailyGoal",
|
|
205
204
|
description: "Daily XP goal tracking.",
|
|
206
205
|
schema: "lssm_learning",
|
|
207
206
|
map: "daily_goal",
|
|
208
207
|
fields: {
|
|
209
|
-
id:
|
|
210
|
-
learnerId:
|
|
211
|
-
date:
|
|
212
|
-
targetXp:
|
|
213
|
-
currentXp:
|
|
208
|
+
id: _5.id({ description: "Unique goal identifier" }),
|
|
209
|
+
learnerId: _5.foreignKey({ description: "Learner" }),
|
|
210
|
+
date: _5.string({ description: "Date (YYYY-MM-DD)" }),
|
|
211
|
+
targetXp: _5.int({ description: "Target XP for the day" }),
|
|
212
|
+
currentXp: _5.int({
|
|
214
213
|
default: 0,
|
|
215
214
|
description: "XP earned today"
|
|
216
215
|
}),
|
|
217
|
-
isCompleted:
|
|
216
|
+
isCompleted: _5.boolean({
|
|
218
217
|
default: false,
|
|
219
218
|
description: "Whether goal was met"
|
|
220
219
|
}),
|
|
221
|
-
completedAt:
|
|
220
|
+
completedAt: _5.dateTime({
|
|
222
221
|
isOptional: true,
|
|
223
222
|
description: "When goal was completed"
|
|
224
223
|
}),
|
|
225
|
-
xpBreakdown:
|
|
224
|
+
xpBreakdown: _5.json({
|
|
226
225
|
isOptional: true,
|
|
227
226
|
description: "XP sources breakdown"
|
|
228
227
|
}),
|
|
229
|
-
createdAt:
|
|
230
|
-
updatedAt:
|
|
231
|
-
learner:
|
|
228
|
+
createdAt: _5.createdAt(),
|
|
229
|
+
updatedAt: _5.updatedAt(),
|
|
230
|
+
learner: _5.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
|
|
232
231
|
},
|
|
233
|
-
indexes: [
|
|
232
|
+
indexes: [b5.unique(["learnerId", "date"], { name: "daily_goal_unique" }), b5.on(["date", "isCompleted"])]
|
|
234
233
|
});
|
|
235
234
|
/**
|
|
236
235
|
* LeaderboardEntry entity - leaderboard rankings.
|
|
237
236
|
*/
|
|
238
|
-
const LeaderboardEntryEntity =
|
|
237
|
+
const LeaderboardEntryEntity = L5({
|
|
239
238
|
name: "LeaderboardEntry",
|
|
240
239
|
description: "Leaderboard entry for a learner.",
|
|
241
240
|
schema: "lssm_learning",
|
|
242
241
|
map: "leaderboard_entry",
|
|
243
242
|
fields: {
|
|
244
|
-
id:
|
|
245
|
-
learnerId:
|
|
246
|
-
periodType:
|
|
247
|
-
periodKey:
|
|
248
|
-
xp:
|
|
243
|
+
id: _5.id({ description: "Unique entry identifier" }),
|
|
244
|
+
learnerId: _5.foreignKey({ description: "Learner" }),
|
|
245
|
+
periodType: _5.enum("LeaderboardPeriod", { description: "Period type" }),
|
|
246
|
+
periodKey: _5.string({ description: "Period key (e.g., 2024-W01)" }),
|
|
247
|
+
xp: _5.int({
|
|
249
248
|
default: 0,
|
|
250
249
|
description: "XP earned in period"
|
|
251
250
|
}),
|
|
252
|
-
rank:
|
|
251
|
+
rank: _5.int({
|
|
253
252
|
isOptional: true,
|
|
254
253
|
description: "Rank in leaderboard"
|
|
255
254
|
}),
|
|
256
|
-
lessonsCompleted:
|
|
255
|
+
lessonsCompleted: _5.int({
|
|
257
256
|
default: 0,
|
|
258
257
|
description: "Lessons completed"
|
|
259
258
|
}),
|
|
260
|
-
quizzesPassed:
|
|
259
|
+
quizzesPassed: _5.int({
|
|
261
260
|
default: 0,
|
|
262
261
|
description: "Quizzes passed"
|
|
263
262
|
}),
|
|
264
|
-
cardsReviewed:
|
|
263
|
+
cardsReviewed: _5.int({
|
|
265
264
|
default: 0,
|
|
266
265
|
description: "Cards reviewed"
|
|
267
266
|
}),
|
|
268
|
-
streakDays:
|
|
267
|
+
streakDays: _5.int({
|
|
269
268
|
default: 0,
|
|
270
269
|
description: "Streak days in period"
|
|
271
270
|
}),
|
|
272
|
-
league:
|
|
271
|
+
league: _5.string({
|
|
273
272
|
isOptional: true,
|
|
274
273
|
description: "League tier"
|
|
275
274
|
}),
|
|
276
|
-
orgId:
|
|
275
|
+
orgId: _5.string({
|
|
277
276
|
isOptional: true,
|
|
278
277
|
description: "Organization scope"
|
|
279
278
|
}),
|
|
280
|
-
createdAt:
|
|
281
|
-
updatedAt:
|
|
282
|
-
learner:
|
|
279
|
+
createdAt: _5.createdAt(),
|
|
280
|
+
updatedAt: _5.updatedAt(),
|
|
281
|
+
learner: _5.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
|
|
283
282
|
},
|
|
284
283
|
indexes: [
|
|
285
|
-
|
|
284
|
+
b5.unique([
|
|
286
285
|
"learnerId",
|
|
287
286
|
"periodType",
|
|
288
287
|
"periodKey"
|
|
289
288
|
], { name: "leaderboard_entry_unique" }),
|
|
290
|
-
|
|
289
|
+
b5.on([
|
|
291
290
|
"periodType",
|
|
292
291
|
"periodKey",
|
|
293
292
|
"xp"
|
|
294
293
|
]),
|
|
295
|
-
|
|
294
|
+
b5.on([
|
|
296
295
|
"orgId",
|
|
297
296
|
"periodType",
|
|
298
297
|
"periodKey",
|
|
@@ -304,77 +303,77 @@ const LeaderboardEntryEntity = defineEntity({
|
|
|
304
303
|
/**
|
|
305
304
|
* Heart entity - lives system (optional).
|
|
306
305
|
*/
|
|
307
|
-
const HeartEntity =
|
|
306
|
+
const HeartEntity = L5({
|
|
308
307
|
name: "Heart",
|
|
309
308
|
description: "Lives/hearts system for quiz attempts.",
|
|
310
309
|
schema: "lssm_learning",
|
|
311
310
|
map: "heart",
|
|
312
311
|
fields: {
|
|
313
|
-
id:
|
|
314
|
-
learnerId:
|
|
315
|
-
current:
|
|
312
|
+
id: _5.id({ description: "Unique heart record identifier" }),
|
|
313
|
+
learnerId: _5.foreignKey({ description: "Learner" }),
|
|
314
|
+
current: _5.int({
|
|
316
315
|
default: 5,
|
|
317
316
|
description: "Current hearts"
|
|
318
317
|
}),
|
|
319
|
-
max:
|
|
318
|
+
max: _5.int({
|
|
320
319
|
default: 5,
|
|
321
320
|
description: "Maximum hearts"
|
|
322
321
|
}),
|
|
323
|
-
lastRefillAt:
|
|
322
|
+
lastRefillAt: _5.dateTime({
|
|
324
323
|
isOptional: true,
|
|
325
324
|
description: "Last refill time"
|
|
326
325
|
}),
|
|
327
|
-
nextRefillAt:
|
|
326
|
+
nextRefillAt: _5.dateTime({
|
|
328
327
|
isOptional: true,
|
|
329
328
|
description: "Next refill time"
|
|
330
329
|
}),
|
|
331
|
-
refillIntervalMinutes:
|
|
330
|
+
refillIntervalMinutes: _5.int({
|
|
332
331
|
default: 240,
|
|
333
332
|
description: "Minutes between refills"
|
|
334
333
|
}),
|
|
335
|
-
infiniteUntil:
|
|
334
|
+
infiniteUntil: _5.dateTime({
|
|
336
335
|
isOptional: true,
|
|
337
336
|
description: "Infinite hearts until"
|
|
338
337
|
}),
|
|
339
|
-
createdAt:
|
|
340
|
-
updatedAt:
|
|
341
|
-
learner:
|
|
338
|
+
createdAt: _5.createdAt(),
|
|
339
|
+
updatedAt: _5.updatedAt(),
|
|
340
|
+
learner: _5.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
|
|
342
341
|
},
|
|
343
|
-
indexes: [
|
|
342
|
+
indexes: [b5.unique(["learnerId"], { name: "heart_learner_unique" }), b5.on(["nextRefillAt"])]
|
|
344
343
|
});
|
|
345
344
|
/**
|
|
346
345
|
* XPTransaction entity - XP earning history.
|
|
347
346
|
*/
|
|
348
|
-
const XPTransactionEntity =
|
|
347
|
+
const XPTransactionEntity = L5({
|
|
349
348
|
name: "XPTransaction",
|
|
350
349
|
description: "Record of XP earned or spent.",
|
|
351
350
|
schema: "lssm_learning",
|
|
352
351
|
map: "xp_transaction",
|
|
353
352
|
fields: {
|
|
354
|
-
id:
|
|
355
|
-
learnerId:
|
|
356
|
-
amount:
|
|
357
|
-
type:
|
|
358
|
-
sourceType:
|
|
353
|
+
id: _5.id({ description: "Unique transaction identifier" }),
|
|
354
|
+
learnerId: _5.foreignKey({ description: "Learner" }),
|
|
355
|
+
amount: _5.int({ description: "XP amount (positive = earned, negative = spent)" }),
|
|
356
|
+
type: _5.string({ description: "Transaction type (lesson, quiz, streak, achievement, etc.)" }),
|
|
357
|
+
sourceType: _5.string({
|
|
359
358
|
isOptional: true,
|
|
360
359
|
description: "Source entity type"
|
|
361
360
|
}),
|
|
362
|
-
sourceId:
|
|
361
|
+
sourceId: _5.string({
|
|
363
362
|
isOptional: true,
|
|
364
363
|
description: "Source entity ID"
|
|
365
364
|
}),
|
|
366
|
-
description:
|
|
365
|
+
description: _5.string({
|
|
367
366
|
isOptional: true,
|
|
368
367
|
description: "Human-readable description"
|
|
369
368
|
}),
|
|
370
|
-
balanceAfter:
|
|
371
|
-
createdAt:
|
|
372
|
-
learner:
|
|
369
|
+
balanceAfter: _5.int({ description: "Total XP after transaction" }),
|
|
370
|
+
createdAt: _5.createdAt(),
|
|
371
|
+
learner: _5.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
|
|
373
372
|
},
|
|
374
373
|
indexes: [
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
374
|
+
b5.on(["learnerId", "createdAt"]),
|
|
375
|
+
b5.on(["type"]),
|
|
376
|
+
b5.on(["sourceType", "sourceId"])
|
|
378
377
|
]
|
|
379
378
|
});
|
|
380
379
|
const gamificationEntities = [
|
|
@@ -389,4 +388,5 @@ const gamificationEntities = [
|
|
|
389
388
|
const gamificationEnums = [AchievementTypeEnum, LeaderboardPeriodEnum];
|
|
390
389
|
|
|
391
390
|
//#endregion
|
|
392
|
-
export { AchievementEntity, AchievementTypeEnum, DailyGoalEntity, HeartEntity, LeaderboardEntryEntity, LeaderboardPeriodEnum, LearnerAchievementEntity, StreakEntity, XPTransactionEntity, gamificationEntities, gamificationEnums };
|
|
391
|
+
export { AchievementEntity, AchievementTypeEnum, DailyGoalEntity, HeartEntity, LeaderboardEntryEntity, LeaderboardPeriodEnum, LearnerAchievementEntity, StreakEntity, XPTransactionEntity, gamificationEntities, gamificationEnums };
|
|
392
|
+
//# sourceMappingURL=gamification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gamification.js","names":["defineEntityEnum","defineEntity","field","index"],"sources":["../../src/entities/gamification.ts"],"sourcesContent":["import { defineEntity, defineEntityEnum, field, index } from '@lssm/lib.schema';\n\n/**\n * Achievement type enum.\n */\nexport const AchievementTypeEnum = defineEntityEnum({\n name: 'AchievementType',\n values: [\n 'MILESTONE',\n 'STREAK',\n 'SKILL',\n 'SOCIAL',\n 'SPECIAL',\n 'SEASONAL',\n ] as const,\n schema: 'lssm_learning',\n description: 'Type of achievement.',\n});\n\n/**\n * Leaderboard period enum.\n */\nexport const LeaderboardPeriodEnum = defineEntityEnum({\n name: 'LeaderboardPeriod',\n values: ['DAILY', 'WEEKLY', 'MONTHLY', 'ALL_TIME'] as const,\n schema: 'lssm_learning',\n description: 'Leaderboard time period.',\n});\n\n/**\n * Achievement entity - defines an achievement.\n */\nexport const AchievementEntity = defineEntity({\n name: 'Achievement',\n description: 'An achievement that can be unlocked.',\n schema: 'lssm_learning',\n map: 'achievement',\n fields: {\n id: field.id({ description: 'Unique achievement identifier' }),\n\n // Basic info\n key: field.string({ isUnique: true, description: 'Achievement key' }),\n name: field.string({ description: 'Achievement name' }),\n description: field.string({ description: 'Achievement description' }),\n\n // Display\n icon: field.string({ isOptional: true, description: 'Icon name or URL' }),\n color: field.string({ isOptional: true, description: 'Display color' }),\n badgeUrl: field.string({\n isOptional: true,\n description: 'Badge image URL',\n }),\n\n // Classification\n type: field.enum('AchievementType', {\n default: 'MILESTONE',\n description: 'Achievement type',\n }),\n category: field.string({\n isOptional: true,\n description: 'Achievement category',\n }),\n rarity: field.string({\n default: '\"common\"',\n description: 'Rarity: common, rare, epic, legendary',\n }),\n\n // Rewards\n xpReward: field.int({ default: 50, description: 'XP awarded' }),\n\n // Conditions (JSON DSL for checking)\n condition: field.json({ description: 'Unlock condition' }),\n\n // Ordering\n order: field.int({ default: 0, description: 'Display order' }),\n\n // Status\n isHidden: field.boolean({\n default: false,\n description: 'Hide until unlocked',\n }),\n isActive: field.boolean({\n default: true,\n description: 'Whether achievement is active',\n }),\n\n // Organization scope\n orgId: field.string({\n isOptional: true,\n description: 'Organization scope',\n }),\n\n // Metadata\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 learnerAchievements: field.hasMany('LearnerAchievement'),\n },\n indexes: [\n index.on(['type']),\n index.on(['category']),\n index.on(['isActive']),\n index.on(['orgId']),\n ],\n enums: [AchievementTypeEnum],\n});\n\n/**\n * LearnerAchievement entity - unlocked achievements.\n */\nexport const LearnerAchievementEntity = defineEntity({\n name: 'LearnerAchievement',\n description: 'An achievement unlocked by a learner.',\n schema: 'lssm_learning',\n map: 'learner_achievement',\n fields: {\n id: field.id({ description: 'Unique record identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n achievementId: field.foreignKey({ description: 'Achievement' }),\n\n // XP\n xpEarned: field.int({ default: 0, description: 'XP earned' }),\n\n // Progress (for multi-stage achievements)\n progress: field.int({ default: 100, description: 'Progress percentage' }),\n currentValue: field.int({\n isOptional: true,\n description: 'Current value towards goal',\n }),\n targetValue: field.int({\n isOptional: true,\n description: 'Target value for completion',\n }),\n\n // Timestamps\n unlockedAt: field.dateTime({ description: 'When unlocked' }),\n createdAt: field.createdAt(),\n\n // Relations\n learner: field.belongsTo('Learner', ['learnerId'], ['id'], {\n onDelete: 'Cascade',\n }),\n achievement: field.belongsTo('Achievement', ['achievementId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.unique(['learnerId', 'achievementId'], {\n name: 'learner_achievement_unique',\n }),\n index.on(['learnerId', 'unlockedAt']),\n index.on(['achievementId']),\n ],\n});\n\n/**\n * Streak entity - tracks daily learning streaks.\n */\nexport const StreakEntity = defineEntity({\n name: 'Streak',\n description: 'Tracks daily learning streaks.',\n schema: 'lssm_learning',\n map: 'streak',\n fields: {\n id: field.id({ description: 'Unique streak identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n\n // Streak data\n currentStreak: field.int({\n default: 0,\n description: 'Current streak days',\n }),\n longestStreak: field.int({\n default: 0,\n description: 'Longest streak ever',\n }),\n\n // Activity tracking\n lastActivityAt: field.dateTime({\n isOptional: true,\n description: 'Last learning activity',\n }),\n lastActivityDate: field.string({\n isOptional: true,\n description: 'Last activity date (YYYY-MM-DD)',\n }),\n\n // Streak protection\n freezesRemaining: field.int({\n default: 0,\n description: 'Streak freezes available',\n }),\n freezeUsedAt: field.dateTime({\n isOptional: true,\n description: 'When last freeze was used',\n }),\n\n // History\n streakHistory: field.json({\n isOptional: true,\n description: 'Historical streak data',\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: 'streak_learner_unique' }),\n index.on(['currentStreak']),\n index.on(['longestStreak']),\n ],\n});\n\n/**\n * DailyGoal entity - tracks daily XP goals.\n */\nexport const DailyGoalEntity = defineEntity({\n name: 'DailyGoal',\n description: 'Daily XP goal tracking.',\n schema: 'lssm_learning',\n map: 'daily_goal',\n fields: {\n id: field.id({ description: 'Unique goal identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n\n // Date\n date: field.string({ description: 'Date (YYYY-MM-DD)' }),\n\n // Goal\n targetXp: field.int({ description: 'Target XP for the day' }),\n currentXp: field.int({ default: 0, description: 'XP earned today' }),\n\n // Status\n isCompleted: field.boolean({\n default: false,\n description: 'Whether goal was met',\n }),\n completedAt: field.dateTime({\n isOptional: true,\n description: 'When goal was completed',\n }),\n\n // Breakdown\n xpBreakdown: field.json({\n isOptional: true,\n description: 'XP sources breakdown',\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', 'date'], { name: 'daily_goal_unique' }),\n index.on(['date', 'isCompleted']),\n ],\n});\n\n/**\n * LeaderboardEntry entity - leaderboard rankings.\n */\nexport const LeaderboardEntryEntity = defineEntity({\n name: 'LeaderboardEntry',\n description: 'Leaderboard entry for a learner.',\n schema: 'lssm_learning',\n map: 'leaderboard_entry',\n fields: {\n id: field.id({ description: 'Unique entry identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n\n // Period\n periodType: field.enum('LeaderboardPeriod', { description: 'Period type' }),\n periodKey: field.string({ description: 'Period key (e.g., 2024-W01)' }),\n\n // Stats\n xp: field.int({ default: 0, description: 'XP earned in period' }),\n rank: field.int({ isOptional: true, description: 'Rank in leaderboard' }),\n\n // Breakdown\n lessonsCompleted: field.int({\n default: 0,\n description: 'Lessons completed',\n }),\n quizzesPassed: field.int({ default: 0, description: 'Quizzes passed' }),\n cardsReviewed: field.int({ default: 0, description: 'Cards reviewed' }),\n streakDays: field.int({ default: 0, description: 'Streak days in period' }),\n\n // League (optional grouping)\n league: field.string({ isOptional: true, description: 'League tier' }),\n\n // Organization scope\n orgId: field.string({\n isOptional: true,\n description: 'Organization scope',\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', 'periodType', 'periodKey'], {\n name: 'leaderboard_entry_unique',\n }),\n index.on(['periodType', 'periodKey', 'xp']),\n index.on(['orgId', 'periodType', 'periodKey', 'xp']),\n ],\n enums: [LeaderboardPeriodEnum],\n});\n\n/**\n * Heart entity - lives system (optional).\n */\nexport const HeartEntity = defineEntity({\n name: 'Heart',\n description: 'Lives/hearts system for quiz attempts.',\n schema: 'lssm_learning',\n map: 'heart',\n fields: {\n id: field.id({ description: 'Unique heart record identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n\n // Hearts\n current: field.int({ default: 5, description: 'Current hearts' }),\n max: field.int({ default: 5, description: 'Maximum hearts' }),\n\n // Refill\n lastRefillAt: field.dateTime({\n isOptional: true,\n description: 'Last refill time',\n }),\n nextRefillAt: field.dateTime({\n isOptional: true,\n description: 'Next refill time',\n }),\n\n // Settings\n refillIntervalMinutes: field.int({\n default: 240,\n description: 'Minutes between refills',\n }),\n infiniteUntil: field.dateTime({\n isOptional: true,\n description: 'Infinite hearts until',\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: 'heart_learner_unique' }),\n index.on(['nextRefillAt']),\n ],\n});\n\n/**\n * XPTransaction entity - XP earning history.\n */\nexport const XPTransactionEntity = defineEntity({\n name: 'XPTransaction',\n description: 'Record of XP earned or spent.',\n schema: 'lssm_learning',\n map: 'xp_transaction',\n fields: {\n id: field.id({ description: 'Unique transaction identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n\n // Transaction\n amount: field.int({\n description: 'XP amount (positive = earned, negative = spent)',\n }),\n type: field.string({\n description: 'Transaction type (lesson, quiz, streak, achievement, etc.)',\n }),\n\n // Source\n sourceType: field.string({\n isOptional: true,\n description: 'Source entity type',\n }),\n sourceId: field.string({\n isOptional: true,\n description: 'Source entity ID',\n }),\n\n // Description\n description: field.string({\n isOptional: true,\n description: 'Human-readable description',\n }),\n\n // Balance\n balanceAfter: field.int({ description: 'Total XP after transaction' }),\n\n // Timestamps\n createdAt: field.createdAt(),\n\n // Relations\n learner: field.belongsTo('Learner', ['learnerId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.on(['learnerId', 'createdAt']),\n index.on(['type']),\n index.on(['sourceType', 'sourceId']),\n ],\n});\n\nexport const gamificationEntities = [\n AchievementEntity,\n LearnerAchievementEntity,\n StreakEntity,\n DailyGoalEntity,\n LeaderboardEntryEntity,\n HeartEntity,\n XPTransactionEntity,\n];\n\nexport const gamificationEnums = [AchievementTypeEnum, LeaderboardPeriodEnum];\n"],"mappings":"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"}
|