@thanh01.pmt/curriculum-kit 1.4.35 → 1.4.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/ai/index.cjs +57 -1
  2. package/dist/ai/index.cjs.map +1 -1
  3. package/dist/ai/index.d.cts +2 -2
  4. package/dist/ai/index.d.ts +2 -2
  5. package/dist/ai/index.mjs +57 -1
  6. package/dist/ai/index.mjs.map +1 -1
  7. package/dist/{gateSettings-DabOqP6_.d.cts → gateSettings-oo5tCUS_.d.cts} +18 -0
  8. package/dist/{gateSettings-DabOqP6_.d.ts → gateSettings-oo5tCUS_.d.ts} +18 -0
  9. package/dist/index.cjs +793 -51
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.d.cts +251 -74
  12. package/dist/index.d.ts +251 -74
  13. package/dist/index.mjs +775 -52
  14. package/dist/index.mjs.map +1 -1
  15. package/dist/pipeline/index.cjs +57 -1
  16. package/dist/pipeline/index.cjs.map +1 -1
  17. package/dist/pipeline/index.mjs +57 -1
  18. package/dist/pipeline/index.mjs.map +1 -1
  19. package/dist/schemas/index.cjs +63 -1
  20. package/dist/schemas/index.cjs.map +1 -1
  21. package/dist/schemas/index.d.cts +436 -33
  22. package/dist/schemas/index.d.ts +436 -33
  23. package/dist/schemas/index.mjs +58 -2
  24. package/dist/schemas/index.mjs.map +1 -1
  25. package/dist/standards/index.d.cts +2 -2
  26. package/dist/standards/index.d.ts +2 -2
  27. package/dist/workflow/index.cjs +84 -2
  28. package/dist/workflow/index.cjs.map +1 -1
  29. package/dist/workflow/index.d.cts +3 -3
  30. package/dist/workflow/index.d.ts +3 -3
  31. package/dist/workflow/index.mjs +84 -2
  32. package/dist/workflow/index.mjs.map +1 -1
  33. package/package.json +1 -1
  34. package/dist/{standardsCoverageGate-DR5YTtlt.d.cts → standardsCoverageGate-49pJq5t8.d.cts} +6 -6
  35. package/dist/{standardsCoverageGate-DR5YTtlt.d.ts → standardsCoverageGate-49pJq5t8.d.ts} +6 -6
@@ -1,5 +1,5 @@
1
- import { F as FrameworkPack, g as FrameworkStatement } from '../standardsCoverageGate-DR5YTtlt.cjs';
2
- export { B as BloomHintSchema, a as ClassificationSchema, m as CoverageGateInput, C as CoverageGateReport, h as FrameworkMapping, d as FrameworkMappingSchema, f as FrameworkPackManifest, b as FrameworkPackManifestSchema, e as FrameworkPackSchema, c as FrameworkStatementSchema, G as GradeBandSchema, i as MappingKind, M as MappingKindSchema, P as PackLintIssue, k as PackValidationResult, j as RecordProvenance, R as RecordProvenanceSchema, S as StatementCoverageRow, n as evaluateStandardsCoverage, l as lintFrameworkPack, v as validateFrameworkPack } from '../standardsCoverageGate-DR5YTtlt.cjs';
1
+ import { F as FrameworkPack, g as FrameworkStatement } from '../standardsCoverageGate-49pJq5t8.cjs';
2
+ export { B as BloomHintSchema, a as ClassificationSchema, m as CoverageGateInput, C as CoverageGateReport, h as FrameworkMapping, d as FrameworkMappingSchema, f as FrameworkPackManifest, b as FrameworkPackManifestSchema, e as FrameworkPackSchema, c as FrameworkStatementSchema, G as GradeBandSchema, i as MappingKind, M as MappingKindSchema, P as PackLintIssue, k as PackValidationResult, j as RecordProvenance, R as RecordProvenanceSchema, S as StatementCoverageRow, n as evaluateStandardsCoverage, l as lintFrameworkPack, v as validateFrameworkPack } from '../standardsCoverageGate-49pJq5t8.cjs';
3
3
  import { SupabaseClient } from '@supabase/supabase-js';
4
4
  import 'zod';
5
5
 
@@ -1,5 +1,5 @@
1
- import { F as FrameworkPack, g as FrameworkStatement } from '../standardsCoverageGate-DR5YTtlt.js';
2
- export { B as BloomHintSchema, a as ClassificationSchema, m as CoverageGateInput, C as CoverageGateReport, h as FrameworkMapping, d as FrameworkMappingSchema, f as FrameworkPackManifest, b as FrameworkPackManifestSchema, e as FrameworkPackSchema, c as FrameworkStatementSchema, G as GradeBandSchema, i as MappingKind, M as MappingKindSchema, P as PackLintIssue, k as PackValidationResult, j as RecordProvenance, R as RecordProvenanceSchema, S as StatementCoverageRow, n as evaluateStandardsCoverage, l as lintFrameworkPack, v as validateFrameworkPack } from '../standardsCoverageGate-DR5YTtlt.js';
1
+ import { F as FrameworkPack, g as FrameworkStatement } from '../standardsCoverageGate-49pJq5t8.js';
2
+ export { B as BloomHintSchema, a as ClassificationSchema, m as CoverageGateInput, C as CoverageGateReport, h as FrameworkMapping, d as FrameworkMappingSchema, f as FrameworkPackManifest, b as FrameworkPackManifestSchema, e as FrameworkPackSchema, c as FrameworkStatementSchema, G as GradeBandSchema, i as MappingKind, M as MappingKindSchema, P as PackLintIssue, k as PackValidationResult, j as RecordProvenance, R as RecordProvenanceSchema, S as StatementCoverageRow, n as evaluateStandardsCoverage, l as lintFrameworkPack, v as validateFrameworkPack } from '../standardsCoverageGate-49pJq5t8.js';
3
3
  import { SupabaseClient } from '@supabase/supabase-js';
4
4
  import 'zod';
5
5
 
@@ -2394,6 +2394,50 @@ var ScaffoldDecisionEntrySchema = zod.z.object({
2394
2394
  minutes_saved: zod.z.number().int().nonnegative().default(0),
2395
2395
  reason: zod.z.string().min(3)
2396
2396
  });
2397
+ var ZpdVerdictSchema = zod.z.enum(["OK", "TOO_MANY_NEW", "NO_ZPD_BRIDGE"]);
2398
+ var SessionZpdStatusSchema = zod.z.object({
2399
+ verdict: ZpdVerdictSchema,
2400
+ new_concept_count: zod.z.number().int().nonnegative().default(0),
2401
+ known_concept_count: zod.z.number().int().nonnegative().default(0),
2402
+ issues: zod.z.array(zod.z.string()).default([])
2403
+ });
2404
+ var ConceptSpiralEncounterSchema = zod.z.object({
2405
+ concept_code: zod.z.string(),
2406
+ session_id: LessonCodeSchema,
2407
+ encounter_index: zod.z.number().int().positive(),
2408
+ bloom_cap: BloomLevelSchema,
2409
+ depth: DepthLevelSchema
2410
+ });
2411
+ var WalkingSkeletonSchema = zod.z.object({
2412
+ epitome_unit_id: zod.z.string().default("U01"),
2413
+ epitome_deliverables: zod.z.array(zod.z.string()).default([]),
2414
+ elaborations: zod.z.array(zod.z.object({
2415
+ unit_id: zod.z.string(),
2416
+ focus_area: zod.z.string(),
2417
+ elaborates_on: zod.z.array(zod.z.string()).default([])
2418
+ })).default([])
2419
+ });
2420
+ var MasteryGateSchema = zod.z.object({
2421
+ phase_or_unit_id: zod.z.string(),
2422
+ gate_name: zod.z.string(),
2423
+ exit_criteria: zod.z.array(zod.z.string()).min(1),
2424
+ next_unit_id: zod.z.string(),
2425
+ remediation: zod.z.object({
2426
+ trigger: zod.z.literal("FAIL_GATE_CRITERIA"),
2427
+ focus_minutes: zod.z.number().int().default(15),
2428
+ action: zod.z.string()
2429
+ })
2430
+ });
2431
+ var ConceptPrerequisiteEdgeSchema = zod.z.object({
2432
+ concept_code: zod.z.string(),
2433
+ requires: zod.z.string(),
2434
+ source: zod.z.enum(["MASTER_TREE", "INFERRED", "CONCEPT_LEVEL_PREREQ"]).default("CONCEPT_LEVEL_PREREQ"),
2435
+ confidence: zod.z.number().min(0).max(1).default(0.8),
2436
+ rationale: zod.z.string().default(""),
2437
+ structure_supported: zod.z.boolean().default(true),
2438
+ needs_review: zod.z.boolean().default(false),
2439
+ hub: zod.z.boolean().default(false)
2440
+ });
2397
2441
  var SessionPlanSchema = zod.z.object({
2398
2442
  id: LessonCodeSchema,
2399
2443
  unit_id: zod.z.string().regex(/^U\d{2}$/),
@@ -2414,7 +2458,14 @@ var SessionPlanSchema = zod.z.object({
2414
2458
  scaffold_decisions: zod.z.array(ScaffoldDecisionEntrySchema).default([]),
2415
2459
  // What the student can demonstrate after this session — feeds exit tickets.
2416
2460
  exit_evidence: zod.z.array(zod.z.string()).min(1),
2417
- differentiation: zod.z.object({ bronze: zod.z.string(), silver: zod.z.string(), gold: zod.z.string() })
2461
+ differentiation: zod.z.object({ bronze: zod.z.string(), silver: zod.z.string(), gold: zod.z.string() }),
2462
+ // P50: ZPD cognitive load status for this session
2463
+ zpd_status: SessionZpdStatusSchema.default({
2464
+ verdict: "OK",
2465
+ new_concept_count: 0,
2466
+ known_concept_count: 0,
2467
+ issues: []
2468
+ })
2418
2469
  });
2419
2470
  var TranslationPolicySchema = zod.z.object({
2420
2471
  policy: zod.z.enum(["after_artifact", "end_of_unit", "at_publish", "native"]).default("native"),
@@ -2469,6 +2520,11 @@ zod.z.object({
2469
2520
  // [2]
2470
2521
  sessions: zod.z.array(SessionPlanSchema).min(1),
2471
2522
  // [3][4][5][6]
2523
+ // P50: Macro-pedagogical course structures
2524
+ walking_skeleton: WalkingSkeletonSchema.optional(),
2525
+ mastery_gates: zod.z.array(MasteryGateSchema).default([]),
2526
+ concept_spiral_progression: zod.z.array(ConceptSpiralEncounterSchema).default([]),
2527
+ concept_prerequisites: zod.z.array(ConceptPrerequisiteEdgeSchema).default([]),
2472
2528
  glossary_scope: zod.z.array(zod.z.object({
2473
2529
  session_id: LessonCodeSchema,
2474
2530
  terms: zod.z.array(zod.z.string())
@@ -19054,7 +19110,8 @@ function parseAllSessions(plan, frameworkMarkdown) {
19054
19110
  prose_objective: s.prose_objective || s.objective || "",
19055
19111
  new_keywords: Array.isArray(s.new_keywords) ? s.new_keywords : Array.isArray(s.keywords) ? s.keywords : [],
19056
19112
  prerequisite_keywords: Array.isArray(s.prerequisite_keywords) ? s.prerequisite_keywords : [],
19057
- depth_assignments: Array.isArray(s.depth_assignments) ? s.depth_assignments : []
19113
+ depth_assignments: Array.isArray(s.depth_assignments) ? s.depth_assignments : [],
19114
+ zpd_status: s.zpd_status
19058
19115
  }));
19059
19116
  }
19060
19117
  }
@@ -19202,12 +19259,16 @@ async function extractCurriculumHorizon(opts) {
19202
19259
  title: s.title,
19203
19260
  keywords: s.new_keywords || []
19204
19261
  }));
19262
+ const rawSpirals = Array.isArray(plan?.concept_spiral_progression) ? plan.concept_spiral_progression : [];
19263
+ const sessionSpirals = rawSpirals.filter((e) => e.session_id === targetLessonId);
19205
19264
  return {
19206
19265
  targetLessonId,
19207
19266
  targetLessonIndex: targetIndex + 1,
19208
19267
  totalLessons: sessions.length,
19209
19268
  targetTitle: currentSession.title,
19210
19269
  targetKeywords: currentSession.new_keywords || [],
19270
+ zpdStatus: currentSession.zpd_status,
19271
+ spiralProgression: sessionSpirals,
19211
19272
  compactMasterySet: {
19212
19273
  masteredKeywords,
19213
19274
  masteredConcepts
@@ -19223,6 +19284,8 @@ function renderHorizonPromptBlock(horizon) {
19223
19284
  totalLessons,
19224
19285
  targetTitle,
19225
19286
  targetKeywords,
19287
+ zpdStatus,
19288
+ spiralProgression,
19226
19289
  compactMasterySet,
19227
19290
  detailedBridge,
19228
19291
  boundaryPeek
@@ -19230,6 +19293,19 @@ function renderHorizonPromptBlock(horizon) {
19230
19293
  const lines = [
19231
19294
  `# \u{1F9ED} CURRICULUM HORIZON & SCAFFOLDING MATRIX (Lesson ${targetLessonIndex}/${totalLessons}: "${targetTitle}" [${targetLessonId}])`
19232
19295
  ];
19296
+ if (zpdStatus && zpdStatus.verdict !== "OK") {
19297
+ lines.push(
19298
+ `
19299
+ > \u26A0\uFE0F **ZPD COGNITIVE LOAD ALERT (${zpdStatus.verdict}):** ${zpdStatus.issues?.join("; ") || "Scaffolding bridge mandated"}. Introduce minimal new syntax and anchor into known concepts.`
19300
+ );
19301
+ }
19302
+ if (spiralProgression && spiralProgression.length > 0) {
19303
+ const spiralNotes = spiralProgression.map(
19304
+ (sp) => `\`${sp.concept_code}\` (Encounter #${sp.encounter_index}): Bloom Cap [${sp.bloom_cap}], Depth [${sp.depth.toUpperCase()}]`
19305
+ );
19306
+ lines.push(`
19307
+ - **\u{1F300} Bruner Spiral Curricula Guidance:** ${spiralNotes.join(" | ")}`);
19308
+ }
19233
19309
  if (compactMasterySet.masteredKeywords.length > 0 || compactMasterySet.masteredConcepts.length > 0) {
19234
19310
  const rawKeywords = compactMasterySet.masteredKeywords;
19235
19311
  const displayedKeywords = rawKeywords.length > 20 ? rawKeywords.slice(-20) : rawKeywords;
@@ -19565,6 +19641,12 @@ function findCanonicalFuzzy(norm) {
19565
19641
  if (norm.includes("worked example") || norm.includes("vi du")) {
19566
19642
  return "Worked Micro-Examples";
19567
19643
  }
19644
+ if (norm.includes("common mistake") || norm.includes("loi thuong gap") || norm.includes("sai lam") || norm.includes("pitfall")) {
19645
+ return "Common Mistakes";
19646
+ }
19647
+ if (norm.includes("self check") || norm.includes("self-check") || norm.includes("tu kiem tra")) {
19648
+ return "Self-Check Questions";
19649
+ }
19568
19650
  return void 0;
19569
19651
  }
19570
19652
  function truncateByBudget(source, budget) {