@thanh01.pmt/domain-kit 0.1.0 → 0.2.1
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/LICENSE +21 -0
- package/dist/{chunk-GEUDHZE7.mjs → chunk-23TQPTHG.mjs} +173 -4
- package/dist/chunk-23TQPTHG.mjs.map +1 -0
- package/dist/chunk-7XGWW6CB.mjs +3 -0
- package/dist/{chunk-F4RZNBOE.mjs.map → chunk-7XGWW6CB.mjs.map} +1 -1
- package/dist/{chunk-VFART56O.mjs → chunk-BL5NBKPH.mjs} +12 -8
- package/dist/chunk-BL5NBKPH.mjs.map +1 -0
- package/dist/{chunk-3VVPSRAM.mjs → chunk-CRN6D4HG.mjs} +1056 -92
- package/dist/chunk-CRN6D4HG.mjs.map +1 -0
- package/dist/{chunk-3H2HX7PR.mjs → chunk-HUDFN4IX.mjs} +58 -8
- package/dist/chunk-HUDFN4IX.mjs.map +1 -0
- package/dist/chunk-IJZUV7N3.mjs +3 -0
- package/dist/chunk-IJZUV7N3.mjs.map +1 -0
- package/dist/chunk-R57WTNXW.mjs +3 -0
- package/dist/chunk-R57WTNXW.mjs.map +1 -0
- package/dist/chunk-T4Y2DE2W.mjs +187 -0
- package/dist/chunk-T4Y2DE2W.mjs.map +1 -0
- package/dist/{chunk-PM42MMDJ.mjs → chunk-WHBAGJWN.mjs} +48 -3
- package/dist/chunk-WHBAGJWN.mjs.map +1 -0
- package/dist/chunk-ZKLT27T4.mjs +3 -0
- package/dist/chunk-ZKLT27T4.mjs.map +1 -0
- package/dist/concepts/index.d.cts +2 -2
- package/dist/concepts/index.d.ts +2 -2
- package/dist/cpp-CZUPqJt9.d.cts +98 -0
- package/dist/cpp-CZUPqJt9.d.ts +98 -0
- package/dist/curriculumFeedEmitter-E5DAJYUZ.mjs +4 -0
- package/dist/curriculumFeedEmitter-E5DAJYUZ.mjs.map +1 -0
- package/dist/detector/index.cjs +10 -6
- package/dist/detector/index.cjs.map +1 -1
- package/dist/detector/index.d.cts +4 -19
- package/dist/detector/index.d.ts +4 -19
- package/dist/detector/index.mjs +2 -1
- package/dist/domainProfileDetector-DHb1T0zB.d.ts +22 -0
- package/dist/domainProfileDetector-bzugdQmS.d.cts +22 -0
- package/dist/extractors/index.d.cts +3 -3
- package/dist/extractors/index.d.ts +3 -3
- package/dist/feed/index.cjs +56 -6
- package/dist/feed/index.cjs.map +1 -1
- package/dist/feed/index.mjs +2 -1
- package/dist/graph/index.cjs +370 -66
- package/dist/graph/index.cjs.map +1 -1
- package/dist/graph/index.d.cts +7 -67
- package/dist/graph/index.d.ts +7 -67
- package/dist/graph/index.mjs +3 -2
- package/dist/hybridGraphPipeline-DVZYLCAQ.d.ts +159 -0
- package/dist/hybridGraphPipeline-DmWRKYXf.d.cts +159 -0
- package/dist/index.cjs +1303 -700
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -7
- package/dist/index.d.ts +9 -7
- package/dist/index.mjs +10 -7
- package/dist/{keywordExtractor-zPAz2isq.d.cts → keywordExtractor-BxlGRMHC.d.cts} +1 -1
- package/dist/{keywordExtractor-CKaXqSku.d.ts → keywordExtractor-DU5XRN8-.d.ts} +1 -1
- package/dist/parsers/index.cjs +185 -0
- package/dist/parsers/index.cjs.map +1 -1
- package/dist/parsers/index.d.cts +2 -98
- package/dist/parsers/index.d.ts +2 -98
- package/dist/parsers/index.mjs +2 -1
- package/dist/pipeline/index.cjs +3142 -8
- package/dist/pipeline/index.cjs.map +1 -1
- package/dist/pipeline/index.d.cts +87 -4
- package/dist/pipeline/index.d.ts +87 -4
- package/dist/pipeline/index.mjs +6 -2
- package/dist/schemas/index.cjs +51 -0
- package/dist/schemas/index.cjs.map +1 -1
- package/dist/schemas/index.d.cts +222 -3
- package/dist/schemas/index.d.ts +222 -3
- package/dist/schemas/index.mjs +1 -1
- package/dist/syllabusParser-MSX1fEzW.d.cts +40 -0
- package/dist/syllabusParser-MSX1fEzW.d.ts +40 -0
- package/package.json +9 -10
- package/dist/chunk-3H2HX7PR.mjs.map +0 -1
- package/dist/chunk-3VVPSRAM.mjs.map +0 -1
- package/dist/chunk-F4RZNBOE.mjs +0 -3
- package/dist/chunk-GEUDHZE7.mjs.map +0 -1
- package/dist/chunk-MOKNFLUD.mjs +0 -851
- package/dist/chunk-MOKNFLUD.mjs.map +0 -1
- package/dist/chunk-PM42MMDJ.mjs.map +0 -1
- package/dist/chunk-VFART56O.mjs.map +0 -1
- package/dist/graphVerifier-DsTP9uAN.d.ts +0 -37
- package/dist/graphVerifier-QjgDAJce.d.cts +0 -37
|
@@ -44,22 +44,47 @@ function feedNodeFromStep(step, featureId) {
|
|
|
44
44
|
introduce_aspect: null
|
|
45
45
|
};
|
|
46
46
|
}
|
|
47
|
+
function deriveConceptDepthHint(concept) {
|
|
48
|
+
const explicit = str(concept.depth_hint);
|
|
49
|
+
if (explicit === "ulo" || explicit === "cio" || explicit === "sio") return explicit;
|
|
50
|
+
const sio = arr(concept.sio);
|
|
51
|
+
const prereqs = strs(concept.prerequisites);
|
|
52
|
+
const pts = arr(concept.problem_types);
|
|
53
|
+
const hasHighBloom = pts.some((p) => {
|
|
54
|
+
const b = str(p.bloom_level);
|
|
55
|
+
return b === "Apply" || b === "Analyze" || b === "Evaluate" || b === "Create";
|
|
56
|
+
});
|
|
57
|
+
if (sio.length >= 2 || hasHighBloom) return "sio";
|
|
58
|
+
if (str(concept.cio) || prereqs.length >= 1) return "cio";
|
|
59
|
+
return "ulo";
|
|
60
|
+
}
|
|
47
61
|
function feedNodeFromConcept(concept) {
|
|
48
62
|
const id = str(concept.id);
|
|
49
63
|
const pts = arr(concept.problem_types).map((p) => str(p.bloom_level, "Understand")).filter((b) => b in BLOOM_RANK).sort((a, b) => BLOOM_RANK[a] - BLOOM_RANK[b]);
|
|
50
64
|
const topBloom = pts[pts.length - 1] ?? "Understand";
|
|
65
|
+
const rawRefs = arr(concept.references);
|
|
66
|
+
const references = rawRefs.length > 0 ? rawRefs.map((r) => ({ file: str(r.file, "syllabus.md"), evidence: str(r.evidence, str(concept.name)) })).filter((r) => r.file) : [{ file: "syllabus.md", evidence: str(concept.category ? `Topic under category ${str(concept.category)}` : str(concept.name), id) }];
|
|
67
|
+
const problemScaffolds = arr(concept.problem_types).map((pt) => ({
|
|
68
|
+
item: str(pt.name, "Problem type"),
|
|
69
|
+
reason: str(pt.description, "Formative practice check"),
|
|
70
|
+
minutes_saved: num(pt.estimated_minutes, 10),
|
|
71
|
+
suggest: "provide_partial"
|
|
72
|
+
}));
|
|
51
73
|
return {
|
|
52
74
|
id,
|
|
53
75
|
kind: "concept",
|
|
54
76
|
name: str(concept.name, id),
|
|
55
77
|
concept_codes: [str(concept.code) || id].filter(Boolean),
|
|
56
78
|
keywords: { all: strs(concept.keywords), new: [], prerequisite: [] },
|
|
57
|
-
estimated_minutes: Math.max(0, Math.round(num(concept.estimated_minutes,
|
|
79
|
+
estimated_minutes: Math.max(0, Math.round(num(concept.estimated_minutes, 15))),
|
|
58
80
|
bloom_hint: topBloom,
|
|
59
|
-
depth_hint:
|
|
81
|
+
depth_hint: deriveConceptDepthHint(concept),
|
|
60
82
|
completion_level: "standard",
|
|
61
|
-
scaffolding: {
|
|
62
|
-
|
|
83
|
+
scaffolding: {
|
|
84
|
+
scaffold_candidates: problemScaffolds,
|
|
85
|
+
core_value_minutes: Math.max(0, Math.round(num(concept.estimated_minutes, 15)))
|
|
86
|
+
},
|
|
87
|
+
references,
|
|
63
88
|
feature_id: null,
|
|
64
89
|
concept_ref: id,
|
|
65
90
|
phase_id: "",
|
|
@@ -265,16 +290,41 @@ function emitFromKnowledge(kg, opts) {
|
|
|
265
290
|
const nodes = [];
|
|
266
291
|
const edges = [];
|
|
267
292
|
const groupings = [];
|
|
293
|
+
const conceptIds = new Set(arr(kg.concepts).map((c) => str(c.id)));
|
|
268
294
|
for (const c of arr(kg.concepts)) {
|
|
269
295
|
const node = feedNodeFromConcept(c);
|
|
270
296
|
nodes.push(node);
|
|
271
|
-
for (const p of strs(c.prerequisites))
|
|
297
|
+
for (const p of strs(c.prerequisites)) {
|
|
298
|
+
if (p !== node.id && conceptIds.has(p)) {
|
|
299
|
+
edges.push({
|
|
300
|
+
from: p,
|
|
301
|
+
to: node.id,
|
|
302
|
+
kind: "knowledge",
|
|
303
|
+
reason: `concept prerequisite: ${p} must be understood before ${node.id}`
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
if (arr(kg.learning_path).length > 0) {
|
|
309
|
+
const orderMap = /* @__PURE__ */ new Map();
|
|
310
|
+
arr(kg.learning_path).forEach((s, idx) => {
|
|
311
|
+
const cid = str(s.concept_id);
|
|
312
|
+
if (cid) orderMap.set(cid, num(s.order, idx + 1));
|
|
313
|
+
});
|
|
314
|
+
nodes.sort((a, b) => (orderMap.get(a.id) ?? 999) - (orderMap.get(b.id) ?? 999));
|
|
272
315
|
}
|
|
273
316
|
let ci = 0;
|
|
274
317
|
for (const cat of arr(kg.categories)) {
|
|
275
318
|
ci += 1;
|
|
276
319
|
const ids = strs(cat.concept_ids).filter((id) => nodes.some((n) => n.id === id));
|
|
277
|
-
if (ids.length > 0)
|
|
320
|
+
if (ids.length > 0) {
|
|
321
|
+
groupings.push({
|
|
322
|
+
id: str(cat.id, "cat" + ci),
|
|
323
|
+
name: str(cat.name, "Category " + ci),
|
|
324
|
+
node_ids: ids,
|
|
325
|
+
rationale: str(cat.description, "")
|
|
326
|
+
});
|
|
327
|
+
}
|
|
278
328
|
}
|
|
279
329
|
newKeywordsInOrder(nodes);
|
|
280
330
|
return validateCurriculumFeed({
|
|
@@ -320,5 +370,5 @@ function emitCurriculumFeed(graph, opts = {}) {
|
|
|
320
370
|
}
|
|
321
371
|
|
|
322
372
|
export { emitCurriculumFeed };
|
|
323
|
-
//# sourceMappingURL=chunk-
|
|
324
|
-
//# sourceMappingURL=chunk-
|
|
373
|
+
//# sourceMappingURL=chunk-HUDFN4IX.mjs.map
|
|
374
|
+
//# sourceMappingURL=chunk-HUDFN4IX.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/feed/curriculumFeedEmitter.ts"],"names":[],"mappings":"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","file":"chunk-HUDFN4IX.mjs","sourcesContent":["import {\n validateCurriculumFeed, type CurriculumFeed, type FeedNode, type FeedEdge, type FeedGrouping,\n} from '../schemas/curriculumFeedSchema';\n\n/**\n * CurriculumFeed emitter - pure transformation from a VERIFIED domain graph\n * to the planner-ready feed. No LLM calls: hints derive from existing\n * annotations only. Validates its own output (fail-closed).\n *\n * Phase-driven emission (hybrid graphs with development phases): the teaching\n * sequence IS the phase sequence. Concepts are emitted at the phase that\n * introduces them (aspect new) or revisits them at higher depth (aspect\n * advanced) - never as a trailing knowledge appendix. Concept minutes stay\n * UNMERGED: no prerequisite-minute inflation (the planner schedules the\n * revisit, not the total).\n */\n\nexport interface EmitFeedOptions {\n hallucinationCount?: number;\n warnings?: string[];\n}\n\nconst BLOOM_RANK: Record<string, number> = { Remember: 0, Understand: 1, Apply: 2, Analyze: 3, Evaluate: 4, Create: 5 };\nconst pad2 = (n: number): string => String(n).padStart(2, '0');\n\ntype Rec = Record<string, unknown>;\nconst arr = (v: unknown): Rec[] => (Array.isArray(v) ? (v as Rec[]) : []);\nconst str = (v: unknown, d = ''): string => (typeof v === 'string' ? v : d);\nconst num = (v: unknown, d: number): number => (typeof v === 'number' && Number.isFinite(v) ? v : d);\nconst strs = (v: unknown): string[] => (Array.isArray(v) ? v.filter((x): x is string => typeof x === 'string') : []);\n\nfunction stepMinutes(step: Rec): number {\n const effort = (step.effort ?? {}) as Rec;\n return Math.max(0, Math.round(num(effort.estimated_minutes, num(step.estimated_minutes, 45))));\n}\n\nfunction newKeywordsInOrder(nodes: FeedNode[]): void {\n // First appearance in emission order becomes 'new'; everything seen before is 'prerequisite'.\n const seen = new Set<string>();\n for (const n of nodes) {\n const all = n.keywords.all;\n n.keywords.new = [];\n n.keywords.prerequisite = [];\n for (const k of all) {\n if (seen.has(k)) n.keywords.prerequisite.push(k);\n else n.keywords.new.push(k);\n seen.add(k);\n }\n }\n}\n\nfunction feedNodeFromStep(step: Rec, featureId: string): FeedNode {\n const id = str(step.id);\n return {\n id,\n kind: 'product_step',\n name: str(step.name, id),\n concept_codes: strs(step.concept_codes),\n keywords: { all: strs(step.keywords), new: [], prerequisite: [] },\n estimated_minutes: stepMinutes(step),\n bloom_hint: 'Apply',\n depth_hint: null,\n completion_level: 'standard',\n scaffolding: { scaffold_candidates: [], core_value_minutes: stepMinutes(step) },\n references: arr(step.files).map((f) => ({ file: str(f), evidence: 'step file' })).filter((f) => f.file),\n feature_id: featureId,\n concept_ref: null,\n phase_id: '',\n introduce_aspect: null,\n };\n}\n\nfunction deriveConceptDepthHint(concept: Rec): FeedNode['depth_hint'] {\n const explicit = str(concept.depth_hint);\n if (explicit === 'ulo' || explicit === 'cio' || explicit === 'sio') return explicit;\n\n const sio = arr(concept.sio);\n const prereqs = strs(concept.prerequisites);\n const pts = arr(concept.problem_types);\n const hasHighBloom = pts.some((p) => {\n const b = str(p.bloom_level);\n return b === 'Apply' || b === 'Analyze' || b === 'Evaluate' || b === 'Create';\n });\n\n if (sio.length >= 2 || hasHighBloom) return 'sio';\n if (str(concept.cio) || prereqs.length >= 1) return 'cio';\n return 'ulo';\n}\n\nfunction feedNodeFromConcept(concept: Rec): FeedNode {\n const id = str(concept.id);\n const pts = arr(concept.problem_types)\n .map((p) => str(p.bloom_level, 'Understand'))\n .filter((b) => b in BLOOM_RANK)\n .sort((a, b) => BLOOM_RANK[a] - BLOOM_RANK[b]);\n const topBloom = pts[pts.length - 1] ?? 'Understand';\n\n const rawRefs = arr(concept.references);\n const references = rawRefs.length > 0\n ? rawRefs.map((r) => ({ file: str(r.file, 'syllabus.md'), evidence: str(r.evidence, str(concept.name)) })).filter((r) => r.file)\n : [{ file: 'syllabus.md', evidence: str(concept.category ? `Topic under category ${str(concept.category)}` : str(concept.name), id) }];\n\n const problemScaffolds = arr(concept.problem_types).map((pt) => ({\n item: str(pt.name, 'Problem type'),\n reason: str(pt.description, 'Formative practice check'),\n minutes_saved: num(pt.estimated_minutes, 10),\n suggest: 'provide_partial' as const,\n }));\n\n return {\n id,\n kind: 'concept',\n name: str(concept.name, id),\n concept_codes: [str(concept.code) || id].filter(Boolean),\n keywords: { all: strs(concept.keywords), new: [], prerequisite: [] },\n estimated_minutes: Math.max(0, Math.round(num(concept.estimated_minutes, 15))),\n bloom_hint: topBloom as FeedNode['bloom_hint'],\n depth_hint: deriveConceptDepthHint(concept),\n completion_level: 'standard',\n scaffolding: {\n scaffold_candidates: problemScaffolds,\n core_value_minutes: Math.max(0, Math.round(num(concept.estimated_minutes, 15))),\n },\n references,\n feature_id: null,\n concept_ref: id,\n phase_id: '',\n introduce_aspect: null,\n };\n}\n\nfunction addFeatureGroup(\n f: Rec, fid: string, nodes: FeedNode[], edges: FeedEdge[], groupings: FeedGrouping[],\n): string[] {\n const steps = arr(f.steps);\n const stepIds: string[] = [];\n let prev = '';\n for (let i = 0; i < steps.length; i++) {\n const stepNode = feedNodeFromStep(steps[i], fid);\n if (!stepNode.id) continue;\n stepIds.push(stepNode.id);\n nodes.push(stepNode);\n if (prev) edges.push({ from: prev, to: stepNode.id, kind: 'task', reason: 'feature build order' });\n prev = stepNode.id;\n }\n for (const dep of strs(f.depends_on)) {\n const depFirst = nodes.find((n) => n.feature_id === dep);\n if (depFirst && stepIds[0]) edges.push({ from: depFirst.id, to: stepIds[0], kind: 'task', reason: 'feature depends_on ' + dep });\n }\n if (stepIds.length > 0) groupings.push({ id: 'G-' + fid, name: str(f.name, fid), node_ids: stepIds, rationale: str(f.description, '') });\n return stepIds;\n}\n\ninterface EmitPhaseCtx {\n id: string;\n order: number;\n name: string;\n productCompletion: string;\n conceptOrder: string[]; // concept node ids in teaching order (new first, then advanced)\n featureIds: string[];\n}\n\n/**\n * Phase-driven hybrid emission:\n * - emit concepts per phase (aspect new first, then advanced) BEFORE the\n * phase's features; knowledge edges concept -> first step of consumer\n * features carry the JIT relation\n * - feature order inside a phase follows the project graph order\n * - phases and their node_ids go into feed.phases (teaching sequence)\n * - concept minutes stay UNMERGED (no prereq-minute accumulation)\n */\nfunction emitFromHybrid(hybrid: Rec, opts: EmitFeedOptions): CurriculumFeed {\n const nodes: FeedNode[] = [];\n const edges: FeedEdge[] = [];\n const groupings: FeedGrouping[] = [];\n const pg = (hybrid.project_graph ?? {}) as Rec;\n const kg = (hybrid.knowledge_graph ?? {}) as Rec;\n const rawPhases = arr(hybrid.phases).filter((p) => str(p.id));\n\n const features = arr(pg.features);\n const conceptRecs = arr(kg.concepts);\n const conceptById = new Map(conceptRecs.map((c) => [str(c.id), c]));\n\n // --- no phases -> legacy path (concepts first, then features) -----------\n if (rawPhases.length === 0) {\n for (const c of conceptRecs) {\n const node = feedNodeFromConcept(c);\n nodes.push(node);\n for (const p of strs(c.prerequisites)) edges.push({ from: p, to: node.id, kind: 'knowledge', reason: 'concept prerequisite' });\n }\n features.forEach((f, fi) => addFeatureGroup(f, str(f.id, 'F' + pad2(fi + 1)), nodes, edges, groupings));\n linkHybridKnowledgeEdges(hybrid, nodes, edges, true);\n newKeywordsInOrder(nodes);\n return validateCurriculumFeed({\n schema_version: 2,\n source: { graph_type: 'hybrid_graph', warnings: opts.warnings ?? [], hallucination_count: opts.hallucinationCount ?? 0 },\n learning_nodes: nodes,\n dependency_edges: edges,\n suggested_groupings: groupings,\n phases: [],\n });\n }\n\n // --- phase-driven emission ----------------------------------------------\n const featureOrder = new Map<string, number>();\n features.forEach((f, fi) => featureOrder.set(str(f.id, 'F' + pad2(fi + 1)), fi));\n const stepIdsByFeature = new Map<string, string[]>();\n for (const f of features) {\n const fid = str(f.id);\n stepIdsByFeature.set(fid, arr(f.steps).map((s) => str(s.id)).filter(Boolean));\n }\n\n const emitCtx: EmitPhaseCtx[] = [];\n const emittedConcepts = new Set<string>();\n const linkList = arr(hybrid.links);\n\n for (const rp of rawPhases) {\n const pid = str(rp.id);\n const order = num(rp.order, emitCtx.length + 1);\n const conceptOrder: string[] = [];\n const intros = arr(rp.introduces);\n // new introductions first, then advanced revisits (teaching order)\n const news = intros.filter((i) => str(i.aspect, 'new') === 'new');\n const advanced = intros.filter((i) => str(i.aspect) === 'advanced');\n for (const intro of [...news, ...advanced]) {\n const cid = str(intro.concept_id);\n const c = conceptById.get(cid);\n if (!c) {\n throw new Error('Phase ' + pid + ' introduces unknown concept ' + cid + ' - fail-closed');\n }\n if (str(intro.aspect, 'new') === 'advanced' && !emittedConcepts.has(cid)) {\n throw new Error('Phase ' + pid + ' advanced-revisits concept ' + cid + ' that was never emitted - fail-closed');\n }\n if (!emittedConcepts.has(cid)) {\n const node = feedNodeFromConcept(c);\n node.phase_id = pid;\n node.introduce_aspect = 'new';\n nodes.push(node);\n for (const p of strs(c.prerequisites)) {\n if (!emittedConcepts.has(p)) {\n throw new Error('Concept ' + cid + ' (phase ' + pid + ') has prerequisite ' + p + ' that is not introduced in an earlier phase - fail-closed');\n }\n edges.push({ from: p, to: cid, kind: 'knowledge', reason: 'concept prerequisite' });\n }\n emittedConcepts.add(cid);\n conceptOrder.push(cid);\n } else {\n // advanced revisit: re-emit as a NEW node with a revisit id so the\n // planner can schedule the higher-depth pass without double-counting\n // the first introduction\n const revisitId = cid + '__ADV' + pad2(order);\n const node = feedNodeFromConcept(c);\n node.id = revisitId;\n node.name = str(c.name, cid) + ' (advanced)';\n node.phase_id = pid;\n node.introduce_aspect = 'advanced';\n node.estimated_minutes = Math.max(15, Math.round(node.estimated_minutes * 0.5));\n node.concept_codes = [str(c.code) || cid];\n edges.push({ from: cid, to: revisitId, kind: 'knowledge', reason: 'advanced revisit of ' + cid + ' at phase ' + pid });\n nodes.push(node);\n conceptOrder.push(revisitId);\n }\n }\n const featureIds = strs(rp.feature_ids)\n .filter((fid) => featureOrder.has(fid))\n .sort((a, b) => featureOrder.get(a)! - featureOrder.get(b)!);\n emitCtx.push({ id: pid, order, name: str(rp.name, pid), productCompletion: str(rp.product_completion), conceptOrder, featureIds });\n }\n\n // Fail-closed: every concept consumed by a link must be emitted somewhere\n for (const l of linkList) {\n const cid = str(l.concept_id);\n if (cid && conceptById.has(cid) && !emittedConcepts.has(cid)) {\n throw new Error('Concept ' + cid + ' is consumed by links but never introduced in any phase - fail-closed');\n }\n }\n // Fail-closed: every feature must sit in exactly one emitted phase\n const seenFeatures = new Set(emitCtx.flatMap((e) => e.featureIds));\n const missingFeatures = features.map((f) => str(f.id)).filter((fid) => fid && !seenFeatures.has(fid));\n if (missingFeatures.length > 0) {\n throw new Error('Features not covered by any phase: ' + missingFeatures.join(', ') + ' - fail-closed');\n }\n\n // Emit feature steps phase by phase (teaching sequence)\n const phaseNodeIds: string[][] = [];\n for (const ctx of emitCtx) {\n const ids: string[] = [...ctx.conceptOrder];\n for (const fid of ctx.featureIds) {\n const f = features.find((x) => str(x.id) === fid)!;\n const stepIds = addFeatureGroup(f, fid, nodes, edges, groupings);\n for (const sid of stepIds) {\n const node = nodes.find((n) => n.id === sid)!;\n node.phase_id = ctx.id;\n }\n ids.push(...stepIds);\n }\n phaseNodeIds.push(ids);\n }\n\n // Knowledge edges: concept -> first step of each consumer feature (JIT).\n // Deduped by (from,to): several links may target the same feature.\n const edgeSeen = new Set(edges.map((e) => e.from + '>' + e.to));\n const pushEdge = (from: string, to: string, reason: string) => {\n const key = from + '>' + to;\n if (edgeSeen.has(key)) return;\n edgeSeen.add(key);\n edges.push({ from, to, kind: 'knowledge', reason });\n };\n for (const l of linkList) {\n const cid = str(l.concept_id);\n const fid = str(l.feature_id);\n if (!conceptById.has(cid)) continue;\n const firstStep = (stepIdsByFeature.get(fid) || [])[0];\n if (!firstStep) continue;\n const depth = str(l.depth, 'cio');\n pushEdge(cid, firstStep, str(l.relationship, 'hybrid link') + ' [' + depth + ']');\n // Advanced revisits feed only features of the revisit's OWN phase: a PH2\n // revisit must never become a prerequisite of a PH1 feature (teaching\n // order is phase-ordered).\n for (const n of nodes) {\n if (n.kind === 'concept' && n.concept_ref === cid && n.introduce_aspect === 'advanced' && n.phase_id === str(l.phase_id)) {\n pushEdge(n.id, firstStep, 'advanced application [' + depth + ']');\n }\n }\n }\n\n newKeywordsInOrder(nodes);\n\n // Deterministic keyword-prerequisite materialization: when a node declares a\n // keyword as PREREQUISITE, some other node must INTRODUCE it (new) EARLIER in\n // feed order. Missing edge = planner can schedule the consumer first while the\n // audit flags ordering it cannot fix. Edge kind 'keyword' — the planner\n // honors it for topological order; 'mastered_before_course' entries are exempt\n // (entry-level keywords need no introducer).\n const feedOrder = new Map(nodes.map((n, i) => [n.id, i]));\n const introducer = new Map<string, string>();\n for (const n of nodes) for (const k of n.keywords?.new ?? []) {\n const key = k.toLowerCase();\n if (!introducer.has(key)) introducer.set(key, n.id);\n }\n for (const n of nodes) {\n for (const k of n.keywords?.prerequisite ?? []) {\n const src = introducer.get(k.toLowerCase());\n if (!src || src === n.id) continue;\n if (feedOrder.get(src)! < feedOrder.get(n.id)!) pushEdge(src, n.id, 'keyword prerequisite [' + k + ']');\n }\n }\n\n const phases = emitCtx.map((ctx, i) => ({\n id: ctx.id,\n order: ctx.order,\n name: ctx.name,\n product_completion: ctx.productCompletion || 'Phase ' + (i + 1) + ' deliverable',\n node_ids: phaseNodeIds[i],\n }));\n\n return validateCurriculumFeed({\n schema_version: 2,\n source: { graph_type: 'hybrid_graph', warnings: opts.warnings ?? [], hallucination_count: opts.hallucinationCount ?? 0 },\n learning_nodes: nodes,\n dependency_edges: edges,\n suggested_groupings: groupings,\n phases,\n });\n}\n\n/** Legacy helper: knowledge edges from hybrid links (used by the no-phase path). */\nfunction linkHybridKnowledgeEdges(hybrid: Rec, nodes: FeedNode[], edges: FeedEdge[], setStepHints: boolean): void {\n const conceptIds = new Set(nodes.filter((n) => n.kind === 'concept').map((n) => n.concept_ref || n.id));\n for (const l of arr(hybrid.links)) {\n const conceptId = str(l.concept_id);\n const featureId = str(l.feature_id);\n if (!conceptIds.has(conceptId)) continue;\n const depth = str(l.depth, 'cio');\n const firstStep = nodes.find((n) => n.feature_id === featureId);\n if (firstStep) {\n edges.push({ from: conceptId, to: firstStep.id, kind: 'knowledge', reason: str(l.relationship, 'hybrid link') + ' [' + depth + ']' });\n if (setStepHints && !firstStep.depth_hint) {\n firstStep.depth_hint = (['ulo', 'cio', 'sio'] as const).includes(depth as 'ulo') ? (depth as FeedNode['depth_hint']) : 'cio';\n }\n }\n }\n}\n\nfunction emitFromKnowledge(kg: Rec, opts: EmitFeedOptions): CurriculumFeed {\n const nodes: FeedNode[] = [];\n const edges: FeedEdge[] = [];\n const groupings: FeedGrouping[] = [];\n const conceptIds = new Set(arr(kg.concepts).map((c) => str(c.id)));\n for (const c of arr(kg.concepts)) {\n const node = feedNodeFromConcept(c);\n nodes.push(node);\n for (const p of strs(c.prerequisites)) {\n if (p !== node.id && conceptIds.has(p)) {\n edges.push({\n from: p,\n to: node.id,\n kind: 'knowledge',\n reason: `concept prerequisite: ${p} must be understood before ${node.id}`,\n });\n }\n }\n }\n\n // Sort nodes by learning_path order if present\n if (arr(kg.learning_path).length > 0) {\n const orderMap = new Map<string, number>();\n arr(kg.learning_path).forEach((s, idx) => {\n const cid = str(s.concept_id);\n if (cid) orderMap.set(cid, num(s.order, idx + 1));\n });\n nodes.sort((a, b) => (orderMap.get(a.id) ?? 999) - (orderMap.get(b.id) ?? 999));\n }\n\n let ci = 0;\n for (const cat of arr(kg.categories)) {\n ci += 1;\n const ids = strs(cat.concept_ids).filter((id) => nodes.some((n) => n.id === id));\n if (ids.length > 0) {\n groupings.push({\n id: str(cat.id, 'cat' + ci),\n name: str(cat.name, 'Category ' + ci),\n node_ids: ids,\n rationale: str(cat.description, ''),\n });\n }\n }\n newKeywordsInOrder(nodes);\n return validateCurriculumFeed({\n schema_version: 2,\n source: { graph_type: 'knowledge_graph', warnings: opts.warnings ?? [], hallucination_count: opts.hallucinationCount ?? 0 },\n learning_nodes: nodes,\n dependency_edges: edges,\n suggested_groupings: groupings,\n phases: [],\n });\n}\n\nfunction emitFromProject(pg: Rec, opts: EmitFeedOptions): CurriculumFeed {\n const nodes: FeedNode[] = [];\n const edges: FeedEdge[] = [];\n const groupings: FeedGrouping[] = [];\n arr(pg.features).forEach((f, fi) => addFeatureGroup(f, str(f.id, 'F' + pad2(fi + 1)), nodes, edges, groupings));\n if (nodes.length === 0 && arr(pg.features).length > 0) {\n const hasTasks = arr((pg.implementation ?? {}) as Rec).length > 0 || arr((pg.implementation as Rec | undefined)?.tasks).length > 0;\n throw new Error(\n 'Project graph has ' + arr(pg.features).length + ' features but NO features[].steps - the curriculum feed cannot emit planning nodes.' +\n (hasTasks\n ? ' This looks like a legacy knowledge-tree graph (implementation.tasks). Regenerate it with the domain-kit v3 pipeline (runProjectGraphPipeline / hybridGraphPipeline), then re-run.'\n : ' Every feature must carry at least one step with id/name/keywords/effort for curriculum planning.'),\n );\n }\n newKeywordsInOrder(nodes);\n return validateCurriculumFeed({\n schema_version: 2,\n source: { graph_type: 'project_graph', warnings: opts.warnings ?? [], hallucination_count: opts.hallucinationCount ?? 0 },\n learning_nodes: nodes,\n dependency_edges: edges,\n suggested_groupings: groupings,\n phases: [],\n });\n}\n\n/** Emit a CurriculumFeed from whichever graph shape is provided (already verified upstream). */\nexport function emitCurriculumFeed(\n graph: unknown,\n opts: EmitFeedOptions = {},\n): CurriculumFeed {\n const g = graph as Rec;\n if (arr(g.learning_nodes).length > 0) {\n return validateCurriculumFeed(g); // already a feed - pass-through validation\n }\n if (g.project_graph || g.knowledge_graph || arr(g.links).length > 0 || arr(g.phases).length > 0) {\n return emitFromHybrid(g, opts);\n }\n if (arr(g.concepts).length > 0 || str(g.type) === 'knowledge_graph') return emitFromKnowledge(g, opts);\n return emitFromProject(g, opts);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-IJZUV7N3.mjs"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-R57WTNXW.mjs"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
// src/parsers/syllabusParser.ts
|
|
2
|
+
var STOP_WORDS = /* @__PURE__ */ new Set([
|
|
3
|
+
"and",
|
|
4
|
+
"the",
|
|
5
|
+
"for",
|
|
6
|
+
"with",
|
|
7
|
+
"from",
|
|
8
|
+
"that",
|
|
9
|
+
"this",
|
|
10
|
+
"into",
|
|
11
|
+
"when",
|
|
12
|
+
"while",
|
|
13
|
+
"using",
|
|
14
|
+
"their",
|
|
15
|
+
"your",
|
|
16
|
+
"each",
|
|
17
|
+
"how",
|
|
18
|
+
"why",
|
|
19
|
+
"what",
|
|
20
|
+
"between",
|
|
21
|
+
"through",
|
|
22
|
+
"about",
|
|
23
|
+
"trong",
|
|
24
|
+
"nhung",
|
|
25
|
+
"cac",
|
|
26
|
+
"cua",
|
|
27
|
+
"cho",
|
|
28
|
+
"voi",
|
|
29
|
+
"duoc",
|
|
30
|
+
"khong",
|
|
31
|
+
"theo",
|
|
32
|
+
"tren",
|
|
33
|
+
"duoi",
|
|
34
|
+
"va",
|
|
35
|
+
"hoac",
|
|
36
|
+
"thi",
|
|
37
|
+
"la",
|
|
38
|
+
"nhu"
|
|
39
|
+
]);
|
|
40
|
+
function extractTokens(text) {
|
|
41
|
+
const words = text.toLowerCase().replace(/[^a-z0-9à-ỹ\s-]/gi, " ").split(/\s+/).filter((w) => w.length >= 3 && !STOP_WORDS.has(w));
|
|
42
|
+
return [...new Set(words)];
|
|
43
|
+
}
|
|
44
|
+
function extractGradeBand(text) {
|
|
45
|
+
const gbMatch = text.match(/(?:grade\s*band|độ\s*tuổi|lớp)\s*[:=]?\s*(?:lớp\s*)?(\d{1,2})\s*(?:-|đến|to)\s*(?:lớp\s*)?(\d{1,2})/i);
|
|
46
|
+
if (gbMatch && gbMatch[1] && gbMatch[2]) {
|
|
47
|
+
const min = parseInt(gbMatch[1], 10);
|
|
48
|
+
const max = parseInt(gbMatch[2], 10);
|
|
49
|
+
return [Math.min(min, max), Math.max(min, max)];
|
|
50
|
+
}
|
|
51
|
+
return void 0;
|
|
52
|
+
}
|
|
53
|
+
function extractDomain(text) {
|
|
54
|
+
const lower = text.toLowerCase();
|
|
55
|
+
if (lower.includes("computer science") || lower.includes("l\u1EADp tr\xECnh") || lower.includes("algorithm") || lower.includes("software")) return "software";
|
|
56
|
+
if (lower.includes("to\xE1n") || lower.includes("geometry") || lower.includes("algebra") || lower.includes("h\xECnh h\u1ECDc") || lower.includes("mathematics")) return "math";
|
|
57
|
+
if (lower.includes("v\u1EADt l\xFD") || lower.includes("h\xF3a h\u1ECDc") || lower.includes("sinh h\u1ECDc") || lower.includes("physics") || lower.includes("chemistry") || lower.includes("biology") || lower.includes("science")) return "science";
|
|
58
|
+
if (lower.includes("ti\u1EBFng") || lower.includes("ng\u1EEF v\u0103n") || lower.includes("grammar") || lower.includes("language") || lower.includes("writing") || lower.includes("literature")) return "language";
|
|
59
|
+
return void 0;
|
|
60
|
+
}
|
|
61
|
+
function parseSyllabus(rawText) {
|
|
62
|
+
const lines = rawText.split(/\r?\n/);
|
|
63
|
+
let subjectTitle = "";
|
|
64
|
+
let subjectDesc = "";
|
|
65
|
+
const units = [];
|
|
66
|
+
const allTopics = [];
|
|
67
|
+
const globalKeywordsSet = /* @__PURE__ */ new Set();
|
|
68
|
+
let currentUnit = null;
|
|
69
|
+
let currentTopic = null;
|
|
70
|
+
let unitIndex = 0;
|
|
71
|
+
let topicIndex = 0;
|
|
72
|
+
for (let i = 0; i < lines.length; i++) {
|
|
73
|
+
const line = lines[i].trim();
|
|
74
|
+
const lineNum = i + 1;
|
|
75
|
+
if (!line) continue;
|
|
76
|
+
if (line.startsWith("# ") && !subjectTitle) {
|
|
77
|
+
subjectTitle = line.replace(/^#\s+/, "").trim();
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (!currentUnit) {
|
|
81
|
+
if (line.toLowerCase().startsWith("m\xF4n h\u1ECDc:") || line.toLowerCase().startsWith("subject:")) {
|
|
82
|
+
const val = line.split(":")[1]?.trim() || "";
|
|
83
|
+
if (val && !subjectTitle) subjectTitle = val;
|
|
84
|
+
}
|
|
85
|
+
if (line.toLowerCase().startsWith("m\xF4 t\u1EA3:") || line.toLowerCase().startsWith("description:")) {
|
|
86
|
+
subjectDesc = line.split(":")[1]?.trim() || "";
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const isUnitHeading = /^##\s+(?:chương|module|unit|phần|chủ đề)\s*(\d+|[ivx]+)?[:.-]?\s*(.*)/i.test(line) || /^##\s+([^#].*)/.test(line);
|
|
90
|
+
if (isUnitHeading) {
|
|
91
|
+
if (currentTopic) {
|
|
92
|
+
currentTopic.rawLineEnd = lineNum - 1;
|
|
93
|
+
currentTopic = null;
|
|
94
|
+
}
|
|
95
|
+
unitIndex += 1;
|
|
96
|
+
const titleMatch = line.replace(/^##\s+/, "").trim();
|
|
97
|
+
currentUnit = {
|
|
98
|
+
id: `U${String(unitIndex).padStart(2, "0")}`,
|
|
99
|
+
title: titleMatch,
|
|
100
|
+
order: unitIndex,
|
|
101
|
+
topics: []
|
|
102
|
+
};
|
|
103
|
+
units.push(currentUnit);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const isTopicItem = /^(?:-\s*\*\*(?:bài|topic|lesson|chủ đề)\s*(\d+(?:\.\d+)?|\w+)?[:.-]?\s*(.*?)\*\*)/i.exec(line) || /^###\s+(?:bài|topic|lesson)?\s*(\d+(?:\.\d+)?|\w+)?[:.-]?\s*(.*)/i.exec(line) || /^-\s+\*\*(.*?)\*\*/.exec(line) || /^(\d+)\.\s+(?:(?:\*\*)?(?:bài|topic|lesson)?\s*(\d+(?:\.\d+)?|\w+)?[:.-]?\s*(.*?)(?:\*\*)?)$/i.exec(line);
|
|
107
|
+
if (isTopicItem) {
|
|
108
|
+
if (currentTopic) {
|
|
109
|
+
currentTopic.rawLineEnd = lineNum - 1;
|
|
110
|
+
}
|
|
111
|
+
if (!currentUnit) {
|
|
112
|
+
unitIndex += 1;
|
|
113
|
+
currentUnit = {
|
|
114
|
+
id: `U${String(unitIndex).padStart(2, "0")}`,
|
|
115
|
+
title: subjectTitle || "General",
|
|
116
|
+
order: unitIndex,
|
|
117
|
+
topics: []
|
|
118
|
+
};
|
|
119
|
+
units.push(currentUnit);
|
|
120
|
+
}
|
|
121
|
+
topicIndex += 1;
|
|
122
|
+
const rawName = (isTopicItem[3] || isTopicItem[2] || isTopicItem[1] || `Topic ${topicIndex}`).trim();
|
|
123
|
+
currentTopic = {
|
|
124
|
+
id: `T${String(topicIndex).padStart(2, "0")}`,
|
|
125
|
+
title: rawName,
|
|
126
|
+
unitId: currentUnit.id,
|
|
127
|
+
unitTitle: currentUnit.title,
|
|
128
|
+
description: "",
|
|
129
|
+
learningObjectives: [],
|
|
130
|
+
keywords: [],
|
|
131
|
+
rawLineStart: lineNum,
|
|
132
|
+
rawLineEnd: lineNum
|
|
133
|
+
};
|
|
134
|
+
currentUnit.topics.push(currentTopic);
|
|
135
|
+
allTopics.push(currentTopic);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (currentTopic) {
|
|
139
|
+
currentTopic.rawLineEnd = lineNum;
|
|
140
|
+
const stripped = line.replace(/^[-*•\s]+/, "").trim();
|
|
141
|
+
if (stripped.toLowerCase().startsWith("m\u1EE5c ti\xEAu:") || stripped.toLowerCase().startsWith("objectives:")) {
|
|
142
|
+
const content = stripped.replace(/^(?:mục tiêu|objectives):\s*/i, "").trim();
|
|
143
|
+
if (content) currentTopic.learningObjectives.push(content);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (stripped.toLowerCase().startsWith("t\u1EEB kh\xF3a:") || stripped.toLowerCase().startsWith("keywords:")) {
|
|
147
|
+
const rawKw = stripped.replace(/^(?:từ khóa|keywords):\s*/i, "").trim();
|
|
148
|
+
const tokens = rawKw.split(/[,;]+/).map((k) => k.trim()).filter(Boolean);
|
|
149
|
+
for (const tok of tokens) {
|
|
150
|
+
currentTopic.keywords.push(tok);
|
|
151
|
+
globalKeywordsSet.add(tok);
|
|
152
|
+
}
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (currentTopic.description) {
|
|
156
|
+
currentTopic.description += " " + stripped;
|
|
157
|
+
} else {
|
|
158
|
+
currentTopic.description = stripped;
|
|
159
|
+
}
|
|
160
|
+
for (const tok of extractTokens(stripped)) {
|
|
161
|
+
if (tok.length >= 4) globalKeywordsSet.add(tok);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (currentTopic) {
|
|
166
|
+
currentTopic.rawLineEnd = lines.length;
|
|
167
|
+
}
|
|
168
|
+
if (!subjectTitle && units.length > 0) {
|
|
169
|
+
subjectTitle = units[0]?.title || "Untitled Subject";
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
subject: {
|
|
173
|
+
title: subjectTitle || "Untitled Subject",
|
|
174
|
+
domain: extractDomain(rawText),
|
|
175
|
+
gradeBand: extractGradeBand(rawText),
|
|
176
|
+
description: subjectDesc
|
|
177
|
+
},
|
|
178
|
+
units,
|
|
179
|
+
allTopics,
|
|
180
|
+
extractedKeywords: [...globalKeywordsSet],
|
|
181
|
+
rawText
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export { parseSyllabus };
|
|
186
|
+
//# sourceMappingURL=chunk-T4Y2DE2W.mjs.map
|
|
187
|
+
//# sourceMappingURL=chunk-T4Y2DE2W.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/parsers/syllabusParser.ts"],"names":[],"mappings":"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","file":"chunk-T4Y2DE2W.mjs","sourcesContent":["/**\n * Syllabus Parser — parses structured Markdown, numbered text, or outlines\n * into a structured ParsedSyllabus object with traceable line references.\n */\n\nexport interface SyllabusTopic {\n id: string;\n title: string;\n unitId: string;\n unitTitle: string;\n description: string;\n learningObjectives: string[];\n keywords: string[];\n rawLineStart: number;\n rawLineEnd: number;\n}\n\nexport interface SyllabusUnit {\n id: string;\n title: string;\n order: number;\n topics: SyllabusTopic[];\n}\n\nexport interface ParsedSyllabus {\n subject: {\n title: string;\n domain?: string;\n gradeBand?: [number, number];\n description?: string;\n estimatedHours?: number;\n };\n units: SyllabusUnit[];\n allTopics: SyllabusTopic[];\n extractedKeywords: string[];\n rawText: string;\n}\n\nconst STOP_WORDS = new Set([\n 'and', 'the', 'for', 'with', 'from', 'that', 'this', 'into', 'when', 'while',\n 'using', 'their', 'your', 'each', 'how', 'why', 'what', 'between', 'through',\n 'about', 'trong', 'nhung', 'cac', 'cua', 'cho', 'voi', 'duoc', 'khong', 'theo',\n 'tren', 'duoi', 'va', 'hoac', 'thi', 'la', 'nhu',\n]);\n\n/**\n * Heuristically extracts meaningful terminology keywords from text tokens.\n */\nfunction extractTokens(text: string): string[] {\n const words = text\n .toLowerCase()\n .replace(/[^a-z0-9à-ỹ\\s-]/gi, ' ')\n .split(/\\s+/)\n .filter((w) => w.length >= 3 && !STOP_WORDS.has(w));\n return [...new Set(words)];\n}\n\n/**\n * Detect grade band from raw text patterns like \"Lớp 7 - Lớp 9\", \"Grade Band: 15-18\", \"12 - 15 tuổi\".\n */\nfunction extractGradeBand(text: string): [number, number] | undefined {\n const gbMatch = text.match(/(?:grade\\s*band|độ\\s*tuổi|lớp)\\s*[:=]?\\s*(?:lớp\\s*)?(\\d{1,2})\\s*(?:-|đến|to)\\s*(?:lớp\\s*)?(\\d{1,2})/i);\n if (gbMatch && gbMatch[1] && gbMatch[2]) {\n const min = parseInt(gbMatch[1], 10);\n const max = parseInt(gbMatch[2], 10);\n return [Math.min(min, max), Math.max(min, max)];\n }\n return undefined;\n}\n\n/**\n * Detect domain from text keywords.\n */\nfunction extractDomain(text: string): string | undefined {\n const lower = text.toLowerCase();\n if (lower.includes('computer science') || lower.includes('lập trình') || lower.includes('algorithm') || lower.includes('software')) return 'software';\n if (lower.includes('toán') || lower.includes('geometry') || lower.includes('algebra') || lower.includes('hình học') || lower.includes('mathematics')) return 'math';\n if (lower.includes('vật lý') || lower.includes('hóa học') || lower.includes('sinh học') || lower.includes('physics') || lower.includes('chemistry') || lower.includes('biology') || lower.includes('science')) return 'science';\n if (lower.includes('tiếng') || lower.includes('ngữ văn') || lower.includes('grammar') || lower.includes('language') || lower.includes('writing') || lower.includes('literature')) return 'language';\n return undefined;\n}\n\n/**\n * Main syllabus parser function.\n */\nexport function parseSyllabus(rawText: string): ParsedSyllabus {\n const lines = rawText.split(/\\r?\\n/);\n let subjectTitle = '';\n let subjectDesc = '';\n\n const units: SyllabusUnit[] = [];\n const allTopics: SyllabusTopic[] = [];\n const globalKeywordsSet = new Set<string>();\n\n let currentUnit: SyllabusUnit | null = null;\n let currentTopic: SyllabusTopic | null = null;\n let unitIndex = 0;\n let topicIndex = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!.trim();\n const lineNum = i + 1;\n if (!line) continue;\n\n // 1. Level 1 Heading: Subject Title\n if (line.startsWith('# ') && !subjectTitle) {\n subjectTitle = line.replace(/^#\\s+/, '').trim();\n continue;\n }\n\n // 2. Metadata lines at root\n if (!currentUnit) {\n if (line.toLowerCase().startsWith('môn học:') || line.toLowerCase().startsWith('subject:')) {\n const val = line.split(':')[1]?.trim() || '';\n if (val && !subjectTitle) subjectTitle = val;\n }\n if (line.toLowerCase().startsWith('mô tả:') || line.toLowerCase().startsWith('description:')) {\n subjectDesc = line.split(':')[1]?.trim() || '';\n }\n }\n\n // 3. Level 2 Heading: Unit / Chapter / Module\n const isUnitHeading = /^##\\s+(?:chương|module|unit|phần|chủ đề)\\s*(\\d+|[ivx]+)?[:.-]?\\s*(.*)/i.test(line)\n || /^##\\s+([^#].*)/.test(line);\n\n if (isUnitHeading) {\n if (currentTopic) {\n currentTopic.rawLineEnd = lineNum - 1;\n currentTopic = null;\n }\n unitIndex += 1;\n const titleMatch = line.replace(/^##\\s+/, '').trim();\n currentUnit = {\n id: `U${String(unitIndex).padStart(2, '0')}`,\n title: titleMatch,\n order: unitIndex,\n topics: [],\n };\n units.push(currentUnit);\n continue;\n }\n\n // 4. Topic heading inside Unit: \"- **Bài X: ...**\", \"### Topic ...\", \"1. Bài ...\", or \"- **...**\"\n const isTopicItem = /^(?:-\\s*\\*\\*(?:bài|topic|lesson|chủ đề)\\s*(\\d+(?:\\.\\d+)?|\\w+)?[:.-]?\\s*(.*?)\\*\\*)/i.exec(line)\n || /^###\\s+(?:bài|topic|lesson)?\\s*(\\d+(?:\\.\\d+)?|\\w+)?[:.-]?\\s*(.*)/i.exec(line)\n || /^-\\s+\\*\\*(.*?)\\*\\*/.exec(line)\n || /^(\\d+)\\.\\s+(?:(?:\\*\\*)?(?:bài|topic|lesson)?\\s*(\\d+(?:\\.\\d+)?|\\w+)?[:.-]?\\s*(.*?)(?:\\*\\*)?)$/i.exec(line);\n\n if (isTopicItem) {\n if (currentTopic) {\n currentTopic.rawLineEnd = lineNum - 1;\n }\n if (!currentUnit) {\n unitIndex += 1;\n currentUnit = {\n id: `U${String(unitIndex).padStart(2, '0')}`,\n title: subjectTitle || 'General',\n order: unitIndex,\n topics: [],\n };\n units.push(currentUnit);\n }\n topicIndex += 1;\n const rawName = (isTopicItem[3] || isTopicItem[2] || isTopicItem[1] || `Topic ${topicIndex}`).trim();\n currentTopic = {\n id: `T${String(topicIndex).padStart(2, '0')}`,\n title: rawName,\n unitId: currentUnit.id,\n unitTitle: currentUnit.title,\n description: '',\n learningObjectives: [],\n keywords: [],\n rawLineStart: lineNum,\n rawLineEnd: lineNum,\n };\n currentUnit.topics.push(currentTopic);\n allTopics.push(currentTopic);\n continue;\n }\n\n // 5. Content lines inside Topic\n if (currentTopic) {\n currentTopic.rawLineEnd = lineNum;\n const stripped = line.replace(/^[-*•\\s]+/, '').trim();\n\n // Objectives line\n if (stripped.toLowerCase().startsWith('mục tiêu:') || stripped.toLowerCase().startsWith('objectives:')) {\n const content = stripped.replace(/^(?:mục tiêu|objectives):\\s*/i, '').trim();\n if (content) currentTopic.learningObjectives.push(content);\n continue;\n }\n\n // Keywords line\n if (stripped.toLowerCase().startsWith('từ khóa:') || stripped.toLowerCase().startsWith('keywords:')) {\n const rawKw = stripped.replace(/^(?:từ khóa|keywords):\\s*/i, '').trim();\n const tokens = rawKw.split(/[,;]+/).map((k) => k.trim()).filter(Boolean);\n for (const tok of tokens) {\n currentTopic.keywords.push(tok);\n globalKeywordsSet.add(tok);\n }\n continue;\n }\n\n // General description line\n if (currentTopic.description) {\n currentTopic.description += ' ' + stripped;\n } else {\n currentTopic.description = stripped;\n }\n\n // Harvest tokens\n for (const tok of extractTokens(stripped)) {\n if (tok.length >= 4) globalKeywordsSet.add(tok);\n }\n }\n }\n\n // Close last topic if open\n if (currentTopic) {\n currentTopic.rawLineEnd = lines.length;\n }\n\n // Fallback subject title\n if (!subjectTitle && units.length > 0) {\n subjectTitle = units[0]?.title || 'Untitled Subject';\n }\n\n return {\n subject: {\n title: subjectTitle || 'Untitled Subject',\n domain: extractDomain(rawText),\n gradeBand: extractGradeBand(rawText),\n description: subjectDesc,\n },\n units,\n allTopics,\n extractedKeywords: [...globalKeywordsSet],\n rawText,\n };\n}\n"]}
|
|
@@ -372,6 +372,51 @@ var ThreeDesignTechStackExtensionSchema = z.object({
|
|
|
372
372
|
canvas_size: z.string().optional(),
|
|
373
373
|
export_formats: z.array(z.string()).optional().default([]).describe("STL, OBJ, STEP")
|
|
374
374
|
});
|
|
375
|
+
var MathTheoremSchema = z.object({
|
|
376
|
+
name: z.string(),
|
|
377
|
+
statement: z.string(),
|
|
378
|
+
proof_outline: z.string().optional(),
|
|
379
|
+
converse_statement: z.string().optional()
|
|
380
|
+
});
|
|
381
|
+
var MathConceptExtensionSchema = z.object({
|
|
382
|
+
formulas: z.array(z.string()).optional().default([]).describe("Mathematical formulas, e.g. a^2 + b^2 = c^2"),
|
|
383
|
+
theorems: z.array(MathTheoremSchema).optional().default([]),
|
|
384
|
+
constructions: z.array(z.string()).optional().default([]).describe("Compass and ruler constructions, auxiliary lines"),
|
|
385
|
+
visual_aids: z.array(z.string()).optional().default([]).describe("Geometric figures, function graphs"),
|
|
386
|
+
common_mistakes: z.array(z.string()).optional().default([]).describe("False intuitions or algebraic traps")
|
|
387
|
+
});
|
|
388
|
+
var ExperimentProcedureSchema = z.object({
|
|
389
|
+
name: z.string(),
|
|
390
|
+
apparatus: z.array(z.string()).optional().default([]),
|
|
391
|
+
steps: z.array(z.string()).optional().default([]),
|
|
392
|
+
safety_warnings: z.array(z.string()).optional().default([]),
|
|
393
|
+
expected_observation: z.string().optional()
|
|
394
|
+
});
|
|
395
|
+
var ScienceConceptExtensionSchema = z.object({
|
|
396
|
+
experiments: z.array(ExperimentProcedureSchema).optional().default([]),
|
|
397
|
+
instruments: z.array(z.string()).optional().default([]).describe("Lab equipment: microscope, beaker, sensor"),
|
|
398
|
+
variables: z.object({
|
|
399
|
+
independent: z.string().optional(),
|
|
400
|
+
dependent: z.string().optional(),
|
|
401
|
+
controlled: z.array(z.string()).optional().default([])
|
|
402
|
+
}).optional(),
|
|
403
|
+
hypotheses: z.array(z.string()).optional().default([]),
|
|
404
|
+
laws_and_theories: z.array(z.string()).optional().default([])
|
|
405
|
+
});
|
|
406
|
+
var GrammarRuleSchema = z.object({
|
|
407
|
+
rule_name: z.string(),
|
|
408
|
+
pattern: z.string(),
|
|
409
|
+
example_correct: z.string(),
|
|
410
|
+
example_incorrect: z.string().optional(),
|
|
411
|
+
exceptions: z.array(z.string()).optional().default([])
|
|
412
|
+
});
|
|
413
|
+
var LanguageConceptExtensionSchema = z.object({
|
|
414
|
+
reading_genres: z.array(z.string()).optional().default([]).describe("argumentative, narrative, expository"),
|
|
415
|
+
grammar_rules: z.array(GrammarRuleSchema).optional().default([]),
|
|
416
|
+
writing_tasks: z.array(z.string()).optional().default([]),
|
|
417
|
+
lexicon_keywords: z.array(z.string()).optional().default([]),
|
|
418
|
+
rhetorical_devices: z.array(z.string()).optional().default([])
|
|
419
|
+
});
|
|
375
420
|
var ProjectConceptLinkSchema = z.object({
|
|
376
421
|
feature_id: z.string().describe("Feature ID from project_graph"),
|
|
377
422
|
concept_id: z.string().describe("Concept ID from knowledge_graph"),
|
|
@@ -511,6 +556,6 @@ var DomainProfileSchema = z.object({
|
|
|
511
556
|
syllabusText: z.string().optional().default("")
|
|
512
557
|
});
|
|
513
558
|
|
|
514
|
-
export { ArchEdgeSchema, ArchNodeSchema, ArchitectureDetailSchema, CapabilitySchema, ConceptCategorySchema, ConceptIntroductionSchema, ConceptSchema, DataIntegrationSchema, DecompositionSchema, DetectionConfidenceSchema, DevelopmentPhaseSchema, DevelopmentStageSchema, DomainCategorySchema, DomainProfileSchema, ExperienceComponentSchema, ExperienceSchema, FeatureSchema, GraphTypeSchema, HardwareFeatureExtensionSchema, HardwareStepSchema, HardwareTaskExtensionSchema, HardwareTechStackExtensionSchema, HybridGraphSchema, ImplementationSchema, InputTypeSchema, JourneySchema, JourneyStepSchema, KnowledgeGraphSchema, LearningModeSchema, LearningPathStepSchema, MilestoneDecompositionSchema, MissingGapSchema, NavigationSchema, ProblemTypeSchema, ProductGoalSchema, ProductSchema, ProductUserSchema, ProjectConceptLinkSchema, ProjectGraphSchema, ProjectInfoSchema, RequirementSchema, ScreenSchema, ShapeSchema, StepEffortSchema, StepOutcomeSchema, StepSchema, SubjectInfoSchema, TaskEffortSchema, TaskOutcomeSchema, TaskSchema, TechDebtSchema, TechStackSchema, ThreeDesignFeatureExtensionSchema, ThreeDesignTaskExtensionSchema, ThreeDesignTechStackExtensionSchema, UiStateSchema, WiringSchema };
|
|
515
|
-
//# sourceMappingURL=chunk-
|
|
516
|
-
//# sourceMappingURL=chunk-
|
|
559
|
+
export { ArchEdgeSchema, ArchNodeSchema, ArchitectureDetailSchema, CapabilitySchema, ConceptCategorySchema, ConceptIntroductionSchema, ConceptSchema, DataIntegrationSchema, DecompositionSchema, DetectionConfidenceSchema, DevelopmentPhaseSchema, DevelopmentStageSchema, DomainCategorySchema, DomainProfileSchema, ExperienceComponentSchema, ExperienceSchema, ExperimentProcedureSchema, FeatureSchema, GrammarRuleSchema, GraphTypeSchema, HardwareFeatureExtensionSchema, HardwareStepSchema, HardwareTaskExtensionSchema, HardwareTechStackExtensionSchema, HybridGraphSchema, ImplementationSchema, InputTypeSchema, JourneySchema, JourneyStepSchema, KnowledgeGraphSchema, LanguageConceptExtensionSchema, LearningModeSchema, LearningPathStepSchema, MathConceptExtensionSchema, MathTheoremSchema, MilestoneDecompositionSchema, MissingGapSchema, NavigationSchema, ProblemTypeSchema, ProductGoalSchema, ProductSchema, ProductUserSchema, ProjectConceptLinkSchema, ProjectGraphSchema, ProjectInfoSchema, RequirementSchema, ScienceConceptExtensionSchema, ScreenSchema, ShapeSchema, StepEffortSchema, StepOutcomeSchema, StepSchema, SubjectInfoSchema, TaskEffortSchema, TaskOutcomeSchema, TaskSchema, TechDebtSchema, TechStackSchema, ThreeDesignFeatureExtensionSchema, ThreeDesignTaskExtensionSchema, ThreeDesignTechStackExtensionSchema, UiStateSchema, WiringSchema };
|
|
560
|
+
//# sourceMappingURL=chunk-WHBAGJWN.mjs.map
|
|
561
|
+
//# sourceMappingURL=chunk-WHBAGJWN.mjs.map
|