@lssm/example.learning-journey-registry 0.0.0-canary-20251217060834 → 0.0.0-canary-20251217073102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/.turbo/turbo-build$colon$bundle.log +410 -64
  2. package/.turbo/turbo-build.log +55 -65
  3. package/CHANGELOG.md +14 -12
  4. package/dist/api.js +170 -1
  5. package/dist/docs/index.js +1 -1
  6. package/dist/docs/learning-journey-registry.docblock.js +38 -1
  7. package/dist/example.js +34 -1
  8. package/dist/examples/learning-journey-ambient-coach/src/track.js +41 -0
  9. package/dist/examples/learning-journey-crm-onboarding/dist/track.js +98 -0
  10. package/dist/examples/learning-journey-duo-drills/src/track.js +65 -0
  11. package/dist/examples/learning-journey-platform-tour/dist/track.js +105 -0
  12. package/dist/examples/learning-journey-quest-challenges/src/track.js +35 -0
  13. package/dist/examples/learning-journey-studio-onboarding/dist/track.js +90 -0
  14. package/dist/examples/learning-journey-ui-coaching/src/CoachingMiniApp.js +64 -0
  15. package/dist/examples/learning-journey-ui-coaching/src/components/EngagementMeter.js +107 -0
  16. package/dist/examples/learning-journey-ui-coaching/src/components/TipCard.js +75 -0
  17. package/dist/examples/learning-journey-ui-coaching/src/components/TipFeed.js +65 -0
  18. package/dist/examples/learning-journey-ui-coaching/src/components/index.js +3 -0
  19. package/dist/examples/learning-journey-ui-coaching/src/docs/index.js +1 -0
  20. package/dist/examples/learning-journey-ui-coaching/src/docs/learning-journey-ui-coaching.docblock.js +20 -0
  21. package/dist/examples/learning-journey-ui-coaching/src/index.js +11 -0
  22. package/dist/examples/learning-journey-ui-coaching/src/views/Overview.js +152 -0
  23. package/dist/examples/learning-journey-ui-coaching/src/views/Progress.js +117 -0
  24. package/dist/examples/learning-journey-ui-coaching/src/views/Steps.js +68 -0
  25. package/dist/examples/learning-journey-ui-coaching/src/views/Timeline.js +112 -0
  26. package/dist/examples/learning-journey-ui-coaching/src/views/index.js +4 -0
  27. package/dist/examples/learning-journey-ui-gamified/src/GamifiedMiniApp.js +64 -0
  28. package/dist/examples/learning-journey-ui-gamified/src/components/DayCalendar.js +32 -0
  29. package/dist/examples/learning-journey-ui-gamified/src/components/FlashCard.js +79 -0
  30. package/dist/examples/learning-journey-ui-gamified/src/components/MasteryRing.js +81 -0
  31. package/dist/examples/learning-journey-ui-gamified/src/components/index.js +3 -0
  32. package/dist/examples/learning-journey-ui-gamified/src/docs/index.js +1 -0
  33. package/dist/examples/learning-journey-ui-gamified/src/docs/learning-journey-ui-gamified.docblock.js +20 -0
  34. package/dist/examples/learning-journey-ui-gamified/src/index.js +11 -0
  35. package/dist/examples/learning-journey-ui-gamified/src/views/Overview.js +163 -0
  36. package/dist/examples/learning-journey-ui-gamified/src/views/Progress.js +144 -0
  37. package/dist/examples/learning-journey-ui-gamified/src/views/Steps.js +55 -0
  38. package/dist/examples/learning-journey-ui-gamified/src/views/Timeline.js +132 -0
  39. package/dist/examples/learning-journey-ui-gamified/src/views/index.js +4 -0
  40. package/dist/examples/learning-journey-ui-onboarding/src/OnboardingMiniApp.js +64 -0
  41. package/dist/examples/learning-journey-ui-onboarding/src/components/CodeSnippet.js +4 -0
  42. package/dist/examples/learning-journey-ui-onboarding/src/components/JourneyMap.js +48 -0
  43. package/dist/examples/learning-journey-ui-onboarding/src/components/StepChecklist.js +79 -0
  44. package/dist/examples/learning-journey-ui-onboarding/src/components/index.js +3 -0
  45. package/dist/examples/learning-journey-ui-onboarding/src/docs/index.js +1 -0
  46. package/dist/examples/learning-journey-ui-onboarding/src/docs/learning-journey-ui-onboarding.docblock.js +20 -0
  47. package/dist/examples/learning-journey-ui-onboarding/src/index.js +10 -0
  48. package/dist/examples/learning-journey-ui-onboarding/src/views/Overview.js +180 -0
  49. package/dist/examples/learning-journey-ui-onboarding/src/views/Progress.js +162 -0
  50. package/dist/examples/learning-journey-ui-onboarding/src/views/Steps.js +91 -0
  51. package/dist/examples/learning-journey-ui-onboarding/src/views/Timeline.js +97 -0
  52. package/dist/examples/learning-journey-ui-onboarding/src/views/index.js +4 -0
  53. package/dist/examples/learning-journey-ui-shared/src/components/BadgeDisplay.js +44 -0
  54. package/dist/examples/learning-journey-ui-shared/src/components/StreakCounter.js +45 -0
  55. package/dist/examples/learning-journey-ui-shared/src/components/ViewTabs.js +48 -0
  56. package/dist/examples/learning-journey-ui-shared/src/components/XpBar.js +46 -0
  57. package/dist/examples/learning-journey-ui-shared/src/components/index.js +4 -0
  58. package/dist/examples/learning-journey-ui-shared/src/docs/index.js +1 -0
  59. package/dist/examples/learning-journey-ui-shared/src/docs/learning-journey-ui-shared.docblock.js +20 -0
  60. package/dist/examples/learning-journey-ui-shared/src/hooks/index.js +1 -0
  61. package/dist/examples/learning-journey-ui-shared/src/hooks/useLearningProgress.js +73 -0
  62. package/dist/examples/learning-journey-ui-shared/src/index.js +8 -0
  63. package/dist/index.js +13 -1
  64. package/dist/learning-journey-registry.feature.js +66 -1
  65. package/dist/libs/contracts/dist/docs/PUBLISHING.docblock.js +16 -76
  66. package/dist/libs/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js +16 -350
  67. package/dist/libs/contracts/dist/docs/index.js +29 -1
  68. package/dist/libs/contracts/dist/docs/presentations.js +71 -1
  69. package/dist/libs/contracts/dist/docs/registry.js +44 -1
  70. package/dist/libs/contracts/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +16 -383
  71. package/dist/libs/contracts/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +16 -68
  72. package/dist/libs/contracts/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +16 -140
  73. package/dist/libs/contracts/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +16 -86
  74. package/dist/libs/contracts/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +16 -1
  75. package/dist/libs/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js +24 -2
  76. package/dist/libs/contracts/dist/docs/tech/contracts/openapi-export.docblock.js +21 -2
  77. package/dist/libs/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js +16 -213
  78. package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js +73 -5
  79. package/dist/libs/contracts/dist/docs/tech/mcp-endpoints.docblock.js +37 -1
  80. package/dist/libs/contracts/dist/docs/tech/presentation-runtime.docblock.js +16 -1
  81. package/dist/libs/contracts/dist/docs/tech/schema/README.docblock.js +20 -262
  82. package/dist/libs/contracts/dist/docs/tech/studio/learning-events.docblock.js +48 -1
  83. package/dist/libs/contracts/dist/docs/tech/studio/learning-journeys.docblock.js +24 -2
  84. package/dist/libs/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js +23 -2
  85. package/dist/libs/contracts/dist/docs/tech/studio/project-access-teams.docblock.js +25 -16
  86. package/dist/libs/contracts/dist/docs/tech/studio/project-routing.docblock.js +67 -1
  87. package/dist/libs/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js +22 -2
  88. package/dist/libs/contracts/dist/docs/tech/studio/team-invitations.docblock.js +40 -36
  89. package/dist/libs/contracts/dist/docs/tech/studio/workspace-ops.docblock.js +47 -1
  90. package/dist/libs/contracts/dist/docs/tech/studio/workspaces.docblock.js +23 -2
  91. package/dist/libs/contracts/dist/docs/tech/telemetry-ingest.docblock.js +36 -3
  92. package/dist/libs/contracts/dist/docs/tech/templates/runtime.docblock.js +20 -1
  93. package/dist/libs/contracts/dist/docs/tech/vscode-extension.docblock.js +36 -3
  94. package/dist/libs/contracts/dist/docs/tech/workflows/overview.docblock.js +20 -1
  95. package/dist/libs/design-system/dist/_virtual/rolldown_runtime.js +5 -0
  96. package/dist/libs/design-system/dist/components/atoms/Button.js +33 -0
  97. package/dist/libs/design-system/dist/ui-kit-web/dist/ui/button.js +55 -0
  98. package/dist/libs/design-system/dist/ui-kit-web/dist/ui-kit-core/dist/utils.js +13 -0
  99. package/dist/libs/ui-kit-core/dist/utils.js +10 -0
  100. package/dist/libs/ui-kit-web/dist/ui/card.js +36 -0
  101. package/dist/libs/ui-kit-web/dist/ui/progress.js +23 -0
  102. package/dist/libs/ui-kit-web/dist/ui/utils.js +10 -0
  103. package/dist/libs/ui-kit-web/dist/ui-kit-core/dist/utils.js +10 -0
  104. package/dist/presentations/index.js +64 -1
  105. package/dist/progress-store.js +30 -1
  106. package/dist/tracks.d.ts +1 -1
  107. package/dist/tracks.js +47 -1
  108. package/dist/ui/LearningMiniApp.d.ts +0 -1
  109. package/dist/ui/LearningMiniApp.js +82 -1
  110. package/dist/ui/index.js +3 -1
  111. package/package.json +16 -14
  112. package/tsconfig.tsbuildinfo +1 -1
@@ -1,65 +1,55 @@
1
- $ bun build:bundle && bun build:types
2
- $ tsdown
3
- ℹ tsdown v0.17.4 powered by rolldown v1.0.0-beta.53
4
- ℹ config file: /home/runner/work/contractspec/contractspec/packages/examples/learning-journey-registry/tsdown.config.js
5
- ℹ entry: src/api-types.ts, src/api.ts, src/example.ts, src/index.ts, src/learning-journey-registry.feature.ts, src/progress-store.ts, src/tracks.ts, src/docs/index.ts, src/docs/learning-journey-registry.docblock.ts, src/presentations/index.ts, src/ui/LearningMiniApp.tsx, src/ui/index.ts
6
- ℹ target: esnext
7
- ℹ tsconfig: tsconfig.json
8
- ℹ Build start
9
- ℹ dist/api.js  3.28 kB │ gzip: 1.37 kB
10
- ℹ dist/ui/LearningMiniApp.js  1.88 kB │ gzip: 0.70 kB
11
- ℹ dist/tracks.js  1.30 kB │ gzip: 0.50 kB
12
- ℹ dist/index.js  1.23 kB │ gzip: 0.42 kB
13
- ℹ dist/docs/learning-journey-registry.docblock.js  1.20 kB │ gzip: 0.62 kB
14
- ℹ dist/presentations/index.js  0.99 kB │ gzip: 0.39 kB
15
- ℹ dist/learning-journey-registry.feature.js  0.86 kB │ gzip: 0.36 kB
16
- ℹ dist/example.js  0.52 kB │ gzip: 0.32 kB
17
- ℹ dist/progress-store.js  0.43 kB │ gzip: 0.29 kB
18
- ℹ dist/ui/index.js  0.19 kB │ gzip: 0.11 kB
19
- ℹ dist/docs/index.js  0.05 kB │ gzip: 0.07 kB
20
- ℹ dist/api-types.js  0.00 kB │ gzip: 0.02 kB
21
- ℹ dist/libs/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js 16.51 kB │ gzip: 7.15 kB
22
- ℹ dist/libs/contracts/dist/docs/tech/schema/README.docblock.js 10.97 kB │ gzip: 4.28 kB
23
- ℹ dist/libs/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js  9.65 kB │ gzip: 3.77 kB
24
- ℹ dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js  9.10 kB │ gzip: 3.41 kB
25
- ℹ dist/libs/contracts/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js  8.74 kB │ gzip: 2.67 kB
26
- ℹ dist/libs/contracts/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js  5.91 kB │ gzip: 2.61 kB
27
- ℹ dist/libs/contracts/dist/docs/tech/templates/runtime.docblock.js  5.62 kB │ gzip: 2.58 kB
28
- ℹ dist/libs/contracts/dist/docs/tech/workflows/overview.docblock.js  5.42 kB │ gzip: 2.25 kB
29
- ℹ dist/libs/contracts/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js  4.35 kB │ gzip: 2.05 kB
30
- ℹ dist/libs/contracts/dist/docs/tech/telemetry-ingest.docblock.js  3.89 kB │ gzip: 1.69 kB
31
- ℹ dist/libs/contracts/dist/docs/tech/vscode-extension.docblock.js  3.58 kB │ gzip: 1.38 kB
32
- ℹ dist/libs/contracts/dist/docs/PUBLISHING.docblock.js  3.42 kB │ gzip: 1.58 kB
33
- ℹ dist/libs/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js  3.34 kB │ gzip: 1.45 kB
34
- ℹ dist/libs/contracts/dist/docs/tech/studio/learning-journeys.docblock.js  3.07 kB │ gzip: 1.38 kB
35
- ℹ dist/libs/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js  3.03 kB │ gzip: 1.32 kB
36
- ℹ dist/libs/contracts/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js  2.98 kB │ gzip: 1.52 kB
37
- ℹ dist/libs/contracts/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js  2.81 kB │ gzip: 1.41 kB
38
- ℹ dist/libs/contracts/dist/docs/tech/presentation-runtime.docblock.js  2.73 kB │ gzip: 1.30 kB
39
- ℹ dist/libs/contracts/dist/docs/tech/studio/project-routing.docblock.js  2.49 kB │ gzip: 1.11 kB
40
- ℹ dist/libs/contracts/dist/docs/tech/studio/team-invitations.docblock.js  2.13 kB │ gzip: 1.03 kB
41
- ℹ dist/libs/contracts/dist/docs/tech/studio/workspaces.docblock.js  1.89 kB │ gzip: 0.93 kB
42
- ℹ dist/libs/contracts/dist/docs/tech/studio/learning-events.docblock.js  1.78 kB │ gzip: 0.87 kB
43
- ℹ dist/libs/contracts/dist/docs/tech/contracts/openapi-export.docblock.js  1.70 kB │ gzip: 0.89 kB
44
- ℹ dist/libs/contracts/dist/docs/tech/studio/project-access-teams.docblock.js  1.57 kB │ gzip: 0.77 kB
45
- ℹ dist/libs/contracts/dist/docs/tech/studio/workspace-ops.docblock.js  1.47 kB │ gzip: 0.73 kB
46
- ℹ dist/libs/contracts/dist/docs/index.js  1.42 kB │ gzip: 0.47 kB
47
- ℹ dist/libs/contracts/dist/docs/tech/mcp-endpoints.docblock.js  1.23 kB │ gzip: 0.68 kB
48
- ℹ dist/libs/contracts/dist/docs/presentations.js  1.14 kB │ gzip: 0.56 kB
49
- ℹ dist/libs/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js  0.89 kB │ gzip: 0.55 kB
50
- ℹ dist/libs/contracts/dist/docs/registry.js  0.63 kB │ gzip: 0.39 kB
51
- ℹ dist/tracks.d.ts  1.69 kB │ gzip: 0.55 kB
52
- ℹ dist/index.d.ts  1.17 kB │ gzip: 0.34 kB
53
- ℹ dist/ui/LearningMiniApp.d.ts  1.15 kB │ gzip: 0.50 kB
54
- ℹ dist/api-types.d.ts  1.03 kB │ gzip: 0.46 kB
55
- ℹ dist/example.d.ts  0.96 kB │ gzip: 0.39 kB
56
- ℹ dist/progress-store.d.ts  0.64 kB │ gzip: 0.29 kB
57
- ℹ dist/presentations/index.d.ts  0.56 kB │ gzip: 0.21 kB
58
- ℹ dist/api.d.ts  0.52 kB │ gzip: 0.27 kB
59
- ℹ dist/learning-journey-registry.feature.d.ts  0.35 kB │ gzip: 0.22 kB
60
- ℹ dist/ui/index.d.ts  0.17 kB │ gzip: 0.09 kB
61
- ℹ dist/docs/index.d.ts  0.01 kB │ gzip: 0.03 kB
62
- ℹ dist/docs/learning-journey-registry.docblock.d.ts  0.01 kB │ gzip: 0.03 kB
63
- ℹ 54 files, total: 143.63 kB
64
- ✔ Build complete in 8907ms
65
- $ tsc --noEmit
1
+
2
+ $ bun build:bundle && bun build:types
3
+ $ tsdown
4
+ ℹ tsdown v0.17.4 powered by rolldown v1.0.0-beta.53
5
+ ℹ config file: /Users/tboutron/Documents/clients/lssm/monorepo-lssm/packages/contractspec/packages/examples/learning-journey-registry/tsdown.config.js (unrun)
6
+ ℹ entry: src/api-types.ts, src/api.ts, src/example.ts, src/index.ts, src/learning-journey-registry.feature.ts, src/progress-store.ts, src/tracks.ts, src/docs/index.ts, src/docs/learning-journey-registry.docblock.ts, src/presentations/index.ts, src/ui/LearningMiniApp.tsx, src/ui/index.ts
7
+ ℹ target: esnext
8
+ ℹ tsconfig: tsconfig.json
9
+ ℹ Build start
10
+ ℹ Cleaning 57 files
11
+ ℹ dist/api.js  3.28 kB │ gzip: 1.37 kB
12
+ ℹ dist/ui/LearningMiniApp.js  1.88 kB │ gzip: 0.70 kB
13
+ ℹ dist/tracks.js  1.30 kB │ gzip: 0.50 kB
14
+ ℹ dist/index.js  1.23 kB │ gzip: 0.42 kB
15
+ ℹ dist/docs/learning-journey-registry.docblock.js  1.21 kB │ gzip: 0.63 kB
16
+ ℹ dist/presentations/index.js  0.99 kB │ gzip: 0.39 kB
17
+ ℹ dist/learning-journey-registry.feature.js  0.86 kB │ gzip: 0.36 kB
18
+ ℹ dist/example.js  0.52 kB │ gzip: 0.32 kB
19
+ ℹ dist/progress-store.js  0.43 kB │ gzip: 0.29 kB
20
+ ℹ dist/ui/index.js  0.19 kB │ gzip: 0.11 kB
21
+ ℹ dist/docs/index.js  0.05 kB │ gzip: 0.07 kB
22
+ ℹ dist/api-types.js  0.00 kB │ gzip: 0.02 kB
23
+ ℹ dist/libs/contracts/src/docs/accessibility_wcag_compliance_specs.docblock.js 16.53 kB │ gzip: 7.16 kB
24
+ ℹ dist/libs/contracts/src/docs/tech/schema/README.docblock.js 10.99 kB │ gzip: 4.29 kB
25
+ ℹ dist/libs/contracts/src/docs/tech/lifecycle-stage-system.docblock.js  9.67 kB │ gzip: 3.78 kB
26
+ ℹ dist/libs/contracts/src/docs/tech/llm/llm-integration.docblock.js  9.12 kB │ gzip: 3.42 kB
27
+ ℹ dist/libs/contracts/src/docs/tech/PHASE_1_QUICKSTART.docblock.js  8.76 kB │ gzip: 2.68 kB
28
+ ℹ dist/libs/contracts/src/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js  5.93 kB │ gzip: 2.61 kB
29
+ ℹ dist/libs/contracts/src/docs/tech/templates/runtime.docblock.js  5.63 kB │ gzip: 2.58 kB
30
+ ℹ dist/libs/contracts/src/docs/tech/workflows/overview.docblock.js  5.44 kB │ gzip: 2.26 kB
31
+ ℹ dist/libs/contracts/src/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js  4.37 kB │ gzip: 2.06 kB
32
+ ℹ dist/libs/contracts/src/docs/tech/telemetry-ingest.docblock.js  3.90 kB │ gzip: 1.70 kB
33
+ ℹ dist/libs/contracts/src/docs/tech/vscode-extension.docblock.js  3.60 kB │ gzip: 1.39 kB
34
+ ℹ dist/libs/contracts/src/docs/PUBLISHING.docblock.js  3.43 kB │ gzip: 1.59 kB
35
+ ℹ dist/libs/contracts/src/docs/tech/auth/better-auth-nextjs.docblock.js  3.35 kB │ gzip: 1.45 kB
36
+ ℹ dist/libs/contracts/src/docs/tech/studio/learning-journeys.docblock.js  3.08 kB │ gzip: 1.39 kB
37
+ ℹ dist/libs/contracts/src/docs/tech/studio/platform-admin-panel.docblock.js  3.04 kB │ gzip: 1.33 kB
38
+ ℹ dist/libs/contracts/src/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js  3.00 kB │ gzip: 1.53 kB
39
+ ℹ dist/libs/contracts/src/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js  2.83 kB │ gzip: 1.41 kB
40
+ ℹ dist/libs/contracts/src/docs/tech/presentation-runtime.docblock.js  2.75 kB │ gzip: 1.30 kB
41
+ ℹ dist/libs/contracts/src/docs/tech/studio/project-routing.docblock.js  2.50 kB │ gzip: 1.12 kB
42
+ ℹ dist/libs/contracts/src/docs/tech/studio/team-invitations.docblock.js  2.14 kB │ gzip: 1.04 kB
43
+ ℹ dist/libs/contracts/src/docs/tech/studio/workspaces.docblock.js  1.90 kB │ gzip: 0.94 kB
44
+ ℹ dist/libs/contracts/src/docs/tech/studio/learning-events.docblock.js  1.79 kB │ gzip: 0.88 kB
45
+ ℹ dist/libs/contracts/src/docs/tech/contracts/openapi-export.docblock.js  1.72 kB │ gzip: 0.90 kB
46
+ ℹ dist/libs/contracts/src/docs/tech/studio/project-access-teams.docblock.js  1.58 kB │ gzip: 0.78 kB
47
+ ℹ dist/libs/contracts/src/docs/index.js  1.54 kB │ gzip: 0.52 kB
48
+ ℹ dist/libs/contracts/src/docs/tech/studio/workspace-ops.docblock.js  1.49 kB │ gzip: 0.73 kB
49
+ ℹ dist/libs/contracts/src/docs/tech/mcp-endpoints.docblock.js  1.24 kB │ gzip: 0.68 kB
50
+ ℹ dist/libs/contracts/src/docs/presentations.js  1.23 kB │ gzip: 0.59 kB
51
+ ℹ dist/libs/contracts/src/docs/tech/studio/sandbox-unlogged.docblock.js  0.90 kB │ gzip: 0.56 kB
52
+ ℹ dist/libs/contracts/src/docs/registry.js  0.74 kB │ gzip: 0.42 kB
53
+ ℹ 42 files, total: 136.15 kB
54
+ ✔ Build complete in 29ms
55
+ $ tsc --noEmit
package/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @lssm/example.learning-journey-registry
2
2
 
3
- ## 0.0.0-canary-20251217060834
3
+ ## 0.0.0-canary-20251217073102
4
4
 
5
5
  ### Minor Changes
6
6
 
@@ -9,14 +9,16 @@
9
9
  ### Patch Changes
10
10
 
11
11
  - Updated dependencies [66a5dfd]
12
- - @lssm/example.learning-journey-ambient-coach@0.0.0-canary-20251217060834
13
- - @lssm/example.learning-journey-crm-onboarding@0.0.0-canary-20251217060834
14
- - @lssm/example.learning-journey-duo-drills@0.0.0-canary-20251217060834
15
- - @lssm/example.learning-journey-platform-tour@0.0.0-canary-20251217060834
16
- - @lssm/example.learning-journey-quest-challenges@0.0.0-canary-20251217060834
17
- - @lssm/example.learning-journey-studio-onboarding@0.0.0-canary-20251217060834
18
- - @lssm/example.learning-journey-ui-coaching@0.0.0-canary-20251217060834
19
- - @lssm/example.learning-journey-ui-gamified@0.0.0-canary-20251217060834
20
- - @lssm/example.learning-journey-ui-onboarding@0.0.0-canary-20251217060834
21
- - @lssm/example.learning-journey-ui-shared@0.0.0-canary-20251217060834
22
- - @lssm/module.learning-journey@0.0.0-canary-20251217060834
12
+ - @lssm/example.learning-journey-ambient-coach@0.0.0-canary-20251217073102
13
+ - @lssm/example.learning-journey-crm-onboarding@0.0.0-canary-20251217073102
14
+ - @lssm/example.learning-journey-duo-drills@0.0.0-canary-20251217073102
15
+ - @lssm/example.learning-journey-platform-tour@0.0.0-canary-20251217073102
16
+ - @lssm/example.learning-journey-quest-challenges@0.0.0-canary-20251217073102
17
+ - @lssm/example.learning-journey-studio-onboarding@0.0.0-canary-20251217073102
18
+ - @lssm/example.learning-journey-ui-coaching@0.0.0-canary-20251217073102
19
+ - @lssm/example.learning-journey-ui-gamified@0.0.0-canary-20251217073102
20
+ - @lssm/example.learning-journey-ui-onboarding@0.0.0-canary-20251217073102
21
+ - @lssm/example.learning-journey-ui-shared@0.0.0-canary-20251217073102
22
+ - @lssm/lib.contracts@0.0.0-canary-20251217073102
23
+ - @lssm/lib.schema@0.0.0-canary-20251217073102
24
+ - @lssm/module.learning-journey@0.0.0-canary-20251217073102
package/dist/api.js CHANGED
@@ -1 +1,170 @@
1
- import{learningJourneyTracks as e}from"./tracks.js";import{getLearnerTracks as t,getTrackResolver as n,initProgress as r}from"./progress-store.js";const i=n(e),a=(e,t)=>e?t?Object.entries(e).every(([e,n])=>t[e]===n):!1:!0,o=(e,t)=>e.eventName!==t.name||e.eventVersion!==void 0&&t.version!==void 0&&e.eventVersion!==t.version||e.sourceModule&&t.sourceModule&&e.sourceModule!==t.sourceModule?!1:a(e.payloadFilter,t.payload),s=(e,t,n,r)=>{if(e.kind===`count`){if(!o(e,t))return{matched:!1};let i=(n.occurrences??0)+1;return{matched:(e.withinHours===void 0||!!(r&&t.occurredAt&&(t.occurredAt.getTime()-r.getTime())/(1e3*60*60)<=e.withinHours))&&i>=e.atLeast,occurrences:i}}if(e.kind===`time_window`)return!o(e,t)||e.withinHoursOfStart!==void 0&&r&&t.occurredAt&&(t.occurredAt.getTime()-r.getTime())/(1e3*60*60)>e.withinHoursOfStart?{matched:!1}:{matched:!0};if(e.kind===`srs_mastery`){if(t.name!==e.eventName)return{matched:!1};let r=t.payload;if(!a(e.payloadFilter,r))return{matched:!1};let i=e.skillIdField??`skillId`,o=e.masteryField??`mastery`,s=r?.[i],c=r?.[o];if(s===void 0||c===void 0||typeof c!=`number`||c<e.minimumMastery)return{matched:!1};let l=(n.masteryCount??0)+1;return{matched:l>=(e.requiredCount??1),masteryCount:l}}return{matched:o(e,t)}},c=(e,t)=>{if(!e||!t)return{};let n=t.getTime(),r=n;e.unlockOnDay!==void 0&&(r=n+(e.unlockOnDay-1)*24*60*60*1e3),e.unlockAfterHours!==void 0&&(r=n+e.unlockAfterHours*60*60*1e3);let i=new Date(r);return{availableAt:i,dueAt:e.dueWithinHours===void 0?void 0:new Date(i.getTime()+e.dueWithinHours*60*60*1e3)}},l=e=>{let t=e.length||1,n=e.filter(e=>e.status===`COMPLETED`).length;return Math.round(n/t*100)},u=(e,t)=>{if(t.isCompleted)return t;let n=new Date,r=t.startedAt??n,i=(n.getTime()-r.getTime())/(1e3*60*60),a=t.xpEarned,{completionRewards:o,streakRule:s}=e;return o?.xpBonus&&(a+=o.xpBonus),s?.hoursWindow!==void 0&&i<=s.hoursWindow&&s.bonusXp&&(a+=s.bonusXp),{...t,xpEarned:a,isCompleted:!0,completedAt:n,lastActivityAt:n}},d=n=>{let r=n?t(n):void 0;return{tracks:e,progress:n&&r?Array.from(r.values()):[]}},f=(e,n)=>{let a=i(e);if(!a)return;let o=t(n),s=o.get(e)??r(n,a);return o.set(e,s),s},p=n=>{let i=n.trackId===void 0?e:e.filter(e=>e.id===n.trackId),a=[],o=n.occurredAt??new Date;for(let e of i){let i=t(n.learnerId),d=i.get(e.id)??r(n.learnerId,e),f=d.startedAt??o,p=d.startedAt===void 0,m=d.steps.map(t=>{if(t.status===`COMPLETED`)return t;let r=e.steps.find(e=>e.id===t.id);if(!r)return t;let{availableAt:i,dueAt:a}=c(r.availability,f);if(i&&o<i||a&&o>a)return{...t,availableAt:i,dueAt:a};let l=s(r.completion,n,t,f);return l.matched?(p=!0,{...t,status:`COMPLETED`,xpEarned:r.xpReward??0,completedAt:o,triggeringEvent:n.name,eventPayload:n.payload,occurrences:l.occurrences??t.occurrences,masteryCount:l.masteryCount??t.masteryCount,availableAt:i,dueAt:a}):((l.occurrences!==void 0||l.masteryCount!==void 0)&&(p=!0),{...t,occurrences:l.occurrences??t.occurrences,masteryCount:l.masteryCount??t.masteryCount,availableAt:i,dueAt:a})});if(!p)continue;let h=m.reduce((e,t)=>e+t.xpEarned,0)+(e.totalXp??0),g={...d,steps:m,xpEarned:h,startedAt:f,lastActivityAt:o,progress:l(m)};m.every(e=>e.status===`COMPLETED`)&&(g=u(e,g)),i.set(e.id,g),a.push(g)}return a};export{f as getProgress,d as listTracks,p as recordEvent};
1
+ import { learningJourneyTracks } from "./tracks.js";
2
+ import { getLearnerTracks, getTrackResolver, initProgress } from "./progress-store.js";
3
+
4
+ //#region src/api.ts
5
+ const getTrack = getTrackResolver(learningJourneyTracks);
6
+ const matchesFilter = (filter, payload) => {
7
+ if (!filter) return true;
8
+ if (!payload) return false;
9
+ return Object.entries(filter).every(([key, value]) => payload[key] === value);
10
+ };
11
+ const matchesBaseEvent = (condition, event) => {
12
+ if (condition.eventName !== event.name) return false;
13
+ if (condition.eventVersion !== void 0 && event.version !== void 0) {
14
+ if (condition.eventVersion !== event.version) return false;
15
+ }
16
+ if (condition.sourceModule && event.sourceModule && condition.sourceModule !== event.sourceModule) return false;
17
+ return matchesFilter(condition.payloadFilter, event.payload);
18
+ };
19
+ const matchesCondition = (condition, event, step, trackStartedAt) => {
20
+ if (condition.kind === "count") {
21
+ if (!matchesBaseEvent(condition, event)) return { matched: false };
22
+ const occurrences = (step.occurrences ?? 0) + 1;
23
+ return {
24
+ matched: (condition.withinHours === void 0 || Boolean(trackStartedAt && event.occurredAt && (event.occurredAt.getTime() - trackStartedAt.getTime()) / (1e3 * 60 * 60) <= condition.withinHours)) && occurrences >= condition.atLeast,
25
+ occurrences
26
+ };
27
+ }
28
+ if (condition.kind === "time_window") {
29
+ if (!matchesBaseEvent(condition, event)) return { matched: false };
30
+ if (condition.withinHoursOfStart !== void 0 && trackStartedAt && event.occurredAt) {
31
+ if ((event.occurredAt.getTime() - trackStartedAt.getTime()) / (1e3 * 60 * 60) > condition.withinHoursOfStart) return { matched: false };
32
+ }
33
+ return { matched: true };
34
+ }
35
+ if (condition.kind === "srs_mastery") {
36
+ if (event.name !== condition.eventName) return { matched: false };
37
+ const payload = event.payload;
38
+ if (!matchesFilter(condition.payloadFilter, payload)) return { matched: false };
39
+ const skillKey = condition.skillIdField ?? "skillId";
40
+ const masteryKey = condition.masteryField ?? "mastery";
41
+ const skillId = payload?.[skillKey];
42
+ const masteryValue = payload?.[masteryKey];
43
+ if (skillId === void 0 || masteryValue === void 0) return { matched: false };
44
+ if (typeof masteryValue !== "number") return { matched: false };
45
+ if (masteryValue < condition.minimumMastery) return { matched: false };
46
+ const masteryCount = (step.masteryCount ?? 0) + 1;
47
+ return {
48
+ matched: masteryCount >= (condition.requiredCount ?? 1),
49
+ masteryCount
50
+ };
51
+ }
52
+ return { matched: matchesBaseEvent(condition, event) };
53
+ };
54
+ const getAvailability = (availability, startedAt) => {
55
+ if (!availability || !startedAt) return {};
56
+ const baseTime = startedAt.getTime();
57
+ let unlockTime = baseTime;
58
+ if (availability.unlockOnDay !== void 0) unlockTime = baseTime + (availability.unlockOnDay - 1) * 24 * 60 * 60 * 1e3;
59
+ if (availability.unlockAfterHours !== void 0) unlockTime = baseTime + availability.unlockAfterHours * 60 * 60 * 1e3;
60
+ const availableAt = new Date(unlockTime);
61
+ return {
62
+ availableAt,
63
+ dueAt: availability.dueWithinHours !== void 0 ? new Date(availableAt.getTime() + availability.dueWithinHours * 60 * 60 * 1e3) : void 0
64
+ };
65
+ };
66
+ const computeProgressPercent = (steps) => {
67
+ const total = steps.length || 1;
68
+ const done = steps.filter((s) => s.status === "COMPLETED").length;
69
+ return Math.round(done / total * 100);
70
+ };
71
+ const applyTrackCompletionBonuses = (track, progress) => {
72
+ if (progress.isCompleted) return progress;
73
+ const completedAt = /* @__PURE__ */ new Date();
74
+ const startedAt = progress.startedAt ?? completedAt;
75
+ const hoursElapsed = (completedAt.getTime() - startedAt.getTime()) / (1e3 * 60 * 60);
76
+ let xpEarned = progress.xpEarned;
77
+ const { completionRewards, streakRule } = track;
78
+ if (completionRewards?.xpBonus) xpEarned += completionRewards.xpBonus;
79
+ if (streakRule?.hoursWindow !== void 0 && hoursElapsed <= streakRule.hoursWindow && streakRule.bonusXp) xpEarned += streakRule.bonusXp;
80
+ return {
81
+ ...progress,
82
+ xpEarned,
83
+ isCompleted: true,
84
+ completedAt,
85
+ lastActivityAt: completedAt
86
+ };
87
+ };
88
+ const listTracks = (learnerId) => {
89
+ const progressMap = learnerId ? getLearnerTracks(learnerId) : void 0;
90
+ return {
91
+ tracks: learningJourneyTracks,
92
+ progress: learnerId && progressMap ? Array.from(progressMap.values()) : []
93
+ };
94
+ };
95
+ const getProgress = (trackId, learnerId) => {
96
+ const track = getTrack(trackId);
97
+ if (!track) return void 0;
98
+ const map = getLearnerTracks(learnerId);
99
+ const existing = map.get(trackId) ?? initProgress(learnerId, track);
100
+ map.set(trackId, existing);
101
+ return existing;
102
+ };
103
+ const recordEvent = (event) => {
104
+ const targets = event.trackId !== void 0 ? learningJourneyTracks.filter((t) => t.id === event.trackId) : learningJourneyTracks;
105
+ const updated = [];
106
+ const eventTime = event.occurredAt ?? /* @__PURE__ */ new Date();
107
+ for (const track of targets) {
108
+ const map = getLearnerTracks(event.learnerId);
109
+ const current = map.get(track.id) ?? initProgress(event.learnerId, track);
110
+ const startedAt = current.startedAt ?? eventTime;
111
+ let changed = current.startedAt === void 0;
112
+ const steps = current.steps.map((step) => {
113
+ if (step.status === "COMPLETED") return step;
114
+ const spec = track.steps.find((s) => s.id === step.id);
115
+ if (!spec) return step;
116
+ const { availableAt, dueAt } = getAvailability(spec.availability, startedAt);
117
+ if (availableAt && eventTime < availableAt) return {
118
+ ...step,
119
+ availableAt,
120
+ dueAt
121
+ };
122
+ if (dueAt && eventTime > dueAt) return {
123
+ ...step,
124
+ availableAt,
125
+ dueAt
126
+ };
127
+ const result = matchesCondition(spec.completion, event, step, startedAt);
128
+ if (result.matched) {
129
+ changed = true;
130
+ return {
131
+ ...step,
132
+ status: "COMPLETED",
133
+ xpEarned: spec.xpReward ?? 0,
134
+ completedAt: eventTime,
135
+ triggeringEvent: event.name,
136
+ eventPayload: event.payload,
137
+ occurrences: result.occurrences ?? step.occurrences,
138
+ masteryCount: result.masteryCount ?? step.masteryCount,
139
+ availableAt,
140
+ dueAt
141
+ };
142
+ }
143
+ if (result.occurrences !== void 0 || result.masteryCount !== void 0) changed = true;
144
+ return {
145
+ ...step,
146
+ occurrences: result.occurrences ?? step.occurrences,
147
+ masteryCount: result.masteryCount ?? step.masteryCount,
148
+ availableAt,
149
+ dueAt
150
+ };
151
+ });
152
+ if (!changed) continue;
153
+ const xpEarned = steps.reduce((sum, s) => sum + s.xpEarned, 0) + (track.totalXp ?? 0);
154
+ let progress = {
155
+ ...current,
156
+ steps,
157
+ xpEarned,
158
+ startedAt,
159
+ lastActivityAt: eventTime,
160
+ progress: computeProgressPercent(steps)
161
+ };
162
+ if (steps.every((s) => s.status === "COMPLETED")) progress = applyTrackCompletionBonuses(track, progress);
163
+ map.set(track.id, progress);
164
+ updated.push(progress);
165
+ }
166
+ return updated;
167
+ };
168
+
169
+ //#endregion
170
+ export { getProgress, listTracks, recordEvent };
@@ -1 +1 @@
1
- import"./learning-journey-registry.docblock.js";
1
+ import "./learning-journey-registry.docblock.js";
@@ -1 +1,38 @@
1
- import{a as e}from"../libs/contracts/dist/docs/registry.js";import"../libs/contracts/dist/docs/index.js";e([{id:`docs.learning-journey.registry`,title:`Learning Journey — Example Track Registry`,summary:`Aggregates learning journey example tracks (Studio onboarding, Platform tour, CRM first win, Drills, Ambient Coach, Quest challenges).`,kind:`usage`,visibility:`public`,route:`/docs/learning-journey/registry`,tags:[`learning`,`registry`,`onboarding`],body:"## Tracks\n- `studio_getting_started` (Studio onboarding)\n- `platform_primitives_tour` (Platform primitives)\n- `crm_first_win` (CRM pipeline onboarding)\n- `drills_language_basics` (Drills & SRS)\n- `money_ambient_coach`, `coliving_ambient_coach` (Ambient tips)\n- `money_reset_7day` (Quest/challenge)\n\n## Exports\n- `learningJourneyTracks` — raw specs\n- `onboardingTrackCatalog` — DTOs aligned with onboarding API\n- `mapTrackSpecToDto` — helper to map individual tracks\n\n## Wiring\n- Use with onboarding API contracts:\n - `learning.onboarding.listTracks`\n - `learning.onboarding.getProgress`\n - `learning.onboarding.recordEvent`\n- Intended for registry/adapters in Studio UI or services that surface tracks."}]);
1
+ import { registerDocBlocks } from "../libs/contracts/dist/docs/registry.js";
2
+ import "../libs/contracts/dist/docs/index.js";
3
+
4
+ //#region src/docs/learning-journey-registry.docblock.ts
5
+ registerDocBlocks([{
6
+ id: "docs.learning-journey.registry",
7
+ title: "Learning Journey — Example Track Registry",
8
+ summary: "Aggregates learning journey example tracks (Studio onboarding, Platform tour, CRM first win, Drills, Ambient Coach, Quest challenges).",
9
+ kind: "usage",
10
+ visibility: "public",
11
+ route: "/docs/learning-journey/registry",
12
+ tags: [
13
+ "learning",
14
+ "registry",
15
+ "onboarding"
16
+ ],
17
+ body: `## Tracks
18
+ - \`studio_getting_started\` (Studio onboarding)
19
+ - \`platform_primitives_tour\` (Platform primitives)
20
+ - \`crm_first_win\` (CRM pipeline onboarding)
21
+ - \`drills_language_basics\` (Drills & SRS)
22
+ - \`money_ambient_coach\`, \`coliving_ambient_coach\` (Ambient tips)
23
+ - \`money_reset_7day\` (Quest/challenge)
24
+
25
+ ## Exports
26
+ - \`learningJourneyTracks\` — raw specs
27
+ - \`onboardingTrackCatalog\` — DTOs aligned with onboarding API
28
+ - \`mapTrackSpecToDto\` — helper to map individual tracks
29
+
30
+ ## Wiring
31
+ - Use with onboarding API contracts:
32
+ - \`learning.onboarding.listTracks\`
33
+ - \`learning.onboarding.getProgress\`
34
+ - \`learning.onboarding.recordEvent\`
35
+ - Intended for registry/adapters in Studio UI or services that surface tracks.`
36
+ }]);
37
+
38
+ //#endregion
package/dist/example.js CHANGED
@@ -1 +1,34 @@
1
- var e={id:`learning-journey-registry`,title:`Learning Journey Registry`,summary:`Registry of learning journey tracks + presentations + UI mini-app bindings.`,tags:[`learning`,`journey`,`registry`],kind:`library`,visibility:`public`,docs:{rootDocId:`docs.examples.learning-journey-registry`},entrypoints:{packageName:`@lssm/example.learning-journey-registry`,docs:`./docs`},surfaces:{templates:!0,sandbox:{enabled:!0,modes:[`markdown`,`specs`]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}};export{e as default};
1
+ //#region src/example.ts
2
+ const example = {
3
+ id: "learning-journey-registry",
4
+ title: "Learning Journey Registry",
5
+ summary: "Registry of learning journey tracks + presentations + UI mini-app bindings.",
6
+ tags: [
7
+ "learning",
8
+ "journey",
9
+ "registry"
10
+ ],
11
+ kind: "library",
12
+ visibility: "public",
13
+ docs: { rootDocId: "docs.examples.learning-journey-registry" },
14
+ entrypoints: {
15
+ packageName: "@lssm/example.learning-journey-registry",
16
+ docs: "./docs"
17
+ },
18
+ surfaces: {
19
+ templates: true,
20
+ sandbox: {
21
+ enabled: true,
22
+ modes: ["markdown", "specs"]
23
+ },
24
+ studio: {
25
+ enabled: true,
26
+ installable: true
27
+ },
28
+ mcp: { enabled: true }
29
+ }
30
+ };
31
+ var example_default = example;
32
+
33
+ //#endregion
34
+ export { example_default as default };
@@ -0,0 +1,41 @@
1
+ //#region ../learning-journey-ambient-coach/src/track.ts
2
+ const makeTipStep = (id, tipId, description) => ({
3
+ id,
4
+ title: `Resolve tip: ${tipId}`,
5
+ description,
6
+ completion: {
7
+ kind: "event",
8
+ eventName: "coach.tip.follow_up_action_taken",
9
+ payloadFilter: { tipId }
10
+ },
11
+ xpReward: 20,
12
+ metadata: { tipId }
13
+ });
14
+ const moneyAmbientCoachTrack = {
15
+ id: "money_ambient_coach",
16
+ name: "Ambient Coach — Money",
17
+ description: "Subtle coaching for money patterns (cash buffer, goals, saving rhythm).",
18
+ targetUserSegment: "money_user",
19
+ totalXp: 60,
20
+ steps: [
21
+ makeTipStep("cash_buffer_too_high", "cash_buffer_too_high", "Suggest sweeping excess cash into goals."),
22
+ makeTipStep("no_savings_goal", "no_savings_goal", "Prompt setting a first savings goal."),
23
+ makeTipStep("irregular_savings", "irregular_savings", "Recommend recurring saves after irregular deposits.")
24
+ ]
25
+ };
26
+ const colivingAmbientCoachTrack = {
27
+ id: "coliving_ambient_coach",
28
+ name: "Ambient Coach — Coliving",
29
+ description: "Contextual tips for healthy coliving habits.",
30
+ targetUserSegment: "coliving",
31
+ totalXp: 60,
32
+ steps: [
33
+ makeTipStep("noise_late_evening", "noise_late_evening", "Suggest updating quiet hours to reduce evening noise."),
34
+ makeTipStep("guest_frequency_high", "guest_frequency_high", "Set guest frequency expectations for the house."),
35
+ makeTipStep("shared_space_conflicts", "shared_space_conflicts", "Offer a shared-space checklist to reduce conflicts.")
36
+ ]
37
+ };
38
+ const ambientCoachTracks = [moneyAmbientCoachTrack, colivingAmbientCoachTrack];
39
+
40
+ //#endregion
41
+ export { ambientCoachTracks };
@@ -0,0 +1,98 @@
1
+ //#region ../learning-journey-crm-onboarding/dist/track.js
2
+ const crmFirstWinTrack = {
3
+ id: "crm_first_win",
4
+ productId: "crm-pipeline",
5
+ name: "CRM First Win",
6
+ description: "Guide a new CRM user from empty pipeline to first closed-won deal.",
7
+ targetUserSegment: "crm_adopter",
8
+ targetRole: "sales",
9
+ totalXp: 135,
10
+ streakRule: {
11
+ hoursWindow: 72,
12
+ bonusXp: 25
13
+ },
14
+ completionRewards: {
15
+ xpBonus: 25,
16
+ badgeKey: "crm_first_win"
17
+ },
18
+ steps: [
19
+ {
20
+ id: "create_pipeline",
21
+ title: "Create pipeline & stages",
22
+ description: "Create a pipeline with baseline stages.",
23
+ order: 1,
24
+ completion: {
25
+ eventName: "pipeline.created",
26
+ sourceModule: "@lssm/example.crm-pipeline"
27
+ },
28
+ xpReward: 15,
29
+ metadata: { surface: "pipeline" }
30
+ },
31
+ {
32
+ id: "create_contact_and_company",
33
+ title: "Create contact and company",
34
+ description: "Add your first contact and associated company.",
35
+ order: 2,
36
+ completion: {
37
+ eventName: "contact.created",
38
+ sourceModule: "@lssm/example.crm-pipeline"
39
+ },
40
+ xpReward: 20,
41
+ metadata: { surface: "contacts" }
42
+ },
43
+ {
44
+ id: "create_first_deal",
45
+ title: "Log first deal",
46
+ description: "Create your first deal in the pipeline.",
47
+ order: 3,
48
+ completion: {
49
+ eventName: "deal.created",
50
+ sourceModule: "@lssm/example.crm-pipeline"
51
+ },
52
+ xpReward: 20,
53
+ metadata: { surface: "deals" }
54
+ },
55
+ {
56
+ id: "move_deal_in_pipeline",
57
+ title: "Move a deal across stages",
58
+ description: "Move a deal across at least three stages.",
59
+ order: 4,
60
+ completion: {
61
+ eventName: "deal.moved",
62
+ sourceModule: "@lssm/example.crm-pipeline"
63
+ },
64
+ xpReward: 20,
65
+ metadata: { surface: "deals" }
66
+ },
67
+ {
68
+ id: "close_deal_won",
69
+ title: "Close a deal as won",
70
+ description: "Close a deal as won to hit first revenue.",
71
+ order: 5,
72
+ completion: {
73
+ eventName: "deal.won",
74
+ sourceModule: "@lssm/example.crm-pipeline"
75
+ },
76
+ xpReward: 30,
77
+ metadata: { surface: "deals" }
78
+ },
79
+ {
80
+ id: "setup_follow_up",
81
+ title: "Create follow-up task",
82
+ description: "Create a follow-up task and notification for a contact or deal.",
83
+ order: 6,
84
+ completion: {
85
+ eventName: "task.completed",
86
+ sourceModule: "@lssm/example.crm-pipeline",
87
+ payloadFilter: { type: "follow_up" }
88
+ },
89
+ xpReward: 30,
90
+ metadata: { surface: "tasks" }
91
+ }
92
+ ],
93
+ metadata: { surfacedIn: ["crm/dashboard", "crm/pipeline"] }
94
+ };
95
+ const crmLearningTracks = [crmFirstWinTrack];
96
+
97
+ //#endregion
98
+ export { crmLearningTracks };
@@ -0,0 +1,65 @@
1
+ //#region ../learning-journey-duo-drills/src/track.ts
2
+ const drillsLanguageBasicsTrack = {
3
+ id: "drills_language_basics",
4
+ name: "Language Basics Drills",
5
+ description: "Short SRS-driven drills to master a first skill, modeled after Duolingo-style sessions.",
6
+ targetUserSegment: "learner",
7
+ targetRole: "individual",
8
+ totalXp: 50,
9
+ completionRewards: { xpBonus: 25 },
10
+ steps: [
11
+ {
12
+ id: "complete_first_session",
13
+ title: "Complete first drill session",
14
+ description: "Finish a drill session to get started.",
15
+ order: 1,
16
+ completion: {
17
+ kind: "event",
18
+ eventName: "drill.session.completed"
19
+ },
20
+ xpReward: 20,
21
+ metadata: { surface: "drills" }
22
+ },
23
+ {
24
+ id: "reach_accuracy_threshold",
25
+ title: "Hit high accuracy in sessions",
26
+ description: "Achieve three high-accuracy sessions to build confidence.",
27
+ order: 2,
28
+ completion: {
29
+ kind: "count",
30
+ eventName: "drill.session.completed",
31
+ atLeast: 3,
32
+ payloadFilter: { accuracyBucket: "high" }
33
+ },
34
+ xpReward: 30,
35
+ metadata: {
36
+ metric: "accuracy",
37
+ target: ">=85%"
38
+ }
39
+ },
40
+ {
41
+ id: "unlock_new_skill",
42
+ title: "Master core cards in first skill",
43
+ description: "Reach mastery on at least five cards in the first skill to unlock the next one.",
44
+ order: 3,
45
+ completion: {
46
+ kind: "srs_mastery",
47
+ eventName: "drill.card.mastered",
48
+ minimumMastery: .8,
49
+ requiredCount: 5,
50
+ skillIdField: "skillId",
51
+ masteryField: "mastery",
52
+ payloadFilter: { skillId: "language_basics" }
53
+ },
54
+ xpReward: 40,
55
+ metadata: {
56
+ surface: "srs",
57
+ skill: "language_basics"
58
+ }
59
+ }
60
+ ]
61
+ };
62
+ const drillTracks = [drillsLanguageBasicsTrack];
63
+
64
+ //#endregion
65
+ export { drillTracks };