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

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