@vue-skuilder/db 0.1.23 → 0.1.25

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/dist/{contentSource-BP9hznNV.d.ts → contentSource-BmnmvH8C.d.ts} +268 -3
  2. package/dist/{contentSource-DsJadoBU.d.cts → contentSource-DfBbaLA-.d.cts} +268 -3
  3. package/dist/core/index.d.cts +310 -6
  4. package/dist/core/index.d.ts +310 -6
  5. package/dist/core/index.js +2606 -666
  6. package/dist/core/index.js.map +1 -1
  7. package/dist/core/index.mjs +2564 -639
  8. package/dist/core/index.mjs.map +1 -1
  9. package/dist/{dataLayerProvider-CHYrQ5pB.d.cts → dataLayerProvider-BeRXVMs5.d.cts} +1 -1
  10. package/dist/{dataLayerProvider-MDTxXq2l.d.ts → dataLayerProvider-CG9GfaAY.d.ts} +1 -1
  11. package/dist/impl/couch/index.d.cts +11 -3
  12. package/dist/impl/couch/index.d.ts +11 -3
  13. package/dist/impl/couch/index.js +2336 -656
  14. package/dist/impl/couch/index.js.map +1 -1
  15. package/dist/impl/couch/index.mjs +2316 -631
  16. package/dist/impl/couch/index.mjs.map +1 -1
  17. package/dist/impl/static/index.d.cts +4 -4
  18. package/dist/impl/static/index.d.ts +4 -4
  19. package/dist/impl/static/index.js +2312 -632
  20. package/dist/impl/static/index.js.map +1 -1
  21. package/dist/impl/static/index.mjs +2315 -630
  22. package/dist/impl/static/index.mjs.map +1 -1
  23. package/dist/{index-Dj0SEgk3.d.ts → index-BWvO-_rJ.d.ts} +1 -1
  24. package/dist/{index-B_j6u5E4.d.cts → index-Ba7hYbHj.d.cts} +1 -1
  25. package/dist/index.d.cts +278 -20
  26. package/dist/index.d.ts +278 -20
  27. package/dist/index.js +3603 -720
  28. package/dist/index.js.map +1 -1
  29. package/dist/index.mjs +3529 -674
  30. package/dist/index.mjs.map +1 -1
  31. package/dist/{types-DQaXnuoc.d.ts → types-CJrLM1Ew.d.ts} +1 -1
  32. package/dist/{types-Bn0itutr.d.cts → types-W8n-B6HG.d.cts} +1 -1
  33. package/dist/{types-legacy-DDY4N-Uq.d.cts → types-legacy-JXDxinpU.d.cts} +5 -1
  34. package/dist/{types-legacy-DDY4N-Uq.d.ts → types-legacy-JXDxinpU.d.ts} +5 -1
  35. package/dist/util/packer/index.d.cts +3 -3
  36. package/dist/util/packer/index.d.ts +3 -3
  37. package/docs/brainstorm-navigation-paradigm.md +40 -34
  38. package/docs/future-orchestration-vision.md +216 -0
  39. package/docs/navigators-architecture.md +210 -9
  40. package/docs/todo-review-urgency-adaptation.md +205 -0
  41. package/docs/todo-strategy-authoring.md +8 -6
  42. package/package.json +3 -3
  43. package/src/core/index.ts +2 -0
  44. package/src/core/interfaces/contentSource.ts +7 -0
  45. package/src/core/interfaces/userDB.ts +50 -0
  46. package/src/core/navigators/Pipeline.ts +132 -5
  47. package/src/core/navigators/PipelineAssembler.ts +21 -22
  48. package/src/core/navigators/PipelineDebugger.ts +426 -0
  49. package/src/core/navigators/filters/WeightedFilter.ts +141 -0
  50. package/src/core/navigators/filters/types.ts +4 -0
  51. package/src/core/navigators/generators/CompositeGenerator.ts +82 -19
  52. package/src/core/navigators/generators/elo.ts +14 -1
  53. package/src/core/navigators/generators/srs.ts +146 -18
  54. package/src/core/navigators/generators/types.ts +4 -0
  55. package/src/core/navigators/index.ts +203 -13
  56. package/src/core/orchestration/gradient.ts +133 -0
  57. package/src/core/orchestration/index.ts +210 -0
  58. package/src/core/orchestration/learning.ts +250 -0
  59. package/src/core/orchestration/recording.ts +92 -0
  60. package/src/core/orchestration/signal.ts +67 -0
  61. package/src/core/types/contentNavigationStrategy.ts +38 -0
  62. package/src/core/types/learningState.ts +77 -0
  63. package/src/core/types/types-legacy.ts +4 -0
  64. package/src/core/types/userOutcome.ts +51 -0
  65. package/src/courseConfigRegistration.ts +107 -0
  66. package/src/factory.ts +6 -0
  67. package/src/impl/common/BaseUserDB.ts +16 -0
  68. package/src/impl/couch/user-course-relDB.ts +12 -0
  69. package/src/study/MixerDebugger.ts +555 -0
  70. package/src/study/SessionController.ts +159 -20
  71. package/src/study/SessionDebugger.ts +442 -0
  72. package/src/study/SourceMixer.ts +36 -17
  73. package/src/study/TODO-session-scheduling.md +133 -0
  74. package/src/study/index.ts +2 -0
  75. package/src/study/services/EloService.ts +79 -4
  76. package/src/study/services/ResponseProcessor.ts +130 -72
  77. package/src/study/services/SrsService.ts +9 -0
  78. package/tests/core/navigators/Pipeline.test.ts +2 -0
  79. package/tests/core/navigators/PipelineAssembler.test.ts +4 -4
  80. package/docs/todo-evolutionary-orchestration.md +0 -310
@@ -1,6 +1,6 @@
1
1
  import { CourseConfig, ClassroomConfig, Status, SkuilderCourseData as SkuilderCourseData$1, CourseElo, DataShape, TagFilter } from '@vue-skuilder/common';
2
2
  import { Moment } from 'moment';
3
- import { S as SkuilderCourseData, b as DocTypePrefixes, D as DocType, Q as QualifiedCardID, T as TagStub, a as Tag, C as CardHistory, c as CardRecord } from './types-legacy-DDY4N-Uq.js';
3
+ import { S as SkuilderCourseData, b as DocTypePrefixes, D as DocType, Q as QualifiedCardID, T as TagStub, a as Tag, C as CardHistory, c as CardRecord } from './types-legacy-JXDxinpU.js';
4
4
 
5
5
  /**
6
6
  * Admin functionality
@@ -91,6 +91,24 @@ interface DataLayerResult {
91
91
  id?: string;
92
92
  }
93
93
 
94
+ /**
95
+ * Configuration for an evolutionarily-weighted strategy.
96
+ *
97
+ * This structure tracks the "learned" weight of a strategy, representing the
98
+ * system's confidence in its utility.
99
+ *
100
+ * - weight: The best-known multiplier (peak of the bell curve)
101
+ * - confidence: How certain we are (inverse of variance / spread)
102
+ * - sampleSize: How many data points informed this weight
103
+ */
104
+ interface LearnableWeight {
105
+ /** The current best estimate of optimal weight (multiplier) */
106
+ weight: number;
107
+ /** Confidence in this weight (0-1). Higher = narrower exploration spread. */
108
+ confidence: number;
109
+ /** Number of outcome observations that contributed to this weight */
110
+ sampleSize: number;
111
+ }
94
112
  /**
95
113
  *
96
114
  */
@@ -108,6 +126,17 @@ interface ContentNavigationStrategyData extends SkuilderCourseData {
108
126
  by the implementing class's constructor at runtime.
109
127
  */
110
128
  serializedData: string;
129
+ /**
130
+ * Evolutionary weighting configuration.
131
+ * If present, the strategy's influence is scaled by this weight.
132
+ * If omitted, weight defaults to 1.0.
133
+ */
134
+ learnable?: LearnableWeight;
135
+ /**
136
+ * If true, the weight is applied exactly as configured, without
137
+ * per-user deviation. Used for manual tuning or A/B testing.
138
+ */
139
+ staticWeight?: boolean;
111
140
  }
112
141
 
113
142
  /**
@@ -340,6 +369,50 @@ interface ScheduledCard {
340
369
  schedulingAgentId: string;
341
370
  }
342
371
 
372
+ /**
373
+ * Record of a user's learning outcome over a specific period.
374
+ *
375
+ * Used by the evolutionary orchestration system to correlate strategy
376
+ * deviations with learning success.
377
+ *
378
+ * Stored in the UserDB.
379
+ */
380
+ interface UserOutcomeRecord {
381
+ /**
382
+ * Unique ID: "USER_OUTCOME::{courseId}::{userId}::{timestamp}"
383
+ * Timestamp corresponds to periodEnd.
384
+ */
385
+ _id: string;
386
+ docType: DocType.USER_OUTCOME;
387
+ courseId: string;
388
+ userId: string;
389
+ /** Start of the measurement period (ISO timestamp) */
390
+ periodStart: string;
391
+ /** End of the measurement period (ISO timestamp) */
392
+ periodEnd: string;
393
+ /**
394
+ * The computed signal value (e.g., 0.85 for 85% accuracy).
395
+ * This is the 'Y' in the regression analysis.
396
+ *
397
+ * Higher values indicate better learning outcomes.
398
+ */
399
+ outcomeValue: number;
400
+ /**
401
+ * Snapshot of active deviations during this period.
402
+ * Maps strategyId -> deviation value used [-1.0, 1.0].
403
+ * This provides the 'X' values for regression analysis.
404
+ */
405
+ deviations: Record<string, number>;
406
+ metadata: {
407
+ sessionsCount: number;
408
+ cardsSeen: number;
409
+ eloStart: number;
410
+ eloEnd: number;
411
+ /** The algorithm used to compute outcomeValue (e.g. "accuracy_in_zone") */
412
+ signalType: string;
413
+ };
414
+ }
415
+
343
416
  type Update<T> = Partial<T> | ((x: T) => T);
344
417
 
345
418
  interface DocumentUpdater {
@@ -396,6 +469,11 @@ interface UserDBReader {
396
469
  * Strategies use this to persist preferences, learned patterns, or temporal
397
470
  * tracking data across sessions. Each strategy owns its own namespace.
398
471
  *
472
+ * @deprecated Use `getCourseInterface(courseId).getStrategyState(strategyKey)` instead.
473
+ * Direct use bypasses course-scoping safety — the courseId parameter is unguarded,
474
+ * allowing accidental cross-course data access. The course-scoped interface binds
475
+ * courseId once at construction.
476
+ *
399
477
  * @param courseId - The course this state applies to
400
478
  * @param strategyKey - Unique key identifying the strategy (typically class name)
401
479
  * @returns The strategy's data payload, or null if no state exists
@@ -471,6 +549,11 @@ interface UserDBWriter extends DocumentUpdater {
471
549
  * Strategies use this to persist preferences, learned patterns, or temporal
472
550
  * tracking data across sessions. Each strategy owns its own namespace.
473
551
  *
552
+ * @deprecated Use `getCourseInterface(courseId).putStrategyState(strategyKey, data)` instead.
553
+ * Direct use bypasses course-scoping safety — the courseId parameter is unguarded,
554
+ * allowing accidental cross-course data writes. The course-scoped interface binds
555
+ * courseId once at construction.
556
+ *
474
557
  * @param courseId - The course this state applies to
475
558
  * @param strategyKey - Unique key identifying the strategy (typically class name)
476
559
  * @param data - The strategy's data payload to store
@@ -479,10 +562,17 @@ interface UserDBWriter extends DocumentUpdater {
479
562
  /**
480
563
  * Delete strategy-specific state for a course.
481
564
  *
565
+ * @deprecated Use `getCourseInterface(courseId).deleteStrategyState(strategyKey)` instead.
566
+ * Direct use bypasses course-scoping safety.
567
+ *
482
568
  * @param courseId - The course this state applies to
483
569
  * @param strategyKey - Unique key identifying the strategy (typically class name)
484
570
  */
485
571
  deleteStrategyState(courseId: string, strategyKey: string): Promise<void>;
572
+ /**
573
+ * Record a user learning outcome for evolutionary orchestration.
574
+ */
575
+ putUserOutcome(record: UserOutcomeRecord): Promise<void>;
486
576
  }
487
577
  /**
488
578
  * Authentication and account management operations
@@ -527,6 +617,34 @@ interface UsrCrsDataInterface {
527
617
  getScheduledReviewCount(): Promise<number>;
528
618
  getCourseSettings(): Promise<UserCourseSettings>;
529
619
  updateCourseSettings(updates: UserCourseSetting[]): void;
620
+ /**
621
+ * Get strategy-specific state for this course.
622
+ *
623
+ * Course-scoped alternative to `UserDBInterface.getStrategyState()`.
624
+ * The courseId is bound at construction via `getCourseInterface(courseId)`,
625
+ * so callers cannot accidentally access another course's state.
626
+ *
627
+ * @param strategyKey - Unique key identifying the state document
628
+ * @returns The state payload, or null if no state exists
629
+ */
630
+ getStrategyState<T>(strategyKey: string): Promise<T | null>;
631
+ /**
632
+ * Store strategy-specific state for this course.
633
+ *
634
+ * Course-scoped alternative to `UserDBInterface.putStrategyState()`.
635
+ *
636
+ * @param strategyKey - Unique key identifying the state document
637
+ * @param data - The state payload to store
638
+ */
639
+ putStrategyState<T>(strategyKey: string, data: T): Promise<void>;
640
+ /**
641
+ * Delete strategy-specific state for this course.
642
+ *
643
+ * Course-scoped alternative to `UserDBInterface.deleteStrategyState()`.
644
+ *
645
+ * @param strategyKey - Unique key identifying the state document
646
+ */
647
+ deleteStrategyState(strategyKey: string): Promise<void>;
530
648
  }
531
649
  type ClassroomRegistrationDesignation = 'student' | 'teacher' | 'aide' | 'admin';
532
650
  interface ClassroomRegistration {
@@ -537,6 +655,127 @@ interface ClassroomRegistrationDoc {
537
655
  registrations: ClassroomRegistration[];
538
656
  }
539
657
 
658
+ /**
659
+ * Context for orchestration decisions during a session.
660
+ *
661
+ * Provides access to user/course data and helper methods for determining
662
+ * effective strategy weights based on the user's cohort assignment.
663
+ */
664
+ interface OrchestrationContext {
665
+ user: UserDBInterface;
666
+ course: CourseDBInterface;
667
+ userId: string;
668
+ courseConfig: CourseConfig;
669
+ /**
670
+ * Calculate the effective weight for a strategy for this user.
671
+ *
672
+ * Applies deviation based on the user's cohort assignment (derived from
673
+ * userId, strategyId, and course salt).
674
+ *
675
+ * @param strategyId - Unique ID of the strategy
676
+ * @param learnable - The strategy's learning configuration
677
+ * @returns Effective weight multiplier (typically 0.1 - 3.0)
678
+ */
679
+ getEffectiveWeight(strategyId: string, learnable: LearnableWeight): number;
680
+ /**
681
+ * Get the deviation factor for this user/strategy.
682
+ * Range [-1.0, 1.0].
683
+ */
684
+ getDeviation(strategyId: string): number;
685
+ }
686
+ /**
687
+ * Compute a user's deviation for a specific strategy.
688
+ *
689
+ * Returns a value in [-1, 1] that is:
690
+ * 1. Deterministic for the same (user, strategy, salt) tuple
691
+ * 2. Uniformly distributed across users
692
+ * 3. Uncorrelated between different strategies (due to strategyId in hash)
693
+ * 4. Rotatable by changing the salt
694
+ *
695
+ * @param userId - ID of the user
696
+ * @param strategyId - ID of the strategy
697
+ * @param salt - Random seed from course config
698
+ * @returns Deviation factor between -1.0 and 1.0
699
+ */
700
+ declare function computeDeviation(userId: string, strategyId: string, salt: string): number;
701
+ /**
702
+ * Compute the exploration spread based on confidence.
703
+ *
704
+ * - Low confidence (0.0) -> Max spread (Explore broadly)
705
+ * - High confidence (1.0) -> Min spread (Exploit known good weight)
706
+ *
707
+ * @param confidence - Confidence level 0-1
708
+ * @returns Spread magnitude (half-width of the distribution)
709
+ */
710
+ declare function computeSpread(confidence: number): number;
711
+ /**
712
+ * Calculate the effective weight for a strategy instance.
713
+ *
714
+ * Combines the learnable weight (peak) with the user's deviation and the
715
+ * allowed spread (based on confidence).
716
+ *
717
+ * @param learnable - Strategy learning config
718
+ * @param userId - User ID
719
+ * @param strategyId - Strategy ID
720
+ * @param salt - Course salt
721
+ * @returns Effective weight multiplier
722
+ */
723
+ declare function computeEffectiveWeight(learnable: LearnableWeight, userId: string, strategyId: string, salt: string): number;
724
+ /**
725
+ * Create an orchestration context for a study session.
726
+ *
727
+ * Fetches necessary configuration to enable deterministic weight calculation.
728
+ *
729
+ * @param user - User DB interface
730
+ * @param course - Course DB interface
731
+ * @returns Initialized orchestration context
732
+ */
733
+ declare function createOrchestrationContext(user: UserDBInterface, course: CourseDBInterface): Promise<OrchestrationContext>;
734
+
735
+ /**
736
+ * Type for navigator constructor functions.
737
+ */
738
+ type NavigatorConstructor = new (user: UserDBInterface, course: CourseDBInterface, strategyData: ContentNavigationStrategyData) => ContentNavigator;
739
+ /**
740
+ * Register a navigator implementation.
741
+ *
742
+ * Call this to make a navigator available for instantiation by
743
+ * ContentNavigator.create() without relying on dynamic imports.
744
+ *
745
+ * @param implementingClass - The class name (e.g., 'elo', 'hierarchyDefinition')
746
+ * @param constructor - The navigator class constructor
747
+ */
748
+ declare function registerNavigator(implementingClass: string, constructor: NavigatorConstructor): void;
749
+ /**
750
+ * Get a navigator constructor from the registry.
751
+ *
752
+ * @param implementingClass - The class name to look up
753
+ * @returns The constructor, or undefined if not registered
754
+ */
755
+ declare function getRegisteredNavigator(implementingClass: string): NavigatorConstructor | undefined;
756
+ /**
757
+ * Check if a navigator is registered.
758
+ *
759
+ * @param implementingClass - The class name to check
760
+ * @returns true if registered, false otherwise
761
+ */
762
+ declare function hasRegisteredNavigator(implementingClass: string): boolean;
763
+ /**
764
+ * Get all registered navigator names.
765
+ * Useful for debugging and testing.
766
+ */
767
+ declare function getRegisteredNavigatorNames(): string[];
768
+ /**
769
+ * Initialize the navigator registry with all built-in navigators.
770
+ *
771
+ * This function dynamically imports all standard navigator implementations
772
+ * and registers them. Call this once at application startup to ensure
773
+ * all navigators are available.
774
+ *
775
+ * In test environments, this may need to be called explicitly before
776
+ * using ContentNavigator.create().
777
+ */
778
+ declare function initializeNavigatorRegistry(): Promise<void>;
540
779
  /**
541
780
  * Tracks a single strategy's contribution to a card's final score.
542
781
  *
@@ -583,6 +822,17 @@ interface StrategyContribution {
583
822
  action: 'generated' | 'passed' | 'boosted' | 'penalized';
584
823
  /** Score after this strategy's processing */
585
824
  score: number;
825
+ /**
826
+ * The effective weight applied for this strategy instance.
827
+ * If using evolutionary orchestration, this includes deviation.
828
+ * If omitted, implies weight 1.0 (legacy behavior).
829
+ */
830
+ effectiveWeight?: number;
831
+ /**
832
+ * The deviation factor applied to this user's cohort for this strategy.
833
+ * Range [-1.0, 1.0].
834
+ */
835
+ deviation?: number;
586
836
  /**
587
837
  * Human-readable explanation of the strategy's decision.
588
838
  *
@@ -698,6 +948,10 @@ declare abstract class ContentNavigator implements StudyContentSource {
698
948
  protected strategyName?: string;
699
949
  /** Unique document ID for this strategy instance (from ContentNavigationStrategyData._id) */
700
950
  protected strategyId?: string;
951
+ /** Evolutionary weighting configuration */
952
+ learnable?: LearnableWeight;
953
+ /** Whether to bypass deviation (manual/static weighting) */
954
+ staticWeight?: boolean;
701
955
  /**
702
956
  * Constructor for standard navigators.
703
957
  * Call this from subclass constructors to initialize common fields.
@@ -729,7 +983,13 @@ declare abstract class ContentNavigator implements StudyContentSource {
729
983
  */
730
984
  protected putStrategyState<T>(data: T): Promise<void>;
731
985
  /**
732
- * Factory method to create navigator instances dynamically.
986
+ * Factory method to create navigator instances.
987
+ *
988
+ * First checks the navigator registry for a pre-registered constructor.
989
+ * If not found, falls back to dynamic import (for custom navigators).
990
+ *
991
+ * For reliable operation in test environments, call initializeNavigatorRegistry()
992
+ * before using this method.
733
993
  *
734
994
  * @param user - User interface
735
995
  * @param course - Course interface
@@ -816,7 +1076,12 @@ interface StudyContentSource {
816
1076
  * @returns Cards sorted by score descending
817
1077
  */
818
1078
  getWeightedCards(limit: number): Promise<WeightedCard[]>;
1079
+ /**
1080
+ * Get the orchestration context for this source.
1081
+ * Used for recording learning outcomes.
1082
+ */
1083
+ getOrchestrationContext?(): Promise<OrchestrationContext>;
819
1084
  }
820
1085
  declare function getStudySource(source: ContentSourceID, user: UserDBInterface): Promise<StudyContentSource>;
821
1086
 
822
- export { type AdminDBInterface as A, type UsrCrsDataInterface as B, type CourseDBInterface as C, type DataLayerResult as D, type ClassroomRegistrationDesignation as E, type ClassroomRegistration as F, type ClassroomRegistrationDoc as G, type SessionTrackingData as H, type UserConfig as I, type ActivityRecord as J, type CourseRegistration as K, type StrategyContribution as L, getCardOrigin as M, Navigators as N, NavigatorRole as O, NavigatorRoles as P, isGenerator as Q, isFilter as R, type StudySessionItem as S, type TeacherClassroomDBInterface as T, type UserDBInterface as U, type DocumentUpdater as V, type WeightedCard as W, newInterval as X, type UserDBReader as a, type CoursesDBInterface as b, type ClassroomDBInterface as c, type CourseInfo as d, type ContentNavigationStrategyData as e, ContentNavigator as f, type AssignedContent as g, type StudyContentSource as h, type StudentClassroomDBInterface as i, type ScheduledCard as j, type StudySessionFailedItem as k, type StudySessionFailedNewItem as l, type StudySessionFailedReviewItem as m, type StudySessionNewItem as n, type StudySessionReviewItem as o, isReview as p, type ContentSourceID as q, getStudySource as r, type CourseRegistrationDoc as s, type AssignedTag as t, type AssignedCourse as u, type AssignedCard as v, type UserDBWriter as w, type UserDBAuthenticator as x, type UserCourseSettings as y, type UserCourseSetting as z };
1087
+ export { isGenerator as $, type AdminDBInterface as A, type UsrCrsDataInterface as B, type CourseDBInterface as C, type DataLayerResult as D, type ClassroomRegistrationDesignation as E, type ClassroomRegistration as F, type ClassroomRegistrationDoc as G, type SessionTrackingData as H, type UserConfig as I, type ActivityRecord as J, type CourseRegistration as K, type UserOutcomeRecord as L, registerNavigator as M, type NavigatorConstructor as N, getRegisteredNavigator as O, hasRegisteredNavigator as P, getRegisteredNavigatorNames as Q, initializeNavigatorRegistry as R, type StudySessionItem as S, type TeacherClassroomDBInterface as T, type UserDBInterface as U, type StrategyContribution as V, type WeightedCard as W, getCardOrigin as X, Navigators as Y, NavigatorRole as Z, NavigatorRoles as _, type UserDBReader as a, isFilter as a0, type LearnableWeight as a1, type OrchestrationContext as a2, computeDeviation as a3, computeSpread as a4, computeEffectiveWeight as a5, createOrchestrationContext as a6, type DocumentUpdater as a7, newInterval as a8, type CoursesDBInterface as b, type ClassroomDBInterface as c, type CourseInfo as d, type ContentNavigationStrategyData as e, ContentNavigator as f, type AssignedContent as g, type StudyContentSource as h, type StudentClassroomDBInterface as i, type ScheduledCard as j, type StudySessionFailedItem as k, type StudySessionFailedNewItem as l, type StudySessionFailedReviewItem as m, type StudySessionNewItem as n, type StudySessionReviewItem as o, isReview as p, type ContentSourceID as q, getStudySource as r, type CourseRegistrationDoc as s, type AssignedTag as t, type AssignedCourse as u, type AssignedCard as v, type UserDBWriter as w, type UserDBAuthenticator as x, type UserCourseSettings as y, type UserCourseSetting as z };