@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/LICENSE +21 -0
- package/dist/ai/index.cjs +3 -1
- package/dist/ai/index.cjs.map +1 -1
- package/dist/ai/index.d.cts +4 -0
- package/dist/ai/index.d.ts +4 -0
- package/dist/ai/index.mjs +3 -1
- package/dist/ai/index.mjs.map +1 -1
- package/dist/index.cjs +471 -139
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -4
- package/dist/index.d.ts +11 -4
- package/dist/index.mjs +469 -140
- package/dist/index.mjs.map +1 -1
- package/dist/pipeline/index.cjs +3 -1
- package/dist/pipeline/index.cjs.map +1 -1
- package/dist/pipeline/index.mjs +3 -1
- package/dist/pipeline/index.mjs.map +1 -1
- package/dist/schemas/index.cjs +3 -1
- package/dist/schemas/index.cjs.map +1 -1
- package/dist/schemas/index.d.cts +20 -0
- package/dist/schemas/index.d.ts +20 -0
- package/dist/schemas/index.mjs +3 -1
- package/dist/schemas/index.mjs.map +1 -1
- package/dist/standards/index.cjs +195 -1
- package/dist/standards/index.cjs.map +1 -1
- package/dist/standards/index.d.cts +20 -1
- package/dist/standards/index.d.ts +20 -1
- package/dist/standards/index.mjs +193 -2
- package/dist/standards/index.mjs.map +1 -1
- package/dist/workflow/index.cjs +222 -21
- package/dist/workflow/index.cjs.map +1 -1
- package/dist/workflow/index.mjs +222 -21
- package/dist/workflow/index.mjs.map +1 -1
- package/package.json +21 -22
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
|
|
9834
|
-
const
|
|
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
|
-
}
|
|
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
|
-
|
|
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
|
|
9869
|
-
|
|
9870
|
-
|
|
9871
|
-
|
|
9872
|
-
|
|
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
|
-
|
|
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 >=
|
|
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
|
|
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
|
|
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
|