@thanh01.pmt/curriculum-kit 1.4.1 → 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 +458 -135
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -4
- package/dist/index.d.ts +5 -4
- package/dist/index.mjs +456 -136
- 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 +209 -17
- package/dist/workflow/index.cjs.map +1 -1
- package/dist/workflow/index.mjs +209 -17
- 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,6 +9830,7 @@ 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
9835
|
const effectiveArtifactType = opts.artifactType || deriveArtifactTypeFromFileName(opts.fileName);
|
|
9834
9836
|
const sections = parseMarkdownSections(source, slcMap, effectiveArtifactType);
|
|
@@ -9848,44 +9850,74 @@ function buildSectionAwareExcerpt(markdown, opts = {}) {
|
|
|
9848
9850
|
};
|
|
9849
9851
|
}
|
|
9850
9852
|
const byCanonical = /* @__PURE__ */ new Map();
|
|
9853
|
+
const byCleanTitle = /* @__PURE__ */ new Map();
|
|
9851
9854
|
const unmatched = [];
|
|
9852
9855
|
for (const s of sections) {
|
|
9853
9856
|
if (s.canonicalKey && !byCanonical.has(s.canonicalKey)) {
|
|
9854
9857
|
byCanonical.set(s.canonicalKey, s);
|
|
9855
|
-
}
|
|
9858
|
+
}
|
|
9859
|
+
const norm = normalizeHeading(s.cleanTitle);
|
|
9860
|
+
if (!byCleanTitle.has(norm)) {
|
|
9861
|
+
byCleanTitle.set(norm, s);
|
|
9862
|
+
}
|
|
9863
|
+
if (!s.canonicalKey) {
|
|
9856
9864
|
unmatched.push(s);
|
|
9857
9865
|
}
|
|
9858
9866
|
}
|
|
9859
9867
|
const priorities = opts.priorities ?? DEFAULT_LESSON_PRIORITIES;
|
|
9860
9868
|
const includedSections = [];
|
|
9861
9869
|
const blocks = [];
|
|
9862
|
-
|
|
9870
|
+
const initialOverhead = metaBlock ? metaBlock.length + 2 : 0;
|
|
9871
|
+
let used = initialOverhead;
|
|
9863
9872
|
const tryAdd = (heading, body, key) => {
|
|
9864
9873
|
const trimmedBody = body.trim();
|
|
9865
9874
|
if (!trimmedBody) return false;
|
|
9866
9875
|
const block = `## ${heading}
|
|
9867
9876
|
|
|
9868
9877
|
${trimmedBody}`;
|
|
9869
|
-
if (used + block.length
|
|
9870
|
-
|
|
9871
|
-
|
|
9872
|
-
|
|
9873
|
-
|
|
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;
|
|
9874
9905
|
};
|
|
9875
9906
|
blocks.push(metaBlock);
|
|
9876
9907
|
let sectionAware = false;
|
|
9877
9908
|
for (const key of priorities) {
|
|
9878
|
-
const sec = byCanonical.get(key);
|
|
9909
|
+
const sec = byCanonical.get(key) || byCleanTitle.get(normalizeHeading(key));
|
|
9879
9910
|
if (!sec) continue;
|
|
9880
9911
|
sectionAware = true;
|
|
9881
9912
|
if (!tryAdd(sec.cleanTitle, sec.body, key)) break;
|
|
9882
9913
|
}
|
|
9883
9914
|
for (const [key, sec] of byCanonical) {
|
|
9884
|
-
if (includedSections.includes(key)) continue;
|
|
9915
|
+
if (includedSections.includes(key) || includedSections.includes(sec.cleanTitle)) continue;
|
|
9885
9916
|
if (used >= budget) break;
|
|
9886
9917
|
if (!tryAdd(sec.cleanTitle, sec.body, key)) break;
|
|
9887
9918
|
}
|
|
9888
9919
|
for (const sec of unmatched) {
|
|
9920
|
+
if (includedSections.includes(sec.cleanTitle)) continue;
|
|
9889
9921
|
if (used >= budget) break;
|
|
9890
9922
|
if (!tryAdd(sec.cleanTitle, sec.body, sec.cleanTitle)) break;
|
|
9891
9923
|
}
|
|
@@ -9893,17 +9925,16 @@ ${trimmedBody}`;
|
|
|
9893
9925
|
issues.push("parse:no-canonical-resolution");
|
|
9894
9926
|
}
|
|
9895
9927
|
if (priorities.length > 0 && !priorities.some((k) => includedSections.includes(k))) {
|
|
9896
|
-
issues.push("parse:no-priority-resolution");
|
|
9928
|
+
issues.push(sections.length === 0 ? "parse:no-sections" : "parse:no-priority-resolution");
|
|
9897
9929
|
}
|
|
9898
9930
|
let excerpt = blocks.join("\n\n");
|
|
9899
9931
|
if (excerpt.length > budget) {
|
|
9900
9932
|
excerpt = truncateByBudget(excerpt, budget);
|
|
9901
9933
|
}
|
|
9902
|
-
|
|
9903
|
-
if (excerpt.length - metaBlock.length < effectiveMinChars) {
|
|
9934
|
+
if (excerpt.length - metaBlock.length < minContentChars) {
|
|
9904
9935
|
issues.push("content:insufficient");
|
|
9905
9936
|
}
|
|
9906
|
-
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;
|
|
9907
9938
|
return {
|
|
9908
9939
|
excerpt,
|
|
9909
9940
|
verified,
|
|
@@ -9963,7 +9994,7 @@ function parseMarkdownSections(markdown, slcMap, artifactType) {
|
|
|
9963
9994
|
}
|
|
9964
9995
|
}
|
|
9965
9996
|
const flush = () => {
|
|
9966
|
-
if (!currentHeading
|
|
9997
|
+
if (!currentHeading) return;
|
|
9967
9998
|
const cleanTitle = currentHeading.replace(/^#{1,4}\s+/, "").trim();
|
|
9968
9999
|
const norm = normalizeHeading(cleanTitle);
|
|
9969
10000
|
const canonicalKey = reverseMap.get(norm) || findCanonicalFuzzy(norm);
|
|
@@ -10946,6 +10977,120 @@ function buildStandardsContext(input) {
|
|
|
10946
10977
|
const selected = selectStatementsForLesson(input);
|
|
10947
10978
|
return { block: buildStandardsContextBlock(selected, { language: input.language }), selected };
|
|
10948
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
|
+
}
|
|
10949
11094
|
var BloomHintSchema = z.object({
|
|
10950
11095
|
process: z.enum(["Remember", "Understand", "Apply", "Analyze", "Evaluate", "Create"]).describe("Cognitive process axis"),
|
|
10951
11096
|
knowledge: z.enum(["FACTUAL", "CONCEPTUAL", "PROCEDURAL", "METACOGNITIVE"]).optional().describe("Knowledge dimension axis (optional \u2014 most source standards do not tag it)")
|
|
@@ -11381,9 +11526,170 @@ var csta_k12_2017_default = {
|
|
|
11381
11526
|
]
|
|
11382
11527
|
};
|
|
11383
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
|
+
|
|
11384
11689
|
// src/standards/bundledPacks.ts
|
|
11385
11690
|
var BUNDLED_PACK_RECORDS = {
|
|
11386
|
-
"csta-k12-2017": csta_k12_2017_default
|
|
11691
|
+
"csta-k12-2017": csta_k12_2017_default,
|
|
11692
|
+
"acm-ieee-cs2023": acm_ieee_cs2023_default
|
|
11387
11693
|
};
|
|
11388
11694
|
var BUNDLED_STANDARDS_PACK_IDS = Object.keys(BUNDLED_PACK_RECORDS).sort();
|
|
11389
11695
|
var parsedPackCache = /* @__PURE__ */ new Map();
|
|
@@ -11410,6 +11716,36 @@ function resolveStandardsPacks(packIds) {
|
|
|
11410
11716
|
}
|
|
11411
11717
|
return packs;
|
|
11412
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
|
+
}
|
|
11413
11749
|
|
|
11414
11750
|
// src/services/languageDirective.ts
|
|
11415
11751
|
function resolveTargetLanguageCode(language) {
|
|
@@ -11721,7 +12057,7 @@ type: "LESSON_EDP"
|
|
|
11721
12057
|
- **Estimated Duration:** 90 minutes
|
|
11722
12058
|
- **Project Objective:** [Complete engineering system or functional deliverable students build]
|
|
11723
12059
|
- **Materials & Equipment:** [Detailed hardware, software libraries, and workstation tools]
|
|
11724
|
-
- **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")
|
|
11725
12061
|
|
|
11726
12062
|
### 2. Activity Sequence
|
|
11727
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.
|
|
@@ -11771,7 +12107,7 @@ type: "LESSON_GENERAL"
|
|
|
11771
12107
|
- **Estimated Duration:** 90 minutes
|
|
11772
12108
|
- **Materials & Equipment:** [Tools, IDE, workstations, resources]
|
|
11773
12109
|
- **Keywords / Core Concepts:** [Core domain terminology]
|
|
11774
|
-
- **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")
|
|
11775
12111
|
|
|
11776
12112
|
### 2. Activity Sequence
|
|
11777
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.
|
|
@@ -11819,7 +12155,7 @@ type: "LESSON_5E"
|
|
|
11819
12155
|
- **Estimated Duration:** 90 minutes
|
|
11820
12156
|
- **Materials & Equipment:** [Tools, IDE, hardware/software specifications]
|
|
11821
12157
|
- **Keywords / Core Concepts:** [Core domain terminology]
|
|
11822
|
-
- **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")
|
|
11823
12159
|
|
|
11824
12160
|
### 2. Activity Sequence
|
|
11825
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.
|
|
@@ -13039,13 +13375,52 @@ ${buildHeadingDirective("EXT", slcMarkdown, targetLang)}`;
|
|
|
13039
13375
|
});
|
|
13040
13376
|
}
|
|
13041
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
|
+
}
|
|
13042
13416
|
return {
|
|
13043
13417
|
lessonId: lessonCode,
|
|
13044
13418
|
pedagogy,
|
|
13045
13419
|
producedArtifacts,
|
|
13046
13420
|
pausedForReview: false,
|
|
13047
13421
|
contextInjection: lessonInjection && lessonInjection.verified ? expositionInjection || lessonInjection : lessonInjection || expositionInjection,
|
|
13048
|
-
promptChars: commonContext.length
|
|
13422
|
+
promptChars: commonContext.length,
|
|
13423
|
+
standardsCoverage
|
|
13049
13424
|
};
|
|
13050
13425
|
}
|
|
13051
13426
|
function parseLessonObjectives(lessonContent, concept, bloomLevel) {
|
|
@@ -13067,6 +13442,65 @@ function parseLessonObjectives(lessonContent, concept, bloomLevel) {
|
|
|
13067
13442
|
}
|
|
13068
13443
|
return objectives.slice(0, 6);
|
|
13069
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
|
+
}
|
|
13070
13504
|
async function judgeSatelliteArtifact(ctx) {
|
|
13071
13505
|
const { storage, projectId, lessonCode, sat, content } = ctx;
|
|
13072
13506
|
try {
|
|
@@ -16791,120 +17225,6 @@ var MisconceptionEvaluator = class {
|
|
|
16791
17225
|
};
|
|
16792
17226
|
}
|
|
16793
17227
|
};
|
|
16794
|
-
|
|
16795
|
-
// src/standards/standardsCoverageGate.ts
|
|
16796
|
-
function resolveStatementRef(ref, packs) {
|
|
16797
|
-
const [head, ...rest] = ref.split(":");
|
|
16798
|
-
const candidatePacks = rest.length > 0 ? packs.filter((p) => p.manifest.id === head) : packs;
|
|
16799
|
-
const statementId = rest.length > 0 ? rest.join(":") : ref;
|
|
16800
|
-
for (const p of candidatePacks) {
|
|
16801
|
-
if (p.statements.some((s) => s.id === statementId)) return { pack: p, statementId };
|
|
16802
|
-
}
|
|
16803
|
-
return null;
|
|
16804
|
-
}
|
|
16805
|
-
function evaluateStandardsCoverage(input) {
|
|
16806
|
-
const rows = [];
|
|
16807
|
-
const aoToLo = /* @__PURE__ */ new Map();
|
|
16808
|
-
for (const ao of input.assessmentObjectives ?? []) aoToLo.set(ao.aoCode, ao.alignedLO);
|
|
16809
|
-
const loToRefs = /* @__PURE__ */ new Map();
|
|
16810
|
-
for (const lo of input.objectives) {
|
|
16811
|
-
loToRefs.set(lo.code, new Set(lo.standardRefs ?? []));
|
|
16812
|
-
}
|
|
16813
|
-
const taughtLOs = /* @__PURE__ */ new Set();
|
|
16814
|
-
for (const act of input.activities ?? []) for (const lo of act.lo) taughtLOs.add(lo);
|
|
16815
|
-
const assessedLOs = /* @__PURE__ */ new Set();
|
|
16816
|
-
for (const q of input.quizQuestions) {
|
|
16817
|
-
if (q.alignedLO) assessedLOs.add(q.alignedLO);
|
|
16818
|
-
if (q.alignedAO) {
|
|
16819
|
-
const lo = aoToLo.get(q.alignedAO);
|
|
16820
|
-
if (lo) assessedLOs.add(lo);
|
|
16821
|
-
}
|
|
16822
|
-
}
|
|
16823
|
-
for (const pack of input.packs) {
|
|
16824
|
-
const mappingByStatement = /* @__PURE__ */ new Map();
|
|
16825
|
-
for (const m of pack.mappings ?? []) {
|
|
16826
|
-
const prev = mappingByStatement.get(m.statementId);
|
|
16827
|
-
if (!prev || prev !== "covers" && m.kind === "covers" || prev === "extends" && m.kind !== "extends") {
|
|
16828
|
-
mappingByStatement.set(m.statementId, m.kind);
|
|
16829
|
-
}
|
|
16830
|
-
}
|
|
16831
|
-
for (const statement of pack.statements) {
|
|
16832
|
-
const refFull = `${pack.manifest.id}:${statement.id}`;
|
|
16833
|
-
const issues = [];
|
|
16834
|
-
const los = input.objectives.filter((lo) => (lo.standardRefs ?? []).some((r) => r === statement.id || r === refFull)).map((lo) => lo.code);
|
|
16835
|
-
const kind = mappingByStatement.get(statement.id);
|
|
16836
|
-
const hasMapping = kind !== void 0;
|
|
16837
|
-
const isComplianceRelevant = kind === "covers";
|
|
16838
|
-
const hasActivity = los.some((lo) => taughtLOs.has(lo));
|
|
16839
|
-
const hasAssessment = los.some((lo) => assessedLOs.has(lo));
|
|
16840
|
-
let status;
|
|
16841
|
-
if (!hasMapping) status = "UNMAPPED";
|
|
16842
|
-
else if (!isComplianceRelevant) status = "PARTIAL";
|
|
16843
|
-
else if (los.length > 0 && hasActivity && hasAssessment) status = "COVERED";
|
|
16844
|
-
else status = "UNCOVERED";
|
|
16845
|
-
if (status === "UNCOVERED") {
|
|
16846
|
-
if (los.length === 0) issues.push("No learning objective anchors this statement (missing standardRefs).");
|
|
16847
|
-
else {
|
|
16848
|
-
if (!hasActivity) issues.push(`Anchored LO(s) ${los.join(", ")} have no activity in lesson flow.`);
|
|
16849
|
-
if (!hasAssessment) issues.push(`Anchored LO(s) ${los.join(", ")} are not measured by any quiz question.`);
|
|
16850
|
-
}
|
|
16851
|
-
}
|
|
16852
|
-
rows.push({
|
|
16853
|
-
packId: pack.manifest.id,
|
|
16854
|
-
statementId: statement.id,
|
|
16855
|
-
statementText: Object.values(statement.texts)[0] ?? "",
|
|
16856
|
-
status,
|
|
16857
|
-
objectives: los,
|
|
16858
|
-
hasActivity,
|
|
16859
|
-
hasAssessment,
|
|
16860
|
-
issues
|
|
16861
|
-
});
|
|
16862
|
-
}
|
|
16863
|
-
}
|
|
16864
|
-
for (const lo of input.objectives) {
|
|
16865
|
-
for (const r of lo.standardRefs ?? []) {
|
|
16866
|
-
if (!resolveStatementRef(r, input.packs)) {
|
|
16867
|
-
rows.push({
|
|
16868
|
-
packId: "(unresolved)",
|
|
16869
|
-
statementId: r,
|
|
16870
|
-
statementText: "",
|
|
16871
|
-
status: "UNCOVERED",
|
|
16872
|
-
objectives: [lo.code],
|
|
16873
|
-
hasActivity: false,
|
|
16874
|
-
hasAssessment: false,
|
|
16875
|
-
issues: [`standardRef "${r}" does not exist in any adopted pack \u2014 likely a hallucinated or stale ID`]
|
|
16876
|
-
});
|
|
16877
|
-
}
|
|
16878
|
-
}
|
|
16879
|
-
}
|
|
16880
|
-
const complianceRows = rows.filter((r) => r.status !== "UNMAPPED" && r.status !== "PARTIAL");
|
|
16881
|
-
const covered = complianceRows.filter((r) => r.status === "COVERED").length;
|
|
16882
|
-
const coveragePct = complianceRows.length === 0 ? 100 : Math.round(covered / complianceRows.length * 100);
|
|
16883
|
-
const unresolvedCount = rows.filter((r) => r.packId === "(unresolved)").length;
|
|
16884
|
-
const verdict = unresolvedCount > 0 || coveragePct < 60 ? "FAIL" : coveragePct < 100 ? "WARN" : "PASS";
|
|
16885
|
-
const lines = [
|
|
16886
|
-
"# Standards Coverage Report",
|
|
16887
|
-
"",
|
|
16888
|
-
`- Verdict: **${verdict}**`,
|
|
16889
|
-
`- Compliance coverage: **${coveragePct}%** (${covered}/${complianceRows.length} "covers" statements fully taught + assessed)`,
|
|
16890
|
-
`- Unresolved standardRefs: ${unresolvedCount}`,
|
|
16891
|
-
"",
|
|
16892
|
-
"| Pack | Statement | Status | LOs | Activity | Assessment |",
|
|
16893
|
-
"|---|---|---|---|---|---|",
|
|
16894
|
-
...rows.map(
|
|
16895
|
-
(r) => `|${r.packId}|${r.statementId}|${r.status}|${r.objectives.join(", ") || "\u2014"}|${r.hasActivity ? "\u2713" : "\u2717"}|${r.hasAssessment ? "\u2713" : "\u2717"}|`
|
|
16896
|
-
)
|
|
16897
|
-
];
|
|
16898
|
-
const issueLines = rows.filter((r) => r.issues.length > 0).flatMap((r) => r.issues.map((i) => `- [${r.packId}:${r.statementId}] ${i}`));
|
|
16899
|
-
if (issueLines.length > 0) lines.push("", "## Issues", ...issueLines);
|
|
16900
|
-
return {
|
|
16901
|
-
verdict,
|
|
16902
|
-
coveragePct,
|
|
16903
|
-
rows,
|
|
16904
|
-
summary: `Standards coverage ${coveragePct}% \u2014 verdict ${verdict}`,
|
|
16905
|
-
rawMarkdownReport: lines.join("\n")
|
|
16906
|
-
};
|
|
16907
|
-
}
|
|
16908
17228
|
var StandardsRegistryAdapter = class {
|
|
16909
17229
|
client;
|
|
16910
17230
|
constructor(config = {}) {
|
|
@@ -17567,6 +17887,6 @@ function renderMediaPlaceholder(entry) {
|
|
|
17567
17887
|
return `> \u{1F5BC}\uFE0F [\u1EA2nh \u0111ang ch\u1EDD: ${entry.name} \u2014 s\u1EBD \u0111\u01B0\u1EE3c t\u1EA1o sau khi duy\u1EC7t media]`;
|
|
17568
17888
|
}
|
|
17569
17889
|
|
|
17570
|
-
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 };
|
|
17571
17891
|
//# sourceMappingURL=index.mjs.map
|
|
17572
17892
|
//# sourceMappingURL=index.mjs.map
|