@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.
- package/dist/browser/contracts/index.js +578 -0
- package/dist/browser/contracts/models.js +193 -0
- package/dist/browser/contracts/onboarding.js +417 -0
- package/dist/browser/contracts/operations.js +326 -0
- package/dist/browser/contracts/shared.js +5 -0
- package/dist/browser/docs/index.js +124 -0
- package/dist/browser/docs/learning-journey.docblock.js +124 -0
- package/dist/browser/engines/index.js +526 -0
- package/dist/browser/engines/srs.js +198 -0
- package/dist/browser/engines/streak.js +159 -0
- package/dist/browser/engines/xp.js +171 -0
- package/dist/browser/entities/ai.js +343 -0
- package/dist/browser/entities/course.js +276 -0
- package/dist/browser/entities/flashcard.js +222 -0
- package/dist/browser/entities/gamification.js +340 -0
- package/dist/browser/entities/index.js +2136 -0
- package/dist/browser/entities/learner.js +329 -0
- package/dist/browser/entities/onboarding.js +301 -0
- package/dist/browser/entities/quiz.js +304 -0
- package/dist/browser/events.js +423 -0
- package/dist/browser/index.js +3833 -0
- package/dist/browser/learning-journey.capability.js +40 -0
- package/dist/browser/learning-journey.feature.js +56 -0
- package/dist/browser/track-spec.js +0 -0
- package/dist/contracts/index.d.ts +5 -5
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +578 -5
- package/dist/contracts/models.d.ts +426 -431
- package/dist/contracts/models.d.ts.map +1 -1
- package/dist/contracts/models.js +178 -372
- package/dist/contracts/onboarding.d.ts +621 -627
- package/dist/contracts/onboarding.d.ts.map +1 -1
- package/dist/contracts/onboarding.js +404 -388
- package/dist/contracts/operations.d.ts +243 -249
- package/dist/contracts/operations.d.ts.map +1 -1
- package/dist/contracts/operations.js +324 -148
- package/dist/contracts/shared.d.ts +1 -4
- package/dist/contracts/shared.d.ts.map +1 -1
- package/dist/contracts/shared.js +6 -6
- package/dist/docs/index.d.ts +2 -1
- package/dist/docs/index.d.ts.map +1 -0
- package/dist/docs/index.js +125 -1
- package/dist/docs/learning-journey.docblock.d.ts +2 -1
- package/dist/docs/learning-journey.docblock.d.ts.map +1 -0
- package/dist/docs/learning-journey.docblock.js +47 -58
- package/dist/engines/index.d.ts +4 -4
- package/dist/engines/index.d.ts.map +1 -0
- package/dist/engines/index.js +526 -4
- package/dist/engines/srs.d.ts +89 -92
- package/dist/engines/srs.d.ts.map +1 -1
- package/dist/engines/srs.js +197 -217
- package/dist/engines/streak.d.ts +84 -87
- package/dist/engines/streak.d.ts.map +1 -1
- package/dist/engines/streak.js +158 -192
- package/dist/engines/xp.d.ts +80 -83
- package/dist/engines/xp.d.ts.map +1 -1
- package/dist/engines/xp.js +170 -211
- package/dist/entities/ai.d.ts +199 -204
- package/dist/entities/ai.d.ts.map +1 -1
- package/dist/entities/ai.js +336 -368
- package/dist/entities/course.d.ts +149 -154
- package/dist/entities/course.d.ts.map +1 -1
- package/dist/entities/course.js +267 -306
- package/dist/entities/flashcard.d.ts +144 -149
- package/dist/entities/flashcard.d.ts.map +1 -1
- package/dist/entities/flashcard.js +217 -243
- package/dist/entities/gamification.d.ts +197 -202
- package/dist/entities/gamification.d.ts.map +1 -1
- package/dist/entities/gamification.js +331 -382
- package/dist/entities/index.d.ts +613 -618
- package/dist/entities/index.d.ts.map +1 -1
- package/dist/entities/index.js +2135 -43
- package/dist/entities/learner.d.ts +191 -196
- package/dist/entities/learner.d.ts.map +1 -1
- package/dist/entities/learner.js +322 -357
- package/dist/entities/onboarding.d.ts +164 -169
- package/dist/entities/onboarding.d.ts.map +1 -1
- package/dist/entities/onboarding.js +296 -301
- package/dist/entities/quiz.d.ts +184 -189
- package/dist/entities/quiz.d.ts.map +1 -1
- package/dist/entities/quiz.js +296 -361
- package/dist/events.d.ts +608 -614
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +421 -687
- package/dist/index.d.ts +8 -20
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3834 -22
- package/dist/learning-journey.capability.d.ts +3 -8
- package/dist/learning-journey.capability.d.ts.map +1 -1
- package/dist/learning-journey.capability.js +41 -46
- package/dist/learning-journey.feature.d.ts +1 -6
- package/dist/learning-journey.feature.d.ts.map +1 -1
- package/dist/learning-journey.feature.js +55 -155
- package/dist/node/contracts/index.js +578 -0
- package/dist/node/contracts/models.js +193 -0
- package/dist/node/contracts/onboarding.js +417 -0
- package/dist/node/contracts/operations.js +326 -0
- package/dist/node/contracts/shared.js +5 -0
- package/dist/node/docs/index.js +124 -0
- package/dist/node/docs/learning-journey.docblock.js +124 -0
- package/dist/node/engines/index.js +526 -0
- package/dist/node/engines/srs.js +198 -0
- package/dist/node/engines/streak.js +159 -0
- package/dist/node/engines/xp.js +171 -0
- package/dist/node/entities/ai.js +343 -0
- package/dist/node/entities/course.js +276 -0
- package/dist/node/entities/flashcard.js +222 -0
- package/dist/node/entities/gamification.js +340 -0
- package/dist/node/entities/index.js +2136 -0
- package/dist/node/entities/learner.js +329 -0
- package/dist/node/entities/onboarding.js +301 -0
- package/dist/node/entities/quiz.js +304 -0
- package/dist/node/events.js +423 -0
- package/dist/node/index.js +3833 -0
- package/dist/node/learning-journey.capability.js +40 -0
- package/dist/node/learning-journey.feature.js +56 -0
- package/dist/node/track-spec.js +0 -0
- package/dist/track-spec.d.ts +115 -118
- package/dist/track-spec.d.ts.map +1 -1
- package/dist/track-spec.js +1 -0
- package/package.json +237 -60
- package/dist/contracts/models.js.map +0 -1
- package/dist/contracts/onboarding.js.map +0 -1
- package/dist/contracts/operations.js.map +0 -1
- package/dist/contracts/shared.js.map +0 -1
- package/dist/docs/learning-journey.docblock.js.map +0 -1
- package/dist/engines/srs.js.map +0 -1
- package/dist/engines/streak.js.map +0 -1
- package/dist/engines/xp.js.map +0 -1
- package/dist/entities/ai.js.map +0 -1
- package/dist/entities/course.js.map +0 -1
- package/dist/entities/flashcard.js.map +0 -1
- package/dist/entities/gamification.js.map +0 -1
- package/dist/entities/index.js.map +0 -1
- package/dist/entities/learner.js.map +0 -1
- package/dist/entities/onboarding.js.map +0 -1
- package/dist/entities/quiz.js.map +0 -1
- package/dist/events.js.map +0 -1
- package/dist/learning-journey.capability.js.map +0 -1
- package/dist/learning-journey.feature.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"course.js","names":[],"sources":["../../src/entities/course.ts"],"sourcesContent":["import {\n defineEntity,\n defineEntityEnum,\n field,\n index,\n} from '@contractspec/lib.schema';\n\n/**\n * Course difficulty enum.\n */\nexport const CourseDifficultyEnum = defineEntityEnum({\n name: 'CourseDifficulty',\n values: ['BEGINNER', 'INTERMEDIATE', 'ADVANCED', 'EXPERT'] as const,\n schema: 'lssm_learning',\n description: 'Difficulty level of a course.',\n});\n\n/**\n * Course status enum.\n */\nexport const CourseStatusEnum = defineEntityEnum({\n name: 'CourseStatus',\n values: ['DRAFT', 'PUBLISHED', 'ARCHIVED'] as const,\n schema: 'lssm_learning',\n description: 'Publication status of a course.',\n});\n\n/**\n * Lesson type enum.\n */\nexport const LessonTypeEnum = defineEntityEnum({\n name: 'LessonType',\n values: [\n 'CONTENT',\n 'VIDEO',\n 'INTERACTIVE',\n 'QUIZ',\n 'PRACTICE',\n 'PROJECT',\n ] as const,\n schema: 'lssm_learning',\n description: 'Type of lesson content.',\n});\n\n/**\n * Content type enum.\n */\nexport const ContentTypeEnum = defineEntityEnum({\n name: 'ContentType',\n values: ['MARKDOWN', 'VIDEO', 'AUDIO', 'EMBED', 'SCORM', 'CUSTOM'] as const,\n schema: 'lssm_learning',\n description: 'Type of lesson content format.',\n});\n\n/**\n * Course entity - defines a learning course.\n */\nexport const CourseEntity = defineEntity({\n name: 'Course',\n description: 'A structured learning course.',\n schema: 'lssm_learning',\n map: 'course',\n fields: {\n id: field.id({ description: 'Unique course identifier' }),\n\n // Basic info\n title: field.string({ description: 'Course title' }),\n slug: field.string({ isUnique: true, description: 'URL-friendly slug' }),\n description: field.string({\n isOptional: true,\n description: 'Course description',\n }),\n summary: field.string({ isOptional: true, description: 'Short summary' }),\n\n // Classification\n difficulty: field.enum('CourseDifficulty', {\n default: 'BEGINNER',\n description: 'Difficulty level',\n }),\n category: field.string({\n isOptional: true,\n description: 'Course category',\n }),\n tags: field.json({ isOptional: true, description: 'Tags for discovery' }),\n\n // Prerequisites\n prerequisites: field.json({\n isOptional: true,\n description: 'Required course IDs',\n }),\n requiredSkills: field.json({\n isOptional: true,\n description: 'Required skill levels',\n }),\n\n // Duration\n estimatedDuration: field.int({\n isOptional: true,\n description: 'Estimated duration in minutes',\n }),\n\n // Media\n thumbnailUrl: field.string({\n isOptional: true,\n description: 'Thumbnail image URL',\n }),\n coverImageUrl: field.string({\n isOptional: true,\n description: 'Cover image URL',\n }),\n promoVideoUrl: field.string({\n isOptional: true,\n description: 'Promo video URL',\n }),\n\n // Publishing\n status: field.enum('CourseStatus', {\n default: 'DRAFT',\n description: 'Publication status',\n }),\n publishedAt: field.dateTime({\n isOptional: true,\n description: 'When published',\n }),\n\n // Author\n authorId: field.string({ description: 'Author user ID' }),\n\n // Organization scope\n orgId: field.string({\n isOptional: true,\n description: 'Organization scope',\n }),\n\n // Settings\n isPublic: field.boolean({\n default: false,\n description: 'Whether course is publicly accessible',\n }),\n isFeatured: field.boolean({\n default: false,\n description: 'Whether course is featured',\n }),\n certificateEnabled: field.boolean({\n default: false,\n description: 'Award certificate on completion',\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 modules: field.hasMany('CourseModule'),\n enrollments: field.hasMany('Enrollment'),\n },\n indexes: [\n index.on(['orgId', 'status']),\n index.on(['category']),\n index.on(['difficulty']),\n index.on(['authorId']),\n ],\n enums: [CourseDifficultyEnum, CourseStatusEnum],\n});\n\n/**\n * CourseModule entity - a section within a course.\n */\nexport const CourseModuleEntity = defineEntity({\n name: 'CourseModule',\n description: 'A module (section) within a course.',\n schema: 'lssm_learning',\n map: 'course_module',\n fields: {\n id: field.id({ description: 'Unique module identifier' }),\n courseId: field.foreignKey({ description: 'Parent course' }),\n\n // Basic info\n title: field.string({ description: 'Module title' }),\n description: field.string({\n isOptional: true,\n description: 'Module description',\n }),\n\n // Ordering\n order: field.int({ default: 0, description: 'Display order' }),\n\n // Unlock conditions\n unlockCondition: field.json({\n isOptional: true,\n description: 'Conditions to unlock module',\n }),\n prerequisiteModuleIds: field.json({\n isOptional: true,\n description: 'Required modules to complete first',\n }),\n\n // Duration\n estimatedDuration: field.int({\n isOptional: true,\n description: 'Estimated duration in minutes',\n }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n course: field.belongsTo('Course', ['courseId'], ['id'], {\n onDelete: 'Cascade',\n }),\n lessons: field.hasMany('Lesson'),\n completions: field.hasMany('ModuleCompletion'),\n },\n indexes: [index.on(['courseId', 'order'])],\n});\n\n/**\n * Lesson entity - individual learning unit.\n */\nexport const LessonEntity = defineEntity({\n name: 'Lesson',\n description: 'An individual lesson within a module.',\n schema: 'lssm_learning',\n map: 'lesson',\n fields: {\n id: field.id({ description: 'Unique lesson identifier' }),\n moduleId: field.foreignKey({ description: 'Parent module' }),\n\n // Basic info\n title: field.string({ description: 'Lesson title' }),\n description: field.string({\n isOptional: true,\n description: 'Lesson description',\n }),\n\n // Type and content\n type: field.enum('LessonType', {\n default: 'CONTENT',\n description: 'Lesson type',\n }),\n\n // Ordering\n order: field.int({ default: 0, description: 'Display order' }),\n\n // Duration\n estimatedDuration: field.int({\n isOptional: true,\n description: 'Estimated duration in minutes',\n }),\n\n // XP reward\n xpReward: field.int({\n default: 10,\n description: 'XP awarded on completion',\n }),\n\n // Settings\n isFree: field.boolean({\n default: false,\n description: 'Whether lesson is free preview',\n }),\n isRequired: field.boolean({\n default: true,\n description: 'Whether lesson is required for completion',\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 module: field.belongsTo('CourseModule', ['moduleId'], ['id'], {\n onDelete: 'Cascade',\n }),\n contents: field.hasMany('LessonContent'),\n progress: field.hasMany('LessonProgress'),\n quizzes: field.hasMany('Quiz'),\n },\n indexes: [index.on(['moduleId', 'order']), index.on(['type'])],\n enums: [LessonTypeEnum],\n});\n\n/**\n * LessonContent entity - content blocks within a lesson.\n */\nexport const LessonContentEntity = defineEntity({\n name: 'LessonContent',\n description: 'Content block within a lesson.',\n schema: 'lssm_learning',\n map: 'lesson_content',\n fields: {\n id: field.id({ description: 'Unique content identifier' }),\n lessonId: field.foreignKey({ description: 'Parent lesson' }),\n\n // Content type and data\n contentType: field.enum('ContentType', { description: 'Content format' }),\n content: field.string({\n isOptional: true,\n description: 'Text content (markdown, etc.)',\n }),\n mediaUrl: field.string({\n isOptional: true,\n description: 'Media URL for video/audio',\n }),\n embedData: field.json({\n isOptional: true,\n description: 'Embed data for external content',\n }),\n\n // Ordering\n order: field.int({ default: 0, description: 'Display order' }),\n\n // Duration\n duration: field.int({\n isOptional: true,\n description: 'Content duration in seconds',\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 lesson: field.belongsTo('Lesson', ['lessonId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [index.on(['lessonId', 'order'])],\n enums: [ContentTypeEnum],\n});\n\nexport const courseEntities = [\n CourseEntity,\n CourseModuleEntity,\n LessonEntity,\n LessonContentEntity,\n];\n\nexport const courseEnums = [\n CourseDifficultyEnum,\n CourseStatusEnum,\n LessonTypeEnum,\n ContentTypeEnum,\n];\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flashcard.js","names":[],"sources":["../../src/entities/flashcard.ts"],"sourcesContent":["import {\n defineEntity,\n defineEntityEnum,\n field,\n index,\n} from '@contractspec/lib.schema';\n\n/**\n * Card rating enum for SRS.\n */\nexport const CardRatingEnum = defineEntityEnum({\n name: 'CardRating',\n values: ['AGAIN', 'HARD', 'GOOD', 'EASY'] as const,\n schema: 'lssm_learning',\n description: 'Rating for a flashcard review.',\n});\n\n/**\n * Deck entity - collection of flashcards.\n */\nexport const DeckEntity = defineEntity({\n name: 'Deck',\n description: 'A collection of flashcards.',\n schema: 'lssm_learning',\n map: 'deck',\n fields: {\n id: field.id({ description: 'Unique deck identifier' }),\n ownerId: field.foreignKey({ description: 'Deck owner (learner)' }),\n\n // Basic info\n title: field.string({ description: 'Deck title' }),\n description: field.string({\n isOptional: true,\n description: 'Deck description',\n }),\n\n // Classification\n category: field.string({ isOptional: true, description: 'Deck category' }),\n tags: field.json({ isOptional: true, description: 'Tags for discovery' }),\n\n // Visibility\n isPublic: field.boolean({\n default: false,\n description: 'Whether deck is publicly visible',\n }),\n\n // Stats\n cardCount: field.int({ default: 0, description: 'Number of cards' }),\n\n // Media\n coverImageUrl: field.string({\n isOptional: true,\n description: 'Cover image URL',\n }),\n\n // Organization scope\n orgId: field.string({\n isOptional: true,\n description: 'Organization scope',\n }),\n\n // Settings\n newCardsPerDay: field.int({\n default: 20,\n description: 'New cards to introduce per day',\n }),\n reviewsPerDay: field.int({\n default: 100,\n description: 'Maximum reviews per day',\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 owner: field.belongsTo('Learner', ['ownerId'], ['id'], {\n onDelete: 'Cascade',\n }),\n cards: field.hasMany('Card'),\n },\n indexes: [\n index.on(['ownerId']),\n index.on(['isPublic', 'category']),\n index.on(['orgId']),\n ],\n});\n\n/**\n * Card entity - individual flashcard.\n */\nexport const CardEntity = defineEntity({\n name: 'Card',\n description: 'An individual flashcard.',\n schema: 'lssm_learning',\n map: 'card',\n fields: {\n id: field.id({ description: 'Unique card identifier' }),\n deckId: field.foreignKey({ description: 'Parent deck' }),\n\n // Content\n front: field.string({ description: 'Front of card (question)' }),\n back: field.string({ description: 'Back of card (answer)' }),\n\n // Additional content\n hints: field.json({ isOptional: true, description: 'Hints for the card' }),\n explanation: field.string({\n isOptional: true,\n description: 'Detailed explanation',\n }),\n\n // Media\n frontMediaUrl: field.string({\n isOptional: true,\n description: 'Media for front',\n }),\n backMediaUrl: field.string({\n isOptional: true,\n description: 'Media for back',\n }),\n audioUrl: field.string({\n isOptional: true,\n description: 'Audio pronunciation',\n }),\n\n // Classification\n tags: field.json({ isOptional: true, description: 'Card tags' }),\n difficulty: field.int({ default: 0, description: 'Card difficulty (0-5)' }),\n\n // Ordering\n order: field.int({ default: 0, description: 'Card order in deck' }),\n\n // Status\n isSuspended: field.boolean({\n default: false,\n description: 'Whether card is suspended',\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 deck: field.belongsTo('Deck', ['deckId'], ['id'], { onDelete: 'Cascade' }),\n reviews: field.hasMany('CardReview'),\n schedules: field.hasMany('CardSchedule'),\n },\n indexes: [index.on(['deckId', 'order']), index.on(['isSuspended'])],\n});\n\n/**\n * CardReview entity - records individual reviews.\n */\nexport const CardReviewEntity = defineEntity({\n name: 'CardReview',\n description: 'A single review of a flashcard.',\n schema: 'lssm_learning',\n map: 'card_review',\n fields: {\n id: field.id({ description: 'Unique review identifier' }),\n learnerId: field.foreignKey({ description: 'Reviewer' }),\n cardId: field.foreignKey({ description: 'Reviewed card' }),\n\n // Review result\n rating: field.enum('CardRating', { description: 'Review rating' }),\n\n // Time tracking\n responseTimeMs: field.int({\n isOptional: true,\n description: 'Time to respond in ms',\n }),\n\n // SRS state before review\n intervalBefore: field.int({ description: 'Interval before review (days)' }),\n easeFactorBefore: field.decimal({\n description: 'Ease factor before review',\n }),\n\n // SRS state after review\n intervalAfter: field.int({ description: 'Interval after review (days)' }),\n easeFactorAfter: field.decimal({ description: 'Ease factor after review' }),\n\n // Review type\n reviewType: field.string({\n default: '\"review\"',\n description: 'Type: new, learning, review, relearning',\n }),\n\n // Timestamps\n reviewedAt: field.dateTime({ description: 'When reviewed' }),\n createdAt: field.createdAt(),\n\n // Relations\n learner: field.belongsTo('Learner', ['learnerId'], ['id'], {\n onDelete: 'Cascade',\n }),\n card: field.belongsTo('Card', ['cardId'], ['id'], { onDelete: 'Cascade' }),\n },\n indexes: [\n index.on(['learnerId', 'reviewedAt']),\n index.on(['cardId', 'reviewedAt']),\n index.on(['rating']),\n ],\n enums: [CardRatingEnum],\n});\n\n/**\n * CardSchedule entity - SRS scheduling per learner/card.\n */\nexport const CardScheduleEntity = defineEntity({\n name: 'CardSchedule',\n description: 'SRS schedule for a learner/card pair.',\n schema: 'lssm_learning',\n map: 'card_schedule',\n fields: {\n id: field.id({ description: 'Unique schedule identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n cardId: field.foreignKey({ description: 'Card' }),\n\n // SRS state\n interval: field.int({\n default: 0,\n description: 'Current interval in days',\n }),\n easeFactor: field.decimal({\n default: 2.5,\n description: 'Ease factor (SM-2)',\n }),\n repetitions: field.int({\n default: 0,\n description: 'Number of successful repetitions',\n }),\n\n // Scheduling\n nextReviewAt: field.dateTime({ description: 'When next review is due' }),\n lastReviewAt: field.dateTime({\n isOptional: true,\n description: 'When last reviewed',\n }),\n\n // Learning state\n learningStep: field.int({\n default: 0,\n description: 'Current learning step',\n }),\n isGraduated: field.boolean({\n default: false,\n description: 'Whether card has graduated',\n }),\n isRelearning: field.boolean({\n default: false,\n description: 'Whether card is being relearned',\n }),\n\n // Stats\n lapses: field.int({\n default: 0,\n description: 'Number of times card was forgotten',\n }),\n reviewCount: field.int({ default: 0, description: 'Total review count' }),\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 card: field.belongsTo('Card', ['cardId'], ['id'], { onDelete: 'Cascade' }),\n },\n indexes: [\n index.unique(['learnerId', 'cardId'], { name: 'card_schedule_unique' }),\n index.on(['learnerId', 'nextReviewAt']),\n index.on(['nextReviewAt']),\n ],\n});\n\nexport const flashcardEntities = [\n DeckEntity,\n CardEntity,\n CardReviewEntity,\n CardScheduleEntity,\n];\n\nexport const flashcardEnums = [CardRatingEnum];\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gamification.js","names":[],"sources":["../../src/entities/gamification.ts"],"sourcesContent":["import {\n defineEntity,\n defineEntityEnum,\n field,\n index,\n} from '@contractspec/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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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/entities/index.ts"],"sourcesContent":["import type { ModuleSchemaContribution } from '@contractspec/lib.schema';\n\n// Course entities\nexport * from './course';\nimport { courseEntities, courseEnums } from './course';\n\n// Learner entities\nexport * from './learner';\nimport { learnerEntities, learnerEnums } from './learner';\n\n// Onboarding entities\nexport * from './onboarding';\nimport { onboardingEntities, onboardingEnums } from './onboarding';\n\n// Flashcard entities\nexport * from './flashcard';\nimport { flashcardEntities, flashcardEnums } from './flashcard';\n\n// Quiz entities\nexport * from './quiz';\nimport { quizEntities, quizEnums } from './quiz';\n\n// Gamification entities\nexport * from './gamification';\nimport { gamificationEntities, gamificationEnums } from './gamification';\n\n// AI entities\nexport * from './ai';\nimport { aiEntities, aiEnums } from './ai';\n\n/**\n * All learning journey entities for schema composition.\n */\nexport const learningJourneyEntities = [\n ...courseEntities,\n ...learnerEntities,\n ...onboardingEntities,\n ...flashcardEntities,\n ...quizEntities,\n ...gamificationEntities,\n ...aiEntities,\n];\n\n/**\n * All learning journey enums.\n */\nexport const learningJourneyEnums = [\n ...courseEnums,\n ...learnerEnums,\n ...onboardingEnums,\n ...flashcardEnums,\n ...quizEnums,\n ...gamificationEnums,\n ...aiEnums,\n];\n\n/**\n * Module schema contribution for learning journey.\n */\nexport const learningJourneySchemaContribution: ModuleSchemaContribution = {\n moduleId: '@contractspec/module.learning-journey',\n entities: learningJourneyEntities,\n enums: learningJourneyEnums,\n};\n"],"mappings":";;;;;;;;;;;;AAiCA,MAAa,0BAA0B;CACrC,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACJ;;;;AAKD,MAAa,uBAAuB;CAClC,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACJ;;;;AAKD,MAAa,oCAA8D;CACzE,UAAU;CACV,UAAU;CACV,OAAO;CACR"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"learner.js","names":[],"sources":["../../src/entities/learner.ts"],"sourcesContent":["import {\n defineEntity,\n defineEntityEnum,\n field,\n index,\n} from '@contractspec/lib.schema';\n\n/**\n * Enrollment status enum.\n */\nexport const EnrollmentStatusEnum = defineEntityEnum({\n name: 'EnrollmentStatus',\n values: [\n 'ENROLLED',\n 'IN_PROGRESS',\n 'COMPLETED',\n 'DROPPED',\n 'EXPIRED',\n ] as const,\n schema: 'lssm_learning',\n description: 'Status of a course enrollment.',\n});\n\n/**\n * Progress status enum.\n */\nexport const ProgressStatusEnum = defineEntityEnum({\n name: 'ProgressStatus',\n values: ['NOT_STARTED', 'IN_PROGRESS', 'COMPLETED', 'SKIPPED'] as const,\n schema: 'lssm_learning',\n description: 'Status of lesson progress.',\n});\n\n/**\n * Learner entity - learning profile.\n */\nexport const LearnerEntity = defineEntity({\n name: 'Learner',\n description: 'A learner profile.',\n schema: 'lssm_learning',\n map: 'learner',\n fields: {\n id: field.id({ description: 'Unique learner identifier' }),\n userId: field.string({ isUnique: true, description: 'Associated user ID' }),\n\n // Profile\n displayName: field.string({\n isOptional: true,\n description: 'Display name',\n }),\n avatarUrl: field.string({ isOptional: true, description: 'Avatar URL' }),\n bio: field.string({ isOptional: true, description: 'Short bio' }),\n\n // Gamification\n level: field.int({ default: 1, description: 'Current level' }),\n totalXp: field.int({ default: 0, description: 'Total XP earned' }),\n\n // Streaks\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 lastActivityAt: field.dateTime({\n isOptional: true,\n description: 'Last learning activity',\n }),\n\n // Settings\n timezone: field.string({\n default: '\"UTC\"',\n description: 'Learner timezone',\n }),\n dailyGoalXp: field.int({ default: 50, description: 'Daily XP goal' }),\n reminderEnabled: field.boolean({\n default: true,\n description: 'Enable reminders',\n }),\n reminderTime: field.string({\n isOptional: true,\n description: 'Preferred reminder time',\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 enrollments: field.hasMany('Enrollment'),\n lessonProgress: field.hasMany('LessonProgress'),\n achievements: field.hasMany('LearnerAchievement'),\n decks: field.hasMany('Deck'),\n profile: field.hasOne('LearnerProfile'),\n },\n indexes: [\n index.on(['orgId']),\n index.on(['totalXp']),\n index.on(['level']),\n index.on(['currentStreak']),\n ],\n});\n\n/**\n * Enrollment entity - course enrollment.\n */\nexport const EnrollmentEntity = defineEntity({\n name: 'Enrollment',\n description: 'A learner enrollment in a course.',\n schema: 'lssm_learning',\n map: 'enrollment',\n fields: {\n id: field.id({ description: 'Unique enrollment identifier' }),\n learnerId: field.foreignKey({ description: 'Enrolled learner' }),\n courseId: field.foreignKey({ description: 'Enrolled course' }),\n\n // Status\n status: field.enum('EnrollmentStatus', {\n default: 'ENROLLED',\n description: 'Enrollment status',\n }),\n\n // Progress\n progress: field.int({\n default: 0,\n description: 'Completion percentage (0-100)',\n }),\n completedLessons: field.int({\n default: 0,\n description: 'Number of completed lessons',\n }),\n totalLessons: field.int({\n default: 0,\n description: 'Total lessons in course',\n }),\n\n // XP\n xpEarned: field.int({\n default: 0,\n description: 'XP earned in this course',\n }),\n\n // Timeline\n startedAt: field.dateTime({\n isOptional: true,\n description: 'When learner started',\n }),\n completedAt: field.dateTime({\n isOptional: true,\n description: 'When learner completed',\n }),\n lastAccessedAt: field.dateTime({\n isOptional: true,\n description: 'Last access time',\n }),\n\n // Certificate\n certificateId: field.string({\n isOptional: true,\n description: 'Issued certificate ID',\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 learner: field.belongsTo('Learner', ['learnerId'], ['id'], {\n onDelete: 'Cascade',\n }),\n course: field.belongsTo('Course', ['courseId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.unique(['learnerId', 'courseId'], { name: 'enrollment_unique' }),\n index.on(['learnerId', 'status']),\n index.on(['courseId', 'status']),\n ],\n enums: [EnrollmentStatusEnum],\n});\n\n/**\n * LessonProgress entity - tracks individual lesson progress.\n */\nexport const LessonProgressEntity = defineEntity({\n name: 'LessonProgress',\n description: 'Progress tracking for a lesson.',\n schema: 'lssm_learning',\n map: 'lesson_progress',\n fields: {\n id: field.id({ description: 'Unique progress identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n lessonId: field.foreignKey({ description: 'Lesson' }),\n\n // Status\n status: field.enum('ProgressStatus', {\n default: 'NOT_STARTED',\n description: 'Progress status',\n }),\n\n // Progress details\n progress: field.int({\n default: 0,\n description: 'Completion percentage (0-100)',\n }),\n score: field.int({\n isOptional: true,\n description: 'Score achieved (for quizzes)',\n }),\n\n // Attempts\n attempts: field.int({ default: 0, description: 'Number of attempts' }),\n bestScore: field.int({\n isOptional: true,\n description: 'Best score across attempts',\n }),\n\n // Time tracking\n timeSpent: field.int({ default: 0, description: 'Time spent in seconds' }),\n\n // XP\n xpEarned: field.int({\n default: 0,\n description: 'XP earned from this lesson',\n }),\n\n // Timeline\n startedAt: field.dateTime({\n isOptional: true,\n description: 'When started',\n }),\n completedAt: field.dateTime({\n isOptional: true,\n description: 'When completed',\n }),\n lastAccessedAt: field.dateTime({\n isOptional: true,\n description: 'Last access time',\n }),\n\n // Bookmarks and notes\n bookmarks: field.json({\n isOptional: true,\n description: 'Content bookmarks',\n }),\n notes: field.string({ isOptional: true, description: 'Learner notes' }),\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 lesson: field.belongsTo('Lesson', ['lessonId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.unique(['learnerId', 'lessonId'], { name: 'lesson_progress_unique' }),\n index.on(['learnerId', 'status']),\n index.on(['lessonId']),\n ],\n enums: [ProgressStatusEnum],\n});\n\n/**\n * ModuleCompletion entity - tracks module completion.\n */\nexport const ModuleCompletionEntity = defineEntity({\n name: 'ModuleCompletion',\n description: 'Module completion record.',\n schema: 'lssm_learning',\n map: 'module_completion',\n fields: {\n id: field.id({ description: 'Unique completion identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n moduleId: field.foreignKey({ description: 'Module' }),\n\n // Completion details\n score: field.int({ isOptional: true, description: 'Average score' }),\n xpEarned: field.int({ default: 0, description: 'XP earned' }),\n timeSpent: field.int({ default: 0, description: 'Time spent in seconds' }),\n\n // Timestamps\n completedAt: field.dateTime({ description: 'When completed' }),\n createdAt: field.createdAt(),\n\n // Relations\n learner: field.belongsTo('Learner', ['learnerId'], ['id'], {\n onDelete: 'Cascade',\n }),\n module: field.belongsTo('CourseModule', ['moduleId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.unique(['learnerId', 'moduleId'], {\n name: 'module_completion_unique',\n }),\n index.on(['learnerId', 'completedAt']),\n ],\n});\n\n/**\n * Certificate entity - course completion certificate.\n */\nexport const CertificateEntity = defineEntity({\n name: 'Certificate',\n description: 'Course completion certificate.',\n schema: 'lssm_learning',\n map: 'certificate',\n fields: {\n id: field.id({ description: 'Unique certificate identifier' }),\n learnerId: field.foreignKey({ description: 'Certificate holder' }),\n courseId: field.foreignKey({ description: 'Completed course' }),\n enrollmentId: field.foreignKey({ description: 'Associated enrollment' }),\n\n // Certificate details\n certificateNumber: field.string({\n isUnique: true,\n description: 'Unique certificate number',\n }),\n title: field.string({ description: 'Certificate title' }),\n description: field.string({\n isOptional: true,\n description: 'Certificate description',\n }),\n\n // Completion details\n score: field.int({ isOptional: true, description: 'Final score' }),\n grade: field.string({ isOptional: true, description: 'Grade awarded' }),\n\n // Validity\n issuedAt: field.dateTime({ description: 'When issued' }),\n validUntil: field.dateTime({\n isOptional: true,\n description: 'Expiration date',\n }),\n\n // Verification\n verificationUrl: field.string({\n isOptional: true,\n description: 'Verification URL',\n }),\n credentialHash: field.string({\n isOptional: true,\n description: 'Credential hash for verification',\n }),\n\n // Status\n isRevoked: field.boolean({\n default: false,\n description: 'Whether certificate is revoked',\n }),\n revokedAt: field.dateTime({\n isOptional: true,\n description: 'When revoked',\n }),\n revokedReason: field.string({\n isOptional: true,\n description: 'Revocation reason',\n }),\n\n // Metadata\n metadata: field.json({\n isOptional: true,\n description: 'Additional metadata',\n }),\n\n // Timestamps\n createdAt: field.createdAt(),\n\n // Relations\n learner: field.belongsTo('Learner', ['learnerId'], ['id'], {\n onDelete: 'Cascade',\n }),\n course: field.belongsTo('Course', ['courseId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.on(['learnerId']),\n index.on(['courseId']),\n index.on(['issuedAt']),\n ],\n});\n\nexport const learnerEntities = [\n LearnerEntity,\n EnrollmentEntity,\n LessonProgressEntity,\n ModuleCompletionEntity,\n CertificateEntity,\n];\n\nexport const learnerEnums = [EnrollmentStatusEnum, ProgressStatusEnum];\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding.js","names":[],"sources":["../../src/entities/onboarding.ts"],"sourcesContent":["import {\n defineEntity,\n defineEntityEnum,\n field,\n index,\n} from '@contractspec/lib.schema';\n\n/**\n * Onboarding step status enum.\n */\nexport const OnboardingStepStatusEnum = defineEntityEnum({\n name: 'OnboardingStepStatus',\n values: ['PENDING', 'IN_PROGRESS', 'COMPLETED', 'SKIPPED'] as const,\n schema: 'lssm_learning',\n description: 'Status of an onboarding step.',\n});\n\n/**\n * OnboardingTrack entity - defines an onboarding journey.\n */\nexport const OnboardingTrackEntity = defineEntity({\n name: 'OnboardingTrack',\n description: 'An onboarding track for a product.',\n schema: 'lssm_learning',\n map: 'onboarding_track',\n fields: {\n id: field.id({ description: 'Unique track identifier' }),\n\n // Basic info\n productId: field.string({ description: 'Product this track is for' }),\n name: field.string({ description: 'Track name' }),\n description: field.string({\n isOptional: true,\n description: 'Track description',\n }),\n\n // Targeting\n targetUserSegment: field.string({\n isOptional: true,\n description: 'Target user segment',\n }),\n targetRole: field.string({\n isOptional: true,\n description: 'Target user role',\n }),\n\n // Display\n welcomeTitle: field.string({\n isOptional: true,\n description: 'Welcome message title',\n }),\n welcomeMessage: field.string({\n isOptional: true,\n description: 'Welcome message',\n }),\n completionTitle: field.string({\n isOptional: true,\n description: 'Completion message title',\n }),\n completionMessage: field.string({\n isOptional: true,\n description: 'Completion message',\n }),\n\n // Settings\n isActive: field.boolean({\n default: true,\n description: 'Whether track is active',\n }),\n isRequired: field.boolean({\n default: false,\n description: 'Whether track is required',\n }),\n canSkip: field.boolean({\n default: true,\n description: 'Whether steps can be skipped',\n }),\n\n // XP\n totalXp: field.int({\n default: 100,\n description: 'Total XP for completing track',\n }),\n completionXpBonus: field.int({\n isOptional: true,\n description: 'Bonus XP for completing track',\n }),\n completionBadgeKey: field.string({\n isOptional: true,\n description: 'Badge awarded on completion',\n }),\n\n // Streak/tempo rules\n streakHoursWindow: field.int({\n isOptional: true,\n description: 'Hours window to finish for streak bonus',\n }),\n streakBonusXp: field.int({\n isOptional: true,\n description: 'Bonus XP if completed within streak window',\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 steps: field.hasMany('OnboardingStep'),\n progress: field.hasMany('OnboardingProgress'),\n },\n indexes: [\n index.on(['productId', 'isActive']),\n index.on(['orgId']),\n index.unique(['productId', 'targetUserSegment', 'targetRole'], {\n name: 'onboarding_track_target',\n }),\n ],\n});\n\n/**\n * OnboardingStep entity - a step in an onboarding track.\n */\nexport const OnboardingStepEntity = defineEntity({\n name: 'OnboardingStep',\n description: 'A step in an onboarding track.',\n schema: 'lssm_learning',\n map: 'onboarding_step',\n fields: {\n id: field.id({ description: 'Unique step identifier' }),\n trackId: field.foreignKey({ description: 'Parent track' }),\n\n // Basic info\n title: field.string({ description: 'Step title' }),\n description: field.string({\n isOptional: true,\n description: 'Step description',\n }),\n\n // Instructions\n instructions: field.string({\n isOptional: true,\n description: 'How to complete the step',\n }),\n helpUrl: field.string({\n isOptional: true,\n description: 'Link to help documentation',\n }),\n\n // Ordering\n order: field.int({ default: 0, description: 'Display order' }),\n\n // Event-driven completion\n triggerEvent: field.string({\n isOptional: true,\n description: 'Event that triggers step start',\n }),\n completionEvent: field.string({\n description: 'Event that completes the step',\n }),\n completionEventVersion: field.int({\n isOptional: true,\n description: 'Version of the completion event',\n }),\n completionSourceModule: field.string({\n isOptional: true,\n description: 'Module emitting the completion event',\n }),\n completionEventFilter: field.json({\n isOptional: true,\n description: 'Filter for completion event',\n }),\n\n // Alternative completion\n actionUrl: field.string({\n isOptional: true,\n description: 'URL to navigate to complete',\n }),\n actionLabel: field.string({\n isOptional: true,\n description: 'Action button label',\n }),\n\n // UI hints\n highlightSelector: field.string({\n isOptional: true,\n description: 'CSS selector to highlight',\n }),\n tooltipPosition: field.string({\n isOptional: true,\n description: 'Tooltip position',\n }),\n\n // XP\n xpReward: field.int({ default: 10, description: 'XP for completing step' }),\n\n // Settings\n isRequired: field.boolean({\n default: true,\n description: 'Whether step is required',\n }),\n canSkip: field.boolean({\n default: true,\n description: 'Whether step can be skipped',\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 track: field.belongsTo('OnboardingTrack', ['trackId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [index.on(['trackId', 'order']), index.on(['completionEvent'])],\n});\n\n/**\n * OnboardingProgress entity - tracks user progress through onboarding.\n */\nexport const OnboardingProgressEntity = defineEntity({\n name: 'OnboardingProgress',\n description: 'Tracks user progress through an onboarding track.',\n schema: 'lssm_learning',\n map: 'onboarding_progress',\n fields: {\n id: field.id({ description: 'Unique progress identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n trackId: field.foreignKey({ description: 'Onboarding track' }),\n\n // Progress\n currentStepId: field.string({\n isOptional: true,\n description: 'Current step ID',\n }),\n completedSteps: field.json({\n default: '[]',\n description: 'Array of completed step IDs',\n }),\n skippedSteps: field.json({\n default: '[]',\n description: 'Array of skipped step IDs',\n }),\n\n // Status\n progress: field.int({\n default: 0,\n description: 'Completion percentage (0-100)',\n }),\n isCompleted: field.boolean({\n default: false,\n description: 'Whether track is completed',\n }),\n\n // XP\n xpEarned: field.int({ default: 0, description: 'XP earned from track' }),\n\n // Timeline\n startedAt: field.dateTime({ description: 'When user started' }),\n completedAt: field.dateTime({\n isOptional: true,\n description: 'When user completed',\n }),\n lastActivityAt: field.dateTime({\n isOptional: true,\n description: 'Last activity',\n }),\n\n // Dismissal\n isDismissed: field.boolean({\n default: false,\n description: 'Whether user dismissed onboarding',\n }),\n dismissedAt: field.dateTime({\n isOptional: true,\n description: 'When dismissed',\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 learner: field.belongsTo('Learner', ['learnerId'], ['id'], {\n onDelete: 'Cascade',\n }),\n track: field.belongsTo('OnboardingTrack', ['trackId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.unique(['learnerId', 'trackId'], {\n name: 'onboarding_progress_unique',\n }),\n index.on(['learnerId', 'isCompleted']),\n index.on(['trackId']),\n ],\n enums: [OnboardingStepStatusEnum],\n});\n\n/**\n * OnboardingStepCompletion entity - individual step completions.\n */\nexport const OnboardingStepCompletionEntity = defineEntity({\n name: 'OnboardingStepCompletion',\n description: 'Individual step completion record.',\n schema: 'lssm_learning',\n map: 'onboarding_step_completion',\n fields: {\n id: field.id({ description: 'Unique completion identifier' }),\n progressId: field.foreignKey({ description: 'Parent progress record' }),\n stepId: field.foreignKey({ description: 'Completed step' }),\n\n // Status\n status: field.enum('OnboardingStepStatus', {\n description: 'Completion status',\n }),\n\n // XP\n xpEarned: field.int({ default: 0, description: 'XP earned' }),\n\n // Event that triggered completion\n triggeringEvent: field.string({\n isOptional: true,\n description: 'Event that triggered completion',\n }),\n eventPayload: field.json({\n isOptional: true,\n description: 'Event payload',\n }),\n\n // Timestamps\n completedAt: field.dateTime({ description: 'When completed' }),\n createdAt: field.createdAt(),\n\n // Relations\n progress: field.belongsTo('OnboardingProgress', ['progressId'], ['id'], {\n onDelete: 'Cascade',\n }),\n step: field.belongsTo('OnboardingStep', ['stepId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.unique(['progressId', 'stepId'], { name: 'step_completion_unique' }),\n index.on(['completedAt']),\n ],\n});\n\nexport const onboardingEntities = [\n OnboardingTrackEntity,\n OnboardingStepEntity,\n OnboardingProgressEntity,\n OnboardingStepCompletionEntity,\n];\n\nexport const onboardingEnums = [OnboardingStepStatusEnum];\n"],"mappings":";;;;;;AAUA,MAAa,2BAA2B,iBAAiB;CACvD,MAAM;CACN,QAAQ;EAAC;EAAW;EAAe;EAAa;EAAU;CAC1D,QAAQ;CACR,aAAa;CACd,CAAC;;;;AAKF,MAAa,wBAAwB,aAAa;CAChD,MAAM;CACN,aAAa;CACb,QAAQ;CACR,KAAK;CACL,QAAQ;EACN,IAAI,MAAM,GAAG,EAAE,aAAa,2BAA2B,CAAC;EAGxD,WAAW,MAAM,OAAO,EAAE,aAAa,6BAA6B,CAAC;EACrE,MAAM,MAAM,OAAO,EAAE,aAAa,cAAc,CAAC;EACjD,aAAa,MAAM,OAAO;GACxB,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,mBAAmB,MAAM,OAAO;GAC9B,YAAY;GACZ,aAAa;GACd,CAAC;EACF,YAAY,MAAM,OAAO;GACvB,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,cAAc,MAAM,OAAO;GACzB,YAAY;GACZ,aAAa;GACd,CAAC;EACF,gBAAgB,MAAM,OAAO;GAC3B,YAAY;GACZ,aAAa;GACd,CAAC;EACF,iBAAiB,MAAM,OAAO;GAC5B,YAAY;GACZ,aAAa;GACd,CAAC;EACF,mBAAmB,MAAM,OAAO;GAC9B,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,UAAU,MAAM,QAAQ;GACtB,SAAS;GACT,aAAa;GACd,CAAC;EACF,YAAY,MAAM,QAAQ;GACxB,SAAS;GACT,aAAa;GACd,CAAC;EACF,SAAS,MAAM,QAAQ;GACrB,SAAS;GACT,aAAa;GACd,CAAC;EAGF,SAAS,MAAM,IAAI;GACjB,SAAS;GACT,aAAa;GACd,CAAC;EACF,mBAAmB,MAAM,IAAI;GAC3B,YAAY;GACZ,aAAa;GACd,CAAC;EACF,oBAAoB,MAAM,OAAO;GAC/B,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,mBAAmB,MAAM,IAAI;GAC3B,YAAY;GACZ,aAAa;GACd,CAAC;EACF,eAAe,MAAM,IAAI;GACvB,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,OAAO,MAAM,OAAO;GAClB,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,UAAU,MAAM,KAAK;GACnB,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,WAAW,MAAM,WAAW;EAC5B,WAAW,MAAM,WAAW;EAG5B,OAAO,MAAM,QAAQ,iBAAiB;EACtC,UAAU,MAAM,QAAQ,qBAAqB;EAC9C;CACD,SAAS;EACP,MAAM,GAAG,CAAC,aAAa,WAAW,CAAC;EACnC,MAAM,GAAG,CAAC,QAAQ,CAAC;EACnB,MAAM,OAAO;GAAC;GAAa;GAAqB;GAAa,EAAE,EAC7D,MAAM,2BACP,CAAC;EACH;CACF,CAAC;;;;AAKF,MAAa,uBAAuB,aAAa;CAC/C,MAAM;CACN,aAAa;CACb,QAAQ;CACR,KAAK;CACL,QAAQ;EACN,IAAI,MAAM,GAAG,EAAE,aAAa,0BAA0B,CAAC;EACvD,SAAS,MAAM,WAAW,EAAE,aAAa,gBAAgB,CAAC;EAG1D,OAAO,MAAM,OAAO,EAAE,aAAa,cAAc,CAAC;EAClD,aAAa,MAAM,OAAO;GACxB,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,cAAc,MAAM,OAAO;GACzB,YAAY;GACZ,aAAa;GACd,CAAC;EACF,SAAS,MAAM,OAAO;GACpB,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,OAAO,MAAM,IAAI;GAAE,SAAS;GAAG,aAAa;GAAiB,CAAC;EAG9D,cAAc,MAAM,OAAO;GACzB,YAAY;GACZ,aAAa;GACd,CAAC;EACF,iBAAiB,MAAM,OAAO,EAC5B,aAAa,iCACd,CAAC;EACF,wBAAwB,MAAM,IAAI;GAChC,YAAY;GACZ,aAAa;GACd,CAAC;EACF,wBAAwB,MAAM,OAAO;GACnC,YAAY;GACZ,aAAa;GACd,CAAC;EACF,uBAAuB,MAAM,KAAK;GAChC,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,WAAW,MAAM,OAAO;GACtB,YAAY;GACZ,aAAa;GACd,CAAC;EACF,aAAa,MAAM,OAAO;GACxB,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,mBAAmB,MAAM,OAAO;GAC9B,YAAY;GACZ,aAAa;GACd,CAAC;EACF,iBAAiB,MAAM,OAAO;GAC5B,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,UAAU,MAAM,IAAI;GAAE,SAAS;GAAI,aAAa;GAA0B,CAAC;EAG3E,YAAY,MAAM,QAAQ;GACxB,SAAS;GACT,aAAa;GACd,CAAC;EACF,SAAS,MAAM,QAAQ;GACrB,SAAS;GACT,aAAa;GACd,CAAC;EAGF,UAAU,MAAM,KAAK;GACnB,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,WAAW,MAAM,WAAW;EAC5B,WAAW,MAAM,WAAW;EAG5B,OAAO,MAAM,UAAU,mBAAmB,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAC7D,UAAU,WACX,CAAC;EACH;CACD,SAAS,CAAC,MAAM,GAAG,CAAC,WAAW,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,kBAAkB,CAAC,CAAC;CACzE,CAAC;;;;AAKF,MAAa,2BAA2B,aAAa;CACnD,MAAM;CACN,aAAa;CACb,QAAQ;CACR,KAAK;CACL,QAAQ;EACN,IAAI,MAAM,GAAG,EAAE,aAAa,8BAA8B,CAAC;EAC3D,WAAW,MAAM,WAAW,EAAE,aAAa,WAAW,CAAC;EACvD,SAAS,MAAM,WAAW,EAAE,aAAa,oBAAoB,CAAC;EAG9D,eAAe,MAAM,OAAO;GAC1B,YAAY;GACZ,aAAa;GACd,CAAC;EACF,gBAAgB,MAAM,KAAK;GACzB,SAAS;GACT,aAAa;GACd,CAAC;EACF,cAAc,MAAM,KAAK;GACvB,SAAS;GACT,aAAa;GACd,CAAC;EAGF,UAAU,MAAM,IAAI;GAClB,SAAS;GACT,aAAa;GACd,CAAC;EACF,aAAa,MAAM,QAAQ;GACzB,SAAS;GACT,aAAa;GACd,CAAC;EAGF,UAAU,MAAM,IAAI;GAAE,SAAS;GAAG,aAAa;GAAwB,CAAC;EAGxE,WAAW,MAAM,SAAS,EAAE,aAAa,qBAAqB,CAAC;EAC/D,aAAa,MAAM,SAAS;GAC1B,YAAY;GACZ,aAAa;GACd,CAAC;EACF,gBAAgB,MAAM,SAAS;GAC7B,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,aAAa,MAAM,QAAQ;GACzB,SAAS;GACT,aAAa;GACd,CAAC;EACF,aAAa,MAAM,SAAS;GAC1B,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,UAAU,MAAM,KAAK;GACnB,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,WAAW,MAAM,WAAW;EAC5B,WAAW,MAAM,WAAW;EAG5B,SAAS,MAAM,UAAU,WAAW,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,EACzD,UAAU,WACX,CAAC;EACF,OAAO,MAAM,UAAU,mBAAmB,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAC7D,UAAU,WACX,CAAC;EACH;CACD,SAAS;EACP,MAAM,OAAO,CAAC,aAAa,UAAU,EAAE,EACrC,MAAM,8BACP,CAAC;EACF,MAAM,GAAG,CAAC,aAAa,cAAc,CAAC;EACtC,MAAM,GAAG,CAAC,UAAU,CAAC;EACtB;CACD,OAAO,CAAC,yBAAyB;CAClC,CAAC;;;;AAKF,MAAa,iCAAiC,aAAa;CACzD,MAAM;CACN,aAAa;CACb,QAAQ;CACR,KAAK;CACL,QAAQ;EACN,IAAI,MAAM,GAAG,EAAE,aAAa,gCAAgC,CAAC;EAC7D,YAAY,MAAM,WAAW,EAAE,aAAa,0BAA0B,CAAC;EACvE,QAAQ,MAAM,WAAW,EAAE,aAAa,kBAAkB,CAAC;EAG3D,QAAQ,MAAM,KAAK,wBAAwB,EACzC,aAAa,qBACd,CAAC;EAGF,UAAU,MAAM,IAAI;GAAE,SAAS;GAAG,aAAa;GAAa,CAAC;EAG7D,iBAAiB,MAAM,OAAO;GAC5B,YAAY;GACZ,aAAa;GACd,CAAC;EACF,cAAc,MAAM,KAAK;GACvB,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,aAAa,MAAM,SAAS,EAAE,aAAa,kBAAkB,CAAC;EAC9D,WAAW,MAAM,WAAW;EAG5B,UAAU,MAAM,UAAU,sBAAsB,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EACtE,UAAU,WACX,CAAC;EACF,MAAM,MAAM,UAAU,kBAAkB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAC1D,UAAU,WACX,CAAC;EACH;CACD,SAAS,CACP,MAAM,OAAO,CAAC,cAAc,SAAS,EAAE,EAAE,MAAM,0BAA0B,CAAC,EAC1E,MAAM,GAAG,CAAC,cAAc,CAAC,CAC1B;CACF,CAAC;AAEF,MAAa,qBAAqB;CAChC;CACA;CACA;CACA;CACD;AAED,MAAa,kBAAkB,CAAC,yBAAyB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"quiz.js","names":[],"sources":["../../src/entities/quiz.ts"],"sourcesContent":["import {\n defineEntity,\n defineEntityEnum,\n field,\n index,\n} from '@contractspec/lib.schema';\n\n/**\n * Question type enum.\n */\nexport const QuestionTypeEnum = defineEntityEnum({\n name: 'QuestionType',\n values: [\n 'MULTIPLE_CHOICE',\n 'TRUE_FALSE',\n 'FILL_BLANK',\n 'MATCHING',\n 'SHORT_ANSWER',\n 'CODE',\n ] as const,\n schema: 'lssm_learning',\n description: 'Type of quiz question.',\n});\n\n/**\n * Quiz status enum.\n */\nexport const QuizStatusEnum = defineEntityEnum({\n name: 'QuizStatus',\n values: ['DRAFT', 'PUBLISHED', 'ARCHIVED'] as const,\n schema: 'lssm_learning',\n description: 'Publication status of a quiz.',\n});\n\n/**\n * Attempt status enum.\n */\nexport const AttemptStatusEnum = defineEntityEnum({\n name: 'AttemptStatus',\n values: ['IN_PROGRESS', 'COMPLETED', 'TIMED_OUT', 'ABANDONED'] as const,\n schema: 'lssm_learning',\n description: 'Status of a quiz attempt.',\n});\n\n/**\n * Quiz entity - assessment for a lesson.\n */\nexport const QuizEntity = defineEntity({\n name: 'Quiz',\n description: 'A quiz assessment.',\n schema: 'lssm_learning',\n map: 'quiz',\n fields: {\n id: field.id({ description: 'Unique quiz identifier' }),\n lessonId: field.foreignKey({\n isOptional: true,\n description: 'Associated lesson',\n }),\n\n // Basic info\n title: field.string({ description: 'Quiz title' }),\n description: field.string({\n isOptional: true,\n description: 'Quiz description',\n }),\n instructions: field.string({\n isOptional: true,\n description: 'Quiz instructions',\n }),\n\n // Settings\n passingScore: field.int({\n default: 70,\n description: 'Passing score percentage',\n }),\n timeLimit: field.int({\n isOptional: true,\n description: 'Time limit in seconds',\n }),\n maxAttempts: field.int({\n isOptional: true,\n description: 'Maximum attempts allowed',\n }),\n\n // Display options\n shuffleQuestions: field.boolean({\n default: false,\n description: 'Shuffle question order',\n }),\n shuffleOptions: field.boolean({\n default: false,\n description: 'Shuffle answer options',\n }),\n showCorrectAnswers: field.boolean({\n default: true,\n description: 'Show correct answers after',\n }),\n showExplanations: field.boolean({\n default: true,\n description: 'Show explanations after',\n }),\n\n // Status\n status: field.enum('QuizStatus', {\n default: 'DRAFT',\n description: 'Publication status',\n }),\n\n // Scoring\n totalPoints: field.int({\n default: 0,\n description: 'Total points available',\n }),\n\n // XP\n xpReward: field.int({ default: 20, description: 'XP for passing' }),\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 lesson: field.belongsTo('Lesson', ['lessonId'], ['id'], {\n onDelete: 'Cascade',\n }),\n questions: field.hasMany('Question'),\n attempts: field.hasMany('QuizAttempt'),\n },\n indexes: [index.on(['lessonId']), index.on(['status']), index.on(['orgId'])],\n enums: [QuizStatusEnum],\n});\n\n/**\n * Question entity - individual quiz question.\n */\nexport const QuestionEntity = defineEntity({\n name: 'Question',\n description: 'A quiz question.',\n schema: 'lssm_learning',\n map: 'question',\n fields: {\n id: field.id({ description: 'Unique question identifier' }),\n quizId: field.foreignKey({ description: 'Parent quiz' }),\n\n // Question content\n type: field.enum('QuestionType', { description: 'Question type' }),\n content: field.string({ description: 'Question text' }),\n\n // Media\n mediaUrl: field.string({ isOptional: true, description: 'Question media' }),\n\n // Scoring\n points: field.int({ default: 1, description: 'Points for correct answer' }),\n\n // For code questions\n codeLanguage: field.string({\n isOptional: true,\n description: 'Programming language',\n }),\n codeTemplate: field.string({\n isOptional: true,\n description: 'Starter code template',\n }),\n testCases: field.json({\n isOptional: true,\n description: 'Test cases for code validation',\n }),\n\n // Feedback\n explanation: field.string({\n isOptional: true,\n description: 'Explanation of correct answer',\n }),\n hint: field.string({\n isOptional: true,\n description: 'Hint for the question',\n }),\n\n // Ordering\n order: field.int({ default: 0, description: 'Display order' }),\n\n // Skill mapping\n skillId: field.string({\n isOptional: true,\n description: 'Associated skill',\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 quiz: field.belongsTo('Quiz', ['quizId'], ['id'], { onDelete: 'Cascade' }),\n options: field.hasMany('QuestionOption'),\n },\n indexes: [\n index.on(['quizId', 'order']),\n index.on(['type']),\n index.on(['skillId']),\n ],\n enums: [QuestionTypeEnum],\n});\n\n/**\n * QuestionOption entity - answer option for a question.\n */\nexport const QuestionOptionEntity = defineEntity({\n name: 'QuestionOption',\n description: 'An answer option for a question.',\n schema: 'lssm_learning',\n map: 'question_option',\n fields: {\n id: field.id({ description: 'Unique option identifier' }),\n questionId: field.foreignKey({ description: 'Parent question' }),\n\n // Content\n content: field.string({ description: 'Option text' }),\n\n // For matching questions\n matchContent: field.string({\n isOptional: true,\n description: 'Match pair content',\n }),\n\n // Correctness\n isCorrect: field.boolean({\n default: false,\n description: 'Whether option is correct',\n }),\n\n // Feedback\n feedback: field.string({\n isOptional: true,\n description: 'Feedback when selected',\n }),\n\n // Ordering\n order: field.int({ default: 0, description: 'Display order' }),\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 question: field.belongsTo('Question', ['questionId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [index.on(['questionId', 'order'])],\n});\n\n/**\n * QuizAttempt entity - a learner's quiz attempt.\n */\nexport const QuizAttemptEntity = defineEntity({\n name: 'QuizAttempt',\n description: 'A learner quiz attempt.',\n schema: 'lssm_learning',\n map: 'quiz_attempt',\n fields: {\n id: field.id({ description: 'Unique attempt identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n quizId: field.foreignKey({ description: 'Quiz' }),\n\n // Status\n status: field.enum('AttemptStatus', {\n default: 'IN_PROGRESS',\n description: 'Attempt status',\n }),\n\n // Results\n score: field.int({ isOptional: true, description: 'Score achieved' }),\n percentageScore: field.int({\n isOptional: true,\n description: 'Percentage score',\n }),\n passed: field.boolean({ isOptional: true, description: 'Whether passed' }),\n\n // Question tracking\n totalQuestions: field.int({ default: 0, description: 'Total questions' }),\n answeredQuestions: field.int({\n default: 0,\n description: 'Questions answered',\n }),\n correctAnswers: field.int({ default: 0, description: 'Correct answers' }),\n\n // Answers\n answers: field.json({ isOptional: true, description: 'Submitted answers' }),\n\n // XP\n xpEarned: field.int({ default: 0, description: 'XP earned' }),\n\n // Time tracking\n timeSpent: field.int({ default: 0, description: 'Time spent in seconds' }),\n\n // Timeline\n startedAt: field.dateTime({ description: 'When started' }),\n completedAt: field.dateTime({\n isOptional: true,\n description: 'When completed',\n }),\n\n // Attempt number\n attemptNumber: field.int({\n default: 1,\n description: 'Which attempt this is',\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 learner: field.belongsTo('Learner', ['learnerId'], ['id'], {\n onDelete: 'Cascade',\n }),\n quiz: field.belongsTo('Quiz', ['quizId'], ['id'], { onDelete: 'Cascade' }),\n },\n indexes: [\n index.on(['learnerId', 'quizId']),\n index.on(['learnerId', 'status']),\n index.on(['quizId', 'status']),\n ],\n enums: [AttemptStatusEnum],\n});\n\n/**\n * SkillAssessment entity - maps quiz performance to skills.\n */\nexport const SkillAssessmentEntity = defineEntity({\n name: 'SkillAssessment',\n description: 'Assessment of a skill based on quiz performance.',\n schema: 'lssm_learning',\n map: 'skill_assessment',\n fields: {\n id: field.id({ description: 'Unique assessment identifier' }),\n learnerId: field.foreignKey({ description: 'Learner' }),\n\n // Skill\n skillId: field.string({ description: 'Skill identifier' }),\n skillName: field.string({ description: 'Skill name' }),\n\n // Assessment\n level: field.int({ default: 1, description: 'Proficiency level (1-5)' }),\n score: field.int({ default: 0, description: 'Assessment score (0-100)' }),\n confidence: field.decimal({\n default: 0.5,\n description: 'Confidence in assessment',\n }),\n\n // Stats\n questionsAnswered: field.int({\n default: 0,\n description: 'Total questions answered',\n }),\n questionsCorrect: field.int({ default: 0, description: 'Total correct' }),\n\n // Timestamps\n assessedAt: field.dateTime({ description: 'Last assessment time' }),\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', 'skillId'], { name: 'skill_assessment_unique' }),\n index.on(['learnerId', 'level']),\n index.on(['skillId']),\n ],\n});\n\nexport const quizEntities = [\n QuizEntity,\n QuestionEntity,\n QuestionOptionEntity,\n QuizAttemptEntity,\n SkillAssessmentEntity,\n];\n\nexport const quizEnums = [QuestionTypeEnum, QuizStatusEnum, AttemptStatusEnum];\n"],"mappings":"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"}
|
package/dist/events.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","names":[],"sources":["../src/events.ts"],"sourcesContent":["import { ScalarTypeEnum, defineSchemaModel } from '@contractspec/lib.schema';\nimport { defineEvent } from '@contractspec/lib.contracts';\nimport { LEARNING_JOURNEY_OWNERS } from './contracts/shared';\n\n// ============ Course Events ============\n\nconst CoursePublishedPayload = defineSchemaModel({\n name: 'CoursePublishedEventPayload',\n description: 'Payload when a course is published',\n fields: {\n courseId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n title: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n authorId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n publishedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const CoursePublishedEvent = defineEvent({\n meta: {\n key: 'course.published',\n version: '1.0.0',\n description: 'A course has been published.',\n stability: 'stable',\n owners: [...LEARNING_JOURNEY_OWNERS],\n tags: ['learning', 'course'],\n },\n payload: CoursePublishedPayload,\n});\n\n// ============ Enrollment Events ============\n\nconst EnrollmentCreatedPayload = defineSchemaModel({\n name: 'EnrollmentCreatedEventPayload',\n description: 'Payload when a learner enrolls in a course',\n fields: {\n enrollmentId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n learnerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n courseId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n enrolledAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const EnrollmentCreatedEvent = defineEvent({\n meta: {\n key: 'enrollment.created',\n version: '1.0.0',\n description: 'A learner has enrolled in a course.',\n stability: 'stable',\n owners: [...LEARNING_JOURNEY_OWNERS],\n tags: ['learning', 'enrollment'],\n },\n payload: EnrollmentCreatedPayload,\n});\n\n// ============ Progress Events ============\n\nconst LessonCompletedPayload = defineSchemaModel({\n name: 'LessonCompletedEventPayload',\n description: 'Payload when a lesson is completed',\n fields: {\n learnerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n lessonId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n courseId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n score: { type: ScalarTypeEnum.Int_unsecure(), isOptional: true },\n xpEarned: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n timeSpent: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n completedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const LessonCompletedEvent = defineEvent({\n meta: {\n key: 'lesson.completed',\n version: '1.0.0',\n description: 'A learner has completed a lesson.',\n stability: 'stable',\n owners: [...LEARNING_JOURNEY_OWNERS],\n tags: ['learning', 'progress', 'lesson'],\n },\n payload: LessonCompletedPayload,\n});\n\nconst CourseCompletedPayload = defineSchemaModel({\n name: 'CourseCompletedEventPayload',\n description: 'Payload when a course is completed',\n fields: {\n learnerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n courseId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n enrollmentId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n score: { type: ScalarTypeEnum.Int_unsecure(), isOptional: true },\n xpEarned: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n certificateId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n completedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const CourseCompletedEvent = defineEvent({\n meta: {\n key: 'course.completed',\n version: '1.0.0',\n description: 'A learner has completed a course.',\n stability: 'stable',\n owners: [...LEARNING_JOURNEY_OWNERS],\n tags: ['learning', 'progress', 'course'],\n },\n payload: CourseCompletedPayload,\n});\n\n// ============ Onboarding Events ============\n\nconst OnboardingStartedPayload = defineSchemaModel({\n name: 'OnboardingStartedEventPayload',\n description: 'Payload when onboarding starts',\n fields: {\n learnerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n trackId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n productId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n startedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const OnboardingStartedEvent = defineEvent({\n meta: {\n key: 'onboarding.started',\n version: '1.0.0',\n description: 'A learner has started onboarding.',\n stability: 'stable',\n owners: [...LEARNING_JOURNEY_OWNERS],\n tags: ['learning', 'onboarding'],\n },\n payload: OnboardingStartedPayload,\n});\n\nconst OnboardingStepCompletedPayload = defineSchemaModel({\n name: 'OnboardingStepCompletedEventPayload',\n description: 'Payload when an onboarding step is completed',\n fields: {\n learnerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n trackId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n stepId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n triggeringEvent: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: true,\n },\n xpEarned: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n completedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const OnboardingStepCompletedEvent = defineEvent({\n meta: {\n key: 'onboarding.step_completed',\n version: '1.0.0',\n description: 'An onboarding step has been completed.',\n stability: 'stable',\n owners: [...LEARNING_JOURNEY_OWNERS],\n tags: ['learning', 'onboarding'],\n },\n payload: OnboardingStepCompletedPayload,\n});\n\nconst OnboardingCompletedPayload = defineSchemaModel({\n name: 'OnboardingCompletedEventPayload',\n description: 'Payload when onboarding is completed',\n fields: {\n learnerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n trackId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n productId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n xpEarned: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n completedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const OnboardingCompletedEvent = defineEvent({\n meta: {\n key: 'onboarding.completed',\n version: '1.0.0',\n description: 'A learner has completed onboarding.',\n stability: 'stable',\n owners: [...LEARNING_JOURNEY_OWNERS],\n tags: ['learning', 'onboarding'],\n },\n payload: OnboardingCompletedPayload,\n});\n\n// ============ Flashcard Events ============\n\nconst CardReviewedPayload = defineSchemaModel({\n name: 'CardReviewedEventPayload',\n description: 'Payload when a flashcard is reviewed',\n fields: {\n learnerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n cardId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n deckId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n rating: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n responseTimeMs: { type: ScalarTypeEnum.Int_unsecure(), isOptional: true },\n reviewedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const CardReviewedEvent = defineEvent({\n meta: {\n key: 'flashcard.reviewed',\n version: '1.0.0',\n description: 'A flashcard has been reviewed.',\n stability: 'stable',\n owners: [...LEARNING_JOURNEY_OWNERS],\n tags: ['learning', 'flashcards'],\n },\n payload: CardReviewedPayload,\n});\n\n// ============ Quiz Events ============\n\nconst QuizStartedPayload = defineSchemaModel({\n name: 'QuizStartedEventPayload',\n description: 'Payload when a quiz is started',\n fields: {\n learnerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n quizId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n attemptId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n attemptNumber: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n startedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const QuizStartedEvent = defineEvent({\n meta: {\n key: 'quiz.started',\n version: '1.0.0',\n description: 'A quiz attempt has started.',\n stability: 'stable',\n owners: [...LEARNING_JOURNEY_OWNERS],\n tags: ['learning', 'quiz'],\n },\n payload: QuizStartedPayload,\n});\n\nconst QuizCompletedPayload = defineSchemaModel({\n name: 'QuizCompletedEventPayload',\n description: 'Payload when a quiz is completed',\n fields: {\n learnerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n quizId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n attemptId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n score: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n percentageScore: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n passed: { type: ScalarTypeEnum.Boolean(), isOptional: false },\n xpEarned: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n timeSpent: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n completedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const QuizCompletedEvent = defineEvent({\n meta: {\n key: 'quiz.completed',\n version: '1.0.0',\n description: 'A quiz attempt has been completed.',\n stability: 'stable',\n owners: [...LEARNING_JOURNEY_OWNERS],\n tags: ['learning', 'quiz'],\n },\n payload: QuizCompletedPayload,\n});\n\n// ============ Gamification Events ============\n\nconst XpEarnedPayload = defineSchemaModel({\n name: 'XpEarnedEventPayload',\n description: 'Payload when XP is earned',\n fields: {\n learnerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n amount: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n source: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n sourceId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n totalXp: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n earnedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const XpEarnedEvent = defineEvent({\n meta: {\n key: 'xp.earned',\n version: '1.0.0',\n description: 'XP has been earned.',\n stability: 'stable',\n owners: [...LEARNING_JOURNEY_OWNERS],\n tags: ['learning', 'gamification', 'xp'],\n },\n payload: XpEarnedPayload,\n});\n\nconst LevelUpPayload = defineSchemaModel({\n name: 'LevelUpEventPayload',\n description: 'Payload when a learner levels up',\n fields: {\n learnerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n previousLevel: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n newLevel: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n totalXp: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n leveledUpAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const LevelUpEvent = defineEvent({\n meta: {\n key: 'level.up',\n version: '1.0.0',\n description: 'A learner has leveled up.',\n stability: 'stable',\n owners: [...LEARNING_JOURNEY_OWNERS],\n tags: ['learning', 'gamification', 'level'],\n },\n payload: LevelUpPayload,\n});\n\nconst StreakUpdatedPayload = defineSchemaModel({\n name: 'StreakUpdatedEventPayload',\n description: 'Payload when a streak is updated',\n fields: {\n learnerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n previousStreak: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n currentStreak: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n longestStreak: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n freezeUsed: { type: ScalarTypeEnum.Boolean(), isOptional: false },\n updatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const StreakUpdatedEvent = defineEvent({\n meta: {\n key: 'streak.updated',\n version: '1.0.0',\n description: 'A streak has been updated.',\n stability: 'stable',\n owners: [...LEARNING_JOURNEY_OWNERS],\n tags: ['learning', 'gamification', 'streak'],\n },\n payload: StreakUpdatedPayload,\n});\n\nconst AchievementUnlockedPayload = defineSchemaModel({\n name: 'AchievementUnlockedEventPayload',\n description: 'Payload when an achievement is unlocked',\n fields: {\n learnerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n achievementId: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n achievementKey: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n achievementName: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n xpEarned: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n unlockedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const AchievementUnlockedEvent = defineEvent({\n meta: {\n key: 'achievement.unlocked',\n version: '1.0.0',\n description: 'An achievement has been unlocked.',\n stability: 'stable',\n owners: [...LEARNING_JOURNEY_OWNERS],\n tags: ['learning', 'gamification', 'achievement'],\n },\n payload: AchievementUnlockedPayload,\n});\n\nconst DailyGoalCompletedPayload = defineSchemaModel({\n name: 'DailyGoalCompletedEventPayload',\n description: 'Payload when a daily goal is completed',\n fields: {\n learnerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n date: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n targetXp: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n actualXp: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n completedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const DailyGoalCompletedEvent = defineEvent({\n meta: {\n key: 'daily_goal.completed',\n version: '1.0.0',\n description: 'A daily goal has been completed.',\n stability: 'stable',\n owners: [...LEARNING_JOURNEY_OWNERS],\n tags: ['learning', 'gamification', 'goal'],\n },\n payload: DailyGoalCompletedPayload,\n});\n\n// ============ Certificate Events ============\n\nconst CertificateIssuedPayload = defineSchemaModel({\n name: 'CertificateIssuedEventPayload',\n description: 'Payload when a certificate is issued',\n fields: {\n certificateId: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n learnerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n courseId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n certificateNumber: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n issuedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const CertificateIssuedEvent = defineEvent({\n meta: {\n key: 'certificate.issued',\n version: '1.0.0',\n description: 'A certificate has been issued.',\n stability: 'stable',\n owners: [...LEARNING_JOURNEY_OWNERS],\n tags: ['learning', 'certificate'],\n },\n payload: CertificateIssuedPayload,\n});\n\n/**\n * All learning journey events.\n */\nexport const LearningJourneyEvents = {\n CoursePublishedEvent,\n EnrollmentCreatedEvent,\n LessonCompletedEvent,\n CourseCompletedEvent,\n OnboardingStartedEvent,\n OnboardingStepCompletedEvent,\n OnboardingCompletedEvent,\n CardReviewedEvent,\n QuizStartedEvent,\n QuizCompletedEvent,\n XpEarnedEvent,\n LevelUpEvent,\n StreakUpdatedEvent,\n AchievementUnlockedEvent,\n DailyGoalCompletedEvent,\n CertificateIssuedEvent,\n};\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"learning-journey.capability.js","names":[],"sources":["../src/learning-journey.capability.ts"],"sourcesContent":["import { defineCapability, StabilityEnum } from '@contractspec/lib.contracts';\n\nexport const LearningJourneyCapability = defineCapability({\n meta: {\n key: 'learning-journey',\n version: '1.0.0',\n kind: 'ui',\n stability: StabilityEnum.Experimental,\n description: 'Guided learning paths and progress tracking',\n owners: ['platform.core'],\n tags: ['learning', 'onboarding', 'ui'],\n },\n});\n\nexport const OnboardingCapability = defineCapability({\n meta: {\n key: 'onboarding',\n version: '1.0.0',\n kind: 'ui',\n stability: StabilityEnum.Experimental,\n description: 'User onboarding and first-time experience flows',\n owners: ['platform.core'],\n tags: ['onboarding', 'ux', 'ui'],\n },\n});\n\nexport const GamificationCapability = defineCapability({\n meta: {\n key: 'gamification',\n version: '1.0.0',\n kind: 'ui',\n stability: StabilityEnum.Experimental,\n description: 'Gamification elements like badges, points, and achievements',\n owners: ['platform.core'],\n tags: ['gamification', 'engagement', 'ui'],\n },\n});\n"],"mappings":";;;AAEA,MAAa,4BAA4B,iBAAiB,EACxD,MAAM;CACJ,KAAK;CACL,SAAS;CACT,MAAM;CACN,WAAW,cAAc;CACzB,aAAa;CACb,QAAQ,CAAC,gBAAgB;CACzB,MAAM;EAAC;EAAY;EAAc;EAAK;CACvC,EACF,CAAC;AAEF,MAAa,uBAAuB,iBAAiB,EACnD,MAAM;CACJ,KAAK;CACL,SAAS;CACT,MAAM;CACN,WAAW,cAAc;CACzB,aAAa;CACb,QAAQ,CAAC,gBAAgB;CACzB,MAAM;EAAC;EAAc;EAAM;EAAK;CACjC,EACF,CAAC;AAEF,MAAa,yBAAyB,iBAAiB,EACrD,MAAM;CACJ,KAAK;CACL,SAAS;CACT,MAAM;CACN,WAAW,cAAc;CACzB,aAAa;CACb,QAAQ,CAAC,gBAAgB;CACzB,MAAM;EAAC;EAAgB;EAAc;EAAK;CAC3C,EACF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"learning-journey.feature.js","names":[],"sources":["../src/learning-journey.feature.ts"],"sourcesContent":["/**\n * Learning Journey Feature Module Specification\n *\n * Defines the feature module for learning, onboarding, and gamification.\n */\nimport { defineFeature } from '@contractspec/lib.contracts';\n\n/**\n * Learning Journey feature module that bundles course enrollment,\n * onboarding tracks, flashcard review, and gamification capabilities.\n */\nexport const LearningJourneyFeature = defineFeature({\n meta: {\n key: 'learning-journey',\n version: '1.0.0',\n title: 'Learning Journey',\n description:\n 'Learning platform with courses, onboarding, flashcards, and gamification',\n domain: 'learning',\n owners: ['@platform.learning-journey'],\n tags: ['learning', 'onboarding', 'courses', 'flashcards', 'gamification'],\n stability: 'stable',\n },\n\n // All contract operations included in this feature\n operations: [\n // Onboarding operations\n { key: 'learning.onboarding.recordEvent', version: '1.0.0' },\n { key: 'learning.onboarding.listTracks', version: '1.0.0' },\n { key: 'learning.onboarding.getProgress', version: '1.0.0' },\n\n // Core learning operations\n { key: 'learning.enroll', version: '1.0.0' },\n { key: 'learning.completeLesson', version: '1.0.0' },\n { key: 'learning.submitCardReview', version: '1.0.0' },\n { key: 'learning.getDueCards', version: '1.0.0' },\n { key: 'learning.getDashboard', version: '1.0.0' },\n ],\n\n // Events emitted by this feature\n events: [\n // Course events\n { key: 'course.published', version: '1.0.0' },\n { key: 'course.completed', version: '1.0.0' },\n\n // Enrollment events\n { key: 'enrollment.created', version: '1.0.0' },\n\n // Progress events\n { key: 'lesson.completed', version: '1.0.0' },\n\n // Onboarding events\n { key: 'onboarding.started', version: '1.0.0' },\n { key: 'onboarding.step_completed', version: '1.0.0' },\n { key: 'onboarding.completed', version: '1.0.0' },\n\n // Flashcard events\n { key: 'flashcard.reviewed', version: '1.0.0' },\n\n // Quiz events\n { key: 'quiz.started', version: '1.0.0' },\n { key: 'quiz.completed', version: '1.0.0' },\n\n // Gamification events\n { key: 'xp.earned', version: '1.0.0' },\n { key: 'level.up', version: '1.0.0' },\n { key: 'streak.updated', version: '1.0.0' },\n { key: 'achievement.unlocked', version: '1.0.0' },\n { key: 'daily_goal.completed', version: '1.0.0' },\n\n // Certificate events\n { key: 'certificate.issued', version: '1.0.0' },\n ],\n\n // No presentations for this module feature\n presentations: [],\n opToPresentation: [],\n presentationsTargets: [],\n\n // Capability definitions\n capabilities: {\n provides: [\n { key: 'learning-journey', version: '1.0.0' },\n { key: 'onboarding', version: '1.0.0' },\n { key: 'gamification', version: '1.0.0' },\n ],\n requires: [{ key: 'identity', version: '1.0.0' }],\n },\n});\n"],"mappings":";;;;;;;;;;;;AAWA,MAAa,yBAAyB,cAAc;CAClD,MAAM;EACJ,KAAK;EACL,SAAS;EACT,OAAO;EACP,aACE;EACF,QAAQ;EACR,QAAQ,CAAC,6BAA6B;EACtC,MAAM;GAAC;GAAY;GAAc;GAAW;GAAc;GAAe;EACzE,WAAW;EACZ;CAGD,YAAY;EAEV;GAAE,KAAK;GAAmC,SAAS;GAAS;EAC5D;GAAE,KAAK;GAAkC,SAAS;GAAS;EAC3D;GAAE,KAAK;GAAmC,SAAS;GAAS;EAG5D;GAAE,KAAK;GAAmB,SAAS;GAAS;EAC5C;GAAE,KAAK;GAA2B,SAAS;GAAS;EACpD;GAAE,KAAK;GAA6B,SAAS;GAAS;EACtD;GAAE,KAAK;GAAwB,SAAS;GAAS;EACjD;GAAE,KAAK;GAAyB,SAAS;GAAS;EACnD;CAGD,QAAQ;EAEN;GAAE,KAAK;GAAoB,SAAS;GAAS;EAC7C;GAAE,KAAK;GAAoB,SAAS;GAAS;EAG7C;GAAE,KAAK;GAAsB,SAAS;GAAS;EAG/C;GAAE,KAAK;GAAoB,SAAS;GAAS;EAG7C;GAAE,KAAK;GAAsB,SAAS;GAAS;EAC/C;GAAE,KAAK;GAA6B,SAAS;GAAS;EACtD;GAAE,KAAK;GAAwB,SAAS;GAAS;EAGjD;GAAE,KAAK;GAAsB,SAAS;GAAS;EAG/C;GAAE,KAAK;GAAgB,SAAS;GAAS;EACzC;GAAE,KAAK;GAAkB,SAAS;GAAS;EAG3C;GAAE,KAAK;GAAa,SAAS;GAAS;EACtC;GAAE,KAAK;GAAY,SAAS;GAAS;EACrC;GAAE,KAAK;GAAkB,SAAS;GAAS;EAC3C;GAAE,KAAK;GAAwB,SAAS;GAAS;EACjD;GAAE,KAAK;GAAwB,SAAS;GAAS;EAGjD;GAAE,KAAK;GAAsB,SAAS;GAAS;EAChD;CAGD,eAAe,EAAE;CACjB,kBAAkB,EAAE;CACpB,sBAAsB,EAAE;CAGxB,cAAc;EACZ,UAAU;GACR;IAAE,KAAK;IAAoB,SAAS;IAAS;GAC7C;IAAE,KAAK;IAAc,SAAS;IAAS;GACvC;IAAE,KAAK;IAAgB,SAAS;IAAS;GAC1C;EACD,UAAU,CAAC;GAAE,KAAK;GAAY,SAAS;GAAS,CAAC;EAClD;CACF,CAAC"}
|