@lssm/module.learning-journey 0.0.0-canary-20251219202229 → 0.0.0-canary-20251220002821

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 (80) hide show
  1. package/README.md +1 -0
  2. package/dist/contracts/models.d.ts +118 -118
  3. package/dist/contracts/onboarding.d.ts +168 -168
  4. package/dist/contracts/onboarding.d.ts.map +1 -1
  5. package/dist/contracts/operations.d.ts +71 -71
  6. package/dist/contracts/operations.d.ts.map +1 -1
  7. package/dist/engines/srs.d.ts +12 -12
  8. package/dist/engines/srs.d.ts.map +1 -1
  9. package/dist/engines/srs.js +28 -29
  10. package/dist/engines/srs.js.map +1 -1
  11. package/dist/entities/ai.d.ts +200 -200
  12. package/dist/entities/course.d.ts +150 -150
  13. package/dist/entities/flashcard.d.ts +145 -145
  14. package/dist/entities/flashcard.d.ts.map +1 -1
  15. package/dist/entities/gamification.d.ts +198 -198
  16. package/dist/entities/index.d.ts +605 -605
  17. package/dist/entities/index.d.ts.map +1 -1
  18. package/dist/entities/learner.d.ts +192 -192
  19. package/dist/entities/onboarding.d.ts +165 -165
  20. package/dist/events.d.ts +214 -214
  21. package/dist/events.d.ts.map +1 -1
  22. package/dist/libs/contracts/dist/capabilities/openbanking.js.map +1 -1
  23. package/dist/libs/contracts/dist/contract-registry/schemas.js.map +1 -1
  24. package/dist/libs/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js.map +1 -1
  25. package/dist/libs/contracts/dist/docs/meta.docs.js.map +1 -1
  26. package/dist/libs/contracts/dist/docs/presentations.js.map +1 -1
  27. package/dist/libs/contracts/dist/docs/registry.js.map +1 -1
  28. package/dist/libs/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js.map +1 -1
  29. package/dist/libs/contracts/dist/docs/tech/contracts/openapi-export.docblock.js.map +1 -1
  30. package/dist/libs/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js.map +1 -1
  31. package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js.map +1 -1
  32. package/dist/libs/contracts/dist/docs/tech/mcp-endpoints.docblock.js.map +1 -1
  33. package/dist/libs/contracts/dist/docs/tech/presentation-runtime.docblock.js.map +1 -1
  34. package/dist/libs/contracts/dist/docs/tech/schema/README.docblock.js.map +1 -1
  35. package/dist/libs/contracts/dist/docs/tech/studio/learning-events.docblock.js.map +1 -1
  36. package/dist/libs/contracts/dist/docs/tech/studio/learning-journeys.docblock.js.map +1 -1
  37. package/dist/libs/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js.map +1 -1
  38. package/dist/libs/contracts/dist/docs/tech/studio/project-access-teams.docblock.js.map +1 -1
  39. package/dist/libs/contracts/dist/docs/tech/studio/project-routing.docblock.js.map +1 -1
  40. package/dist/libs/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js.map +1 -1
  41. package/dist/libs/contracts/dist/docs/tech/studio/team-invitations.docblock.js.map +1 -1
  42. package/dist/libs/contracts/dist/docs/tech/studio/workspace-ops.docblock.js.map +1 -1
  43. package/dist/libs/contracts/dist/docs/tech/studio/workspaces.docblock.js.map +1 -1
  44. package/dist/libs/contracts/dist/docs/tech/telemetry-ingest.docblock.js.map +1 -1
  45. package/dist/libs/contracts/dist/docs/tech/templates/runtime.docblock.js.map +1 -1
  46. package/dist/libs/contracts/dist/docs/tech/vscode-extension.docblock.js.map +1 -1
  47. package/dist/libs/contracts/dist/docs/tech/workflows/overview.docblock.js.map +1 -1
  48. package/dist/libs/contracts/dist/docs/tech-contracts.docs.js.map +1 -1
  49. package/dist/libs/contracts/dist/events.js.map +1 -1
  50. package/dist/libs/contracts/dist/integrations/contracts.js.map +1 -1
  51. package/dist/libs/contracts/dist/integrations/openbanking/contracts/accounts.js.map +1 -1
  52. package/dist/libs/contracts/dist/integrations/openbanking/contracts/balances.js.map +1 -1
  53. package/dist/libs/contracts/dist/integrations/openbanking/contracts/transactions.js.map +1 -1
  54. package/dist/libs/contracts/dist/integrations/openbanking/models.js.map +1 -1
  55. package/dist/libs/contracts/dist/integrations/openbanking/telemetry.js.map +1 -1
  56. package/dist/libs/contracts/dist/integrations/providers/elevenlabs.js.map +1 -1
  57. package/dist/libs/contracts/dist/integrations/providers/gcs-storage.js.map +1 -1
  58. package/dist/libs/contracts/dist/integrations/providers/gmail.js.map +1 -1
  59. package/dist/libs/contracts/dist/integrations/providers/google-calendar.js.map +1 -1
  60. package/dist/libs/contracts/dist/integrations/providers/mistral.js.map +1 -1
  61. package/dist/libs/contracts/dist/integrations/providers/postmark.js.map +1 -1
  62. package/dist/libs/contracts/dist/integrations/providers/powens.js.map +1 -1
  63. package/dist/libs/contracts/dist/integrations/providers/qdrant.js.map +1 -1
  64. package/dist/libs/contracts/dist/integrations/providers/stripe.js.map +1 -1
  65. package/dist/libs/contracts/dist/integrations/providers/twilio-sms.js.map +1 -1
  66. package/dist/libs/contracts/dist/knowledge/contracts.js.map +1 -1
  67. package/dist/libs/contracts/dist/knowledge/spaces/email-threads.js.map +1 -1
  68. package/dist/libs/contracts/dist/knowledge/spaces/financial-docs.js.map +1 -1
  69. package/dist/libs/contracts/dist/knowledge/spaces/financial-overview.js.map +1 -1
  70. package/dist/libs/contracts/dist/knowledge/spaces/product-canon.js.map +1 -1
  71. package/dist/libs/contracts/dist/knowledge/spaces/support-faq.js.map +1 -1
  72. package/dist/libs/contracts/dist/knowledge/spaces/uploaded-docs.js.map +1 -1
  73. package/dist/libs/contracts/dist/llm/exporters.js.map +1 -1
  74. package/dist/libs/contracts/dist/onboarding-base.js.map +1 -1
  75. package/dist/libs/contracts/dist/ownership.js.map +1 -1
  76. package/dist/libs/contracts/dist/presentations.v2.js.map +1 -1
  77. package/dist/libs/contracts/dist/regenerator/service.js.map +1 -1
  78. package/dist/libs/contracts/dist/schema/dist/index.js.map +1 -1
  79. package/dist/libs/contracts/dist/spec.js.map +1 -1
  80. package/package.json +13 -7
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding.d.ts","names":[],"sources":["../../src/contracts/onboarding.ts"],"sourcesContent":[],"mappings":";;;;cAiBa,yCAAmB;;UA0B9B,mBAAA,CAAA;;EA1BW,CAAA;EA0BX,OAAA,EAAA;;;;;;;;;;;;;;;;;;;;EA1B8B,KAAA,EAAA;IA4BnB,IAAA,+BAiCX,CAAA,MAAA,EAAA,MAAA,CAAA;IAAA,UAAA,EAAA,KAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAjC+B,IAAA,+BAAA,CAAA,OAAA,EAAA,OAAA,CAAA;IAmCpB,UAAA,EAAA,IAAA;EAcX,CAAA;;;;;;;oBAdsC;EAAA,CAAA;EAgB3B,QAAA,EAAA;IAkBX,IAAA,+BAAA,CAAA,OAAA,EAAA,OAAA,CAAA;;;;cArEW,0CAAoB;;UAiC/B,mBAAA,CAAA;;;;;;;;;;;;;oBAkBkC;EAAA,CAAA;EA0EvB,iBAAA,EAAA;IAkBX,IAAA,+BAAA,CAAA,MAAA,EAAA,MAAA,CAAA;;;;uCAlBuC,CAAA,MAAA,EAAA,MAAA,CAAA;IAAA,UAAA,EAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CAAA,CAAA,MAAA,EAAA,MAAA,CAAA;QAAA,UAAA,EAAA,IAAA;MAoB5B,CAAA;MAkBX,OAAA,EAAA;;kBAlBwC,EAAA,IAAA;MAAA,CAAA;;;;;;;;;;;;;;;;;;;;YAAA,IAAA,+BAAA,CAAA,MAAA,EAAA,MAAA,CAAA;YAAA,UAAA,EAAA,IAAA;UAoB7B,CAAA;UAkCX,aAAA,EAAA;;;;;;;gBAlCwC;QAAA,IAAA,+BAAA,CAAA,MAAA,EAAA,MAAA,CAAA;;;gBAAA,EAAA;QAAA,IAAA,+BAAA,CAAA,OAAA,EAAA,OAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;cAlI7B,iDAA2B;;UActC,mBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;cAEW,6CAAuB;;UAkBlC,mBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAwDW,mDAA4B,iCAAA;;UAkBvC,mBAAA,CAAA;;;;;;;;;;;;;;;;;;;;cAlBuC,mBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAoB5B,oDAA6B,iCAAA;;UAkBxC,mBAAA,CAAA;;;;;;;;;UAlBwC,mBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAoB7B,oDAA6B,iCAAA;;UAkCxC,mBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;UAlCwC,mBAAA,CAAA"}
1
+ {"version":3,"file":"onboarding.d.ts","names":[],"sources":["../../src/contracts/onboarding.ts"],"sourcesContent":[],"mappings":";;;;cAiBa,0CAAmB;;UA0B9B,oBAAA,CAAA;;EA1BW,CAAA;EA0BX,OAAA,EAAA;;;;;;;;;;;;;;;;;;;;EA1B8B,KAAA,EAAA;IA4BnB,IAAA,gCAiCX,CAAA,MAAA,EAAA,MAAA,CAAA;IAAA,UAAA,EAAA,KAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAjC+B,IAAA,gCAAA,CAAA,OAAA,EAAA,OAAA,CAAA;IAmCpB,UAAA,EAAA,IAAA;EAcX,CAAA;;;;;;;oBAdsC;EAAA,CAAA;EAgB3B,QAAA,EAAA;IAkBX,IAAA,gCAAA,CAAA,OAAA,EAAA,OAAA,CAAA;;;;cArEW,2CAAoB;;UAiC/B,oBAAA,CAAA;;;;;;;;;;;;;oBAkBkC;EAAA,CAAA;EA0EvB,iBAAA,EAAA;IAkBX,IAAA,gCAAA,CAAA,MAAA,EAAA,MAAA,CAAA;;;;wCAlBuC,CAAA,MAAA,EAAA,MAAA,CAAA;IAAA,UAAA,EAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CAAA,CAAA,MAAA,EAAA,MAAA,CAAA;QAAA,UAAA,EAAA,IAAA;MAoB5B,CAAA;MAkBX,OAAA,EAAA;;kBAlBwC,EAAA,IAAA;MAAA,CAAA;;;;;;;;;;;;;;;;;;;;YAAA,IAAA,gCAAA,CAAA,MAAA,EAAA,MAAA,CAAA;YAAA,UAAA,EAAA,IAAA;UAoB7B,CAAA;UAkCX,aAAA,EAAA;;;;;;;gBAlCwC;QAAA,IAAA,gCAAA,CAAA,MAAA,EAAA,MAAA,CAAA;;;kBAAA;QAAA,IAAA,gCAAA,CAAA,OAAA,EAAA,OAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;cAlI7B,kDAA2B;;UActC,oBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;cAEW,8CAAuB;;UAkBlC,oBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAwDW,oDAA4B,kCAAA;;UAkBvC,oBAAA,CAAA;;;;;;;;;;;;;;;;;;;;cAlBuC,oBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAoB5B,qDAA6B,kCAAA;;UAkBxC,oBAAA,CAAA;;;;;;;;;UAlBwC,oBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAoB7B,qDAA6B,kCAAA;;UAkCxC,oBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;UAlCwC,oBAAA,CAAA"}
@@ -1,138 +1,138 @@
1
- import * as _lssm_lib_schema814 from "@lssm/lib.schema";
2
- import * as _lssm_lib_contracts2 from "@lssm/lib.contracts";
1
+ import * as _lssm_lib_schema1367 from "@lssm/lib.schema";
2
+ import * as _lssm_lib_contracts34 from "@lssm/lib.contracts";
3
3
 
4
4
  //#region src/contracts/operations.d.ts
5
5
  /**
6
6
  * Enroll in a course.
7
7
  */
8
- declare const EnrollInCourseContract: _lssm_lib_contracts2.ContractSpec<_lssm_lib_schema814.SchemaModel<{
8
+ declare const EnrollInCourseContract: _lssm_lib_contracts34.ContractSpec<_lssm_lib_schema1367.SchemaModel<{
9
9
  courseId: {
10
- type: _lssm_lib_schema814.FieldType<string, string>;
10
+ type: _lssm_lib_schema1367.FieldType<string, string>;
11
11
  isOptional: false;
12
12
  };
13
- }>, _lssm_lib_schema814.SchemaModel<{
13
+ }>, _lssm_lib_schema1367.SchemaModel<{
14
14
  id: {
15
- type: _lssm_lib_schema814.FieldType<string, string>;
15
+ type: _lssm_lib_schema1367.FieldType<string, string>;
16
16
  isOptional: false;
17
17
  };
18
18
  learnerId: {
19
- type: _lssm_lib_schema814.FieldType<string, string>;
19
+ type: _lssm_lib_schema1367.FieldType<string, string>;
20
20
  isOptional: false;
21
21
  };
22
22
  courseId: {
23
- type: _lssm_lib_schema814.FieldType<string, string>;
23
+ type: _lssm_lib_schema1367.FieldType<string, string>;
24
24
  isOptional: false;
25
25
  };
26
26
  status: {
27
- type: _lssm_lib_schema814.FieldType<string, string>;
27
+ type: _lssm_lib_schema1367.FieldType<string, string>;
28
28
  isOptional: false;
29
29
  };
30
30
  progress: {
31
- type: _lssm_lib_schema814.FieldType<number, number>;
31
+ type: _lssm_lib_schema1367.FieldType<number, number>;
32
32
  isOptional: false;
33
33
  };
34
34
  startedAt: {
35
- type: _lssm_lib_schema814.FieldType<Date, string>;
35
+ type: _lssm_lib_schema1367.FieldType<Date, string>;
36
36
  isOptional: true;
37
37
  };
38
38
  completedAt: {
39
- type: _lssm_lib_schema814.FieldType<Date, string>;
39
+ type: _lssm_lib_schema1367.FieldType<Date, string>;
40
40
  isOptional: true;
41
41
  };
42
42
  }>, undefined>;
43
43
  /**
44
44
  * Complete a lesson.
45
45
  */
46
- declare const CompleteLessonContract: _lssm_lib_contracts2.ContractSpec<_lssm_lib_schema814.SchemaModel<{
46
+ declare const CompleteLessonContract: _lssm_lib_contracts34.ContractSpec<_lssm_lib_schema1367.SchemaModel<{
47
47
  lessonId: {
48
- type: _lssm_lib_schema814.FieldType<string, string>;
48
+ type: _lssm_lib_schema1367.FieldType<string, string>;
49
49
  isOptional: false;
50
50
  };
51
51
  score: {
52
- type: _lssm_lib_schema814.FieldType<number, number>;
52
+ type: _lssm_lib_schema1367.FieldType<number, number>;
53
53
  isOptional: true;
54
54
  };
55
55
  timeSpent: {
56
- type: _lssm_lib_schema814.FieldType<number, number>;
56
+ type: _lssm_lib_schema1367.FieldType<number, number>;
57
57
  isOptional: false;
58
58
  };
59
- }>, _lssm_lib_schema814.SchemaModel<{
59
+ }>, _lssm_lib_schema1367.SchemaModel<{
60
60
  success: {
61
- type: _lssm_lib_schema814.FieldType<boolean, boolean>;
61
+ type: _lssm_lib_schema1367.FieldType<boolean, boolean>;
62
62
  isOptional: false;
63
63
  };
64
64
  xpEarned: {
65
- type: _lssm_lib_schema814.FieldType<number, number>;
65
+ type: _lssm_lib_schema1367.FieldType<number, number>;
66
66
  isOptional: true;
67
67
  };
68
68
  }>, undefined>;
69
69
  /**
70
70
  * Submit a card review.
71
71
  */
72
- declare const SubmitCardReviewContract: _lssm_lib_contracts2.ContractSpec<_lssm_lib_schema814.SchemaModel<{
72
+ declare const SubmitCardReviewContract: _lssm_lib_contracts34.ContractSpec<_lssm_lib_schema1367.SchemaModel<{
73
73
  cardId: {
74
- type: _lssm_lib_schema814.FieldType<string, string>;
74
+ type: _lssm_lib_schema1367.FieldType<string, string>;
75
75
  isOptional: false;
76
76
  };
77
77
  rating: {
78
- type: _lssm_lib_schema814.FieldType<string, string>;
78
+ type: _lssm_lib_schema1367.FieldType<string, string>;
79
79
  isOptional: false;
80
80
  };
81
81
  responseTimeMs: {
82
- type: _lssm_lib_schema814.FieldType<number, number>;
82
+ type: _lssm_lib_schema1367.FieldType<number, number>;
83
83
  isOptional: true;
84
84
  };
85
- }>, _lssm_lib_schema814.SchemaModel<{
85
+ }>, _lssm_lib_schema1367.SchemaModel<{
86
86
  success: {
87
- type: _lssm_lib_schema814.FieldType<boolean, boolean>;
87
+ type: _lssm_lib_schema1367.FieldType<boolean, boolean>;
88
88
  isOptional: false;
89
89
  };
90
90
  xpEarned: {
91
- type: _lssm_lib_schema814.FieldType<number, number>;
91
+ type: _lssm_lib_schema1367.FieldType<number, number>;
92
92
  isOptional: true;
93
93
  };
94
94
  }>, undefined>;
95
95
  /**
96
96
  * Get cards due for review.
97
97
  */
98
- declare const GetDueCardsContract: _lssm_lib_contracts2.ContractSpec<_lssm_lib_schema814.SchemaModel<{
98
+ declare const GetDueCardsContract: _lssm_lib_contracts34.ContractSpec<_lssm_lib_schema1367.SchemaModel<{
99
99
  deckId: {
100
- type: _lssm_lib_schema814.FieldType<string, string>;
100
+ type: _lssm_lib_schema1367.FieldType<string, string>;
101
101
  isOptional: true;
102
102
  };
103
103
  limit: {
104
- type: _lssm_lib_schema814.FieldType<number, number>;
104
+ type: _lssm_lib_schema1367.FieldType<number, number>;
105
105
  isOptional: true;
106
106
  };
107
- }>, _lssm_lib_schema814.SchemaModel<{
107
+ }>, _lssm_lib_schema1367.SchemaModel<{
108
108
  cards: {
109
- type: _lssm_lib_schema814.SchemaModel<{
109
+ type: _lssm_lib_schema1367.SchemaModel<{
110
110
  id: {
111
- type: _lssm_lib_schema814.FieldType<string, string>;
111
+ type: _lssm_lib_schema1367.FieldType<string, string>;
112
112
  isOptional: false;
113
113
  };
114
114
  deckId: {
115
- type: _lssm_lib_schema814.FieldType<string, string>;
115
+ type: _lssm_lib_schema1367.FieldType<string, string>;
116
116
  isOptional: false;
117
117
  };
118
118
  front: {
119
- type: _lssm_lib_schema814.FieldType<string, string>;
119
+ type: _lssm_lib_schema1367.FieldType<string, string>;
120
120
  isOptional: false;
121
121
  };
122
122
  back: {
123
- type: _lssm_lib_schema814.FieldType<string, string>;
123
+ type: _lssm_lib_schema1367.FieldType<string, string>;
124
124
  isOptional: false;
125
125
  };
126
126
  hints: {
127
- type: _lssm_lib_schema814.FieldType<unknown, unknown>;
127
+ type: _lssm_lib_schema1367.FieldType<unknown, unknown>;
128
128
  isOptional: true;
129
129
  };
130
130
  isDue: {
131
- type: _lssm_lib_schema814.FieldType<boolean, boolean>;
131
+ type: _lssm_lib_schema1367.FieldType<boolean, boolean>;
132
132
  isOptional: false;
133
133
  };
134
134
  nextReviewAt: {
135
- type: _lssm_lib_schema814.FieldType<Date, string>;
135
+ type: _lssm_lib_schema1367.FieldType<Date, string>;
136
136
  isOptional: true;
137
137
  };
138
138
  }>;
@@ -140,96 +140,96 @@ declare const GetDueCardsContract: _lssm_lib_contracts2.ContractSpec<_lssm_lib_s
140
140
  isOptional: false;
141
141
  };
142
142
  total: {
143
- type: _lssm_lib_schema814.FieldType<number, number>;
143
+ type: _lssm_lib_schema1367.FieldType<number, number>;
144
144
  isOptional: false;
145
145
  };
146
146
  }>, undefined>;
147
147
  /**
148
148
  * Get learner dashboard.
149
149
  */
150
- declare const GetLearnerDashboardContract: _lssm_lib_contracts2.ContractSpec<_lssm_lib_schema814.SchemaModel<{
150
+ declare const GetLearnerDashboardContract: _lssm_lib_contracts34.ContractSpec<_lssm_lib_schema1367.SchemaModel<{
151
151
  learnerId: {
152
- type: _lssm_lib_schema814.FieldType<string, string>;
152
+ type: _lssm_lib_schema1367.FieldType<string, string>;
153
153
  isOptional: true;
154
154
  };
155
- }>, _lssm_lib_schema814.SchemaModel<{
155
+ }>, _lssm_lib_schema1367.SchemaModel<{
156
156
  learner: {
157
- type: _lssm_lib_schema814.SchemaModel<{
157
+ type: _lssm_lib_schema1367.SchemaModel<{
158
158
  id: {
159
- type: _lssm_lib_schema814.FieldType<string, string>;
159
+ type: _lssm_lib_schema1367.FieldType<string, string>;
160
160
  isOptional: false;
161
161
  };
162
162
  userId: {
163
- type: _lssm_lib_schema814.FieldType<string, string>;
163
+ type: _lssm_lib_schema1367.FieldType<string, string>;
164
164
  isOptional: false;
165
165
  };
166
166
  displayName: {
167
- type: _lssm_lib_schema814.FieldType<string, string>;
167
+ type: _lssm_lib_schema1367.FieldType<string, string>;
168
168
  isOptional: true;
169
169
  };
170
170
  level: {
171
- type: _lssm_lib_schema814.FieldType<number, number>;
171
+ type: _lssm_lib_schema1367.FieldType<number, number>;
172
172
  isOptional: false;
173
173
  };
174
174
  totalXp: {
175
- type: _lssm_lib_schema814.FieldType<number, number>;
175
+ type: _lssm_lib_schema1367.FieldType<number, number>;
176
176
  isOptional: false;
177
177
  };
178
178
  currentStreak: {
179
- type: _lssm_lib_schema814.FieldType<number, number>;
179
+ type: _lssm_lib_schema1367.FieldType<number, number>;
180
180
  isOptional: false;
181
181
  };
182
182
  longestStreak: {
183
- type: _lssm_lib_schema814.FieldType<number, number>;
183
+ type: _lssm_lib_schema1367.FieldType<number, number>;
184
184
  isOptional: false;
185
185
  };
186
186
  createdAt: {
187
- type: _lssm_lib_schema814.FieldType<Date, string>;
187
+ type: _lssm_lib_schema1367.FieldType<Date, string>;
188
188
  isOptional: false;
189
189
  };
190
190
  }>;
191
191
  isOptional: false;
192
192
  };
193
193
  currentStreak: {
194
- type: _lssm_lib_schema814.FieldType<number, number>;
194
+ type: _lssm_lib_schema1367.FieldType<number, number>;
195
195
  isOptional: false;
196
196
  };
197
197
  dailyXpGoal: {
198
- type: _lssm_lib_schema814.FieldType<number, number>;
198
+ type: _lssm_lib_schema1367.FieldType<number, number>;
199
199
  isOptional: false;
200
200
  };
201
201
  dailyXpProgress: {
202
- type: _lssm_lib_schema814.FieldType<number, number>;
202
+ type: _lssm_lib_schema1367.FieldType<number, number>;
203
203
  isOptional: false;
204
204
  };
205
205
  activeEnrollments: {
206
- type: _lssm_lib_schema814.SchemaModel<{
206
+ type: _lssm_lib_schema1367.SchemaModel<{
207
207
  id: {
208
- type: _lssm_lib_schema814.FieldType<string, string>;
208
+ type: _lssm_lib_schema1367.FieldType<string, string>;
209
209
  isOptional: false;
210
210
  };
211
211
  learnerId: {
212
- type: _lssm_lib_schema814.FieldType<string, string>;
212
+ type: _lssm_lib_schema1367.FieldType<string, string>;
213
213
  isOptional: false;
214
214
  };
215
215
  courseId: {
216
- type: _lssm_lib_schema814.FieldType<string, string>;
216
+ type: _lssm_lib_schema1367.FieldType<string, string>;
217
217
  isOptional: false;
218
218
  };
219
219
  status: {
220
- type: _lssm_lib_schema814.FieldType<string, string>;
220
+ type: _lssm_lib_schema1367.FieldType<string, string>;
221
221
  isOptional: false;
222
222
  };
223
223
  progress: {
224
- type: _lssm_lib_schema814.FieldType<number, number>;
224
+ type: _lssm_lib_schema1367.FieldType<number, number>;
225
225
  isOptional: false;
226
226
  };
227
227
  startedAt: {
228
- type: _lssm_lib_schema814.FieldType<Date, string>;
228
+ type: _lssm_lib_schema1367.FieldType<Date, string>;
229
229
  isOptional: true;
230
230
  };
231
231
  completedAt: {
232
- type: _lssm_lib_schema814.FieldType<Date, string>;
232
+ type: _lssm_lib_schema1367.FieldType<Date, string>;
233
233
  isOptional: true;
234
234
  };
235
235
  }>;
@@ -237,33 +237,33 @@ declare const GetLearnerDashboardContract: _lssm_lib_contracts2.ContractSpec<_ls
237
237
  isOptional: false;
238
238
  };
239
239
  recentAchievements: {
240
- type: _lssm_lib_schema814.SchemaModel<{
240
+ type: _lssm_lib_schema1367.SchemaModel<{
241
241
  id: {
242
- type: _lssm_lib_schema814.FieldType<string, string>;
242
+ type: _lssm_lib_schema1367.FieldType<string, string>;
243
243
  isOptional: false;
244
244
  };
245
245
  key: {
246
- type: _lssm_lib_schema814.FieldType<string, string>;
246
+ type: _lssm_lib_schema1367.FieldType<string, string>;
247
247
  isOptional: false;
248
248
  };
249
249
  name: {
250
- type: _lssm_lib_schema814.FieldType<string, string>;
250
+ type: _lssm_lib_schema1367.FieldType<string, string>;
251
251
  isOptional: false;
252
252
  };
253
253
  description: {
254
- type: _lssm_lib_schema814.FieldType<string, string>;
254
+ type: _lssm_lib_schema1367.FieldType<string, string>;
255
255
  isOptional: false;
256
256
  };
257
257
  icon: {
258
- type: _lssm_lib_schema814.FieldType<string, string>;
258
+ type: _lssm_lib_schema1367.FieldType<string, string>;
259
259
  isOptional: true;
260
260
  };
261
261
  xpReward: {
262
- type: _lssm_lib_schema814.FieldType<number, number>;
262
+ type: _lssm_lib_schema1367.FieldType<number, number>;
263
263
  isOptional: false;
264
264
  };
265
265
  unlockedAt: {
266
- type: _lssm_lib_schema814.FieldType<Date, string>;
266
+ type: _lssm_lib_schema1367.FieldType<Date, string>;
267
267
  isOptional: true;
268
268
  };
269
269
  }>;
@@ -271,7 +271,7 @@ declare const GetLearnerDashboardContract: _lssm_lib_contracts2.ContractSpec<_ls
271
271
  isOptional: false;
272
272
  };
273
273
  dueCardCount: {
274
- type: _lssm_lib_schema814.FieldType<number, number>;
274
+ type: _lssm_lib_schema1367.FieldType<number, number>;
275
275
  isOptional: false;
276
276
  };
277
277
  }>, undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"operations.d.ts","names":[],"sources":["../../src/contracts/operations.ts"],"sourcesContent":[],"mappings":";;;;;;;cAkBa,6CAAsB,iCAAA;EAAtB,QAAA,EAAA;IAgCX,IAAA,EAAA,mBAAA,CAAA,SAAA,CAAA,MAAA,EAAA,MAAA,CAAA;qBAhCiC;EAAA,CAAA;;;UAAA,mBAAA,CAAA;;;;;;;;IAAA,IAAA,+BAAA,CAAA,MAAA,EAAA,MAAA,CAAA;IAqCtB,UAAA,EAAA,KAAA;EAgCX,CAAA;;;qBAhCiC;EAAA,CAAA;;;qBAAA;EAAA,CAAA;EAqCtB,SAAA,EAAA;IAgCX,IAAA,+BAAA,KAAA,EAAA,MAAA,CAAA;;;;IAhCmC,IAAA,+BAAA,KAAA,EAAA,MAAA,CAAA;;;;;AAqCrC;;cA1Ea,6CAAsB,iCAAA;;IA0EH,IAAA,EA1C9B,mBAAA,CAAA,SA0C8B,CAAA,MAAA,EAAA,MAAA,CAAA;;;;;;;;;;;mCAAA,CAAA;EAAA,OAAA,EAAA;IAuBnB,IAAA,EAjGsB,mBAAA,CAAA,SAmHjC,CAAA,OAAA,EAAA,OAAA,CAAA;IAAA,UAAA,EAAA,KAAA;;EAlBsC,QAAA,EAAA;;;;;;;;cA5D3B,+CAAwB,iCAAA;;UAgCnC,mBAAA,CAAA;;;;;;;;;;;;;UAhCmC,mBAAA,CAAA;;;;;;;;;;;cAqCxB,mBAuB2B,uBAvBR,YAuBQ,qBAvBR,WAuBQ,CAAA;EAAA,MAAA,EAAA;UALtC,mBAAA,CAAA;;;;;;;;;;;cAlB8B,mBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAuBnB,kDAA2B,iCAAA;;UAkBtC,mBAAA,CAAA;;;;;;;cAlBsC,mBAAA,CAAA"}
1
+ {"version":3,"file":"operations.d.ts","names":[],"sources":["../../src/contracts/operations.ts"],"sourcesContent":[],"mappings":";;;;;;;cAkBa,8CAAsB,kCAAA;EAAtB,QAAA,EAAA;IAgCX,IAAA,EAAA,oBAAA,CAAA,SAAA,CAAA,MAAA,EAAA,MAAA,CAAA;qBAhCiC;EAAA,CAAA;;;UAAA,oBAAA,CAAA;;;;;;;;IAAA,IAAA,gCAAA,CAAA,MAAA,EAAA,MAAA,CAAA;IAqCtB,UAAA,EAAA,KAAA;EAgCX,CAAA;;;qBAhCiC;EAAA,CAAA;;;qBAAA;EAAA,CAAA;EAqCtB,SAAA,EAAA;IAgCX,IAAA,gCAAA,KAAA,EAAA,MAAA,CAAA;;;;IAhCmC,IAAA,gCAAA,KAAA,EAAA,MAAA,CAAA;;;;;AAqCrC;;cA1Ea,8CAAsB,kCAAA;;IA0EH,IAAA,EA1C9B,oBAAA,CAAA,SA0C8B,CAAA,MAAA,EAAA,MAAA,CAAA;;;;;;;;;;;oCAAA,CAAA;EAAA,OAAA,EAAA;IAuBnB,IAAA,EAjGsB,oBAAA,CAAA,SAmHjC,CAAA,OAAA,EAAA,OAAA,CAAA;IAAA,UAAA,EAAA,KAAA;;EAlBsC,QAAA,EAAA;;;;;;;;cA5D3B,gDAAwB,kCAAA;;UAgCnC,oBAAA,CAAA;;;;;;;;;;;;;UAhCmC,oBAAA,CAAA;;;;;;;;;;;cAqCxB,mBAuB2B,wBAvBR,YAuBQ,sBAvBR,WAuBQ,CAAA;EAAA,MAAA,EAAA;UALtC,oBAAA,CAAA;;;;;;;;;;;cAlB8B,oBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAuBnB,mDAA2B,kCAAA;;UAkBtC,oBAAA,CAAA;;;;;;;cAlBsC,oBAAA,CAAA"}
@@ -75,18 +75,6 @@ declare class SRSEngine {
75
75
  * Calculate the next review state based on rating.
76
76
  */
77
77
  calculateNextReview(state: SRSState, rating: CardRating, now?: Date): ReviewResult;
78
- /**
79
- * Handle learning phase (new cards).
80
- */
81
- private handleLearningCard;
82
- /**
83
- * Handle relearning phase (lapsed cards).
84
- */
85
- private handleRelearningCard;
86
- /**
87
- * Handle review phase (graduated cards).
88
- */
89
- private handleReviewCard;
90
78
  /**
91
79
  * Get initial SRS state for a new card.
92
80
  */
@@ -99,6 +87,18 @@ declare class SRSEngine {
99
87
  * Calculate overdue days (negative if not yet due).
100
88
  */
101
89
  getOverdueDays(nextReviewAt: Date, now?: Date): number;
90
+ /**
91
+ * Handle learning phase (new cards).
92
+ */
93
+ private handleLearningCard;
94
+ /**
95
+ * Handle relearning phase (lapsed cards).
96
+ */
97
+ private handleRelearningCard;
98
+ /**
99
+ * Handle review phase (graduated cards).
100
+ */
101
+ private handleReviewCard;
102
102
  private addMinutes;
103
103
  private addDays;
104
104
  }
@@ -1 +1 @@
1
- {"version":3,"file":"srs.d.ts","names":[],"sources":["../../src/engines/srs.ts"],"sourcesContent":[],"mappings":";;AAcA;AAEA;AAiBA;AAmBA;AAyBA;AAeA;;;;;AAaS,KA3FG,UAAA,GA2FH,OAAA,GAAA,MAAA,GAAA,MAAA,GAAA,MAAA;AACJ,UA1FY,QAAA,CA0FZ;EAyOgB;EAeC,QAAA,EAAA,MAAA;EAAW;EAOF,UAAA,EAAA,MAAA;EAAW;EAAiB,WAAA,EAAA,MAAA;EAmB9C;;;;;;;;;UA3VI,YAAA;;;;;;;;gBAQD;;;;;;;;;;UAWC,SAAA;;;;;;;;;;;;;;;;;;;;;;cAyBJ,oBAAoB;cAepB,SAAA;;uBAGS,QAAQ;;;;6BAQnB,kBACC,kBACH,OACJ;;;;;;;;;;;;;;;;qBAyOgB;;;;sBAeC,YAAW;;;;+BAOF,YAAW;;;;;;;cAmB7B,WAAS"}
1
+ {"version":3,"file":"srs.d.ts","names":[],"sources":["../../src/engines/srs.ts"],"sourcesContent":[],"mappings":";;AAcA;AAEA;AAiBA;AAmBA;AAyBA;AAeA;;;;;AAaS,KA3FG,UAAA,GA2FH,OAAA,GAAA,MAAA,GAAA,MAAA,GAAA,MAAA;AACJ,UA1FY,QAAA,CA0FZ;EAkBgB;EAeC,QAAA,EAAA,MAAA;EAAW;EAOF,UAAA,EAAA,MAAA;EAAW;EAAiB,WAAA,EAAA,MAAA;EA4O9C;;;;;;;;;UA7VI,YAAA;;;;;;;;gBAQD;;;;;;;;;;UAWC,SAAA;;;;;;;;;;;;;;;;;;;;;;cAyBJ,oBAAoB;cAepB,SAAA;;uBAGS,QAAQ;;;;6BAQnB,kBACC,kBACH,OACJ;;;;qBAkBgB;;;;sBAeC,YAAW;;;;+BAOF,YAAW;;;;;;;;;;;;;;;;;;;cA4O7B,WAAS"}
@@ -28,6 +28,33 @@ var SRSEngine = class {
28
28
  return this.handleReviewCard(state, rating, now);
29
29
  }
30
30
  /**
31
+ * Get initial SRS state for a new card.
32
+ */
33
+ getInitialState() {
34
+ return {
35
+ interval: 0,
36
+ easeFactor: 2.5,
37
+ repetitions: 0,
38
+ learningStep: 0,
39
+ isGraduated: false,
40
+ isRelearning: false,
41
+ lapses: 0
42
+ };
43
+ }
44
+ /**
45
+ * Check if a card is due for review.
46
+ */
47
+ isDue(nextReviewAt, now = /* @__PURE__ */ new Date()) {
48
+ return nextReviewAt <= now;
49
+ }
50
+ /**
51
+ * Calculate overdue days (negative if not yet due).
52
+ */
53
+ getOverdueDays(nextReviewAt, now = /* @__PURE__ */ new Date()) {
54
+ const diff = now.getTime() - nextReviewAt.getTime();
55
+ return Math.floor(diff / (1e3 * 60 * 60 * 24));
56
+ }
57
+ /**
31
58
  * Handle learning phase (new cards).
32
59
  */
33
60
  handleLearningCard(state, rating, now) {
@@ -138,12 +165,11 @@ var SRSEngine = class {
138
165
  learningStep = 0;
139
166
  newEaseFactor = Math.max(this.config.minEaseFactor, newEaseFactor - .2);
140
167
  newInterval = state.interval;
141
- const relearnStep = this.config.relearningSteps[0] ?? 10;
142
168
  return {
143
169
  interval: newInterval,
144
170
  easeFactor: newEaseFactor,
145
171
  repetitions,
146
- nextReviewAt: this.addMinutes(now, relearnStep),
172
+ nextReviewAt: this.addMinutes(now, this.config.relearningSteps[0] ?? 10),
147
173
  learningStep,
148
174
  isGraduated: true,
149
175
  isRelearning: true,
@@ -176,33 +202,6 @@ var SRSEngine = class {
176
202
  lapses
177
203
  };
178
204
  }
179
- /**
180
- * Get initial SRS state for a new card.
181
- */
182
- getInitialState() {
183
- return {
184
- interval: 0,
185
- easeFactor: 2.5,
186
- repetitions: 0,
187
- learningStep: 0,
188
- isGraduated: false,
189
- isRelearning: false,
190
- lapses: 0
191
- };
192
- }
193
- /**
194
- * Check if a card is due for review.
195
- */
196
- isDue(nextReviewAt, now = /* @__PURE__ */ new Date()) {
197
- return nextReviewAt <= now;
198
- }
199
- /**
200
- * Calculate overdue days (negative if not yet due).
201
- */
202
- getOverdueDays(nextReviewAt, now = /* @__PURE__ */ new Date()) {
203
- const diff = now.getTime() - nextReviewAt.getTime();
204
- return Math.floor(diff / (1e3 * 60 * 60 * 24));
205
- }
206
205
  addMinutes(date, minutes) {
207
206
  return new Date(date.getTime() + minutes * 60 * 1e3);
208
207
  }
@@ -1 +1 @@
1
- {"version":3,"file":"srs.js","names":["DEFAULT_SRS_CONFIG: SRSConfig","nextReviewAt: Date","newInterval: number"],"sources":["../../src/engines/srs.ts"],"sourcesContent":["/**\n * Spaced Repetition System (SRS) Engine\n *\n * Implements the SM-2 algorithm variant for optimal flashcard scheduling.\n *\n * The algorithm calculates the optimal time to review a card based on:\n * - User's rating of recall difficulty (again, hard, good, easy)\n * - Current interval between reviews\n * - Ease factor (how easy the card is for this user)\n * - Number of successful repetitions\n */\n\n// ============ Types ============\n\nexport type CardRating = 'AGAIN' | 'HARD' | 'GOOD' | 'EASY';\n\nexport interface SRSState {\n /** Current interval in days */\n interval: number;\n /** Ease factor (typically 1.3 to 2.5+) */\n easeFactor: number;\n /** Number of successful repetitions */\n repetitions: number;\n /** Current learning step (for new cards) */\n learningStep: number;\n /** Whether card has graduated to review phase */\n isGraduated: boolean;\n /** Whether card is being relearned after a lapse */\n isRelearning: boolean;\n /** Number of times card was forgotten */\n lapses: number;\n}\n\nexport interface ReviewResult {\n /** New interval in days */\n interval: number;\n /** New ease factor */\n easeFactor: number;\n /** New repetition count */\n repetitions: number;\n /** Next review date */\n nextReviewAt: Date;\n /** New learning step */\n learningStep: number;\n /** Whether card has graduated */\n isGraduated: boolean;\n /** Whether card is being relearned */\n isRelearning: boolean;\n /** Updated lapse count */\n lapses: number;\n}\n\nexport interface SRSConfig {\n /** Learning steps in minutes [1, 10] = 1 min, 10 min */\n learningSteps: number[];\n /** Graduating interval in days */\n graduatingInterval: number;\n /** Easy interval (for easy button on new cards) */\n easyInterval: number;\n /** Relearning steps in minutes */\n relearningSteps: number[];\n /** Minimum ease factor */\n minEaseFactor: number;\n /** Maximum interval in days */\n maxInterval: number;\n /** Interval modifier (1.0 = 100%) */\n intervalModifier: number;\n /** New cards interval modifier */\n newIntervalModifier: number;\n /** Hard interval modifier */\n hardIntervalModifier: number;\n /** Easy bonus modifier */\n easyBonus: number;\n}\n\n// ============ Default Configuration ============\n\nexport const DEFAULT_SRS_CONFIG: SRSConfig = {\n learningSteps: [1, 10], // 1 minute, 10 minutes\n graduatingInterval: 1, // 1 day\n easyInterval: 4, // 4 days\n relearningSteps: [10], // 10 minutes\n minEaseFactor: 1.3,\n maxInterval: 365, // 1 year\n intervalModifier: 1.0,\n newIntervalModifier: 0.5,\n hardIntervalModifier: 1.2,\n easyBonus: 1.3,\n};\n\n// ============ SRS Engine ============\n\nexport class SRSEngine {\n private config: SRSConfig;\n\n constructor(config: Partial<SRSConfig> = {}) {\n this.config = { ...DEFAULT_SRS_CONFIG, ...config };\n }\n\n /**\n * Calculate the next review state based on rating.\n */\n calculateNextReview(\n state: SRSState,\n rating: CardRating,\n now: Date = new Date()\n ): ReviewResult {\n // Handle new/learning cards\n if (!state.isGraduated && !state.isRelearning) {\n return this.handleLearningCard(state, rating, now);\n }\n\n // Handle relearning cards\n if (state.isRelearning) {\n return this.handleRelearningCard(state, rating, now);\n }\n\n // Handle graduated cards in review\n return this.handleReviewCard(state, rating, now);\n }\n\n /**\n * Handle learning phase (new cards).\n */\n private handleLearningCard(\n state: SRSState,\n rating: CardRating,\n now: Date\n ): ReviewResult {\n const steps = this.config.learningSteps;\n let newStep = state.learningStep;\n let isGraduated = false;\n let interval = 0;\n let nextReviewAt: Date;\n\n switch (rating) {\n case 'AGAIN':\n // Reset to first step\n newStep = 0;\n interval = steps[0] ?? 1;\n nextReviewAt = this.addMinutes(now, interval);\n break;\n\n case 'HARD':\n // Stay at current step (or repeat first step)\n interval = steps[newStep] ?? steps[0] ?? 1;\n nextReviewAt = this.addMinutes(now, interval);\n break;\n\n case 'GOOD':\n // Move to next step\n newStep++;\n if (newStep >= steps.length) {\n // Graduate the card\n isGraduated = true;\n interval = this.config.graduatingInterval;\n nextReviewAt = this.addDays(now, interval);\n } else {\n interval = steps[newStep] ?? 10;\n nextReviewAt = this.addMinutes(now, interval);\n }\n break;\n\n case 'EASY':\n // Graduate immediately with easy interval\n isGraduated = true;\n interval = this.config.easyInterval;\n nextReviewAt = this.addDays(now, interval);\n break;\n }\n\n return {\n interval: isGraduated ? interval : 0,\n easeFactor: state.easeFactor,\n repetitions: isGraduated ? 1 : 0,\n nextReviewAt,\n learningStep: newStep,\n isGraduated,\n isRelearning: false,\n lapses: state.lapses,\n };\n }\n\n /**\n * Handle relearning phase (lapsed cards).\n */\n private handleRelearningCard(\n state: SRSState,\n rating: CardRating,\n now: Date\n ): ReviewResult {\n const steps = this.config.relearningSteps;\n let newStep = state.learningStep;\n let isRelearning = true;\n let interval = 0;\n let nextReviewAt: Date;\n\n switch (rating) {\n case 'AGAIN':\n // Reset to first relearning step\n newStep = 0;\n interval = steps[0] ?? 10;\n nextReviewAt = this.addMinutes(now, interval);\n break;\n\n case 'HARD':\n // Stay at current step\n interval = steps[newStep] ?? steps[0] ?? 10;\n nextReviewAt = this.addMinutes(now, interval);\n break;\n\n case 'GOOD':\n // Move to next step or graduate back to review\n newStep++;\n if (newStep >= steps.length) {\n isRelearning = false;\n // Use reduced interval after lapse\n interval = Math.max(\n 1,\n Math.floor(state.interval * this.config.newIntervalModifier)\n );\n nextReviewAt = this.addDays(now, interval);\n } else {\n interval = steps[newStep] ?? 10;\n nextReviewAt = this.addMinutes(now, interval);\n }\n break;\n\n case 'EASY':\n // Graduate immediately with slightly longer interval\n isRelearning = false;\n interval = Math.max(\n 1,\n Math.floor(state.interval * this.config.newIntervalModifier * 1.5)\n );\n nextReviewAt = this.addDays(now, interval);\n break;\n }\n\n return {\n interval: isRelearning ? state.interval : interval,\n easeFactor: state.easeFactor,\n repetitions: isRelearning ? state.repetitions : state.repetitions + 1,\n nextReviewAt,\n learningStep: newStep,\n isGraduated: true,\n isRelearning,\n lapses: state.lapses,\n };\n }\n\n /**\n * Handle review phase (graduated cards).\n */\n private handleReviewCard(\n state: SRSState,\n rating: CardRating,\n now: Date\n ): ReviewResult {\n let newInterval: number;\n let newEaseFactor = state.easeFactor;\n let repetitions = state.repetitions;\n let isRelearning = false;\n let learningStep = 0;\n let lapses = state.lapses;\n\n switch (rating) {\n case 'AGAIN':\n // Card lapsed - move to relearning\n lapses++;\n isRelearning = true;\n learningStep = 0;\n newEaseFactor = Math.max(\n this.config.minEaseFactor,\n newEaseFactor - 0.2\n );\n newInterval = state.interval; // Keep old interval for reference\n const relearnStep = this.config.relearningSteps[0] ?? 10;\n return {\n interval: newInterval,\n easeFactor: newEaseFactor,\n repetitions,\n nextReviewAt: this.addMinutes(now, relearnStep),\n learningStep,\n isGraduated: true,\n isRelearning: true,\n lapses,\n };\n\n case 'HARD':\n // Reduce interval slightly, reduce ease\n newEaseFactor = Math.max(\n this.config.minEaseFactor,\n newEaseFactor - 0.15\n );\n newInterval = Math.max(\n state.interval + 1,\n state.interval * this.config.hardIntervalModifier\n );\n break;\n\n case 'GOOD':\n // Standard interval increase\n newInterval =\n state.interval * newEaseFactor * this.config.intervalModifier;\n repetitions++;\n break;\n\n case 'EASY':\n // Larger interval increase, increase ease\n newEaseFactor = newEaseFactor + 0.15;\n newInterval =\n state.interval *\n newEaseFactor *\n this.config.easyBonus *\n this.config.intervalModifier;\n repetitions++;\n break;\n }\n\n // Apply bounds\n newInterval = Math.min(Math.round(newInterval), this.config.maxInterval);\n newInterval = Math.max(1, newInterval);\n\n return {\n interval: newInterval,\n easeFactor: newEaseFactor,\n repetitions,\n nextReviewAt: this.addDays(now, newInterval),\n learningStep,\n isGraduated: true,\n isRelearning,\n lapses,\n };\n }\n\n /**\n * Get initial SRS state for a new card.\n */\n getInitialState(): SRSState {\n return {\n interval: 0,\n easeFactor: 2.5,\n repetitions: 0,\n learningStep: 0,\n isGraduated: false,\n isRelearning: false,\n lapses: 0,\n };\n }\n\n /**\n * Check if a card is due for review.\n */\n isDue(nextReviewAt: Date, now: Date = new Date()): boolean {\n return nextReviewAt <= now;\n }\n\n /**\n * Calculate overdue days (negative if not yet due).\n */\n getOverdueDays(nextReviewAt: Date, now: Date = new Date()): number {\n const diff = now.getTime() - nextReviewAt.getTime();\n return Math.floor(diff / (1000 * 60 * 60 * 24));\n }\n\n // ============ Helpers ============\n\n private addMinutes(date: Date, minutes: number): Date {\n return new Date(date.getTime() + minutes * 60 * 1000);\n }\n\n private addDays(date: Date, days: number): Date {\n return new Date(date.getTime() + days * 24 * 60 * 60 * 1000);\n }\n}\n\n/**\n * Default SRS engine instance.\n */\nexport const srsEngine = new SRSEngine();\n"],"mappings":"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"}
1
+ {"version":3,"file":"srs.js","names":["DEFAULT_SRS_CONFIG: SRSConfig","nextReviewAt: Date","newInterval: number"],"sources":["../../src/engines/srs.ts"],"sourcesContent":["/**\n * Spaced Repetition System (SRS) Engine\n *\n * Implements the SM-2 algorithm variant for optimal flashcard scheduling.\n *\n * The algorithm calculates the optimal time to review a card based on:\n * - User's rating of recall difficulty (again, hard, good, easy)\n * - Current interval between reviews\n * - Ease factor (how easy the card is for this user)\n * - Number of successful repetitions\n */\n\n// ============ Types ============\n\nexport type CardRating = 'AGAIN' | 'HARD' | 'GOOD' | 'EASY';\n\nexport interface SRSState {\n /** Current interval in days */\n interval: number;\n /** Ease factor (typically 1.3 to 2.5+) */\n easeFactor: number;\n /** Number of successful repetitions */\n repetitions: number;\n /** Current learning step (for new cards) */\n learningStep: number;\n /** Whether card has graduated to review phase */\n isGraduated: boolean;\n /** Whether card is being relearned after a lapse */\n isRelearning: boolean;\n /** Number of times card was forgotten */\n lapses: number;\n}\n\nexport interface ReviewResult {\n /** New interval in days */\n interval: number;\n /** New ease factor */\n easeFactor: number;\n /** New repetition count */\n repetitions: number;\n /** Next review date */\n nextReviewAt: Date;\n /** New learning step */\n learningStep: number;\n /** Whether card has graduated */\n isGraduated: boolean;\n /** Whether card is being relearned */\n isRelearning: boolean;\n /** Updated lapse count */\n lapses: number;\n}\n\nexport interface SRSConfig {\n /** Learning steps in minutes [1, 10] = 1 min, 10 min */\n learningSteps: number[];\n /** Graduating interval in days */\n graduatingInterval: number;\n /** Easy interval (for easy button on new cards) */\n easyInterval: number;\n /** Relearning steps in minutes */\n relearningSteps: number[];\n /** Minimum ease factor */\n minEaseFactor: number;\n /** Maximum interval in days */\n maxInterval: number;\n /** Interval modifier (1.0 = 100%) */\n intervalModifier: number;\n /** New cards interval modifier */\n newIntervalModifier: number;\n /** Hard interval modifier */\n hardIntervalModifier: number;\n /** Easy bonus modifier */\n easyBonus: number;\n}\n\n// ============ Default Configuration ============\n\nexport const DEFAULT_SRS_CONFIG: SRSConfig = {\n learningSteps: [1, 10], // 1 minute, 10 minutes\n graduatingInterval: 1, // 1 day\n easyInterval: 4, // 4 days\n relearningSteps: [10], // 10 minutes\n minEaseFactor: 1.3,\n maxInterval: 365, // 1 year\n intervalModifier: 1.0,\n newIntervalModifier: 0.5,\n hardIntervalModifier: 1.2,\n easyBonus: 1.3,\n};\n\n// ============ SRS Engine ============\n\nexport class SRSEngine {\n private config: SRSConfig;\n\n constructor(config: Partial<SRSConfig> = {}) {\n this.config = { ...DEFAULT_SRS_CONFIG, ...config };\n }\n\n /**\n * Calculate the next review state based on rating.\n */\n calculateNextReview(\n state: SRSState,\n rating: CardRating,\n now: Date = new Date()\n ): ReviewResult {\n // Handle new/learning cards\n if (!state.isGraduated && !state.isRelearning) {\n return this.handleLearningCard(state, rating, now);\n }\n\n // Handle relearning cards\n if (state.isRelearning) {\n return this.handleRelearningCard(state, rating, now);\n }\n\n // Handle graduated cards in review\n return this.handleReviewCard(state, rating, now);\n }\n\n /**\n * Get initial SRS state for a new card.\n */\n getInitialState(): SRSState {\n return {\n interval: 0,\n easeFactor: 2.5,\n repetitions: 0,\n learningStep: 0,\n isGraduated: false,\n isRelearning: false,\n lapses: 0,\n };\n }\n\n /**\n * Check if a card is due for review.\n */\n isDue(nextReviewAt: Date, now: Date = new Date()): boolean {\n return nextReviewAt <= now;\n }\n\n /**\n * Calculate overdue days (negative if not yet due).\n */\n getOverdueDays(nextReviewAt: Date, now: Date = new Date()): number {\n const diff = now.getTime() - nextReviewAt.getTime();\n return Math.floor(diff / (1000 * 60 * 60 * 24));\n }\n\n /**\n * Handle learning phase (new cards).\n */\n private handleLearningCard(\n state: SRSState,\n rating: CardRating,\n now: Date\n ): ReviewResult {\n const steps = this.config.learningSteps;\n let newStep = state.learningStep;\n let isGraduated = false;\n let interval = 0;\n let nextReviewAt: Date;\n\n switch (rating) {\n case 'AGAIN':\n // Reset to first step\n newStep = 0;\n interval = steps[0] ?? 1;\n nextReviewAt = this.addMinutes(now, interval);\n break;\n\n case 'HARD':\n // Stay at current step (or repeat first step)\n interval = steps[newStep] ?? steps[0] ?? 1;\n nextReviewAt = this.addMinutes(now, interval);\n break;\n\n case 'GOOD':\n // Move to next step\n newStep++;\n if (newStep >= steps.length) {\n // Graduate the card\n isGraduated = true;\n interval = this.config.graduatingInterval;\n nextReviewAt = this.addDays(now, interval);\n } else {\n interval = steps[newStep] ?? 10;\n nextReviewAt = this.addMinutes(now, interval);\n }\n break;\n\n case 'EASY':\n // Graduate immediately with easy interval\n isGraduated = true;\n interval = this.config.easyInterval;\n nextReviewAt = this.addDays(now, interval);\n break;\n }\n\n return {\n interval: isGraduated ? interval : 0,\n easeFactor: state.easeFactor,\n repetitions: isGraduated ? 1 : 0,\n nextReviewAt,\n learningStep: newStep,\n isGraduated,\n isRelearning: false,\n lapses: state.lapses,\n };\n }\n\n /**\n * Handle relearning phase (lapsed cards).\n */\n private handleRelearningCard(\n state: SRSState,\n rating: CardRating,\n now: Date\n ): ReviewResult {\n const steps = this.config.relearningSteps;\n let newStep = state.learningStep;\n let isRelearning = true;\n let interval = 0;\n let nextReviewAt: Date;\n\n switch (rating) {\n case 'AGAIN':\n // Reset to first relearning step\n newStep = 0;\n interval = steps[0] ?? 10;\n nextReviewAt = this.addMinutes(now, interval);\n break;\n\n case 'HARD':\n // Stay at current step\n interval = steps[newStep] ?? steps[0] ?? 10;\n nextReviewAt = this.addMinutes(now, interval);\n break;\n\n case 'GOOD':\n // Move to next step or graduate back to review\n newStep++;\n if (newStep >= steps.length) {\n isRelearning = false;\n // Use reduced interval after lapse\n interval = Math.max(\n 1,\n Math.floor(state.interval * this.config.newIntervalModifier)\n );\n nextReviewAt = this.addDays(now, interval);\n } else {\n interval = steps[newStep] ?? 10;\n nextReviewAt = this.addMinutes(now, interval);\n }\n break;\n\n case 'EASY':\n // Graduate immediately with slightly longer interval\n isRelearning = false;\n interval = Math.max(\n 1,\n Math.floor(state.interval * this.config.newIntervalModifier * 1.5)\n );\n nextReviewAt = this.addDays(now, interval);\n break;\n }\n\n return {\n interval: isRelearning ? state.interval : interval,\n easeFactor: state.easeFactor,\n repetitions: isRelearning ? state.repetitions : state.repetitions + 1,\n nextReviewAt,\n learningStep: newStep,\n isGraduated: true,\n isRelearning,\n lapses: state.lapses,\n };\n }\n\n /**\n * Handle review phase (graduated cards).\n */\n private handleReviewCard(\n state: SRSState,\n rating: CardRating,\n now: Date\n ): ReviewResult {\n let newInterval: number;\n let newEaseFactor = state.easeFactor;\n let repetitions = state.repetitions;\n let isRelearning = false;\n let learningStep = 0;\n let lapses = state.lapses;\n\n switch (rating) {\n case 'AGAIN':\n // Card lapsed - move to relearning\n lapses++;\n isRelearning = true;\n learningStep = 0;\n newEaseFactor = Math.max(\n this.config.minEaseFactor,\n newEaseFactor - 0.2\n );\n newInterval = state.interval; // Keep old interval for reference\n return {\n interval: newInterval,\n easeFactor: newEaseFactor,\n repetitions,\n nextReviewAt: this.addMinutes(\n now,\n this.config.relearningSteps[0] ?? 10\n ),\n learningStep,\n isGraduated: true,\n isRelearning: true,\n lapses,\n };\n\n case 'HARD':\n // Reduce interval slightly, reduce ease\n newEaseFactor = Math.max(\n this.config.minEaseFactor,\n newEaseFactor - 0.15\n );\n newInterval = Math.max(\n state.interval + 1,\n state.interval * this.config.hardIntervalModifier\n );\n break;\n\n case 'GOOD':\n // Standard interval increase\n newInterval =\n state.interval * newEaseFactor * this.config.intervalModifier;\n repetitions++;\n break;\n\n case 'EASY':\n // Larger interval increase, increase ease\n newEaseFactor = newEaseFactor + 0.15;\n newInterval =\n state.interval *\n newEaseFactor *\n this.config.easyBonus *\n this.config.intervalModifier;\n repetitions++;\n break;\n }\n\n // Apply bounds\n newInterval = Math.min(Math.round(newInterval), this.config.maxInterval);\n newInterval = Math.max(1, newInterval);\n\n return {\n interval: newInterval,\n easeFactor: newEaseFactor,\n repetitions,\n nextReviewAt: this.addDays(now, newInterval),\n learningStep,\n isGraduated: true,\n isRelearning,\n lapses,\n };\n }\n\n // ============ Helpers ============\n\n private addMinutes(date: Date, minutes: number): Date {\n return new Date(date.getTime() + minutes * 60 * 1000);\n }\n\n private addDays(date: Date, days: number): Date {\n return new Date(date.getTime() + days * 24 * 60 * 60 * 1000);\n }\n}\n\n/**\n * Default SRS engine instance.\n */\nexport const srsEngine = new SRSEngine();\n"],"mappings":"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"}