@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.
- package/dist/assets/index.css +1 -1
- package/dist/common-ui.es.js +1 -1
- package/dist/common-ui.es.js.map +1 -1
- package/dist/common-ui.umd.js +1 -1
- package/dist/common-ui.umd.js.map +1 -1
- package/dist/components/StudySession.types.d.ts +20 -0
- package/dist/components/StudySession.types.d.ts.map +1 -1
- package/dist/components/StudySession.vue.d.ts +6 -3
- package/dist/components/StudySession.vue.d.ts.map +1 -1
- package/dist/components/auth/UserRegistration.vue.d.ts.map +1 -1
- package/dist/stores/useAuthStore.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/components/StudySession.types.ts +22 -0
- package/src/components/StudySession.vue +43 -17
|
@@ -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;
|
|
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
|
-
|
|
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(
|
|
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":"
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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-
|
|
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-
|
|
37
|
-
"@vue-skuilder/db": "0.1.32-
|
|
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"
|
|
15
|
-
<
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
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(
|
|
294
|
+
handleReplanRequest(options?: ReplanOptions) {
|
|
287
295
|
if (this.sessionController) {
|
|
288
|
-
|
|
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.
|
|
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
|
|
486
|
-
|
|
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.
|
|
489
|
-
void this.sessionController!.requestReplan(
|
|
514
|
+
this.replanOptions = null;
|
|
515
|
+
void this.sessionController!.requestReplan(opts ?? undefined);
|
|
490
516
|
this.$emit('replan-requested');
|
|
491
517
|
}
|
|
492
518
|
|