@contractspec/module.learning-journey 1.57.0 → 1.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/dist/browser/contracts/index.js +578 -0
  2. package/dist/browser/contracts/models.js +193 -0
  3. package/dist/browser/contracts/onboarding.js +417 -0
  4. package/dist/browser/contracts/operations.js +326 -0
  5. package/dist/browser/contracts/shared.js +5 -0
  6. package/dist/browser/docs/index.js +124 -0
  7. package/dist/browser/docs/learning-journey.docblock.js +124 -0
  8. package/dist/browser/engines/index.js +526 -0
  9. package/dist/browser/engines/srs.js +198 -0
  10. package/dist/browser/engines/streak.js +159 -0
  11. package/dist/browser/engines/xp.js +171 -0
  12. package/dist/browser/entities/ai.js +343 -0
  13. package/dist/browser/entities/course.js +276 -0
  14. package/dist/browser/entities/flashcard.js +222 -0
  15. package/dist/browser/entities/gamification.js +340 -0
  16. package/dist/browser/entities/index.js +2136 -0
  17. package/dist/browser/entities/learner.js +329 -0
  18. package/dist/browser/entities/onboarding.js +301 -0
  19. package/dist/browser/entities/quiz.js +304 -0
  20. package/dist/browser/events.js +423 -0
  21. package/dist/browser/index.js +3833 -0
  22. package/dist/browser/learning-journey.capability.js +40 -0
  23. package/dist/browser/learning-journey.feature.js +56 -0
  24. package/dist/browser/track-spec.js +0 -0
  25. package/dist/contracts/index.d.ts +5 -5
  26. package/dist/contracts/index.d.ts.map +1 -0
  27. package/dist/contracts/index.js +578 -5
  28. package/dist/contracts/models.d.ts +426 -431
  29. package/dist/contracts/models.d.ts.map +1 -1
  30. package/dist/contracts/models.js +178 -372
  31. package/dist/contracts/onboarding.d.ts +621 -627
  32. package/dist/contracts/onboarding.d.ts.map +1 -1
  33. package/dist/contracts/onboarding.js +404 -388
  34. package/dist/contracts/operations.d.ts +243 -249
  35. package/dist/contracts/operations.d.ts.map +1 -1
  36. package/dist/contracts/operations.js +324 -148
  37. package/dist/contracts/shared.d.ts +1 -4
  38. package/dist/contracts/shared.d.ts.map +1 -1
  39. package/dist/contracts/shared.js +6 -6
  40. package/dist/docs/index.d.ts +2 -1
  41. package/dist/docs/index.d.ts.map +1 -0
  42. package/dist/docs/index.js +125 -1
  43. package/dist/docs/learning-journey.docblock.d.ts +2 -1
  44. package/dist/docs/learning-journey.docblock.d.ts.map +1 -0
  45. package/dist/docs/learning-journey.docblock.js +47 -58
  46. package/dist/engines/index.d.ts +4 -4
  47. package/dist/engines/index.d.ts.map +1 -0
  48. package/dist/engines/index.js +526 -4
  49. package/dist/engines/srs.d.ts +89 -92
  50. package/dist/engines/srs.d.ts.map +1 -1
  51. package/dist/engines/srs.js +197 -217
  52. package/dist/engines/streak.d.ts +84 -87
  53. package/dist/engines/streak.d.ts.map +1 -1
  54. package/dist/engines/streak.js +158 -192
  55. package/dist/engines/xp.d.ts +80 -83
  56. package/dist/engines/xp.d.ts.map +1 -1
  57. package/dist/engines/xp.js +170 -211
  58. package/dist/entities/ai.d.ts +199 -204
  59. package/dist/entities/ai.d.ts.map +1 -1
  60. package/dist/entities/ai.js +336 -368
  61. package/dist/entities/course.d.ts +149 -154
  62. package/dist/entities/course.d.ts.map +1 -1
  63. package/dist/entities/course.js +267 -306
  64. package/dist/entities/flashcard.d.ts +144 -149
  65. package/dist/entities/flashcard.d.ts.map +1 -1
  66. package/dist/entities/flashcard.js +217 -243
  67. package/dist/entities/gamification.d.ts +197 -202
  68. package/dist/entities/gamification.d.ts.map +1 -1
  69. package/dist/entities/gamification.js +331 -382
  70. package/dist/entities/index.d.ts +613 -618
  71. package/dist/entities/index.d.ts.map +1 -1
  72. package/dist/entities/index.js +2135 -43
  73. package/dist/entities/learner.d.ts +191 -196
  74. package/dist/entities/learner.d.ts.map +1 -1
  75. package/dist/entities/learner.js +322 -357
  76. package/dist/entities/onboarding.d.ts +164 -169
  77. package/dist/entities/onboarding.d.ts.map +1 -1
  78. package/dist/entities/onboarding.js +296 -301
  79. package/dist/entities/quiz.d.ts +184 -189
  80. package/dist/entities/quiz.d.ts.map +1 -1
  81. package/dist/entities/quiz.js +296 -361
  82. package/dist/events.d.ts +608 -614
  83. package/dist/events.d.ts.map +1 -1
  84. package/dist/events.js +421 -687
  85. package/dist/index.d.ts +8 -20
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +3834 -22
  88. package/dist/learning-journey.capability.d.ts +3 -8
  89. package/dist/learning-journey.capability.d.ts.map +1 -1
  90. package/dist/learning-journey.capability.js +41 -46
  91. package/dist/learning-journey.feature.d.ts +1 -6
  92. package/dist/learning-journey.feature.d.ts.map +1 -1
  93. package/dist/learning-journey.feature.js +55 -155
  94. package/dist/node/contracts/index.js +578 -0
  95. package/dist/node/contracts/models.js +193 -0
  96. package/dist/node/contracts/onboarding.js +417 -0
  97. package/dist/node/contracts/operations.js +326 -0
  98. package/dist/node/contracts/shared.js +5 -0
  99. package/dist/node/docs/index.js +124 -0
  100. package/dist/node/docs/learning-journey.docblock.js +124 -0
  101. package/dist/node/engines/index.js +526 -0
  102. package/dist/node/engines/srs.js +198 -0
  103. package/dist/node/engines/streak.js +159 -0
  104. package/dist/node/engines/xp.js +171 -0
  105. package/dist/node/entities/ai.js +343 -0
  106. package/dist/node/entities/course.js +276 -0
  107. package/dist/node/entities/flashcard.js +222 -0
  108. package/dist/node/entities/gamification.js +340 -0
  109. package/dist/node/entities/index.js +2136 -0
  110. package/dist/node/entities/learner.js +329 -0
  111. package/dist/node/entities/onboarding.js +301 -0
  112. package/dist/node/entities/quiz.js +304 -0
  113. package/dist/node/events.js +423 -0
  114. package/dist/node/index.js +3833 -0
  115. package/dist/node/learning-journey.capability.js +40 -0
  116. package/dist/node/learning-journey.feature.js +56 -0
  117. package/dist/node/track-spec.js +0 -0
  118. package/dist/track-spec.d.ts +115 -118
  119. package/dist/track-spec.d.ts.map +1 -1
  120. package/dist/track-spec.js +1 -0
  121. package/package.json +237 -60
  122. package/dist/contracts/models.js.map +0 -1
  123. package/dist/contracts/onboarding.js.map +0 -1
  124. package/dist/contracts/operations.js.map +0 -1
  125. package/dist/contracts/shared.js.map +0 -1
  126. package/dist/docs/learning-journey.docblock.js.map +0 -1
  127. package/dist/engines/srs.js.map +0 -1
  128. package/dist/engines/streak.js.map +0 -1
  129. package/dist/engines/xp.js.map +0 -1
  130. package/dist/entities/ai.js.map +0 -1
  131. package/dist/entities/course.js.map +0 -1
  132. package/dist/entities/flashcard.js.map +0 -1
  133. package/dist/entities/gamification.js.map +0 -1
  134. package/dist/entities/index.js.map +0 -1
  135. package/dist/entities/learner.js.map +0 -1
  136. package/dist/entities/onboarding.js.map +0 -1
  137. package/dist/entities/quiz.js.map +0 -1
  138. package/dist/events.js.map +0 -1
  139. package/dist/learning-journey.capability.js.map +0 -1
  140. package/dist/learning-journey.feature.js.map +0 -1
@@ -1,307 +1,302 @@
1
- import { defineEntity, defineEntityEnum, field, index } from "@contractspec/lib.schema";
2
-
3
- //#region src/entities/onboarding.ts
4
- /**
5
- * Onboarding step status enum.
6
- */
7
- const OnboardingStepStatusEnum = defineEntityEnum({
8
- name: "OnboardingStepStatus",
9
- values: [
10
- "PENDING",
11
- "IN_PROGRESS",
12
- "COMPLETED",
13
- "SKIPPED"
14
- ],
15
- schema: "lssm_learning",
16
- description: "Status of an onboarding step."
1
+ // @bun
2
+ // src/entities/onboarding.ts
3
+ import {
4
+ defineEntity,
5
+ defineEntityEnum,
6
+ field,
7
+ index
8
+ } from "@contractspec/lib.schema";
9
+ var OnboardingStepStatusEnum = defineEntityEnum({
10
+ name: "OnboardingStepStatus",
11
+ values: ["PENDING", "IN_PROGRESS", "COMPLETED", "SKIPPED"],
12
+ schema: "lssm_learning",
13
+ description: "Status of an onboarding step."
17
14
  });
18
- /**
19
- * OnboardingTrack entity - defines an onboarding journey.
20
- */
21
- const OnboardingTrackEntity = defineEntity({
22
- name: "OnboardingTrack",
23
- description: "An onboarding track for a product.",
24
- schema: "lssm_learning",
25
- map: "onboarding_track",
26
- fields: {
27
- id: field.id({ description: "Unique track identifier" }),
28
- productId: field.string({ description: "Product this track is for" }),
29
- name: field.string({ description: "Track name" }),
30
- description: field.string({
31
- isOptional: true,
32
- description: "Track description"
33
- }),
34
- targetUserSegment: field.string({
35
- isOptional: true,
36
- description: "Target user segment"
37
- }),
38
- targetRole: field.string({
39
- isOptional: true,
40
- description: "Target user role"
41
- }),
42
- welcomeTitle: field.string({
43
- isOptional: true,
44
- description: "Welcome message title"
45
- }),
46
- welcomeMessage: field.string({
47
- isOptional: true,
48
- description: "Welcome message"
49
- }),
50
- completionTitle: field.string({
51
- isOptional: true,
52
- description: "Completion message title"
53
- }),
54
- completionMessage: field.string({
55
- isOptional: true,
56
- description: "Completion message"
57
- }),
58
- isActive: field.boolean({
59
- default: true,
60
- description: "Whether track is active"
61
- }),
62
- isRequired: field.boolean({
63
- default: false,
64
- description: "Whether track is required"
65
- }),
66
- canSkip: field.boolean({
67
- default: true,
68
- description: "Whether steps can be skipped"
69
- }),
70
- totalXp: field.int({
71
- default: 100,
72
- description: "Total XP for completing track"
73
- }),
74
- completionXpBonus: field.int({
75
- isOptional: true,
76
- description: "Bonus XP for completing track"
77
- }),
78
- completionBadgeKey: field.string({
79
- isOptional: true,
80
- description: "Badge awarded on completion"
81
- }),
82
- streakHoursWindow: field.int({
83
- isOptional: true,
84
- description: "Hours window to finish for streak bonus"
85
- }),
86
- streakBonusXp: field.int({
87
- isOptional: true,
88
- description: "Bonus XP if completed within streak window"
89
- }),
90
- orgId: field.string({
91
- isOptional: true,
92
- description: "Organization scope"
93
- }),
94
- metadata: field.json({
95
- isOptional: true,
96
- description: "Additional metadata"
97
- }),
98
- createdAt: field.createdAt(),
99
- updatedAt: field.updatedAt(),
100
- steps: field.hasMany("OnboardingStep"),
101
- progress: field.hasMany("OnboardingProgress")
102
- },
103
- indexes: [
104
- index.on(["productId", "isActive"]),
105
- index.on(["orgId"]),
106
- index.unique([
107
- "productId",
108
- "targetUserSegment",
109
- "targetRole"
110
- ], { name: "onboarding_track_target" })
111
- ]
15
+ var OnboardingTrackEntity = defineEntity({
16
+ name: "OnboardingTrack",
17
+ description: "An onboarding track for a product.",
18
+ schema: "lssm_learning",
19
+ map: "onboarding_track",
20
+ fields: {
21
+ id: field.id({ description: "Unique track identifier" }),
22
+ productId: field.string({ description: "Product this track is for" }),
23
+ name: field.string({ description: "Track name" }),
24
+ description: field.string({
25
+ isOptional: true,
26
+ description: "Track description"
27
+ }),
28
+ targetUserSegment: field.string({
29
+ isOptional: true,
30
+ description: "Target user segment"
31
+ }),
32
+ targetRole: field.string({
33
+ isOptional: true,
34
+ description: "Target user role"
35
+ }),
36
+ welcomeTitle: field.string({
37
+ isOptional: true,
38
+ description: "Welcome message title"
39
+ }),
40
+ welcomeMessage: field.string({
41
+ isOptional: true,
42
+ description: "Welcome message"
43
+ }),
44
+ completionTitle: field.string({
45
+ isOptional: true,
46
+ description: "Completion message title"
47
+ }),
48
+ completionMessage: field.string({
49
+ isOptional: true,
50
+ description: "Completion message"
51
+ }),
52
+ isActive: field.boolean({
53
+ default: true,
54
+ description: "Whether track is active"
55
+ }),
56
+ isRequired: field.boolean({
57
+ default: false,
58
+ description: "Whether track is required"
59
+ }),
60
+ canSkip: field.boolean({
61
+ default: true,
62
+ description: "Whether steps can be skipped"
63
+ }),
64
+ totalXp: field.int({
65
+ default: 100,
66
+ description: "Total XP for completing track"
67
+ }),
68
+ completionXpBonus: field.int({
69
+ isOptional: true,
70
+ description: "Bonus XP for completing track"
71
+ }),
72
+ completionBadgeKey: field.string({
73
+ isOptional: true,
74
+ description: "Badge awarded on completion"
75
+ }),
76
+ streakHoursWindow: field.int({
77
+ isOptional: true,
78
+ description: "Hours window to finish for streak bonus"
79
+ }),
80
+ streakBonusXp: field.int({
81
+ isOptional: true,
82
+ description: "Bonus XP if completed within streak window"
83
+ }),
84
+ orgId: field.string({
85
+ isOptional: true,
86
+ description: "Organization scope"
87
+ }),
88
+ metadata: field.json({
89
+ isOptional: true,
90
+ description: "Additional metadata"
91
+ }),
92
+ createdAt: field.createdAt(),
93
+ updatedAt: field.updatedAt(),
94
+ steps: field.hasMany("OnboardingStep"),
95
+ progress: field.hasMany("OnboardingProgress")
96
+ },
97
+ indexes: [
98
+ index.on(["productId", "isActive"]),
99
+ index.on(["orgId"]),
100
+ index.unique(["productId", "targetUserSegment", "targetRole"], {
101
+ name: "onboarding_track_target"
102
+ })
103
+ ]
112
104
  });
113
- /**
114
- * OnboardingStep entity - a step in an onboarding track.
115
- */
116
- const OnboardingStepEntity = defineEntity({
117
- name: "OnboardingStep",
118
- description: "A step in an onboarding track.",
119
- schema: "lssm_learning",
120
- map: "onboarding_step",
121
- fields: {
122
- id: field.id({ description: "Unique step identifier" }),
123
- trackId: field.foreignKey({ description: "Parent track" }),
124
- title: field.string({ description: "Step title" }),
125
- description: field.string({
126
- isOptional: true,
127
- description: "Step description"
128
- }),
129
- instructions: field.string({
130
- isOptional: true,
131
- description: "How to complete the step"
132
- }),
133
- helpUrl: field.string({
134
- isOptional: true,
135
- description: "Link to help documentation"
136
- }),
137
- order: field.int({
138
- default: 0,
139
- description: "Display order"
140
- }),
141
- triggerEvent: field.string({
142
- isOptional: true,
143
- description: "Event that triggers step start"
144
- }),
145
- completionEvent: field.string({ description: "Event that completes the step" }),
146
- completionEventVersion: field.int({
147
- isOptional: true,
148
- description: "Version of the completion event"
149
- }),
150
- completionSourceModule: field.string({
151
- isOptional: true,
152
- description: "Module emitting the completion event"
153
- }),
154
- completionEventFilter: field.json({
155
- isOptional: true,
156
- description: "Filter for completion event"
157
- }),
158
- actionUrl: field.string({
159
- isOptional: true,
160
- description: "URL to navigate to complete"
161
- }),
162
- actionLabel: field.string({
163
- isOptional: true,
164
- description: "Action button label"
165
- }),
166
- highlightSelector: field.string({
167
- isOptional: true,
168
- description: "CSS selector to highlight"
169
- }),
170
- tooltipPosition: field.string({
171
- isOptional: true,
172
- description: "Tooltip position"
173
- }),
174
- xpReward: field.int({
175
- default: 10,
176
- description: "XP for completing step"
177
- }),
178
- isRequired: field.boolean({
179
- default: true,
180
- description: "Whether step is required"
181
- }),
182
- canSkip: field.boolean({
183
- default: true,
184
- description: "Whether step can be skipped"
185
- }),
186
- metadata: field.json({
187
- isOptional: true,
188
- description: "Additional metadata"
189
- }),
190
- createdAt: field.createdAt(),
191
- updatedAt: field.updatedAt(),
192
- track: field.belongsTo("OnboardingTrack", ["trackId"], ["id"], { onDelete: "Cascade" })
193
- },
194
- indexes: [index.on(["trackId", "order"]), index.on(["completionEvent"])]
105
+ var OnboardingStepEntity = defineEntity({
106
+ name: "OnboardingStep",
107
+ description: "A step in an onboarding track.",
108
+ schema: "lssm_learning",
109
+ map: "onboarding_step",
110
+ fields: {
111
+ id: field.id({ description: "Unique step identifier" }),
112
+ trackId: field.foreignKey({ description: "Parent track" }),
113
+ title: field.string({ description: "Step title" }),
114
+ description: field.string({
115
+ isOptional: true,
116
+ description: "Step description"
117
+ }),
118
+ instructions: field.string({
119
+ isOptional: true,
120
+ description: "How to complete the step"
121
+ }),
122
+ helpUrl: field.string({
123
+ isOptional: true,
124
+ description: "Link to help documentation"
125
+ }),
126
+ order: field.int({ default: 0, description: "Display order" }),
127
+ triggerEvent: field.string({
128
+ isOptional: true,
129
+ description: "Event that triggers step start"
130
+ }),
131
+ completionEvent: field.string({
132
+ description: "Event that completes the step"
133
+ }),
134
+ completionEventVersion: field.int({
135
+ isOptional: true,
136
+ description: "Version of the completion event"
137
+ }),
138
+ completionSourceModule: field.string({
139
+ isOptional: true,
140
+ description: "Module emitting the completion event"
141
+ }),
142
+ completionEventFilter: field.json({
143
+ isOptional: true,
144
+ description: "Filter for completion event"
145
+ }),
146
+ actionUrl: field.string({
147
+ isOptional: true,
148
+ description: "URL to navigate to complete"
149
+ }),
150
+ actionLabel: field.string({
151
+ isOptional: true,
152
+ description: "Action button label"
153
+ }),
154
+ highlightSelector: field.string({
155
+ isOptional: true,
156
+ description: "CSS selector to highlight"
157
+ }),
158
+ tooltipPosition: field.string({
159
+ isOptional: true,
160
+ description: "Tooltip position"
161
+ }),
162
+ xpReward: field.int({ default: 10, description: "XP for completing step" }),
163
+ isRequired: field.boolean({
164
+ default: true,
165
+ description: "Whether step is required"
166
+ }),
167
+ canSkip: field.boolean({
168
+ default: true,
169
+ description: "Whether step can be skipped"
170
+ }),
171
+ metadata: field.json({
172
+ isOptional: true,
173
+ description: "Additional metadata"
174
+ }),
175
+ createdAt: field.createdAt(),
176
+ updatedAt: field.updatedAt(),
177
+ track: field.belongsTo("OnboardingTrack", ["trackId"], ["id"], {
178
+ onDelete: "Cascade"
179
+ })
180
+ },
181
+ indexes: [index.on(["trackId", "order"]), index.on(["completionEvent"])]
195
182
  });
196
- /**
197
- * OnboardingProgress entity - tracks user progress through onboarding.
198
- */
199
- const OnboardingProgressEntity = defineEntity({
200
- name: "OnboardingProgress",
201
- description: "Tracks user progress through an onboarding track.",
202
- schema: "lssm_learning",
203
- map: "onboarding_progress",
204
- fields: {
205
- id: field.id({ description: "Unique progress identifier" }),
206
- learnerId: field.foreignKey({ description: "Learner" }),
207
- trackId: field.foreignKey({ description: "Onboarding track" }),
208
- currentStepId: field.string({
209
- isOptional: true,
210
- description: "Current step ID"
211
- }),
212
- completedSteps: field.json({
213
- default: "[]",
214
- description: "Array of completed step IDs"
215
- }),
216
- skippedSteps: field.json({
217
- default: "[]",
218
- description: "Array of skipped step IDs"
219
- }),
220
- progress: field.int({
221
- default: 0,
222
- description: "Completion percentage (0-100)"
223
- }),
224
- isCompleted: field.boolean({
225
- default: false,
226
- description: "Whether track is completed"
227
- }),
228
- xpEarned: field.int({
229
- default: 0,
230
- description: "XP earned from track"
231
- }),
232
- startedAt: field.dateTime({ description: "When user started" }),
233
- completedAt: field.dateTime({
234
- isOptional: true,
235
- description: "When user completed"
236
- }),
237
- lastActivityAt: field.dateTime({
238
- isOptional: true,
239
- description: "Last activity"
240
- }),
241
- isDismissed: field.boolean({
242
- default: false,
243
- description: "Whether user dismissed onboarding"
244
- }),
245
- dismissedAt: field.dateTime({
246
- isOptional: true,
247
- description: "When dismissed"
248
- }),
249
- metadata: field.json({
250
- isOptional: true,
251
- description: "Additional metadata"
252
- }),
253
- createdAt: field.createdAt(),
254
- updatedAt: field.updatedAt(),
255
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" }),
256
- track: field.belongsTo("OnboardingTrack", ["trackId"], ["id"], { onDelete: "Cascade" })
257
- },
258
- indexes: [
259
- index.unique(["learnerId", "trackId"], { name: "onboarding_progress_unique" }),
260
- index.on(["learnerId", "isCompleted"]),
261
- index.on(["trackId"])
262
- ],
263
- enums: [OnboardingStepStatusEnum]
183
+ var OnboardingProgressEntity = defineEntity({
184
+ name: "OnboardingProgress",
185
+ description: "Tracks user progress through an onboarding track.",
186
+ schema: "lssm_learning",
187
+ map: "onboarding_progress",
188
+ fields: {
189
+ id: field.id({ description: "Unique progress identifier" }),
190
+ learnerId: field.foreignKey({ description: "Learner" }),
191
+ trackId: field.foreignKey({ description: "Onboarding track" }),
192
+ currentStepId: field.string({
193
+ isOptional: true,
194
+ description: "Current step ID"
195
+ }),
196
+ completedSteps: field.json({
197
+ default: "[]",
198
+ description: "Array of completed step IDs"
199
+ }),
200
+ skippedSteps: field.json({
201
+ default: "[]",
202
+ description: "Array of skipped step IDs"
203
+ }),
204
+ progress: field.int({
205
+ default: 0,
206
+ description: "Completion percentage (0-100)"
207
+ }),
208
+ isCompleted: field.boolean({
209
+ default: false,
210
+ description: "Whether track is completed"
211
+ }),
212
+ xpEarned: field.int({ default: 0, description: "XP earned from track" }),
213
+ startedAt: field.dateTime({ description: "When user started" }),
214
+ completedAt: field.dateTime({
215
+ isOptional: true,
216
+ description: "When user completed"
217
+ }),
218
+ lastActivityAt: field.dateTime({
219
+ isOptional: true,
220
+ description: "Last activity"
221
+ }),
222
+ isDismissed: field.boolean({
223
+ default: false,
224
+ description: "Whether user dismissed onboarding"
225
+ }),
226
+ dismissedAt: field.dateTime({
227
+ isOptional: true,
228
+ description: "When dismissed"
229
+ }),
230
+ metadata: field.json({
231
+ isOptional: true,
232
+ description: "Additional metadata"
233
+ }),
234
+ createdAt: field.createdAt(),
235
+ updatedAt: field.updatedAt(),
236
+ learner: field.belongsTo("Learner", ["learnerId"], ["id"], {
237
+ onDelete: "Cascade"
238
+ }),
239
+ track: field.belongsTo("OnboardingTrack", ["trackId"], ["id"], {
240
+ onDelete: "Cascade"
241
+ })
242
+ },
243
+ indexes: [
244
+ index.unique(["learnerId", "trackId"], {
245
+ name: "onboarding_progress_unique"
246
+ }),
247
+ index.on(["learnerId", "isCompleted"]),
248
+ index.on(["trackId"])
249
+ ],
250
+ enums: [OnboardingStepStatusEnum]
264
251
  });
265
- /**
266
- * OnboardingStepCompletion entity - individual step completions.
267
- */
268
- const OnboardingStepCompletionEntity = defineEntity({
269
- name: "OnboardingStepCompletion",
270
- description: "Individual step completion record.",
271
- schema: "lssm_learning",
272
- map: "onboarding_step_completion",
273
- fields: {
274
- id: field.id({ description: "Unique completion identifier" }),
275
- progressId: field.foreignKey({ description: "Parent progress record" }),
276
- stepId: field.foreignKey({ description: "Completed step" }),
277
- status: field.enum("OnboardingStepStatus", { description: "Completion status" }),
278
- xpEarned: field.int({
279
- default: 0,
280
- description: "XP earned"
281
- }),
282
- triggeringEvent: field.string({
283
- isOptional: true,
284
- description: "Event that triggered completion"
285
- }),
286
- eventPayload: field.json({
287
- isOptional: true,
288
- description: "Event payload"
289
- }),
290
- completedAt: field.dateTime({ description: "When completed" }),
291
- createdAt: field.createdAt(),
292
- progress: field.belongsTo("OnboardingProgress", ["progressId"], ["id"], { onDelete: "Cascade" }),
293
- step: field.belongsTo("OnboardingStep", ["stepId"], ["id"], { onDelete: "Cascade" })
294
- },
295
- indexes: [index.unique(["progressId", "stepId"], { name: "step_completion_unique" }), index.on(["completedAt"])]
252
+ var OnboardingStepCompletionEntity = defineEntity({
253
+ name: "OnboardingStepCompletion",
254
+ description: "Individual step completion record.",
255
+ schema: "lssm_learning",
256
+ map: "onboarding_step_completion",
257
+ fields: {
258
+ id: field.id({ description: "Unique completion identifier" }),
259
+ progressId: field.foreignKey({ description: "Parent progress record" }),
260
+ stepId: field.foreignKey({ description: "Completed step" }),
261
+ status: field.enum("OnboardingStepStatus", {
262
+ description: "Completion status"
263
+ }),
264
+ xpEarned: field.int({ default: 0, description: "XP earned" }),
265
+ triggeringEvent: field.string({
266
+ isOptional: true,
267
+ description: "Event that triggered completion"
268
+ }),
269
+ eventPayload: field.json({
270
+ isOptional: true,
271
+ description: "Event payload"
272
+ }),
273
+ completedAt: field.dateTime({ description: "When completed" }),
274
+ createdAt: field.createdAt(),
275
+ progress: field.belongsTo("OnboardingProgress", ["progressId"], ["id"], {
276
+ onDelete: "Cascade"
277
+ }),
278
+ step: field.belongsTo("OnboardingStep", ["stepId"], ["id"], {
279
+ onDelete: "Cascade"
280
+ })
281
+ },
282
+ indexes: [
283
+ index.unique(["progressId", "stepId"], { name: "step_completion_unique" }),
284
+ index.on(["completedAt"])
285
+ ]
296
286
  });
297
- const onboardingEntities = [
298
- OnboardingTrackEntity,
299
- OnboardingStepEntity,
300
- OnboardingProgressEntity,
301
- OnboardingStepCompletionEntity
287
+ var onboardingEntities = [
288
+ OnboardingTrackEntity,
289
+ OnboardingStepEntity,
290
+ OnboardingProgressEntity,
291
+ OnboardingStepCompletionEntity
302
292
  ];
303
- const onboardingEnums = [OnboardingStepStatusEnum];
304
-
305
- //#endregion
306
- export { OnboardingProgressEntity, OnboardingStepCompletionEntity, OnboardingStepEntity, OnboardingStepStatusEnum, OnboardingTrackEntity, onboardingEntities, onboardingEnums };
307
- //# sourceMappingURL=onboarding.js.map
293
+ var onboardingEnums = [OnboardingStepStatusEnum];
294
+ export {
295
+ onboardingEnums,
296
+ onboardingEntities,
297
+ OnboardingTrackEntity,
298
+ OnboardingStepStatusEnum,
299
+ OnboardingStepEntity,
300
+ OnboardingStepCompletionEntity,
301
+ OnboardingProgressEntity
302
+ };