dsh-diagnostic-tutor 0.1.1 → 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 (115) hide show
  1. package/README.md +224 -59
  2. package/lib/api.js +178 -0
  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 +9448 -1654
  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/index.js +75 -13
  11. package/lib/index.js.map +1 -1
  12. package/lib/insights.js +82 -0
  13. package/lib/insights.js.map +1 -0
  14. package/lib/interactions.js +70 -0
  15. package/lib/interactions.js.map +1 -0
  16. package/lib/journal.js +122 -0
  17. package/lib/journal.js.map +1 -0
  18. package/lib/lesson-markdown.js +72 -0
  19. package/lib/lesson-markdown.js.map +1 -0
  20. package/lib/lesson.js +152 -3
  21. package/lib/lesson.js.map +1 -1
  22. package/lib/math.js +126 -0
  23. package/lib/math.js.map +1 -0
  24. package/lib/path-api.js +140 -0
  25. package/lib/path-api.js.map +1 -0
  26. package/lib/path-runtime.js +361 -0
  27. package/lib/path-runtime.js.map +1 -0
  28. package/lib/path-tools.js +107 -0
  29. package/lib/path-tools.js.map +1 -0
  30. package/lib/path.js +179 -0
  31. package/lib/path.js.map +1 -0
  32. package/lib/plan-tools.js +89 -0
  33. package/lib/plan-tools.js.map +1 -0
  34. package/lib/plan.js +82 -0
  35. package/lib/plan.js.map +1 -0
  36. package/lib/project-session.js +48 -0
  37. package/lib/project-session.js.map +1 -0
  38. package/lib/prompt.js +4 -19
  39. package/lib/prompt.js.map +1 -1
  40. package/lib/review-sync.js +51 -0
  41. package/lib/review-sync.js.map +1 -0
  42. package/lib/review-tools.js +115 -0
  43. package/lib/review-tools.js.map +1 -0
  44. package/lib/review.js +103 -0
  45. package/lib/review.js.map +1 -0
  46. package/lib/source-schema.js +24 -0
  47. package/lib/source-schema.js.map +1 -0
  48. package/lib/source-tools.js +61 -0
  49. package/lib/source-tools.js.map +1 -0
  50. package/lib/sources.js +78 -0
  51. package/lib/sources.js.map +1 -0
  52. package/lib/state.js +148 -7
  53. package/lib/state.js.map +1 -1
  54. package/lib/tools.js +456 -40
  55. package/lib/tools.js.map +1 -1
  56. package/lib/types/api.d.ts +7 -0
  57. package/lib/types/api.d.ts.map +1 -1
  58. package/lib/types/block-types.d.ts +12 -0
  59. package/lib/types/block-types.d.ts.map +1 -0
  60. package/lib/types/contract.d.ts +33 -1
  61. package/lib/types/contract.d.ts.map +1 -1
  62. package/lib/types/diagnostics.d.ts +95 -0
  63. package/lib/types/diagnostics.d.ts.map +1 -0
  64. package/lib/types/handoff.d.ts +2 -2
  65. package/lib/types/index.d.ts +15 -9
  66. package/lib/types/index.d.ts.map +1 -1
  67. package/lib/types/insights.d.ts +57 -0
  68. package/lib/types/insights.d.ts.map +1 -0
  69. package/lib/types/interactions.d.ts +23 -0
  70. package/lib/types/interactions.d.ts.map +1 -0
  71. package/lib/types/journal.d.ts +57 -0
  72. package/lib/types/journal.d.ts.map +1 -0
  73. package/lib/types/lesson-markdown.d.ts +11 -0
  74. package/lib/types/lesson-markdown.d.ts.map +1 -0
  75. package/lib/types/lesson.d.ts +697 -5
  76. package/lib/types/lesson.d.ts.map +1 -1
  77. package/lib/types/math.d.ts +50 -0
  78. package/lib/types/math.d.ts.map +1 -0
  79. package/lib/types/path-api.d.ts +5 -0
  80. package/lib/types/path-api.d.ts.map +1 -0
  81. package/lib/types/path-runtime.d.ts +1558 -0
  82. package/lib/types/path-runtime.d.ts.map +1 -0
  83. package/lib/types/path-tools.d.ts +4 -0
  84. package/lib/types/path-tools.d.ts.map +1 -0
  85. package/lib/types/path.d.ts +744 -0
  86. package/lib/types/path.d.ts.map +1 -0
  87. package/lib/types/plan-tools.d.ts +4 -0
  88. package/lib/types/plan-tools.d.ts.map +1 -0
  89. package/lib/types/plan.d.ts +53 -0
  90. package/lib/types/plan.d.ts.map +1 -0
  91. package/lib/types/project-session.d.ts +33 -0
  92. package/lib/types/project-session.d.ts.map +1 -0
  93. package/lib/types/prompt.d.ts.map +1 -1
  94. package/lib/types/review-sync.d.ts +17 -0
  95. package/lib/types/review-sync.d.ts.map +1 -0
  96. package/lib/types/review-tools.d.ts +4 -0
  97. package/lib/types/review-tools.d.ts.map +1 -0
  98. package/lib/types/review.d.ts +65 -0
  99. package/lib/types/review.d.ts.map +1 -0
  100. package/lib/types/source-schema.d.ts +31 -0
  101. package/lib/types/source-schema.d.ts.map +1 -0
  102. package/lib/types/source-tools.d.ts +4 -0
  103. package/lib/types/source-tools.d.ts.map +1 -0
  104. package/lib/types/sources.d.ts +33 -0
  105. package/lib/types/sources.d.ts.map +1 -0
  106. package/lib/types/state.d.ts +516 -9
  107. package/lib/types/state.d.ts.map +1 -1
  108. package/lib/types/tools.d.ts +3 -1
  109. package/lib/types/tools.d.ts.map +1 -1
  110. package/lib/types/version.d.ts +11 -0
  111. package/lib/types/version.d.ts.map +1 -0
  112. package/lib/types/vocabulary.d.ts +2 -2
  113. package/lib/version.js +26 -0
  114. package/lib/version.js.map +1 -0
  115. package/package.json +20 -18
@@ -0,0 +1,72 @@
1
+ /**
2
+ * A plain-text projection of learning blocks for harnesses without this UI.
3
+ *
4
+ * The panel is the rich surface; the model-facing tool result still needs to be
5
+ * usable when the client half is absent. This is deliberately a projection, not
6
+ * another renderer: no HTML, no styling, no state.
7
+ */
8
+ import { isKnownBlock } from './block-types.js';
9
+ function table(columns, rows) {
10
+ const head = `| ${columns.join(' | ')} |`;
11
+ const divider = `| ${columns.map(() => '---').join(' | ')} |`;
12
+ return [head, divider, ...rows.map((row) => `| ${row.join(' | ')} |`)].join('\n');
13
+ }
14
+ /** Render stored blocks as Markdown for model/tool consumers. */
15
+ export function blocksMarkdown(blocks) {
16
+ const parts = [];
17
+ for (const block of blocks) {
18
+ if (!isKnownBlock(block)) {
19
+ parts.push(`[unsupported block: ${block.type}]`);
20
+ if (block.sourceRefs !== undefined)
21
+ parts.push(`Sources: ${block.sourceRefs.map((ref) => ref.locator).join(', ')}`);
22
+ continue;
23
+ }
24
+ switch (block.type) {
25
+ case 'text':
26
+ parts.push(block.content.md);
27
+ break;
28
+ case 'formula':
29
+ parts.push(block.content.display === true ? `\\[${block.content.tex}\\]` : `\\(${block.content.tex}\\)`);
30
+ break;
31
+ case 'example':
32
+ parts.push([
33
+ `### ${block.content.title}`,
34
+ ...block.content.steps.map((step, index) => `${index + 1}. ${step}`),
35
+ ...(block.content.takeaway === undefined ? [] : [`> ${block.content.takeaway}`]),
36
+ ].join('\n'));
37
+ break;
38
+ case 'diagram':
39
+ parts.push(`\`\`\`\n${block.content.spec}\n\`\`\``);
40
+ break;
41
+ case 'check':
42
+ parts.push(`**Your turn:** ${block.content.prompt}${block.content.hint === undefined ? '' : `\n\n> Hint: ${block.content.hint}`}`);
43
+ break;
44
+ case 'code':
45
+ parts.push(`\`\`\`${block.content.language ?? ''}\n${block.content.source}\n\`\`\``);
46
+ break;
47
+ case 'quiz':
48
+ parts.push([
49
+ `### ${block.content.title ?? 'Quiz'}`,
50
+ ...block.content.questions.flatMap((question, index) => [
51
+ `${index + 1}. ${question.prompt}`,
52
+ ...(question.options ?? []).map((option) => ` - ${option}`),
53
+ ]),
54
+ 'Answer in the chat; the tutor will respond there.',
55
+ ].join('\n'));
56
+ break;
57
+ case 'flashcard':
58
+ parts.push(`**Flashcard — front:** ${block.content.front}\n\n**Back:** ${block.content.back}`);
59
+ break;
60
+ case 'resource':
61
+ parts.push(`**Resource:** ${block.content.title}${block.content.locator === undefined ? '' : ` — ${block.content.locator}`}${block.content.note === undefined ? '' : `\n\n${block.content.note}`}`);
62
+ break;
63
+ case 'comparison':
64
+ parts.push(table(block.content.columns, block.content.rows));
65
+ break;
66
+ }
67
+ if (block.sourceRefs !== undefined)
68
+ parts.push(`Sources: ${block.sourceRefs.map((ref) => ref.locator).join(', ')}`);
69
+ }
70
+ return parts.join('\n\n');
71
+ }
72
+ //# sourceMappingURL=lesson-markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lesson-markdown.js","sourceRoot":"","sources":["../src/lesson-markdown.ts"],"names":[],"mappings":"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"}
package/lib/lesson.js CHANGED
@@ -25,6 +25,7 @@
25
25
  * distinguishable in the stored record rather than by convention.
26
26
  */
27
27
  import { z } from 'zod';
28
+ import { KNOWN_BLOCK_TYPE_NAMES } from './block-types.js';
28
29
  /* -------------------------------------------------------------------------- */
29
30
  /* Size limits */
30
31
  /* -------------------------------------------------------------------------- */
@@ -55,21 +56,64 @@ export const MAX_PROMPT_CHARS = 1000;
55
56
  export const MAX_TITLE_CHARS = 200;
56
57
  export const MAX_STEP_CHARS = 400;
57
58
  export const MAX_STEPS = 12;
59
+ export const MAX_MATH_TEX_CHARS = 2000;
60
+ export const MAX_MATHML_CHARS = 12000;
61
+ export const MAX_MATH_FRAGMENTS = 24;
62
+ export const MAX_ID_CHARS = 120;
63
+ export const MAX_CODE_CHARS = 6000;
64
+ export const MAX_CODE_LANGUAGE_CHARS = 40;
65
+ export const MAX_QUIZ_QUESTIONS = 8;
66
+ export const MAX_QUIZ_OPTIONS = 8;
67
+ export const MAX_QUIZ_ANSWER_CHARS = 2000;
68
+ export const MAX_FLASHCARD_SIDE_CHARS = 2000;
69
+ export const MAX_FLASHCARD_TAGS = 8;
70
+ export const MAX_COMPARISON_COLUMNS = 8;
71
+ export const MAX_COMPARISON_ROWS = 20;
72
+ export const MAX_COMPARISON_CELL_CHARS = 500;
73
+ export const MAX_LESSON_BYTES = 262_144;
58
74
  /* -------------------------------------------------------------------------- */
59
75
  /* Blocks */
60
76
  /* -------------------------------------------------------------------------- */
77
+ /** A citation into one stored source. */
78
+ export const SourceRefSchema = z.object({
79
+ sourceId: z.string().min(1).max(120),
80
+ /** Line range, heading, page or the original URL fragment. */
81
+ locator: z.string().min(1).max(300),
82
+ }).strict();
61
83
  /** Fields every block carries, whatever its type. */
62
84
  const blockBase = {
63
85
  id: z.string().min(1),
64
86
  /** Renderer-free annotations; never interpreted by the schema. */
65
87
  metadata: z.record(z.string(), z.unknown()).optional(),
88
+ /** Footnotes into learner-supplied sources; validated against the store before write. */
89
+ sourceRefs: z.array(SourceRefSchema).max(6).optional(),
66
90
  };
91
+ export const MathFragmentSchema = z.object({
92
+ /** Source TeX without delimiters. */
93
+ tex: z.string().min(1).max(MAX_MATH_TEX_CHARS),
94
+ display: z.boolean(),
95
+ /** Host-rendered `<math>...</math>` subtree; optional for legacy records. */
96
+ mathml: z.string().min(1).max(MAX_MATHML_CHARS),
97
+ });
67
98
  export const TextBlockSchema = z.object({
68
99
  ...blockBase,
69
100
  type: z.literal('text'),
70
101
  content: z.object({
71
102
  /** Markdown. Math uses the skill's convention: `\(...\)` / `\[...\]`. */
72
103
  md: z.string().min(1).max(MAX_TEXT_CHARS),
104
+ /** Host pre-render of formulas in `md`, keyed by exact TeX and display mode. */
105
+ math: z.array(MathFragmentSchema).max(MAX_MATH_FRAGMENTS).optional(),
106
+ }),
107
+ });
108
+ export const FormulaBlockSchema = z.object({
109
+ ...blockBase,
110
+ type: z.literal('formula'),
111
+ content: z.object({
112
+ tex: z.string().min(1).max(MAX_MATH_TEX_CHARS),
113
+ display: z.boolean().optional(),
114
+ /** Host-rendered MathML; the client shows the TeX fallback when absent. */
115
+ mathml: z.string().min(1).max(MAX_MATHML_CHARS).optional(),
116
+ caption: z.string().min(1).max(MAX_TITLE_CHARS).optional(),
73
117
  }),
74
118
  });
75
119
  export const ExampleBlockSchema = z.object({
@@ -106,19 +150,124 @@ export const CheckBlockSchema = z.object({
106
150
  hint: z.string().min(1).max(MAX_PROMPT_CHARS).optional(),
107
151
  }),
108
152
  });
109
- /** Every block type this version understands. */
110
- export const BLOCK_SCHEMAS = [
153
+ export const CodeBlockSchema = z.object({
154
+ ...blockBase,
155
+ type: z.literal('code'),
156
+ content: z.object({
157
+ language: z.string().min(1).max(MAX_CODE_LANGUAGE_CHARS).optional(),
158
+ source: z.string().min(1).max(MAX_CODE_CHARS),
159
+ caption: z.string().min(1).max(MAX_TITLE_CHARS).optional(),
160
+ }),
161
+ });
162
+ const quizId = z.string().min(1).max(MAX_ID_CHARS);
163
+ export const QuizQuestionSchema = z.object({
164
+ id: quizId,
165
+ kind: z.enum(['mcq', 'short']),
166
+ prompt: z.string().min(1).max(MAX_PROMPT_CHARS),
167
+ options: z.array(z.string().min(1).max(300)).min(2).max(MAX_QUIZ_OPTIONS).optional(),
168
+ /** Stored for the tutor; never rendered to the learner before a judgement. */
169
+ answer: z.string().min(1).max(MAX_QUIZ_ANSWER_CHARS).optional(),
170
+ rubric: z.string().min(1).max(MAX_QUIZ_ANSWER_CHARS).optional(),
171
+ explanation: z.string().min(1).max(MAX_QUIZ_ANSWER_CHARS).optional(),
172
+ }).superRefine((question, ctx) => {
173
+ if (question.kind === 'mcq' && (question.options === undefined || question.options.length < 2)) {
174
+ ctx.addIssue({ code: 'custom', message: 'A multiple-choice question needs at least two options' });
175
+ }
176
+ if (question.options !== undefined && new Set(question.options).size !== question.options.length) {
177
+ ctx.addIssue({ code: 'custom', message: 'Quiz options must be unique' });
178
+ }
179
+ });
180
+ export const QuizBlockSchema = z.object({
181
+ ...blockBase,
182
+ type: z.literal('quiz'),
183
+ content: z.object({
184
+ title: z.string().min(1).max(MAX_TITLE_CHARS).optional(),
185
+ questions: z.array(QuizQuestionSchema).min(1).max(MAX_QUIZ_QUESTIONS),
186
+ }).superRefine((quiz, ctx) => {
187
+ const ids = new Set(quiz.questions.map((question) => question.id));
188
+ if (ids.size !== quiz.questions.length)
189
+ ctx.addIssue({ code: 'custom', message: 'Quiz question IDs must be unique' });
190
+ }),
191
+ });
192
+ export const FlashcardBlockSchema = z.object({
193
+ ...blockBase,
194
+ type: z.literal('flashcard'),
195
+ content: z.object({
196
+ front: z.string().min(1).max(MAX_FLASHCARD_SIDE_CHARS),
197
+ back: z.string().min(1).max(MAX_FLASHCARD_SIDE_CHARS),
198
+ tags: z.array(z.string().min(1).max(40)).max(MAX_FLASHCARD_TAGS).optional(),
199
+ }),
200
+ });
201
+ export const ResourceBlockSchema = z.object({
202
+ ...blockBase,
203
+ type: z.literal('resource'),
204
+ content: z.object({
205
+ title: z.string().min(1).max(MAX_TITLE_CHARS),
206
+ sourceId: z.string().min(1).max(MAX_ID_CHARS).optional(),
207
+ locator: z.string().min(1).max(300).optional(),
208
+ /** Displayed as text only; the plugin never opens this URL itself. */
209
+ url: z.string().min(1).max(500).optional(),
210
+ note: z.string().min(1).max(500).optional(),
211
+ }),
212
+ });
213
+ export const ComparisonBlockSchema = z.object({
214
+ ...blockBase,
215
+ type: z.literal('comparison'),
216
+ content: z.object({
217
+ columns: z.array(z.string().min(1).max(120)).min(1).max(MAX_COMPARISON_COLUMNS),
218
+ rows: z.array(z.array(z.string().max(MAX_COMPARISON_CELL_CHARS)).min(1).max(MAX_COMPARISON_COLUMNS)).min(1).max(MAX_COMPARISON_ROWS),
219
+ caption: z.string().min(1).max(MAX_TITLE_CHARS).optional(),
220
+ }).superRefine((comparison, ctx) => {
221
+ if (comparison.rows.some((row) => row.length !== comparison.columns.length)) {
222
+ ctx.addIssue({ code: 'custom', message: 'Every comparison row must have one cell per column' });
223
+ }
224
+ }),
225
+ });
226
+ const KNOWN_BLOCK_SCHEMAS = [
111
227
  TextBlockSchema,
112
228
  ExampleBlockSchema,
113
229
  DiagramBlockSchema,
114
230
  CheckBlockSchema,
231
+ FormulaBlockSchema,
232
+ CodeBlockSchema,
233
+ QuizBlockSchema,
234
+ FlashcardBlockSchema,
235
+ ResourceBlockSchema,
236
+ ComparisonBlockSchema,
115
237
  ];
116
- export const BlockSchema = z.discriminatedUnion('type', [
238
+ /** Every block type this version understands. */
239
+ export const BLOCK_SCHEMAS = KNOWN_BLOCK_SCHEMAS;
240
+ export const KnownBlockSchema = z.discriminatedUnion('type', [
117
241
  TextBlockSchema,
118
242
  ExampleBlockSchema,
119
243
  DiagramBlockSchema,
120
244
  CheckBlockSchema,
245
+ FormulaBlockSchema,
246
+ CodeBlockSchema,
247
+ QuizBlockSchema,
248
+ FlashcardBlockSchema,
249
+ ResourceBlockSchema,
250
+ ComparisonBlockSchema,
121
251
  ]);
252
+ const KNOWN_BLOCK_TYPES = new Set(KNOWN_BLOCK_TYPE_NAMES);
253
+ /**
254
+ * A block authored by a newer host.
255
+ *
256
+ * The durable boundary accepts it so an old client does not refuse to open a
257
+ * document. Writes from the current model still go through `KnownBlockSchema`;
258
+ * only records already on disk can carry an unknown type.
259
+ */
260
+ export const UnknownBlockSchema = z.object({
261
+ id: z.string().min(1).max(MAX_ID_CHARS),
262
+ type: z.string().min(1).max(120),
263
+ content: z.unknown(),
264
+ metadata: z.record(z.string(), z.unknown()).optional(),
265
+ sourceRefs: z.array(SourceRefSchema).max(6).optional(),
266
+ }).superRefine((block, ctx) => {
267
+ if (KNOWN_BLOCK_TYPES.has(block.type))
268
+ ctx.addIssue({ code: 'custom', message: 'Use the schema for this known block type' });
269
+ });
270
+ export const BlockSchema = z.union([KnownBlockSchema, UnknownBlockSchema]);
122
271
  /** The block types this build can render, for diagnostics and tests. */
123
272
  export const SUPPORTED_BLOCK_TYPES = BLOCK_SCHEMAS.map((schema) => schema.shape.type.value);
124
273
  /* -------------------------------------------------------------------------- */
package/lib/lesson.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lesson.js","sourceRoot":"","sources":["../src/lesson.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lesson.js","sourceRoot":"","sources":["../src/lesson.ts"],"names":[],"mappings":"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"}
package/lib/math.js ADDED
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Host-side math pre-rendering.
3
+ *
4
+ * The browser half is a single JavaScript file with nowhere to serve KaTeX
5
+ * fonts or CSS from, so TeX cannot be typeset there. Instead the host renders
6
+ * every formula to a MathML subtree at write time and stores that subtree next
7
+ * to the original TeX. The browser renders native MathML; no font, stylesheet or
8
+ * network request is added. TeX remains the source of truth for re-rendering and
9
+ * export.
10
+ *
11
+ * Only the `<math>` element is stored. KaTeX's wrapper `<span class="katex">`
12
+ * is deliberately dropped: the client whitelist should never have to decide
13
+ * what to do with arbitrary KaTeX chrome.
14
+ */
15
+ import katex from 'katex';
16
+ import { MAX_MATHML_CHARS, MAX_MATH_TEX_CHARS } from './lesson.js';
17
+ /** The skill's convention: inline `\(...\)`, display `\[...\]`. */
18
+ const MATH_PATTERN = /\\\[([\s\S]*?)\\\]|\\\(([\s\S]*?)\\\)/g;
19
+ /**
20
+ * Mark byte ranges that are fenced code so math-looking text inside a code
21
+ * sample is not rendered. Offsets are JavaScript string indices.
22
+ */
23
+ function fenceMask(markdown) {
24
+ const ranges = [];
25
+ const lines = markdown.split('\n');
26
+ let offset = 0;
27
+ let open = null;
28
+ for (const line of lines) {
29
+ const next = offset + line.length + 1;
30
+ if (line.trimStart().startsWith('```')) {
31
+ if (open === null)
32
+ open = offset;
33
+ else {
34
+ ranges.push([open, next]);
35
+ open = null;
36
+ }
37
+ }
38
+ offset = next;
39
+ }
40
+ if (open !== null)
41
+ ranges.push([open, markdown.length]);
42
+ return ranges;
43
+ }
44
+ function masked(index, ranges) {
45
+ return ranges.some(([start, end]) => index >= start && index < end);
46
+ }
47
+ /** Extract every formula in the skill's delimiters, skipping fenced code. */
48
+ export function extractMath(markdown) {
49
+ const ranges = fenceMask(markdown);
50
+ const found = [];
51
+ for (const match of markdown.matchAll(MATH_PATTERN)) {
52
+ const index = match.index ?? 0;
53
+ if (masked(index, ranges))
54
+ continue;
55
+ const display = match[1] !== undefined;
56
+ const tex = ((display ? match[1] : match[2]) ?? '').trim();
57
+ if (tex.length === 0)
58
+ continue;
59
+ found.push({ tex, display, start: index, end: index + (match[0] ?? '').length });
60
+ }
61
+ return found;
62
+ }
63
+ /**
64
+ * Render one TeX expression to a stored MathML subtree.
65
+ *
66
+ * Invalid TeX is a caller-visible error: a formula block that cannot be
67
+ * rendered should be rejected at the boundary, not stored as an unexplained
68
+ * blank. Text blocks use the non-throwing `renderMathFragments` instead so one
69
+ * bad inline expression cannot destroy an otherwise useful unit.
70
+ */
71
+ export function renderTexToMathML(tex, display = false) {
72
+ if (tex.trim().length === 0)
73
+ throw new Error('empty-formula');
74
+ if (tex.length > MAX_MATH_TEX_CHARS)
75
+ throw new Error('formula-too-long');
76
+ let rendered;
77
+ try {
78
+ rendered = katex.renderToString(tex, {
79
+ output: 'mathml',
80
+ displayMode: display,
81
+ throwOnError: true,
82
+ strict: 'ignore',
83
+ trust: false,
84
+ });
85
+ }
86
+ catch (cause) {
87
+ throw new Error(`invalid-formula: ${cause.message}`);
88
+ }
89
+ const match = /<math[\s\S]*?<\/math>/.exec(rendered);
90
+ if (match === null)
91
+ throw new Error('invalid-formula: no MathML produced');
92
+ if (match[0].length > MAX_MATHML_CHARS)
93
+ throw new Error('formula-mathml-too-long');
94
+ return match[0];
95
+ }
96
+ /**
97
+ * Pre-render every valid formula in a markdown string.
98
+ *
99
+ * A bad inline expression is skipped, leaving the raw delimiters for the
100
+ * existing styled fallback; the rest of the unit still renders. Fragments are
101
+ * unique by (tex, display) to keep the stored record small.
102
+ */
103
+ export function renderMathFragments(markdown) {
104
+ const unique = new Map();
105
+ for (const formula of extractMath(markdown)) {
106
+ const key = `${formula.display ? 'd' : 'i'}:${formula.tex}`;
107
+ if (unique.has(key))
108
+ continue;
109
+ try {
110
+ unique.set(key, {
111
+ tex: formula.tex,
112
+ display: formula.display,
113
+ mathml: renderTexToMathML(formula.tex, formula.display),
114
+ });
115
+ }
116
+ catch {
117
+ // Preserve the raw text; the client falls back to the old styled math.
118
+ }
119
+ }
120
+ return [...unique.values()];
121
+ }
122
+ /** True when a Markdown body contains at least one formula. */
123
+ export function hasMath(markdown) {
124
+ return extractMath(markdown).length > 0;
125
+ }
126
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ import { z } from 'zod';
2
+ import { activeAttempt } from './path.js';
3
+ import { AnswerSubmissionSchema, recordBlockResponse } from './interactions.js';
4
+ import { acceptCurriculum, beginCourseItem, pathView, pauseCourseItem, reservePathRequest, saveAssessment, saveBrief, selectedProject, stampCoursePrompt, stampPathRequest, } from './path-runtime.js';
5
+ const identity = z.object({ courseId: z.string().min(1), sessionId: z.string().min(1), expectedRevision: z.number().int().min(0) });
6
+ function send(res, status, value) {
7
+ res.statusCode = status;
8
+ res.setHeader('content-type', 'application/json; charset=utf-8');
9
+ res.setHeader('cache-control', 'no-store');
10
+ res.setHeader('x-content-type-options', 'nosniff');
11
+ res.end(JSON.stringify(value));
12
+ }
13
+ async function body(req) {
14
+ let size = 0;
15
+ const chunks = [];
16
+ for await (const chunk of req) {
17
+ const part = Buffer.from(chunk);
18
+ if ((size += part.length) > 65536)
19
+ throw new Error('body-too-large');
20
+ chunks.push(part);
21
+ }
22
+ return JSON.parse(Buffer.concat(chunks).toString('utf8'));
23
+ }
24
+ export async function handlePathApi(route, req, res, deps, url) {
25
+ if (route !== '/path' && !route.startsWith('/path/'))
26
+ return false;
27
+ try {
28
+ if (req.method === 'GET' && route === '/path') {
29
+ const sessionId = url.searchParams.get('sessionId') || undefined;
30
+ const courseId = url.searchParams.get('courseId') || deps.state.resolveProject(sessionId).course?.id;
31
+ if (!courseId)
32
+ throw new Error('no-selected-project');
33
+ send(res, 200, pathView(deps.state, courseId, sessionId));
34
+ return true;
35
+ }
36
+ if (req.method !== 'POST') {
37
+ send(res, 405, { ok: false, error: { code: 'method-not-allowed' } });
38
+ return true;
39
+ }
40
+ const raw = await body(req);
41
+ const base = identity.parse(raw);
42
+ const state = deps.state;
43
+ selectedProject(state, base.courseId, base.sessionId);
44
+ if (route === '/path/brief') {
45
+ const input = identity.extend({ brief: z.unknown() }).parse(raw);
46
+ const saved = await saveBrief(state, base.courseId, base.sessionId, base.expectedRevision, input.brief);
47
+ deps.onEvent?.('path.brief', { courseId: base.courseId, sessionId: base.sessionId, revision: saved.revision });
48
+ }
49
+ else if (route === '/path/skip-assessment') {
50
+ const path = pathView(state, base.courseId, base.sessionId).path;
51
+ const saved = await saveAssessment(state, base.courseId, base.sessionId, base.expectedRevision, {
52
+ status: 'skipped', summary: 'The learner chose to start with unverified foundations.', strengths: [], gaps: [],
53
+ uncertainties: ['Foundations have not been checked; early lessons need diagnostic checks.'], evidence: [],
54
+ briefRevision: path.briefRevision, sessionId: base.sessionId, updatedAt: new Date().toISOString(),
55
+ }, true);
56
+ deps.onEvent?.('path.skip-diagnosis', { courseId: base.courseId, sessionId: base.sessionId, revision: saved.revision });
57
+ }
58
+ else if (route === '/path/accept') {
59
+ const input = identity.extend({ version: z.number().int().positive() }).parse(raw);
60
+ const accepted = await acceptCurriculum(state, base.courseId, base.sessionId, base.expectedRevision, input.version);
61
+ deps.onEvent?.('path.accept-route', { courseId: base.courseId, sessionId: base.sessionId, version: input.version, revision: accepted.revision });
62
+ }
63
+ else if (route === '/path/request') {
64
+ const input = identity.extend({ kind: z.enum(['diagnosis', 'plan']), operationId: z.string().min(1).max(200) }).parse(raw);
65
+ const request = await reservePathRequest(state, input);
66
+ let prompted = request.request.prompted;
67
+ let reason = request.request.reason ?? undefined;
68
+ if (request.shouldPrompt && state.resolveProject(base.sessionId).course?.id === base.courseId) {
69
+ try {
70
+ const result = deps.prompt(base.sessionId, request.prompt);
71
+ prompted = result.prompted;
72
+ reason = result.reason;
73
+ }
74
+ catch (cause) {
75
+ prompted = false;
76
+ reason = cause.message;
77
+ }
78
+ await stampPathRequest(state, base.courseId, base.sessionId, input.operationId, prompted, reason);
79
+ }
80
+ deps.onEvent?.('path.request', {
81
+ courseId: base.courseId, sessionId: base.sessionId, kind: input.kind, requestId: input.operationId,
82
+ prompted, ...(reason === undefined ? {} : { reason: reason.slice(0, 240) }),
83
+ });
84
+ send(res, 200, { ...pathView(state, base.courseId, base.sessionId), prompted, ...(reason ? { promptReason: reason } : {}) });
85
+ return true;
86
+ }
87
+ else if (route === '/path/answer') {
88
+ const input = identity.extend(AnswerSubmissionSchema.shape).parse(raw);
89
+ const view = await recordBlockResponse(state, { ...base, ...input });
90
+ deps.onEvent?.('path.answer', { courseId: base.courseId, sessionId: base.sessionId, attemptId: input.attemptId, blockId: input.blockId });
91
+ send(res, 200, view);
92
+ return true;
93
+ }
94
+ else if (route === '/path/pause') {
95
+ const paused = await pauseCourseItem(state, base);
96
+ deps.onEvent?.('path.pause', { courseId: base.courseId, sessionId: base.sessionId });
97
+ send(res, 200, paused);
98
+ return true;
99
+ }
100
+ else if (route === '/path/start') {
101
+ const input = identity.extend({ version: z.number().int().positive(), itemId: z.string().min(1).max(200), operationId: z.string().min(1).max(200), review: z.boolean().optional(), resume: z.boolean().optional(), checkin: z.boolean().optional(), teachBack: z.boolean().optional() }).parse(raw);
102
+ const result = await beginCourseItem(state, input);
103
+ let prompted = result.attempt.prompted;
104
+ let reason = result.attempt.promptReason ?? undefined;
105
+ if (result.shouldPrompt && activeAttempt(state.readCourseRun(base.courseId, base.sessionId))?.id === result.attempt.id && state.resolveProject(base.sessionId).course?.id === base.courseId) {
106
+ try {
107
+ const outcome = deps.prompt(base.sessionId, result.prompt);
108
+ prompted = outcome.prompted;
109
+ reason = outcome.reason;
110
+ }
111
+ catch (cause) {
112
+ prompted = false;
113
+ reason = cause.message;
114
+ }
115
+ await stampCoursePrompt(state, input, result.attempt.id, prompted, reason);
116
+ }
117
+ deps.onEvent?.('path.start-lesson', {
118
+ courseId: base.courseId, sessionId: base.sessionId, version: input.version, itemId: input.itemId,
119
+ attemptId: result.attempt.id, resume: input.resume === true, checkin: input.checkin === true, teachBack: input.teachBack === true,
120
+ prompted, ...(reason === undefined ? {} : { reason: reason.slice(0, 240) }),
121
+ });
122
+ send(res, 200, { ...pathView(state, base.courseId, base.sessionId), prompted, ...(reason ? { promptReason: reason } : {}) });
123
+ return true;
124
+ }
125
+ else {
126
+ send(res, 404, { ok: false, error: { code: 'no-such-path-route' } });
127
+ return true;
128
+ }
129
+ send(res, 200, pathView(state, base.courseId, base.sessionId));
130
+ }
131
+ catch (cause) {
132
+ const message = cause instanceof z.ZodError ? cause.issues.map((entry) => `${entry.path.join('.')}: ${entry.message}`).join('; ') : cause.message;
133
+ const code = message.split(':')[0] ?? 'invalid-planning-request';
134
+ deps.onEvent?.('path.error', { route, code: code.slice(0, 80) });
135
+ const status = code === 'revision-conflict' || code === 'project-selection-changed' || code === 'stale-curriculum' || code === 'stale-attempt' ? 409 : code === 'no-such-course' ? 404 : 400;
136
+ send(res, status, { ok: false, error: { code, message } });
137
+ }
138
+ return true;
139
+ }
140
+ //# sourceMappingURL=path-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-api.js","sourceRoot":"","sources":["../src/path-api.ts"],"names":[],"mappings":"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"}