@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.
Files changed (215) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -0
  3. package/dist/contracts/models.d.ts +120 -119
  4. package/dist/contracts/models.d.ts.map +1 -0
  5. package/dist/contracts/models.js +87 -88
  6. package/dist/contracts/models.js.map +1 -0
  7. package/dist/contracts/onboarding.d.ts +170 -169
  8. package/dist/contracts/onboarding.d.ts.map +1 -0
  9. package/dist/contracts/onboarding.js +71 -72
  10. package/dist/contracts/onboarding.js.map +1 -0
  11. package/dist/contracts/operations.d.ts +73 -72
  12. package/dist/contracts/operations.d.ts.map +1 -0
  13. package/dist/contracts/operations.js +2 -1
  14. package/dist/contracts/operations.js.map +1 -0
  15. package/dist/contracts/shared.d.ts +2 -1
  16. package/dist/contracts/shared.d.ts.map +1 -0
  17. package/dist/contracts/shared.js +2 -1
  18. package/dist/contracts/shared.js.map +1 -0
  19. package/dist/docs/learning-journey.docblock.js +2 -1
  20. package/dist/docs/learning-journey.docblock.js.map +1 -0
  21. package/dist/engines/srs.d.ts +2 -1
  22. package/dist/engines/srs.d.ts.map +1 -0
  23. package/dist/engines/srs.js +2 -1
  24. package/dist/engines/srs.js.map +1 -0
  25. package/dist/engines/streak.d.ts +2 -1
  26. package/dist/engines/streak.d.ts.map +1 -0
  27. package/dist/engines/streak.js +2 -1
  28. package/dist/engines/streak.js.map +1 -0
  29. package/dist/engines/xp.d.ts +2 -1
  30. package/dist/engines/xp.d.ts.map +1 -0
  31. package/dist/engines/xp.js +2 -1
  32. package/dist/engines/xp.js.map +1 -0
  33. package/dist/entities/ai.d.ts +202 -201
  34. package/dist/entities/ai.d.ts.map +1 -0
  35. package/dist/entities/ai.js +114 -114
  36. package/dist/entities/ai.js.map +1 -0
  37. package/dist/entities/course.d.ts +152 -151
  38. package/dist/entities/course.d.ts.map +1 -0
  39. package/dist/entities/course.js +86 -86
  40. package/dist/entities/course.js.map +1 -0
  41. package/dist/entities/flashcard.d.ts +147 -146
  42. package/dist/entities/flashcard.d.ts.map +1 -0
  43. package/dist/entities/flashcard.js +85 -85
  44. package/dist/entities/flashcard.js.map +1 -0
  45. package/dist/entities/gamification.d.ts +200 -199
  46. package/dist/entities/gamification.d.ts.map +1 -0
  47. package/dist/entities/gamification.js +120 -120
  48. package/dist/entities/gamification.js.map +1 -0
  49. package/dist/entities/index.d.ts +607 -606
  50. package/dist/entities/index.d.ts.map +1 -0
  51. package/dist/entities/index.js +2 -1
  52. package/dist/entities/index.js.map +1 -0
  53. package/dist/entities/learner.d.ts +194 -193
  54. package/dist/entities/learner.d.ts.map +1 -0
  55. package/dist/entities/learner.js +113 -113
  56. package/dist/entities/learner.js.map +1 -0
  57. package/dist/entities/onboarding.d.ts +167 -166
  58. package/dist/entities/onboarding.d.ts.map +1 -0
  59. package/dist/entities/onboarding.js +93 -93
  60. package/dist/entities/onboarding.js.map +1 -0
  61. package/dist/entities/quiz.d.ts +187 -186
  62. package/dist/entities/quiz.d.ts.map +1 -0
  63. package/dist/entities/quiz.js +109 -109
  64. package/dist/entities/quiz.js.map +1 -0
  65. package/dist/events.d.ts +216 -215
  66. package/dist/events.d.ts.map +1 -0
  67. package/dist/events.js +109 -110
  68. package/dist/events.js.map +1 -0
  69. package/dist/learning-journey.feature.d.ts +2 -1
  70. package/dist/learning-journey.feature.d.ts.map +1 -0
  71. package/dist/learning-journey.feature.js +2 -1
  72. package/dist/learning-journey.feature.js.map +1 -0
  73. package/dist/libs/contracts/dist/capabilities/openbanking.js +2 -1
  74. package/dist/libs/contracts/dist/capabilities/openbanking.js.map +1 -0
  75. package/dist/libs/contracts/dist/contract-registry/schemas.js +2 -1
  76. package/dist/libs/contracts/dist/contract-registry/schemas.js.map +1 -0
  77. package/dist/libs/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js +2 -1
  78. package/dist/libs/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js.map +1 -0
  79. package/dist/libs/contracts/dist/docs/index.js +2 -6
  80. package/dist/libs/contracts/dist/docs/meta.docs.js +30 -0
  81. package/dist/libs/contracts/dist/docs/meta.docs.js.map +1 -0
  82. package/dist/libs/contracts/dist/docs/presentations.js +2 -1
  83. package/dist/libs/contracts/dist/docs/presentations.js.map +1 -0
  84. package/dist/libs/contracts/dist/docs/registry.js +2 -1
  85. package/dist/libs/contracts/dist/docs/registry.js.map +1 -0
  86. package/dist/libs/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js +2 -1
  87. package/dist/libs/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js.map +1 -0
  88. package/dist/libs/contracts/dist/docs/tech/contracts/openapi-export.docblock.js +2 -1
  89. package/dist/libs/contracts/dist/docs/tech/contracts/openapi-export.docblock.js.map +1 -0
  90. package/dist/libs/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js +2 -1
  91. package/dist/libs/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js.map +1 -0
  92. package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js +2 -1
  93. package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js.map +1 -0
  94. package/dist/libs/contracts/dist/docs/tech/mcp-endpoints.docblock.js +2 -1
  95. package/dist/libs/contracts/dist/docs/tech/mcp-endpoints.docblock.js.map +1 -0
  96. package/dist/libs/contracts/dist/docs/tech/presentation-runtime.docblock.js +2 -1
  97. package/dist/libs/contracts/dist/docs/tech/presentation-runtime.docblock.js.map +1 -0
  98. package/dist/libs/contracts/dist/docs/tech/schema/README.docblock.js +2 -1
  99. package/dist/libs/contracts/dist/docs/tech/schema/README.docblock.js.map +1 -0
  100. package/dist/libs/contracts/dist/docs/tech/studio/learning-events.docblock.js +2 -1
  101. package/dist/libs/contracts/dist/docs/tech/studio/learning-events.docblock.js.map +1 -0
  102. package/dist/libs/contracts/dist/docs/tech/studio/learning-journeys.docblock.js +2 -1
  103. package/dist/libs/contracts/dist/docs/tech/studio/learning-journeys.docblock.js.map +1 -0
  104. package/dist/libs/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js +2 -1
  105. package/dist/libs/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js.map +1 -0
  106. package/dist/libs/contracts/dist/docs/tech/studio/project-access-teams.docblock.js +2 -1
  107. package/dist/libs/contracts/dist/docs/tech/studio/project-access-teams.docblock.js.map +1 -0
  108. package/dist/libs/contracts/dist/docs/tech/studio/project-routing.docblock.js +2 -1
  109. package/dist/libs/contracts/dist/docs/tech/studio/project-routing.docblock.js.map +1 -0
  110. package/dist/libs/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js +2 -1
  111. package/dist/libs/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js.map +1 -0
  112. package/dist/libs/contracts/dist/docs/tech/studio/team-invitations.docblock.js +2 -1
  113. package/dist/libs/contracts/dist/docs/tech/studio/team-invitations.docblock.js.map +1 -0
  114. package/dist/libs/contracts/dist/docs/tech/studio/workspace-ops.docblock.js +2 -1
  115. package/dist/libs/contracts/dist/docs/tech/studio/workspace-ops.docblock.js.map +1 -0
  116. package/dist/libs/contracts/dist/docs/tech/studio/workspaces.docblock.js +2 -1
  117. package/dist/libs/contracts/dist/docs/tech/studio/workspaces.docblock.js.map +1 -0
  118. package/dist/libs/contracts/dist/docs/tech/telemetry-ingest.docblock.js +2 -1
  119. package/dist/libs/contracts/dist/docs/tech/telemetry-ingest.docblock.js.map +1 -0
  120. package/dist/libs/contracts/dist/docs/tech/templates/runtime.docblock.js +2 -1
  121. package/dist/libs/contracts/dist/docs/tech/templates/runtime.docblock.js.map +1 -0
  122. package/dist/libs/contracts/dist/docs/tech/vscode-extension.docblock.js +2 -1
  123. package/dist/libs/contracts/dist/docs/tech/vscode-extension.docblock.js.map +1 -0
  124. package/dist/libs/contracts/dist/docs/tech/workflows/overview.docblock.js +2 -1
  125. package/dist/libs/contracts/dist/docs/tech/workflows/overview.docblock.js.map +1 -0
  126. package/dist/libs/contracts/dist/docs/tech-contracts.docs.js +97 -0
  127. package/dist/libs/contracts/dist/docs/tech-contracts.docs.js.map +1 -0
  128. package/dist/libs/contracts/dist/events.js +2 -1
  129. package/dist/libs/contracts/dist/events.js.map +1 -0
  130. package/dist/libs/contracts/dist/index.js +2 -1
  131. package/dist/libs/contracts/dist/integrations/contracts.js +65 -66
  132. package/dist/libs/contracts/dist/integrations/contracts.js.map +1 -0
  133. package/dist/libs/contracts/dist/integrations/openbanking/contracts/accounts.js +31 -32
  134. package/dist/libs/contracts/dist/integrations/openbanking/contracts/accounts.js.map +1 -0
  135. package/dist/libs/contracts/dist/integrations/openbanking/contracts/balances.js +18 -19
  136. package/dist/libs/contracts/dist/integrations/openbanking/contracts/balances.js.map +1 -0
  137. package/dist/libs/contracts/dist/integrations/openbanking/contracts/transactions.js +32 -33
  138. package/dist/libs/contracts/dist/integrations/openbanking/contracts/transactions.js.map +1 -0
  139. package/dist/libs/contracts/dist/integrations/openbanking/models.js +60 -61
  140. package/dist/libs/contracts/dist/integrations/openbanking/models.js.map +1 -0
  141. package/dist/libs/contracts/dist/integrations/openbanking/telemetry.js +2 -1
  142. package/dist/libs/contracts/dist/integrations/openbanking/telemetry.js.map +1 -0
  143. package/dist/libs/contracts/dist/integrations/providers/elevenlabs.js +2 -1
  144. package/dist/libs/contracts/dist/integrations/providers/elevenlabs.js.map +1 -0
  145. package/dist/libs/contracts/dist/integrations/providers/gcs-storage.js +2 -1
  146. package/dist/libs/contracts/dist/integrations/providers/gcs-storage.js.map +1 -0
  147. package/dist/libs/contracts/dist/integrations/providers/gmail.js +2 -1
  148. package/dist/libs/contracts/dist/integrations/providers/gmail.js.map +1 -0
  149. package/dist/libs/contracts/dist/integrations/providers/google-calendar.js +2 -1
  150. package/dist/libs/contracts/dist/integrations/providers/google-calendar.js.map +1 -0
  151. package/dist/libs/contracts/dist/integrations/providers/mistral.js +2 -1
  152. package/dist/libs/contracts/dist/integrations/providers/mistral.js.map +1 -0
  153. package/dist/libs/contracts/dist/integrations/providers/postmark.js +2 -1
  154. package/dist/libs/contracts/dist/integrations/providers/postmark.js.map +1 -0
  155. package/dist/libs/contracts/dist/integrations/providers/powens.js +2 -1
  156. package/dist/libs/contracts/dist/integrations/providers/powens.js.map +1 -0
  157. package/dist/libs/contracts/dist/integrations/providers/qdrant.js +2 -1
  158. package/dist/libs/contracts/dist/integrations/providers/qdrant.js.map +1 -0
  159. package/dist/libs/contracts/dist/integrations/providers/stripe.js +2 -1
  160. package/dist/libs/contracts/dist/integrations/providers/stripe.js.map +1 -0
  161. package/dist/libs/contracts/dist/integrations/providers/twilio-sms.js +2 -1
  162. package/dist/libs/contracts/dist/integrations/providers/twilio-sms.js.map +1 -0
  163. package/dist/libs/contracts/dist/knowledge/contracts.js +44 -45
  164. package/dist/libs/contracts/dist/knowledge/contracts.js.map +1 -0
  165. package/dist/libs/contracts/dist/knowledge/spaces/email-threads.js +2 -1
  166. package/dist/libs/contracts/dist/knowledge/spaces/email-threads.js.map +1 -0
  167. package/dist/libs/contracts/dist/knowledge/spaces/financial-docs.js +2 -1
  168. package/dist/libs/contracts/dist/knowledge/spaces/financial-docs.js.map +1 -0
  169. package/dist/libs/contracts/dist/knowledge/spaces/financial-overview.js +2 -1
  170. package/dist/libs/contracts/dist/knowledge/spaces/financial-overview.js.map +1 -0
  171. package/dist/libs/contracts/dist/knowledge/spaces/product-canon.js +2 -1
  172. package/dist/libs/contracts/dist/knowledge/spaces/product-canon.js.map +1 -0
  173. package/dist/libs/contracts/dist/knowledge/spaces/support-faq.js +2 -1
  174. package/dist/libs/contracts/dist/knowledge/spaces/support-faq.js.map +1 -0
  175. package/dist/libs/contracts/dist/knowledge/spaces/uploaded-docs.js +2 -1
  176. package/dist/libs/contracts/dist/knowledge/spaces/uploaded-docs.js.map +1 -0
  177. package/dist/libs/contracts/dist/llm/exporters.js +2 -1
  178. package/dist/libs/contracts/dist/llm/exporters.js.map +1 -0
  179. package/dist/libs/contracts/dist/onboarding-base.js +22 -23
  180. package/dist/libs/contracts/dist/onboarding-base.js.map +1 -0
  181. package/dist/libs/contracts/dist/ownership.js +4 -2
  182. package/dist/libs/contracts/dist/ownership.js.map +1 -0
  183. package/dist/libs/contracts/dist/presentations.v2.js +2 -1
  184. package/dist/libs/contracts/dist/presentations.v2.js.map +1 -0
  185. package/dist/libs/contracts/dist/regenerator/service.js +2 -1
  186. package/dist/libs/contracts/dist/regenerator/service.js.map +1 -0
  187. package/dist/libs/contracts/dist/schema/dist/index.js +3873 -6
  188. package/dist/libs/contracts/dist/schema/dist/index.js.map +1 -0
  189. package/dist/libs/contracts/dist/spec.js +2 -1
  190. package/dist/libs/contracts/dist/spec.js.map +1 -0
  191. package/dist/libs/schema/dist/index.js +4889 -6
  192. package/dist/libs/schema/dist/index.js.map +1 -0
  193. package/dist/track-spec.d.ts +2 -1
  194. package/dist/track-spec.d.ts.map +1 -0
  195. package/package.json +7 -6
  196. package/dist/libs/contracts/dist/docs/PUBLISHING.docblock.js +0 -16
  197. package/dist/libs/contracts/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +0 -16
  198. package/dist/libs/contracts/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +0 -16
  199. package/dist/libs/contracts/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +0 -16
  200. package/dist/libs/contracts/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +0 -16
  201. package/dist/libs/contracts/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +0 -16
  202. package/dist/libs/contracts/dist/schema/dist/EnumType.js +0 -2
  203. package/dist/libs/contracts/dist/schema/dist/FieldType.js +0 -49
  204. package/dist/libs/contracts/dist/schema/dist/ScalarTypeEnum.js +0 -236
  205. package/dist/libs/contracts/dist/schema/dist/SchemaModel.js +0 -34
  206. package/dist/libs/contracts/dist/schema/dist/entity/defineEntity.js +0 -1
  207. package/dist/libs/contracts/dist/schema/dist/entity/index.js +0 -2
  208. package/dist/libs/contracts/dist/schema/dist/entity/types.js +0 -1
  209. package/dist/libs/schema/dist/EnumType.js +0 -2
  210. package/dist/libs/schema/dist/FieldType.js +0 -49
  211. package/dist/libs/schema/dist/ScalarTypeEnum.js +0 -236
  212. package/dist/libs/schema/dist/SchemaModel.js +0 -39
  213. package/dist/libs/schema/dist/entity/defineEntity.js +0 -236
  214. package/dist/libs/schema/dist/entity/index.js +0 -2
  215. package/dist/libs/schema/dist/entity/types.js +0 -1
@@ -1,11 +1,10 @@
1
- import { defineEntity, defineEntityEnum, field, index } from "../libs/schema/dist/entity/defineEntity.js";
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 = defineEntityEnum({
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 = defineEntityEnum({
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 = defineEntity({
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: field.id({ description: "Unique achievement identifier" }),
45
- key: field.string({
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: field.string({ description: "Achievement name" }),
50
- description: field.string({ description: "Achievement description" }),
51
- icon: field.string({
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: field.string({
54
+ color: _5.string({
56
55
  isOptional: true,
57
56
  description: "Display color"
58
57
  }),
59
- badgeUrl: field.string({
58
+ badgeUrl: _5.string({
60
59
  isOptional: true,
61
60
  description: "Badge image URL"
62
61
  }),
63
- type: field.enum("AchievementType", {
62
+ type: _5.enum("AchievementType", {
64
63
  default: "MILESTONE",
65
64
  description: "Achievement type"
66
65
  }),
67
- category: field.string({
66
+ category: _5.string({
68
67
  isOptional: true,
69
68
  description: "Achievement category"
70
69
  }),
71
- rarity: field.string({
70
+ rarity: _5.string({
72
71
  default: "\"common\"",
73
72
  description: "Rarity: common, rare, epic, legendary"
74
73
  }),
75
- xpReward: field.int({
74
+ xpReward: _5.int({
76
75
  default: 50,
77
76
  description: "XP awarded"
78
77
  }),
79
- condition: field.json({ description: "Unlock condition" }),
80
- order: field.int({
78
+ condition: _5.json({ description: "Unlock condition" }),
79
+ order: _5.int({
81
80
  default: 0,
82
81
  description: "Display order"
83
82
  }),
84
- isHidden: field.boolean({
83
+ isHidden: _5.boolean({
85
84
  default: false,
86
85
  description: "Hide until unlocked"
87
86
  }),
88
- isActive: field.boolean({
87
+ isActive: _5.boolean({
89
88
  default: true,
90
89
  description: "Whether achievement is active"
91
90
  }),
92
- orgId: field.string({
91
+ orgId: _5.string({
93
92
  isOptional: true,
94
93
  description: "Organization scope"
95
94
  }),
96
- metadata: field.json({
95
+ metadata: _5.json({
97
96
  isOptional: true,
98
97
  description: "Additional metadata"
99
98
  }),
100
- createdAt: field.createdAt(),
101
- updatedAt: field.updatedAt(),
102
- learnerAchievements: field.hasMany("LearnerAchievement")
99
+ createdAt: _5.createdAt(),
100
+ updatedAt: _5.updatedAt(),
101
+ learnerAchievements: _5.hasMany("LearnerAchievement")
103
102
  },
104
103
  indexes: [
105
- index.on(["type"]),
106
- index.on(["category"]),
107
- index.on(["isActive"]),
108
- index.on(["orgId"])
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 = defineEntity({
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: field.id({ description: "Unique record identifier" }),
122
- learnerId: field.foreignKey({ description: "Learner" }),
123
- achievementId: field.foreignKey({ description: "Achievement" }),
124
- xpEarned: field.int({
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: field.int({
127
+ progress: _5.int({
129
128
  default: 100,
130
129
  description: "Progress percentage"
131
130
  }),
132
- currentValue: field.int({
131
+ currentValue: _5.int({
133
132
  isOptional: true,
134
133
  description: "Current value towards goal"
135
134
  }),
136
- targetValue: field.int({
135
+ targetValue: _5.int({
137
136
  isOptional: true,
138
137
  description: "Target value for completion"
139
138
  }),
140
- unlockedAt: field.dateTime({ description: "When unlocked" }),
141
- createdAt: field.createdAt(),
142
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" }),
143
- achievement: field.belongsTo("Achievement", ["achievementId"], ["id"], { onDelete: "Cascade" })
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
- index.unique(["learnerId", "achievementId"], { name: "learner_achievement_unique" }),
147
- index.on(["learnerId", "unlockedAt"]),
148
- index.on(["achievementId"])
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 = defineEntity({
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: field.id({ description: "Unique streak identifier" }),
161
- learnerId: field.foreignKey({ description: "Learner" }),
162
- currentStreak: field.int({
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: field.int({
165
+ longestStreak: _5.int({
167
166
  default: 0,
168
167
  description: "Longest streak ever"
169
168
  }),
170
- lastActivityAt: field.dateTime({
169
+ lastActivityAt: _5.dateTime({
171
170
  isOptional: true,
172
171
  description: "Last learning activity"
173
172
  }),
174
- lastActivityDate: field.string({
173
+ lastActivityDate: _5.string({
175
174
  isOptional: true,
176
175
  description: "Last activity date (YYYY-MM-DD)"
177
176
  }),
178
- freezesRemaining: field.int({
177
+ freezesRemaining: _5.int({
179
178
  default: 0,
180
179
  description: "Streak freezes available"
181
180
  }),
182
- freezeUsedAt: field.dateTime({
181
+ freezeUsedAt: _5.dateTime({
183
182
  isOptional: true,
184
183
  description: "When last freeze was used"
185
184
  }),
186
- streakHistory: field.json({
185
+ streakHistory: _5.json({
187
186
  isOptional: true,
188
187
  description: "Historical streak data"
189
188
  }),
190
- createdAt: field.createdAt(),
191
- updatedAt: field.updatedAt(),
192
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
189
+ createdAt: _5.createdAt(),
190
+ updatedAt: _5.updatedAt(),
191
+ learner: _5.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
193
192
  },
194
193
  indexes: [
195
- index.unique(["learnerId"], { name: "streak_learner_unique" }),
196
- index.on(["currentStreak"]),
197
- index.on(["longestStreak"])
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 = defineEntity({
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: field.id({ description: "Unique goal identifier" }),
210
- learnerId: field.foreignKey({ description: "Learner" }),
211
- date: field.string({ description: "Date (YYYY-MM-DD)" }),
212
- targetXp: field.int({ description: "Target XP for the day" }),
213
- currentXp: field.int({
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: field.boolean({
216
+ isCompleted: _5.boolean({
218
217
  default: false,
219
218
  description: "Whether goal was met"
220
219
  }),
221
- completedAt: field.dateTime({
220
+ completedAt: _5.dateTime({
222
221
  isOptional: true,
223
222
  description: "When goal was completed"
224
223
  }),
225
- xpBreakdown: field.json({
224
+ xpBreakdown: _5.json({
226
225
  isOptional: true,
227
226
  description: "XP sources breakdown"
228
227
  }),
229
- createdAt: field.createdAt(),
230
- updatedAt: field.updatedAt(),
231
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
228
+ createdAt: _5.createdAt(),
229
+ updatedAt: _5.updatedAt(),
230
+ learner: _5.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
232
231
  },
233
- indexes: [index.unique(["learnerId", "date"], { name: "daily_goal_unique" }), index.on(["date", "isCompleted"])]
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 = defineEntity({
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: field.id({ description: "Unique entry identifier" }),
245
- learnerId: field.foreignKey({ description: "Learner" }),
246
- periodType: field.enum("LeaderboardPeriod", { description: "Period type" }),
247
- periodKey: field.string({ description: "Period key (e.g., 2024-W01)" }),
248
- xp: field.int({
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: field.int({
251
+ rank: _5.int({
253
252
  isOptional: true,
254
253
  description: "Rank in leaderboard"
255
254
  }),
256
- lessonsCompleted: field.int({
255
+ lessonsCompleted: _5.int({
257
256
  default: 0,
258
257
  description: "Lessons completed"
259
258
  }),
260
- quizzesPassed: field.int({
259
+ quizzesPassed: _5.int({
261
260
  default: 0,
262
261
  description: "Quizzes passed"
263
262
  }),
264
- cardsReviewed: field.int({
263
+ cardsReviewed: _5.int({
265
264
  default: 0,
266
265
  description: "Cards reviewed"
267
266
  }),
268
- streakDays: field.int({
267
+ streakDays: _5.int({
269
268
  default: 0,
270
269
  description: "Streak days in period"
271
270
  }),
272
- league: field.string({
271
+ league: _5.string({
273
272
  isOptional: true,
274
273
  description: "League tier"
275
274
  }),
276
- orgId: field.string({
275
+ orgId: _5.string({
277
276
  isOptional: true,
278
277
  description: "Organization scope"
279
278
  }),
280
- createdAt: field.createdAt(),
281
- updatedAt: field.updatedAt(),
282
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
279
+ createdAt: _5.createdAt(),
280
+ updatedAt: _5.updatedAt(),
281
+ learner: _5.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
283
282
  },
284
283
  indexes: [
285
- index.unique([
284
+ b5.unique([
286
285
  "learnerId",
287
286
  "periodType",
288
287
  "periodKey"
289
288
  ], { name: "leaderboard_entry_unique" }),
290
- index.on([
289
+ b5.on([
291
290
  "periodType",
292
291
  "periodKey",
293
292
  "xp"
294
293
  ]),
295
- index.on([
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 = defineEntity({
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: field.id({ description: "Unique heart record identifier" }),
314
- learnerId: field.foreignKey({ description: "Learner" }),
315
- current: field.int({
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: field.int({
318
+ max: _5.int({
320
319
  default: 5,
321
320
  description: "Maximum hearts"
322
321
  }),
323
- lastRefillAt: field.dateTime({
322
+ lastRefillAt: _5.dateTime({
324
323
  isOptional: true,
325
324
  description: "Last refill time"
326
325
  }),
327
- nextRefillAt: field.dateTime({
326
+ nextRefillAt: _5.dateTime({
328
327
  isOptional: true,
329
328
  description: "Next refill time"
330
329
  }),
331
- refillIntervalMinutes: field.int({
330
+ refillIntervalMinutes: _5.int({
332
331
  default: 240,
333
332
  description: "Minutes between refills"
334
333
  }),
335
- infiniteUntil: field.dateTime({
334
+ infiniteUntil: _5.dateTime({
336
335
  isOptional: true,
337
336
  description: "Infinite hearts until"
338
337
  }),
339
- createdAt: field.createdAt(),
340
- updatedAt: field.updatedAt(),
341
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
338
+ createdAt: _5.createdAt(),
339
+ updatedAt: _5.updatedAt(),
340
+ learner: _5.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
342
341
  },
343
- indexes: [index.unique(["learnerId"], { name: "heart_learner_unique" }), index.on(["nextRefillAt"])]
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 = defineEntity({
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: field.id({ description: "Unique transaction identifier" }),
355
- learnerId: field.foreignKey({ description: "Learner" }),
356
- amount: field.int({ description: "XP amount (positive = earned, negative = spent)" }),
357
- type: field.string({ description: "Transaction type (lesson, quiz, streak, achievement, etc.)" }),
358
- sourceType: field.string({
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: field.string({
361
+ sourceId: _5.string({
363
362
  isOptional: true,
364
363
  description: "Source entity ID"
365
364
  }),
366
- description: field.string({
365
+ description: _5.string({
367
366
  isOptional: true,
368
367
  description: "Human-readable description"
369
368
  }),
370
- balanceAfter: field.int({ description: "Total XP after transaction" }),
371
- createdAt: field.createdAt(),
372
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" })
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
- index.on(["learnerId", "createdAt"]),
376
- index.on(["type"]),
377
- index.on(["sourceType", "sourceId"])
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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"}