@thanh01.pmt/curriculum-kit 1.4.0 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1301,7 +1301,9 @@ var LessonPlanSchema = z.object({
1301
1301
  name: z.string().optional().default(""),
1302
1302
  description: z.string(),
1303
1303
  bloomLevel: z.string().default("understand"),
1304
- successCriteria: z.string().optional().default("")
1304
+ successCriteria: z.string().optional().default(""),
1305
+ standardRefs: z.array(z.string()).optional(),
1306
+ conceptRefs: z.array(z.string()).optional()
1305
1307
  })).default([]),
1306
1308
  prerequisites: z.string().optional().default(""),
1307
1309
  materialsSummary: z.string().optional().default(""),
@@ -9816,7 +9818,6 @@ var DEFAULT_KX_PRIORITIES = [
9816
9818
  ];
9817
9819
  function buildSectionAwareExcerpt(markdown, opts = {}) {
9818
9820
  const budget = opts.budget ?? 12e3;
9819
- const minContentChars = opts.minContentChars ?? 400;
9820
9821
  const issues = [];
9821
9822
  const source = (markdown || "").trim();
9822
9823
  if (!source) {
@@ -9829,9 +9830,11 @@ function buildSectionAwareExcerpt(markdown, opts = {}) {
9829
9830
  tokenEstimate: 0
9830
9831
  };
9831
9832
  }
9833
+ const minContentChars = opts.minContentChars !== void 0 ? opts.minContentChars : Math.min(400, source.length);
9832
9834
  const slcMap = normalizeSlcContract(opts.sectionLanguageContract);
9833
- const sections = parseMarkdownSections(source, slcMap, opts.artifactType);
9834
- const metaBlock = buildMetaBlock(source);
9835
+ const effectiveArtifactType = opts.artifactType || deriveArtifactTypeFromFileName(opts.fileName);
9836
+ const sections = parseMarkdownSections(source, slcMap, effectiveArtifactType);
9837
+ const metaBlock = buildMetaBlock(source, effectiveArtifactType);
9835
9838
  if (sections.length === 0) {
9836
9839
  issues.push("parse:no-sections");
9837
9840
  const excerpt2 = truncateByBudget(source, budget);
@@ -9847,44 +9850,74 @@ function buildSectionAwareExcerpt(markdown, opts = {}) {
9847
9850
  };
9848
9851
  }
9849
9852
  const byCanonical = /* @__PURE__ */ new Map();
9853
+ const byCleanTitle = /* @__PURE__ */ new Map();
9850
9854
  const unmatched = [];
9851
9855
  for (const s of sections) {
9852
9856
  if (s.canonicalKey && !byCanonical.has(s.canonicalKey)) {
9853
9857
  byCanonical.set(s.canonicalKey, s);
9854
- } else {
9858
+ }
9859
+ const norm = normalizeHeading(s.cleanTitle);
9860
+ if (!byCleanTitle.has(norm)) {
9861
+ byCleanTitle.set(norm, s);
9862
+ }
9863
+ if (!s.canonicalKey) {
9855
9864
  unmatched.push(s);
9856
9865
  }
9857
9866
  }
9858
9867
  const priorities = opts.priorities ?? DEFAULT_LESSON_PRIORITIES;
9859
9868
  const includedSections = [];
9860
9869
  const blocks = [];
9861
- let used = 0;
9870
+ const initialOverhead = metaBlock ? metaBlock.length + 2 : 0;
9871
+ let used = initialOverhead;
9862
9872
  const tryAdd = (heading, body, key) => {
9863
9873
  const trimmedBody = body.trim();
9864
9874
  if (!trimmedBody) return false;
9865
9875
  const block = `## ${heading}
9866
9876
 
9867
9877
  ${trimmedBody}`;
9868
- if (used + block.length > budget && used > 0) return false;
9869
- blocks.push(block);
9870
- used += block.length;
9871
- includedSections.push(key);
9872
- return true;
9878
+ if (used + block.length <= budget) {
9879
+ blocks.push(block);
9880
+ used += block.length;
9881
+ includedSections.push(key);
9882
+ return true;
9883
+ }
9884
+ if (includedSections.length === 0 && budget >= minContentChars) {
9885
+ const headingOverhead = `## ${heading}
9886
+
9887
+ `.length;
9888
+ const remaining = budget - used;
9889
+ if (remaining > headingOverhead + 50) {
9890
+ const allowedBody = remaining - headingOverhead;
9891
+ const truncated = truncateByBudget(trimmedBody, allowedBody).trim();
9892
+ if (truncated.length > 0) {
9893
+ const partialBlock = `## ${heading}
9894
+
9895
+ ${truncated}`;
9896
+ blocks.push(partialBlock);
9897
+ used += partialBlock.length;
9898
+ includedSections.push(key);
9899
+ issues.push(`section:truncated:${key}`);
9900
+ return true;
9901
+ }
9902
+ }
9903
+ }
9904
+ return false;
9873
9905
  };
9874
9906
  blocks.push(metaBlock);
9875
9907
  let sectionAware = false;
9876
9908
  for (const key of priorities) {
9877
- const sec = byCanonical.get(key);
9909
+ const sec = byCanonical.get(key) || byCleanTitle.get(normalizeHeading(key));
9878
9910
  if (!sec) continue;
9879
9911
  sectionAware = true;
9880
9912
  if (!tryAdd(sec.cleanTitle, sec.body, key)) break;
9881
9913
  }
9882
9914
  for (const [key, sec] of byCanonical) {
9883
- if (includedSections.includes(key)) continue;
9915
+ if (includedSections.includes(key) || includedSections.includes(sec.cleanTitle)) continue;
9884
9916
  if (used >= budget) break;
9885
9917
  if (!tryAdd(sec.cleanTitle, sec.body, key)) break;
9886
9918
  }
9887
9919
  for (const sec of unmatched) {
9920
+ if (includedSections.includes(sec.cleanTitle)) continue;
9888
9921
  if (used >= budget) break;
9889
9922
  if (!tryAdd(sec.cleanTitle, sec.body, sec.cleanTitle)) break;
9890
9923
  }
@@ -9892,17 +9925,16 @@ ${trimmedBody}`;
9892
9925
  issues.push("parse:no-canonical-resolution");
9893
9926
  }
9894
9927
  if (priorities.length > 0 && !priorities.some((k) => includedSections.includes(k))) {
9895
- issues.push("parse:no-priority-resolution");
9928
+ issues.push(sections.length === 0 ? "parse:no-sections" : "parse:no-priority-resolution");
9896
9929
  }
9897
9930
  let excerpt = blocks.join("\n\n");
9898
9931
  if (excerpt.length > budget) {
9899
9932
  excerpt = truncateByBudget(excerpt, budget);
9900
9933
  }
9901
- const effectiveMinChars = Math.min(minContentChars, source.length);
9902
- if (excerpt.length - metaBlock.length < effectiveMinChars) {
9934
+ if (excerpt.length - metaBlock.length < minContentChars) {
9903
9935
  issues.push("content:insufficient");
9904
9936
  }
9905
- const verified = !issues.includes("parse:no-priority-resolution") && !issues.includes("parse:no-canonical-resolution") && excerpt.length - metaBlock.length >= effectiveMinChars;
9937
+ const verified = !issues.includes("parse:no-priority-resolution") && !issues.includes("parse:no-canonical-resolution") && excerpt.length - metaBlock.length >= minContentChars;
9906
9938
  return {
9907
9939
  excerpt,
9908
9940
  verified,
@@ -9962,7 +9994,7 @@ function parseMarkdownSections(markdown, slcMap, artifactType) {
9962
9994
  }
9963
9995
  }
9964
9996
  const flush = () => {
9965
- if (!currentHeading && currentBody.length === 0) return;
9997
+ if (!currentHeading) return;
9966
9998
  const cleanTitle = currentHeading.replace(/^#{1,4}\s+/, "").trim();
9967
9999
  const norm = normalizeHeading(cleanTitle);
9968
10000
  const canonicalKey = reverseMap.get(norm) || findCanonicalFuzzy(norm);
@@ -10022,7 +10054,7 @@ function truncateByBudget(source, budget) {
10022
10054
  if (fenceCount % 2 === 1) cut += "\n```";
10023
10055
  return cut;
10024
10056
  }
10025
- function buildMetaBlock(source) {
10057
+ function buildMetaBlock(source, artifactType) {
10026
10058
  const fm = source.match(/^---\s*\r?\n([\s\S]*?)\r?\n---/);
10027
10059
  const pick = (key) => {
10028
10060
  if (!fm) return "";
@@ -10031,9 +10063,17 @@ function buildMetaBlock(source) {
10031
10063
  };
10032
10064
  const id = pick("id");
10033
10065
  const title = pick("title");
10034
- const type = pick("type");
10066
+ const type = pick("type") || artifactType || "";
10035
10067
  return `<!-- SOURCE: ${type || "ARTIFACT"} | ${id || "unknown"}${title ? ` \u2014 ${title}` : ""} (section-aware excerpt; canonical knowledge, do not contradict) -->`;
10036
10068
  }
10069
+ function deriveArtifactTypeFromFileName(fileName) {
10070
+ if (!fileName) return void 0;
10071
+ const base = fileName.replace(/\.md$/i, "");
10072
+ const multiWord = base.match(/^(KNOWLEDGE_EXPOSITION|SECTION_LANGUAGE_CONTRACT|CONTENT_STYLE_GUIDE|CURRICULUM_FRAMEWORK|LEARNER_PROFILE|PROJECT_BRIEF|REFERENCE_PACK|CURRICULUM_PLAN)/i);
10073
+ if (multiWord) return multiWord[1].toUpperCase();
10074
+ const token = base.match(/^([A-Z][A-Z0-9_]*?)(?=_|$)/);
10075
+ return token ? token[1] : void 0;
10076
+ }
10037
10077
 
10038
10078
  // src/services/knowledgeExpositionService.ts
10039
10079
  var EXPOSITION_REL = (lessonCode) => "_sot/expositions/" + lessonCode + ".md";
@@ -10937,6 +10977,120 @@ function buildStandardsContext(input) {
10937
10977
  const selected = selectStatementsForLesson(input);
10938
10978
  return { block: buildStandardsContextBlock(selected, { language: input.language }), selected };
10939
10979
  }
10980
+
10981
+ // src/standards/standardsCoverageGate.ts
10982
+ function resolveStatementRef(ref, packs) {
10983
+ const [head, ...rest] = ref.split(":");
10984
+ const candidatePacks = rest.length > 0 ? packs.filter((p) => p.manifest.id === head) : packs;
10985
+ const statementId = rest.length > 0 ? rest.join(":") : ref;
10986
+ for (const p of candidatePacks) {
10987
+ if (p.statements.some((s) => s.id === statementId)) return { pack: p, statementId };
10988
+ }
10989
+ return null;
10990
+ }
10991
+ function evaluateStandardsCoverage(input) {
10992
+ const rows = [];
10993
+ const aoToLo = /* @__PURE__ */ new Map();
10994
+ for (const ao of input.assessmentObjectives ?? []) aoToLo.set(ao.aoCode, ao.alignedLO);
10995
+ const loToRefs = /* @__PURE__ */ new Map();
10996
+ for (const lo of input.objectives) {
10997
+ loToRefs.set(lo.code, new Set(lo.standardRefs ?? []));
10998
+ }
10999
+ const taughtLOs = /* @__PURE__ */ new Set();
11000
+ for (const act of input.activities ?? []) for (const lo of act.lo) taughtLOs.add(lo);
11001
+ const assessedLOs = /* @__PURE__ */ new Set();
11002
+ for (const q of input.quizQuestions) {
11003
+ if (q.alignedLO) assessedLOs.add(q.alignedLO);
11004
+ if (q.alignedAO) {
11005
+ const lo = aoToLo.get(q.alignedAO);
11006
+ if (lo) assessedLOs.add(lo);
11007
+ }
11008
+ }
11009
+ for (const pack of input.packs) {
11010
+ const mappingByStatement = /* @__PURE__ */ new Map();
11011
+ for (const m of pack.mappings ?? []) {
11012
+ const prev = mappingByStatement.get(m.statementId);
11013
+ if (!prev || prev !== "covers" && m.kind === "covers" || prev === "extends" && m.kind !== "extends") {
11014
+ mappingByStatement.set(m.statementId, m.kind);
11015
+ }
11016
+ }
11017
+ for (const statement of pack.statements) {
11018
+ const refFull = `${pack.manifest.id}:${statement.id}`;
11019
+ const issues = [];
11020
+ const los = input.objectives.filter((lo) => (lo.standardRefs ?? []).some((r) => r === statement.id || r === refFull)).map((lo) => lo.code);
11021
+ const kind = mappingByStatement.get(statement.id);
11022
+ const hasMapping = kind !== void 0;
11023
+ const isComplianceRelevant = kind === "covers";
11024
+ const hasActivity = los.some((lo) => taughtLOs.has(lo));
11025
+ const hasAssessment = los.some((lo) => assessedLOs.has(lo));
11026
+ let status;
11027
+ if (!hasMapping) status = "UNMAPPED";
11028
+ else if (!isComplianceRelevant) status = "PARTIAL";
11029
+ else if (los.length > 0 && hasActivity && hasAssessment) status = "COVERED";
11030
+ else status = "UNCOVERED";
11031
+ if (status === "UNCOVERED") {
11032
+ if (los.length === 0) issues.push("No learning objective anchors this statement (missing standardRefs).");
11033
+ else {
11034
+ if (!hasActivity) issues.push(`Anchored LO(s) ${los.join(", ")} have no activity in lesson flow.`);
11035
+ if (!hasAssessment) issues.push(`Anchored LO(s) ${los.join(", ")} are not measured by any quiz question.`);
11036
+ }
11037
+ }
11038
+ rows.push({
11039
+ packId: pack.manifest.id,
11040
+ statementId: statement.id,
11041
+ statementText: Object.values(statement.texts)[0] ?? "",
11042
+ status,
11043
+ objectives: los,
11044
+ hasActivity,
11045
+ hasAssessment,
11046
+ issues
11047
+ });
11048
+ }
11049
+ }
11050
+ for (const lo of input.objectives) {
11051
+ for (const r of lo.standardRefs ?? []) {
11052
+ if (!resolveStatementRef(r, input.packs)) {
11053
+ rows.push({
11054
+ packId: "(unresolved)",
11055
+ statementId: r,
11056
+ statementText: "",
11057
+ status: "UNCOVERED",
11058
+ objectives: [lo.code],
11059
+ hasActivity: false,
11060
+ hasAssessment: false,
11061
+ issues: [`standardRef "${r}" does not exist in any adopted pack \u2014 likely a hallucinated or stale ID`]
11062
+ });
11063
+ }
11064
+ }
11065
+ }
11066
+ const complianceRows = rows.filter((r) => r.status !== "UNMAPPED" && r.status !== "PARTIAL");
11067
+ const covered = complianceRows.filter((r) => r.status === "COVERED").length;
11068
+ const coveragePct = complianceRows.length === 0 ? 100 : Math.round(covered / complianceRows.length * 100);
11069
+ const unresolvedCount = rows.filter((r) => r.packId === "(unresolved)").length;
11070
+ const verdict = unresolvedCount > 0 || coveragePct < 60 ? "FAIL" : coveragePct < 100 ? "WARN" : "PASS";
11071
+ const lines = [
11072
+ "# Standards Coverage Report",
11073
+ "",
11074
+ `- Verdict: **${verdict}**`,
11075
+ `- Compliance coverage: **${coveragePct}%** (${covered}/${complianceRows.length} "covers" statements fully taught + assessed)`,
11076
+ `- Unresolved standardRefs: ${unresolvedCount}`,
11077
+ "",
11078
+ "| Pack | Statement | Status | LOs | Activity | Assessment |",
11079
+ "|---|---|---|---|---|---|",
11080
+ ...rows.map(
11081
+ (r) => `|${r.packId}|${r.statementId}|${r.status}|${r.objectives.join(", ") || "\u2014"}|${r.hasActivity ? "\u2713" : "\u2717"}|${r.hasAssessment ? "\u2713" : "\u2717"}|`
11082
+ )
11083
+ ];
11084
+ const issueLines = rows.filter((r) => r.issues.length > 0).flatMap((r) => r.issues.map((i) => `- [${r.packId}:${r.statementId}] ${i}`));
11085
+ if (issueLines.length > 0) lines.push("", "## Issues", ...issueLines);
11086
+ return {
11087
+ verdict,
11088
+ coveragePct,
11089
+ rows,
11090
+ summary: `Standards coverage ${coveragePct}% \u2014 verdict ${verdict}`,
11091
+ rawMarkdownReport: lines.join("\n")
11092
+ };
11093
+ }
10940
11094
  var BloomHintSchema = z.object({
10941
11095
  process: z.enum(["Remember", "Understand", "Apply", "Analyze", "Evaluate", "Create"]).describe("Cognitive process axis"),
10942
11096
  knowledge: z.enum(["FACTUAL", "CONCEPTUAL", "PROCEDURAL", "METACOGNITIVE"]).optional().describe("Knowledge dimension axis (optional \u2014 most source standards do not tag it)")
@@ -11372,9 +11526,170 @@ var csta_k12_2017_default = {
11372
11526
  ]
11373
11527
  };
11374
11528
 
11529
+ // src/standards/data/acm-ieee-cs2023.json
11530
+ var acm_ieee_cs2023_default = {
11531
+ manifest: {
11532
+ id: "acm-ieee-cs2023",
11533
+ name: "ACM/IEEE-CS/AAAI Computer Science Curricula 2023 (CS2023)",
11534
+ specVersion: "1.0",
11535
+ contentVersion: "2023.1",
11536
+ subject: "computing",
11537
+ languages: ["en"],
11538
+ gradeModel: {
11539
+ type: "grades",
11540
+ range: [9, 16]
11541
+ },
11542
+ provenance: {
11543
+ sourceRef: "ACM/IEEE-CS/AAAI Computer Science Curricula 2023 - cs2023.org",
11544
+ sourceUrl: "https://cs2023.org",
11545
+ license: "ACM / IEEE Computer Society (cited verbatim for curriculum alignment)",
11546
+ importedBy: "platform",
11547
+ importedAt: "2026-09-11T00:00:00.000Z"
11548
+ },
11549
+ trust: "verified"
11550
+ },
11551
+ statements: [
11552
+ {
11553
+ id: "CS2023-SDF-01",
11554
+ gradeBand: [9, 14],
11555
+ texts: {
11556
+ en: "Design, implement, test, and debug programs using basic computation, standard conditional and iterative structures, and functions."
11557
+ },
11558
+ classifications: [
11559
+ { axis: "Knowledge Area", value: "Software Development Fundamentals (SDF)" },
11560
+ { axis: "Core Tier", value: "Tier-1 Core" }
11561
+ ],
11562
+ bloomHint: { process: "Apply" },
11563
+ keywords: ["algorithms", "control structures", "functions", "variables", "debugging", "programming", "implementation"],
11564
+ sourceRef: "CS2023, Software Development Fundamentals, Program Construction",
11565
+ provenance: { method: "source_official" }
11566
+ },
11567
+ {
11568
+ id: "CS2023-SDF-02",
11569
+ gradeBand: [9, 14],
11570
+ texts: {
11571
+ en: "Apply fundamental data structures (arrays, lists, stacks, queues, hash maps) to represent collections of data and solve algorithmic problems."
11572
+ },
11573
+ classifications: [
11574
+ { axis: "Knowledge Area", value: "Software Development Fundamentals (SDF)" },
11575
+ { axis: "Core Tier", value: "Tier-1 Core" }
11576
+ ],
11577
+ bloomHint: { process: "Apply" },
11578
+ keywords: ["data structures", "arrays", "lists", "hash maps", "collections", "stacks", "queues"],
11579
+ sourceRef: "CS2023, Software Development Fundamentals, Fundamental Data Structures",
11580
+ provenance: { method: "source_official" }
11581
+ },
11582
+ {
11583
+ id: "CS2023-AL-01",
11584
+ gradeBand: [10, 16],
11585
+ texts: {
11586
+ en: "Analyze and compare the time and space complexity of fundamental algorithms using asymptotic notation (Big-O)."
11587
+ },
11588
+ classifications: [
11589
+ { axis: "Knowledge Area", value: "Algorithms and Complexity (AL)" },
11590
+ { axis: "Core Tier", value: "Tier-1 Core" }
11591
+ ],
11592
+ bloomHint: { process: "Analyze" },
11593
+ keywords: ["complexity", "big-o", "efficiency", "sorting", "searching", "asymptotic", "runtime"],
11594
+ sourceRef: "CS2023, Algorithms and Complexity, Basic Analysis",
11595
+ provenance: { method: "source_official" }
11596
+ },
11597
+ {
11598
+ id: "CS2023-SE-01",
11599
+ gradeBand: [9, 16],
11600
+ texts: {
11601
+ en: "Decompose complex problems into modular software components applying principles of abstraction, encapsulation, and separation of concerns."
11602
+ },
11603
+ classifications: [
11604
+ { axis: "Knowledge Area", value: "Software Engineering (SE)" },
11605
+ { axis: "Core Tier", value: "Tier-1 Core" }
11606
+ ],
11607
+ bloomHint: { process: "Create" },
11608
+ keywords: ["modularity", "abstraction", "software design", "refactoring", "encapsulation", "architecture"],
11609
+ sourceRef: "CS2023, Software Engineering, Software Design and Architecture",
11610
+ provenance: { method: "source_official" }
11611
+ },
11612
+ {
11613
+ id: "CS2023-SEC-01",
11614
+ gradeBand: [9, 16],
11615
+ texts: {
11616
+ en: "Incorporate defensive programming and fundamental cybersecurity principles (least privilege, input validation, secure data handling) into software development."
11617
+ },
11618
+ classifications: [
11619
+ { axis: "Knowledge Area", value: "Security (SEC)" },
11620
+ { axis: "Core Tier", value: "Tier-1 Core" }
11621
+ ],
11622
+ bloomHint: { process: "Apply" },
11623
+ keywords: ["security", "defensive programming", "input validation", "cybersecurity", "vulnerabilities"],
11624
+ sourceRef: "CS2023, Security, Secure Software Development",
11625
+ provenance: { method: "source_official" }
11626
+ },
11627
+ {
11628
+ id: "CS2023-AI-01",
11629
+ gradeBand: [10, 16],
11630
+ texts: {
11631
+ en: "Formulate machine learning tasks, prepare training and evaluation datasets, and evaluate model performance using standard metrics."
11632
+ },
11633
+ classifications: [
11634
+ { axis: "Knowledge Area", value: "Artificial Intelligence (AI)" },
11635
+ { axis: "Core Tier", value: "Tier-2 Core" }
11636
+ ],
11637
+ bloomHint: { process: "Evaluate" },
11638
+ keywords: ["artificial intelligence", "machine learning", "dataset", "evaluation", "model", "accuracy"],
11639
+ sourceRef: "CS2023, Artificial Intelligence, Machine Learning Fundamentals",
11640
+ provenance: { method: "source_official" }
11641
+ }
11642
+ ],
11643
+ mappings: [
11644
+ {
11645
+ statementId: "CS2023-SDF-01",
11646
+ targetRef: "ontora:PROGRAM_CONSTRUCTION",
11647
+ kind: "covers",
11648
+ confidence: 0.95,
11649
+ provenance: { method: "source_official" }
11650
+ },
11651
+ {
11652
+ statementId: "CS2023-SDF-02",
11653
+ targetRef: "ontora:DATA_STRUCTURES",
11654
+ kind: "covers",
11655
+ confidence: 0.95,
11656
+ provenance: { method: "source_official" }
11657
+ },
11658
+ {
11659
+ statementId: "CS2023-AL-01",
11660
+ targetRef: "ontora:ALGORITHM_COMPLEXITY",
11661
+ kind: "covers",
11662
+ confidence: 0.95,
11663
+ provenance: { method: "source_official" }
11664
+ },
11665
+ {
11666
+ statementId: "CS2023-SE-01",
11667
+ targetRef: "ontora:SOFTWARE_ARCHITECTURE",
11668
+ kind: "covers",
11669
+ confidence: 0.95,
11670
+ provenance: { method: "source_official" }
11671
+ },
11672
+ {
11673
+ statementId: "CS2023-SEC-01",
11674
+ targetRef: "ontora:DEFENSIVE_PROGRAMMING",
11675
+ kind: "covers",
11676
+ confidence: 0.95,
11677
+ provenance: { method: "source_official" }
11678
+ },
11679
+ {
11680
+ statementId: "CS2023-AI-01",
11681
+ targetRef: "ontora:MACHINE_LEARNING",
11682
+ kind: "covers",
11683
+ confidence: 0.95,
11684
+ provenance: { method: "source_official" }
11685
+ }
11686
+ ]
11687
+ };
11688
+
11375
11689
  // src/standards/bundledPacks.ts
11376
11690
  var BUNDLED_PACK_RECORDS = {
11377
- "csta-k12-2017": csta_k12_2017_default
11691
+ "csta-k12-2017": csta_k12_2017_default,
11692
+ "acm-ieee-cs2023": acm_ieee_cs2023_default
11378
11693
  };
11379
11694
  var BUNDLED_STANDARDS_PACK_IDS = Object.keys(BUNDLED_PACK_RECORDS).sort();
11380
11695
  var parsedPackCache = /* @__PURE__ */ new Map();
@@ -11401,6 +11716,36 @@ function resolveStandardsPacks(packIds) {
11401
11716
  }
11402
11717
  return packs;
11403
11718
  }
11719
+ function findStandardStatement(statementIdOrRef) {
11720
+ if (!statementIdOrRef) return null;
11721
+ const [packPrefix, ...rest] = statementIdOrRef.split(":");
11722
+ const targetId = rest.length > 0 ? rest.join(":") : statementIdOrRef;
11723
+ const packs = resolveStandardsPacks(BUNDLED_STANDARDS_PACK_IDS);
11724
+ for (const pack of packs) {
11725
+ if (rest.length > 0 && pack.manifest.id !== packPrefix) continue;
11726
+ const stmt = pack.statements.find((s) => s.id.toLowerCase() === targetId.toLowerCase());
11727
+ if (stmt) {
11728
+ const description = stmt.texts["en"] || Object.values(stmt.texts)[0] || "";
11729
+ const category = stmt.classifications && stmt.classifications.length > 0 ? stmt.classifications.map((c) => c.value).join(", ") : void 0;
11730
+ const gradeBand = Array.isArray(stmt.gradeBand) ? stmt.gradeBand[0] === stmt.gradeBand[1] ? String(stmt.gradeBand[0]) : `${stmt.gradeBand[0]}-${stmt.gradeBand[1]}` : void 0;
11731
+ return {
11732
+ packId: pack.manifest.id,
11733
+ packTitle: pack.manifest.name,
11734
+ statementId: stmt.id,
11735
+ description,
11736
+ category,
11737
+ gradeBand
11738
+ };
11739
+ }
11740
+ }
11741
+ return null;
11742
+ }
11743
+ var STANDARD_REF_REGEX = /\b(?:(?:csta-k12-2017|acm-ieee-cs2023):)?(?:[1-3][A-B]?-[A-Z]{2}-\d{2}|CS2023-[A-Z0-9_-]+)\b/gi;
11744
+ function extractStandardRefs(text) {
11745
+ if (!text) return [];
11746
+ const matches = Array.from(text.matchAll(STANDARD_REF_REGEX)).map((m) => m[0]);
11747
+ return Array.from(new Set(matches));
11748
+ }
11404
11749
 
11405
11750
  // src/services/languageDirective.ts
11406
11751
  function resolveTargetLanguageCode(language) {
@@ -11712,7 +12057,7 @@ type: "LESSON_EDP"
11712
12057
  - **Estimated Duration:** 90 minutes
11713
12058
  - **Project Objective:** [Complete engineering system or functional deliverable students build]
11714
12059
  - **Materials & Equipment:** [Detailed hardware, software libraries, and workstation tools]
11715
- - **Learning Objectives Table:** (LO1, LO2 mapped with EDP Bloom level, Student Evidence, and Success Criteria)
12060
+ - **Learning Objectives Table:** (LO1, LO2 mapped with EDP Bloom level, Student Evidence, Success Criteria, and matching Standard ID from [STANDARDS STATEMENTS] if present, e.g. "CSTA: 1B-AP-10" or "CS2023-SDF-01")
11716
12061
 
11717
12062
  ### 2. Activity Sequence
11718
12063
  > Activity Contract table with columns: Seq, EDP Phase (Ask, Imagine, Plan, Create, Test & Improve, Share & Evaluate), Activity Type, Actor, Purpose, Student Action, Teacher Move, Output/Evidence, LO, Time, Artifact Contract.
@@ -11762,7 +12107,7 @@ type: "LESSON_GENERAL"
11762
12107
  - **Estimated Duration:** 90 minutes
11763
12108
  - **Materials & Equipment:** [Tools, IDE, workstations, resources]
11764
12109
  - **Keywords / Core Concepts:** [Core domain terminology]
11765
- - **Learning Objectives Table:** (LO1, LO2 with Bloom action verbs, Student Evidence, Success Criteria)
12110
+ - **Learning Objectives Table:** (LO1, LO2 with Bloom action verbs, Student Evidence, Success Criteria, and matching Standard ID from [STANDARDS STATEMENTS] if present, e.g. "CSTA: 1B-AP-10" or "CS2023-SDF-01")
11766
12111
 
11767
12112
  ### 2. Activity Sequence
11768
12113
  > Activity Contract table with columns: Seq, Lesson Stage (Warm-up, Core Concepts, Guided Practice, Independent Practice, Wrap-up), Activity Type, Actor, Purpose, Student Action, Teacher Move, Output/Evidence, LO, Time, Artifact Contract.
@@ -11810,7 +12155,7 @@ type: "LESSON_5E"
11810
12155
  - **Estimated Duration:** 90 minutes
11811
12156
  - **Materials & Equipment:** [Tools, IDE, hardware/software specifications]
11812
12157
  - **Keywords / Core Concepts:** [Core domain terminology]
11813
- - **Learning Objectives Table:** (LO1, LO2 with Bloom action verbs, Student Evidence, Success Criteria)
12158
+ - **Learning Objectives Table:** (LO1, LO2 with Bloom action verbs, Student Evidence, Success Criteria, and matching Standard ID from [STANDARDS STATEMENTS] if present, e.g. "CSTA: 1B-AP-10" or "CS2023-SDF-01")
11814
12159
 
11815
12160
  ### 2. Activity Sequence
11816
12161
  > Activity Contract table with columns: Seq, 5E Phase (Engage, Explore, Explain, Elaborate, Evaluate), Activity Type, Actor, Purpose, Student Action, Teacher Move, Output/Evidence, LO, Time, Artifact Contract.
@@ -13030,13 +13375,52 @@ ${buildHeadingDirective("EXT", slcMarkdown, targetLang)}`;
13030
13375
  });
13031
13376
  }
13032
13377
  }
13378
+ let standardsCoverage;
13379
+ if (packs.length > 0 && lessonContent) {
13380
+ try {
13381
+ const objectives = parseLessonObjectivesWithStandards(lessonContent, concept, bloomLevel, packs);
13382
+ const activities = parseActivitySequenceLo(lessonContent);
13383
+ const quizContent = await storage.readArtifact(projectId, quizRelPath).catch(() => null);
13384
+ const quizQuestions = quizContent ? parseQuizQuestionsLo(quizContent) : [];
13385
+ const selected = selectStatementsForLesson({
13386
+ packs,
13387
+ gradeBand: options.gradeBand ?? [6, 12],
13388
+ topicText: `${lessonTitle} ${concept}`
13389
+ });
13390
+ const targetStatementIds = new Set(selected.map((s) => s.statement.id.toLowerCase()));
13391
+ for (const lo of objectives) {
13392
+ for (const r of lo.standardRefs || []) {
13393
+ targetStatementIds.add(r.replace(/^[^:]+:/, "").toLowerCase());
13394
+ }
13395
+ }
13396
+ const scopedPacks = packs.map((p) => ({
13397
+ ...p,
13398
+ statements: p.statements.filter((s) => targetStatementIds.has(s.id.toLowerCase()))
13399
+ })).filter((p) => p.statements.length > 0);
13400
+ if (scopedPacks.length > 0) {
13401
+ standardsCoverage = evaluateStandardsCoverage({
13402
+ packs: scopedPacks,
13403
+ objectives,
13404
+ activities,
13405
+ quizQuestions
13406
+ });
13407
+ onProgress?.(
13408
+ "@reviewer",
13409
+ `\u{1F4CA} Standards Coverage Gate: ${standardsCoverage.verdict} (${standardsCoverage.coveragePct}% coverage, ${standardsCoverage.rows.filter((r) => r.status === "COVERED").length}/${standardsCoverage.rows.length} statements covered)`
13410
+ );
13411
+ }
13412
+ } catch (covErr) {
13413
+ console.warn("[lessonProductionService] Failed to evaluate standards coverage:", covErr?.message || covErr);
13414
+ }
13415
+ }
13033
13416
  return {
13034
13417
  lessonId: lessonCode,
13035
13418
  pedagogy,
13036
13419
  producedArtifacts,
13037
13420
  pausedForReview: false,
13038
13421
  contextInjection: lessonInjection && lessonInjection.verified ? expositionInjection || lessonInjection : lessonInjection || expositionInjection,
13039
- promptChars: commonContext.length
13422
+ promptChars: commonContext.length,
13423
+ standardsCoverage
13040
13424
  };
13041
13425
  }
13042
13426
  function parseLessonObjectives(lessonContent, concept, bloomLevel) {
@@ -13058,6 +13442,65 @@ function parseLessonObjectives(lessonContent, concept, bloomLevel) {
13058
13442
  }
13059
13443
  return objectives.slice(0, 6);
13060
13444
  }
13445
+ function parseLessonObjectivesWithStandards(lessonContent, concept, bloomLevel, _packs) {
13446
+ const baseObjectives = parseLessonObjectives(lessonContent, concept, bloomLevel);
13447
+ const lines = lessonContent.split("\n");
13448
+ return baseObjectives.map((lo) => {
13449
+ const refs = /* @__PURE__ */ new Set();
13450
+ for (const line of lines) {
13451
+ if (line.includes(lo.code)) {
13452
+ const found = extractStandardRefs(line);
13453
+ for (const r of found) refs.add(r);
13454
+ }
13455
+ }
13456
+ return {
13457
+ ...lo,
13458
+ standardRefs: refs.size > 0 ? Array.from(refs) : void 0
13459
+ };
13460
+ });
13461
+ }
13462
+ function parseActivitySequenceLo(lessonContent) {
13463
+ const activities = [];
13464
+ const lines = lessonContent.split("\n");
13465
+ let currentSeq = 1;
13466
+ for (const line of lines) {
13467
+ const matchActivity = line.match(/(?:Hoạt động|Activity|Phase|Giai đoạn)\s*(\d+)/i);
13468
+ const loMatches = Array.from(line.matchAll(/\b(LO\d+)\b/gi)).map((m) => m[1].toUpperCase());
13469
+ if (matchActivity && loMatches.length > 0) {
13470
+ activities.push({
13471
+ seq: parseInt(matchActivity[1], 10),
13472
+ lo: Array.from(new Set(loMatches))
13473
+ });
13474
+ } else if (loMatches.length > 0 && line.trim().startsWith("|")) {
13475
+ activities.push({
13476
+ seq: currentSeq++,
13477
+ lo: Array.from(new Set(loMatches))
13478
+ });
13479
+ }
13480
+ }
13481
+ if (activities.length === 0) {
13482
+ const allLos = Array.from(lessonContent.matchAll(/\b(LO\d+)\b/gi)).map((m) => m[1].toUpperCase());
13483
+ if (allLos.length > 0) {
13484
+ activities.push({ seq: 1, lo: Array.from(new Set(allLos)) });
13485
+ }
13486
+ }
13487
+ return activities;
13488
+ }
13489
+ function parseQuizQuestionsLo(quizContent) {
13490
+ const questions = [];
13491
+ const lines = quizContent.split("\n");
13492
+ for (const line of lines) {
13493
+ const loMatch = line.match(/\b(LO\d+)\b/i);
13494
+ const aoMatch = line.match(/\b(AO\d+)\b/i);
13495
+ if (loMatch || aoMatch) {
13496
+ questions.push({
13497
+ alignedLO: loMatch ? loMatch[1].toUpperCase() : void 0,
13498
+ alignedAO: aoMatch ? aoMatch[1].toUpperCase() : void 0
13499
+ });
13500
+ }
13501
+ }
13502
+ return questions;
13503
+ }
13061
13504
  async function judgeSatelliteArtifact(ctx) {
13062
13505
  const { storage, projectId, lessonCode, sat, content } = ctx;
13063
13506
  try {
@@ -16782,120 +17225,6 @@ var MisconceptionEvaluator = class {
16782
17225
  };
16783
17226
  }
16784
17227
  };
16785
-
16786
- // src/standards/standardsCoverageGate.ts
16787
- function resolveStatementRef(ref, packs) {
16788
- const [head, ...rest] = ref.split(":");
16789
- const candidatePacks = rest.length > 0 ? packs.filter((p) => p.manifest.id === head) : packs;
16790
- const statementId = rest.length > 0 ? rest.join(":") : ref;
16791
- for (const p of candidatePacks) {
16792
- if (p.statements.some((s) => s.id === statementId)) return { pack: p, statementId };
16793
- }
16794
- return null;
16795
- }
16796
- function evaluateStandardsCoverage(input) {
16797
- const rows = [];
16798
- const aoToLo = /* @__PURE__ */ new Map();
16799
- for (const ao of input.assessmentObjectives ?? []) aoToLo.set(ao.aoCode, ao.alignedLO);
16800
- const loToRefs = /* @__PURE__ */ new Map();
16801
- for (const lo of input.objectives) {
16802
- loToRefs.set(lo.code, new Set(lo.standardRefs ?? []));
16803
- }
16804
- const taughtLOs = /* @__PURE__ */ new Set();
16805
- for (const act of input.activities ?? []) for (const lo of act.lo) taughtLOs.add(lo);
16806
- const assessedLOs = /* @__PURE__ */ new Set();
16807
- for (const q of input.quizQuestions) {
16808
- if (q.alignedLO) assessedLOs.add(q.alignedLO);
16809
- if (q.alignedAO) {
16810
- const lo = aoToLo.get(q.alignedAO);
16811
- if (lo) assessedLOs.add(lo);
16812
- }
16813
- }
16814
- for (const pack of input.packs) {
16815
- const mappingByStatement = /* @__PURE__ */ new Map();
16816
- for (const m of pack.mappings ?? []) {
16817
- const prev = mappingByStatement.get(m.statementId);
16818
- if (!prev || prev !== "covers" && m.kind === "covers" || prev === "extends" && m.kind !== "extends") {
16819
- mappingByStatement.set(m.statementId, m.kind);
16820
- }
16821
- }
16822
- for (const statement of pack.statements) {
16823
- const refFull = `${pack.manifest.id}:${statement.id}`;
16824
- const issues = [];
16825
- const los = input.objectives.filter((lo) => (lo.standardRefs ?? []).some((r) => r === statement.id || r === refFull)).map((lo) => lo.code);
16826
- const kind = mappingByStatement.get(statement.id);
16827
- const hasMapping = kind !== void 0;
16828
- const isComplianceRelevant = kind === "covers";
16829
- const hasActivity = los.some((lo) => taughtLOs.has(lo));
16830
- const hasAssessment = los.some((lo) => assessedLOs.has(lo));
16831
- let status;
16832
- if (!hasMapping) status = "UNMAPPED";
16833
- else if (!isComplianceRelevant) status = "PARTIAL";
16834
- else if (los.length > 0 && hasActivity && hasAssessment) status = "COVERED";
16835
- else status = "UNCOVERED";
16836
- if (status === "UNCOVERED") {
16837
- if (los.length === 0) issues.push("No learning objective anchors this statement (missing standardRefs).");
16838
- else {
16839
- if (!hasActivity) issues.push(`Anchored LO(s) ${los.join(", ")} have no activity in lesson flow.`);
16840
- if (!hasAssessment) issues.push(`Anchored LO(s) ${los.join(", ")} are not measured by any quiz question.`);
16841
- }
16842
- }
16843
- rows.push({
16844
- packId: pack.manifest.id,
16845
- statementId: statement.id,
16846
- statementText: Object.values(statement.texts)[0] ?? "",
16847
- status,
16848
- objectives: los,
16849
- hasActivity,
16850
- hasAssessment,
16851
- issues
16852
- });
16853
- }
16854
- }
16855
- for (const lo of input.objectives) {
16856
- for (const r of lo.standardRefs ?? []) {
16857
- if (!resolveStatementRef(r, input.packs)) {
16858
- rows.push({
16859
- packId: "(unresolved)",
16860
- statementId: r,
16861
- statementText: "",
16862
- status: "UNCOVERED",
16863
- objectives: [lo.code],
16864
- hasActivity: false,
16865
- hasAssessment: false,
16866
- issues: [`standardRef "${r}" does not exist in any adopted pack \u2014 likely a hallucinated or stale ID`]
16867
- });
16868
- }
16869
- }
16870
- }
16871
- const complianceRows = rows.filter((r) => r.status !== "UNMAPPED" && r.status !== "PARTIAL");
16872
- const covered = complianceRows.filter((r) => r.status === "COVERED").length;
16873
- const coveragePct = complianceRows.length === 0 ? 100 : Math.round(covered / complianceRows.length * 100);
16874
- const unresolvedCount = rows.filter((r) => r.packId === "(unresolved)").length;
16875
- const verdict = unresolvedCount > 0 || coveragePct < 60 ? "FAIL" : coveragePct < 100 ? "WARN" : "PASS";
16876
- const lines = [
16877
- "# Standards Coverage Report",
16878
- "",
16879
- `- Verdict: **${verdict}**`,
16880
- `- Compliance coverage: **${coveragePct}%** (${covered}/${complianceRows.length} "covers" statements fully taught + assessed)`,
16881
- `- Unresolved standardRefs: ${unresolvedCount}`,
16882
- "",
16883
- "| Pack | Statement | Status | LOs | Activity | Assessment |",
16884
- "|---|---|---|---|---|---|",
16885
- ...rows.map(
16886
- (r) => `|${r.packId}|${r.statementId}|${r.status}|${r.objectives.join(", ") || "\u2014"}|${r.hasActivity ? "\u2713" : "\u2717"}|${r.hasAssessment ? "\u2713" : "\u2717"}|`
16887
- )
16888
- ];
16889
- const issueLines = rows.filter((r) => r.issues.length > 0).flatMap((r) => r.issues.map((i) => `- [${r.packId}:${r.statementId}] ${i}`));
16890
- if (issueLines.length > 0) lines.push("", "## Issues", ...issueLines);
16891
- return {
16892
- verdict,
16893
- coveragePct,
16894
- rows,
16895
- summary: `Standards coverage ${coveragePct}% \u2014 verdict ${verdict}`,
16896
- rawMarkdownReport: lines.join("\n")
16897
- };
16898
- }
16899
17228
  var StandardsRegistryAdapter = class {
16900
17229
  client;
16901
17230
  constructor(config = {}) {
@@ -17558,6 +17887,6 @@ function renderMediaPlaceholder(entry) {
17558
17887
  return `> \u{1F5BC}\uFE0F [\u1EA2nh \u0111ang ch\u1EDD: ${entry.name} \u2014 s\u1EBD \u0111\u01B0\u1EE3c t\u1EA1o sau khi duy\u1EC7t media]`;
17559
17888
  }
17560
17889
 
17561
- export { ACT_TEMPLATE, ARTIFACT_DEPENDENCY_ROUTING, ARTIFACT_EXECUTION_ORDER, AcademicAuditor, ActiveLearningWorkflowSchema, ActivityLabSchema, ActivitySeqRowSchema, ActivityStepSchema, ArtifactContractRowSchema, AssessmentMapRowSchema, AssessmentObjectiveSchema, BELL_RINGER_TEMPLATE, BLOOM_ACTION_VERBS, BOM_TEMPLATE, BUNDLED_STANDARDS_PACK_IDS, BellRingerDaySchema, BellRingerSchema, BloomHintSchema, BloomLevelSchema, BloomTaxonomyEvaluator, BronzeTierSchema, CERConclusionSchema, CHOICE_BOARD_TEMPLATE, CODE_LAB_TEMPLATE, CURRICULUM_SLASH_COMMANDS, CardTierEnum, ChoiceBoardRubricRowSchema, ChoiceBoardSchema, ChoiceRuleSchema, ChoiceSquareSchema, ClassificationSchema, CodeHardwareFeasibilityEvaluator, CodeLabSchema, CodeSnippetSchema, CompetencyRubricRowSchema, ComputationalThinkingSchema, ConstructiveAlignmentEvaluator, CoreConceptSchema, CourseObjectiveSchema, CoverageReportSchema, CrossArtifactDriftEvaluator, CurriculumArtifactSchema, CurriculumError, CurriculumPlanSchema, CurriculumQualityReportSchema, DEFAULT_ARTIFACT_STREAM_IDLE_MS, DEFAULT_ARTIFACT_STREAM_TOTAL_MS, DEFAULT_ENABLED_PROVIDERS, DEFAULT_GATE_SETTINGS, DEFAULT_KX_PRIORITIES, DEFAULT_LESSON_PRIORITIES, DEFAULT_STREAM_IDLE_MS, DEFAULT_STREAM_TOTAL_MS, DependencyEdgeSchema, DepthAssignmentSchema, DepthLevelSchema, DeterministicPipelineRunner, DeterministicStructuralLinter, DiagnosticQuestionSchema, DiagnosticQuizSchema, EDPPhaseEnum, EXIT_TICKET_TEMPLATE, EXPOSITION_REL, EXT_TEMPLATE, EntryLevelSchema, ExitTicketBugHuntSchema, ExitTicketMetacognitionSchema, ExitTicketQuickItemSchema, ExitTicketRecallPromptSchema, ExitTicketSchema, ExperimentalDesignSchema, ExpositionApprovalError, ExtensionChallengeSchema, ExtensionSchema, FileSystemCurriculumAdapter, FiveEFlowPhaseSchema, FiveEInstructionalEvaluator, FiveEPhaseEnum, FrameworkMappingSchema, FrameworkPackManifestSchema, FrameworkPackSchema, FrameworkStatementSchema, GLOSSARY_TEMPLATE, GRAPHIC_ORGANIZER_TEMPLATE, GlossaryQuickRefRowSchema, GlossarySchema, GlossaryTermSchema, GoldTierSchema, GradeBandSchema, GraphicOrganizerItemSchema, GraphicOrganizerSchema, HANDOUT_TEMPLATE, HandoutSchema, HandoutSectionSchema, InstructionSectionSchema, InstructionStepSchema, JudgeCriterionSchema, LAYER_TOTAL_BUDGET_MS, LESSON_PLAN_TEMPLATE, LLMJudgeEngine, LabTierTaskSchema, LearningObjectiveInputSchema, LearningObjectiveRowSchema, LessonFlowPhaseSchema, LessonPlan5ESchema, LessonPlanEDPSchema, LessonPlanSchema, LessonSectionSchema, LocalWorkspaceManager, MappingKindSchema, MarpSlideSchema, MediaError, MediaLedger, MentorCheatsheetSchema, MilestoneInputSchema, MisconceptionEvaluator, MisconceptionSchema, ModelPolicyResolver, NVIDIA_MODELS, NodeKindSchema, OrganizerTypeEnum, PROJECT_INSTRUCTION_TEMPLATE, PhaseInputSchema, PlanConstraintsSchema, PlannerInputSchema, PlanningGraphSchema, PlanningNodeSchema, PrerequisiteDecisionEntrySchema, PrerequisiteDecisionSchema, ProductGoalSchema, ProgressiveHintsSchema, ProjectGraphSchema, ProjectInstructionSchema, ProjectProfileSchema, QUIZ_TEMPLATE, QualityAuditVerdictSchema, QuizOptionSchema, REVIEW_GAME_TEMPLATE, RUBRIC_TEMPLATE, RecordProvenanceSchema, ResourceMapRowSchema, ReviewGameExportRowSchema, ReviewGameQuestionSchema, ReviewGameSchema, RoadmapInputSchema, RotationStationSchema, RubricCriteriaSchema, RubricSchema, SCIENCE_LAB_TEMPLATE, SELF_LAB_TEMPLATE, SLIDE_CANONICAL_METHODOLOGY, SLIDE_LAYOUT_PRESETS, SLIDE_TEMPLATE, STANDARD_SOT_FILES, STATION_ROTATION_TEMPLATE, ScaffoldDecisionEntrySchema, ScaffoldDecisionSchema, ScienceLabSchema, ScoringRubricRowSchema, SelfLabSchema, SelfPacedBundleSchema, SelfPacedChallengeSchema, SessionPlanSchema, SilverTierSchema, SlideDeckSchema, StandardizedTermRowSchema, StandardsRegistryAdapter, StationRecordRowSchema, StationRotationSchema, StationTypeEnum, SupabaseCurriculumAdapter, TASK_CARDS_TEMPLATE, TEACHER_GUIDE_TEMPLATE, TIERED_PRACTICE_TEMPLATE, TaskCardSchema, TaskCardsSchema, TeacherGuideSchema, TeachingScriptPhaseSchema, TierLevelEnum, TierObjectiveSchema, TieredPracticeSchema, TranslationPolicySchema, TroubleshootingEntrySchema, TroubleshootingRowSchema, UnitPlanSchema, UserJourneySchema, WORKSHEET_TEMPLATE, WorksheetItemSchema, WorksheetItemTypeEnum, WorksheetPartSchema, WorksheetSchema, activityTools, analystTools, analyzeProjectCreationIntent, assertAcyclic, assessorTools, auditCurriculumQualityFlow, auditQualityReport, buildActivityPrompt, buildCodeLabPrompt, buildCurriculumContext, buildCurriculumPlan, buildDeliveryPackages, buildDiagnosticQuizPrompt, buildExpositionContext, buildExpositionExcerpt, buildExtensionPrompt, buildHandoutPrompt, buildHeadingDirective, buildHtmlDeckSlidePrompt, buildImagePrompt, buildJudgePrompt, buildLanguageDirective, buildLessonExcerpt, buildLessonMasterPrompt, buildMarpMarkdownSlidePrompt, buildProjectInstructionPrompt, buildSectionAwareExcerpt, buildSelfLabPrompt, buildSessionSliceContext, buildSlidesPrompt, buildStandardStackMarkdown, buildStandardsContext, buildStandardsContextBlock, buildTeacherGuidePrompt, buildWorksheetPrompt, closeTruncatedJson, computeContentHash, computePackingSpec, conductPreliminaryResearch, contentTools, convertRoadmapToFoundationSot, createAiInferenceError, createContextMissingError, createCurriculumStorage, createIdleAbortController, createStreamAbortController, createStreamAbortSignal, createStreamChunkExtractor, curateMediaLedger, designerTools, detectProjectPedagogy, ensureExpositionForLesson, ensureKnowledgeExposition, evaluateStandardsCoverage, executeCurriculumCommand, exportAllProjectQuizzes, expositionCacheKey, extractScopeSequenceRows, extractSectionHeadingsFromSLC, extractSessionSlice, extractStreamChunk, extractThoughtAndContent, formatQuizzesToCsv, fulfillMediaLedger, gateModeFor, generateActivityFlow, generateCodeLabFlow, generateDiagnosticQuizFlow, generateEducationalImage, generateExtensionFlow, generateHandoutFlow, generateLessonMasterFlow, generateMilestoneCurriculumBundle, generatePhase1SotArtifacts, generatePhase2SotArtifacts, generateProjectInstruction, generateProjectInstructionFlow, generateRoadmapCurriculum, generateSelfLabFlow, generateSelfPacedBundle, generateSingleArtifact, generateSlidesFlow, generateTeacherGuideFlow, generateWorksheetFlow, getAIModel, getArtifactMetadata, getDesignatedFallbackChain, getDesignatedFallbackConfig, getLessonMetadata, getProjectArtifactScope, getProjectStatusReport, getSlideLayoutPresetById, getSlideLayoutPresetsByCategory, getSmartResumeContext, glossaryTermsForSession, illustratorTools, importRoadmapToProject, ingestProjectGraphIntoProject, initializeProjectInStorage, injectMediaIntoMarkdown, isExpositionFresh, isModelAllowed, isProviderEnabled, isTranslationDue, lintAndSanitizeArtifact, lintCurriculumFramework, lintFrameworkPack, loadCurriculumTemplate, loadSotTemplate, normalizePlanningGraph, normalizeSlcContract, packagerTools, parseGateSettings, parseQuizMarkdown, parseRoadmapJsonToProjectPayload, produceBatchLessons, produceSingleLesson, publishToGitHub, publishToSupabase, rankGenCandidates, renderFrameworkFromPlan, renderMediaPlaceholder, researcherTools, resolveGateSettings, resolveStandardsPacks, resolveStreamBudget, resolveTargetLanguageCode, resolveTranslationTargets, reviewerTools, runCurriculumAIInference, safeParseJson, searchEducationalImages, searchEducationalVideos, selectStatementsForLesson, serializeActivityToMarkdown, serializeCodeLabToMarkdown, serializeDiagnosticQuizToMarkdown, serializeHandoutToMarkdown, serializeLessonToMarkdown, serializeProjectInstructionToMarkdown, serializeSelfLabToMarkdown, slugifyProjectName, streamCurriculumAIInference, streamCurriculumAIInferenceWithTools, streamDiagnosticQuizFlow, streamLLMWithFallback, streamLayerPrefillWithFallback, streamLessonMasterFlow, streamSelfLabFlow, stripLlmJsonWrappers, targetLanguageDisplayName, techSmeTools, topoSort, uploadAssetToBucket, validateArtifactDependencies, validateCurriculumPlan, validateFrameworkPack, validateMarkdownTables, validateMermaidSyntax, withAutoRepair };
17890
+ export { ACT_TEMPLATE, ARTIFACT_DEPENDENCY_ROUTING, ARTIFACT_EXECUTION_ORDER, AcademicAuditor, ActiveLearningWorkflowSchema, ActivityLabSchema, ActivitySeqRowSchema, ActivityStepSchema, ArtifactContractRowSchema, AssessmentMapRowSchema, AssessmentObjectiveSchema, BELL_RINGER_TEMPLATE, BLOOM_ACTION_VERBS, BOM_TEMPLATE, BUNDLED_STANDARDS_PACK_IDS, BellRingerDaySchema, BellRingerSchema, BloomHintSchema, BloomLevelSchema, BloomTaxonomyEvaluator, BronzeTierSchema, CERConclusionSchema, CHOICE_BOARD_TEMPLATE, CODE_LAB_TEMPLATE, CURRICULUM_SLASH_COMMANDS, CardTierEnum, ChoiceBoardRubricRowSchema, ChoiceBoardSchema, ChoiceRuleSchema, ChoiceSquareSchema, ClassificationSchema, CodeHardwareFeasibilityEvaluator, CodeLabSchema, CodeSnippetSchema, CompetencyRubricRowSchema, ComputationalThinkingSchema, ConstructiveAlignmentEvaluator, CoreConceptSchema, CourseObjectiveSchema, CoverageReportSchema, CrossArtifactDriftEvaluator, CurriculumArtifactSchema, CurriculumError, CurriculumPlanSchema, CurriculumQualityReportSchema, DEFAULT_ARTIFACT_STREAM_IDLE_MS, DEFAULT_ARTIFACT_STREAM_TOTAL_MS, DEFAULT_ENABLED_PROVIDERS, DEFAULT_GATE_SETTINGS, DEFAULT_KX_PRIORITIES, DEFAULT_LESSON_PRIORITIES, DEFAULT_STREAM_IDLE_MS, DEFAULT_STREAM_TOTAL_MS, DependencyEdgeSchema, DepthAssignmentSchema, DepthLevelSchema, DeterministicPipelineRunner, DeterministicStructuralLinter, DiagnosticQuestionSchema, DiagnosticQuizSchema, EDPPhaseEnum, EXIT_TICKET_TEMPLATE, EXPOSITION_REL, EXT_TEMPLATE, EntryLevelSchema, ExitTicketBugHuntSchema, ExitTicketMetacognitionSchema, ExitTicketQuickItemSchema, ExitTicketRecallPromptSchema, ExitTicketSchema, ExperimentalDesignSchema, ExpositionApprovalError, ExtensionChallengeSchema, ExtensionSchema, FileSystemCurriculumAdapter, FiveEFlowPhaseSchema, FiveEInstructionalEvaluator, FiveEPhaseEnum, FrameworkMappingSchema, FrameworkPackManifestSchema, FrameworkPackSchema, FrameworkStatementSchema, GLOSSARY_TEMPLATE, GRAPHIC_ORGANIZER_TEMPLATE, GlossaryQuickRefRowSchema, GlossarySchema, GlossaryTermSchema, GoldTierSchema, GradeBandSchema, GraphicOrganizerItemSchema, GraphicOrganizerSchema, HANDOUT_TEMPLATE, HandoutSchema, HandoutSectionSchema, InstructionSectionSchema, InstructionStepSchema, JudgeCriterionSchema, LAYER_TOTAL_BUDGET_MS, LESSON_PLAN_TEMPLATE, LLMJudgeEngine, LabTierTaskSchema, LearningObjectiveInputSchema, LearningObjectiveRowSchema, LessonFlowPhaseSchema, LessonPlan5ESchema, LessonPlanEDPSchema, LessonPlanSchema, LessonSectionSchema, LocalWorkspaceManager, MappingKindSchema, MarpSlideSchema, MediaError, MediaLedger, MentorCheatsheetSchema, MilestoneInputSchema, MisconceptionEvaluator, MisconceptionSchema, ModelPolicyResolver, NVIDIA_MODELS, NodeKindSchema, OrganizerTypeEnum, PROJECT_INSTRUCTION_TEMPLATE, PhaseInputSchema, PlanConstraintsSchema, PlannerInputSchema, PlanningGraphSchema, PlanningNodeSchema, PrerequisiteDecisionEntrySchema, PrerequisiteDecisionSchema, ProductGoalSchema, ProgressiveHintsSchema, ProjectGraphSchema, ProjectInstructionSchema, ProjectProfileSchema, QUIZ_TEMPLATE, QualityAuditVerdictSchema, QuizOptionSchema, REVIEW_GAME_TEMPLATE, RUBRIC_TEMPLATE, RecordProvenanceSchema, ResourceMapRowSchema, ReviewGameExportRowSchema, ReviewGameQuestionSchema, ReviewGameSchema, RoadmapInputSchema, RotationStationSchema, RubricCriteriaSchema, RubricSchema, SCIENCE_LAB_TEMPLATE, SELF_LAB_TEMPLATE, SLIDE_CANONICAL_METHODOLOGY, SLIDE_LAYOUT_PRESETS, SLIDE_TEMPLATE, STANDARD_REF_REGEX, STANDARD_SOT_FILES, STATION_ROTATION_TEMPLATE, ScaffoldDecisionEntrySchema, ScaffoldDecisionSchema, ScienceLabSchema, ScoringRubricRowSchema, SelfLabSchema, SelfPacedBundleSchema, SelfPacedChallengeSchema, SessionPlanSchema, SilverTierSchema, SlideDeckSchema, StandardizedTermRowSchema, StandardsRegistryAdapter, StationRecordRowSchema, StationRotationSchema, StationTypeEnum, SupabaseCurriculumAdapter, TASK_CARDS_TEMPLATE, TEACHER_GUIDE_TEMPLATE, TIERED_PRACTICE_TEMPLATE, TaskCardSchema, TaskCardsSchema, TeacherGuideSchema, TeachingScriptPhaseSchema, TierLevelEnum, TierObjectiveSchema, TieredPracticeSchema, TranslationPolicySchema, TroubleshootingEntrySchema, TroubleshootingRowSchema, UnitPlanSchema, UserJourneySchema, WORKSHEET_TEMPLATE, WorksheetItemSchema, WorksheetItemTypeEnum, WorksheetPartSchema, WorksheetSchema, activityTools, analystTools, analyzeProjectCreationIntent, assertAcyclic, assessorTools, auditCurriculumQualityFlow, auditQualityReport, buildActivityPrompt, buildCodeLabPrompt, buildCurriculumContext, buildCurriculumPlan, buildDeliveryPackages, buildDiagnosticQuizPrompt, buildExpositionContext, buildExpositionExcerpt, buildExtensionPrompt, buildHandoutPrompt, buildHeadingDirective, buildHtmlDeckSlidePrompt, buildImagePrompt, buildJudgePrompt, buildLanguageDirective, buildLessonExcerpt, buildLessonMasterPrompt, buildMarpMarkdownSlidePrompt, buildProjectInstructionPrompt, buildSectionAwareExcerpt, buildSelfLabPrompt, buildSessionSliceContext, buildSlidesPrompt, buildStandardStackMarkdown, buildStandardsContext, buildStandardsContextBlock, buildTeacherGuidePrompt, buildWorksheetPrompt, closeTruncatedJson, computeContentHash, computePackingSpec, conductPreliminaryResearch, contentTools, convertRoadmapToFoundationSot, createAiInferenceError, createContextMissingError, createCurriculumStorage, createIdleAbortController, createStreamAbortController, createStreamAbortSignal, createStreamChunkExtractor, curateMediaLedger, designerTools, detectProjectPedagogy, ensureExpositionForLesson, ensureKnowledgeExposition, evaluateStandardsCoverage, executeCurriculumCommand, exportAllProjectQuizzes, expositionCacheKey, extractScopeSequenceRows, extractSectionHeadingsFromSLC, extractSessionSlice, extractStandardRefs, extractStreamChunk, extractThoughtAndContent, findStandardStatement, formatQuizzesToCsv, fulfillMediaLedger, gateModeFor, generateActivityFlow, generateCodeLabFlow, generateDiagnosticQuizFlow, generateEducationalImage, generateExtensionFlow, generateHandoutFlow, generateLessonMasterFlow, generateMilestoneCurriculumBundle, generatePhase1SotArtifacts, generatePhase2SotArtifacts, generateProjectInstruction, generateProjectInstructionFlow, generateRoadmapCurriculum, generateSelfLabFlow, generateSelfPacedBundle, generateSingleArtifact, generateSlidesFlow, generateTeacherGuideFlow, generateWorksheetFlow, getAIModel, getArtifactMetadata, getDesignatedFallbackChain, getDesignatedFallbackConfig, getLessonMetadata, getProjectArtifactScope, getProjectStatusReport, getSlideLayoutPresetById, getSlideLayoutPresetsByCategory, getSmartResumeContext, glossaryTermsForSession, illustratorTools, importRoadmapToProject, ingestProjectGraphIntoProject, initializeProjectInStorage, injectMediaIntoMarkdown, isExpositionFresh, isModelAllowed, isProviderEnabled, isTranslationDue, lintAndSanitizeArtifact, lintCurriculumFramework, lintFrameworkPack, loadCurriculumTemplate, loadSotTemplate, normalizePlanningGraph, normalizeSlcContract, packagerTools, parseGateSettings, parseQuizMarkdown, parseRoadmapJsonToProjectPayload, produceBatchLessons, produceSingleLesson, publishToGitHub, publishToSupabase, rankGenCandidates, renderFrameworkFromPlan, renderMediaPlaceholder, researcherTools, resolveGateSettings, resolveStandardsPacks, resolveStreamBudget, resolveTargetLanguageCode, resolveTranslationTargets, reviewerTools, runCurriculumAIInference, safeParseJson, searchEducationalImages, searchEducationalVideos, selectStatementsForLesson, serializeActivityToMarkdown, serializeCodeLabToMarkdown, serializeDiagnosticQuizToMarkdown, serializeHandoutToMarkdown, serializeLessonToMarkdown, serializeProjectInstructionToMarkdown, serializeSelfLabToMarkdown, slugifyProjectName, streamCurriculumAIInference, streamCurriculumAIInferenceWithTools, streamDiagnosticQuizFlow, streamLLMWithFallback, streamLayerPrefillWithFallback, streamLessonMasterFlow, streamSelfLabFlow, stripLlmJsonWrappers, targetLanguageDisplayName, techSmeTools, topoSort, uploadAssetToBucket, validateArtifactDependencies, validateCurriculumPlan, validateFrameworkPack, validateMarkdownTables, validateMermaidSyntax, withAutoRepair };
17562
17891
  //# sourceMappingURL=index.mjs.map
17563
17892
  //# sourceMappingURL=index.mjs.map