dsh-diagnostic-tutor 0.1.0 → 0.2.0

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 (126) hide show
  1. package/README.md +316 -79
  2. package/lib/api.js +364 -78
  3. package/lib/api.js.map +1 -1
  4. package/lib/block-types.js +25 -0
  5. package/lib/block-types.js.map +1 -0
  6. package/lib/client.js +9952 -821
  7. package/lib/client.js.map +1 -1
  8. package/lib/diagnostics.js +170 -0
  9. package/lib/diagnostics.js.map +1 -0
  10. package/lib/execution-key.js +91 -0
  11. package/lib/execution-key.js.map +1 -0
  12. package/lib/handoff.js +44 -1
  13. package/lib/handoff.js.map +1 -1
  14. package/lib/index.js +87 -51
  15. package/lib/index.js.map +1 -1
  16. package/lib/insights.js +82 -0
  17. package/lib/insights.js.map +1 -0
  18. package/lib/interactions.js +70 -0
  19. package/lib/interactions.js.map +1 -0
  20. package/lib/journal.js +122 -0
  21. package/lib/journal.js.map +1 -0
  22. package/lib/lesson-markdown.js +72 -0
  23. package/lib/lesson-markdown.js.map +1 -0
  24. package/lib/lesson.js +152 -3
  25. package/lib/lesson.js.map +1 -1
  26. package/lib/math.js +126 -0
  27. package/lib/math.js.map +1 -0
  28. package/lib/path-api.js +140 -0
  29. package/lib/path-api.js.map +1 -0
  30. package/lib/path-runtime.js +361 -0
  31. package/lib/path-runtime.js.map +1 -0
  32. package/lib/path-tools.js +107 -0
  33. package/lib/path-tools.js.map +1 -0
  34. package/lib/path.js +179 -0
  35. package/lib/path.js.map +1 -0
  36. package/lib/plan-tools.js +89 -0
  37. package/lib/plan-tools.js.map +1 -0
  38. package/lib/plan.js +82 -0
  39. package/lib/plan.js.map +1 -0
  40. package/lib/project-session.js +48 -0
  41. package/lib/project-session.js.map +1 -0
  42. package/lib/prompt.js +4 -19
  43. package/lib/prompt.js.map +1 -1
  44. package/lib/review-sync.js +51 -0
  45. package/lib/review-sync.js.map +1 -0
  46. package/lib/review-tools.js +115 -0
  47. package/lib/review-tools.js.map +1 -0
  48. package/lib/review.js +103 -0
  49. package/lib/review.js.map +1 -0
  50. package/lib/source-schema.js +24 -0
  51. package/lib/source-schema.js.map +1 -0
  52. package/lib/source-tools.js +61 -0
  53. package/lib/source-tools.js.map +1 -0
  54. package/lib/sources.js +78 -0
  55. package/lib/sources.js.map +1 -0
  56. package/lib/state.js +353 -47
  57. package/lib/state.js.map +1 -1
  58. package/lib/tools.js +620 -123
  59. package/lib/tools.js.map +1 -1
  60. package/lib/types/api.d.ts +10 -3
  61. package/lib/types/api.d.ts.map +1 -1
  62. package/lib/types/block-types.d.ts +12 -0
  63. package/lib/types/block-types.d.ts.map +1 -0
  64. package/lib/types/contract.d.ts +81 -7
  65. package/lib/types/contract.d.ts.map +1 -1
  66. package/lib/types/diagnostics.d.ts +95 -0
  67. package/lib/types/diagnostics.d.ts.map +1 -0
  68. package/lib/types/execution-key.d.ts +59 -0
  69. package/lib/types/execution-key.d.ts.map +1 -0
  70. package/lib/types/handoff.d.ts +2 -2
  71. package/lib/types/handoff.d.ts.map +1 -1
  72. package/lib/types/index.d.ts +19 -14
  73. package/lib/types/index.d.ts.map +1 -1
  74. package/lib/types/insights.d.ts +57 -0
  75. package/lib/types/insights.d.ts.map +1 -0
  76. package/lib/types/interactions.d.ts +23 -0
  77. package/lib/types/interactions.d.ts.map +1 -0
  78. package/lib/types/journal.d.ts +57 -0
  79. package/lib/types/journal.d.ts.map +1 -0
  80. package/lib/types/lesson-markdown.d.ts +11 -0
  81. package/lib/types/lesson-markdown.d.ts.map +1 -0
  82. package/lib/types/lesson.d.ts +697 -5
  83. package/lib/types/lesson.d.ts.map +1 -1
  84. package/lib/types/math.d.ts +50 -0
  85. package/lib/types/math.d.ts.map +1 -0
  86. package/lib/types/path-api.d.ts +5 -0
  87. package/lib/types/path-api.d.ts.map +1 -0
  88. package/lib/types/path-runtime.d.ts +1558 -0
  89. package/lib/types/path-runtime.d.ts.map +1 -0
  90. package/lib/types/path-tools.d.ts +4 -0
  91. package/lib/types/path-tools.d.ts.map +1 -0
  92. package/lib/types/path.d.ts +744 -0
  93. package/lib/types/path.d.ts.map +1 -0
  94. package/lib/types/plan-tools.d.ts +4 -0
  95. package/lib/types/plan-tools.d.ts.map +1 -0
  96. package/lib/types/plan.d.ts +53 -0
  97. package/lib/types/plan.d.ts.map +1 -0
  98. package/lib/types/project-session.d.ts +33 -0
  99. package/lib/types/project-session.d.ts.map +1 -0
  100. package/lib/types/prompt.d.ts.map +1 -1
  101. package/lib/types/review-sync.d.ts +17 -0
  102. package/lib/types/review-sync.d.ts.map +1 -0
  103. package/lib/types/review-tools.d.ts +4 -0
  104. package/lib/types/review-tools.d.ts.map +1 -0
  105. package/lib/types/review.d.ts +65 -0
  106. package/lib/types/review.d.ts.map +1 -0
  107. package/lib/types/source-schema.d.ts +31 -0
  108. package/lib/types/source-schema.d.ts.map +1 -0
  109. package/lib/types/source-tools.d.ts +4 -0
  110. package/lib/types/source-tools.d.ts.map +1 -0
  111. package/lib/types/sources.d.ts +33 -0
  112. package/lib/types/sources.d.ts.map +1 -0
  113. package/lib/types/state.d.ts +607 -23
  114. package/lib/types/state.d.ts.map +1 -1
  115. package/lib/types/tools.d.ts +3 -1
  116. package/lib/types/tools.d.ts.map +1 -1
  117. package/lib/types/udt.d.ts +20 -24
  118. package/lib/types/udt.d.ts.map +1 -1
  119. package/lib/types/version.d.ts +11 -0
  120. package/lib/types/version.d.ts.map +1 -0
  121. package/lib/types/vocabulary.d.ts +2 -2
  122. package/lib/udt.js +72 -19
  123. package/lib/udt.js.map +1 -1
  124. package/lib/version.js +26 -0
  125. package/lib/version.js.map +1 -0
  126. package/package.json +27 -22
@@ -0,0 +1,1558 @@
1
+ import type { UdState } from './state.js';
2
+ import type { LessonRecord } from './lesson.js';
3
+ import type { PathView } from './path.js';
4
+ export declare function pathView(state: UdState, courseId: string, sessionId?: string): PathView;
5
+ export declare function selectedProject(state: UdState, courseId: string, sessionId: string | undefined): asserts sessionId is string;
6
+ export declare function saveBrief(state: UdState, courseId: string, sessionId: string, expectedRevision: number, raw: unknown): Promise<{
7
+ courseId: string;
8
+ revision: number;
9
+ briefRevision: number;
10
+ assessmentRevision: number;
11
+ brief: {
12
+ purpose: string;
13
+ outcomes: string[];
14
+ background: string;
15
+ timeZone: string;
16
+ targetDate: string | null;
17
+ durationWeeks: number | null;
18
+ deadline: "none" | "flexible" | "fixed";
19
+ weeklyMinutes: number | null;
20
+ sessionMinutes: number | null;
21
+ preferences: string;
22
+ } | null;
23
+ assessment: {
24
+ status: "ready" | "in-progress" | "skipped";
25
+ summary: string;
26
+ strengths: string[];
27
+ gaps: string[];
28
+ uncertainties: string[];
29
+ evidence: {
30
+ nodeId: string;
31
+ evidenceIndex: number;
32
+ }[];
33
+ briefRevision: number;
34
+ sessionId: string;
35
+ updatedAt: string;
36
+ } | null;
37
+ curricula: {
38
+ version: number;
39
+ briefRevision: number;
40
+ assessmentRevision: number;
41
+ createdAt: string;
42
+ acceptedAt: string | null;
43
+ title: string;
44
+ summary: string;
45
+ modules: {
46
+ id: string;
47
+ title: string;
48
+ overview: string;
49
+ outcomes: string[];
50
+ milestone: string;
51
+ }[];
52
+ items: {
53
+ id: string;
54
+ moduleId: string;
55
+ title: string;
56
+ overview: string;
57
+ outcomes: string[];
58
+ outline: string[];
59
+ topics: string[];
60
+ nodeIds: string[];
61
+ practice: string;
62
+ assessment: string;
63
+ minutes: {
64
+ min: number;
65
+ max: number;
66
+ };
67
+ }[];
68
+ edges: {
69
+ from: string;
70
+ to: string;
71
+ kind: "optional" | "required";
72
+ }[];
73
+ assumptions: string[];
74
+ changeReason: string;
75
+ }[];
76
+ acceptedVersion: number | null;
77
+ requests: {
78
+ id: string;
79
+ sessionId: string;
80
+ kind: "diagnosis" | "plan";
81
+ briefRevision: number;
82
+ createdAt: string;
83
+ prompted: boolean;
84
+ reason: string | null;
85
+ failure?: string | null | undefined;
86
+ }[];
87
+ updatedAt: string;
88
+ }>;
89
+ export declare function saveAssessment(state: UdState, courseId: string, sessionId: string, expectedRevision: number, raw: unknown, allowSkip?: boolean): Promise<{
90
+ courseId: string;
91
+ revision: number;
92
+ briefRevision: number;
93
+ assessmentRevision: number;
94
+ brief: {
95
+ purpose: string;
96
+ outcomes: string[];
97
+ background: string;
98
+ timeZone: string;
99
+ targetDate: string | null;
100
+ durationWeeks: number | null;
101
+ deadline: "none" | "flexible" | "fixed";
102
+ weeklyMinutes: number | null;
103
+ sessionMinutes: number | null;
104
+ preferences: string;
105
+ } | null;
106
+ assessment: {
107
+ status: "ready" | "in-progress" | "skipped";
108
+ summary: string;
109
+ strengths: string[];
110
+ gaps: string[];
111
+ uncertainties: string[];
112
+ evidence: {
113
+ nodeId: string;
114
+ evidenceIndex: number;
115
+ }[];
116
+ briefRevision: number;
117
+ sessionId: string;
118
+ updatedAt: string;
119
+ } | null;
120
+ curricula: {
121
+ version: number;
122
+ briefRevision: number;
123
+ assessmentRevision: number;
124
+ createdAt: string;
125
+ acceptedAt: string | null;
126
+ title: string;
127
+ summary: string;
128
+ modules: {
129
+ id: string;
130
+ title: string;
131
+ overview: string;
132
+ outcomes: string[];
133
+ milestone: string;
134
+ }[];
135
+ items: {
136
+ id: string;
137
+ moduleId: string;
138
+ title: string;
139
+ overview: string;
140
+ outcomes: string[];
141
+ outline: string[];
142
+ topics: string[];
143
+ nodeIds: string[];
144
+ practice: string;
145
+ assessment: string;
146
+ minutes: {
147
+ min: number;
148
+ max: number;
149
+ };
150
+ }[];
151
+ edges: {
152
+ from: string;
153
+ to: string;
154
+ kind: "optional" | "required";
155
+ }[];
156
+ assumptions: string[];
157
+ changeReason: string;
158
+ }[];
159
+ acceptedVersion: number | null;
160
+ requests: {
161
+ id: string;
162
+ sessionId: string;
163
+ kind: "diagnosis" | "plan";
164
+ briefRevision: number;
165
+ createdAt: string;
166
+ prompted: boolean;
167
+ reason: string | null;
168
+ failure?: string | null | undefined;
169
+ }[];
170
+ updatedAt: string;
171
+ }>;
172
+ export declare function proposeCurriculum(state: UdState, courseId: string, sessionId: string, expectedRevision: number, raw: unknown): Promise<{
173
+ courseId: string;
174
+ revision: number;
175
+ briefRevision: number;
176
+ assessmentRevision: number;
177
+ brief: {
178
+ purpose: string;
179
+ outcomes: string[];
180
+ background: string;
181
+ timeZone: string;
182
+ targetDate: string | null;
183
+ durationWeeks: number | null;
184
+ deadline: "none" | "flexible" | "fixed";
185
+ weeklyMinutes: number | null;
186
+ sessionMinutes: number | null;
187
+ preferences: string;
188
+ } | null;
189
+ assessment: {
190
+ status: "ready" | "in-progress" | "skipped";
191
+ summary: string;
192
+ strengths: string[];
193
+ gaps: string[];
194
+ uncertainties: string[];
195
+ evidence: {
196
+ nodeId: string;
197
+ evidenceIndex: number;
198
+ }[];
199
+ briefRevision: number;
200
+ sessionId: string;
201
+ updatedAt: string;
202
+ } | null;
203
+ curricula: {
204
+ version: number;
205
+ briefRevision: number;
206
+ assessmentRevision: number;
207
+ createdAt: string;
208
+ acceptedAt: string | null;
209
+ title: string;
210
+ summary: string;
211
+ modules: {
212
+ id: string;
213
+ title: string;
214
+ overview: string;
215
+ outcomes: string[];
216
+ milestone: string;
217
+ }[];
218
+ items: {
219
+ id: string;
220
+ moduleId: string;
221
+ title: string;
222
+ overview: string;
223
+ outcomes: string[];
224
+ outline: string[];
225
+ topics: string[];
226
+ nodeIds: string[];
227
+ practice: string;
228
+ assessment: string;
229
+ minutes: {
230
+ min: number;
231
+ max: number;
232
+ };
233
+ }[];
234
+ edges: {
235
+ from: string;
236
+ to: string;
237
+ kind: "optional" | "required";
238
+ }[];
239
+ assumptions: string[];
240
+ changeReason: string;
241
+ }[];
242
+ acceptedVersion: number | null;
243
+ requests: {
244
+ id: string;
245
+ sessionId: string;
246
+ kind: "diagnosis" | "plan";
247
+ briefRevision: number;
248
+ createdAt: string;
249
+ prompted: boolean;
250
+ reason: string | null;
251
+ failure?: string | null | undefined;
252
+ }[];
253
+ updatedAt: string;
254
+ }>;
255
+ export declare function acceptCurriculum(state: UdState, courseId: string, sessionId: string, expectedRevision: number, version: number): Promise<{
256
+ courseId: string;
257
+ revision: number;
258
+ briefRevision: number;
259
+ assessmentRevision: number;
260
+ brief: {
261
+ purpose: string;
262
+ outcomes: string[];
263
+ background: string;
264
+ timeZone: string;
265
+ targetDate: string | null;
266
+ durationWeeks: number | null;
267
+ deadline: "none" | "flexible" | "fixed";
268
+ weeklyMinutes: number | null;
269
+ sessionMinutes: number | null;
270
+ preferences: string;
271
+ } | null;
272
+ assessment: {
273
+ status: "ready" | "in-progress" | "skipped";
274
+ summary: string;
275
+ strengths: string[];
276
+ gaps: string[];
277
+ uncertainties: string[];
278
+ evidence: {
279
+ nodeId: string;
280
+ evidenceIndex: number;
281
+ }[];
282
+ briefRevision: number;
283
+ sessionId: string;
284
+ updatedAt: string;
285
+ } | null;
286
+ curricula: {
287
+ version: number;
288
+ briefRevision: number;
289
+ assessmentRevision: number;
290
+ createdAt: string;
291
+ acceptedAt: string | null;
292
+ title: string;
293
+ summary: string;
294
+ modules: {
295
+ id: string;
296
+ title: string;
297
+ overview: string;
298
+ outcomes: string[];
299
+ milestone: string;
300
+ }[];
301
+ items: {
302
+ id: string;
303
+ moduleId: string;
304
+ title: string;
305
+ overview: string;
306
+ outcomes: string[];
307
+ outline: string[];
308
+ topics: string[];
309
+ nodeIds: string[];
310
+ practice: string;
311
+ assessment: string;
312
+ minutes: {
313
+ min: number;
314
+ max: number;
315
+ };
316
+ }[];
317
+ edges: {
318
+ from: string;
319
+ to: string;
320
+ kind: "optional" | "required";
321
+ }[];
322
+ assumptions: string[];
323
+ changeReason: string;
324
+ }[];
325
+ acceptedVersion: number | null;
326
+ requests: {
327
+ id: string;
328
+ sessionId: string;
329
+ kind: "diagnosis" | "plan";
330
+ briefRevision: number;
331
+ createdAt: string;
332
+ prompted: boolean;
333
+ reason: string | null;
334
+ failure?: string | null | undefined;
335
+ }[];
336
+ updatedAt: string;
337
+ }>;
338
+ export declare function reservePathRequest(state: UdState, input: {
339
+ courseId: string;
340
+ sessionId: string;
341
+ expectedRevision: number;
342
+ kind: 'diagnosis' | 'plan';
343
+ operationId: string;
344
+ }): Promise<{
345
+ shouldPrompt: boolean;
346
+ prompt: string;
347
+ request: {
348
+ id: string;
349
+ sessionId: string;
350
+ kind: "diagnosis" | "plan";
351
+ briefRevision: number;
352
+ createdAt: string;
353
+ prompted: boolean;
354
+ reason: string | null;
355
+ failure?: string | null | undefined;
356
+ };
357
+ }>;
358
+ /**
359
+ * Record that the tutor turn behind a path request failed.
360
+ *
361
+ * The browser's own session snapshot is memory-only, so it cannot explain a
362
+ * failed turn after a restart. This stamps the durable request record instead:
363
+ * only the newest prompted request from that conversation, and only while its
364
+ * result is still missing. A diagnosis that was already recorded, or another
365
+ * conversation's request, is never touched — a later unrelated agent error in
366
+ * the same chat must not mislabel a finished diagnosis.
367
+ *
368
+ * @param state - state handle.
369
+ * @param sessionId - the conversation whose turn failed.
370
+ * @param reason - the error message shown to the learner.
371
+ */
372
+ export declare function stampPathRequestFailure(state: UdState, sessionId: string, reason: string): Promise<void>;
373
+ export declare function stampPathRequest(state: UdState, courseId: string, sessionId: string, id: string, prompted: boolean, reason?: string): Promise<void>;
374
+ export interface BeginItemInput {
375
+ courseId: string;
376
+ sessionId: string;
377
+ expectedRevision: number;
378
+ version: number;
379
+ itemId: string;
380
+ operationId: string;
381
+ review?: boolean | undefined;
382
+ resume?: boolean | undefined;
383
+ checkin?: boolean | undefined;
384
+ teachBack?: boolean | undefined;
385
+ }
386
+ export declare function beginCourseItem(state: UdState, input: BeginItemInput): Promise<{
387
+ run: {
388
+ courseId: string;
389
+ sessionId: string;
390
+ revision: number;
391
+ activeAttemptId: string | null;
392
+ attempts: {
393
+ id: string;
394
+ operationId: string;
395
+ operations: string[];
396
+ dispatchId: string | null;
397
+ version: number;
398
+ itemId: string;
399
+ status: "requested" | "working" | "completed" | "interrupted";
400
+ nodeId: string | null;
401
+ startedAt: string;
402
+ updatedAt: string;
403
+ prompted: boolean;
404
+ promptReason: string | null;
405
+ outcome: string | null;
406
+ evidence: {
407
+ nodeId: string;
408
+ evidenceIndex: number;
409
+ }[];
410
+ units: {
411
+ id: string;
412
+ writtenAt: string;
413
+ lesson: {
414
+ id: string;
415
+ courseId: string;
416
+ nodeId: string;
417
+ title: string;
418
+ blocks: ({
419
+ type: "text";
420
+ content: {
421
+ md: string;
422
+ math?: {
423
+ tex: string;
424
+ display: boolean;
425
+ mathml: string;
426
+ }[] | undefined;
427
+ };
428
+ id: string;
429
+ metadata?: Record<string, unknown> | undefined;
430
+ sourceRefs?: {
431
+ sourceId: string;
432
+ locator: string;
433
+ }[] | undefined;
434
+ } | {
435
+ type: "example";
436
+ content: {
437
+ title: string;
438
+ steps: string[];
439
+ takeaway?: string | undefined;
440
+ };
441
+ id: string;
442
+ metadata?: Record<string, unknown> | undefined;
443
+ sourceRefs?: {
444
+ sourceId: string;
445
+ locator: string;
446
+ }[] | undefined;
447
+ } | {
448
+ type: "diagram";
449
+ content: {
450
+ format: "ascii" | "mermaid";
451
+ spec: string;
452
+ caption?: string | undefined;
453
+ };
454
+ id: string;
455
+ metadata?: Record<string, unknown> | undefined;
456
+ sourceRefs?: {
457
+ sourceId: string;
458
+ locator: string;
459
+ }[] | undefined;
460
+ } | {
461
+ type: "check";
462
+ content: {
463
+ prompt: string;
464
+ expect?: "reasoning" | "answer" | undefined;
465
+ hint?: string | undefined;
466
+ };
467
+ id: string;
468
+ metadata?: Record<string, unknown> | undefined;
469
+ sourceRefs?: {
470
+ sourceId: string;
471
+ locator: string;
472
+ }[] | undefined;
473
+ } | {
474
+ type: "formula";
475
+ content: {
476
+ tex: string;
477
+ display?: boolean | undefined;
478
+ mathml?: string | undefined;
479
+ caption?: string | undefined;
480
+ };
481
+ id: string;
482
+ metadata?: Record<string, unknown> | undefined;
483
+ sourceRefs?: {
484
+ sourceId: string;
485
+ locator: string;
486
+ }[] | undefined;
487
+ } | {
488
+ type: "code";
489
+ content: {
490
+ source: string;
491
+ language?: string | undefined;
492
+ caption?: string | undefined;
493
+ };
494
+ id: string;
495
+ metadata?: Record<string, unknown> | undefined;
496
+ sourceRefs?: {
497
+ sourceId: string;
498
+ locator: string;
499
+ }[] | undefined;
500
+ } | {
501
+ type: "quiz";
502
+ content: {
503
+ questions: {
504
+ id: string;
505
+ kind: "mcq" | "short";
506
+ prompt: string;
507
+ options?: string[] | undefined;
508
+ answer?: string | undefined;
509
+ rubric?: string | undefined;
510
+ explanation?: string | undefined;
511
+ }[];
512
+ title?: string | undefined;
513
+ };
514
+ id: string;
515
+ metadata?: Record<string, unknown> | undefined;
516
+ sourceRefs?: {
517
+ sourceId: string;
518
+ locator: string;
519
+ }[] | undefined;
520
+ } | {
521
+ type: "flashcard";
522
+ content: {
523
+ front: string;
524
+ back: string;
525
+ tags?: string[] | undefined;
526
+ };
527
+ id: string;
528
+ metadata?: Record<string, unknown> | undefined;
529
+ sourceRefs?: {
530
+ sourceId: string;
531
+ locator: string;
532
+ }[] | undefined;
533
+ } | {
534
+ type: "resource";
535
+ content: {
536
+ title: string;
537
+ sourceId?: string | undefined;
538
+ locator?: string | undefined;
539
+ url?: string | undefined;
540
+ note?: string | undefined;
541
+ };
542
+ id: string;
543
+ metadata?: Record<string, unknown> | undefined;
544
+ sourceRefs?: {
545
+ sourceId: string;
546
+ locator: string;
547
+ }[] | undefined;
548
+ } | {
549
+ type: "comparison";
550
+ content: {
551
+ columns: string[];
552
+ rows: string[][];
553
+ caption?: string | undefined;
554
+ };
555
+ id: string;
556
+ metadata?: Record<string, unknown> | undefined;
557
+ sourceRefs?: {
558
+ sourceId: string;
559
+ locator: string;
560
+ }[] | undefined;
561
+ } | {
562
+ id: string;
563
+ type: string;
564
+ content: unknown;
565
+ metadata?: Record<string, unknown> | undefined;
566
+ sourceRefs?: {
567
+ sourceId: string;
568
+ locator: string;
569
+ }[] | undefined;
570
+ })[];
571
+ origin: "prototype" | "tutor";
572
+ createdAt: string;
573
+ updatedAt: string;
574
+ };
575
+ }[];
576
+ responses?: {
577
+ id: string;
578
+ blockId: string;
579
+ kind: "quiz" | "flashcard";
580
+ answers: {
581
+ questionId: string;
582
+ value: string;
583
+ }[];
584
+ submittedAt: string;
585
+ }[] | undefined;
586
+ }[];
587
+ updatedAt: string;
588
+ };
589
+ attempt: {
590
+ id: string;
591
+ operationId: string;
592
+ operations: string[];
593
+ dispatchId: string | null;
594
+ version: number;
595
+ itemId: string;
596
+ status: "requested" | "working" | "completed" | "interrupted";
597
+ nodeId: string | null;
598
+ startedAt: string;
599
+ updatedAt: string;
600
+ prompted: boolean;
601
+ promptReason: string | null;
602
+ outcome: string | null;
603
+ evidence: {
604
+ nodeId: string;
605
+ evidenceIndex: number;
606
+ }[];
607
+ units: {
608
+ id: string;
609
+ writtenAt: string;
610
+ lesson: {
611
+ id: string;
612
+ courseId: string;
613
+ nodeId: string;
614
+ title: string;
615
+ blocks: ({
616
+ type: "text";
617
+ content: {
618
+ md: string;
619
+ math?: {
620
+ tex: string;
621
+ display: boolean;
622
+ mathml: string;
623
+ }[] | undefined;
624
+ };
625
+ id: string;
626
+ metadata?: Record<string, unknown> | undefined;
627
+ sourceRefs?: {
628
+ sourceId: string;
629
+ locator: string;
630
+ }[] | undefined;
631
+ } | {
632
+ type: "example";
633
+ content: {
634
+ title: string;
635
+ steps: string[];
636
+ takeaway?: string | undefined;
637
+ };
638
+ id: string;
639
+ metadata?: Record<string, unknown> | undefined;
640
+ sourceRefs?: {
641
+ sourceId: string;
642
+ locator: string;
643
+ }[] | undefined;
644
+ } | {
645
+ type: "diagram";
646
+ content: {
647
+ format: "ascii" | "mermaid";
648
+ spec: string;
649
+ caption?: string | undefined;
650
+ };
651
+ id: string;
652
+ metadata?: Record<string, unknown> | undefined;
653
+ sourceRefs?: {
654
+ sourceId: string;
655
+ locator: string;
656
+ }[] | undefined;
657
+ } | {
658
+ type: "check";
659
+ content: {
660
+ prompt: string;
661
+ expect?: "reasoning" | "answer" | undefined;
662
+ hint?: string | undefined;
663
+ };
664
+ id: string;
665
+ metadata?: Record<string, unknown> | undefined;
666
+ sourceRefs?: {
667
+ sourceId: string;
668
+ locator: string;
669
+ }[] | undefined;
670
+ } | {
671
+ type: "formula";
672
+ content: {
673
+ tex: string;
674
+ display?: boolean | undefined;
675
+ mathml?: string | undefined;
676
+ caption?: string | undefined;
677
+ };
678
+ id: string;
679
+ metadata?: Record<string, unknown> | undefined;
680
+ sourceRefs?: {
681
+ sourceId: string;
682
+ locator: string;
683
+ }[] | undefined;
684
+ } | {
685
+ type: "code";
686
+ content: {
687
+ source: string;
688
+ language?: string | undefined;
689
+ caption?: string | undefined;
690
+ };
691
+ id: string;
692
+ metadata?: Record<string, unknown> | undefined;
693
+ sourceRefs?: {
694
+ sourceId: string;
695
+ locator: string;
696
+ }[] | undefined;
697
+ } | {
698
+ type: "quiz";
699
+ content: {
700
+ questions: {
701
+ id: string;
702
+ kind: "mcq" | "short";
703
+ prompt: string;
704
+ options?: string[] | undefined;
705
+ answer?: string | undefined;
706
+ rubric?: string | undefined;
707
+ explanation?: string | undefined;
708
+ }[];
709
+ title?: string | undefined;
710
+ };
711
+ id: string;
712
+ metadata?: Record<string, unknown> | undefined;
713
+ sourceRefs?: {
714
+ sourceId: string;
715
+ locator: string;
716
+ }[] | undefined;
717
+ } | {
718
+ type: "flashcard";
719
+ content: {
720
+ front: string;
721
+ back: string;
722
+ tags?: string[] | undefined;
723
+ };
724
+ id: string;
725
+ metadata?: Record<string, unknown> | undefined;
726
+ sourceRefs?: {
727
+ sourceId: string;
728
+ locator: string;
729
+ }[] | undefined;
730
+ } | {
731
+ type: "resource";
732
+ content: {
733
+ title: string;
734
+ sourceId?: string | undefined;
735
+ locator?: string | undefined;
736
+ url?: string | undefined;
737
+ note?: string | undefined;
738
+ };
739
+ id: string;
740
+ metadata?: Record<string, unknown> | undefined;
741
+ sourceRefs?: {
742
+ sourceId: string;
743
+ locator: string;
744
+ }[] | undefined;
745
+ } | {
746
+ type: "comparison";
747
+ content: {
748
+ columns: string[];
749
+ rows: string[][];
750
+ caption?: string | undefined;
751
+ };
752
+ id: string;
753
+ metadata?: Record<string, unknown> | undefined;
754
+ sourceRefs?: {
755
+ sourceId: string;
756
+ locator: string;
757
+ }[] | undefined;
758
+ } | {
759
+ id: string;
760
+ type: string;
761
+ content: unknown;
762
+ metadata?: Record<string, unknown> | undefined;
763
+ sourceRefs?: {
764
+ sourceId: string;
765
+ locator: string;
766
+ }[] | undefined;
767
+ })[];
768
+ origin: "prototype" | "tutor";
769
+ createdAt: string;
770
+ updatedAt: string;
771
+ };
772
+ }[];
773
+ responses?: {
774
+ id: string;
775
+ blockId: string;
776
+ kind: "quiz" | "flashcard";
777
+ answers: {
778
+ questionId: string;
779
+ value: string;
780
+ }[];
781
+ submittedAt: string;
782
+ }[] | undefined;
783
+ };
784
+ shouldPrompt: boolean;
785
+ prompt: string;
786
+ }>;
787
+ export interface PauseItemInput {
788
+ courseId: string;
789
+ sessionId: string;
790
+ expectedRevision: number;
791
+ }
792
+ /** Mark the current attempt paused without ending it. `interrupted` is the existing attempt state. */
793
+ export declare function pauseCourseItem(state: UdState, input: PauseItemInput): Promise<PathView>;
794
+ export declare function stampCoursePrompt(state: UdState, input: BeginItemInput, attemptId: string, prompted: boolean, reason?: string): Promise<void>;
795
+ export declare function requireAttempt(state: UdState, courseId: string, sessionId: string | undefined, attemptId: string): {
796
+ id: string;
797
+ operationId: string;
798
+ operations: string[];
799
+ dispatchId: string | null;
800
+ version: number;
801
+ itemId: string;
802
+ status: "requested" | "working" | "completed" | "interrupted";
803
+ nodeId: string | null;
804
+ startedAt: string;
805
+ updatedAt: string;
806
+ prompted: boolean;
807
+ promptReason: string | null;
808
+ outcome: string | null;
809
+ evidence: {
810
+ nodeId: string;
811
+ evidenceIndex: number;
812
+ }[];
813
+ units: {
814
+ id: string;
815
+ writtenAt: string;
816
+ lesson: {
817
+ id: string;
818
+ courseId: string;
819
+ nodeId: string;
820
+ title: string;
821
+ blocks: ({
822
+ type: "text";
823
+ content: {
824
+ md: string;
825
+ math?: {
826
+ tex: string;
827
+ display: boolean;
828
+ mathml: string;
829
+ }[] | undefined;
830
+ };
831
+ id: string;
832
+ metadata?: Record<string, unknown> | undefined;
833
+ sourceRefs?: {
834
+ sourceId: string;
835
+ locator: string;
836
+ }[] | undefined;
837
+ } | {
838
+ type: "example";
839
+ content: {
840
+ title: string;
841
+ steps: string[];
842
+ takeaway?: string | undefined;
843
+ };
844
+ id: string;
845
+ metadata?: Record<string, unknown> | undefined;
846
+ sourceRefs?: {
847
+ sourceId: string;
848
+ locator: string;
849
+ }[] | undefined;
850
+ } | {
851
+ type: "diagram";
852
+ content: {
853
+ format: "ascii" | "mermaid";
854
+ spec: string;
855
+ caption?: string | undefined;
856
+ };
857
+ id: string;
858
+ metadata?: Record<string, unknown> | undefined;
859
+ sourceRefs?: {
860
+ sourceId: string;
861
+ locator: string;
862
+ }[] | undefined;
863
+ } | {
864
+ type: "check";
865
+ content: {
866
+ prompt: string;
867
+ expect?: "reasoning" | "answer" | undefined;
868
+ hint?: string | undefined;
869
+ };
870
+ id: string;
871
+ metadata?: Record<string, unknown> | undefined;
872
+ sourceRefs?: {
873
+ sourceId: string;
874
+ locator: string;
875
+ }[] | undefined;
876
+ } | {
877
+ type: "formula";
878
+ content: {
879
+ tex: string;
880
+ display?: boolean | undefined;
881
+ mathml?: string | undefined;
882
+ caption?: string | undefined;
883
+ };
884
+ id: string;
885
+ metadata?: Record<string, unknown> | undefined;
886
+ sourceRefs?: {
887
+ sourceId: string;
888
+ locator: string;
889
+ }[] | undefined;
890
+ } | {
891
+ type: "code";
892
+ content: {
893
+ source: string;
894
+ language?: string | undefined;
895
+ caption?: string | undefined;
896
+ };
897
+ id: string;
898
+ metadata?: Record<string, unknown> | undefined;
899
+ sourceRefs?: {
900
+ sourceId: string;
901
+ locator: string;
902
+ }[] | undefined;
903
+ } | {
904
+ type: "quiz";
905
+ content: {
906
+ questions: {
907
+ id: string;
908
+ kind: "mcq" | "short";
909
+ prompt: string;
910
+ options?: string[] | undefined;
911
+ answer?: string | undefined;
912
+ rubric?: string | undefined;
913
+ explanation?: string | undefined;
914
+ }[];
915
+ title?: string | undefined;
916
+ };
917
+ id: string;
918
+ metadata?: Record<string, unknown> | undefined;
919
+ sourceRefs?: {
920
+ sourceId: string;
921
+ locator: string;
922
+ }[] | undefined;
923
+ } | {
924
+ type: "flashcard";
925
+ content: {
926
+ front: string;
927
+ back: string;
928
+ tags?: string[] | undefined;
929
+ };
930
+ id: string;
931
+ metadata?: Record<string, unknown> | undefined;
932
+ sourceRefs?: {
933
+ sourceId: string;
934
+ locator: string;
935
+ }[] | undefined;
936
+ } | {
937
+ type: "resource";
938
+ content: {
939
+ title: string;
940
+ sourceId?: string | undefined;
941
+ locator?: string | undefined;
942
+ url?: string | undefined;
943
+ note?: string | undefined;
944
+ };
945
+ id: string;
946
+ metadata?: Record<string, unknown> | undefined;
947
+ sourceRefs?: {
948
+ sourceId: string;
949
+ locator: string;
950
+ }[] | undefined;
951
+ } | {
952
+ type: "comparison";
953
+ content: {
954
+ columns: string[];
955
+ rows: string[][];
956
+ caption?: string | undefined;
957
+ };
958
+ id: string;
959
+ metadata?: Record<string, unknown> | undefined;
960
+ sourceRefs?: {
961
+ sourceId: string;
962
+ locator: string;
963
+ }[] | undefined;
964
+ } | {
965
+ id: string;
966
+ type: string;
967
+ content: unknown;
968
+ metadata?: Record<string, unknown> | undefined;
969
+ sourceRefs?: {
970
+ sourceId: string;
971
+ locator: string;
972
+ }[] | undefined;
973
+ })[];
974
+ origin: "prototype" | "tutor";
975
+ createdAt: string;
976
+ updatedAt: string;
977
+ };
978
+ }[];
979
+ responses?: {
980
+ id: string;
981
+ blockId: string;
982
+ kind: "quiz" | "flashcard";
983
+ answers: {
984
+ questionId: string;
985
+ value: string;
986
+ }[];
987
+ submittedAt: string;
988
+ }[] | undefined;
989
+ };
990
+ export declare function bindCourseNode(state: UdState, courseId: string, sessionId: string, attemptId: string, nodeId: string): Promise<void>;
991
+ export declare function recordCourseTeaching(state: UdState, courseId: string, sessionId: string, attemptId: string, lesson: LessonRecord): Promise<{
992
+ courseId: string;
993
+ sessionId: string;
994
+ revision: number;
995
+ activeAttemptId: string | null;
996
+ attempts: {
997
+ id: string;
998
+ operationId: string;
999
+ operations: string[];
1000
+ dispatchId: string | null;
1001
+ version: number;
1002
+ itemId: string;
1003
+ status: "requested" | "working" | "completed" | "interrupted";
1004
+ nodeId: string | null;
1005
+ startedAt: string;
1006
+ updatedAt: string;
1007
+ prompted: boolean;
1008
+ promptReason: string | null;
1009
+ outcome: string | null;
1010
+ evidence: {
1011
+ nodeId: string;
1012
+ evidenceIndex: number;
1013
+ }[];
1014
+ units: {
1015
+ id: string;
1016
+ writtenAt: string;
1017
+ lesson: {
1018
+ id: string;
1019
+ courseId: string;
1020
+ nodeId: string;
1021
+ title: string;
1022
+ blocks: ({
1023
+ type: "text";
1024
+ content: {
1025
+ md: string;
1026
+ math?: {
1027
+ tex: string;
1028
+ display: boolean;
1029
+ mathml: string;
1030
+ }[] | undefined;
1031
+ };
1032
+ id: string;
1033
+ metadata?: Record<string, unknown> | undefined;
1034
+ sourceRefs?: {
1035
+ sourceId: string;
1036
+ locator: string;
1037
+ }[] | undefined;
1038
+ } | {
1039
+ type: "example";
1040
+ content: {
1041
+ title: string;
1042
+ steps: string[];
1043
+ takeaway?: string | undefined;
1044
+ };
1045
+ id: string;
1046
+ metadata?: Record<string, unknown> | undefined;
1047
+ sourceRefs?: {
1048
+ sourceId: string;
1049
+ locator: string;
1050
+ }[] | undefined;
1051
+ } | {
1052
+ type: "diagram";
1053
+ content: {
1054
+ format: "ascii" | "mermaid";
1055
+ spec: string;
1056
+ caption?: string | undefined;
1057
+ };
1058
+ id: string;
1059
+ metadata?: Record<string, unknown> | undefined;
1060
+ sourceRefs?: {
1061
+ sourceId: string;
1062
+ locator: string;
1063
+ }[] | undefined;
1064
+ } | {
1065
+ type: "check";
1066
+ content: {
1067
+ prompt: string;
1068
+ expect?: "reasoning" | "answer" | undefined;
1069
+ hint?: string | undefined;
1070
+ };
1071
+ id: string;
1072
+ metadata?: Record<string, unknown> | undefined;
1073
+ sourceRefs?: {
1074
+ sourceId: string;
1075
+ locator: string;
1076
+ }[] | undefined;
1077
+ } | {
1078
+ type: "formula";
1079
+ content: {
1080
+ tex: string;
1081
+ display?: boolean | undefined;
1082
+ mathml?: string | undefined;
1083
+ caption?: string | undefined;
1084
+ };
1085
+ id: string;
1086
+ metadata?: Record<string, unknown> | undefined;
1087
+ sourceRefs?: {
1088
+ sourceId: string;
1089
+ locator: string;
1090
+ }[] | undefined;
1091
+ } | {
1092
+ type: "code";
1093
+ content: {
1094
+ source: string;
1095
+ language?: string | undefined;
1096
+ caption?: string | undefined;
1097
+ };
1098
+ id: string;
1099
+ metadata?: Record<string, unknown> | undefined;
1100
+ sourceRefs?: {
1101
+ sourceId: string;
1102
+ locator: string;
1103
+ }[] | undefined;
1104
+ } | {
1105
+ type: "quiz";
1106
+ content: {
1107
+ questions: {
1108
+ id: string;
1109
+ kind: "mcq" | "short";
1110
+ prompt: string;
1111
+ options?: string[] | undefined;
1112
+ answer?: string | undefined;
1113
+ rubric?: string | undefined;
1114
+ explanation?: string | undefined;
1115
+ }[];
1116
+ title?: string | undefined;
1117
+ };
1118
+ id: string;
1119
+ metadata?: Record<string, unknown> | undefined;
1120
+ sourceRefs?: {
1121
+ sourceId: string;
1122
+ locator: string;
1123
+ }[] | undefined;
1124
+ } | {
1125
+ type: "flashcard";
1126
+ content: {
1127
+ front: string;
1128
+ back: string;
1129
+ tags?: string[] | undefined;
1130
+ };
1131
+ id: string;
1132
+ metadata?: Record<string, unknown> | undefined;
1133
+ sourceRefs?: {
1134
+ sourceId: string;
1135
+ locator: string;
1136
+ }[] | undefined;
1137
+ } | {
1138
+ type: "resource";
1139
+ content: {
1140
+ title: string;
1141
+ sourceId?: string | undefined;
1142
+ locator?: string | undefined;
1143
+ url?: string | undefined;
1144
+ note?: string | undefined;
1145
+ };
1146
+ id: string;
1147
+ metadata?: Record<string, unknown> | undefined;
1148
+ sourceRefs?: {
1149
+ sourceId: string;
1150
+ locator: string;
1151
+ }[] | undefined;
1152
+ } | {
1153
+ type: "comparison";
1154
+ content: {
1155
+ columns: string[];
1156
+ rows: string[][];
1157
+ caption?: string | undefined;
1158
+ };
1159
+ id: string;
1160
+ metadata?: Record<string, unknown> | undefined;
1161
+ sourceRefs?: {
1162
+ sourceId: string;
1163
+ locator: string;
1164
+ }[] | undefined;
1165
+ } | {
1166
+ id: string;
1167
+ type: string;
1168
+ content: unknown;
1169
+ metadata?: Record<string, unknown> | undefined;
1170
+ sourceRefs?: {
1171
+ sourceId: string;
1172
+ locator: string;
1173
+ }[] | undefined;
1174
+ })[];
1175
+ origin: "prototype" | "tutor";
1176
+ createdAt: string;
1177
+ updatedAt: string;
1178
+ };
1179
+ }[];
1180
+ responses?: {
1181
+ id: string;
1182
+ blockId: string;
1183
+ kind: "quiz" | "flashcard";
1184
+ answers: {
1185
+ questionId: string;
1186
+ value: string;
1187
+ }[];
1188
+ submittedAt: string;
1189
+ }[] | undefined;
1190
+ }[];
1191
+ updatedAt: string;
1192
+ }>;
1193
+ /** Merge against the latest committed unit while holding the run/project queue. The builder must not enqueue writes. */
1194
+ export declare function writeCourseTeaching(state: UdState, courseId: string, sessionId: string, attemptId: string, nodeId: string, build: (current: LessonRecord | undefined) => LessonRecord): Promise<{
1195
+ id: string;
1196
+ courseId: string;
1197
+ nodeId: string;
1198
+ title: string;
1199
+ blocks: ({
1200
+ type: "text";
1201
+ content: {
1202
+ md: string;
1203
+ math?: {
1204
+ tex: string;
1205
+ display: boolean;
1206
+ mathml: string;
1207
+ }[] | undefined;
1208
+ };
1209
+ id: string;
1210
+ metadata?: Record<string, unknown> | undefined;
1211
+ sourceRefs?: {
1212
+ sourceId: string;
1213
+ locator: string;
1214
+ }[] | undefined;
1215
+ } | {
1216
+ type: "example";
1217
+ content: {
1218
+ title: string;
1219
+ steps: string[];
1220
+ takeaway?: string | undefined;
1221
+ };
1222
+ id: string;
1223
+ metadata?: Record<string, unknown> | undefined;
1224
+ sourceRefs?: {
1225
+ sourceId: string;
1226
+ locator: string;
1227
+ }[] | undefined;
1228
+ } | {
1229
+ type: "diagram";
1230
+ content: {
1231
+ format: "ascii" | "mermaid";
1232
+ spec: string;
1233
+ caption?: string | undefined;
1234
+ };
1235
+ id: string;
1236
+ metadata?: Record<string, unknown> | undefined;
1237
+ sourceRefs?: {
1238
+ sourceId: string;
1239
+ locator: string;
1240
+ }[] | undefined;
1241
+ } | {
1242
+ type: "check";
1243
+ content: {
1244
+ prompt: string;
1245
+ expect?: "reasoning" | "answer" | undefined;
1246
+ hint?: string | undefined;
1247
+ };
1248
+ id: string;
1249
+ metadata?: Record<string, unknown> | undefined;
1250
+ sourceRefs?: {
1251
+ sourceId: string;
1252
+ locator: string;
1253
+ }[] | undefined;
1254
+ } | {
1255
+ type: "formula";
1256
+ content: {
1257
+ tex: string;
1258
+ display?: boolean | undefined;
1259
+ mathml?: string | undefined;
1260
+ caption?: string | undefined;
1261
+ };
1262
+ id: string;
1263
+ metadata?: Record<string, unknown> | undefined;
1264
+ sourceRefs?: {
1265
+ sourceId: string;
1266
+ locator: string;
1267
+ }[] | undefined;
1268
+ } | {
1269
+ type: "code";
1270
+ content: {
1271
+ source: string;
1272
+ language?: string | undefined;
1273
+ caption?: string | undefined;
1274
+ };
1275
+ id: string;
1276
+ metadata?: Record<string, unknown> | undefined;
1277
+ sourceRefs?: {
1278
+ sourceId: string;
1279
+ locator: string;
1280
+ }[] | undefined;
1281
+ } | {
1282
+ type: "quiz";
1283
+ content: {
1284
+ questions: {
1285
+ id: string;
1286
+ kind: "mcq" | "short";
1287
+ prompt: string;
1288
+ options?: string[] | undefined;
1289
+ answer?: string | undefined;
1290
+ rubric?: string | undefined;
1291
+ explanation?: string | undefined;
1292
+ }[];
1293
+ title?: string | undefined;
1294
+ };
1295
+ id: string;
1296
+ metadata?: Record<string, unknown> | undefined;
1297
+ sourceRefs?: {
1298
+ sourceId: string;
1299
+ locator: string;
1300
+ }[] | undefined;
1301
+ } | {
1302
+ type: "flashcard";
1303
+ content: {
1304
+ front: string;
1305
+ back: string;
1306
+ tags?: string[] | undefined;
1307
+ };
1308
+ id: string;
1309
+ metadata?: Record<string, unknown> | undefined;
1310
+ sourceRefs?: {
1311
+ sourceId: string;
1312
+ locator: string;
1313
+ }[] | undefined;
1314
+ } | {
1315
+ type: "resource";
1316
+ content: {
1317
+ title: string;
1318
+ sourceId?: string | undefined;
1319
+ locator?: string | undefined;
1320
+ url?: string | undefined;
1321
+ note?: string | undefined;
1322
+ };
1323
+ id: string;
1324
+ metadata?: Record<string, unknown> | undefined;
1325
+ sourceRefs?: {
1326
+ sourceId: string;
1327
+ locator: string;
1328
+ }[] | undefined;
1329
+ } | {
1330
+ type: "comparison";
1331
+ content: {
1332
+ columns: string[];
1333
+ rows: string[][];
1334
+ caption?: string | undefined;
1335
+ };
1336
+ id: string;
1337
+ metadata?: Record<string, unknown> | undefined;
1338
+ sourceRefs?: {
1339
+ sourceId: string;
1340
+ locator: string;
1341
+ }[] | undefined;
1342
+ } | {
1343
+ id: string;
1344
+ type: string;
1345
+ content: unknown;
1346
+ metadata?: Record<string, unknown> | undefined;
1347
+ sourceRefs?: {
1348
+ sourceId: string;
1349
+ locator: string;
1350
+ }[] | undefined;
1351
+ })[];
1352
+ origin: "prototype" | "tutor";
1353
+ createdAt: string;
1354
+ updatedAt: string;
1355
+ }>;
1356
+ export declare function completeCourseItem(state: UdState, courseId: string, sessionId: string, attemptId: string, reason: string, rawRefs: unknown): Promise<{
1357
+ courseId: string;
1358
+ sessionId: string;
1359
+ revision: number;
1360
+ activeAttemptId: string | null;
1361
+ attempts: {
1362
+ id: string;
1363
+ operationId: string;
1364
+ operations: string[];
1365
+ dispatchId: string | null;
1366
+ version: number;
1367
+ itemId: string;
1368
+ status: "requested" | "working" | "completed" | "interrupted";
1369
+ nodeId: string | null;
1370
+ startedAt: string;
1371
+ updatedAt: string;
1372
+ prompted: boolean;
1373
+ promptReason: string | null;
1374
+ outcome: string | null;
1375
+ evidence: {
1376
+ nodeId: string;
1377
+ evidenceIndex: number;
1378
+ }[];
1379
+ units: {
1380
+ id: string;
1381
+ writtenAt: string;
1382
+ lesson: {
1383
+ id: string;
1384
+ courseId: string;
1385
+ nodeId: string;
1386
+ title: string;
1387
+ blocks: ({
1388
+ type: "text";
1389
+ content: {
1390
+ md: string;
1391
+ math?: {
1392
+ tex: string;
1393
+ display: boolean;
1394
+ mathml: string;
1395
+ }[] | undefined;
1396
+ };
1397
+ id: string;
1398
+ metadata?: Record<string, unknown> | undefined;
1399
+ sourceRefs?: {
1400
+ sourceId: string;
1401
+ locator: string;
1402
+ }[] | undefined;
1403
+ } | {
1404
+ type: "example";
1405
+ content: {
1406
+ title: string;
1407
+ steps: string[];
1408
+ takeaway?: string | undefined;
1409
+ };
1410
+ id: string;
1411
+ metadata?: Record<string, unknown> | undefined;
1412
+ sourceRefs?: {
1413
+ sourceId: string;
1414
+ locator: string;
1415
+ }[] | undefined;
1416
+ } | {
1417
+ type: "diagram";
1418
+ content: {
1419
+ format: "ascii" | "mermaid";
1420
+ spec: string;
1421
+ caption?: string | undefined;
1422
+ };
1423
+ id: string;
1424
+ metadata?: Record<string, unknown> | undefined;
1425
+ sourceRefs?: {
1426
+ sourceId: string;
1427
+ locator: string;
1428
+ }[] | undefined;
1429
+ } | {
1430
+ type: "check";
1431
+ content: {
1432
+ prompt: string;
1433
+ expect?: "reasoning" | "answer" | undefined;
1434
+ hint?: string | undefined;
1435
+ };
1436
+ id: string;
1437
+ metadata?: Record<string, unknown> | undefined;
1438
+ sourceRefs?: {
1439
+ sourceId: string;
1440
+ locator: string;
1441
+ }[] | undefined;
1442
+ } | {
1443
+ type: "formula";
1444
+ content: {
1445
+ tex: string;
1446
+ display?: boolean | undefined;
1447
+ mathml?: string | undefined;
1448
+ caption?: string | undefined;
1449
+ };
1450
+ id: string;
1451
+ metadata?: Record<string, unknown> | undefined;
1452
+ sourceRefs?: {
1453
+ sourceId: string;
1454
+ locator: string;
1455
+ }[] | undefined;
1456
+ } | {
1457
+ type: "code";
1458
+ content: {
1459
+ source: string;
1460
+ language?: string | undefined;
1461
+ caption?: string | undefined;
1462
+ };
1463
+ id: string;
1464
+ metadata?: Record<string, unknown> | undefined;
1465
+ sourceRefs?: {
1466
+ sourceId: string;
1467
+ locator: string;
1468
+ }[] | undefined;
1469
+ } | {
1470
+ type: "quiz";
1471
+ content: {
1472
+ questions: {
1473
+ id: string;
1474
+ kind: "mcq" | "short";
1475
+ prompt: string;
1476
+ options?: string[] | undefined;
1477
+ answer?: string | undefined;
1478
+ rubric?: string | undefined;
1479
+ explanation?: string | undefined;
1480
+ }[];
1481
+ title?: string | undefined;
1482
+ };
1483
+ id: string;
1484
+ metadata?: Record<string, unknown> | undefined;
1485
+ sourceRefs?: {
1486
+ sourceId: string;
1487
+ locator: string;
1488
+ }[] | undefined;
1489
+ } | {
1490
+ type: "flashcard";
1491
+ content: {
1492
+ front: string;
1493
+ back: string;
1494
+ tags?: string[] | undefined;
1495
+ };
1496
+ id: string;
1497
+ metadata?: Record<string, unknown> | undefined;
1498
+ sourceRefs?: {
1499
+ sourceId: string;
1500
+ locator: string;
1501
+ }[] | undefined;
1502
+ } | {
1503
+ type: "resource";
1504
+ content: {
1505
+ title: string;
1506
+ sourceId?: string | undefined;
1507
+ locator?: string | undefined;
1508
+ url?: string | undefined;
1509
+ note?: string | undefined;
1510
+ };
1511
+ id: string;
1512
+ metadata?: Record<string, unknown> | undefined;
1513
+ sourceRefs?: {
1514
+ sourceId: string;
1515
+ locator: string;
1516
+ }[] | undefined;
1517
+ } | {
1518
+ type: "comparison";
1519
+ content: {
1520
+ columns: string[];
1521
+ rows: string[][];
1522
+ caption?: string | undefined;
1523
+ };
1524
+ id: string;
1525
+ metadata?: Record<string, unknown> | undefined;
1526
+ sourceRefs?: {
1527
+ sourceId: string;
1528
+ locator: string;
1529
+ }[] | undefined;
1530
+ } | {
1531
+ id: string;
1532
+ type: string;
1533
+ content: unknown;
1534
+ metadata?: Record<string, unknown> | undefined;
1535
+ sourceRefs?: {
1536
+ sourceId: string;
1537
+ locator: string;
1538
+ }[] | undefined;
1539
+ })[];
1540
+ origin: "prototype" | "tutor";
1541
+ createdAt: string;
1542
+ updatedAt: string;
1543
+ };
1544
+ }[];
1545
+ responses?: {
1546
+ id: string;
1547
+ blockId: string;
1548
+ kind: "quiz" | "flashcard";
1549
+ answers: {
1550
+ questionId: string;
1551
+ value: string;
1552
+ }[];
1553
+ submittedAt: string;
1554
+ }[] | undefined;
1555
+ }[];
1556
+ updatedAt: string;
1557
+ }>;
1558
+ //# sourceMappingURL=path-runtime.d.ts.map