@vue-skuilder/common-ui 0.1.32-a → 0.1.32-c

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.
@@ -3,6 +3,26 @@
3
3
  */
4
4
  export type StudySessionConfig = {
5
5
  likesConfetti: boolean;
6
+ /**
7
+ * Default pipeline batch size for new-card planning.
8
+ *
9
+ * Controls how many cards the pipeline returns per run (both initial
10
+ * session setup and auto-replans). Smaller values cause more frequent
11
+ * replans, keeping plans aligned with rapidly-changing user state —
12
+ * ideal for newer users who unlock content quickly.
13
+ *
14
+ * Explicit `ReplanOptions.limit` on individual replan requests always
15
+ * takes precedence over this default.
16
+ *
17
+ * Default (when omitted): 20
18
+ */
19
+ defaultBatchLimit?: number;
20
+ /**
21
+ * Optional hints to apply to the very first pipeline run (session init).
22
+ * Uses the same format as `ReplanOptions.hints` — boost/exclude/require tags.
23
+ * Applied via `setEphemeralHints()` before `prepareSession()`.
24
+ */
25
+ initHints?: Record<string, unknown>;
6
26
  };
7
27
  /**
8
28
  * Built-in card transition presets provided by StudySession.
@@ -1 +1 @@
1
- {"version":3,"file":"StudySession.types.d.ts","sourceRoot":"","sources":["../../src/components/StudySession.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,YAAY,GAAG,YAAY,CAAC;AAElF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC"}
1
+ {"version":3,"file":"StudySession.types.d.ts","sourceRoot":"","sources":["../../src/components/StudySession.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,OAAO,CAAC;IAEvB;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,YAAY,GAAG,YAAY,CAAC;AAElF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC"}
@@ -2,7 +2,7 @@ import { defineComponent, PropType } from 'vue';
2
2
  import { ViewComponent } from '../composables';
3
3
  import { default as CardViewer } from './cardRendering/CardViewer.vue';
4
4
  import { CourseElo, ViewData } from '../../../common/dist/index.mjs';
5
- import { CardHistory, CardRecord, ContentSourceID, CourseRegistrationDoc, DataLayerProvider, HydratedCard, ResponseResult, SessionController, StudyContentSource, StudySessionRecord, UserDBInterface } from '../../../db/dist/index.mjs';
5
+ import { CardHistory, CardRecord, ContentSourceID, CourseRegistrationDoc, DataLayerProvider, HydratedCard, ReplanOptions, ResponseResult, SessionController, StudyContentSource, StudySessionRecord, UserDBInterface } from '../../../db/dist/index.mjs';
6
6
  import { StudySessionConfig, CardTransitionPreset, CardTransitionMode } from './StudySession.types';
7
7
  interface StudyRefs {
8
8
  shadowWrapper: HTMLDivElement;
@@ -75,7 +75,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
75
75
  sessionContentSources: StudyContentSource[];
76
76
  timeRemaining: number;
77
77
  replanPending: boolean;
78
- replanHints: Record<string, unknown> | null;
78
+ replanOptions: ReplanOptions | null;
79
79
  deferredNextCardAction: string | null;
80
80
  intervalHandler: NodeJS.Timeout | null;
81
81
  cardType: string;
@@ -98,8 +98,11 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
98
98
  * The replan is deferred — not fired immediately. processResponse()
99
99
  * checks this flag after submitResponse() has recorded ELO/tag
100
100
  * interactions, ensuring the pipeline sees fully up-to-date state.
101
+ *
102
+ * Accepts either a ReplanOptions object (new API) or a bare hints
103
+ * Record (legacy). SessionController.requestReplan() normalises both.
101
104
  */
102
- handleReplanRequest(hints?: Record<string, unknown>): void;
105
+ handleReplanRequest(options?: ReplanOptions): void;
103
106
  user_elo(courseID: string): CourseElo;
104
107
  handleClassroomMessage(): (v: unknown) => {};
105
108
  incrementSessionClock(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"StudySession.vue.d.ts","sourceRoot":"","sources":["../../src/components/StudySession.vue"],"names":[],"mappings":"AA4EA;AAAA,OA+vBO,EAAE,eAAe,EAAW,QAAQ,EAAE,MAAM,KAAK,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAM/C,OAAO,UAAU,MAAM,gCAAgC,CAAC;AAGxD,OAAO,EAAE,SAAS,EAAuB,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EACL,WAAW,EACX,UAAU,EAEV,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EAEjB,YAAY,EAEZ,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEpG,UAAU,SAAS;IACjB,aAAa,EAAE,cAAc,CAAC;IAC9B,UAAU,EAAE,YAAY,CAAC,OAAO,UAAU,CAAC,CAAC;CAC7C;AAED,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,GAAG;IACxD,KAAK,EAAE,SAAS,CAAC;CAClB,CAAC;;;;;;;cAqBmB,QAAQ,CAAC,eAAe,EAAE,CAAC;;;;cAI1B,QAAQ,CAAC,eAAe,CAAC;;;;cAIzB,QAAQ,CAAC,iBAAiB,CAAC;;;;cAI3B,QAAQ,CAAC,kBAAkB,CAAC;;;;;;cAI1B,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,aAAa,CAAC;;;;;;;;;;;;cAY7C,QAAQ,CAAC,oBAAoB,GAAG,MAAM,CAAC;;;;cAIvC,QAAQ,CAAC,kBAAkB,CAAC;;;;;UAoB9B,aAAa,GAAG,IAAI;UACtB,QAAQ,EAAE;;;iBAGH;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE;;uBAEtB,iBAAiB,CAAC,aAAa,CAAC,GAAG,IAAI;;;mBAG7C,kBAAkB,EAAE;;;;sBAIf,qBAAqB,GAAG,IAAI;2BACzB,kBAAkB,EAAE;;;iBAG5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;4BACnB,MAAM,GAAG,IAAI;qBACpB,MAAM,CAAC,OAAO,GAAG,IAAI;;;;mBAOjC,kBAAkB;;IA4CjC;;;OAGG;;IAYH;;;;;;;;;;OAUG;gCACyB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;uBAQhC,MAAM,GAAG,SAAS;kCASxB,OAAO;;;;8BA2HM,MAAM,WAAW,MAAM,GAAG,MAAM;0BAI9B,aAAa,KAAK,UAAU;6BA+E/B,cAAc;;qBAsDhB,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;mBAO/C,YAAY,GAAG,IAAI;;;;;;;cAhbvB,QAAQ,CAAC,eAAe,EAAE,CAAC;;;;cAI1B,QAAQ,CAAC,eAAe,CAAC;;;;cAIzB,QAAQ,CAAC,iBAAiB,CAAC;;;;cAI3B,QAAQ,CAAC,kBAAkB,CAAC;;;;;;cAI1B,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,aAAa,CAAC;;;;;;;;;;;;cAY7C,QAAQ,CAAC,oBAAoB,GAAG,MAAM,CAAC;;;;cAIvC,QAAQ,CAAC,kBAAkB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAnDlD,wBA6eG"}
1
+ {"version":3,"file":"StudySession.vue.d.ts","sourceRoot":"","sources":["../../src/components/StudySession.vue"],"names":[],"mappings":"AAgFA;AAAA,OAyxBO,EAAE,eAAe,EAAW,QAAQ,EAAE,MAAM,KAAK,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAM/C,OAAO,UAAU,MAAM,gCAAgC,CAAC;AAGxD,OAAO,EAAE,SAAS,EAAuB,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EACL,WAAW,EACX,UAAU,EAEV,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EAEjB,YAAY,EAEZ,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEpG,UAAU,SAAS;IACjB,aAAa,EAAE,cAAc,CAAC;IAC9B,UAAU,EAAE,YAAY,CAAC,OAAO,UAAU,CAAC,CAAC;CAC7C;AAED,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,GAAG;IACxD,KAAK,EAAE,SAAS,CAAC;CAClB,CAAC;;;;;;;cAqBmB,QAAQ,CAAC,eAAe,EAAE,CAAC;;;;cAI1B,QAAQ,CAAC,eAAe,CAAC;;;;cAIzB,QAAQ,CAAC,iBAAiB,CAAC;;;;cAI3B,QAAQ,CAAC,kBAAkB,CAAC;;;;;;cAI1B,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,aAAa,CAAC;;;;;;;;;;;;cAY7C,QAAQ,CAAC,oBAAoB,GAAG,MAAM,CAAC;;;;cAIvC,QAAQ,CAAC,kBAAkB,CAAC;;;;;UAoB9B,aAAa,GAAG,IAAI;UACtB,QAAQ,EAAE;;;iBAGH;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE;;uBAEtB,iBAAiB,CAAC,aAAa,CAAC,GAAG,IAAI;;;mBAG7C,kBAAkB,EAAE;;;;sBAIf,qBAAqB,GAAG,IAAI;2BACzB,kBAAkB,EAAE;;;mBAG1B,aAAa,GAAG,IAAI;4BACX,MAAM,GAAG,IAAI;qBACpB,MAAM,CAAC,OAAO,GAAG,IAAI;;;;mBAOjC,kBAAkB;;IA4CjC;;;OAGG;;IAYH;;;;;;;;;;;;;OAaG;kCAC2B,aAAa;uBAUxB,MAAM,GAAG,SAAS;kCASxB,OAAO;;;;8BAyIM,MAAM,WAAW,MAAM,GAAG,MAAM;0BAI9B,aAAa,KAAK,UAAU;6BAiF/B,cAAc;;qBAsDhB,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;mBAO/C,YAAY,GAAG,IAAI;;;;;;;cArcvB,QAAQ,CAAC,eAAe,EAAE,CAAC;;;;cAI1B,QAAQ,CAAC,eAAe,CAAC;;;;cAIzB,QAAQ,CAAC,iBAAiB,CAAC;;;;cAI3B,QAAQ,CAAC,kBAAkB,CAAC;;;;;;cAI1B,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,aAAa,CAAC;;;;;;;;;;;;cAY7C,QAAQ,CAAC,oBAAoB,GAAG,MAAM,CAAC;;;;cAIvC,QAAQ,CAAC,kBAAkB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAnDlD,wBAkgBG"}
@@ -1 +1 @@
1
- {"version":3,"file":"UserRegistration.vue.d.ts","sourceRoot":"","sources":["../../../src/components/auth/UserRegistration.vue"],"names":[],"mappings":"AA8EA;AAAA,OAiSO,EAAmB,QAAQ,EAAE,MAAM,KAAK,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,MAAM,EAAO,MAAM,sBAAsB,CAAC;;;cAU3B,QAAQ,CAAC,CAAC,OAAO,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;;;;;;;;;;;;;;;;;;UAuBrD,eAAe,GAAG,IAAI;WACO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA0L3B,CAAC;;;;;;;;;;;;wBA+BgE,CAAA;yBAAuB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA/BzF,CAAC;;;;;;;;;;;;wBA+BgE,CAAA;yBAAuB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA/BzF,CAAC;;;;;;;;;;;;wBA+BgE,CAAA;yBAAuB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA/BzF,CAAC;;;;;;;;;;;;wBA+BgE,CAAA;yBAAuB,CAAC;;;;;;;;;;;;;;;;;yBAhN9F,OAAO;;;;;qBASX,MAAM;2BAGA,MAAM;;;;;;;;cA7CT,QAAQ,CAAC,CAAC,OAAO,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;;;;;;;AALzE,wBAqMG"}
1
+ {"version":3,"file":"UserRegistration.vue.d.ts","sourceRoot":"","sources":["../../../src/components/auth/UserRegistration.vue"],"names":[],"mappings":"AA8EA;AAAA,OAiSO,EAAmB,QAAQ,EAAE,MAAM,KAAK,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,MAAM,EAAO,MAAM,sBAAsB,CAAC;;;cAU3B,QAAQ,CAAC,CAAC,OAAO,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;;;;;;;;;;;;;;;;;;UAuBrD,eAAe,GAAG,IAAI;WACO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA4dyvK,CAAC;;;;;;;;;;;;wBAAm0D,CAAC;yBAAuB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAA71D,CAAC;;;;;;;;;;;;wBAAm0D,CAAC;yBAAuB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAA71D,CAAC;;;;;;;;;;;;wBAAm0D,CAAC;yBAAuB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAA71D,CAAC;;;;;;;;;;;;wBAAm0D,CAAC;yBAAuB,CAAC;;;;;;;;;;;;;;;;;yBAndtnO,OAAO;;;;;qBASX,MAAM;2BAGA,MAAM;;;;;;;;cA7CT,QAAQ,CAAC,CAAC,OAAO,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;;;;;;;AALzE,wBAqMG"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAuthStore.d.ts","sourceRoot":"","sources":["../../src/stores/useAuthStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGjE,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,eAAe,GAAG,SAAS,CAAC;IACnC,oBAAoB,EAAE;QACpB,IAAI,EAAE,OAAO,CAAC;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,aAAa,EAAE,OAAO,CAAC;QACvB,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAiB3E;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAgFmub,CAAC;;;;;;;;;;;;oBAAm0D,CAAC;qBAAuB,CAAC;;;;;;;kBA3G/kf,OAAO;sBACH,OAAO;2BACF,OAAO;6BACL,OAAO;;wBAEV,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAsGmub,CAAC;;;;;;;;;;;;oBAAm0D,CAAC;qBAAuB,CAAC;;;;;;;kBA3G/kf,OAAO;sBACH,OAAO;2BACF,OAAO;6BACL,OAAO;;wBAEV,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAsGmub,CAAC;;;;;;;;;;;;oBAAm0D,CAAC;qBAAuB,CAAC;;;;;;;kBA3G/kf,OAAO;sBACH,OAAO;2BACF,OAAO;6BACL,OAAO;;wBAEV,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAsGmub,CAAC;;;;;;;;;;;;oBAAm0D,CAAC;qBAAuB,CAAC;;;;;;;;;yBA1C9jf,OAAO;uBAIT,OAAO;;;;;EAqC/B,CAAC"}
1
+ {"version":3,"file":"useAuthStore.d.ts","sourceRoot":"","sources":["../../src/stores/useAuthStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGjE,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,eAAe,GAAG,SAAS,CAAC;IACnC,oBAAoB,EAAE;QACpB,IAAI,EAAE,OAAO,CAAC;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,aAAa,EAAE,OAAO,CAAC;QACvB,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAiB3E;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAgFukhC,CAAC;;;;;;;;;;;;oBAAm0D,CAAC;qBAAuB,CAAC;;;;;;;kBA3Gn7kC,OAAO;sBACH,OAAO;2BACF,OAAO;6BACL,OAAO;;wBAEV,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAsGukhC,CAAC;;;;;;;;;;;;oBAAm0D,CAAC;qBAAuB,CAAC;;;;;;;kBA3Gn7kC,OAAO;sBACH,OAAO;2BACF,OAAO;6BACL,OAAO;;wBAEV,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAsGukhC,CAAC;;;;;;;;;;;;oBAAm0D,CAAC;qBAAuB,CAAC;;;;;;;kBA3Gn7kC,OAAO;sBACH,OAAO;2BACF,OAAO;6BACL,OAAO;;wBAEV,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAsGukhC,CAAC;;;;;;;;;;;;oBAAm0D,CAAC;qBAAuB,CAAC;;;;;;;;;yBA1Cl6kC,OAAO;uBAIT,OAAO;;;;;EAqC/B,CAAC"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.1.32-a",
6
+ "version": "0.1.32-c",
7
7
  "main": "./dist/common-ui.umd.js",
8
8
  "module": "./dist/common-ui.es.js",
9
9
  "types": "./dist/index.d.ts",
@@ -33,8 +33,8 @@
33
33
  "@highlightjs/vue-plugin": "^2.1.2",
34
34
  "@mdi/font": "^7.3.67",
35
35
  "@vojtechlanka/vue-tags-input": "^3",
36
- "@vue-skuilder/common": "0.1.32-a",
37
- "@vue-skuilder/db": "0.1.32-a",
36
+ "@vue-skuilder/common": "0.1.32-c",
37
+ "@vue-skuilder/db": "0.1.32-c",
38
38
  "highlight.js": "^11.0.1",
39
39
  "marked": "^15.0.6",
40
40
  "moment": "^2.29.4",
@@ -3,6 +3,28 @@
3
3
  */
4
4
  export type StudySessionConfig = {
5
5
  likesConfetti: boolean;
6
+
7
+ /**
8
+ * Default pipeline batch size for new-card planning.
9
+ *
10
+ * Controls how many cards the pipeline returns per run (both initial
11
+ * session setup and auto-replans). Smaller values cause more frequent
12
+ * replans, keeping plans aligned with rapidly-changing user state —
13
+ * ideal for newer users who unlock content quickly.
14
+ *
15
+ * Explicit `ReplanOptions.limit` on individual replan requests always
16
+ * takes precedence over this default.
17
+ *
18
+ * Default (when omitted): 20
19
+ */
20
+ defaultBatchLimit?: number;
21
+
22
+ /**
23
+ * Optional hints to apply to the very first pipeline run (session init).
24
+ * Uses the same format as `ReplanOptions.hints` — boost/exclude/require tags.
25
+ * Applied via `setEphemeralHints()` before `prepareSession()`.
26
+ */
27
+ initHints?: Record<string, unknown>;
6
28
  };
7
29
 
8
30
  /**
@@ -11,14 +11,18 @@
11
11
 
12
12
  <br v-if="!frameless" />
13
13
 
14
- <div v-if="sessionFinished" class="text-h4">
15
- <p>Study session finished! Great job!</p>
16
- <p v-if="sessionController">{{ sessionController.report }}</p>
17
- <!-- <p>
18
- Start <a @click="$emit('session-finished')">another study session</a>, or try
19
- <router-link :to="`/edit/${courseID}`">adding some new content</router-link> to challenge yourself and others!
20
- </p> -->
21
- <heat-map :activity-records-getter="() => user.getActivityRecords()" />
14
+ <div v-if="sessionFinished">
15
+ <slot name="session-finished" :session-record="sessionRecord" :report="sessionController?.report">
16
+ <div class="text-h4">
17
+ <p>Study session finished! Great job!</p>
18
+ <p v-if="sessionController">{{ sessionController.report }}</p>
19
+ <!-- <p>
20
+ Start <a @click="$emit('session-finished')">another study session</a>, or try
21
+ <router-link :to="`/edit/${courseID}`">adding some new content</router-link> to challenge yourself and others!
22
+ </p> -->
23
+ <heat-map :activity-records-getter="() => user.getActivityRecords()" />
24
+ </div>
25
+ </slot>
22
26
  </div>
23
27
 
24
28
  <div v-else ref="shadowWrapper" class="card-transition-container">
@@ -97,6 +101,7 @@ import {
97
101
  getStudySource,
98
102
  HydratedCard,
99
103
  isQuestionRecord,
104
+ ReplanOptions,
100
105
  ResponseResult,
101
106
  SessionController,
102
107
  StudyContentSource,
@@ -204,7 +209,7 @@ export default defineComponent({
204
209
  sessionContentSources: [] as StudyContentSource[],
205
210
  timeRemaining: 300, // 5 minutes * 60 seconds
206
211
  replanPending: false,
207
- replanHints: null as Record<string, unknown> | null,
212
+ replanOptions: null as ReplanOptions | null,
208
213
  deferredNextCardAction: null as string | null,
209
214
  intervalHandler: null as NodeJS.Timeout | null,
210
215
  cardType: '',
@@ -282,12 +287,17 @@ export default defineComponent({
282
287
  * The replan is deferred — not fired immediately. processResponse()
283
288
  * checks this flag after submitResponse() has recorded ELO/tag
284
289
  * interactions, ensuring the pipeline sees fully up-to-date state.
290
+ *
291
+ * Accepts either a ReplanOptions object (new API) or a bare hints
292
+ * Record (legacy). SessionController.requestReplan() normalises both.
285
293
  */
286
- handleReplanRequest(hints?: Record<string, unknown>) {
294
+ handleReplanRequest(options?: ReplanOptions) {
287
295
  if (this.sessionController) {
288
- console.log(`[StudySession] Replan requested by card view${hints ? ' (with hints)' : ''}, deferring until after response processing`);
296
+ const label = (options as ReplanOptions)?.label;
297
+ const tag = label ? ` [${label}]` : '';
298
+ console.log(`[StudySession] Replan requested by card view${tag}, deferring until after response processing`);
289
299
  this.replanPending = true;
290
- this.replanHints = hints ?? null;
300
+ this.replanOptions = (options as ReplanOptions) ?? null;
291
301
  }
292
302
  },
293
303
 
@@ -366,16 +376,30 @@ export default defineComponent({
366
376
  // db.setChangeFcn(this.handleClassroomMessage());
367
377
  });
368
378
 
379
+ const scOptions = this.sessionConfig?.defaultBatchLimit !== undefined
380
+ ? { defaultBatchLimit: this.sessionConfig.defaultBatchLimit }
381
+ : undefined;
382
+
369
383
  this.sessionController = markRaw(
370
384
  new SessionController<ViewComponent>(
371
385
  this.sessionContentSources,
372
386
  60 * this.sessionTimeLimit,
373
387
  this.dataLayer,
374
- this.getViewComponent
388
+ this.getViewComponent,
389
+ undefined, // mixer — use default
390
+ scOptions
375
391
  )
376
392
  );
377
393
  this.sessionController.sessionRecord = this.sessionRecord;
378
394
 
395
+ // Apply init hints if provided (e.g. post-lesson boost tags)
396
+ if (this.sessionConfig?.initHints) {
397
+ for (const source of this.sessionContentSources) {
398
+ source.setEphemeralHints?.(this.sessionConfig.initHints as any);
399
+ }
400
+ console.log('[StudySession] Applied init hints to content sources');
401
+ }
402
+
379
403
  await this.sessionController.prepareSession();
380
404
  this.intervalHandler = setInterval(this.tick, 1000);
381
405
 
@@ -482,11 +506,13 @@ export default defineComponent({
482
506
 
483
507
  // Fire deferred replan if requested — state is now fully recorded
484
508
  if (this.replanPending) {
485
- const hints = this.replanHints;
486
- console.log(`[StudySession] Firing deferred replan (post-submitResponse)${hints ? ' with hints' : ''}`);
509
+ const opts = this.replanOptions;
510
+ const label = opts?.label;
511
+ const tag = label ? ` [${label}]` : '';
512
+ console.log(`[StudySession] Firing deferred replan (post-submitResponse)${tag}`);
487
513
  this.replanPending = false;
488
- this.replanHints = null;
489
- void this.sessionController!.requestReplan(hints ?? undefined);
514
+ this.replanOptions = null;
515
+ void this.sessionController!.requestReplan(opts ?? undefined);
490
516
  this.$emit('replan-requested');
491
517
  }
492
518