@thanh01.pmt/curriculum-kit 1.0.0
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/README.md +22 -0
- package/dist/ai/index.cjs +4980 -0
- package/dist/ai/index.cjs.map +1 -0
- package/dist/ai/index.d.cts +1287 -0
- package/dist/ai/index.d.ts +1287 -0
- package/dist/ai/index.mjs +4924 -0
- package/dist/ai/index.mjs.map +1 -0
- package/dist/index.cjs +15308 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +747 -0
- package/dist/index.d.ts +747 -0
- package/dist/index.mjs +14965 -0
- package/dist/index.mjs.map +1 -0
- package/dist/media/index.cjs +1238 -0
- package/dist/media/index.cjs.map +1 -0
- package/dist/media/index.d.cts +254 -0
- package/dist/media/index.d.ts +254 -0
- package/dist/media/index.mjs +1221 -0
- package/dist/media/index.mjs.map +1 -0
- package/dist/milestoneBundleGenerator-CbXhs1CP.d.ts +62 -0
- package/dist/milestoneBundleGenerator-DrBtHzBO.d.cts +62 -0
- package/dist/pipeline/index.cjs +4894 -0
- package/dist/pipeline/index.cjs.map +1 -0
- package/dist/pipeline/index.d.cts +161 -0
- package/dist/pipeline/index.d.ts +161 -0
- package/dist/pipeline/index.mjs +4869 -0
- package/dist/pipeline/index.mjs.map +1 -0
- package/dist/provider-factory-DH3udYlN.d.cts +25 -0
- package/dist/provider-factory-DH3udYlN.d.ts +25 -0
- package/dist/publishers/index.cjs +575 -0
- package/dist/publishers/index.cjs.map +1 -0
- package/dist/publishers/index.d.cts +85 -0
- package/dist/publishers/index.d.ts +85 -0
- package/dist/publishers/index.mjs +561 -0
- package/dist/publishers/index.mjs.map +1 -0
- package/dist/schemas/index.cjs +1640 -0
- package/dist/schemas/index.cjs.map +1 -0
- package/dist/schemas/index.d.cts +14194 -0
- package/dist/schemas/index.d.ts +14194 -0
- package/dist/schemas/index.mjs +1517 -0
- package/dist/schemas/index.mjs.map +1 -0
- package/dist/standards/index.cjs +910 -0
- package/dist/standards/index.cjs.map +1 -0
- package/dist/standards/index.d.cts +130 -0
- package/dist/standards/index.d.ts +130 -0
- package/dist/standards/index.mjs +890 -0
- package/dist/standards/index.mjs.map +1 -0
- package/dist/standardsCoverageGate-BWAkXY76.d.cts +767 -0
- package/dist/standardsCoverageGate-BWAkXY76.d.ts +767 -0
- package/dist/storage/index.cjs +595 -0
- package/dist/storage/index.cjs.map +1 -0
- package/dist/storage/index.d.cts +77 -0
- package/dist/storage/index.d.ts +77 -0
- package/dist/storage/index.mjs +583 -0
- package/dist/storage/index.mjs.map +1 -0
- package/dist/streamRunner-C7j5LKon.d.cts +60 -0
- package/dist/streamRunner-C7j5LKon.d.ts +60 -0
- package/dist/supabasePublisher-C627qXFT.d.cts +63 -0
- package/dist/supabasePublisher-C627qXFT.d.ts +63 -0
- package/dist/types-BUJGYiep.d.cts +89 -0
- package/dist/types-BUJGYiep.d.ts +89 -0
- package/dist/workflow/index.cjs +5266 -0
- package/dist/workflow/index.cjs.map +1 -0
- package/dist/workflow/index.d.cts +295 -0
- package/dist/workflow/index.d.ts +295 -0
- package/dist/workflow/index.mjs +5216 -0
- package/dist/workflow/index.mjs.map +1 -0
- package/package.json +105 -0
|
@@ -0,0 +1,1640 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var zod = require('zod');
|
|
4
|
+
|
|
5
|
+
// src/schemas/index.ts
|
|
6
|
+
var LearningObjectiveRowSchema = zod.z.object({
|
|
7
|
+
code: zod.z.string().describe('LO code, e.g. "LO1"'),
|
|
8
|
+
objective: zod.z.string().describe("Bloom-tagged learning objective"),
|
|
9
|
+
evidence: zod.z.string().describe("Observable student evidence / output"),
|
|
10
|
+
successCriteria: zod.z.string().describe("Measurable pass/fail condition"),
|
|
11
|
+
/**
|
|
12
|
+
* Standards anchors (Phase 1: optional). Format: "statementId" or
|
|
13
|
+
* "packId:statementId", e.g. "csta-k12-2017:1B-AP-10". IDs MUST exist in an
|
|
14
|
+
* adopted Framework Pack — the Standards Coverage Gate resolves and audits them.
|
|
15
|
+
*/
|
|
16
|
+
standardRefs: zod.z.array(zod.z.string()).optional().default([]).describe("Anchoring standard statement IDs from adopted Framework Packs"),
|
|
17
|
+
/** Ontora knowledge-tree anchors, e.g. "ontora:WHILE_LOOP" (optional, Phase 1). */
|
|
18
|
+
conceptRefs: zod.z.array(zod.z.string()).optional().default([]).describe('Anchoring ontora concept codes, e.g. "ontora:FOR_LOOP"')
|
|
19
|
+
});
|
|
20
|
+
var ActivitySeqRowSchema = zod.z.object({
|
|
21
|
+
seq: zod.z.coerce.number().int(),
|
|
22
|
+
phase: zod.z.string().describe("EDP or 5E phase label"),
|
|
23
|
+
activityType: zod.z.string().describe('e.g. "Mini-lecture", "Brainstorming", "Hands-on Coding"'),
|
|
24
|
+
actor: zod.z.string().describe('"Teacher" | "Students" | "Teacher + Students"'),
|
|
25
|
+
purpose: zod.z.string().describe("Why this activity is done"),
|
|
26
|
+
studentAction: zod.z.string(),
|
|
27
|
+
teacherMove: zod.z.string(),
|
|
28
|
+
outputEvidence: zod.z.string(),
|
|
29
|
+
lo: zod.z.array(zod.z.string()).describe('e.g. ["LO1","LO2"]'),
|
|
30
|
+
durationMinutes: zod.z.coerce.number().default(10),
|
|
31
|
+
artifactContract: zod.z.string().describe('Satellite artifact(s) linked, e.g. "SLIDE_U03_M01_L13"')
|
|
32
|
+
});
|
|
33
|
+
var ResourceMapRowSchema = zod.z.object({
|
|
34
|
+
resourceType: zod.z.string().describe('"Slide Deck" | "Handout" | "Starter Code" | "Lab Tools" | etc.'),
|
|
35
|
+
identifier: zod.z.string(),
|
|
36
|
+
description: zod.z.string(),
|
|
37
|
+
location: zod.z.string().default("")
|
|
38
|
+
});
|
|
39
|
+
var AssessmentMapRowSchema = zod.z.object({
|
|
40
|
+
form: zod.z.string().describe('"Formative Checkpoint" | "Summative Assessment" | "Peer Feedback"'),
|
|
41
|
+
when: zod.z.string().describe("When in the sequence this is assessed"),
|
|
42
|
+
tool: zod.z.string().describe("Assessment tool or artifact used"),
|
|
43
|
+
criteria: zod.z.string(),
|
|
44
|
+
performanceLevels: zod.z.string().default(""),
|
|
45
|
+
remediationPath: zod.z.string().default("")
|
|
46
|
+
});
|
|
47
|
+
var ArtifactContractRowSchema = zod.z.object({
|
|
48
|
+
artifactId: zod.z.string(),
|
|
49
|
+
artifactType: zod.z.string(),
|
|
50
|
+
description: zod.z.string(),
|
|
51
|
+
requiredSections: zod.z.string().default(""),
|
|
52
|
+
format: zod.z.string().default(""),
|
|
53
|
+
owner: zod.z.string().default("")
|
|
54
|
+
});
|
|
55
|
+
var LessonFlowPhaseSchema = zod.z.object({
|
|
56
|
+
phase: zod.z.string().describe('Phase title, e.g. "ASK", "ENGAGE", "PLAN"'),
|
|
57
|
+
durationMinutes: zod.z.coerce.number(),
|
|
58
|
+
content: zod.z.string().describe("Full narrative content of this phase (teacher actions, student actions, code, outputs)")
|
|
59
|
+
});
|
|
60
|
+
var TroubleshootingRowSchema = zod.z.object({
|
|
61
|
+
issue: zod.z.string(),
|
|
62
|
+
potentialCause: zod.z.string(),
|
|
63
|
+
solution: zod.z.string()
|
|
64
|
+
});
|
|
65
|
+
var LessonBaseSchema = zod.z.object({
|
|
66
|
+
lessonId: zod.z.string(),
|
|
67
|
+
title: zod.z.string(),
|
|
68
|
+
language: zod.z.string().default("en"),
|
|
69
|
+
estimatedDuration: zod.z.string().describe('e.g. "90 minutes"'),
|
|
70
|
+
projectObjective: zod.z.string(),
|
|
71
|
+
materials: zod.z.string().default(""),
|
|
72
|
+
learningObjectives: zod.z.array(LearningObjectiveRowSchema).min(1),
|
|
73
|
+
activitySequence: zod.z.array(ActivitySeqRowSchema).min(1),
|
|
74
|
+
resourceMap: zod.z.array(ResourceMapRowSchema).default([]),
|
|
75
|
+
assessmentMap: zod.z.array(AssessmentMapRowSchema).default([]),
|
|
76
|
+
artifactContract: zod.z.array(ArtifactContractRowSchema).default([]),
|
|
77
|
+
lessonFlow: zod.z.array(LessonFlowPhaseSchema).min(1),
|
|
78
|
+
teacherNotes: zod.z.string().optional().default(""),
|
|
79
|
+
troubleshooting: zod.z.array(TroubleshootingRowSchema).default([])
|
|
80
|
+
});
|
|
81
|
+
var EDPPhaseEnum = zod.z.enum([
|
|
82
|
+
"Ask",
|
|
83
|
+
"Imagine",
|
|
84
|
+
"Plan",
|
|
85
|
+
"Create",
|
|
86
|
+
"Test & Improve",
|
|
87
|
+
"Share & Evaluate"
|
|
88
|
+
]);
|
|
89
|
+
var LessonPlanEDPSchema = LessonBaseSchema.extend({
|
|
90
|
+
artifactType: zod.z.literal("LESSON_EDP").default("LESSON_EDP")
|
|
91
|
+
});
|
|
92
|
+
var FiveEPhaseEnum = zod.z.enum([
|
|
93
|
+
"Engage",
|
|
94
|
+
"Explore",
|
|
95
|
+
"Explain",
|
|
96
|
+
"Elaborate",
|
|
97
|
+
"Evaluate"
|
|
98
|
+
]);
|
|
99
|
+
var FiveEFlowPhaseSchema = LessonFlowPhaseSchema.extend({
|
|
100
|
+
hookScenario: zod.z.string().optional().describe("Hook story/roleplay for Engage phase (5E-specific)"),
|
|
101
|
+
openQuestion: zod.z.string().optional().describe("Explicit guiding question posed to class"),
|
|
102
|
+
visualIllustration: zod.z.string().optional().describe("Mermaid diagram, code, or JSON snippet for Explain phase"),
|
|
103
|
+
tieredScaffolding: zod.z.object({
|
|
104
|
+
bronze: zod.z.string().default(""),
|
|
105
|
+
silver: zod.z.string().default(""),
|
|
106
|
+
gold: zod.z.string().default("")
|
|
107
|
+
}).optional(),
|
|
108
|
+
exitTicketQuestions: zod.z.array(zod.z.string()).optional()
|
|
109
|
+
});
|
|
110
|
+
var LessonPlan5ESchema = LessonBaseSchema.extend({
|
|
111
|
+
artifactType: zod.z.literal("LESSON_5E").default("LESSON_5E"),
|
|
112
|
+
lessonFlow: zod.z.array(FiveEFlowPhaseSchema).min(1),
|
|
113
|
+
keywords: zod.z.array(zod.z.string()).default([])
|
|
114
|
+
}).omit({ lessonFlow: true }).extend({
|
|
115
|
+
lessonFlow: zod.z.array(FiveEFlowPhaseSchema).min(1)
|
|
116
|
+
});
|
|
117
|
+
var CoreConceptSchema = zod.z.object({
|
|
118
|
+
name: zod.z.string(),
|
|
119
|
+
analogy: zod.z.string().default(""),
|
|
120
|
+
technicalDepth: zod.z.string().default(""),
|
|
121
|
+
comparisonTable: zod.z.object({
|
|
122
|
+
headers: zod.z.array(zod.z.string()),
|
|
123
|
+
rows: zod.z.array(zod.z.array(zod.z.string()))
|
|
124
|
+
}).optional(),
|
|
125
|
+
formulaOrRule: zod.z.string().optional().default("")
|
|
126
|
+
});
|
|
127
|
+
var LessonSectionSchema = zod.z.object({
|
|
128
|
+
title: zod.z.string(),
|
|
129
|
+
durationMinutes: zod.z.coerce.number().default(15),
|
|
130
|
+
teacherActions: zod.z.string().default(""),
|
|
131
|
+
studentActions: zod.z.string().default(""),
|
|
132
|
+
analogies: zod.z.array(zod.z.string()).optional().default([]),
|
|
133
|
+
formativeCheck: zod.z.string().optional().default("")
|
|
134
|
+
});
|
|
135
|
+
var LessonPlanSchema = zod.z.object({
|
|
136
|
+
artifactType: zod.z.literal("LESSON").default("LESSON"),
|
|
137
|
+
lessonId: zod.z.string(),
|
|
138
|
+
title: zod.z.string(),
|
|
139
|
+
language: zod.z.string().default("vi"),
|
|
140
|
+
topic: zod.z.string().default("General Topic"),
|
|
141
|
+
targetGradeOrAudience: zod.z.string().default("Learners"),
|
|
142
|
+
overview: zod.z.string(),
|
|
143
|
+
learningObjectives: zod.z.array(zod.z.object({
|
|
144
|
+
code: zod.z.string().default("LO"),
|
|
145
|
+
name: zod.z.string().optional().default(""),
|
|
146
|
+
description: zod.z.string(),
|
|
147
|
+
bloomLevel: zod.z.string().default("understand"),
|
|
148
|
+
successCriteria: zod.z.string().optional().default("")
|
|
149
|
+
})).default([]),
|
|
150
|
+
prerequisites: zod.z.string().optional().default(""),
|
|
151
|
+
materialsSummary: zod.z.string().optional().default(""),
|
|
152
|
+
keywords: zod.z.array(zod.z.string()).optional().default([]),
|
|
153
|
+
hookTitle: zod.z.string().optional().default(""),
|
|
154
|
+
hookScenario: zod.z.string().default(""),
|
|
155
|
+
hookQuestions: zod.z.array(zod.z.string()).optional().default([]),
|
|
156
|
+
coreConcepts: zod.z.array(CoreConceptSchema).optional().default([]),
|
|
157
|
+
guidedPractice: zod.z.object({
|
|
158
|
+
title: zod.z.string().default(""),
|
|
159
|
+
explanation: zod.z.string().default(""),
|
|
160
|
+
codeSnippet: zod.z.string().default(""),
|
|
161
|
+
codeLanguage: zod.z.string().default("typescript"),
|
|
162
|
+
mermaidDiagram: zod.z.string().optional().default("")
|
|
163
|
+
}).optional(),
|
|
164
|
+
independentPractice: zod.z.object({
|
|
165
|
+
title: zod.z.string().default(""),
|
|
166
|
+
description: zod.z.string().default("")
|
|
167
|
+
}).optional(),
|
|
168
|
+
differentiation: zod.z.object({
|
|
169
|
+
bronzeTier: zod.z.string().default(""),
|
|
170
|
+
silverTier: zod.z.string().default(""),
|
|
171
|
+
goldTier: zod.z.string().default("")
|
|
172
|
+
}).default({ bronzeTier: "", silverTier: "", goldTier: "" }),
|
|
173
|
+
sections: zod.z.array(LessonSectionSchema).min(1),
|
|
174
|
+
exitTicket: zod.z.object({
|
|
175
|
+
questionStem: zod.z.string(),
|
|
176
|
+
expectedAnswerOrRubric: zod.z.string().default(""),
|
|
177
|
+
metacognitivePrompt: zod.z.string().default("")
|
|
178
|
+
}),
|
|
179
|
+
teacherNotes: zod.z.object({
|
|
180
|
+
commonPitfalls: zod.z.array(zod.z.string()).default([]),
|
|
181
|
+
troubleshootingMatrix: zod.z.array(TroubleshootingRowSchema).default([]),
|
|
182
|
+
extensionNotes: zod.z.string().optional().default("")
|
|
183
|
+
}).optional().default({ commonPitfalls: [], troubleshootingMatrix: [], extensionNotes: "" })
|
|
184
|
+
});
|
|
185
|
+
var ActivityStepSchema = zod.z.object({
|
|
186
|
+
stepNumber: zod.z.coerce.number().default(1),
|
|
187
|
+
title: zod.z.string().describe("Short descriptive title of this step"),
|
|
188
|
+
durationMinutes: zod.z.coerce.number().default(10).describe("Estimated duration for this step"),
|
|
189
|
+
teacherInstructions: zod.z.string().default("").describe("Guidance and checkpoint tips for the teacher"),
|
|
190
|
+
studentInstructions: zod.z.string().describe("Direct, clear, actionable step-by-step instructions for students"),
|
|
191
|
+
checkpoint: zod.z.string().optional().default("").describe("Clear observable checkpoint or success indicator for this step")
|
|
192
|
+
});
|
|
193
|
+
var ComputationalThinkingSchema = zod.z.object({
|
|
194
|
+
problemStatement: zod.z.string().describe("T\xECnh hu\u1ED1ng th\u1EF1c t\u1EBF \u0111\u1EA7y th\xE1ch th\u1EE9c c\u1EA7n gi\u1EA3i quy\u1EBFt"),
|
|
195
|
+
decomposition: zod.z.array(zod.z.string()).describe("C\xE1c b\u01B0\u1EDBc ph\xE2n r\xE3 b\xE0i to\xE1n l\u1EDBn th\xE0nh c\xE1c ph\u1EA7n nh\u1ECF"),
|
|
196
|
+
algorithmDesign: zod.z.string().describe("Thi\u1EBFt k\u1EBF lu\u1ED3ng thu\u1EADt to\xE1n v\xE0 x\u1EED l\xFD d\u1EEF li\u1EC7u tr\u01B0\u1EDBc khi code")
|
|
197
|
+
});
|
|
198
|
+
var ActiveLearningWorkflowSchema = zod.z.object({
|
|
199
|
+
phase1Planning: zod.z.object({
|
|
200
|
+
durationMinutes: zod.z.coerce.number().default(15),
|
|
201
|
+
studentTask: zod.z.string().describe("V\u1EBD s\u01A1 \u0111\u1ED3, thi\u1EBFt k\u1EBF lu\u1ED3ng tr\xEAn gi\u1EA5y/b\u1EA3ng tr\u01B0\u1EDBc khi g\xF5 ph\xEDm"),
|
|
202
|
+
teacherAction: zod.z.string().describe("Quan s\xE1t v\xE0 \u0111\u1EB7t c\xE2u h\u1ECFi g\u1EE3i m\u1EDF (Inquiry questions)"),
|
|
203
|
+
inquiryQuestions: zod.z.array(zod.z.string()).default([])
|
|
204
|
+
}),
|
|
205
|
+
phase2Implementation: zod.z.object({
|
|
206
|
+
durationMinutes: zod.z.coerce.number().default(40),
|
|
207
|
+
studentTask: zod.z.string().describe("Hi\u1EC7n th\u1EF1c h\xF3a gi\u1EA3i ph\xE1p qua code ho\u1EB7c l\u1EAFp r\xE1p ph\u1EA7n c\u1EE9ng"),
|
|
208
|
+
teacherAction: zod.z.string().describe("H\u1ED7 tr\u1EE3 khi h\u1ECDc sinh b\u1ECB t\u1EAFc > 5 ph\xFAt, tr\xE1nh l\xE0m h\u1ED9"),
|
|
209
|
+
codeOrCommands: zod.z.array(zod.z.string()).default([])
|
|
210
|
+
}),
|
|
211
|
+
phase3Debugging: zod.z.object({
|
|
212
|
+
durationMinutes: zod.z.coerce.number().default(15),
|
|
213
|
+
testingSteps: zod.z.string().describe("Quy tr\xECnh ch\u1EA1y th\u1EED nghi\u1EC7m v\xE0 ki\u1EC3m tra \u0111\u1EA7u ra"),
|
|
214
|
+
errorAnalysis: zod.z.string().describe("Ph\xE2n t\xEDch m\xE3 l\u1ED7i v\xE0 t\u1EF1 g\u1EE1 l\u1ED7i d\u1EF1a tr\xEAn b\u1EA3ng Troubleshooting")
|
|
215
|
+
})
|
|
216
|
+
});
|
|
217
|
+
var ActivityLabSchema = zod.z.object({
|
|
218
|
+
artifactType: zod.z.literal("ACT").default("ACT"),
|
|
219
|
+
lessonId: zod.z.string().describe("Matching lesson identifier"),
|
|
220
|
+
title: zod.z.string().describe("Activity title"),
|
|
221
|
+
language: zod.z.string().default("vi").describe('Language code of the content, e.g. "vi" or "en"'),
|
|
222
|
+
objective: zod.z.string().describe("Core hands-on objective of the activity"),
|
|
223
|
+
totalDurationMinutes: zod.z.coerce.number().default(60).describe("Total estimated duration of the activity"),
|
|
224
|
+
// 1. Computational Thinking Focus
|
|
225
|
+
computationalThinking: ComputationalThinkingSchema.optional(),
|
|
226
|
+
// 2. Bill of Materials (BOM)
|
|
227
|
+
materialsBOM: zod.z.object({
|
|
228
|
+
hardware: zod.z.array(zod.z.string()).default([]).describe("Hardware boards, components, sensors, or devices required (b\u1ECDc trong <!-- [HARDWARE_BOM] -->)"),
|
|
229
|
+
software: zod.z.array(zod.z.string()).default([]).describe("IDE, compilers, browser tools, libraries, or simulators required"),
|
|
230
|
+
consumables: zod.z.array(zod.z.string()).default([]).describe("Paper, pens, wires, or disposable items"),
|
|
231
|
+
otherResources: zod.z.array(zod.z.string()).default([]).describe("Worksheets, handouts, or reference links")
|
|
232
|
+
}),
|
|
233
|
+
// 3. Constraints & Safety
|
|
234
|
+
safetyWarnings: zod.z.array(zod.z.string()).default([]).describe("Essential safety cautions, electrical warnings, or common hazards"),
|
|
235
|
+
designConstraints: zod.z.array(zod.z.string()).default([]).describe("Design constraints to stimulate creative problem solving"),
|
|
236
|
+
teacherTips: zod.z.array(zod.z.string()).default([]).describe("Pedagogical facilitation tips, troubleshooting tricks"),
|
|
237
|
+
// 4. Workflow (Phases or Steps)
|
|
238
|
+
activeLearningWorkflow: ActiveLearningWorkflowSchema.optional(),
|
|
239
|
+
steps: zod.z.array(ActivityStepSchema).default([]).describe("Step-by-step procedure of the activity"),
|
|
240
|
+
// 5. Differentiation (3-Tier)
|
|
241
|
+
differentiation3Tier: zod.z.object({
|
|
242
|
+
bronzeTier: zod.z.string().default("").describe("Nhi\u1EC7m v\u1EE5 n\u1EC1n t\u1EA3ng c\u01A1 b\u1EA3n"),
|
|
243
|
+
silverTier: zod.z.string().default("").describe("Nhi\u1EC7m v\u1EE5 \u1EE9ng d\u1EE5ng logic n\xE2ng cao"),
|
|
244
|
+
goldTier: zod.z.string().default("").describe("Th\u1EED th\xE1ch s\xE1ng t\u1EA1o m\u1EDF r\u1ED9ng")
|
|
245
|
+
}).optional(),
|
|
246
|
+
scaffoldingSupport: zod.z.string().default("").describe("How to simplify for struggling students"),
|
|
247
|
+
levelUpExtension: zod.z.string().default("").describe("Extension task for students who finish early"),
|
|
248
|
+
// 6. Reflection
|
|
249
|
+
reflectionQuestion: zod.z.string().optional().default("").describe("C\xE2u h\u1ECFi ph\u1EA3n t\u01B0 k\xEDch th\xEDch t\u01B0 duy ph\u1EA3n bi\u1EC7n")
|
|
250
|
+
});
|
|
251
|
+
var CodeSnippetSchema = zod.z.object({
|
|
252
|
+
filename: zod.z.string().describe("Filename with extension, e.g. main.py, App.swift, solution.ts"),
|
|
253
|
+
language: zod.z.string().describe("Programming language identifier, e.g. python, swift, typescript, cpp"),
|
|
254
|
+
purpose: zod.z.enum(["starter", "solution", "test_runner", "scaffold"]).describe("Role of this code file"),
|
|
255
|
+
content: zod.z.string().describe("Complete, clean, runnable source code with standardized comments and docstrings"),
|
|
256
|
+
explanation: zod.z.string().default("").describe("Explanation of key algorithmic blocks and syntax nuances")
|
|
257
|
+
});
|
|
258
|
+
var LabTierTaskSchema = zod.z.object({
|
|
259
|
+
mins: zod.z.coerce.number().default(15),
|
|
260
|
+
objective: zod.z.string().describe("M\u1EE5c ti\xEAu c\u1EE7a t\u1EA7ng nhi\u1EC7m v\u1EE5"),
|
|
261
|
+
task: zod.z.string().describe("M\xF4 t\u1EA3 nhi\u1EC7m v\u1EE5 c\u1EE5 th\u1EC3"),
|
|
262
|
+
requirement: zod.z.string().describe("Ti\xEAu ch\xED ho\xE0n th\xE0nh b\u1EAFt bu\u1ED9c")
|
|
263
|
+
});
|
|
264
|
+
var CodeLabSchema = zod.z.object({
|
|
265
|
+
artifactType: zod.z.literal("CODE").default("CODE"),
|
|
266
|
+
lessonId: zod.z.string().describe("Matching lesson identifier"),
|
|
267
|
+
title: zod.z.string().describe("Code Lab title"),
|
|
268
|
+
language: zod.z.string().default("vi").describe('Language code for human explanations, e.g. "vi" or "en"'),
|
|
269
|
+
techStack: zod.z.array(zod.z.string()).default([]).describe('Technologies used, e.g. ["Python", "PyTorch"] or ["Swift", "SwiftUI"]'),
|
|
270
|
+
// 1. Environment & Setup
|
|
271
|
+
environmentSetup: zod.z.object({
|
|
272
|
+
languageFramework: zod.z.string().default(""),
|
|
273
|
+
ideEditor: zod.z.string().default(""),
|
|
274
|
+
requiredLibraries: zod.z.array(zod.z.string()).default([]),
|
|
275
|
+
hardwareOrEnvConnection: zod.z.string().optional().default("")
|
|
276
|
+
}).optional(),
|
|
277
|
+
// 2. 3-Tier Differentiation Tasks
|
|
278
|
+
threeTierTasks: zod.z.object({
|
|
279
|
+
bronze: LabTierTaskSchema,
|
|
280
|
+
silver: LabTierTaskSchema,
|
|
281
|
+
gold: LabTierTaskSchema
|
|
282
|
+
}).optional(),
|
|
283
|
+
// 3. Verified Runnable Code Snippets (bọc trong <!-- [SME_MANDATE] -->)
|
|
284
|
+
starterCode: CodeSnippetSchema.describe("Starter code provided to the learner with fill-in markers or skeletons"),
|
|
285
|
+
solutionCode: CodeSnippetSchema.describe("Complete verified reference solution code"),
|
|
286
|
+
testCases: zod.z.array(
|
|
287
|
+
zod.z.object({
|
|
288
|
+
description: zod.z.string().describe("What this test case verifies"),
|
|
289
|
+
input: zod.z.string().optional().default("").describe("Input or mock parameters"),
|
|
290
|
+
expectedOutput: zod.z.string().describe("Expected return value, output, or UI state")
|
|
291
|
+
})
|
|
292
|
+
).default([]).describe("Automated verification tests or validation checks"),
|
|
293
|
+
// 4. Troubleshooting & Debugging Matrix
|
|
294
|
+
troubleshootingMatrix: zod.z.array(
|
|
295
|
+
zod.z.object({
|
|
296
|
+
issue: zod.z.string().describe("Hi\u1EC7n t\u01B0\u1EE3ng l\u1ED7i runtime/compile"),
|
|
297
|
+
potentialCause: zod.z.string().describe("Nguy\xEAn nh\xE2n ti\u1EC1m \u1EA9n"),
|
|
298
|
+
solution: zod.z.string().describe("Gi\u1EA3i ph\xE1p kh\u1EAFc ph\u1EE5c d\u1EE9t \u0111i\u1EC3m")
|
|
299
|
+
})
|
|
300
|
+
).default([]),
|
|
301
|
+
commonBugsAndFixes: zod.z.array(
|
|
302
|
+
zod.z.object({
|
|
303
|
+
bugDescription: zod.z.string().describe("Common error message or logical pitfall"),
|
|
304
|
+
solutionHint: zod.z.string().describe("How to diagnose and fix it")
|
|
305
|
+
})
|
|
306
|
+
).default([]),
|
|
307
|
+
// 5. Submission Checklist
|
|
308
|
+
submissionChecklist: zod.z.array(zod.z.string()).default([]).describe("Danh m\u1EE5c ki\u1EC3m tra ho\xE0n th\xE0nh n\u1ED9p b\xE0i")
|
|
309
|
+
});
|
|
310
|
+
var WorksheetItemTypeEnum = zod.z.enum([
|
|
311
|
+
"fill_blank",
|
|
312
|
+
// Fill in the blanks sentence/table
|
|
313
|
+
"multiple_choice",
|
|
314
|
+
// Select the correct option
|
|
315
|
+
"matching",
|
|
316
|
+
// Match left column to right column
|
|
317
|
+
"short_answer",
|
|
318
|
+
// Open-ended text response
|
|
319
|
+
"code_trace",
|
|
320
|
+
// Trace through code and write output
|
|
321
|
+
"diagram_fill",
|
|
322
|
+
// Complete a circuit/flow diagram
|
|
323
|
+
"true_false",
|
|
324
|
+
// True or False statement
|
|
325
|
+
"ordering"
|
|
326
|
+
// Arrange steps/phases in correct order
|
|
327
|
+
]);
|
|
328
|
+
var WorksheetItemSchema = zod.z.object({
|
|
329
|
+
itemNumber: zod.z.coerce.number().int().default(1),
|
|
330
|
+
itemType: WorksheetItemTypeEnum,
|
|
331
|
+
prompt: zod.z.string().describe("The question, fill-in stem, or task instruction"),
|
|
332
|
+
starterContent: zod.z.string().optional().describe(
|
|
333
|
+
"Pre-filled content: code with blanks, table skeleton, diagram description, or matching columns"
|
|
334
|
+
),
|
|
335
|
+
options: zod.z.array(zod.z.string()).optional().describe("Options for multiple_choice / true_false items"),
|
|
336
|
+
answerKey: zod.z.string().optional().describe("Expected answer for teacher use"),
|
|
337
|
+
checkpointRequired: zod.z.boolean().default(false).describe(
|
|
338
|
+
"If true, student must get teacher sign-off before proceeding"
|
|
339
|
+
)
|
|
340
|
+
});
|
|
341
|
+
var WorksheetPartSchema = zod.z.object({
|
|
342
|
+
partNumber: zod.z.coerce.number().int(),
|
|
343
|
+
partTitle: zod.z.string().describe('e.g. "Knowledge Check", "Guided Practice", "Concept Tracing", "Reflection"'),
|
|
344
|
+
objective: zod.z.string().optional().default(""),
|
|
345
|
+
items: zod.z.array(WorksheetItemSchema).min(1),
|
|
346
|
+
checkpointInstruction: zod.z.string().optional().describe(
|
|
347
|
+
'Instruction shown at the end of this part, e.g. "\u2610 Ho\xE0n th\xE0nh Part 1 \u2014 Xin gi\xE1o vi\xEAn ki\u1EC3m tra"'
|
|
348
|
+
)
|
|
349
|
+
});
|
|
350
|
+
var WorksheetSchema = zod.z.object({
|
|
351
|
+
artifactType: zod.z.literal("WKS").default("WKS"),
|
|
352
|
+
lessonId: zod.z.string(),
|
|
353
|
+
title: zod.z.string(),
|
|
354
|
+
language: zod.z.string().default("en"),
|
|
355
|
+
// Student header fields
|
|
356
|
+
studentName: zod.z.string().optional().default(""),
|
|
357
|
+
classLabel: zod.z.string().optional().default(""),
|
|
358
|
+
// Main content: array of Parts (Part 1: Knowledge Check, Part 2: Guided Practice, etc.)
|
|
359
|
+
parts: zod.z.array(WorksheetPartSchema).min(1),
|
|
360
|
+
// Reflection / Computational Thinking prompts (Part 3 in template, standalone)
|
|
361
|
+
reflectionPrompts: zod.z.array(zod.z.string()).default([])
|
|
362
|
+
});
|
|
363
|
+
var HandoutSectionSchema = zod.z.object({
|
|
364
|
+
heading: zod.z.string().describe("Short descriptive section heading (Max 3 levels)"),
|
|
365
|
+
summaryPoints: zod.z.array(zod.z.string()).describe("Scannable bullet points in second-person voice (You will...)"),
|
|
366
|
+
codeSnippet: zod.z.string().optional().describe("Essential copy-paste ready syntax or command"),
|
|
367
|
+
tableData: zod.z.object({
|
|
368
|
+
headers: zod.z.array(zod.z.string()),
|
|
369
|
+
rows: zod.z.array(zod.z.array(zod.z.string()))
|
|
370
|
+
}).optional().describe("Structured table for comparisons or hardware pinouts"),
|
|
371
|
+
calloutBox: zod.z.object({
|
|
372
|
+
type: zod.z.string().default("key_formula"),
|
|
373
|
+
title: zod.z.string(),
|
|
374
|
+
content: zod.z.string()
|
|
375
|
+
}).optional()
|
|
376
|
+
});
|
|
377
|
+
var HandoutSchema = zod.z.object({
|
|
378
|
+
artifactType: zod.z.literal("HANDOUT").default("HANDOUT"),
|
|
379
|
+
lessonId: zod.z.string().describe("Matching lesson identifier"),
|
|
380
|
+
title: zod.z.string().describe("Handout title"),
|
|
381
|
+
language: zod.z.string().default("vi").describe('Language code of the content, e.g. "vi" or "en"'),
|
|
382
|
+
tagline: zod.z.string().default("").describe("1-sentence core takeaway"),
|
|
383
|
+
// 1. Core Concepts Summary
|
|
384
|
+
coreConceptsSummary: zod.z.array(
|
|
385
|
+
zod.z.object({
|
|
386
|
+
concept: zod.z.string().describe("T\xEAn kh\xE1i ni\u1EC7m"),
|
|
387
|
+
definition: zod.z.string().describe("\u0110\u1ECBnh ngh\u0129a ng\u1EAFn g\u1ECDn, chu\u1EA9n 5-second")
|
|
388
|
+
})
|
|
389
|
+
).default([]),
|
|
390
|
+
// 2. Syntax & Configs Table
|
|
391
|
+
syntaxTable: zod.z.array(
|
|
392
|
+
zod.z.object({
|
|
393
|
+
syntax: zod.z.string().describe("C\xFA ph\xE1p l\u1EC7nh ho\u1EB7c t\xEAn Node/Config"),
|
|
394
|
+
meaning: zod.z.string().describe("\xDD ngh\u0129a & ch\u1EE9c n\u0103ng"),
|
|
395
|
+
example: zod.z.string().describe("V\xED d\u1EE5 code ho\u1EB7c c\u1EA5u h\xECnh m\u1EABu")
|
|
396
|
+
})
|
|
397
|
+
).default([]),
|
|
398
|
+
// 3. General 3-Step Problem Solving Procedure
|
|
399
|
+
problemSolvingProcedure: zod.z.object({
|
|
400
|
+
step1Trigger: zod.z.string().default("X\xE1c \u0111\u1ECBnh input/trigger k\xEDch ho\u1EA1t"),
|
|
401
|
+
step2Logic: zod.z.string().default("X\u1EED l\xFD logic, t\xEDnh to\xE1n ho\u1EB7c l\u1ECDc d\u1EEF li\u1EC7u"),
|
|
402
|
+
step3Output: zod.z.string().default("Xu\u1EA5t k\u1EBFt qu\u1EA3, c\u1EADp nh\u1EADt tr\u1EA1ng th\xE1i ho\u1EB7c g\u1EEDi c\u1EA3nh b\xE1o")
|
|
403
|
+
}).optional().default({
|
|
404
|
+
step1Trigger: "X\xE1c \u0111\u1ECBnh input/trigger k\xEDch ho\u1EA1t",
|
|
405
|
+
step2Logic: "X\u1EED l\xFD logic, t\xEDnh to\xE1n ho\u1EB7c l\u1ECDc d\u1EEF li\u1EC7u",
|
|
406
|
+
step3Output: "Xu\u1EA5t k\u1EBFt qu\u1EA3, c\u1EADp nh\u1EADt tr\u1EA1ng th\xE1i ho\u1EB7c g\u1EEDi c\u1EA3nh b\xE1o"
|
|
407
|
+
}),
|
|
408
|
+
// 4. Pro Tips
|
|
409
|
+
proTips: zod.z.array(zod.z.string()).default([]).describe("M\u1EB9o th\u1EF1c chi\u1EBFn h\u1EEFu \xEDch"),
|
|
410
|
+
// 5. Sections & Glossary (Backward Compatibility)
|
|
411
|
+
sections: zod.z.array(HandoutSectionSchema).default([]).describe("Scannable reference sections"),
|
|
412
|
+
glossary: zod.z.array(
|
|
413
|
+
zod.z.object({
|
|
414
|
+
term: zod.z.string().describe("Technical term or acronym"),
|
|
415
|
+
definition: zod.z.string().describe("Plain, jargon-free explanation")
|
|
416
|
+
})
|
|
417
|
+
).default([]).describe("Zero-jargon glossary of terms introduced in this lesson")
|
|
418
|
+
});
|
|
419
|
+
var MarpSlideSchema = zod.z.object({
|
|
420
|
+
slideNumber: zod.z.number().int().min(1).max(60),
|
|
421
|
+
slideType: zod.z.enum([
|
|
422
|
+
"title",
|
|
423
|
+
"agenda",
|
|
424
|
+
"review",
|
|
425
|
+
"hook",
|
|
426
|
+
"concept_def",
|
|
427
|
+
"concept_visual",
|
|
428
|
+
"concept_compare",
|
|
429
|
+
"concept_check",
|
|
430
|
+
"concept_recap",
|
|
431
|
+
"code_demo",
|
|
432
|
+
"guided_practice",
|
|
433
|
+
"activity_intro",
|
|
434
|
+
"activity_steps",
|
|
435
|
+
"checkpoint",
|
|
436
|
+
"exit_ticket",
|
|
437
|
+
"summary_next",
|
|
438
|
+
"custom"
|
|
439
|
+
]),
|
|
440
|
+
title: zod.z.string().describe("Slide title or headline"),
|
|
441
|
+
bloomTag: zod.z.enum(["Remember", "Understand", "Apply", "Analyze", "Evaluate", "Create", "None"]).default("None"),
|
|
442
|
+
bulletPoints: zod.z.array(zod.z.string()).max(6).describe("Concise bullet points, max 15 words each"),
|
|
443
|
+
codeSnippet: zod.z.string().optional().describe("Formatted fenced code block for demo"),
|
|
444
|
+
diagramMermaid: zod.z.string().optional().describe("Mermaid diagram definition for visual concepts"),
|
|
445
|
+
presenterNotes: zod.z.string().optional().describe("Teacher speaker notes hidden in presentation mode")
|
|
446
|
+
});
|
|
447
|
+
var SlideDeckSchema = zod.z.object({
|
|
448
|
+
artifactType: zod.z.literal("SLIDE").default("SLIDE"),
|
|
449
|
+
lessonId: zod.z.string().describe("Matching lesson identifier"),
|
|
450
|
+
title: zod.z.string().describe("Presentation title"),
|
|
451
|
+
language: zod.z.string().describe('Language code of the content, e.g. "vi" or "en"'),
|
|
452
|
+
marpTheme: zod.z.string().default("gaia"),
|
|
453
|
+
slides: zod.z.array(MarpSlideSchema).min(6).max(60).describe("Sequential Marp slides scaled dynamically by knowledge volume")
|
|
454
|
+
});
|
|
455
|
+
var TeachingScriptPhaseSchema = zod.z.object({
|
|
456
|
+
phase: zod.z.string().describe(
|
|
457
|
+
'Phase label from GUIDE template: "Hook / Engage" | "Explore / Core Concepts" | "Elaborate / Hands-on Activity" | "Evaluate / Wrap-up"'
|
|
458
|
+
),
|
|
459
|
+
durationRange: zod.z.string().describe('e.g. "5-10 minutes"'),
|
|
460
|
+
delivery: zod.z.string().describe("Real-world story, demo, analogy, or inquiry activity"),
|
|
461
|
+
keyPoints: zod.z.string().describe("What to emphasize; what to skip if running late"),
|
|
462
|
+
quickCheckQuestions: zod.z.array(zod.z.string()).default([]).describe("2-3 rapid comprehension check questions"),
|
|
463
|
+
classroomManagement: zod.z.string().optional().describe("Grouping, device management, seating"),
|
|
464
|
+
facilitation: zod.z.string().optional().describe("When to intervene vs. let students struggle productively"),
|
|
465
|
+
proTips: zod.z.string().optional().describe("Experience-based tips for this specific activity")
|
|
466
|
+
});
|
|
467
|
+
var MisconceptionSchema = zod.z.object({
|
|
468
|
+
misconception: zod.z.string().describe("What students often wrongly assume or confuse"),
|
|
469
|
+
counterStrategy: zod.z.string().describe("How the teacher should explain or demonstrate the truth")
|
|
470
|
+
});
|
|
471
|
+
var TroubleshootingEntrySchema = zod.z.object({
|
|
472
|
+
symptom: zod.z.string().describe("Error message or hardware failure symptom"),
|
|
473
|
+
rootCause: zod.z.string().describe("Why this occurs"),
|
|
474
|
+
solution: zod.z.string().describe("Exact step to fix it")
|
|
475
|
+
});
|
|
476
|
+
var ScoringRubricRowSchema = zod.z.object({
|
|
477
|
+
criteriaName: zod.z.string(),
|
|
478
|
+
meetsStandard: zod.z.string().describe("Description of acceptable student performance"),
|
|
479
|
+
exceedsStandard: zod.z.string().describe("Description of advanced mastery")
|
|
480
|
+
});
|
|
481
|
+
var TeacherGuideSchema = zod.z.object({
|
|
482
|
+
artifactType: zod.z.literal("GUIDE").default("GUIDE"),
|
|
483
|
+
lessonId: zod.z.string(),
|
|
484
|
+
title: zod.z.string(),
|
|
485
|
+
language: zod.z.string().default("en"),
|
|
486
|
+
// 1. Objectives & Preparation
|
|
487
|
+
pedagogicalRationale: zod.z.string().describe("The main instructional goal \u2014 mindset shift, not just knowledge"),
|
|
488
|
+
commonMisconceptions: zod.z.array(MisconceptionSchema).min(1),
|
|
489
|
+
technicalChecklist: zod.z.array(zod.z.string()).default([]).describe(
|
|
490
|
+
"Software/hardware to install; links to have open before class"
|
|
491
|
+
),
|
|
492
|
+
// 2. Teaching Script & Progression
|
|
493
|
+
teachingScript: zod.z.array(TeachingScriptPhaseSchema).min(1).describe(
|
|
494
|
+
"Ordered phases: Hook/Engage \u2192 Explore/Core Concepts \u2192 Elaborate/Hands-on \u2192 Evaluate/Wrap-up"
|
|
495
|
+
),
|
|
496
|
+
// 3. Troubleshooting & FAQs
|
|
497
|
+
troubleshootingGuide: zod.z.array(TroubleshootingEntrySchema).min(1),
|
|
498
|
+
// 4. Assessment & Differentiation
|
|
499
|
+
scoringRubric: zod.z.array(ScoringRubricRowSchema).default([]),
|
|
500
|
+
differentiationTips: zod.z.object({
|
|
501
|
+
proficient: zod.z.string().describe("Minimum threshold description for proficiency"),
|
|
502
|
+
advanced: zod.z.string().describe("Extension tasks / Peer mentoring opportunities"),
|
|
503
|
+
enrichmentQuestion: zod.z.string().optional().describe("1-2 deep-thinking questions for gifted students")
|
|
504
|
+
}).optional()
|
|
505
|
+
});
|
|
506
|
+
var ExtensionChallengeSchema = zod.z.object({
|
|
507
|
+
challengeNumber: zod.z.number().int().min(1),
|
|
508
|
+
title: zod.z.string().describe("Catchy title for the extension project"),
|
|
509
|
+
contextDescription: zod.z.string().describe("Novel real-world context for applying the skill"),
|
|
510
|
+
taskDescription: zod.z.string().describe("Specific goal and requirements of the challenge"),
|
|
511
|
+
expectedDeliverable: zod.z.string().describe("What the student produces (code, prototype, report)"),
|
|
512
|
+
hintOrGuidance: zod.z.string().optional().describe("Open-ended exploration prompt")
|
|
513
|
+
});
|
|
514
|
+
var ExtensionSchema = zod.z.object({
|
|
515
|
+
artifactType: zod.z.literal("EXT").default("EXT"),
|
|
516
|
+
lessonId: zod.z.string().describe("Matching lesson identifier"),
|
|
517
|
+
title: zod.z.string().describe("Extension title"),
|
|
518
|
+
language: zod.z.string().describe('Language code of the content, e.g. "vi" or "en"'),
|
|
519
|
+
coreLearningObjectivePreserved: zod.z.string().describe("The core LO that this challenge extends"),
|
|
520
|
+
challenges: zod.z.array(ExtensionChallengeSchema).min(2).describe("At least 2 diverse extension challenges")
|
|
521
|
+
});
|
|
522
|
+
var QualityAuditVerdictSchema = zod.z.enum(["PASS", "NEEDS_REVISION", "FAIL"]);
|
|
523
|
+
var JudgeCriterionSchema = zod.z.object({
|
|
524
|
+
name: zod.z.string().describe("Criterion name, e.g. Bloom Alignment, Code Validity, Word Count Gate, Language Adherence"),
|
|
525
|
+
passed: zod.z.boolean(),
|
|
526
|
+
score: zod.z.number().min(0).max(100).describe("Score out of 100"),
|
|
527
|
+
feedback: zod.z.string().describe("Constructive feedback or citation of issues")
|
|
528
|
+
});
|
|
529
|
+
var CurriculumQualityReportSchema = zod.z.object({
|
|
530
|
+
targetArtifactType: zod.z.string().describe("Type of artifact audited, e.g. LESSON, ACT, CODE, WKS, SLIDE"),
|
|
531
|
+
lessonId: zod.z.string(),
|
|
532
|
+
overallVerdict: QualityAuditVerdictSchema,
|
|
533
|
+
totalScore: zod.z.number().min(0).max(100),
|
|
534
|
+
languageAdherencePassed: zod.z.boolean().describe("True if content strictly matches the requested target language"),
|
|
535
|
+
criteria: zod.z.array(JudgeCriterionSchema).min(3),
|
|
536
|
+
actionableRepairPrompts: zod.z.array(zod.z.string()).default([]).describe("Concrete instruction prompts to fix detected issues in the next repair turn")
|
|
537
|
+
});
|
|
538
|
+
var ProjectProfileSchema = zod.z.object({
|
|
539
|
+
id: zod.z.string().optional(),
|
|
540
|
+
name: zod.z.string(),
|
|
541
|
+
version: zod.z.string().optional(),
|
|
542
|
+
purpose: zod.z.string().optional(),
|
|
543
|
+
project_type: zod.z.string().optional(),
|
|
544
|
+
platform: zod.z.array(zod.z.string()).optional().default([]),
|
|
545
|
+
tech_stack: zod.z.union([zod.z.record(zod.z.array(zod.z.string())), zod.z.array(zod.z.string()), zod.z.record(zod.z.string())]).optional().default([]),
|
|
546
|
+
architecture: zod.z.array(zod.z.string()).optional().default([]),
|
|
547
|
+
source: zod.z.object({
|
|
548
|
+
repository: zod.z.string().optional(),
|
|
549
|
+
commit: zod.z.string().optional(),
|
|
550
|
+
scan_dir: zod.z.string().optional()
|
|
551
|
+
}).optional()
|
|
552
|
+
});
|
|
553
|
+
var ProductGoalSchema = zod.z.object({
|
|
554
|
+
id: zod.z.string(),
|
|
555
|
+
description: zod.z.string()
|
|
556
|
+
});
|
|
557
|
+
var UserJourneySchema = zod.z.object({
|
|
558
|
+
id: zod.z.string(),
|
|
559
|
+
name: zod.z.string(),
|
|
560
|
+
steps: zod.z.array(zod.z.string()).optional().default([]),
|
|
561
|
+
requirement_ids: zod.z.array(zod.z.string()).optional().default([])
|
|
562
|
+
});
|
|
563
|
+
var ProjectGraphSchema = zod.z.object({
|
|
564
|
+
schema_version: zod.z.number().optional().default(3),
|
|
565
|
+
project: ProjectProfileSchema,
|
|
566
|
+
product: zod.z.object({
|
|
567
|
+
goals: zod.z.array(ProductGoalSchema).optional().default([]),
|
|
568
|
+
users: zod.z.array(zod.z.any()).optional().default([]),
|
|
569
|
+
journeys: zod.z.array(UserJourneySchema).optional().default([]),
|
|
570
|
+
requirements: zod.z.array(zod.z.any()).optional().default([])
|
|
571
|
+
}).optional().default({}),
|
|
572
|
+
features: zod.z.array(zod.z.object({
|
|
573
|
+
id: zod.z.string().optional(),
|
|
574
|
+
name: zod.z.string().optional(),
|
|
575
|
+
description: zod.z.string().optional(),
|
|
576
|
+
components: zod.z.array(zod.z.string()).optional().default([]),
|
|
577
|
+
requirements: zod.z.array(zod.z.any()).optional().default([])
|
|
578
|
+
})).optional().default([]),
|
|
579
|
+
capabilities: zod.z.array(zod.z.any()).optional().default([]),
|
|
580
|
+
architecture: zod.z.any().optional(),
|
|
581
|
+
experience: zod.z.any().optional(),
|
|
582
|
+
data_integration: zod.z.any().optional(),
|
|
583
|
+
implementation: zod.z.object({
|
|
584
|
+
files: zod.z.array(zod.z.any()).optional().default([]),
|
|
585
|
+
symbols: zod.z.array(zod.z.any()).optional().default([]),
|
|
586
|
+
modules: zod.z.array(zod.z.any()).optional().default([])
|
|
587
|
+
}).optional().default({}),
|
|
588
|
+
validation: zod.z.any().optional(),
|
|
589
|
+
evidence: zod.z.any().optional()
|
|
590
|
+
});
|
|
591
|
+
var InstructionStepSchema = zod.z.object({
|
|
592
|
+
stepNumber: zod.z.string().default("1.1").describe('e.g. "1.1", "1.2"'),
|
|
593
|
+
actionTitle: zod.z.string().describe('Action verb title, e.g. "Create Bonjour Discovery Browser"'),
|
|
594
|
+
explanation: zod.z.string().describe("Explanation of why this action is performed and how it works"),
|
|
595
|
+
targetFile: zod.z.string().optional().default("").describe('Relative path of the target file being created or edited, e.g. "Sources/WledLib/Discovery/BonjourBrowser.swift"'),
|
|
596
|
+
codeSnippet: zod.z.string().optional().default("").describe("Complete or focused code snippet following grow-by-step or snippet-per-step style"),
|
|
597
|
+
codeLanguage: zod.z.string().optional().default("swift").describe('Language for syntax highlighting, e.g. "swift", "typescript", "cpp", "bash"'),
|
|
598
|
+
tip: zod.z.string().optional().default("").describe("Helpful operational tip or best practice"),
|
|
599
|
+
warning: zod.z.string().optional().default("").describe("Operational gotcha or critical warning"),
|
|
600
|
+
expectedResult: zod.z.string().default("").describe("Explicit observable output or success condition after completing this step"),
|
|
601
|
+
imagePlaceholder: zod.z.string().optional().default("").describe("Description of visual screenshot or diagram placeholder [IMAGE: ...]")
|
|
602
|
+
});
|
|
603
|
+
var InstructionSectionSchema = zod.z.object({
|
|
604
|
+
sectionNumber: zod.z.coerce.number().default(1),
|
|
605
|
+
title: zod.z.string().describe("Section title"),
|
|
606
|
+
goal: zod.z.string().describe("What the reader achieves in this section"),
|
|
607
|
+
estimatedMinutes: zod.z.coerce.number().default(15),
|
|
608
|
+
preflightChecks: zod.z.array(zod.z.string()).default([]).describe("Commands or conditions to check before starting this section"),
|
|
609
|
+
steps: zod.z.array(InstructionStepSchema).min(1),
|
|
610
|
+
rollbackOrCleanup: zod.z.string().optional().default("").describe("How to undo or reset state if something fails")
|
|
611
|
+
});
|
|
612
|
+
var ProjectInstructionSchema = zod.z.object({
|
|
613
|
+
artifactType: zod.z.literal("INSTRUCTION").default("INSTRUCTION"),
|
|
614
|
+
instructionId: zod.z.string().describe('Milestone or instruction ID, e.g. "F0-S1"'),
|
|
615
|
+
title: zod.z.string().describe("Tutorial title"),
|
|
616
|
+
language: zod.z.string().describe('Target language code, e.g. "vi" or "en"'),
|
|
617
|
+
difficulty: zod.z.string().default("intermediate"),
|
|
618
|
+
estimatedTotalMinutes: zod.z.coerce.number().default(45).describe("Total estimated duration in minutes"),
|
|
619
|
+
scopeMode: zod.z.string().default("milestone"),
|
|
620
|
+
milestoneRef: zod.z.string().optional().default("").describe("Milestone code or ID"),
|
|
621
|
+
featureRef: zod.z.string().optional().default("").describe("Feature ID or name"),
|
|
622
|
+
techStack: zod.z.array(zod.z.string()).default([]).describe("List of tools, SDKs, libraries"),
|
|
623
|
+
prerequisites: zod.z.array(zod.z.string()).default([]).describe("Prerequisites assumed before starting"),
|
|
624
|
+
materialsAndTools: zod.z.array(zod.z.string()).default([]).describe("Required software, SDKs, accounts, or simulators"),
|
|
625
|
+
sections: zod.z.array(InstructionSectionSchema).min(1),
|
|
626
|
+
verificationChecklist: zod.z.array(zod.z.string()).default([]).describe("Final end-to-end verification checklist to confirm working implementation")
|
|
627
|
+
});
|
|
628
|
+
var ProgressiveHintsSchema = zod.z.object({
|
|
629
|
+
hint1Concept: zod.z.string().describe("Level 1: G\u1EE3i \xFD \u0111\u1ECBnh h\u01B0\u1EDBng t\u01B0 duy / kh\xE1i ni\u1EC7m c\u1ED1t l\xF5i"),
|
|
630
|
+
hint2Skeleton: zod.z.string().describe("Level 2: Khung s\u01B0\u1EDDn code / method signature m\u1EABu"),
|
|
631
|
+
hint3Solution: zod.z.object({
|
|
632
|
+
code: zod.z.string().describe("Level 3: L\u1EDDi gi\u1EA3i code ho\xE0n ch\u1EC9nh 100% runnable"),
|
|
633
|
+
explanation: zod.z.string().describe("Ph\xE2n t\xEDch t\u1EA1i sao gi\u1EA3i ph\xE1p n\xE0y t\u1ED1i \u01B0u v\xE0 x\u1EED l\xFD \u0111\u01B0\u1EE3c v\u1EA5n \u0111\u1EC1")
|
|
634
|
+
})
|
|
635
|
+
});
|
|
636
|
+
var SelfPacedChallengeSchema = zod.z.object({
|
|
637
|
+
tier: zod.z.enum(["bronze", "silver", "gold"]),
|
|
638
|
+
title: zod.z.string().describe("T\xEAn th\u1EED th\xE1ch"),
|
|
639
|
+
estimatedMinutes: zod.z.coerce.number().default(15),
|
|
640
|
+
objective: zod.z.string().describe("M\u1EE5c ti\xEAu c\u1EE5 th\u1EC3 c\u1EE7a th\u1EED th\xE1ch"),
|
|
641
|
+
tasks: zod.z.array(zod.z.string()).describe("Danh s\xE1ch nhi\u1EC7m v\u1EE5 t\u1EEBng b\u01B0\u1EDBc c\u1EA7n l\xE0m"),
|
|
642
|
+
verifyCommand: zod.z.string().describe("L\u1EC7nh terminal ho\u1EB7c test runner \u0111\u1EC3 t\u1EF1 ki\u1EC3m ch\u1EE9ng (VD: curl... ho\u1EB7c swift test)"),
|
|
643
|
+
expectedOutput: zod.z.string().describe("K\u1EBFt qu\u1EA3 mong \u0111\u1EE3i hi\u1EC3n th\u1ECB tr\xEAn terminal khi ch\u1EA1y \u0111\xFAng"),
|
|
644
|
+
hints: ProgressiveHintsSchema
|
|
645
|
+
});
|
|
646
|
+
var SelfLabSchema = zod.z.object({
|
|
647
|
+
artifactType: zod.z.literal("SELF_LAB").default("SELF_LAB"),
|
|
648
|
+
labId: zod.z.string().describe("Identifier matching milestone (e.g. F0-S1)"),
|
|
649
|
+
title: zod.z.string().describe("Lab title"),
|
|
650
|
+
language: zod.z.string().default("vi").describe('Language code of content, e.g. "vi" or "en"'),
|
|
651
|
+
difficulty: zod.z.enum(["beginner", "intermediate", "advanced"]).default("intermediate"),
|
|
652
|
+
estimatedTotalMinutes: zod.z.coerce.number().default(60),
|
|
653
|
+
techStack: zod.z.array(zod.z.string()).default([]),
|
|
654
|
+
// Mission Briefing & Preflight
|
|
655
|
+
missionBriefing: zod.z.string().describe("B\u1ED1i c\u1EA3nh k\u1ECBch b\u1EA3n v\xE0 nhi\u1EC7m v\u1EE5 c\u1EE7a b\xE0i lab"),
|
|
656
|
+
preflightChecklist: zod.z.array(zod.z.string()).default([]).describe("Danh m\u1EE5c ki\u1EC3m tra m\xF4i tr\u01B0\u1EDDng tr\u01B0\u1EDBc khi b\u1EAFt \u0111\u1EA7u"),
|
|
657
|
+
// 3 Progressive Challenges (Bronze -> Silver -> Gold)
|
|
658
|
+
challenges: zod.z.object({
|
|
659
|
+
bronze: SelfPacedChallengeSchema,
|
|
660
|
+
silver: SelfPacedChallengeSchema,
|
|
661
|
+
gold: SelfPacedChallengeSchema
|
|
662
|
+
}),
|
|
663
|
+
// Troubleshooting Matrix
|
|
664
|
+
troubleshootingMatrix: zod.z.array(
|
|
665
|
+
zod.z.object({
|
|
666
|
+
symptom: zod.z.string().describe("Tri\u1EC7u ch\u1EE9ng ho\u1EB7c th\xF4ng b\xE1o l\u1ED7i"),
|
|
667
|
+
rootCause: zod.z.string().describe("Nguy\xEAn nh\xE2n g\u1ED1c r\u1EC5"),
|
|
668
|
+
exactFix: zod.z.string().describe("H\u01B0\u1EDBng d\u1EABn s\u1EEDa l\u1ED7i ch\xEDnh x\xE1c t\u1EEBng b\u01B0\u1EDBc")
|
|
669
|
+
})
|
|
670
|
+
).default([]),
|
|
671
|
+
// Final Checklist
|
|
672
|
+
finalSubmissionChecklist: zod.z.array(zod.z.string()).default([]).describe("Danh m\u1EE5c ki\u1EC3m tra ho\xE0n th\xE0nh to\xE0n b\u1ED9 b\xE0i lab")
|
|
673
|
+
});
|
|
674
|
+
var AssessmentObjectiveSchema = zod.z.object({
|
|
675
|
+
aoCode: zod.z.string().describe('Assessment Objective code, e.g. "AO1"'),
|
|
676
|
+
alignedLO: zod.z.string().describe('Matched learning objective code, e.g. "LO1"'),
|
|
677
|
+
bloomLevel: zod.z.enum(["Remember", "Understand", "Apply", "Analyze", "Evaluate", "Create"]),
|
|
678
|
+
objective: zod.z.string().describe("Measurable assessment objective statement"),
|
|
679
|
+
/** Standards anchors: "statementId" or "packId:statementId" from adopted Framework Packs (Phase 1: optional). */
|
|
680
|
+
standardRefs: zod.z.array(zod.z.string()).optional().default([]).describe("Anchoring standard statement IDs from adopted Framework Packs")
|
|
681
|
+
});
|
|
682
|
+
var QuizOptionSchema = zod.z.object({
|
|
683
|
+
id: zod.z.string().describe('Option label: "A" | "B" | "C" | "D"'),
|
|
684
|
+
text: zod.z.string().describe("Full text of the option (may be a table row, code snippet, or sentence)"),
|
|
685
|
+
isCorrect: zod.z.boolean().describe("True if this option is the correct answer"),
|
|
686
|
+
explanation: zod.z.string().describe("Detailed distractor rationale or confirmation why this is correct/incorrect")
|
|
687
|
+
});
|
|
688
|
+
var DiagnosticQuestionSchema = zod.z.object({
|
|
689
|
+
id: zod.z.string().describe('Question ID, e.g. "Q1"'),
|
|
690
|
+
alignedAO: zod.z.string().optional().describe('Matched AO code(s), e.g. "AO1, AO2"'),
|
|
691
|
+
// Accept both PascalCase (new) and lowercase (legacy) for backward compat
|
|
692
|
+
bloomLevel: zod.z.enum([
|
|
693
|
+
"Remember",
|
|
694
|
+
"Understand",
|
|
695
|
+
"Apply",
|
|
696
|
+
"Analyze",
|
|
697
|
+
"Evaluate",
|
|
698
|
+
"Create",
|
|
699
|
+
"remember",
|
|
700
|
+
"understand",
|
|
701
|
+
"apply",
|
|
702
|
+
"analyze",
|
|
703
|
+
"evaluate",
|
|
704
|
+
"create"
|
|
705
|
+
]).default("Apply"),
|
|
706
|
+
questionType: zod.z.enum(["multiple_choice", "code_analysis", "matching", "open_ended"]).default("multiple_choice"),
|
|
707
|
+
// scenarioOrStem: PRIMARY field — kept for backward compat with evaluators & serializers
|
|
708
|
+
scenarioOrStem: zod.z.string().optional().describe("Legacy combined field. Evaluators read this for stem analysis."),
|
|
709
|
+
// scenario + stem: richer decomposition for new content (both optional)
|
|
710
|
+
scenario: zod.z.string().optional().describe("Real-world context framing the question"),
|
|
711
|
+
stem: zod.z.string().optional().describe("The core question prompt (new authoring standard)"),
|
|
712
|
+
codeSnippet: zod.z.string().optional().describe("Code block for code analysis questions"),
|
|
713
|
+
codeLanguage: zod.z.string().optional().default("cpp"),
|
|
714
|
+
options: zod.z.array(QuizOptionSchema).min(2).max(6),
|
|
715
|
+
// correctAnswer: optional for backward compat with old fixtures (legacy used isCorrect on options)
|
|
716
|
+
correctAnswer: zod.z.string().optional().describe('Correct option id, e.g. "A"'),
|
|
717
|
+
teacherNote: zod.z.string().optional().describe("Pedagogical note for assessor/teacher only"),
|
|
718
|
+
// takeawayMessage: backward-compat alias for teacherNote
|
|
719
|
+
takeawayMessage: zod.z.string().optional().describe("@deprecated \u2014 use teacherNote. Kept for serializer backward compat.")
|
|
720
|
+
});
|
|
721
|
+
var CompetencyRubricRowSchema = zod.z.object({
|
|
722
|
+
competencyDimension: zod.z.string().describe('Competency label with linked LO, e.g. "C1: Hardware Integration (LO1)"'),
|
|
723
|
+
developing: zod.z.string().describe("Level 1 \u2014 does not meet standard"),
|
|
724
|
+
proficient: zod.z.string().describe("Level 2 \u2014 meets standard"),
|
|
725
|
+
advanced: zod.z.string().describe("Level 3 \u2014 exceeds standard"),
|
|
726
|
+
exemplary: zod.z.string().describe("Level 4 \u2014 outstanding mastery")
|
|
727
|
+
});
|
|
728
|
+
var DiagnosticQuizSchema = zod.z.object({
|
|
729
|
+
artifactType: zod.z.literal("QUIZ"),
|
|
730
|
+
quizId: zod.z.string().describe('Matching artifact identifier, e.g. "QUIZ_U03_M01_L13"'),
|
|
731
|
+
title: zod.z.string(),
|
|
732
|
+
language: zod.z.string().default("en").describe('"en" or "vi"'),
|
|
733
|
+
totalQuestions: zod.z.coerce.number().optional().default(5),
|
|
734
|
+
timeAllocationMinutes: zod.z.coerce.number().optional().default(15),
|
|
735
|
+
passingScorePct: zod.z.coerce.number().default(80),
|
|
736
|
+
// Assessment Objectives table (## [REQUIRED] Assessment Objectives)
|
|
737
|
+
assessmentObjectives: zod.z.array(AssessmentObjectiveSchema).optional().default([]),
|
|
738
|
+
// Question bank (## [REQUIRED] Multiple-Choice + ## [REQUIRED] Code Analysis)
|
|
739
|
+
questions: zod.z.array(DiagnosticQuestionSchema).min(1),
|
|
740
|
+
// Competency Rubric (## [REQUIRED] Competency Rubric)
|
|
741
|
+
rubric: zod.z.array(CompetencyRubricRowSchema).optional().default([])
|
|
742
|
+
});
|
|
743
|
+
var SelfPacedBundleSchema = zod.z.object({
|
|
744
|
+
bundleId: zod.z.string().describe("Milestone identifier (e.g. F0-S1)"),
|
|
745
|
+
title: zod.z.string().describe("Bundle title"),
|
|
746
|
+
language: zod.z.string().default("vi"),
|
|
747
|
+
techStack: zod.z.array(zod.z.string()).default([]),
|
|
748
|
+
instruction: ProjectInstructionSchema.describe("Instructable Step-by-Step Blueprint"),
|
|
749
|
+
selfLab: SelfLabSchema.describe("Self-Paced Lab with Progressive Hints & Verification Commands"),
|
|
750
|
+
quiz: DiagnosticQuizSchema.describe("Diagnostic Quiz Kit with Comprehensive Feedback"),
|
|
751
|
+
cheatSheet: HandoutSchema.describe("5-Second Rule Reference & Syntax Cheat Sheet"),
|
|
752
|
+
codeLab: CodeLabSchema.optional().describe("Code Lab with Starter & Solution Code")
|
|
753
|
+
});
|
|
754
|
+
var RubricCriteriaSchema = zod.z.object({
|
|
755
|
+
criteriaName: zod.z.string().describe('Criteria label, e.g. "Circuitry" or "Code Correctness"'),
|
|
756
|
+
weightPercent: zod.z.coerce.number().int().min(1).max(100).describe("Relative weight as integer %"),
|
|
757
|
+
excellent: zod.z.string().describe("Level 4 \u2014 Excellent performance descriptor"),
|
|
758
|
+
proficient: zod.z.string().describe("Level 3 \u2014 Proficient performance descriptor"),
|
|
759
|
+
developing: zod.z.string().describe("Level 2 \u2014 Developing performance descriptor"),
|
|
760
|
+
beginning: zod.z.string().describe("Level 1 \u2014 Beginning performance descriptor")
|
|
761
|
+
});
|
|
762
|
+
var ExitTicketQuickItemSchema = zod.z.object({
|
|
763
|
+
question: zod.z.string(),
|
|
764
|
+
questionType: zod.z.enum(["multiple_choice", "true_false", "short_answer", "open_ended"]),
|
|
765
|
+
answerOrScoringGuide: zod.z.string().default("")
|
|
766
|
+
});
|
|
767
|
+
var RubricSchema = zod.z.object({
|
|
768
|
+
artifactType: zod.z.literal("RUBRIC").default("RUBRIC"),
|
|
769
|
+
lessonId: zod.z.string(),
|
|
770
|
+
title: zod.z.string(),
|
|
771
|
+
language: zod.z.string().default("en"),
|
|
772
|
+
// Assessment Overview
|
|
773
|
+
assessmentType: zod.z.enum(["Formative", "Summative", "Self-assessment", "Peer-review"]),
|
|
774
|
+
assessmentFormat: zod.z.enum([
|
|
775
|
+
"Short Exercise",
|
|
776
|
+
"Exit Ticket",
|
|
777
|
+
"Practical Product",
|
|
778
|
+
"Project Presentation"
|
|
779
|
+
]),
|
|
780
|
+
targetLOs: zod.z.array(zod.z.string()).describe('LO codes being assessed, e.g. ["LO1", "LO2"]'),
|
|
781
|
+
targetAudience: zod.z.enum(["Teachers", "Students"]).default("Teachers").describe(
|
|
782
|
+
'"Teachers" = technical/pedagogical language; "Students" = simple "I can..." language'
|
|
783
|
+
),
|
|
784
|
+
// Rubric Table (weights should sum to ~100)
|
|
785
|
+
criteria: zod.z.array(RubricCriteriaSchema).min(1),
|
|
786
|
+
// Optional quick exit ticket at end of session (≤3 items)
|
|
787
|
+
exitTicket: zod.z.array(ExitTicketQuickItemSchema).max(3).optional(),
|
|
788
|
+
// Student self-assessment checklist
|
|
789
|
+
selfAssessmentChecklist: zod.z.array(zod.z.string()).optional(),
|
|
790
|
+
selfAssessmentReflection: zod.z.string().optional().describe(
|
|
791
|
+
'Open-ended reflection prompt, e.g. "One thing I am most proud of is:"'
|
|
792
|
+
)
|
|
793
|
+
});
|
|
794
|
+
var ExitTicketRecallPromptSchema = zod.z.object({
|
|
795
|
+
question: zod.z.string().describe("Conceptual scenario or analogy comparison testing core mental model"),
|
|
796
|
+
answerAreaLabel: zod.z.string().default("Write 1-2 concise sentences")
|
|
797
|
+
});
|
|
798
|
+
var ExitTicketBugHuntSchema = zod.z.object({
|
|
799
|
+
codeSnippet: zod.z.string().describe("4-8 line realistic code snippet containing exactly 1 bug/missing annotation"),
|
|
800
|
+
codeLanguage: zod.z.string().default("swift"),
|
|
801
|
+
tasks: zod.z.array(zod.z.string()).describe(
|
|
802
|
+
'Ordered task list, e.g. ["Identify the Compiler/Runtime Error", "Write the corrected line"]'
|
|
803
|
+
),
|
|
804
|
+
expectedBugDescription: zod.z.string().describe("The exact error type/message students should identify"),
|
|
805
|
+
correctedLine: zod.z.string().describe("The single corrected line of code")
|
|
806
|
+
});
|
|
807
|
+
var ExitTicketMetacognitionSchema = zod.z.object({
|
|
808
|
+
options: zod.z.array(zod.z.object({
|
|
809
|
+
label: zod.z.string().describe('"\u{1F7E2} Green" | "\u{1F7E1} Yellow" | "\u{1F534} Red"'),
|
|
810
|
+
description: zod.z.string().describe('e.g. "I can build and explain to a peer without hints"')
|
|
811
|
+
})).default([
|
|
812
|
+
{ label: "\u{1F7E2} Green (Mastered)", description: "I can build and explain this concept to a peer without any hints." },
|
|
813
|
+
{ label: "\u{1F7E1} Yellow (Needs Practice)", description: "I understand the concept but got stuck on syntax or error messages." },
|
|
814
|
+
{ label: "\u{1F534} Red (Blocked)", description: "I need help understanding why this architecture is used." }
|
|
815
|
+
]),
|
|
816
|
+
lingeringQuestion: zod.z.string().default("What is one question you still have before leaving today's lab?")
|
|
817
|
+
});
|
|
818
|
+
var ExitTicketSchema = zod.z.object({
|
|
819
|
+
artifactType: zod.z.literal("EXIT_TICKET").default("EXIT_TICKET"),
|
|
820
|
+
lessonId: zod.z.string(),
|
|
821
|
+
title: zod.z.string(),
|
|
822
|
+
language: zod.z.string().default("en"),
|
|
823
|
+
estimatedMinutes: zod.z.coerce.number().default(7),
|
|
824
|
+
// Target Learning Objectives
|
|
825
|
+
targetLOs: zod.z.array(zod.z.object({
|
|
826
|
+
code: zod.z.string().describe('LO code, e.g. "ULO" or "LO1"'),
|
|
827
|
+
loType: zod.z.enum(["ULO", "CIO", "SIO"]).optional(),
|
|
828
|
+
description: zod.z.string()
|
|
829
|
+
})),
|
|
830
|
+
// Part 1: Recall & Conceptual Anchor
|
|
831
|
+
recallPrompt: ExitTicketRecallPromptSchema,
|
|
832
|
+
// Part 2: Application & Bug Hunt
|
|
833
|
+
applicationPrompt: ExitTicketBugHuntSchema,
|
|
834
|
+
// Part 3: Metacognitive Reflection
|
|
835
|
+
metacognition: ExitTicketMetacognitionSchema,
|
|
836
|
+
// Scoring & Intervention Trigger
|
|
837
|
+
scoringGuide: zod.z.object({
|
|
838
|
+
proficiencyThreshold: zod.z.string().describe('e.g. "Green/Yellow check + Correct Bug Hunt answer"'),
|
|
839
|
+
interventionProtocol: zod.z.string().describe('e.g. "If \u226525% Red, start next session with 5-min Live Debug Warm-up"')
|
|
840
|
+
})
|
|
841
|
+
});
|
|
842
|
+
var TierLevelEnum = zod.z.enum(["Bronze", "Silver", "Gold"]);
|
|
843
|
+
var TierObjectiveSchema = zod.z.object({
|
|
844
|
+
tier: TierLevelEnum,
|
|
845
|
+
bloomTarget: zod.z.string().describe('e.g. "Remember / Understand" | "Apply / Analyze" | "Evaluate / Create"'),
|
|
846
|
+
scaffoldingRatio: zod.z.string().describe('e.g. "70% Starter Code / 30% Fill-in"'),
|
|
847
|
+
successCriteria: zod.z.string().describe("Condition that determines tier completion")
|
|
848
|
+
});
|
|
849
|
+
var BronzeTierSchema = zod.z.object({
|
|
850
|
+
targetAudience: zod.z.string().default("All learners (mandatory milestone)"),
|
|
851
|
+
guidingPrompt: zod.z.string().describe("Clear instruction with references to Handout"),
|
|
852
|
+
starterCode: zod.z.string().default("").describe("Pre-filled boilerplate code with TODO placeholders"),
|
|
853
|
+
codeLanguage: zod.z.string().default("swift"),
|
|
854
|
+
fillInSlots: zod.z.array(zod.z.object({
|
|
855
|
+
todoLabel: zod.z.string().describe('e.g. "TODO 1 [Bronze]"'),
|
|
856
|
+
instruction: zod.z.string()
|
|
857
|
+
})).default([]),
|
|
858
|
+
verificationTest: zod.z.string().default("testBronzeBaseline()")
|
|
859
|
+
});
|
|
860
|
+
var SilverTierSchema = zod.z.object({
|
|
861
|
+
targetAudience: zod.z.string().default("Learners who completed Bronze without mentor intervention"),
|
|
862
|
+
guidingPrompt: zod.z.string(),
|
|
863
|
+
requirements: zod.z.array(zod.z.string()).min(1).describe("Numbered requirements: validation, state logic, user feedback"),
|
|
864
|
+
implementationTarget: zod.z.string().default("").describe("Skeleton or description of what to implement"),
|
|
865
|
+
codeLanguage: zod.z.string().default("swift"),
|
|
866
|
+
verificationTest: zod.z.string().default("testSilverLogicAndValidation()")
|
|
867
|
+
});
|
|
868
|
+
var GoldTierSchema = zod.z.object({
|
|
869
|
+
targetAudience: zod.z.string().default("Advanced learners finished ahead of schedule"),
|
|
870
|
+
architecturalChallenge: zod.z.string().describe("Open-ended architectural task"),
|
|
871
|
+
constraints: zod.z.array(zod.z.string()).min(1).describe('Hard invariants, e.g. "zero data-race under concurrent mutations"'),
|
|
872
|
+
verificationTest: zod.z.string().optional().default("testGoldConcurrencySafety()")
|
|
873
|
+
});
|
|
874
|
+
var MentorCheatsheetSchema = zod.z.object({
|
|
875
|
+
bronzeStumble: zod.z.string().default("").describe("Most common Bronze mistake"),
|
|
876
|
+
silverStumble: zod.z.string().default("").describe("Most common Silver mistake"),
|
|
877
|
+
goldDiscussionPrompt: zod.z.string().optional().describe("Scaling / architecture discussion question")
|
|
878
|
+
});
|
|
879
|
+
var TieredPracticeSchema = zod.z.object({
|
|
880
|
+
artifactType: zod.z.literal("TIERED_PRACTICE").default("TIERED_PRACTICE"),
|
|
881
|
+
lessonId: zod.z.string(),
|
|
882
|
+
title: zod.z.string(),
|
|
883
|
+
language: zod.z.string().default("en"),
|
|
884
|
+
// Tier matrix overview
|
|
885
|
+
tierMatrix: zod.z.array(TierObjectiveSchema).length(3).describe("One entry per tier: Bronze, Silver, Gold"),
|
|
886
|
+
// Tier content
|
|
887
|
+
bronze: BronzeTierSchema,
|
|
888
|
+
silver: SilverTierSchema,
|
|
889
|
+
gold: GoldTierSchema,
|
|
890
|
+
// Test suite reference
|
|
891
|
+
testSuiteClass: zod.z.string().optional().describe('XCTest class name, e.g. "AlarmSystemTestSuite"'),
|
|
892
|
+
// Mentor hints
|
|
893
|
+
mentorCheatsheet: MentorCheatsheetSchema.optional()
|
|
894
|
+
});
|
|
895
|
+
var BellRingerDaySchema = zod.z.object({
|
|
896
|
+
dayLabel: zod.z.string().describe('e.g. "Day 1 (Monday)" or "Day 1"'),
|
|
897
|
+
bloomLevel: zod.z.enum([
|
|
898
|
+
"Remember",
|
|
899
|
+
"Understand",
|
|
900
|
+
"Apply",
|
|
901
|
+
"Analyze",
|
|
902
|
+
"Evaluate",
|
|
903
|
+
"Create"
|
|
904
|
+
]).optional(),
|
|
905
|
+
promptType: zod.z.enum([
|
|
906
|
+
"mental_model_recall",
|
|
907
|
+
"code_tracing",
|
|
908
|
+
"bug_hunt",
|
|
909
|
+
"diagram_tracing",
|
|
910
|
+
"creative_synthesis",
|
|
911
|
+
"open_reflection"
|
|
912
|
+
]).default("open_reflection"),
|
|
913
|
+
prompt: zod.z.string().describe("The warm-up question or task shown on projector"),
|
|
914
|
+
codeSnippet: zod.z.string().optional().describe("Code to trace or debug"),
|
|
915
|
+
codeLanguage: zod.z.string().optional().default("cpp"),
|
|
916
|
+
answerKey: zod.z.string().optional().describe("Teacher-facing expected answer or rubric note")
|
|
917
|
+
});
|
|
918
|
+
var BellRingerSchema = zod.z.object({
|
|
919
|
+
artifactType: zod.z.literal("BELL_RINGER"),
|
|
920
|
+
lessonId: zod.z.string(),
|
|
921
|
+
title: zod.z.string(),
|
|
922
|
+
language: zod.z.string().optional().default("en"),
|
|
923
|
+
weeklyTheme: zod.z.string().describe("Core concept theme for the week"),
|
|
924
|
+
routineProtocol: zod.z.string().optional().default(
|
|
925
|
+
"Display prompt on projector as students enter. Students write in Daily Journal before class discussion."
|
|
926
|
+
),
|
|
927
|
+
days: zod.z.array(BellRingerDaySchema).min(1).max(7)
|
|
928
|
+
});
|
|
929
|
+
var GlossaryTermSchema = zod.z.object({
|
|
930
|
+
termName: zod.z.string().describe("Term in the target language"),
|
|
931
|
+
termNameEN: zod.z.string().optional().describe("English term (for code/docs reference)"),
|
|
932
|
+
bloomLevel: zod.z.enum(["Remember", "Understand", "Apply"]).optional(),
|
|
933
|
+
simpleDefinition: zod.z.string().describe("Max 2 sentences, age-appropriate, no jargon"),
|
|
934
|
+
memoryAnalogy: zod.z.string().describe('Analogy: "This term is like [familiar thing]..."'),
|
|
935
|
+
realWorldExample: zod.z.string().describe("1-3 line code snippet or 1-sentence real-world use case"),
|
|
936
|
+
codeLanguage: zod.z.string().optional().default(""),
|
|
937
|
+
commonMistake: zod.z.string().optional().describe("What students often confuse this with, and why"),
|
|
938
|
+
seeMore: zod.z.array(zod.z.string()).optional().default([]).describe("Related term names")
|
|
939
|
+
});
|
|
940
|
+
var GlossaryQuickRefRowSchema = zod.z.object({
|
|
941
|
+
termEN: zod.z.string(),
|
|
942
|
+
translation: zod.z.string().optional().default(""),
|
|
943
|
+
bloomLevel: zod.z.enum(["Remember", "Understand", "Apply"]).optional(),
|
|
944
|
+
mnemonicKeywords: zod.z.string().optional().default("")
|
|
945
|
+
});
|
|
946
|
+
var StandardizedTermRowSchema = zod.z.object({
|
|
947
|
+
technicalTerm: zod.z.string(),
|
|
948
|
+
note: zod.z.string(),
|
|
949
|
+
doNotUse: zod.z.string().optional().default("")
|
|
950
|
+
});
|
|
951
|
+
var GlossarySchema = zod.z.object({
|
|
952
|
+
artifactType: zod.z.literal("GLOSSARY"),
|
|
953
|
+
lessonId: zod.z.string(),
|
|
954
|
+
title: zod.z.string(),
|
|
955
|
+
language: zod.z.string().optional().default("en"),
|
|
956
|
+
terms: zod.z.array(GlossaryTermSchema).min(1).describe("Ordered from basic to advanced"),
|
|
957
|
+
quickReferenceTable: zod.z.array(GlossaryQuickRefRowSchema).optional().default([]),
|
|
958
|
+
standardizedTerms: zod.z.array(StandardizedTermRowSchema).optional().default([])
|
|
959
|
+
});
|
|
960
|
+
var ChoiceSquareSchema = zod.z.object({
|
|
961
|
+
squareNumber: zod.z.coerce.number().int().min(1).max(9),
|
|
962
|
+
squareLabel: zod.z.string().describe('e.g. "Square 1: The Bug Hunter"'),
|
|
963
|
+
category: zod.z.enum(["analytical", "visual_architecture", "creative_applied"]).optional(),
|
|
964
|
+
points: zod.z.coerce.number().int().default(30),
|
|
965
|
+
isCenterMaster: zod.z.boolean().default(false).describe("True for the mandatory center \u2B50 challenge"),
|
|
966
|
+
description: zod.z.string().describe("What the student must do"),
|
|
967
|
+
deliverable: zod.z.string().optional().describe('What to submit, e.g. "Pull Request diff + clean build"'),
|
|
968
|
+
acceptanceCriteria: zod.z.array(zod.z.string()).optional().default([]),
|
|
969
|
+
format: zod.z.string().optional().describe('Submission format, e.g. "Mermaid sequenceDiagram"')
|
|
970
|
+
});
|
|
971
|
+
var ChoiceRuleSchema = zod.z.object({
|
|
972
|
+
model: zod.z.enum(["tic_tac_toe", "point_balance", "custom"]).default("tic_tac_toe"),
|
|
973
|
+
description: zod.z.string().describe("How the student wins / completes the board"),
|
|
974
|
+
minimumPoints: zod.z.coerce.number().optional().describe("Minimum points for point_balance model"),
|
|
975
|
+
mandatoryCategories: zod.z.array(zod.z.string()).optional().default([])
|
|
976
|
+
});
|
|
977
|
+
var ChoiceBoardRubricRowSchema = zod.z.object({
|
|
978
|
+
criteriaName: zod.z.string(),
|
|
979
|
+
exemplary: zod.z.string(),
|
|
980
|
+
proficient: zod.z.string(),
|
|
981
|
+
developing: zod.z.string(),
|
|
982
|
+
beginning: zod.z.string()
|
|
983
|
+
});
|
|
984
|
+
var ChoiceBoardSchema = zod.z.object({
|
|
985
|
+
artifactType: zod.z.literal("CHOICE_BOARD"),
|
|
986
|
+
lessonId: zod.z.string(),
|
|
987
|
+
title: zod.z.string(),
|
|
988
|
+
language: zod.z.string().optional().default("en"),
|
|
989
|
+
coreConceptAnchor: zod.z.string().describe("All options must demonstrate mastery of this invariant"),
|
|
990
|
+
choiceRule: ChoiceRuleSchema,
|
|
991
|
+
squares: zod.z.array(ChoiceSquareSchema).min(1).max(9),
|
|
992
|
+
rubric: zod.z.array(ChoiceBoardRubricRowSchema).optional().default([])
|
|
993
|
+
});
|
|
994
|
+
var OrganizerTypeEnum = zod.z.enum([
|
|
995
|
+
"mermaid_flowchart",
|
|
996
|
+
// Architectural data flow (graph TD/LR)
|
|
997
|
+
"mermaid_sequence",
|
|
998
|
+
// Sequence / message flow diagram
|
|
999
|
+
"mermaid_state",
|
|
1000
|
+
// State machine / lifecycle diagram
|
|
1001
|
+
"mermaid_er",
|
|
1002
|
+
// Entity-relationship diagram
|
|
1003
|
+
"mermaid_class",
|
|
1004
|
+
// Class / OOP diagram
|
|
1005
|
+
"venn_comparison",
|
|
1006
|
+
// Comparative analysis (2+ sets)
|
|
1007
|
+
"fill_in_text",
|
|
1008
|
+
// ASCII/text fill-in exercise
|
|
1009
|
+
"concept_map"
|
|
1010
|
+
// Node-link concept map (freeform)
|
|
1011
|
+
]);
|
|
1012
|
+
var GraphicOrganizerItemSchema = zod.z.object({
|
|
1013
|
+
organizerNumber: zod.z.coerce.number().int(),
|
|
1014
|
+
organizerTitle: zod.z.string().describe('e.g. "Architectural Data Flow" or "State Machine & Lifecycle"'),
|
|
1015
|
+
organizerType: OrganizerTypeEnum,
|
|
1016
|
+
mermaidCode: zod.z.string().optional().describe("Raw Mermaid.js diagram definition"),
|
|
1017
|
+
fillInTemplate: zod.z.string().optional().describe("ASCII text fill-in box template"),
|
|
1018
|
+
wordBank: zod.z.array(zod.z.string()).optional().default([]).describe("Word bank for fill-in exercises"),
|
|
1019
|
+
cognitiveGoal: zod.z.string().optional().describe("Why this diagram helps (Paivio dual-coding, etc.)"),
|
|
1020
|
+
requiredLabels: zod.z.array(zod.z.string()).optional().default([]).describe("Items students must correctly label")
|
|
1021
|
+
});
|
|
1022
|
+
var GraphicOrganizerSchema = zod.z.object({
|
|
1023
|
+
artifactType: zod.z.literal("GRAPHIC_ORGANIZER"),
|
|
1024
|
+
lessonId: zod.z.string(),
|
|
1025
|
+
title: zod.z.string(),
|
|
1026
|
+
language: zod.z.string().optional().default("en"),
|
|
1027
|
+
cognitivePurpose: zod.z.string().optional().describe(
|
|
1028
|
+
'Cognitive design rationale, e.g. "Dual-coding theory: spatial + verbal processing"'
|
|
1029
|
+
),
|
|
1030
|
+
organizers: zod.z.array(GraphicOrganizerItemSchema).min(1)
|
|
1031
|
+
});
|
|
1032
|
+
var CERConclusionSchema = zod.z.object({
|
|
1033
|
+
claim: zod.z.string().describe("Direct 1-sentence answer to the driving question"),
|
|
1034
|
+
evidence: zod.z.string().describe("Specific quantitative data from the collection table"),
|
|
1035
|
+
reasoning: zod.z.string().describe("Connection between evidence and the technical principle")
|
|
1036
|
+
});
|
|
1037
|
+
var ExperimentalDesignSchema = zod.z.object({
|
|
1038
|
+
hypothesisTemplate: zod.z.string().describe(
|
|
1039
|
+
'"If [action], then [predicted outcome] because [rationale]."'
|
|
1040
|
+
),
|
|
1041
|
+
independentVariable: zod.z.string().describe("The variable being manipulated"),
|
|
1042
|
+
dependentVariable: zod.z.string().describe("The variable being measured"),
|
|
1043
|
+
controlVariables: zod.z.array(zod.z.string()).optional().default([]).describe("Constants held fixed")
|
|
1044
|
+
});
|
|
1045
|
+
var ScienceLabSchema = zod.z.object({
|
|
1046
|
+
artifactType: zod.z.literal("SCIENCE_LAB"),
|
|
1047
|
+
lessonId: zod.z.string(),
|
|
1048
|
+
title: zod.z.string(),
|
|
1049
|
+
language: zod.z.string().optional().default("en"),
|
|
1050
|
+
domain: zod.z.string().optional().describe('e.g. "Software Engineering / Concurrency"'),
|
|
1051
|
+
// Guiding Inquiry
|
|
1052
|
+
drivingQuestion: zod.z.string().describe("Real-world engineering driving question"),
|
|
1053
|
+
engineeringPhenomenon: zod.z.string().optional().describe("Observed phenomenon requiring explanation"),
|
|
1054
|
+
// Hypothesis & Experimental Design
|
|
1055
|
+
experimentalDesign: ExperimentalDesignSchema,
|
|
1056
|
+
// Data Collection
|
|
1057
|
+
labSetupCode: zod.z.string().optional().describe("Instrumentation / benchmark harness code"),
|
|
1058
|
+
labSetupCodeLanguage: zod.z.string().optional().default("cpp"),
|
|
1059
|
+
dataCollectionColumns: zod.z.array(zod.z.string()).optional().default([]).describe("Table column headers"),
|
|
1060
|
+
trialCount: zod.z.coerce.number().optional().default(4),
|
|
1061
|
+
// CER Conclusion
|
|
1062
|
+
cerTemplates: CERConclusionSchema.optional().describe("Pre-filled example or rubric for CER"),
|
|
1063
|
+
// Peer Review
|
|
1064
|
+
peerReviewProtocol: zod.z.string().optional().describe(
|
|
1065
|
+
"How groups exchange and verify each other's results"
|
|
1066
|
+
),
|
|
1067
|
+
reproducibilityTolerancePct: zod.z.coerce.number().optional().default(10)
|
|
1068
|
+
});
|
|
1069
|
+
var StationTypeEnum = zod.z.enum([
|
|
1070
|
+
"teacher_led",
|
|
1071
|
+
// Station 1: Small-group guided inquiry with teacher
|
|
1072
|
+
"pair_lab",
|
|
1073
|
+
// Station 2: Collaborative hands-on pair programming
|
|
1074
|
+
"digital_self_paced",
|
|
1075
|
+
// Station 3: Independent async code lab / LMS
|
|
1076
|
+
"offline_modeling",
|
|
1077
|
+
// Station 4: No-screen diagram / whiteboard activity
|
|
1078
|
+
"custom"
|
|
1079
|
+
]);
|
|
1080
|
+
var RotationStationSchema = zod.z.object({
|
|
1081
|
+
stationNumber: zod.z.coerce.number().int(),
|
|
1082
|
+
stationLabel: zod.z.string().describe('e.g. "Station 1: Teacher-Led (Guided Inquiry)"'),
|
|
1083
|
+
stationType: StationTypeEnum,
|
|
1084
|
+
goal: zod.z.string().describe("What students achieve at this station"),
|
|
1085
|
+
durationMinutes: zod.z.coerce.number().optional().default(15),
|
|
1086
|
+
teacherScriptOrInquiry: zod.z.string().optional().describe(
|
|
1087
|
+
"Teacher talking points or inquiry prompts (for teacher_led station)"
|
|
1088
|
+
),
|
|
1089
|
+
studentInstructions: zod.z.string().optional().describe("Step-by-step student task"),
|
|
1090
|
+
materials: zod.z.array(zod.z.string()).optional().default([]),
|
|
1091
|
+
successMilestone: zod.z.string().optional().describe("Observable completion criterion"),
|
|
1092
|
+
differentiationTrigger: zod.z.string().optional().describe("What to do if students struggle")
|
|
1093
|
+
});
|
|
1094
|
+
var StationRecordRowSchema = zod.z.object({
|
|
1095
|
+
stationNumber: zod.z.coerce.number().int(),
|
|
1096
|
+
taskCompleted: zod.z.string(),
|
|
1097
|
+
verificationMethod: zod.z.string().describe("Teacher stamp, peer signature, auto-token, etc."),
|
|
1098
|
+
keyInsightPrompt: zod.z.string().optional().default("What did you learn at this station?")
|
|
1099
|
+
});
|
|
1100
|
+
var StationRotationSchema = zod.z.object({
|
|
1101
|
+
artifactType: zod.z.literal("STATION_ROTATION"),
|
|
1102
|
+
lessonId: zod.z.string(),
|
|
1103
|
+
title: zod.z.string(),
|
|
1104
|
+
language: zod.z.string().optional().default("en"),
|
|
1105
|
+
totalDurationMinutes: zod.z.coerce.number().optional().default(60),
|
|
1106
|
+
rotationDurationMinutes: zod.z.coerce.number().optional().default(15),
|
|
1107
|
+
transitionBufferMinutes: zod.z.coerce.number().optional().default(2),
|
|
1108
|
+
groupSize: zod.z.string().optional().default("4-6 students"),
|
|
1109
|
+
groupingStrategy: zod.z.string().optional().default("Heterogeneous"),
|
|
1110
|
+
stations: zod.z.array(RotationStationSchema).min(2),
|
|
1111
|
+
recordingSheet: zod.z.array(StationRecordRowSchema).optional().default([])
|
|
1112
|
+
});
|
|
1113
|
+
var CardTierEnum = zod.z.enum(["bronze", "silver", "gold"]);
|
|
1114
|
+
var TaskCardSchema = zod.z.object({
|
|
1115
|
+
cardId: zod.z.string().describe('e.g. "CARD_01"'),
|
|
1116
|
+
cardNumber: zod.z.coerce.number().int(),
|
|
1117
|
+
setLabel: zod.z.string().optional().describe(
|
|
1118
|
+
'e.g. "Set A: Foundational Concepts" or "Set B: Code Diagnosis"'
|
|
1119
|
+
),
|
|
1120
|
+
tier: CardTierEnum.optional().default("bronze"),
|
|
1121
|
+
points: zod.z.coerce.number().int().optional().default(1),
|
|
1122
|
+
category: zod.z.string().optional().describe(
|
|
1123
|
+
'e.g. "Vocabulary", "Code Tracing", "Bug Hunt", "Architecture"'
|
|
1124
|
+
),
|
|
1125
|
+
prompt: zod.z.string().describe("The task / question printed on the card"),
|
|
1126
|
+
codeSnippet: zod.z.string().optional().describe("Code to trace or debug"),
|
|
1127
|
+
codeLanguage: zod.z.string().optional().default("cpp"),
|
|
1128
|
+
options: zod.z.array(zod.z.object({
|
|
1129
|
+
id: zod.z.string(),
|
|
1130
|
+
text: zod.z.string(),
|
|
1131
|
+
isCorrect: zod.z.boolean().optional()
|
|
1132
|
+
})).optional().default([]).describe("MCQ options (if applicable)"),
|
|
1133
|
+
hint: zod.z.string().optional().describe("Student-facing hint"),
|
|
1134
|
+
answerKey: zod.z.string().describe("Teacher-facing correct answer or solution blueprint"),
|
|
1135
|
+
answerPoints: zod.z.coerce.number().int().optional().default(1)
|
|
1136
|
+
});
|
|
1137
|
+
var TaskCardsSchema = zod.z.object({
|
|
1138
|
+
artifactType: zod.z.literal("TASK_CARDS"),
|
|
1139
|
+
lessonId: zod.z.string(),
|
|
1140
|
+
title: zod.z.string(),
|
|
1141
|
+
language: zod.z.string().optional().default("en"),
|
|
1142
|
+
targetSkills: zod.z.array(zod.z.string()).optional().default([]).describe(
|
|
1143
|
+
'e.g. ["Conceptual Understanding", "Code Tracing", "Bug Hunting"]'
|
|
1144
|
+
),
|
|
1145
|
+
cardFormat: zod.z.string().optional().default("4 cards per A4 page"),
|
|
1146
|
+
scoringSystem: zod.z.string().optional().default(
|
|
1147
|
+
"Bronze (1 pt), Silver (2 pts), Gold (3 pts)"
|
|
1148
|
+
),
|
|
1149
|
+
cards: zod.z.array(TaskCardSchema).min(1)
|
|
1150
|
+
});
|
|
1151
|
+
var ReviewGameQuestionSchema = zod.z.object({
|
|
1152
|
+
questionId: zod.z.string().optional(),
|
|
1153
|
+
round: zod.z.coerce.number().int().min(1).max(3).describe("1=Speed, 2=Code Duel, 3=Final Boss"),
|
|
1154
|
+
points: zod.z.coerce.number().int(),
|
|
1155
|
+
category: zod.z.string().optional().describe('e.g. "Vocabulary & Syntax", "Mental Model"'),
|
|
1156
|
+
prompt: zod.z.string().describe("The question or challenge shown to teams"),
|
|
1157
|
+
codeSnippet: zod.z.string().optional(),
|
|
1158
|
+
codeLanguage: zod.z.string().optional().default(""),
|
|
1159
|
+
options: zod.z.array(zod.z.object({
|
|
1160
|
+
id: zod.z.string(),
|
|
1161
|
+
text: zod.z.string(),
|
|
1162
|
+
isCorrect: zod.z.boolean().optional()
|
|
1163
|
+
})).optional().default([]).describe("MCQ options for Round 1"),
|
|
1164
|
+
answerOrExplanation: zod.z.string().describe("Correct answer or winning explanation"),
|
|
1165
|
+
timeLimit: zod.z.coerce.number().optional().default(20).describe("Seconds"),
|
|
1166
|
+
bonusMechanic: zod.z.string().optional().describe('e.g. "Teams can wager points"')
|
|
1167
|
+
});
|
|
1168
|
+
var ReviewGameExportRowSchema = zod.z.object({
|
|
1169
|
+
question: zod.z.string(),
|
|
1170
|
+
option1: zod.z.string(),
|
|
1171
|
+
option2: zod.z.string(),
|
|
1172
|
+
option3: zod.z.string().optional().default(""),
|
|
1173
|
+
option4: zod.z.string().optional().default(""),
|
|
1174
|
+
correctAnswer: zod.z.coerce.number().int().min(1).max(4).describe("1-indexed correct option"),
|
|
1175
|
+
timeLimitSec: zod.z.coerce.number().optional().default(20)
|
|
1176
|
+
});
|
|
1177
|
+
var ReviewGameSchema = zod.z.object({
|
|
1178
|
+
artifactType: zod.z.literal("REVIEW_GAME"),
|
|
1179
|
+
lessonId: zod.z.string(),
|
|
1180
|
+
title: zod.z.string(),
|
|
1181
|
+
language: zod.z.string().optional().default("en"),
|
|
1182
|
+
// Setup
|
|
1183
|
+
format: zod.z.string().optional().default("3 rounds, progressive difficulty, team buzzers"),
|
|
1184
|
+
teamSize: zod.z.string().optional().default("3-5 students"),
|
|
1185
|
+
hasBonusWager: zod.z.boolean().optional().default(true).describe("Teams can wager points on Round 3"),
|
|
1186
|
+
// Questions per round
|
|
1187
|
+
questions: zod.z.array(ReviewGameQuestionSchema).min(1),
|
|
1188
|
+
// Export-ready format for Kahoot / Quizizz
|
|
1189
|
+
exportRows: zod.z.array(ReviewGameExportRowSchema).optional().default([])
|
|
1190
|
+
});
|
|
1191
|
+
var PrerequisiteDecisionSchema = zod.z.enum([
|
|
1192
|
+
"mastered_before_course",
|
|
1193
|
+
// entry-level knowledge — referenced, not taught
|
|
1194
|
+
"taught_in_prior_lesson",
|
|
1195
|
+
// formally taught in an earlier session
|
|
1196
|
+
"recap_in_lesson",
|
|
1197
|
+
// re-activated at the start of this session
|
|
1198
|
+
"jit_introduce_in_lesson",
|
|
1199
|
+
// introduced just-in-time inside this session
|
|
1200
|
+
"scaffolded_provide"
|
|
1201
|
+
// not taught — supplied ready-made (scaffold)
|
|
1202
|
+
]);
|
|
1203
|
+
var ScaffoldDecisionSchema = zod.z.enum([
|
|
1204
|
+
"student_builds",
|
|
1205
|
+
"provide_partial",
|
|
1206
|
+
"provide_full",
|
|
1207
|
+
"provide_reference"
|
|
1208
|
+
]);
|
|
1209
|
+
var DepthLevelSchema = zod.z.enum(["ulo", "cio", "sio"]);
|
|
1210
|
+
var BloomLevelSchema = zod.z.enum([
|
|
1211
|
+
"Remember",
|
|
1212
|
+
"Understand",
|
|
1213
|
+
"Apply",
|
|
1214
|
+
"Analyze",
|
|
1215
|
+
"Evaluate",
|
|
1216
|
+
"Create"
|
|
1217
|
+
]);
|
|
1218
|
+
var EntryLevelSchema = zod.z.enum(["beginner", "intermediate", "advanced"]);
|
|
1219
|
+
var NodeKindSchema = zod.z.enum(["skill", "concept", "product_step"]);
|
|
1220
|
+
var LessonCodeSchema = zod.z.string().regex(/^U\d{2}_M\d{2}_L\d{2}$/, "lesson code must match UXX_MYY_LZZ");
|
|
1221
|
+
var SourceCiteSchema = zod.z.object({
|
|
1222
|
+
node_ids: zod.z.array(zod.z.string()).default([]),
|
|
1223
|
+
concept_codes: zod.z.array(zod.z.string()).default([])
|
|
1224
|
+
});
|
|
1225
|
+
var CourseObjectiveSchema = zod.z.object({
|
|
1226
|
+
id: zod.z.string(),
|
|
1227
|
+
statement: zod.z.string().min(8),
|
|
1228
|
+
bloom: BloomLevelSchema,
|
|
1229
|
+
sources: SourceCiteSchema
|
|
1230
|
+
});
|
|
1231
|
+
var UnitPlanSchema = zod.z.object({
|
|
1232
|
+
id: zod.z.string().regex(/^U\d{2}$/),
|
|
1233
|
+
name: zod.z.string().min(3),
|
|
1234
|
+
objectives: zod.z.array(CourseObjectiveSchema).min(1),
|
|
1235
|
+
node_ids: zod.z.array(zod.z.string()).min(1),
|
|
1236
|
+
total_minutes: zod.z.number().int().positive(),
|
|
1237
|
+
rationale: zod.z.string().min(3),
|
|
1238
|
+
// Phases fully contained in this unit (empty for non-phase plans)
|
|
1239
|
+
phase_ids: zod.z.array(zod.z.string()).default([]),
|
|
1240
|
+
// Product completion description carried from the domain analysis (optional)
|
|
1241
|
+
product_completion: zod.z.string().default("")
|
|
1242
|
+
});
|
|
1243
|
+
var DepthAssignmentSchema = zod.z.object({
|
|
1244
|
+
node_id: zod.z.string(),
|
|
1245
|
+
depth: DepthLevelSchema,
|
|
1246
|
+
source: zod.z.enum(["feed_hint", "planner", "escalated"])
|
|
1247
|
+
});
|
|
1248
|
+
var PrerequisiteDecisionEntrySchema = zod.z.object({
|
|
1249
|
+
node_id: zod.z.string(),
|
|
1250
|
+
decision: PrerequisiteDecisionSchema,
|
|
1251
|
+
reason: zod.z.string().min(3)
|
|
1252
|
+
});
|
|
1253
|
+
var ScaffoldDecisionEntrySchema = zod.z.object({
|
|
1254
|
+
item: zod.z.string().min(1),
|
|
1255
|
+
decision: ScaffoldDecisionSchema,
|
|
1256
|
+
minutes_saved: zod.z.number().int().nonnegative().default(0),
|
|
1257
|
+
reason: zod.z.string().min(3)
|
|
1258
|
+
});
|
|
1259
|
+
var SessionPlanSchema = zod.z.object({
|
|
1260
|
+
id: LessonCodeSchema,
|
|
1261
|
+
unit_id: zod.z.string().regex(/^U\d{2}$/),
|
|
1262
|
+
order: zod.z.number().int().positive(),
|
|
1263
|
+
title: zod.z.string().min(3),
|
|
1264
|
+
// [4] Free-text session objective — no ULO/CIO/SIO mapping at this stage.
|
|
1265
|
+
prose_objective: zod.z.string().min(10),
|
|
1266
|
+
node_ids: zod.z.array(zod.z.string()).min(1),
|
|
1267
|
+
// Development phases this session contributes to (empty when the feed has no phases)
|
|
1268
|
+
phase_ids: zod.z.array(zod.z.string()).default([]),
|
|
1269
|
+
new_keywords: zod.z.array(zod.z.string()).default([]),
|
|
1270
|
+
prerequisite_keywords: zod.z.array(zod.z.string()).default([]),
|
|
1271
|
+
knowledge_minutes: zod.z.number().int().nonnegative(),
|
|
1272
|
+
practice_minutes: zod.z.number().int().nonnegative(),
|
|
1273
|
+
overhead_minutes: zod.z.number().int().nonnegative(),
|
|
1274
|
+
depth_assignments: zod.z.array(DepthAssignmentSchema).min(1),
|
|
1275
|
+
prerequisite_decisions: zod.z.array(PrerequisiteDecisionEntrySchema).default([]),
|
|
1276
|
+
scaffold_decisions: zod.z.array(ScaffoldDecisionEntrySchema).default([]),
|
|
1277
|
+
// What the student can demonstrate after this session — feeds exit tickets.
|
|
1278
|
+
exit_evidence: zod.z.array(zod.z.string()).min(1),
|
|
1279
|
+
differentiation: zod.z.object({ bronze: zod.z.string(), silver: zod.z.string(), gold: zod.z.string() })
|
|
1280
|
+
});
|
|
1281
|
+
var TranslationPolicySchema = zod.z.object({
|
|
1282
|
+
policy: zod.z.enum(["after_artifact", "end_of_unit", "at_publish"]).default("at_publish"),
|
|
1283
|
+
target_language: zod.z.string().nullable().default(null)
|
|
1284
|
+
});
|
|
1285
|
+
var CoverageReportSchema = zod.z.object({
|
|
1286
|
+
assigned_node_ids: zod.z.array(zod.z.string()),
|
|
1287
|
+
unassigned_node_ids: zod.z.array(zod.z.string()),
|
|
1288
|
+
warnings: zod.z.array(zod.z.string())
|
|
1289
|
+
});
|
|
1290
|
+
var PlanConstraintsSchema = zod.z.object({
|
|
1291
|
+
age_band: zod.z.tuple([zod.z.number().int(), zod.z.number().int()]),
|
|
1292
|
+
entry_level: EntryLevelSchema,
|
|
1293
|
+
session_duration_minutes: zod.z.number().int().positive(),
|
|
1294
|
+
// Overhead (setup/recap/wrap-up) share of a session, 0..0.5.
|
|
1295
|
+
overhead_ratio: zod.z.number().min(0).max(0.5).default(0.15),
|
|
1296
|
+
total_sessions: zod.z.number().int().positive().nullable().default(null),
|
|
1297
|
+
// Keywords the entry level already masters (drives mastered_before_course).
|
|
1298
|
+
entry_keywords: zod.z.array(zod.z.string()).default([]),
|
|
1299
|
+
course_goals: zod.z.array(zod.z.string()).default([]),
|
|
1300
|
+
capstone: zod.z.string().nullable().default(null)
|
|
1301
|
+
});
|
|
1302
|
+
var CurriculumPlanSchema = zod.z.object({
|
|
1303
|
+
schema_version: zod.z.literal(1),
|
|
1304
|
+
plan_id: zod.z.string(),
|
|
1305
|
+
plan_hash: zod.z.string(),
|
|
1306
|
+
created_at: zod.z.string(),
|
|
1307
|
+
source: zod.z.object({
|
|
1308
|
+
graph_type: zod.z.enum(["curriculum_feed", "project_graph", "knowledge_graph", "hybrid_graph"]),
|
|
1309
|
+
feed_schema_version: zod.z.number().nullable().default(null),
|
|
1310
|
+
warnings: zod.z.array(zod.z.string()).default([]),
|
|
1311
|
+
hallucination_count: zod.z.number().int().nonnegative().default(0)
|
|
1312
|
+
}),
|
|
1313
|
+
constraints: PlanConstraintsSchema,
|
|
1314
|
+
course: zod.z.object({
|
|
1315
|
+
// [1] Course-level objectives, each citing source nodes (anti-fabrication)
|
|
1316
|
+
objectives: zod.z.array(CourseObjectiveSchema).min(1),
|
|
1317
|
+
capstone_ref: zod.z.string().nullable().default(null)
|
|
1318
|
+
}),
|
|
1319
|
+
units: zod.z.array(UnitPlanSchema).min(1),
|
|
1320
|
+
// [2]
|
|
1321
|
+
sessions: zod.z.array(SessionPlanSchema).min(1),
|
|
1322
|
+
// [3][4][5][6]
|
|
1323
|
+
glossary_scope: zod.z.array(zod.z.object({
|
|
1324
|
+
session_id: LessonCodeSchema,
|
|
1325
|
+
terms: zod.z.array(zod.z.string())
|
|
1326
|
+
})),
|
|
1327
|
+
translation: TranslationPolicySchema,
|
|
1328
|
+
coverage_report: CoverageReportSchema,
|
|
1329
|
+
approval: zod.z.object({
|
|
1330
|
+
status: zod.z.enum(["draft", "approved"]),
|
|
1331
|
+
approved_at: zod.z.string().nullable().default(null),
|
|
1332
|
+
// Hash of the plan payload the approval covers — invalidation key for EXPOSITION.
|
|
1333
|
+
plan_hash: zod.z.string().nullable().default(null)
|
|
1334
|
+
})
|
|
1335
|
+
});
|
|
1336
|
+
var PlanningNodeSchema = zod.z.object({
|
|
1337
|
+
id: zod.z.string(),
|
|
1338
|
+
kind: NodeKindSchema,
|
|
1339
|
+
name: zod.z.string().min(1),
|
|
1340
|
+
concept_codes: zod.z.array(zod.z.string()).default([]),
|
|
1341
|
+
keywords: zod.z.array(zod.z.string()).default([]),
|
|
1342
|
+
new_keywords: zod.z.array(zod.z.string()).default([]),
|
|
1343
|
+
prerequisite_keywords: zod.z.array(zod.z.string()).default([]),
|
|
1344
|
+
estimated_minutes: zod.z.number().int().nonnegative(),
|
|
1345
|
+
bloom_hint: BloomLevelSchema.nullable().default(null),
|
|
1346
|
+
depth_hint: DepthLevelSchema.nullable().default(null),
|
|
1347
|
+
completion_level: zod.z.enum(["mvp", "standard", "stretch"]).default("standard"),
|
|
1348
|
+
scaffold_candidates: zod.z.array(zod.z.object({
|
|
1349
|
+
item: zod.z.string(),
|
|
1350
|
+
reason: zod.z.string().default(""),
|
|
1351
|
+
minutes_saved: zod.z.number().int().nonnegative().default(0),
|
|
1352
|
+
suggest: ScaffoldDecisionSchema.default("provide_full")
|
|
1353
|
+
})).default([]),
|
|
1354
|
+
references: zod.z.array(zod.z.object({
|
|
1355
|
+
file: zod.z.string(),
|
|
1356
|
+
evidence: zod.z.string().default("")
|
|
1357
|
+
})).default([]),
|
|
1358
|
+
phase_id: zod.z.string().default("")
|
|
1359
|
+
});
|
|
1360
|
+
var DependencyEdgeSchema = zod.z.object({
|
|
1361
|
+
from: zod.z.string(),
|
|
1362
|
+
to: zod.z.string(),
|
|
1363
|
+
kind: zod.z.enum(["knowledge", "task"]),
|
|
1364
|
+
reason: zod.z.string().default("")
|
|
1365
|
+
});
|
|
1366
|
+
var PlanningGraphSchema = zod.z.object({
|
|
1367
|
+
graph_type: zod.z.enum(["curriculum_feed", "project_graph", "knowledge_graph", "hybrid_graph"]),
|
|
1368
|
+
warnings: zod.z.array(zod.z.string()).default([]),
|
|
1369
|
+
hallucination_count: zod.z.number().int().nonnegative().default(0),
|
|
1370
|
+
nodes: zod.z.array(PlanningNodeSchema).min(1, "planning graph must contain at least one node"),
|
|
1371
|
+
edges: zod.z.array(DependencyEdgeSchema).default([]),
|
|
1372
|
+
groupings: zod.z.array(zod.z.object({
|
|
1373
|
+
id: zod.z.string(),
|
|
1374
|
+
name: zod.z.string(),
|
|
1375
|
+
node_ids: zod.z.array(zod.z.string()).min(1),
|
|
1376
|
+
rationale: zod.z.string().default("")
|
|
1377
|
+
})).default([]),
|
|
1378
|
+
// Progressive completion phases (from CurriculumFeed.phases). When non-empty
|
|
1379
|
+
// they define units and the teaching sequence; groupings stay informational.
|
|
1380
|
+
phases: zod.z.array(zod.z.object({
|
|
1381
|
+
id: zod.z.string(),
|
|
1382
|
+
order: zod.z.number().int().positive(),
|
|
1383
|
+
name: zod.z.string(),
|
|
1384
|
+
product_completion: zod.z.string().default(""),
|
|
1385
|
+
node_ids: zod.z.array(zod.z.string()).min(1)
|
|
1386
|
+
})).default([])
|
|
1387
|
+
});
|
|
1388
|
+
var PlannerInputSchema = zod.z.object({
|
|
1389
|
+
graph: zod.z.unknown(),
|
|
1390
|
+
constraints: PlanConstraintsSchema,
|
|
1391
|
+
translation: TranslationPolicySchema.default({ policy: "at_publish", target_language: null })
|
|
1392
|
+
});
|
|
1393
|
+
function validateCurriculumPlan(plan) {
|
|
1394
|
+
const parsed = CurriculumPlanSchema.parse(plan);
|
|
1395
|
+
for (const s of parsed.sessions) {
|
|
1396
|
+
const total = s.knowledge_minutes + s.practice_minutes + s.overhead_minutes;
|
|
1397
|
+
if (total > parsed.constraints.session_duration_minutes) {
|
|
1398
|
+
throw new Error(
|
|
1399
|
+
"Session " + s.id + " budget violated: " + total + " > " + parsed.constraints.session_duration_minutes + " minutes"
|
|
1400
|
+
);
|
|
1401
|
+
}
|
|
1402
|
+
}
|
|
1403
|
+
return parsed;
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
// src/schemas/index.ts
|
|
1407
|
+
var CurriculumArtifactSchema = zod.z.discriminatedUnion("artifactType", [
|
|
1408
|
+
// ─── Lesson variants ───────────────────────────────────────────
|
|
1409
|
+
LessonPlanSchema,
|
|
1410
|
+
// 'LESSON' — legacy (deprecated)
|
|
1411
|
+
LessonPlanEDPSchema,
|
|
1412
|
+
// 'LESSON_EDP' — Engineering Design Process
|
|
1413
|
+
LessonPlan5ESchema,
|
|
1414
|
+
// 'LESSON_5E' — 5E Instructional Model
|
|
1415
|
+
// ─── Activity & Practice ───────────────────────────────────────
|
|
1416
|
+
ActivityLabSchema,
|
|
1417
|
+
// 'ACT'
|
|
1418
|
+
TieredPracticeSchema,
|
|
1419
|
+
// 'TIERED_PRACTICE'
|
|
1420
|
+
BellRingerSchema,
|
|
1421
|
+
// 'BELL_RINGER'
|
|
1422
|
+
ChoiceBoardSchema,
|
|
1423
|
+
// 'CHOICE_BOARD'
|
|
1424
|
+
// ─── Code ─────────────────────────────────────────────────────
|
|
1425
|
+
CodeLabSchema,
|
|
1426
|
+
// 'CODE'
|
|
1427
|
+
// ─── Assessment ───────────────────────────────────────────────
|
|
1428
|
+
DiagnosticQuizSchema,
|
|
1429
|
+
// 'QUIZ'
|
|
1430
|
+
RubricSchema,
|
|
1431
|
+
// 'RUBRIC'
|
|
1432
|
+
ExitTicketSchema,
|
|
1433
|
+
// 'EXIT_TICKET'
|
|
1434
|
+
// ─── Student-facing resources ──────────────────────────────────
|
|
1435
|
+
WorksheetSchema,
|
|
1436
|
+
// 'WKS'
|
|
1437
|
+
HandoutSchema,
|
|
1438
|
+
// 'HANDOUT'
|
|
1439
|
+
SlideDeckSchema,
|
|
1440
|
+
// 'SLIDE'
|
|
1441
|
+
TeacherGuideSchema,
|
|
1442
|
+
// 'GUIDE'
|
|
1443
|
+
ExtensionSchema,
|
|
1444
|
+
// 'EXT'
|
|
1445
|
+
GlossarySchema,
|
|
1446
|
+
// 'GLOSSARY'
|
|
1447
|
+
GraphicOrganizerSchema,
|
|
1448
|
+
// 'GRAPHIC_ORGANIZER'
|
|
1449
|
+
ScienceLabSchema,
|
|
1450
|
+
// 'SCIENCE_LAB'
|
|
1451
|
+
StationRotationSchema,
|
|
1452
|
+
// 'STATION_ROTATION'
|
|
1453
|
+
TaskCardsSchema,
|
|
1454
|
+
// 'TASK_CARDS'
|
|
1455
|
+
ReviewGameSchema
|
|
1456
|
+
// 'REVIEW_GAME'
|
|
1457
|
+
]);
|
|
1458
|
+
var LearningObjectiveInputSchema = zod.z.object({
|
|
1459
|
+
code: zod.z.string(),
|
|
1460
|
+
name: zod.z.string(),
|
|
1461
|
+
description: zod.z.string().optional().default(""),
|
|
1462
|
+
lo_type: zod.z.enum(["UNIVERSAL", "CONCEPTUAL_IMPL", "SPECIFIC_IMPL", "ULO", "CIO", "SIO"]).or(zod.z.string()),
|
|
1463
|
+
bloom_level: zod.z.string().optional().default("understand"),
|
|
1464
|
+
knowledge_dimension: zod.z.string().optional().default("CONCEPTUAL"),
|
|
1465
|
+
assessment: zod.z.string().optional().default("concept-check"),
|
|
1466
|
+
keyword: zod.z.string().optional().default(""),
|
|
1467
|
+
concept: zod.z.string().optional().default(""),
|
|
1468
|
+
concept_code: zod.z.string().optional().default(""),
|
|
1469
|
+
concept_name: zod.z.string().optional().default("")
|
|
1470
|
+
});
|
|
1471
|
+
var MilestoneInputSchema = zod.z.object({
|
|
1472
|
+
id: zod.z.string().optional(),
|
|
1473
|
+
name: zod.z.string(),
|
|
1474
|
+
description: zod.z.string().optional().default(""),
|
|
1475
|
+
feature_id: zod.z.string().optional().default("F0"),
|
|
1476
|
+
feature_name: zod.z.string().optional().default(""),
|
|
1477
|
+
concept_code: zod.z.string().optional().default(""),
|
|
1478
|
+
concept_name: zod.z.string().optional().default(""),
|
|
1479
|
+
completion_level: zod.z.string().optional().default("base"),
|
|
1480
|
+
difficulty: zod.z.string().optional().default("Beginner"),
|
|
1481
|
+
bloom_level: zod.z.string().optional().default("Understand"),
|
|
1482
|
+
tech_keywords: zod.z.array(zod.z.string()).optional().default([]),
|
|
1483
|
+
prerequisite_concept_codes: zod.z.array(zod.z.string()).optional().default([]),
|
|
1484
|
+
all_keywords: zod.z.array(zod.z.string()).optional().default([]).describe("All keywords associated with this milestone (aggregated from concepts)"),
|
|
1485
|
+
new_keywords: zod.z.array(zod.z.string()).optional().default([]).describe("Keywords introduced for the first time at this milestone"),
|
|
1486
|
+
prerequisite_keywords: zod.z.array(zod.z.string()).optional().default([]).describe("Keywords already introduced in earlier milestones"),
|
|
1487
|
+
learning_objectives: zod.z.array(LearningObjectiveInputSchema).optional().default([]),
|
|
1488
|
+
rationale: zod.z.string().or(zod.z.array(zod.z.string())).optional().default(""),
|
|
1489
|
+
instruction_ref: zod.z.string().optional(),
|
|
1490
|
+
/** Canonical numeric grade band [min, max] for standards retrieval (Phase 2). */
|
|
1491
|
+
grade_band: zod.z.tuple([zod.z.number().int(), zod.z.number().int()]).optional()
|
|
1492
|
+
});
|
|
1493
|
+
var PhaseInputSchema = zod.z.object({
|
|
1494
|
+
phase_id: zod.z.number().or(zod.z.string()),
|
|
1495
|
+
title: zod.z.string().optional(),
|
|
1496
|
+
phase_name: zod.z.string().optional(),
|
|
1497
|
+
description: zod.z.string().optional().default(""),
|
|
1498
|
+
target_outcome: zod.z.string().optional(),
|
|
1499
|
+
milestones: zod.z.array(MilestoneInputSchema).default([])
|
|
1500
|
+
});
|
|
1501
|
+
var RoadmapInputSchema = zod.z.object({
|
|
1502
|
+
project_brief: zod.z.object({
|
|
1503
|
+
name: zod.z.string().optional(),
|
|
1504
|
+
title: zod.z.string().optional(),
|
|
1505
|
+
goal: zod.z.string().optional(),
|
|
1506
|
+
description: zod.z.string().optional().default(""),
|
|
1507
|
+
tech_stack: zod.z.array(zod.z.string()).optional().default([]),
|
|
1508
|
+
estimated_hours: zod.z.number().optional().default(0),
|
|
1509
|
+
estimated_weeks: zod.z.number().optional().default(0),
|
|
1510
|
+
target_learner: zod.z.string().optional(),
|
|
1511
|
+
audience: zod.z.string().optional(),
|
|
1512
|
+
icon: zod.z.string().optional()
|
|
1513
|
+
}),
|
|
1514
|
+
phases: zod.z.array(PhaseInputSchema).default([])
|
|
1515
|
+
});
|
|
1516
|
+
|
|
1517
|
+
exports.ActiveLearningWorkflowSchema = ActiveLearningWorkflowSchema;
|
|
1518
|
+
exports.ActivityLabSchema = ActivityLabSchema;
|
|
1519
|
+
exports.ActivitySeqRowSchema = ActivitySeqRowSchema;
|
|
1520
|
+
exports.ActivityStepSchema = ActivityStepSchema;
|
|
1521
|
+
exports.ArtifactContractRowSchema = ArtifactContractRowSchema;
|
|
1522
|
+
exports.AssessmentMapRowSchema = AssessmentMapRowSchema;
|
|
1523
|
+
exports.AssessmentObjectiveSchema = AssessmentObjectiveSchema;
|
|
1524
|
+
exports.BellRingerDaySchema = BellRingerDaySchema;
|
|
1525
|
+
exports.BellRingerSchema = BellRingerSchema;
|
|
1526
|
+
exports.BloomLevelSchema = BloomLevelSchema;
|
|
1527
|
+
exports.BronzeTierSchema = BronzeTierSchema;
|
|
1528
|
+
exports.CERConclusionSchema = CERConclusionSchema;
|
|
1529
|
+
exports.CardTierEnum = CardTierEnum;
|
|
1530
|
+
exports.ChoiceBoardRubricRowSchema = ChoiceBoardRubricRowSchema;
|
|
1531
|
+
exports.ChoiceBoardSchema = ChoiceBoardSchema;
|
|
1532
|
+
exports.ChoiceRuleSchema = ChoiceRuleSchema;
|
|
1533
|
+
exports.ChoiceSquareSchema = ChoiceSquareSchema;
|
|
1534
|
+
exports.CodeLabSchema = CodeLabSchema;
|
|
1535
|
+
exports.CodeSnippetSchema = CodeSnippetSchema;
|
|
1536
|
+
exports.CompetencyRubricRowSchema = CompetencyRubricRowSchema;
|
|
1537
|
+
exports.ComputationalThinkingSchema = ComputationalThinkingSchema;
|
|
1538
|
+
exports.CoreConceptSchema = CoreConceptSchema;
|
|
1539
|
+
exports.CourseObjectiveSchema = CourseObjectiveSchema;
|
|
1540
|
+
exports.CoverageReportSchema = CoverageReportSchema;
|
|
1541
|
+
exports.CurriculumArtifactSchema = CurriculumArtifactSchema;
|
|
1542
|
+
exports.CurriculumPlanSchema = CurriculumPlanSchema;
|
|
1543
|
+
exports.CurriculumQualityReportSchema = CurriculumQualityReportSchema;
|
|
1544
|
+
exports.DependencyEdgeSchema = DependencyEdgeSchema;
|
|
1545
|
+
exports.DepthAssignmentSchema = DepthAssignmentSchema;
|
|
1546
|
+
exports.DepthLevelSchema = DepthLevelSchema;
|
|
1547
|
+
exports.DiagnosticQuestionSchema = DiagnosticQuestionSchema;
|
|
1548
|
+
exports.DiagnosticQuizSchema = DiagnosticQuizSchema;
|
|
1549
|
+
exports.EDPPhaseEnum = EDPPhaseEnum;
|
|
1550
|
+
exports.EntryLevelSchema = EntryLevelSchema;
|
|
1551
|
+
exports.ExitTicketBugHuntSchema = ExitTicketBugHuntSchema;
|
|
1552
|
+
exports.ExitTicketMetacognitionSchema = ExitTicketMetacognitionSchema;
|
|
1553
|
+
exports.ExitTicketQuickItemSchema = ExitTicketQuickItemSchema;
|
|
1554
|
+
exports.ExitTicketRecallPromptSchema = ExitTicketRecallPromptSchema;
|
|
1555
|
+
exports.ExitTicketSchema = ExitTicketSchema;
|
|
1556
|
+
exports.ExperimentalDesignSchema = ExperimentalDesignSchema;
|
|
1557
|
+
exports.ExtensionChallengeSchema = ExtensionChallengeSchema;
|
|
1558
|
+
exports.ExtensionSchema = ExtensionSchema;
|
|
1559
|
+
exports.FiveEFlowPhaseSchema = FiveEFlowPhaseSchema;
|
|
1560
|
+
exports.FiveEPhaseEnum = FiveEPhaseEnum;
|
|
1561
|
+
exports.GlossaryQuickRefRowSchema = GlossaryQuickRefRowSchema;
|
|
1562
|
+
exports.GlossarySchema = GlossarySchema;
|
|
1563
|
+
exports.GlossaryTermSchema = GlossaryTermSchema;
|
|
1564
|
+
exports.GoldTierSchema = GoldTierSchema;
|
|
1565
|
+
exports.GraphicOrganizerItemSchema = GraphicOrganizerItemSchema;
|
|
1566
|
+
exports.GraphicOrganizerSchema = GraphicOrganizerSchema;
|
|
1567
|
+
exports.HandoutSchema = HandoutSchema;
|
|
1568
|
+
exports.HandoutSectionSchema = HandoutSectionSchema;
|
|
1569
|
+
exports.InstructionSectionSchema = InstructionSectionSchema;
|
|
1570
|
+
exports.InstructionStepSchema = InstructionStepSchema;
|
|
1571
|
+
exports.JudgeCriterionSchema = JudgeCriterionSchema;
|
|
1572
|
+
exports.LabTierTaskSchema = LabTierTaskSchema;
|
|
1573
|
+
exports.LearningObjectiveInputSchema = LearningObjectiveInputSchema;
|
|
1574
|
+
exports.LearningObjectiveRowSchema = LearningObjectiveRowSchema;
|
|
1575
|
+
exports.LessonFlowPhaseSchema = LessonFlowPhaseSchema;
|
|
1576
|
+
exports.LessonPlan5ESchema = LessonPlan5ESchema;
|
|
1577
|
+
exports.LessonPlanEDPSchema = LessonPlanEDPSchema;
|
|
1578
|
+
exports.LessonPlanSchema = LessonPlanSchema;
|
|
1579
|
+
exports.LessonSectionSchema = LessonSectionSchema;
|
|
1580
|
+
exports.MarpSlideSchema = MarpSlideSchema;
|
|
1581
|
+
exports.MentorCheatsheetSchema = MentorCheatsheetSchema;
|
|
1582
|
+
exports.MilestoneInputSchema = MilestoneInputSchema;
|
|
1583
|
+
exports.MisconceptionSchema = MisconceptionSchema;
|
|
1584
|
+
exports.NodeKindSchema = NodeKindSchema;
|
|
1585
|
+
exports.OrganizerTypeEnum = OrganizerTypeEnum;
|
|
1586
|
+
exports.PhaseInputSchema = PhaseInputSchema;
|
|
1587
|
+
exports.PlanConstraintsSchema = PlanConstraintsSchema;
|
|
1588
|
+
exports.PlannerInputSchema = PlannerInputSchema;
|
|
1589
|
+
exports.PlanningGraphSchema = PlanningGraphSchema;
|
|
1590
|
+
exports.PlanningNodeSchema = PlanningNodeSchema;
|
|
1591
|
+
exports.PrerequisiteDecisionEntrySchema = PrerequisiteDecisionEntrySchema;
|
|
1592
|
+
exports.PrerequisiteDecisionSchema = PrerequisiteDecisionSchema;
|
|
1593
|
+
exports.ProductGoalSchema = ProductGoalSchema;
|
|
1594
|
+
exports.ProgressiveHintsSchema = ProgressiveHintsSchema;
|
|
1595
|
+
exports.ProjectGraphSchema = ProjectGraphSchema;
|
|
1596
|
+
exports.ProjectInstructionSchema = ProjectInstructionSchema;
|
|
1597
|
+
exports.ProjectProfileSchema = ProjectProfileSchema;
|
|
1598
|
+
exports.QualityAuditVerdictSchema = QualityAuditVerdictSchema;
|
|
1599
|
+
exports.QuizOptionSchema = QuizOptionSchema;
|
|
1600
|
+
exports.ResourceMapRowSchema = ResourceMapRowSchema;
|
|
1601
|
+
exports.ReviewGameExportRowSchema = ReviewGameExportRowSchema;
|
|
1602
|
+
exports.ReviewGameQuestionSchema = ReviewGameQuestionSchema;
|
|
1603
|
+
exports.ReviewGameSchema = ReviewGameSchema;
|
|
1604
|
+
exports.RoadmapInputSchema = RoadmapInputSchema;
|
|
1605
|
+
exports.RotationStationSchema = RotationStationSchema;
|
|
1606
|
+
exports.RubricCriteriaSchema = RubricCriteriaSchema;
|
|
1607
|
+
exports.RubricSchema = RubricSchema;
|
|
1608
|
+
exports.ScaffoldDecisionEntrySchema = ScaffoldDecisionEntrySchema;
|
|
1609
|
+
exports.ScaffoldDecisionSchema = ScaffoldDecisionSchema;
|
|
1610
|
+
exports.ScienceLabSchema = ScienceLabSchema;
|
|
1611
|
+
exports.ScoringRubricRowSchema = ScoringRubricRowSchema;
|
|
1612
|
+
exports.SelfLabSchema = SelfLabSchema;
|
|
1613
|
+
exports.SelfPacedBundleSchema = SelfPacedBundleSchema;
|
|
1614
|
+
exports.SelfPacedChallengeSchema = SelfPacedChallengeSchema;
|
|
1615
|
+
exports.SessionPlanSchema = SessionPlanSchema;
|
|
1616
|
+
exports.SilverTierSchema = SilverTierSchema;
|
|
1617
|
+
exports.SlideDeckSchema = SlideDeckSchema;
|
|
1618
|
+
exports.StandardizedTermRowSchema = StandardizedTermRowSchema;
|
|
1619
|
+
exports.StationRecordRowSchema = StationRecordRowSchema;
|
|
1620
|
+
exports.StationRotationSchema = StationRotationSchema;
|
|
1621
|
+
exports.StationTypeEnum = StationTypeEnum;
|
|
1622
|
+
exports.TaskCardSchema = TaskCardSchema;
|
|
1623
|
+
exports.TaskCardsSchema = TaskCardsSchema;
|
|
1624
|
+
exports.TeacherGuideSchema = TeacherGuideSchema;
|
|
1625
|
+
exports.TeachingScriptPhaseSchema = TeachingScriptPhaseSchema;
|
|
1626
|
+
exports.TierLevelEnum = TierLevelEnum;
|
|
1627
|
+
exports.TierObjectiveSchema = TierObjectiveSchema;
|
|
1628
|
+
exports.TieredPracticeSchema = TieredPracticeSchema;
|
|
1629
|
+
exports.TranslationPolicySchema = TranslationPolicySchema;
|
|
1630
|
+
exports.TroubleshootingEntrySchema = TroubleshootingEntrySchema;
|
|
1631
|
+
exports.TroubleshootingRowSchema = TroubleshootingRowSchema;
|
|
1632
|
+
exports.UnitPlanSchema = UnitPlanSchema;
|
|
1633
|
+
exports.UserJourneySchema = UserJourneySchema;
|
|
1634
|
+
exports.WorksheetItemSchema = WorksheetItemSchema;
|
|
1635
|
+
exports.WorksheetItemTypeEnum = WorksheetItemTypeEnum;
|
|
1636
|
+
exports.WorksheetPartSchema = WorksheetPartSchema;
|
|
1637
|
+
exports.WorksheetSchema = WorksheetSchema;
|
|
1638
|
+
exports.validateCurriculumPlan = validateCurriculumPlan;
|
|
1639
|
+
//# sourceMappingURL=index.cjs.map
|
|
1640
|
+
//# sourceMappingURL=index.cjs.map
|