@lssm/module.learning-journey 0.0.0-canary-20251217063201 → 0.0.0-canary-20251217073102

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 (156) hide show
  1. package/dist/contracts/index.js +6 -1
  2. package/dist/contracts/models.d.ts +118 -118
  3. package/dist/contracts/models.js +389 -1
  4. package/dist/contracts/onboarding.d.ts +167 -167
  5. package/dist/contracts/onboarding.js +404 -1
  6. package/dist/contracts/operations.d.ts +70 -70
  7. package/dist/contracts/operations.js +151 -1
  8. package/dist/contracts/shared.js +5 -1
  9. package/dist/docs/index.js +1 -1
  10. package/dist/docs/learning-journey.docblock.js +61 -5
  11. package/dist/engines/index.js +5 -1
  12. package/dist/engines/srs.js +219 -1
  13. package/dist/engines/streak.js +193 -1
  14. package/dist/engines/xp.js +212 -1
  15. package/dist/entities/ai.d.ts +200 -200
  16. package/dist/entities/ai.js +376 -1
  17. package/dist/entities/course.d.ts +150 -150
  18. package/dist/entities/course.js +316 -1
  19. package/dist/entities/flashcard.d.ts +145 -145
  20. package/dist/entities/flashcard.js +249 -1
  21. package/dist/entities/gamification.d.ts +198 -198
  22. package/dist/entities/gamification.js +392 -1
  23. package/dist/entities/index.d.ts +605 -605
  24. package/dist/entities/index.js +44 -1
  25. package/dist/entities/learner.d.ts +192 -192
  26. package/dist/entities/learner.js +365 -1
  27. package/dist/entities/onboarding.d.ts +165 -165
  28. package/dist/entities/onboarding.js +307 -1
  29. package/dist/entities/quiz.d.ts +185 -185
  30. package/dist/entities/quiz.js +370 -1
  31. package/dist/events.d.ts +213 -213
  32. package/dist/events.js +583 -1
  33. package/dist/index.js +22 -1
  34. package/dist/learning-journey.feature.js +148 -1
  35. package/dist/libs/contracts/dist/capabilities/openbanking.js +88 -1
  36. package/dist/libs/contracts/dist/client/index.js +5 -1
  37. package/dist/libs/contracts/dist/client/react/feature-render.js +2 -1
  38. package/dist/libs/contracts/dist/client/react/form-render.js +4 -1
  39. package/dist/libs/contracts/dist/client/react/index.js +4 -1
  40. package/dist/libs/contracts/dist/contract-registry/index.js +1 -1
  41. package/dist/libs/contracts/dist/contract-registry/schemas.js +60 -1
  42. package/dist/libs/contracts/dist/docs/PUBLISHING.docblock.js +16 -76
  43. package/dist/libs/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js +16 -350
  44. package/dist/libs/contracts/dist/docs/index.js +29 -1
  45. package/dist/libs/contracts/dist/docs/presentations.js +71 -1
  46. package/dist/libs/contracts/dist/docs/registry.js +44 -1
  47. package/dist/libs/contracts/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +16 -383
  48. package/dist/libs/contracts/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +16 -68
  49. package/dist/libs/contracts/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +16 -140
  50. package/dist/libs/contracts/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +16 -86
  51. package/dist/libs/contracts/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +16 -1
  52. package/dist/libs/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js +24 -2
  53. package/dist/libs/contracts/dist/docs/tech/contracts/openapi-export.docblock.js +21 -2
  54. package/dist/libs/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js +16 -213
  55. package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js +73 -5
  56. package/dist/libs/contracts/dist/docs/tech/mcp-endpoints.docblock.js +37 -1
  57. package/dist/libs/contracts/dist/docs/tech/presentation-runtime.docblock.js +16 -1
  58. package/dist/libs/contracts/dist/docs/tech/schema/README.docblock.js +20 -262
  59. package/dist/libs/contracts/dist/docs/tech/studio/learning-events.docblock.js +48 -1
  60. package/dist/libs/contracts/dist/docs/tech/studio/learning-journeys.docblock.js +24 -2
  61. package/dist/libs/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js +23 -2
  62. package/dist/libs/contracts/dist/docs/tech/studio/project-access-teams.docblock.js +25 -16
  63. package/dist/libs/contracts/dist/docs/tech/studio/project-routing.docblock.js +67 -1
  64. package/dist/libs/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js +22 -2
  65. package/dist/libs/contracts/dist/docs/tech/studio/team-invitations.docblock.js +40 -36
  66. package/dist/libs/contracts/dist/docs/tech/studio/workspace-ops.docblock.js +47 -1
  67. package/dist/libs/contracts/dist/docs/tech/studio/workspaces.docblock.js +23 -2
  68. package/dist/libs/contracts/dist/docs/tech/telemetry-ingest.docblock.js +36 -3
  69. package/dist/libs/contracts/dist/docs/tech/templates/runtime.docblock.js +20 -1
  70. package/dist/libs/contracts/dist/docs/tech/vscode-extension.docblock.js +36 -3
  71. package/dist/libs/contracts/dist/docs/tech/workflows/overview.docblock.js +20 -1
  72. package/dist/libs/contracts/dist/events.js +10 -1
  73. package/dist/libs/contracts/dist/experiments/evaluator.js +1 -1
  74. package/dist/libs/contracts/dist/index.js +71 -1
  75. package/dist/libs/contracts/dist/install.js +2 -1
  76. package/dist/libs/contracts/dist/integrations/contracts.js +377 -1
  77. package/dist/libs/contracts/dist/integrations/index.js +18 -1
  78. package/dist/libs/contracts/dist/integrations/openbanking/contracts/accounts.js +228 -1
  79. package/dist/libs/contracts/dist/integrations/openbanking/contracts/balances.js +159 -1
  80. package/dist/libs/contracts/dist/integrations/openbanking/contracts/index.js +3 -1
  81. package/dist/libs/contracts/dist/integrations/openbanking/contracts/transactions.js +210 -1
  82. package/dist/libs/contracts/dist/integrations/openbanking/models.js +242 -1
  83. package/dist/libs/contracts/dist/integrations/openbanking/telemetry.js +13 -1
  84. package/dist/libs/contracts/dist/integrations/providers/elevenlabs.js +52 -1
  85. package/dist/libs/contracts/dist/integrations/providers/gcs-storage.js +75 -1
  86. package/dist/libs/contracts/dist/integrations/providers/gmail.js +87 -1
  87. package/dist/libs/contracts/dist/integrations/providers/google-calendar.js +66 -1
  88. package/dist/libs/contracts/dist/integrations/providers/index.js +11 -1
  89. package/dist/libs/contracts/dist/integrations/providers/mistral.js +68 -1
  90. package/dist/libs/contracts/dist/integrations/providers/postmark.js +68 -1
  91. package/dist/libs/contracts/dist/integrations/providers/powens.js +116 -1
  92. package/dist/libs/contracts/dist/integrations/providers/qdrant.js +73 -1
  93. package/dist/libs/contracts/dist/integrations/providers/registry.js +10 -1
  94. package/dist/libs/contracts/dist/integrations/providers/stripe.js +83 -1
  95. package/dist/libs/contracts/dist/integrations/providers/twilio-sms.js +61 -1
  96. package/dist/libs/contracts/dist/jsonschema.js +1 -1
  97. package/dist/libs/contracts/dist/knowledge/contracts.js +306 -1
  98. package/dist/libs/contracts/dist/knowledge/index.js +7 -1
  99. package/dist/libs/contracts/dist/knowledge/spaces/email-threads.js +34 -1
  100. package/dist/libs/contracts/dist/knowledge/spaces/financial-docs.js +34 -1
  101. package/dist/libs/contracts/dist/knowledge/spaces/financial-overview.js +38 -1
  102. package/dist/libs/contracts/dist/knowledge/spaces/index.js +6 -1
  103. package/dist/libs/contracts/dist/knowledge/spaces/product-canon.js +34 -1
  104. package/dist/libs/contracts/dist/knowledge/spaces/support-faq.js +37 -1
  105. package/dist/libs/contracts/dist/knowledge/spaces/uploaded-docs.js +34 -1
  106. package/dist/libs/contracts/dist/llm/exporters.js +19 -1
  107. package/dist/libs/contracts/dist/llm/index.js +2 -1
  108. package/dist/libs/contracts/dist/llm/prompts.js +1 -1
  109. package/dist/libs/contracts/dist/onboarding-base.js +196 -1
  110. package/dist/libs/contracts/dist/openapi.js +1 -1
  111. package/dist/libs/contracts/dist/ownership.js +21 -1
  112. package/dist/libs/contracts/dist/presentations.js +1 -1
  113. package/dist/libs/contracts/dist/presentations.v2.js +11 -1
  114. package/dist/libs/contracts/dist/prompt.js +1 -1
  115. package/dist/libs/contracts/dist/promptRegistry.js +1 -1
  116. package/dist/libs/contracts/dist/regenerator/index.js +1 -1
  117. package/dist/libs/contracts/dist/regenerator/service.js +6 -1
  118. package/dist/libs/contracts/dist/registry.js +2 -1
  119. package/dist/libs/contracts/dist/resources.js +1 -1
  120. package/dist/libs/contracts/dist/schema/dist/EnumType.js +2 -1
  121. package/dist/libs/contracts/dist/schema/dist/FieldType.js +49 -1
  122. package/dist/libs/contracts/dist/schema/dist/ScalarTypeEnum.js +236 -1
  123. package/dist/libs/contracts/dist/schema/dist/SchemaModel.js +34 -1
  124. package/dist/libs/contracts/dist/schema/dist/entity/defineEntity.js +1 -1
  125. package/dist/libs/contracts/dist/schema/dist/entity/index.js +2 -1
  126. package/dist/libs/contracts/dist/schema/dist/entity/types.js +1 -1
  127. package/dist/libs/contracts/dist/schema/dist/index.js +6 -1
  128. package/dist/libs/contracts/dist/server/graphql-pothos.js +6 -1
  129. package/dist/libs/contracts/dist/server/index.js +8 -1
  130. package/dist/libs/contracts/dist/server/mcp/createMcpServer.js +4 -1
  131. package/dist/libs/contracts/dist/server/mcp/registerPresentations.js +2 -1
  132. package/dist/libs/contracts/dist/server/mcp/registerPrompts.js +1 -1
  133. package/dist/libs/contracts/dist/server/mcp/registerResources.js +2 -1
  134. package/dist/libs/contracts/dist/server/mcp/registerTools.js +1 -1
  135. package/dist/libs/contracts/dist/server/provider-mcp.js +1 -1
  136. package/dist/libs/contracts/dist/server/rest-elysia.js +1 -1
  137. package/dist/libs/contracts/dist/server/rest-express.js +1 -1
  138. package/dist/libs/contracts/dist/server/rest-generic.js +1 -1
  139. package/dist/libs/contracts/dist/server/rest-next-app.js +1 -1
  140. package/dist/libs/contracts/dist/server/rest-next-pages.js +1 -1
  141. package/dist/libs/contracts/dist/spec.js +34 -1
  142. package/dist/libs/contracts/dist/telemetry/index.js +1 -1
  143. package/dist/libs/contracts/dist/telemetry/tracker.js +1 -1
  144. package/dist/libs/contracts/dist/tests/index.js +1 -1
  145. package/dist/libs/contracts/dist/tests/runner.js +2 -1
  146. package/dist/libs/contracts/dist/workflow/index.js +1 -1
  147. package/dist/libs/contracts/dist/workflow/runner.js +1 -1
  148. package/dist/libs/schema/dist/EnumType.js +2 -1
  149. package/dist/libs/schema/dist/FieldType.js +49 -1
  150. package/dist/libs/schema/dist/ScalarTypeEnum.js +236 -1
  151. package/dist/libs/schema/dist/SchemaModel.js +39 -1
  152. package/dist/libs/schema/dist/entity/defineEntity.js +236 -1
  153. package/dist/libs/schema/dist/entity/index.js +2 -1
  154. package/dist/libs/schema/dist/entity/types.js +1 -1
  155. package/dist/libs/schema/dist/index.js +6 -1
  156. package/package.json +5 -5
@@ -1 +1,365 @@
1
- import{i as e,n as t,r as n,t as r}from"../libs/schema/dist/entity/defineEntity.js";import"../libs/schema/dist/index.js";const i=t({name:`EnrollmentStatus`,values:[`ENROLLED`,`IN_PROGRESS`,`COMPLETED`,`DROPPED`,`EXPIRED`],schema:`lssm_learning`,description:`Status of a course enrollment.`}),a=t({name:`ProgressStatus`,values:[`NOT_STARTED`,`IN_PROGRESS`,`COMPLETED`,`SKIPPED`],schema:`lssm_learning`,description:`Status of lesson progress.`}),o=r({name:`Learner`,description:`A learner profile.`,schema:`lssm_learning`,map:`learner`,fields:{id:n.id({description:`Unique learner identifier`}),userId:n.string({isUnique:!0,description:`Associated user ID`}),displayName:n.string({isOptional:!0,description:`Display name`}),avatarUrl:n.string({isOptional:!0,description:`Avatar URL`}),bio:n.string({isOptional:!0,description:`Short bio`}),level:n.int({default:1,description:`Current level`}),totalXp:n.int({default:0,description:`Total XP earned`}),currentStreak:n.int({default:0,description:`Current streak days`}),longestStreak:n.int({default:0,description:`Longest streak ever`}),lastActivityAt:n.dateTime({isOptional:!0,description:`Last learning activity`}),timezone:n.string({default:`"UTC"`,description:`Learner timezone`}),dailyGoalXp:n.int({default:50,description:`Daily XP goal`}),reminderEnabled:n.boolean({default:!0,description:`Enable reminders`}),reminderTime:n.string({isOptional:!0,description:`Preferred reminder time`}),orgId:n.string({isOptional:!0,description:`Organization scope`}),metadata:n.json({isOptional:!0,description:`Additional metadata`}),createdAt:n.createdAt(),updatedAt:n.updatedAt(),enrollments:n.hasMany(`Enrollment`),lessonProgress:n.hasMany(`LessonProgress`),achievements:n.hasMany(`LearnerAchievement`),decks:n.hasMany(`Deck`),profile:n.hasOne(`LearnerProfile`)},indexes:[e.on([`orgId`]),e.on([`totalXp`]),e.on([`level`]),e.on([`currentStreak`])]}),s=r({name:`Enrollment`,description:`A learner enrollment in a course.`,schema:`lssm_learning`,map:`enrollment`,fields:{id:n.id({description:`Unique enrollment identifier`}),learnerId:n.foreignKey({description:`Enrolled learner`}),courseId:n.foreignKey({description:`Enrolled course`}),status:n.enum(`EnrollmentStatus`,{default:`ENROLLED`,description:`Enrollment status`}),progress:n.int({default:0,description:`Completion percentage (0-100)`}),completedLessons:n.int({default:0,description:`Number of completed lessons`}),totalLessons:n.int({default:0,description:`Total lessons in course`}),xpEarned:n.int({default:0,description:`XP earned in this course`}),startedAt:n.dateTime({isOptional:!0,description:`When learner started`}),completedAt:n.dateTime({isOptional:!0,description:`When learner completed`}),lastAccessedAt:n.dateTime({isOptional:!0,description:`Last access time`}),certificateId:n.string({isOptional:!0,description:`Issued certificate ID`}),metadata:n.json({isOptional:!0,description:`Additional metadata`}),createdAt:n.createdAt(),updatedAt:n.updatedAt(),learner:n.belongsTo(`Learner`,[`learnerId`],[`id`],{onDelete:`Cascade`}),course:n.belongsTo(`Course`,[`courseId`],[`id`],{onDelete:`Cascade`})},indexes:[e.unique([`learnerId`,`courseId`],{name:`enrollment_unique`}),e.on([`learnerId`,`status`]),e.on([`courseId`,`status`])],enums:[i]}),c=r({name:`LessonProgress`,description:`Progress tracking for a lesson.`,schema:`lssm_learning`,map:`lesson_progress`,fields:{id:n.id({description:`Unique progress identifier`}),learnerId:n.foreignKey({description:`Learner`}),lessonId:n.foreignKey({description:`Lesson`}),status:n.enum(`ProgressStatus`,{default:`NOT_STARTED`,description:`Progress status`}),progress:n.int({default:0,description:`Completion percentage (0-100)`}),score:n.int({isOptional:!0,description:`Score achieved (for quizzes)`}),attempts:n.int({default:0,description:`Number of attempts`}),bestScore:n.int({isOptional:!0,description:`Best score across attempts`}),timeSpent:n.int({default:0,description:`Time spent in seconds`}),xpEarned:n.int({default:0,description:`XP earned from this lesson`}),startedAt:n.dateTime({isOptional:!0,description:`When started`}),completedAt:n.dateTime({isOptional:!0,description:`When completed`}),lastAccessedAt:n.dateTime({isOptional:!0,description:`Last access time`}),bookmarks:n.json({isOptional:!0,description:`Content bookmarks`}),notes:n.string({isOptional:!0,description:`Learner notes`}),createdAt:n.createdAt(),updatedAt:n.updatedAt(),learner:n.belongsTo(`Learner`,[`learnerId`],[`id`],{onDelete:`Cascade`}),lesson:n.belongsTo(`Lesson`,[`lessonId`],[`id`],{onDelete:`Cascade`})},indexes:[e.unique([`learnerId`,`lessonId`],{name:`lesson_progress_unique`}),e.on([`learnerId`,`status`]),e.on([`lessonId`])],enums:[a]}),l=r({name:`ModuleCompletion`,description:`Module completion record.`,schema:`lssm_learning`,map:`module_completion`,fields:{id:n.id({description:`Unique completion identifier`}),learnerId:n.foreignKey({description:`Learner`}),moduleId:n.foreignKey({description:`Module`}),score:n.int({isOptional:!0,description:`Average score`}),xpEarned:n.int({default:0,description:`XP earned`}),timeSpent:n.int({default:0,description:`Time spent in seconds`}),completedAt:n.dateTime({description:`When completed`}),createdAt:n.createdAt(),learner:n.belongsTo(`Learner`,[`learnerId`],[`id`],{onDelete:`Cascade`}),module:n.belongsTo(`CourseModule`,[`moduleId`],[`id`],{onDelete:`Cascade`})},indexes:[e.unique([`learnerId`,`moduleId`],{name:`module_completion_unique`}),e.on([`learnerId`,`completedAt`])]}),u=r({name:`Certificate`,description:`Course completion certificate.`,schema:`lssm_learning`,map:`certificate`,fields:{id:n.id({description:`Unique certificate identifier`}),learnerId:n.foreignKey({description:`Certificate holder`}),courseId:n.foreignKey({description:`Completed course`}),enrollmentId:n.foreignKey({description:`Associated enrollment`}),certificateNumber:n.string({isUnique:!0,description:`Unique certificate number`}),title:n.string({description:`Certificate title`}),description:n.string({isOptional:!0,description:`Certificate description`}),score:n.int({isOptional:!0,description:`Final score`}),grade:n.string({isOptional:!0,description:`Grade awarded`}),issuedAt:n.dateTime({description:`When issued`}),validUntil:n.dateTime({isOptional:!0,description:`Expiration date`}),verificationUrl:n.string({isOptional:!0,description:`Verification URL`}),credentialHash:n.string({isOptional:!0,description:`Credential hash for verification`}),isRevoked:n.boolean({default:!1,description:`Whether certificate is revoked`}),revokedAt:n.dateTime({isOptional:!0,description:`When revoked`}),revokedReason:n.string({isOptional:!0,description:`Revocation reason`}),metadata:n.json({isOptional:!0,description:`Additional metadata`}),createdAt:n.createdAt(),learner:n.belongsTo(`Learner`,[`learnerId`],[`id`],{onDelete:`Cascade`}),course:n.belongsTo(`Course`,[`courseId`],[`id`],{onDelete:`Cascade`})},indexes:[e.on([`learnerId`]),e.on([`courseId`]),e.on([`issuedAt`])]}),d=[o,s,c,l,u],f=[i,a];export{u as CertificateEntity,s as EnrollmentEntity,i as EnrollmentStatusEnum,o as LearnerEntity,c as LessonProgressEntity,l as ModuleCompletionEntity,a as ProgressStatusEnum,d as learnerEntities,f as learnerEnums};
1
+ import { defineEntity, defineEntityEnum, field, index } from "../libs/schema/dist/entity/defineEntity.js";
2
+ import "../libs/schema/dist/index.js";
3
+
4
+ //#region src/entities/learner.ts
5
+ /**
6
+ * Enrollment status enum.
7
+ */
8
+ const EnrollmentStatusEnum = defineEntityEnum({
9
+ name: "EnrollmentStatus",
10
+ values: [
11
+ "ENROLLED",
12
+ "IN_PROGRESS",
13
+ "COMPLETED",
14
+ "DROPPED",
15
+ "EXPIRED"
16
+ ],
17
+ schema: "lssm_learning",
18
+ description: "Status of a course enrollment."
19
+ });
20
+ /**
21
+ * Progress status enum.
22
+ */
23
+ const ProgressStatusEnum = defineEntityEnum({
24
+ name: "ProgressStatus",
25
+ values: [
26
+ "NOT_STARTED",
27
+ "IN_PROGRESS",
28
+ "COMPLETED",
29
+ "SKIPPED"
30
+ ],
31
+ schema: "lssm_learning",
32
+ description: "Status of lesson progress."
33
+ });
34
+ /**
35
+ * Learner entity - learning profile.
36
+ */
37
+ const LearnerEntity = defineEntity({
38
+ name: "Learner",
39
+ description: "A learner profile.",
40
+ schema: "lssm_learning",
41
+ map: "learner",
42
+ fields: {
43
+ id: field.id({ description: "Unique learner identifier" }),
44
+ userId: field.string({
45
+ isUnique: true,
46
+ description: "Associated user ID"
47
+ }),
48
+ displayName: field.string({
49
+ isOptional: true,
50
+ description: "Display name"
51
+ }),
52
+ avatarUrl: field.string({
53
+ isOptional: true,
54
+ description: "Avatar URL"
55
+ }),
56
+ bio: field.string({
57
+ isOptional: true,
58
+ description: "Short bio"
59
+ }),
60
+ level: field.int({
61
+ default: 1,
62
+ description: "Current level"
63
+ }),
64
+ totalXp: field.int({
65
+ default: 0,
66
+ description: "Total XP earned"
67
+ }),
68
+ currentStreak: field.int({
69
+ default: 0,
70
+ description: "Current streak days"
71
+ }),
72
+ longestStreak: field.int({
73
+ default: 0,
74
+ description: "Longest streak ever"
75
+ }),
76
+ lastActivityAt: field.dateTime({
77
+ isOptional: true,
78
+ description: "Last learning activity"
79
+ }),
80
+ timezone: field.string({
81
+ default: "\"UTC\"",
82
+ description: "Learner timezone"
83
+ }),
84
+ dailyGoalXp: field.int({
85
+ default: 50,
86
+ description: "Daily XP goal"
87
+ }),
88
+ reminderEnabled: field.boolean({
89
+ default: true,
90
+ description: "Enable reminders"
91
+ }),
92
+ reminderTime: field.string({
93
+ isOptional: true,
94
+ description: "Preferred reminder time"
95
+ }),
96
+ orgId: field.string({
97
+ isOptional: true,
98
+ description: "Organization scope"
99
+ }),
100
+ metadata: field.json({
101
+ isOptional: true,
102
+ description: "Additional metadata"
103
+ }),
104
+ createdAt: field.createdAt(),
105
+ updatedAt: field.updatedAt(),
106
+ enrollments: field.hasMany("Enrollment"),
107
+ lessonProgress: field.hasMany("LessonProgress"),
108
+ achievements: field.hasMany("LearnerAchievement"),
109
+ decks: field.hasMany("Deck"),
110
+ profile: field.hasOne("LearnerProfile")
111
+ },
112
+ indexes: [
113
+ index.on(["orgId"]),
114
+ index.on(["totalXp"]),
115
+ index.on(["level"]),
116
+ index.on(["currentStreak"])
117
+ ]
118
+ });
119
+ /**
120
+ * Enrollment entity - course enrollment.
121
+ */
122
+ const EnrollmentEntity = defineEntity({
123
+ name: "Enrollment",
124
+ description: "A learner enrollment in a course.",
125
+ schema: "lssm_learning",
126
+ map: "enrollment",
127
+ fields: {
128
+ id: field.id({ description: "Unique enrollment identifier" }),
129
+ learnerId: field.foreignKey({ description: "Enrolled learner" }),
130
+ courseId: field.foreignKey({ description: "Enrolled course" }),
131
+ status: field.enum("EnrollmentStatus", {
132
+ default: "ENROLLED",
133
+ description: "Enrollment status"
134
+ }),
135
+ progress: field.int({
136
+ default: 0,
137
+ description: "Completion percentage (0-100)"
138
+ }),
139
+ completedLessons: field.int({
140
+ default: 0,
141
+ description: "Number of completed lessons"
142
+ }),
143
+ totalLessons: field.int({
144
+ default: 0,
145
+ description: "Total lessons in course"
146
+ }),
147
+ xpEarned: field.int({
148
+ default: 0,
149
+ description: "XP earned in this course"
150
+ }),
151
+ startedAt: field.dateTime({
152
+ isOptional: true,
153
+ description: "When learner started"
154
+ }),
155
+ completedAt: field.dateTime({
156
+ isOptional: true,
157
+ description: "When learner completed"
158
+ }),
159
+ lastAccessedAt: field.dateTime({
160
+ isOptional: true,
161
+ description: "Last access time"
162
+ }),
163
+ certificateId: field.string({
164
+ isOptional: true,
165
+ description: "Issued certificate ID"
166
+ }),
167
+ metadata: field.json({
168
+ isOptional: true,
169
+ description: "Additional metadata"
170
+ }),
171
+ createdAt: field.createdAt(),
172
+ updatedAt: field.updatedAt(),
173
+ learner: field.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" }),
174
+ course: field.belongsTo("Course", ["courseId"], ["id"], { onDelete: "Cascade" })
175
+ },
176
+ indexes: [
177
+ index.unique(["learnerId", "courseId"], { name: "enrollment_unique" }),
178
+ index.on(["learnerId", "status"]),
179
+ index.on(["courseId", "status"])
180
+ ],
181
+ enums: [EnrollmentStatusEnum]
182
+ });
183
+ /**
184
+ * LessonProgress entity - tracks individual lesson progress.
185
+ */
186
+ const LessonProgressEntity = defineEntity({
187
+ name: "LessonProgress",
188
+ description: "Progress tracking for a lesson.",
189
+ schema: "lssm_learning",
190
+ map: "lesson_progress",
191
+ fields: {
192
+ id: field.id({ description: "Unique progress identifier" }),
193
+ learnerId: field.foreignKey({ description: "Learner" }),
194
+ lessonId: field.foreignKey({ description: "Lesson" }),
195
+ status: field.enum("ProgressStatus", {
196
+ default: "NOT_STARTED",
197
+ description: "Progress status"
198
+ }),
199
+ progress: field.int({
200
+ default: 0,
201
+ description: "Completion percentage (0-100)"
202
+ }),
203
+ score: field.int({
204
+ isOptional: true,
205
+ description: "Score achieved (for quizzes)"
206
+ }),
207
+ attempts: field.int({
208
+ default: 0,
209
+ description: "Number of attempts"
210
+ }),
211
+ bestScore: field.int({
212
+ isOptional: true,
213
+ description: "Best score across attempts"
214
+ }),
215
+ timeSpent: field.int({
216
+ default: 0,
217
+ description: "Time spent in seconds"
218
+ }),
219
+ xpEarned: field.int({
220
+ default: 0,
221
+ description: "XP earned from this lesson"
222
+ }),
223
+ startedAt: field.dateTime({
224
+ isOptional: true,
225
+ description: "When started"
226
+ }),
227
+ completedAt: field.dateTime({
228
+ isOptional: true,
229
+ description: "When completed"
230
+ }),
231
+ lastAccessedAt: field.dateTime({
232
+ isOptional: true,
233
+ description: "Last access time"
234
+ }),
235
+ bookmarks: field.json({
236
+ isOptional: true,
237
+ description: "Content bookmarks"
238
+ }),
239
+ notes: field.string({
240
+ isOptional: true,
241
+ description: "Learner notes"
242
+ }),
243
+ createdAt: field.createdAt(),
244
+ updatedAt: field.updatedAt(),
245
+ learner: field.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" }),
246
+ lesson: field.belongsTo("Lesson", ["lessonId"], ["id"], { onDelete: "Cascade" })
247
+ },
248
+ indexes: [
249
+ index.unique(["learnerId", "lessonId"], { name: "lesson_progress_unique" }),
250
+ index.on(["learnerId", "status"]),
251
+ index.on(["lessonId"])
252
+ ],
253
+ enums: [ProgressStatusEnum]
254
+ });
255
+ /**
256
+ * ModuleCompletion entity - tracks module completion.
257
+ */
258
+ const ModuleCompletionEntity = defineEntity({
259
+ name: "ModuleCompletion",
260
+ description: "Module completion record.",
261
+ schema: "lssm_learning",
262
+ map: "module_completion",
263
+ fields: {
264
+ id: field.id({ description: "Unique completion identifier" }),
265
+ learnerId: field.foreignKey({ description: "Learner" }),
266
+ moduleId: field.foreignKey({ description: "Module" }),
267
+ score: field.int({
268
+ isOptional: true,
269
+ description: "Average score"
270
+ }),
271
+ xpEarned: field.int({
272
+ default: 0,
273
+ description: "XP earned"
274
+ }),
275
+ timeSpent: field.int({
276
+ default: 0,
277
+ description: "Time spent in seconds"
278
+ }),
279
+ completedAt: field.dateTime({ description: "When completed" }),
280
+ createdAt: field.createdAt(),
281
+ learner: field.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" }),
282
+ module: field.belongsTo("CourseModule", ["moduleId"], ["id"], { onDelete: "Cascade" })
283
+ },
284
+ indexes: [index.unique(["learnerId", "moduleId"], { name: "module_completion_unique" }), index.on(["learnerId", "completedAt"])]
285
+ });
286
+ /**
287
+ * Certificate entity - course completion certificate.
288
+ */
289
+ const CertificateEntity = defineEntity({
290
+ name: "Certificate",
291
+ description: "Course completion certificate.",
292
+ schema: "lssm_learning",
293
+ map: "certificate",
294
+ fields: {
295
+ id: field.id({ description: "Unique certificate identifier" }),
296
+ learnerId: field.foreignKey({ description: "Certificate holder" }),
297
+ courseId: field.foreignKey({ description: "Completed course" }),
298
+ enrollmentId: field.foreignKey({ description: "Associated enrollment" }),
299
+ certificateNumber: field.string({
300
+ isUnique: true,
301
+ description: "Unique certificate number"
302
+ }),
303
+ title: field.string({ description: "Certificate title" }),
304
+ description: field.string({
305
+ isOptional: true,
306
+ description: "Certificate description"
307
+ }),
308
+ score: field.int({
309
+ isOptional: true,
310
+ description: "Final score"
311
+ }),
312
+ grade: field.string({
313
+ isOptional: true,
314
+ description: "Grade awarded"
315
+ }),
316
+ issuedAt: field.dateTime({ description: "When issued" }),
317
+ validUntil: field.dateTime({
318
+ isOptional: true,
319
+ description: "Expiration date"
320
+ }),
321
+ verificationUrl: field.string({
322
+ isOptional: true,
323
+ description: "Verification URL"
324
+ }),
325
+ credentialHash: field.string({
326
+ isOptional: true,
327
+ description: "Credential hash for verification"
328
+ }),
329
+ isRevoked: field.boolean({
330
+ default: false,
331
+ description: "Whether certificate is revoked"
332
+ }),
333
+ revokedAt: field.dateTime({
334
+ isOptional: true,
335
+ description: "When revoked"
336
+ }),
337
+ revokedReason: field.string({
338
+ isOptional: true,
339
+ description: "Revocation reason"
340
+ }),
341
+ metadata: field.json({
342
+ isOptional: true,
343
+ description: "Additional metadata"
344
+ }),
345
+ createdAt: field.createdAt(),
346
+ learner: field.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" }),
347
+ course: field.belongsTo("Course", ["courseId"], ["id"], { onDelete: "Cascade" })
348
+ },
349
+ indexes: [
350
+ index.on(["learnerId"]),
351
+ index.on(["courseId"]),
352
+ index.on(["issuedAt"])
353
+ ]
354
+ });
355
+ const learnerEntities = [
356
+ LearnerEntity,
357
+ EnrollmentEntity,
358
+ LessonProgressEntity,
359
+ ModuleCompletionEntity,
360
+ CertificateEntity
361
+ ];
362
+ const learnerEnums = [EnrollmentStatusEnum, ProgressStatusEnum];
363
+
364
+ //#endregion
365
+ export { CertificateEntity, EnrollmentEntity, EnrollmentStatusEnum, LearnerEntity, LessonProgressEntity, ModuleCompletionEntity, ProgressStatusEnum, learnerEntities, learnerEnums };