@thanh01.pmt/presentation-kit 0.2.15 → 0.2.16

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ai/schemas.ts","../../src/ai/tools.ts","../../src/ai/prompt.ts","../../src/ai/validator.ts","../../src/ai/html/schemas.ts","../../src/ai/html/prompt.ts","../../src/ai/html/tools.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit — AI Tool Schemas (Zod)\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { z } from 'zod';\n\nexport const listSlidePresetsSchema = z.object({\n category: z.enum([\n 'all',\n 'cover',\n 'content',\n 'split',\n 'code',\n 'metrics',\n 'diagram',\n 'quote',\n 'assessment',\n ]).optional().describe('Optional category filter for layout presets'),\n});\n\nexport const createSlideFromPresetSchema = z.object({\n presetId: z.string().describe(\n 'ID of the layout preset: title-hero, two-column-split, code-explainer, metrics-3-card, process-flow, quote-highlight, quiz-checkpoint, tiered-practice-3cards, agenda-timeline, takeaways-summary'\n ),\n title: z.string().describe('Slide heading or title'),\n subtitle: z.string().optional().describe('Optional subtitle or section context'),\n content: z.record(z.string()).optional().describe(\n 'Key-value pairs for preset sections. For two-column-split: leftCol, rightCol. For code-explainer: code, language, notes. For metrics-3-card: card1Title, card1Val, card1Desc, etc.'\n ),\n customMarkdownBody: z.string().optional().describe(\n 'Raw markdown body to place inside the layout container (overrides content key-value pairs if provided)'\n ),\n presenterNotes: z.array(z.string()).optional().describe(\n 'Teacher talk track, cold-call check questions, or scaffolding notes for this slide'\n ),\n});\n\nexport const applySlideLayoutSchema = z.object({\n markdown: z.string().describe('Full Markdown slide deck content'),\n slideIndex: z.number().int().min(0).describe('0-based index of the target slide to modify'),\n presetId: z.string().optional().describe('Optional preset ID to apply to this slide'),\n boxes: z.array(\n z.object({\n id: z.string(),\n target: z.string().optional(),\n pos: z.tuple([z.number(), z.number(), z.number(), z.number()]).describe('[x, y, width, height] in 1280x720 canvas coordinates'),\n fontSize: z.string().optional(),\n color: z.string().optional(),\n textAlign: z.enum(['left', 'center', 'right', 'justify']).optional(),\n style: z.string().optional(),\n })\n ).optional().describe('Custom boxes if not using presetId'),\n});\n\nexport const updatePresenterNotesSchema = z.object({\n markdown: z.string().describe('Full Markdown slide deck content'),\n slideIndex: z.number().int().min(0).describe('0-based index of the target slide'),\n notes: z.array(z.string()).describe('List of speaker notes / talk tracks to set for this slide'),\n});\n\nexport const generateDeckOutlineSchema = z.object({\n topic: z.string().describe('Main subject or topic of the presentation'),\n durationMins: z.number().int().min(3).max(120).default(15).describe('Estimated duration in minutes (5m: 5-7 slides, 15m: 12-18 slides, 30m: 25-35 slides)'),\n audience: z.string().describe('Target audience profile (e.g. Grade 10 students, junior developers, enterprise clients)'),\n keyObjectives: z.array(z.string()).describe('2-4 key learning or decision objectives'),\n techStack: z.string().optional().describe('Optional programming language, framework, or hardware kit'),\n});\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit — AI Tool Handlers\n// Pure execution handlers for Vercel AI SDK / OpenAI tool calls\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport {\n SLIDE_LAYOUT_PRESETS,\n getSlideLayoutPresetById,\n getSlideLayoutPresetsByCategory,\n type SlideLayoutCategory,\n} from '../core/layout/presets.js';\nimport {\n updateSlideLayoutInMarkdown,\n splitMarkdownSlides,\n serializeLayoutToComment,\n} from '../core/layout/serializer.js';\nimport type { SlideLayoutData } from '../types.js';\n\n/**\n * Execute: listSlidePresets\n */\nexport function executeListSlidePresets(params?: { category?: string }) {\n const category = params?.category;\n const presets = (!category || category === 'all')\n ? SLIDE_LAYOUT_PRESETS\n : getSlideLayoutPresetsByCategory(category as SlideLayoutCategory);\n\n return {\n count: presets.length,\n presets: presets.map(p => ({\n id: p.id,\n name: p.name,\n category: p.category,\n description: p.description,\n boxCount: p.layout.boxes.length,\n snippetPreview: p.markdownSnippet.split('\\n').slice(0, 8).join('\\n') + '\\n...',\n })),\n };\n}\n\n/**\n * Execute: createSlideFromPreset\n */\nexport function executeCreateSlideFromPreset(params: {\n presetId: string;\n title: string;\n subtitle?: string;\n content?: Record<string, string>;\n customMarkdownBody?: string;\n presenterNotes?: string[];\n}): { success: boolean; slideMarkdown: string; presetName?: string; error?: string } {\n const preset = getSlideLayoutPresetById(params.presetId);\n if (!preset) {\n return {\n success: false,\n slideMarkdown: '',\n error: `Preset with ID \"${params.presetId}\" not found. Use listSlidePresets to see available layout templates.`,\n };\n }\n\n const layoutComment = serializeLayoutToComment(preset.layout);\n const title = params.title;\n const subtitle = params.subtitle ? `\\n### ${params.subtitle}` : '';\n\n let body = params.customMarkdownBody;\n\n if (!body) {\n const c = params.content || {};\n switch (preset.id) {\n case 'title-hero':\n body = `${subtitle}\\n\\n**Presenter:** ${c.speaker || 'Lead Instructor'} | **Duration:** ${c.duration || '45 mins'} | **Topic:** ${c.topic || title}`;\n break;\n\n case 'two-column-split':\n body = `<div class=\"columns-2\">\\n<div>\\n\\n### ${c.leftHeader || 'Approach A'}\\n${c.leftCol || '- Point 1\\n- Point 2\\n- Point 3'}\\n\\n</div>\\n<div>\\n\\n### ${c.rightHeader || 'Approach B'}\\n${c.rightCol || '- Point 1\\n- Point 2\\n- Point 3'}\\n\\n</div>\\n</div>`;\n break;\n\n case 'code-explainer':\n body = `<div class=\"columns-2\">\\n<div>\\n\\n\\`\\`\\`${c.lang || 'ts'}\\n${c.code || '// Core implementation logic\\nconst isValid = true;'}\\n\\`\\`\\`\\n\\n</div>\\n<div>\\n\\n### 🔍 Key Invariants:\\n${c.notes || '1. **Validation:** Checks payload before processing\\n2. **Execution:** Enforces deterministic state\\n3. **Resilience:** Handles edge case errors'}\\n\\n</div>\\n</div>`;\n break;\n\n case 'metrics-3-card':\n body = `<div class=\"columns-3\">\\n<div>\\n\\n# ${c.metric1Val || '99.9%'}\\n### ${c.metric1Title || 'Availability'}\\n${c.metric1Desc || 'Automated multi-region failover routing.'}\\n\\n</div>\\n<div>\\n\\n# ${c.metric2Val || '10x'}\\n### ${c.metric2Title || 'Throughput'}\\n${c.metric2Desc || 'Sub-millisecond processing latency.'}\\n\\n</div>\\n<div>\\n\\n# ${c.metric3Val || '0'}\\n### ${c.metric3Title || 'Breaches'}\\n${c.metric3Desc || 'Continuous SOC2 compliance auditing.'}\\n\\n</div>\\n</div>`;\n break;\n\n case 'process-flow':\n body = `\\`\\`\\`mermaid\\n${c.mermaid || 'graph LR\\n A[1. Ingress] --> B[2. Gateway]\\n B --> C[3. Service]\\n C --> D[4. Storage]'}\\n\\`\\`\\`\\n\\n${c.summary || '- **Phase 1 & 2:** Client connection and load balancing.\\n- **Phase 3 & 4:** Business logic execution and data commit.'}`;\n break;\n\n case 'quote-highlight':\n body = `> \"${c.quote || 'Simplicity is prerequisite for reliability.'}\"\\n> \\n> — **${c.author || 'Architecture Principle'}**`;\n break;\n\n case 'quiz-checkpoint':\n body = `> **Question:** ${c.question || 'Which architecture pattern best ensures reliable message delivery?'}\\n\\n- **A.** ${c.optA || 'Direct synchronous HTTP request with short timeout'}\\n- **B.** ${c.optB || 'Persistent Message Queue with Dead-Letter Queue (Correct)'}\\n- **C.** ${c.optC || 'In-memory client cache without persistence'}\\n- **D.** ${c.optD || 'Silently dropping failed packets'}`;\n break;\n\n case 'tiered-practice-3cards':\n body = `<div class=\"columns-3\">\\n<div>\\n\\n### 🥉 Bronze Tier\\n${c.bronze || '- Implement baseline function\\n- Pass 2 sample unit tests'}\\n\\n</div>\\n<div>\\n\\n### 🥈 Silver Tier\\n${c.silver || '- Add boundary error handling\\n- Optimize algorithm complexity'}\\n\\n</div>\\n<div>\\n\\n### 🥇 Gold Tier\\n${c.gold || '- Design extension feature\\n- Write automated integration tests'}\\n\\n</div>\\n</div>`;\n break;\n\n default:\n body = preset.markdownSnippet.replace(/^<!--[\\s\\S]*?-->\\n*/, '').replace(/^#\\s+[^\\n]+\\n*/, '').trim();\n }\n }\n\n const notes = params.presenterNotes && params.presenterNotes.length > 0\n ? `\\n\\n<!--\\nPresenter Notes:\\n${params.presenterNotes.map(n => `- ${n}`).join('\\n')}\\n-->`\n : `\\n\\n<!--\\nPresenter Notes:\\n- Explain the primary concept on this slide.\\n- Ask a diagnostic cold-call question to check comprehension.\\n-->`;\n\n const slideMarkdown = `${layoutComment}\\n\\n## ${title}${body ? '\\n\\n' + body : ''}${notes}`;\n\n return {\n success: true,\n slideMarkdown,\n presetName: preset.name,\n };\n}\n\n/**\n * Execute: applySlideLayout\n */\nexport function executeApplySlideLayout(params: {\n markdown: string;\n slideIndex: number;\n presetId?: string;\n boxes?: SlideLayoutData['boxes'];\n}): { success: boolean; updatedMarkdown: string; error?: string } {\n let layoutData: SlideLayoutData | null = null;\n\n if (params.presetId) {\n const preset = getSlideLayoutPresetById(params.presetId);\n if (!preset) {\n return {\n success: false,\n updatedMarkdown: params.markdown,\n error: `Preset with ID \"${params.presetId}\" not found.`,\n };\n }\n layoutData = preset.layout;\n } else if (params.boxes && params.boxes.length > 0) {\n layoutData = { boxes: params.boxes };\n }\n\n const updatedMarkdown = updateSlideLayoutInMarkdown(\n params.markdown,\n params.slideIndex,\n layoutData\n );\n\n return {\n success: true,\n updatedMarkdown,\n };\n}\n\n/**\n * Execute: updatePresenterNotes\n */\nexport function executeUpdatePresenterNotes(params: {\n markdown: string;\n slideIndex: number;\n notes: string[];\n}): { success: boolean; updatedMarkdown: string; error?: string } {\n const { frontmatter, slides } = splitMarkdownSlides(params.markdown);\n\n if (params.slideIndex < 0 || params.slideIndex >= slides.length) {\n return {\n success: false,\n updatedMarkdown: params.markdown,\n error: `Slide index ${params.slideIndex} out of bounds (total slides: ${slides.length})`,\n };\n }\n\n let slideContent = slides[params.slideIndex];\n const notesCommentRegex = /<!--\\s*(?:Presenter Notes|Notes):\\s*([\\s\\S]*?)-->/i;\n const newNotesComment = `<!--\\nPresenter Notes:\\n${params.notes.map(n => `- ${n}`).join('\\n')}\\n-->`;\n\n if (notesCommentRegex.test(slideContent)) {\n slideContent = slideContent.replace(notesCommentRegex, newNotesComment);\n } else {\n slideContent = `${slideContent.trimEnd()}\\n\\n${newNotesComment}`;\n }\n\n slides[params.slideIndex] = slideContent;\n const joined = slides.join('\\n---\\n');\n const updatedMarkdown = frontmatter ? `${frontmatter}\\n\\n${joined}` : joined;\n\n return {\n success: true,\n updatedMarkdown,\n };\n}\n\n/**\n * Execute: generateDeckOutline (indexed by talk duration)\n */\nexport function executeGenerateDeckOutline(params: {\n topic: string;\n durationMins: number;\n audience: string;\n keyObjectives: string[];\n techStack?: string;\n}) {\n const d = params.durationMins;\n let targetSlideCount = 12;\n let formatLabel = '15 min (Short Talk)';\n\n if (d <= 7) {\n targetSlideCount = 6;\n formatLabel = '5 min (Lightning Talk)';\n } else if (d <= 20) {\n targetSlideCount = 14;\n formatLabel = '15 min (Short Talk)';\n } else if (d <= 35) {\n targetSlideCount = 28;\n formatLabel = '30 min (Conference Talk)';\n } else {\n targetSlideCount = 42;\n formatLabel = '45-60 min (Keynote / Workshop)';\n }\n\n return {\n topic: params.topic,\n audience: params.audience,\n durationMins: d,\n format: formatLabel,\n recommendedSlideCount: targetSlideCount,\n structureGuidelines: [\n 'Apply the \"One Idea Per Slide\" invariant.',\n 'Enforce Word Budget: Maximum 40 words per card or column (Zero-Scroll Invariant).',\n 'Target 16:9 aspect ratio in 1280x720 coordinate space.',\n 'Every slide must conclude with Presenter Notes: Teacher talk track + 1 diagnostic cold-call question.',\n ],\n suggestedOutline: [\n { slide: 1, type: 'title-hero', title: `🚀 ${params.topic}`, intent: 'Opening hook and speaker credentialing' },\n { slide: 2, type: 'agenda-timeline', title: '🗺️ Session Milestones', intent: 'Set time budget expectations and learning deliverables' },\n { slide: 3, type: 'two-column-split', title: '⚡ Problem vs Opportunity', intent: 'Contrast legacy bottlenecks against the modern solution' },\n { slide: 4, type: 'process-flow', title: '🔄 Architectural Flow', intent: 'High-level system topology and sequence diagram' },\n { slide: 5, type: 'code-explainer', title: '💻 Core Code Walkthrough', intent: 'Deep-dive into production implementation logic' },\n { slide: 6, type: 'metrics-3-card', title: '📊 Benchmark Results', intent: 'Quantify performance and reliability gains' },\n { slide: 7, type: 'tiered-practice-3cards', title: '🛠️ Hands-On Challenge', intent: 'Differentiated practice across Bronze, Silver, and Gold tiers' },\n { slide: 8, type: 'quiz-checkpoint', title: '🎯 Formative Checkpoint', intent: 'Real-time diagnostic voting to verify mastery' },\n { slide: 9, type: 'takeaways-summary', title: '🏁 Key Takeaways', intent: 'Synthesis of 3 core lessons and next action items' },\n ].slice(0, Math.max(5, Math.min(targetSlideCount, 10))),\n };\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit — Slide Design Prompt Contract & System Invariants\n// \n// Modeled after battle-tested presentation orchestrators (e.g. slides-ai-plugin)\n// Provides rigorous invariants for LLM slide generation across web & PPTX.\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport const SLIDE_DESIGN_PROMPT_CONTRACT = `\n# SYSTEM MANDATE: PROFESSIONAL PRESENTATION & SLIDE DESIGN INVARIANTS\n\nYou are an expert Presentation Architect & Visual Designer for educational, technical, and executive decks.\nWhen generating or modifying Marp slide presentations, you MUST STRICTLY obey the following non-negotiable rules:\n\n---\n\n## 1. DURATION-INDEXED SLIDE PACING\nStructure decks based on allocated talk time (averaging 1.5 - 2 minutes per slide):\n- **5 min (Lightning Talk):** 5 - 7 slides [Hook -> 2-3 Core Points -> CTA / Summary]\n- **15 min (Short Tech Talk):** 12 - 16 slides [Title -> Agenda -> Hook -> 3-4 Concepts -> Lab/Demo -> Summary]\n- **30 min (Conference / Class):** 24 - 32 slides [Full 5E Learning Cycle + Interactive Formative Checkpoint]\n- **45-60 min (Keynote / Workshop):** 36 - 50 slides [Modular Micro-cycles + Tiered Hands-on Exercises]\n\n---\n\n## 2. THE \"ONE IDEA PER SLIDE\" RULE\n- Each slide communicates **EXACTLY ONE** pedagogical or architectural concept.\n- Never pack multiple distinct topics into a single slide.\n- If a concept has both theory and code, split into: (Slide A) Concept Diagram -> (Slide B) Code Walkthrough.\n\n---\n\n## 3. STRICT WORD BUDGET (ZERO-SCROLL INVARIANT)\n- **Hard Limit:** Maximum **35 - 40 words** per card or column.\n- Never write paragraphs longer than 2 sentences. Use structured bullets with bold anchor terms:\n - Format: \\`- **Key Concept:** Concise explanation in a single line.\\`\n- Vertical scrolling inside a slide is STRICTLY FORBIDDEN. Content must fit the 16:9 (1280x720) canvas cleanly.\n\n---\n\n## 4. TWO-COLUMN & CARD BALANCED LAYOUTS\n- Avoid centered vertical walls of text. Use responsive side-by-side card wrappers:\n \\`\\`\\`html\n <div class=\"columns-2\">\n <div>\n ### 🔴 Legacy / Challenge\n - High idle compute overhead\n - Cascading timeout failures\n </div>\n <div>\n ### 🟢 Modern / Solution\n - Event-driven webhook streams\n - Automatic queue backpressure\n </div>\n </div>\n \\`\\`\\`\n- For 3 metrics or bronze/silver/gold differentiation, use \\`<div class=\"columns-3\">...</div>\\`.\n\n---\n\n## 5. MANDATORY PRESENTER NOTES (TEACHER TALK TRACK)\nEvery single slide MUST conclude with an HTML comment block containing:\n1. **Talk Track:** 2-3 sentences of what the speaker should say out loud.\n2. **Cold-Call Check Question:** 1 diagnostic question to ask a specific student or attendee.\n3. **Scaffolding Tip:** 1 hint or real-world analogy if learners look confused.\n\nExample:\n\\`\\`\\`markdown\n<!--\nPresenter Notes:\n- Walk through the primary bottleneck when scaling database writes under high concurrency.\n- Cold-call: \"Alex, if traffic spikes 10x in 1 minute, which subsystem will experience lock contention first?\"\n- Scaffolding tip: Remind the room of the I/O saturation trade-off discussed in the previous module.\n-->\n\\`\\`\\`\n\n---\n\n## 6. MARP COMPATIBLE YAML LAYOUT HEADERS\nWhen a precise coordinate layout is specified, include the clean YAML block at the very top of the slide:\n\\`\\`\\`markdown\n<!-- layout:\n boxes:\n - id: heading\n target: h2\n pos: [80, 50, 1120, 70]\n fontSize: 2rem\n - id: col-left\n target: '.columns-2 > div:first-child'\n pos: [80, 150, 530, 510]\n - id: col-right\n target: '.columns-2 > div:last-child'\n pos: [670, 150, 530, 510]\n-->\n\\`\\`\\`\n\n---\n\n## 7. STEP REVEAL & PROGRESSIVE DISCLOSURE\nWhen presenting lists, comparisons, or multi-phase concepts, support sequential reveals:\n- Annotate lists or elements with \\`<!-- v-click -->\\` or apply class \\`.step-reveal\\` / \\`[data-step]\\`.\n- Clicking or pressing forward arrow reveals items sequentially before transitioning to the next slide.\n- Keep list items concise (< 15 words) to maintain visual rhythm during progressive steps.\n`;\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit — AI Slide Quality & Invariant Validator\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { z } from 'zod';\nimport { HTML_SLIDE_PRESETS } from '../html-engine/presets.js';\nimport { splitMarkdownSlides } from '../core/layout/serializer.js';\nimport type { HtmlLayoutPresetId, HtmlDeckData, HtmlSlideSlotData } from '../html-engine/types.js';\n\nexport const validateSlideDeckSchema = z.object({\n format: z.enum(['auto', 'html', 'markdown']).default('auto').describe('Deck format to validate: \"html\", \"markdown\", or \"auto\"'),\n markdown: z.string().optional().describe('Raw Markdown / Marp slide presentation content'),\n htmlDeck: z.object({\n title: z.string().optional(),\n subtitle: z.string().optional(),\n theme: z.string().optional(),\n slides: z.array(z.object({\n layoutId: z.string(),\n slots: z.record(z.any()),\n notes: z.string().optional(),\n })).optional(),\n }).optional().describe('Structured HTML deck data matching HtmlDeckData'),\n strict: z.boolean().default(false).describe('If true, warnings cause valid to be false'),\n});\n\nexport type ValidateSlideDeckInput = z.infer<typeof validateSlideDeckSchema>;\n\nexport interface SlideValidationIssue {\n slideIndex: number;\n severity: 'error' | 'warning';\n rule: string;\n message: string;\n}\n\nexport interface SlideValidationResult {\n success: boolean;\n valid: boolean;\n score: number; // 0 - 100\n format: 'html' | 'markdown';\n slideCount: number;\n notesCoveragePercent: number;\n issues: SlideValidationIssue[];\n suggestions: string[];\n}\n\nfunction countWords(str: string): number {\n if (!str) return 0;\n return str.trim().split(/\\s+/).filter(Boolean).length;\n}\n\n/**\n * Validate structured HTML slide deck against design and pedagogical invariants\n */\nexport function validateHtmlSlideDeck(\n deck: {\n slides?: Array<{ layoutId: string; slots?: Record<string, any>; notes?: string }>;\n title?: string;\n subtitle?: string;\n theme?: string;\n },\n strict = false\n): SlideValidationResult {\n const issues: SlideValidationIssue[] = [];\n const suggestions: string[] = [];\n const slides = deck.slides || [];\n const slideCount = slides.length;\n\n if (slideCount === 0) {\n return {\n success: false,\n valid: false,\n score: 0,\n format: 'html',\n slideCount: 0,\n notesCoveragePercent: 0,\n issues: [{\n slideIndex: 0,\n severity: 'error',\n rule: 'EMPTY_DECK',\n message: 'Presentation deck contains no slides.',\n }],\n suggestions: ['Add at least one slide (e.g. hero-cover) to the deck.'],\n };\n }\n\n let notesCount = 0;\n let hasCover = false;\n let hasQuiz = false;\n let hasSummary = false;\n\n slides.forEach((slide, idx) => {\n const slideNumber = idx + 1;\n const layoutId = slide.layoutId as HtmlLayoutPresetId;\n const preset = HTML_SLIDE_PRESETS[layoutId];\n\n // 1. Layout Preset Existence\n if (!preset) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'error',\n rule: 'INVALID_LAYOUT_PRESET',\n message: `Unknown layoutId \"${slide.layoutId}\". Available presets: ${Object.keys(HTML_SLIDE_PRESETS).join(', ')}`,\n });\n return;\n }\n\n if (preset.category === 'cover' && idx === 0) hasCover = true;\n if (preset.id === 'checkpoint-quiz') hasQuiz = true;\n if (preset.id === 'summary-takeaways') hasSummary = true;\n\n // 2. Required Slots Check\n for (const slotDef of preset.slots) {\n if (slotDef.required) {\n const val = slide.slots?.[slotDef.name];\n if (val === undefined || val === null || (typeof val === 'string' && val.trim() === '')) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'error',\n rule: 'MISSING_REQUIRED_SLOT',\n message: `Slide ${slideNumber} (${layoutId}) is missing required slot \"${slotDef.name}\" (${slotDef.label}).`,\n });\n }\n }\n }\n\n // 3. Word Budget & Zero-Scroll Invariant\n const slots = slide.slots || {};\n for (const [key, val] of Object.entries(slots)) {\n if (typeof val === 'string') {\n const words = countWords(val);\n // Exclude executable code from word limit\n if (key !== 'code' && words > 50) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'warning',\n rule: 'ZERO_SCROLL_WORD_BUDGET',\n message: `Slot \"${key}\" on slide ${slideNumber} has ${words} words. Recommended max is 35-40 words to prevent vertical scrolling.`,\n });\n }\n } else if (Array.isArray(val)) {\n if (val.length > 5) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'warning',\n rule: 'EXCESSIVE_LIST_ITEMS',\n message: `List slot \"${key}\" on slide ${slideNumber} has ${val.length} items. Keep to 3-4 items for optimal readability.`,\n });\n }\n val.forEach((item, itemIdx) => {\n if (typeof item === 'string') {\n const w = countWords(item);\n if (w > 20) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'warning',\n rule: 'BULLET_WORD_BUDGET',\n message: `Bullet #${itemIdx + 1} in \"${key}\" on slide ${slideNumber} is ${w} words. Keep bullet points concise (< 15 words).`,\n });\n }\n }\n });\n }\n }\n\n // 4. Presenter Notes Coverage & 3-Part Inspection\n const rawNotes = Array.isArray(slide.notes)\n ? slide.notes.join('\\n')\n : (typeof slide.notes === 'string' ? slide.notes : '');\n\n if (rawNotes && rawNotes.trim().length > 0) {\n notesCount++;\n const notes = rawNotes.trim();\n const hasQuestion = notes.includes('?') || /cold-?call|question/i.test(notes);\n const hasTip = /scaffold|tip|analogy|hint/i.test(notes);\n\n if (!hasQuestion || !hasTip) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'warning',\n rule: 'INCOMPLETE_PRESENTER_NOTES',\n message: `Presenter notes for slide ${slideNumber} should follow the 3-part contract: Talk Track, Cold-Call Question, and Scaffolding Tip.`,\n });\n }\n } else {\n issues.push({\n slideIndex: slideNumber,\n severity: 'error',\n rule: 'MISSING_PRESENTER_NOTES',\n message: `Slide ${slideNumber} is missing presenter notes. 100% presenter notes coverage is required.`,\n });\n }\n });\n\n // 5. Pedagogical Architecture Pacing Checks\n if (slideCount >= 3 && !hasCover) {\n issues.push({\n slideIndex: 1,\n severity: 'warning',\n rule: 'MISSING_HERO_COVER',\n message: 'Slide 1 should ideally use the \"hero-cover\" layout preset to introduce the topic and objectives.',\n });\n }\n if (slideCount >= 6 && !hasQuiz) {\n issues.push({\n slideIndex: Math.floor(slideCount / 2),\n severity: 'warning',\n rule: 'MISSING_FORMATIVE_CHECKPOINT',\n message: `Deck has ${slideCount} slides but lacks a \"checkpoint-quiz\" for mid-lesson active recall.`,\n });\n }\n if (slideCount >= 4 && !hasSummary) {\n issues.push({\n slideIndex: slideCount,\n severity: 'warning',\n rule: 'MISSING_SUMMARY_SLIDE',\n message: 'Deck lacks a \"summary-takeaways\" wrap-up slide at the conclusion of the presentation.',\n });\n }\n\n // Calculate score\n const notesCoveragePercent = Math.round((notesCount / slideCount) * 100);\n const errorCount = issues.filter((i) => i.severity === 'error').length;\n const warningCount = issues.filter((i) => i.severity === 'warning').length;\n let score = 100 - errorCount * 15 - warningCount * 4;\n score = Math.max(0, Math.min(100, score));\n\n const valid = strict ? issues.length === 0 : errorCount === 0;\n\n if (errorCount > 0) {\n suggestions.push(`Resolve ${errorCount} blocking error(s) before presenting or publishing.`);\n }\n if (notesCoveragePercent < 100) {\n suggestions.push(`Increase presenter notes coverage from ${notesCoveragePercent}% to 100%.`);\n }\n if (!hasQuiz && slideCount >= 6) {\n suggestions.push('Add an interactive checkpoint quiz around the midpoint of the lesson.');\n }\n\n return {\n success: true,\n valid,\n score,\n format: 'html',\n slideCount,\n notesCoveragePercent,\n issues,\n suggestions,\n };\n}\n\n/**\n * Validate raw Markdown / Marp slide presentation\n */\nexport function validateMarkdownSlideDeck(markdown: string, strict = false): SlideValidationResult {\n const issues: SlideValidationIssue[] = [];\n const suggestions: string[] = [];\n\n if (!markdown || markdown.trim().length === 0) {\n return {\n success: false,\n valid: false,\n score: 0,\n format: 'markdown',\n slideCount: 0,\n notesCoveragePercent: 0,\n issues: [{\n slideIndex: 0,\n severity: 'error',\n rule: 'EMPTY_MARKDOWN',\n message: 'Markdown slide presentation is empty.',\n }],\n suggestions: ['Provide Markdown slide content delimited by \"---\".'],\n };\n }\n\n const { slides: rawSlides } = splitMarkdownSlides(markdown);\n const activeSlides = rawSlides.filter((s) => s.trim().length > 0);\n const slideCount = activeSlides.length;\n\n if (slideCount === 0) {\n return {\n success: false,\n valid: false,\n score: 0,\n format: 'markdown',\n slideCount: 0,\n notesCoveragePercent: 0,\n issues: [{\n slideIndex: 0,\n severity: 'error',\n rule: 'EMPTY_MARKDOWN',\n message: 'No slide content detected after stripping frontmatter.',\n }],\n suggestions: ['Add slide content separated by \"---\".'],\n };\n }\n\n let notesCount = 0;\n\n activeSlides.forEach((slideContent, idx) => {\n const slideNumber = idx + 1;\n const trimmed = slideContent.trim();\n\n // Check presenter notes in comment block <!-- Presenter Notes: ... -->\n const notesMatch = trimmed.match(/<!--\\s*(?:Presenter Notes:?[\\s\\S]*?|[\\s\\S]*?notes[\\s\\S]*?)-->/i);\n if (notesMatch) {\n notesCount++;\n const noteBody = notesMatch[0];\n const hasQuestion = noteBody.includes('?') || /cold-?call|question/i.test(noteBody);\n const hasTip = /scaffold|tip|analogy|hint/i.test(noteBody);\n if (!hasQuestion || !hasTip) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'warning',\n rule: 'INCOMPLETE_PRESENTER_NOTES',\n message: `Presenter notes on slide ${slideNumber} should include Talk Track, a Cold-Call Question, and a Scaffolding Tip.`,\n });\n }\n } else {\n issues.push({\n slideIndex: slideNumber,\n severity: 'error',\n rule: 'MISSING_PRESENTER_NOTES',\n message: `Slide ${slideNumber} is missing presenter notes comments (<!-- Presenter Notes: ... -->).`,\n });\n }\n\n // Check code blocks closure\n const codeBlockTokens = trimmed.match(/```/g);\n if (codeBlockTokens && codeBlockTokens.length % 2 !== 0) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'error',\n rule: 'UNCLOSED_CODE_BLOCK',\n message: `Slide ${slideNumber} contains unclosed code fence backticks (\\`\\`\\`).`,\n });\n }\n\n // Word count in body (excluding code blocks and notes)\n const cleanBody = trimmed\n .replace(/<!--[\\s\\S]*?-->/g, '')\n .replace(/```[\\s\\S]*?```/g, '');\n const words = countWords(cleanBody);\n if (words > 100) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'warning',\n rule: 'ZERO_SCROLL_WORD_BUDGET',\n message: `Slide ${slideNumber} body has ${words} words. Keep within 40-70 words per slide to prevent vertical scroll.`,\n });\n }\n });\n\n const notesCoveragePercent = Math.round((notesCount / slideCount) * 100);\n const errorCount = issues.filter((i) => i.severity === 'error').length;\n const warningCount = issues.filter((i) => i.severity === 'warning').length;\n let score = 100 - errorCount * 15 - warningCount * 4;\n score = Math.max(0, Math.min(100, score));\n\n const valid = strict ? issues.length === 0 : errorCount === 0;\n\n return {\n success: true,\n valid,\n score,\n format: 'markdown',\n slideCount,\n notesCoveragePercent,\n issues,\n suggestions,\n };\n}\n\n/**\n * Universal executor for validating slide decks in either format\n */\nexport function executeValidateSlideDeck(input: ValidateSlideDeckInput): SlideValidationResult {\n const format = input.format || 'auto';\n\n if (format === 'html' || (format === 'auto' && input.htmlDeck && input.htmlDeck.slides)) {\n return validateHtmlSlideDeck(input.htmlDeck || { slides: [] }, input.strict);\n }\n\n if (format === 'markdown' || (format === 'auto' && input.markdown)) {\n return validateMarkdownSlideDeck(input.markdown || '', input.strict);\n }\n\n return {\n success: false,\n valid: false,\n score: 0,\n format: 'html',\n slideCount: 0,\n notesCoveragePercent: 0,\n issues: [{\n slideIndex: 0,\n severity: 'error',\n rule: 'INVALID_INPUT',\n message: 'Neither htmlDeck nor markdown was supplied for slide deck validation.',\n }],\n suggestions: ['Provide either \"htmlDeck\" object or \"markdown\" string in the validation parameters.'],\n };\n}\n\n// Alias for handler naming consistency\nexport const handleValidateSlideDeck = executeValidateSlideDeck;\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit — AI Tool Schemas for HTML Slide Engine (Zod)\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { z } from 'zod';\n\nexport const listHtmlSlidePresetsSchema = z.object({\n category: z\n .enum(['all', 'cover', 'content', 'split', 'grid', 'timeline', 'callout', 'assessment'])\n .optional()\n .describe('Optional category filter for HTML layout presets'),\n});\n\nexport const htmlSlideSlotDataSchema = z.object({\n layoutId: z\n .enum([\n 'hero-cover',\n 'split-concept-code',\n 'two-columns-compare',\n 'three-cards-grid',\n 'timeline-steps',\n 'metric-callout',\n 'checkpoint-quiz',\n 'summary-takeaways',\n ])\n .describe('Layout preset ID'),\n slots: z\n .record(z.any())\n .describe('Key-value slot dictionary matching the chosen layout requirements'),\n notes: z\n .string()\n .optional()\n .describe('Presenter speech track or teaching guide for this slide'),\n});\n\nexport const generateHtmlDeckSchema = z.object({\n title: z.string().describe('Title of the presentation / lesson deck'),\n subtitle: z.string().optional().describe('Subtitle or target audience / grade'),\n theme: z\n .enum(['blue-professional', 'editorial-forest', 'cobalt-grid', 'studio', 'monochrome'])\n .default('blue-professional')\n .describe('Visual theme palette'),\n slides: z\n .array(htmlSlideSlotDataSchema)\n .min(1)\n .describe('List of slides with designated layouts and slot contents'),\n});\n\nexport const createHtmlSlideSchema = z.object({\n layoutId: z\n .enum([\n 'hero-cover',\n 'split-concept-code',\n 'two-columns-compare',\n 'three-cards-grid',\n 'timeline-steps',\n 'metric-callout',\n 'checkpoint-quiz',\n 'summary-takeaways',\n ])\n .describe('Layout preset ID'),\n slots: z.record(z.any()).describe('Key-value content slots'),\n notes: z.string().optional().describe('Speaker talk track or question prompts'),\n});\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit — AI Slide HTML Prompt Contract\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport const SLIDE_HTML_PROMPT_CONTRACT = `\n# 🎨 HTML SLIDE ENGINE — AGENT GENERATION CONTRACT\n\nYou are an expert Presentation Designer and Curriculum Architect producing professional, high-impact slide decks.\nInstead of generating free-form HTML or brittle Markdown hacks, you MUST fill structured content into pre-tested **Layout Presets**.\n\n## Available Layout Presets & Required Slots:\n\n1. **hero-cover** (Cover / Title Slide)\n - \\`tag\\` (string): e.g. \"Unit 01 · Lesson 02\"\n - \\`title\\` (string): Main bold headline\n - \\`subtitle\\` (string): Subtitle or 1-sentence learning objective\n - \\`author\\` (string): Instructor / Organization\n - \\`date\\` (string): Course term or date\n\n2. **split-concept-code** (Theory + Code Snippet)\n - \\`tag\\` (string): Section topic tag\n - \\`title\\` (string): Topic heading\n - \\`points\\` (string[]): 3 to 4 concise bullet takeaways\n - \\`code\\` (string): Executable source code\n - \\`language\\` (string): Language name (e.g. \"python\", \"typescript\", \"swift\")\n - \\`codeNote\\` (string, optional): One-line hint or execution output\n\n3. **two-columns-compare** (Comparison / Pros vs Cons)\n - \\`tag\\` (string): Topic tag\n - \\`title\\` (string): Headline\n - \\`col1Title\\` (string): e.g. \"Synchronous I/O\"\n - \\`col1Items\\` (string[]): 3 to 4 points\n - \\`col2Title\\` (string): e.g. \"Asynchronous I/O\"\n - \\`col2Items\\` (string[]): 3 to 4 points\n\n4. **three-cards-grid** (3 Core Pillars / Architecture)\n - \\`tag\\` (string): e.g. \"Core Principles\"\n - \\`title\\` (string): Overview headline\n - \\`cards\\` (array of objects): Exactly 3 cards:\n - \\`badge\\`: e.g. \"01\", \"LAYER 1\"\n - \\`title\\`: Card headline\n - \\`desc\\`: 1-2 sentence description\n - \\`footer\\` (optional): Key takeaway\n\n5. **timeline-steps** (Algorithm / Execution Pipeline)\n - \\`tag\\` (string): e.g. \"Workflow\"\n - \\`title\\` (string): Headline\n - \\`steps\\` (array of objects): 3 to 5 steps:\n - \\`stepNum\\` (number/string): 1, 2, 3...\n - \\`title\\`: Step name\n - \\`desc\\`: What happens at this step\n\n6. **metric-callout** (Key Theorem / Benchmark Statistic)\n - \\`tag\\` (string): e.g. \"Time Complexity\"\n - \\`metric\\` (string): Big stat (e.g. \"O(log N)\", \"99.99%\", \"10x\")\n - \\`metricLabel\\` (string): e.g. \"Lookup Efficiency\"\n - \\`title\\` (string): Main takeaway\n - \\`desc\\` (string): Contextual explanation\n\n7. **checkpoint-quiz** (Interactive Checkpoint)\n - \\`tag\\` (string): e.g. \"Quick Knowledge Check\"\n - \\`question\\` (string): Clear question prompt\n - \\`options\\` (array of objects): 2 to 4 options:\n - \\`label\\`: \"A\", \"B\", \"C\", \"D\"\n - \\`text\\`: Option text\n - \\`explanation\\` (string): Explanatory rationale\n\n8. **summary-takeaways** (Wrap-Up / Next Steps)\n - \\`tag\\` (string): e.g. \"Recap\"\n - \\`title\\` (string): Wrap-up headline\n - \\`takeaways\\` (string[]): 3 to 4 memorable bullet points\n - \\`nextStep\\` (string): Teaser for the next lesson or project\n\n## Aesthetic & Quality Invariants (\"Anti-AI-Slop\"):\n- **Brevity is King (Zero-Scroll Invariant):** Each slide is calibrated for a 1920×1080 canvas. Maximum **35–40 words** per card or column; maximum **15 words** per bullet item. Never write dense multi-sentence paragraphs that cause vertical scrolling.\n- **Pedagogical Pacing:** Start with \\`hero-cover\\`, alternate between \\`split-concept-code\\`, \\`two-columns-compare\\` and \\`three-cards-grid\\`, insert a \\`checkpoint-quiz\\` midway, and finish with \\`summary-takeaways\\`.\n- **Theme Selection:**\n - \\`blue-professional\\`: General academic, clean engineering, trustworthy.\n - \\`cobalt-grid\\`: Advanced tech, algorithms, robotics, cybersecurity.\n - \\`editorial-forest\\`: Thoughtful design, literature, ethics, science.\n - \\`studio\\`: Minimalist product design, modern software.\n - \\`monochrome\\`: Pure high-contrast dark mode.\n\n## 🪄 Step Reveal & Progressive Disclosure:\n- The presentation shell supports sequential step reveal via mouse click or Space/Arrow keys.\n- Bullet lists (\\`points\\`, \\`col1Items\\`, \\`col2Items\\`), cards in \\`three-cards-grid\\`, and steps in \\`timeline-steps\\` reveal progressively one by one before navigating to the next slide.\n- In custom HTML slots, you can attach \\`class=\"step-reveal\"\\`, \\`data-step\\`, \\`data-reveal\\`, or \\`data-auto-reveal=\"true\"\\` on parent containers to enable click-by-click stepped appearance.\n\n## 🎙️ Mandatory 3-Part Presenter Notes Contract:\nEvery single slide MUST include the \\`notes\\` property structured with these 3 explicit components:\n1. **Talk Track:** 2-3 sentences of exact conversational speaking script for the teacher/presenter.\n2. **Cold-Call Check Question:** 1 diagnostic question to check understanding with a named student or attendee.\n3. **Scaffolding Tip:** 1 intuitive analogy or troubleshooting hint in case learners struggle with the concept.\n\nExample Notes:\n\\`\\`\\`markdown\nTalk Track: Here we contrast synchronous blocking I/O with asynchronous event-driven handling. Notice how threads remain idle while waiting for network responses.\nCold-Call: \"Jordan, looking at the left column, what happens to thread pool throughput when network latency quadruples?\"\nScaffolding Tip: Compare it to ordering coffee at a counter (async buzzer) versus waiting at the register until the cup is brewed (sync blocking).\n\\`\\`\\`\n`;\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit — AI Tool Handlers for HTML Slide Engine\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { HTML_SLIDE_PRESETS } from '../../html-engine/presets.js';\nimport { HTML_THEMES } from '../../html-engine/themes.js';\nimport { compileHtmlDeck } from '../../html-engine/compiler.js';\nimport type { HtmlDeckData, HtmlSlideSlotData } from '../../html-engine/types.js';\n\nexport function handleListHtmlSlidePresets(input: { category?: string }) {\n const category = input.category || 'all';\n const presets = Object.values(HTML_SLIDE_PRESETS)\n .filter((p) => category === 'all' || p.category === category)\n .map((p) => ({\n id: p.id,\n name: p.name,\n category: p.category,\n description: p.description,\n slots: p.slots.map((s) => ({\n name: s.name,\n label: s.label,\n type: s.type,\n required: Boolean(s.required),\n description: s.description,\n })),\n }));\n\n return {\n success: true,\n presets,\n availableThemes: Object.keys(HTML_THEMES),\n };\n}\n\nexport function handleGenerateHtmlDeck(input: HtmlDeckData) {\n try {\n const result = compileHtmlDeck(input);\n return {\n success: true,\n title: result.title,\n slideCount: result.slideCount,\n theme: result.theme.id,\n html: result.html,\n };\n } catch (err: any) {\n return {\n success: false,\n error: err.message || 'Failed to compile HTML slide deck',\n };\n }\n}\n\nexport function handleCreateHtmlSlide(input: HtmlSlideSlotData) {\n const preset = HTML_SLIDE_PRESETS[input.layoutId];\n if (!preset) {\n return {\n success: false,\n error: `Unknown layout preset: ${input.layoutId}`,\n };\n }\n\n return {\n success: true,\n slide: {\n layoutId: input.layoutId,\n slots: input.slots,\n notes: input.notes,\n },\n };\n}\n\n// Aliases for unified naming convention across AI toolbelt\nexport const executeListHtmlSlidePresets = handleListHtmlSlidePresets;\nexport const executeGenerateHtmlDeck = handleGenerateHtmlDeck;\nexport const executeCreateHtmlSlide = handleCreateHtmlSlide;\n"]}
1
+ {"version":3,"sources":["../../src/ai/schemas.ts","../../src/ai/tools.ts","../../src/ai/prompt.ts","../../src/ai/validator.ts","../../src/ai/html/schemas.ts","../../src/ai/html/prompt.ts","../../src/ai/html/tools.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit — AI Tool Schemas (Zod)\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { z } from 'zod';\n\nexport const listSlidePresetsSchema = z.object({\n category: z.enum([\n 'all',\n 'cover',\n 'content',\n 'split',\n 'code',\n 'metrics',\n 'diagram',\n 'quote',\n 'assessment',\n ]).optional().describe('Optional category filter for layout presets'),\n});\n\nexport const createSlideFromPresetSchema = z.object({\n presetId: z.string().describe(\n 'ID of the layout preset: title-hero, two-column-split, code-explainer, metrics-3-card, process-flow, quote-highlight, quiz-checkpoint, tiered-practice-3cards, agenda-timeline, takeaways-summary'\n ),\n title: z.string().describe('Slide heading or title'),\n subtitle: z.string().optional().describe('Optional subtitle or section context'),\n content: z.record(z.string()).optional().describe(\n 'Key-value pairs for preset sections. For two-column-split: leftCol, rightCol. For code-explainer: code, language, notes. For metrics-3-card: card1Title, card1Val, card1Desc, etc.'\n ),\n customMarkdownBody: z.string().optional().describe(\n 'Raw markdown body to place inside the layout container (overrides content key-value pairs if provided)'\n ),\n presenterNotes: z.array(z.string()).optional().describe(\n 'Teacher talk track, cold-call check questions, or scaffolding notes for this slide'\n ),\n});\n\nexport const applySlideLayoutSchema = z.object({\n markdown: z.string().describe('Full Markdown slide deck content'),\n slideIndex: z.number().int().min(0).describe('0-based index of the target slide to modify'),\n presetId: z.string().optional().describe('Optional preset ID to apply to this slide'),\n boxes: z.array(\n z.object({\n id: z.string(),\n target: z.string().optional(),\n pos: z.tuple([z.number(), z.number(), z.number(), z.number()]).describe('[x, y, width, height] in 1280x720 canvas coordinates'),\n fontSize: z.string().optional(),\n color: z.string().optional(),\n textAlign: z.enum(['left', 'center', 'right', 'justify']).optional(),\n style: z.string().optional(),\n })\n ).optional().describe('Custom boxes if not using presetId'),\n});\n\nexport const updatePresenterNotesSchema = z.object({\n markdown: z.string().describe('Full Markdown slide deck content'),\n slideIndex: z.number().int().min(0).describe('0-based index of the target slide'),\n notes: z.array(z.string()).describe('List of speaker notes / talk tracks to set for this slide'),\n});\n\nexport const generateDeckOutlineSchema = z.object({\n topic: z.string().describe('Main subject or topic of the presentation'),\n durationMins: z.number().int().min(3).max(120).default(15).describe('Estimated duration in minutes (5m: 5-7 slides, 15m: 12-18 slides, 30m: 25-35 slides)'),\n audience: z.string().describe('Target audience profile (e.g. Grade 10 students, junior developers, enterprise clients)'),\n keyObjectives: z.array(z.string()).describe('2-4 key learning or decision objectives'),\n techStack: z.string().optional().describe('Optional programming language, framework, or hardware kit'),\n});\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit — AI Tool Handlers\n// Pure execution handlers for Vercel AI SDK / OpenAI tool calls\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport {\n SLIDE_LAYOUT_PRESETS,\n getSlideLayoutPresetById,\n getSlideLayoutPresetsByCategory,\n type SlideLayoutCategory,\n} from '../core/layout/presets.js';\nimport {\n updateSlideLayoutInMarkdown,\n splitMarkdownSlides,\n serializeLayoutToComment,\n} from '../core/layout/serializer.js';\nimport type { SlideLayoutData } from '../types.js';\n\n/**\n * Execute: listSlidePresets\n */\nexport function executeListSlidePresets(params?: { category?: string }) {\n const category = params?.category;\n const presets = (!category || category === 'all')\n ? SLIDE_LAYOUT_PRESETS\n : getSlideLayoutPresetsByCategory(category as SlideLayoutCategory);\n\n return {\n count: presets.length,\n presets: presets.map(p => ({\n id: p.id,\n name: p.name,\n category: p.category,\n description: p.description,\n boxCount: p.layout.boxes.length,\n snippetPreview: p.markdownSnippet.split('\\n').slice(0, 8).join('\\n') + '\\n...',\n })),\n };\n}\n\n/**\n * Execute: createSlideFromPreset\n */\nexport function executeCreateSlideFromPreset(params: {\n presetId: string;\n title: string;\n subtitle?: string;\n content?: Record<string, string>;\n customMarkdownBody?: string;\n presenterNotes?: string[];\n}): { success: boolean; slideMarkdown: string; presetName?: string; error?: string } {\n const preset = getSlideLayoutPresetById(params.presetId);\n if (!preset) {\n return {\n success: false,\n slideMarkdown: '',\n error: `Preset with ID \"${params.presetId}\" not found. Use listSlidePresets to see available layout templates.`,\n };\n }\n\n const layoutComment = serializeLayoutToComment(preset.layout);\n const title = params.title;\n const subtitle = params.subtitle ? `\\n### ${params.subtitle}` : '';\n\n let body = params.customMarkdownBody;\n\n if (!body) {\n const c = params.content || {};\n switch (preset.id) {\n case 'title-hero':\n body = `${subtitle}\\n\\n**Presenter:** ${c.speaker || 'Lead Instructor'} | **Duration:** ${c.duration || '45 mins'} | **Topic:** ${c.topic || title}`;\n break;\n\n case 'two-column-split':\n body = `<div class=\"columns-2\">\\n<div>\\n\\n### ${c.leftHeader || 'Approach A'}\\n${c.leftCol || '- Point 1\\n- Point 2\\n- Point 3'}\\n\\n</div>\\n<div>\\n\\n### ${c.rightHeader || 'Approach B'}\\n${c.rightCol || '- Point 1\\n- Point 2\\n- Point 3'}\\n\\n</div>\\n</div>`;\n break;\n\n case 'code-explainer':\n body = `<div class=\"columns-2\">\\n<div>\\n\\n\\`\\`\\`${c.lang || 'ts'}\\n${c.code || '// Core implementation logic\\nconst isValid = true;'}\\n\\`\\`\\`\\n\\n</div>\\n<div>\\n\\n### 🔍 Key Invariants:\\n${c.notes || '1. **Validation:** Checks payload before processing\\n2. **Execution:** Enforces deterministic state\\n3. **Resilience:** Handles edge case errors'}\\n\\n</div>\\n</div>`;\n break;\n\n case 'metrics-3-card':\n body = `<div class=\"columns-3\">\\n<div>\\n\\n# ${c.metric1Val || '99.9%'}\\n### ${c.metric1Title || 'Availability'}\\n${c.metric1Desc || 'Automated multi-region failover routing.'}\\n\\n</div>\\n<div>\\n\\n# ${c.metric2Val || '10x'}\\n### ${c.metric2Title || 'Throughput'}\\n${c.metric2Desc || 'Sub-millisecond processing latency.'}\\n\\n</div>\\n<div>\\n\\n# ${c.metric3Val || '0'}\\n### ${c.metric3Title || 'Breaches'}\\n${c.metric3Desc || 'Continuous SOC2 compliance auditing.'}\\n\\n</div>\\n</div>`;\n break;\n\n case 'process-flow':\n body = `\\`\\`\\`mermaid\\n${c.mermaid || 'graph LR\\n A[1. Ingress] --> B[2. Gateway]\\n B --> C[3. Service]\\n C --> D[4. Storage]'}\\n\\`\\`\\`\\n\\n${c.summary || '- **Phase 1 & 2:** Client connection and load balancing.\\n- **Phase 3 & 4:** Business logic execution and data commit.'}`;\n break;\n\n case 'quote-highlight':\n body = `> \"${c.quote || 'Simplicity is prerequisite for reliability.'}\"\\n> \\n> — **${c.author || 'Architecture Principle'}**`;\n break;\n\n case 'quiz-checkpoint':\n body = `> **Question:** ${c.question || 'Which architecture pattern best ensures reliable message delivery?'}\\n\\n- **A.** ${c.optA || 'Direct synchronous HTTP request with short timeout'}\\n- **B.** ${c.optB || 'Persistent Message Queue with Dead-Letter Queue (Correct)'}\\n- **C.** ${c.optC || 'In-memory client cache without persistence'}\\n- **D.** ${c.optD || 'Silently dropping failed packets'}`;\n break;\n\n case 'tiered-practice-3cards':\n body = `<div class=\"columns-3\">\\n<div>\\n\\n### 🥉 Bronze Tier\\n${c.bronze || '- Implement baseline function\\n- Pass 2 sample unit tests'}\\n\\n</div>\\n<div>\\n\\n### 🥈 Silver Tier\\n${c.silver || '- Add boundary error handling\\n- Optimize algorithm complexity'}\\n\\n</div>\\n<div>\\n\\n### 🥇 Gold Tier\\n${c.gold || '- Design extension feature\\n- Write automated integration tests'}\\n\\n</div>\\n</div>`;\n break;\n\n default:\n body = preset.markdownSnippet.replace(/^<!--[\\s\\S]*?-->\\n*/, '').replace(/^#\\s+[^\\n]+\\n*/, '').trim();\n }\n }\n\n const notes = params.presenterNotes && params.presenterNotes.length > 0\n ? `\\n\\n<!--\\nPresenter Notes:\\n${params.presenterNotes.map(n => `- ${n}`).join('\\n')}\\n-->`\n : `\\n\\n<!--\\nPresenter Notes:\\n- Explain the primary concept on this slide.\\n- Ask a diagnostic cold-call question to check comprehension.\\n-->`;\n\n const slideMarkdown = `${layoutComment}\\n\\n## ${title}${body ? '\\n\\n' + body : ''}${notes}`;\n\n return {\n success: true,\n slideMarkdown,\n presetName: preset.name,\n };\n}\n\n/**\n * Execute: applySlideLayout\n */\nexport function executeApplySlideLayout(params: {\n markdown: string;\n slideIndex: number;\n presetId?: string;\n boxes?: SlideLayoutData['boxes'];\n}): { success: boolean; updatedMarkdown: string; error?: string } {\n let layoutData: SlideLayoutData | null = null;\n\n if (params.presetId) {\n const preset = getSlideLayoutPresetById(params.presetId);\n if (!preset) {\n return {\n success: false,\n updatedMarkdown: params.markdown,\n error: `Preset with ID \"${params.presetId}\" not found.`,\n };\n }\n layoutData = preset.layout;\n } else if (params.boxes && params.boxes.length > 0) {\n layoutData = { boxes: params.boxes };\n }\n\n const updatedMarkdown = updateSlideLayoutInMarkdown(\n params.markdown,\n params.slideIndex,\n layoutData\n );\n\n return {\n success: true,\n updatedMarkdown,\n };\n}\n\n/**\n * Execute: updatePresenterNotes\n */\nexport function executeUpdatePresenterNotes(params: {\n markdown: string;\n slideIndex: number;\n notes: string[];\n}): { success: boolean; updatedMarkdown: string; error?: string } {\n const { frontmatter, slides } = splitMarkdownSlides(params.markdown);\n\n if (params.slideIndex < 0 || params.slideIndex >= slides.length) {\n return {\n success: false,\n updatedMarkdown: params.markdown,\n error: `Slide index ${params.slideIndex} out of bounds (total slides: ${slides.length})`,\n };\n }\n\n let slideContent = slides[params.slideIndex];\n const notesCommentRegex = /<!--\\s*(?:Presenter Notes|Notes):\\s*([\\s\\S]*?)-->/i;\n const newNotesComment = `<!--\\nPresenter Notes:\\n${params.notes.map(n => `- ${n}`).join('\\n')}\\n-->`;\n\n if (notesCommentRegex.test(slideContent)) {\n slideContent = slideContent.replace(notesCommentRegex, newNotesComment);\n } else {\n slideContent = `${slideContent.trimEnd()}\\n\\n${newNotesComment}`;\n }\n\n slides[params.slideIndex] = slideContent;\n const joined = slides.join('\\n---\\n');\n const updatedMarkdown = frontmatter ? `${frontmatter}\\n\\n${joined}` : joined;\n\n return {\n success: true,\n updatedMarkdown,\n };\n}\n\n/**\n * Execute: generateDeckOutline (indexed by talk duration)\n */\nexport function executeGenerateDeckOutline(params: {\n topic: string;\n durationMins: number;\n audience: string;\n keyObjectives: string[];\n techStack?: string;\n}) {\n const d = params.durationMins;\n let targetSlideCount = 12;\n let formatLabel = '15 min (Short Talk)';\n\n if (d <= 7) {\n targetSlideCount = 6;\n formatLabel = '5 min (Lightning Talk)';\n } else if (d <= 20) {\n targetSlideCount = 14;\n formatLabel = '15 min (Short Talk)';\n } else if (d <= 35) {\n targetSlideCount = 28;\n formatLabel = '30 min (Conference Talk)';\n } else {\n targetSlideCount = 42;\n formatLabel = '45-60 min (Keynote / Workshop)';\n }\n\n return {\n topic: params.topic,\n audience: params.audience,\n durationMins: d,\n format: formatLabel,\n recommendedSlideCount: targetSlideCount,\n structureGuidelines: [\n 'Apply the \"One Idea Per Slide\" invariant.',\n 'Enforce Word Budget: Maximum 40 words per card or column (Zero-Scroll Invariant).',\n 'Target 16:9 aspect ratio in 1280x720 coordinate space.',\n 'Every slide must conclude with Presenter Notes: Teacher talk track + 1 diagnostic cold-call question.',\n ],\n suggestedOutline: [\n { slide: 1, type: 'title-hero', title: `🚀 ${params.topic}`, intent: 'Opening hook and speaker credentialing' },\n { slide: 2, type: 'agenda-timeline', title: '🗺️ Session Milestones', intent: 'Set time budget expectations and learning deliverables' },\n { slide: 3, type: 'two-column-split', title: '⚡ Problem vs Opportunity', intent: 'Contrast legacy bottlenecks against the modern solution' },\n { slide: 4, type: 'process-flow', title: '🔄 Architectural Flow', intent: 'High-level system topology and sequence diagram' },\n { slide: 5, type: 'code-explainer', title: '💻 Core Code Walkthrough', intent: 'Deep-dive into production implementation logic' },\n { slide: 6, type: 'metrics-3-card', title: '📊 Benchmark Results', intent: 'Quantify performance and reliability gains' },\n { slide: 7, type: 'tiered-practice-3cards', title: '🛠️ Hands-On Challenge', intent: 'Differentiated practice across Bronze, Silver, and Gold tiers' },\n { slide: 8, type: 'quiz-checkpoint', title: '🎯 Formative Checkpoint', intent: 'Real-time diagnostic voting to verify mastery' },\n { slide: 9, type: 'takeaways-summary', title: '🏁 Key Takeaways', intent: 'Synthesis of 3 core lessons and next action items' },\n ].slice(0, Math.max(5, Math.min(targetSlideCount, 10))),\n };\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit — Slide Design Prompt Contract & System Invariants\n// \n// Modeled after battle-tested presentation orchestrators (e.g. slides-ai-plugin)\n// Provides rigorous invariants for LLM slide generation across web & PPTX.\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport const SLIDE_DESIGN_PROMPT_CONTRACT = `\n# SYSTEM MANDATE: PROFESSIONAL PRESENTATION & SLIDE DESIGN INVARIANTS\n\nYou are an expert Presentation Architect & Visual Designer for educational, technical, and executive decks.\nWhen generating or modifying Marp slide presentations, you MUST STRICTLY obey the following non-negotiable rules:\n\n---\n\n## 1. DURATION-INDEXED SLIDE PACING\nStructure decks based on allocated talk time (averaging 1.5 - 2 minutes per slide):\n- **5 min (Lightning Talk):** 5 - 7 slides [Hook -> 2-3 Core Points -> CTA / Summary]\n- **15 min (Short Tech Talk):** 12 - 16 slides [Title -> Agenda -> Hook -> 3-4 Concepts -> Lab/Demo -> Summary]\n- **30 min (Conference / Class):** 24 - 32 slides [Full 5E Learning Cycle + Interactive Formative Checkpoint]\n- **45-60 min (Keynote / Workshop):** 36 - 50 slides [Modular Micro-cycles + Tiered Hands-on Exercises]\n\n---\n\n## 2. THE \"ONE IDEA PER SLIDE\" RULE\n- Each slide communicates **EXACTLY ONE** pedagogical or architectural concept.\n- Never pack multiple distinct topics into a single slide.\n- If a concept has both theory and code, split into: (Slide A) Concept Diagram -> (Slide B) Code Walkthrough.\n\n---\n\n## 3. STRICT WORD BUDGET (ZERO-SCROLL INVARIANT)\n- **Hard Limit:** Maximum **35 - 40 words** per card or column.\n- Never write paragraphs longer than 2 sentences. Use structured bullets with bold anchor terms:\n - Format: \\`- **Key Concept:** Concise explanation in a single line.\\`\n- Vertical scrolling inside a slide is STRICTLY FORBIDDEN. Content must fit the 16:9 (1280x720) canvas cleanly.\n\n---\n\n## 4. TWO-COLUMN & CARD BALANCED LAYOUTS\n- Avoid centered vertical walls of text. Use responsive side-by-side card wrappers:\n \\`\\`\\`html\n <div class=\"columns-2\">\n <div>\n ### 🔴 Legacy / Challenge\n - High idle compute overhead\n - Cascading timeout failures\n </div>\n <div>\n ### 🟢 Modern / Solution\n - Event-driven webhook streams\n - Automatic queue backpressure\n </div>\n </div>\n \\`\\`\\`\n- For 3 metrics or bronze/silver/gold differentiation, use \\`<div class=\"columns-3\">...</div>\\`.\n\n---\n\n## 5. MANDATORY PRESENTER NOTES (TEACHER TALK TRACK)\nEvery single slide MUST conclude with an HTML comment block containing:\n1. **Talk Track:** 2-3 sentences of what the speaker should say out loud.\n2. **Cold-Call Check Question:** 1 diagnostic question to ask a specific student or attendee.\n3. **Scaffolding Tip:** 1 hint or real-world analogy if learners look confused.\n\nExample:\n\\`\\`\\`markdown\n<!--\nPresenter Notes:\n- Walk through the primary bottleneck when scaling database writes under high concurrency.\n- Cold-call: \"Alex, if traffic spikes 10x in 1 minute, which subsystem will experience lock contention first?\"\n- Scaffolding tip: Remind the room of the I/O saturation trade-off discussed in the previous module.\n-->\n\\`\\`\\`\n\n---\n\n## 6. MARP COMPATIBLE YAML LAYOUT HEADERS\nWhen a precise coordinate layout is specified, include the clean YAML block at the very top of the slide:\n\\`\\`\\`markdown\n<!-- layout:\n boxes:\n - id: heading\n target: h2\n pos: [80, 50, 1120, 70]\n fontSize: 2rem\n - id: col-left\n target: '.columns-2 > div:first-child'\n pos: [80, 150, 530, 510]\n - id: col-right\n target: '.columns-2 > div:last-child'\n pos: [670, 150, 530, 510]\n-->\n\\`\\`\\`\n\n---\n\n## 7. STEP REVEAL & PROGRESSIVE DISCLOSURE\nWhen presenting lists, comparisons, or multi-phase concepts, support sequential reveals:\n- Annotate lists or elements with \\`<!-- v-click -->\\` or apply class \\`.step-reveal\\` / \\`[data-step]\\`.\n- Clicking or pressing forward arrow reveals items sequentially before transitioning to the next slide.\n- Keep list items concise (< 15 words) to maintain visual rhythm during progressive steps.\n`;\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit — AI Slide Quality & Invariant Validator\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { z } from 'zod';\nimport { HTML_SLIDE_PRESETS } from '../html-engine/presets.js';\nimport { splitMarkdownSlides } from '../core/layout/serializer.js';\nimport { normalizeSlideSlots } from '../html-engine/normalizer.js';\nimport type { HtmlLayoutPresetId, HtmlDeckData, HtmlSlideSlotData } from '../html-engine/types.js';\n\nexport const validateSlideDeckSchema = z.object({\n format: z.enum(['auto', 'html', 'markdown']).default('auto').describe('Deck format to validate: \"html\", \"markdown\", or \"auto\"'),\n markdown: z.string().optional().describe('Raw Markdown / Marp slide presentation content'),\n htmlDeck: z.object({\n title: z.string().optional(),\n subtitle: z.string().optional(),\n theme: z.string().optional(),\n slides: z.array(z.object({\n layoutId: z.string(),\n slots: z.record(z.any()),\n notes: z.string().optional(),\n })).optional(),\n }).optional().describe('Structured HTML deck data matching HtmlDeckData'),\n strict: z.boolean().default(false).describe('If true, warnings cause valid to be false'),\n});\n\nexport type ValidateSlideDeckInput = z.infer<typeof validateSlideDeckSchema>;\n\nexport interface SlideValidationIssue {\n slideIndex: number;\n severity: 'error' | 'warning';\n rule: string;\n message: string;\n}\n\nexport interface SlideValidationResult {\n success: boolean;\n valid: boolean;\n score: number; // 0 - 100\n format: 'html' | 'markdown';\n slideCount: number;\n notesCoveragePercent: number;\n issues: SlideValidationIssue[];\n suggestions: string[];\n}\n\nfunction countWords(str: string): number {\n if (!str) return 0;\n return str.trim().split(/\\s+/).filter(Boolean).length;\n}\n\n/**\n * Validate structured HTML slide deck against design and pedagogical invariants\n */\nexport function validateHtmlSlideDeck(\n deck: {\n slides?: Array<{ layoutId: string; slots?: Record<string, any>; notes?: string }>;\n title?: string;\n subtitle?: string;\n theme?: string;\n },\n strict = false\n): SlideValidationResult {\n const issues: SlideValidationIssue[] = [];\n const suggestions: string[] = [];\n const slides = deck.slides || [];\n const slideCount = slides.length;\n\n if (slideCount === 0) {\n return {\n success: false,\n valid: false,\n score: 0,\n format: 'html',\n slideCount: 0,\n notesCoveragePercent: 0,\n issues: [{\n slideIndex: 0,\n severity: 'error',\n rule: 'EMPTY_DECK',\n message: 'Presentation deck contains no slides.',\n }],\n suggestions: ['Add at least one slide (e.g. hero-cover) to the deck.'],\n };\n }\n\n let notesCount = 0;\n let hasCover = false;\n let hasQuiz = false;\n let hasSummary = false;\n\n slides.forEach((slide, idx) => {\n const slideNumber = idx + 1;\n const layoutId = slide.layoutId as HtmlLayoutPresetId;\n const preset = HTML_SLIDE_PRESETS[layoutId];\n\n // 1. Layout Preset Existence\n if (!preset) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'error',\n rule: 'INVALID_LAYOUT_PRESET',\n message: `Unknown layoutId \"${slide.layoutId}\". Available presets: ${Object.keys(HTML_SLIDE_PRESETS).join(', ')}`,\n });\n return;\n }\n\n if (preset.category === 'cover' && idx === 0) hasCover = true;\n if (preset.id === 'checkpoint-quiz') hasQuiz = true;\n if (preset.id === 'summary-takeaways') hasSummary = true;\n\n // 2. Required Slots Check (with normalization fallback)\n const slots = normalizeSlideSlots(slide);\n for (const slotDef of preset.slots) {\n if (slotDef.required) {\n const val = slots[slotDef.name];\n if (val === undefined || val === null || (typeof val === 'string' && val.trim() === '')) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'error',\n rule: 'MISSING_REQUIRED_SLOT',\n message: `Slide ${slideNumber} (${layoutId}) is missing required slot \"${slotDef.name}\" (${slotDef.label}).`,\n });\n }\n }\n }\n\n // 3. Word Budget & Zero-Scroll Invariant\n for (const [key, val] of Object.entries(slots)) {\n if (typeof val === 'string') {\n const words = countWords(val);\n // Exclude executable code from word limit\n if (key !== 'code' && words > 50) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'warning',\n rule: 'ZERO_SCROLL_WORD_BUDGET',\n message: `Slot \"${key}\" on slide ${slideNumber} has ${words} words. Recommended max is 35-40 words to prevent vertical scrolling.`,\n });\n }\n } else if (Array.isArray(val)) {\n if (val.length > 5) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'warning',\n rule: 'EXCESSIVE_LIST_ITEMS',\n message: `List slot \"${key}\" on slide ${slideNumber} has ${val.length} items. Keep to 3-4 items for optimal readability.`,\n });\n }\n val.forEach((item, itemIdx) => {\n if (typeof item === 'string') {\n const w = countWords(item);\n if (w > 20) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'warning',\n rule: 'BULLET_WORD_BUDGET',\n message: `Bullet #${itemIdx + 1} in \"${key}\" on slide ${slideNumber} is ${w} words. Keep bullet points concise (< 15 words).`,\n });\n }\n }\n });\n }\n }\n\n // 4. Presenter Notes Coverage & 3-Part Inspection\n const rawNotes = Array.isArray(slide.notes)\n ? slide.notes.join('\\n')\n : (typeof slide.notes === 'string' ? slide.notes : '');\n\n if (rawNotes && rawNotes.trim().length > 0) {\n notesCount++;\n const notes = rawNotes.trim();\n const hasQuestion = notes.includes('?') || /cold-?call|question/i.test(notes);\n const hasTip = /scaffold|tip|analogy|hint/i.test(notes);\n\n if (!hasQuestion || !hasTip) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'warning',\n rule: 'INCOMPLETE_PRESENTER_NOTES',\n message: `Presenter notes for slide ${slideNumber} should follow the 3-part contract: Talk Track, Cold-Call Question, and Scaffolding Tip.`,\n });\n }\n } else {\n issues.push({\n slideIndex: slideNumber,\n severity: 'error',\n rule: 'MISSING_PRESENTER_NOTES',\n message: `Slide ${slideNumber} is missing presenter notes. 100% presenter notes coverage is required.`,\n });\n }\n });\n\n // 5. Pedagogical Architecture Pacing Checks\n if (slideCount >= 3 && !hasCover) {\n issues.push({\n slideIndex: 1,\n severity: 'warning',\n rule: 'MISSING_HERO_COVER',\n message: 'Slide 1 should ideally use the \"hero-cover\" layout preset to introduce the topic and objectives.',\n });\n }\n if (slideCount >= 6 && !hasQuiz) {\n issues.push({\n slideIndex: Math.floor(slideCount / 2),\n severity: 'warning',\n rule: 'MISSING_FORMATIVE_CHECKPOINT',\n message: `Deck has ${slideCount} slides but lacks a \"checkpoint-quiz\" for mid-lesson active recall.`,\n });\n }\n if (slideCount >= 4 && !hasSummary) {\n issues.push({\n slideIndex: slideCount,\n severity: 'warning',\n rule: 'MISSING_SUMMARY_SLIDE',\n message: 'Deck lacks a \"summary-takeaways\" wrap-up slide at the conclusion of the presentation.',\n });\n }\n\n // Calculate score\n const notesCoveragePercent = Math.round((notesCount / slideCount) * 100);\n const errorCount = issues.filter((i) => i.severity === 'error').length;\n const warningCount = issues.filter((i) => i.severity === 'warning').length;\n let score = 100 - errorCount * 15 - warningCount * 4;\n score = Math.max(0, Math.min(100, score));\n\n const valid = strict ? issues.length === 0 : errorCount === 0;\n\n if (errorCount > 0) {\n suggestions.push(`Resolve ${errorCount} blocking error(s) before presenting or publishing.`);\n }\n if (notesCoveragePercent < 100) {\n suggestions.push(`Increase presenter notes coverage from ${notesCoveragePercent}% to 100%.`);\n }\n if (!hasQuiz && slideCount >= 6) {\n suggestions.push('Add an interactive checkpoint quiz around the midpoint of the lesson.');\n }\n\n return {\n success: true,\n valid,\n score,\n format: 'html',\n slideCount,\n notesCoveragePercent,\n issues,\n suggestions,\n };\n}\n\n/**\n * Validate raw Markdown / Marp slide presentation\n */\nexport function validateMarkdownSlideDeck(markdown: string, strict = false): SlideValidationResult {\n const issues: SlideValidationIssue[] = [];\n const suggestions: string[] = [];\n\n if (!markdown || markdown.trim().length === 0) {\n return {\n success: false,\n valid: false,\n score: 0,\n format: 'markdown',\n slideCount: 0,\n notesCoveragePercent: 0,\n issues: [{\n slideIndex: 0,\n severity: 'error',\n rule: 'EMPTY_MARKDOWN',\n message: 'Markdown slide presentation is empty.',\n }],\n suggestions: ['Provide Markdown slide content delimited by \"---\".'],\n };\n }\n\n const { slides: rawSlides } = splitMarkdownSlides(markdown);\n const activeSlides = rawSlides.filter((s) => s.trim().length > 0);\n const slideCount = activeSlides.length;\n\n if (slideCount === 0) {\n return {\n success: false,\n valid: false,\n score: 0,\n format: 'markdown',\n slideCount: 0,\n notesCoveragePercent: 0,\n issues: [{\n slideIndex: 0,\n severity: 'error',\n rule: 'EMPTY_MARKDOWN',\n message: 'No slide content detected after stripping frontmatter.',\n }],\n suggestions: ['Add slide content separated by \"---\".'],\n };\n }\n\n let notesCount = 0;\n\n activeSlides.forEach((slideContent, idx) => {\n const slideNumber = idx + 1;\n const trimmed = slideContent.trim();\n\n // Check presenter notes in comment block <!-- Presenter Notes: ... -->\n const notesMatch = trimmed.match(/<!--\\s*(?:Presenter Notes:?[\\s\\S]*?|[\\s\\S]*?notes[\\s\\S]*?)-->/i);\n if (notesMatch) {\n notesCount++;\n const noteBody = notesMatch[0];\n const hasQuestion = noteBody.includes('?') || /cold-?call|question/i.test(noteBody);\n const hasTip = /scaffold|tip|analogy|hint/i.test(noteBody);\n if (!hasQuestion || !hasTip) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'warning',\n rule: 'INCOMPLETE_PRESENTER_NOTES',\n message: `Presenter notes on slide ${slideNumber} should include Talk Track, a Cold-Call Question, and a Scaffolding Tip.`,\n });\n }\n } else {\n issues.push({\n slideIndex: slideNumber,\n severity: 'error',\n rule: 'MISSING_PRESENTER_NOTES',\n message: `Slide ${slideNumber} is missing presenter notes comments (<!-- Presenter Notes: ... -->).`,\n });\n }\n\n // Check code blocks closure\n const codeBlockTokens = trimmed.match(/```/g);\n if (codeBlockTokens && codeBlockTokens.length % 2 !== 0) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'error',\n rule: 'UNCLOSED_CODE_BLOCK',\n message: `Slide ${slideNumber} contains unclosed code fence backticks (\\`\\`\\`).`,\n });\n }\n\n // Word count in body (excluding code blocks and notes)\n const cleanBody = trimmed\n .replace(/<!--[\\s\\S]*?-->/g, '')\n .replace(/```[\\s\\S]*?```/g, '');\n const words = countWords(cleanBody);\n if (words > 100) {\n issues.push({\n slideIndex: slideNumber,\n severity: 'warning',\n rule: 'ZERO_SCROLL_WORD_BUDGET',\n message: `Slide ${slideNumber} body has ${words} words. Keep within 40-70 words per slide to prevent vertical scroll.`,\n });\n }\n });\n\n const notesCoveragePercent = Math.round((notesCount / slideCount) * 100);\n const errorCount = issues.filter((i) => i.severity === 'error').length;\n const warningCount = issues.filter((i) => i.severity === 'warning').length;\n let score = 100 - errorCount * 15 - warningCount * 4;\n score = Math.max(0, Math.min(100, score));\n\n const valid = strict ? issues.length === 0 : errorCount === 0;\n\n return {\n success: true,\n valid,\n score,\n format: 'markdown',\n slideCount,\n notesCoveragePercent,\n issues,\n suggestions,\n };\n}\n\n/**\n * Universal executor for validating slide decks in either format\n */\nexport function executeValidateSlideDeck(input: ValidateSlideDeckInput): SlideValidationResult {\n const format = input.format || 'auto';\n\n if (format === 'html' || (format === 'auto' && input.htmlDeck && input.htmlDeck.slides)) {\n return validateHtmlSlideDeck(input.htmlDeck || { slides: [] }, input.strict);\n }\n\n if (format === 'markdown' || (format === 'auto' && input.markdown)) {\n return validateMarkdownSlideDeck(input.markdown || '', input.strict);\n }\n\n return {\n success: false,\n valid: false,\n score: 0,\n format: 'html',\n slideCount: 0,\n notesCoveragePercent: 0,\n issues: [{\n slideIndex: 0,\n severity: 'error',\n rule: 'INVALID_INPUT',\n message: 'Neither htmlDeck nor markdown was supplied for slide deck validation.',\n }],\n suggestions: ['Provide either \"htmlDeck\" object or \"markdown\" string in the validation parameters.'],\n };\n}\n\n// Alias for handler naming consistency\nexport const handleValidateSlideDeck = executeValidateSlideDeck;\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit — AI Tool Schemas for HTML Slide Engine (Zod)\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { z } from 'zod';\n\nexport const listHtmlSlidePresetsSchema = z.object({\n category: z\n .enum(['all', 'cover', 'content', 'split', 'grid', 'timeline', 'callout', 'assessment'])\n .optional()\n .describe('Optional category filter for HTML layout presets'),\n});\n\nexport const htmlSlideSlotDataSchema = z.object({\n layoutId: z\n .enum([\n 'hero-cover',\n 'split-concept-code',\n 'two-columns-compare',\n 'three-cards-grid',\n 'timeline-steps',\n 'metric-callout',\n 'checkpoint-quiz',\n 'summary-takeaways',\n ])\n .describe('Layout preset ID'),\n slots: z\n .record(z.any())\n .describe('Key-value slot dictionary matching the chosen layout requirements'),\n notes: z\n .string()\n .optional()\n .describe('Presenter speech track or teaching guide for this slide'),\n});\n\nexport const generateHtmlDeckSchema = z.object({\n title: z.string().describe('Title of the presentation / lesson deck'),\n subtitle: z.string().optional().describe('Subtitle or target audience / grade'),\n theme: z\n .enum(['blue-professional', 'editorial-forest', 'cobalt-grid', 'studio', 'monochrome'])\n .default('blue-professional')\n .describe('Visual theme palette'),\n slides: z\n .array(htmlSlideSlotDataSchema)\n .min(1)\n .describe('List of slides with designated layouts and slot contents'),\n});\n\nexport const createHtmlSlideSchema = z.object({\n layoutId: z\n .enum([\n 'hero-cover',\n 'split-concept-code',\n 'two-columns-compare',\n 'three-cards-grid',\n 'timeline-steps',\n 'metric-callout',\n 'checkpoint-quiz',\n 'summary-takeaways',\n ])\n .describe('Layout preset ID'),\n slots: z.record(z.any()).describe('Key-value content slots'),\n notes: z.string().optional().describe('Speaker talk track or question prompts'),\n});\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit — AI Slide HTML Prompt Contract\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport const SLIDE_HTML_PROMPT_CONTRACT = `\n# 🎨 HTML SLIDE ENGINE — AGENT GENERATION CONTRACT\n\nYou are an expert Presentation Designer and Curriculum Architect producing professional, high-impact slide decks.\nInstead of generating free-form HTML or brittle Markdown hacks, you MUST fill structured content into pre-tested **Layout Presets**.\n\n## Available Layout Presets & Required Slots:\n\n1. **hero-cover** (Cover / Title Slide)\n - \\`tag\\` (string): e.g. \"Unit 01 · Lesson 02\"\n - \\`title\\` (string): Main bold headline\n - \\`subtitle\\` (string): Subtitle or 1-sentence learning objective\n - \\`author\\` (string): Instructor / Organization\n - \\`date\\` (string): Course term or date\n\n2. **split-concept-code** (Theory + Code Snippet)\n - \\`tag\\` (string): Section topic tag\n - \\`title\\` (string): Topic heading\n - \\`points\\` (string[]): 3 to 4 concise bullet takeaways\n - \\`code\\` (string): Executable source code\n - \\`language\\` (string): Language name (e.g. \"python\", \"typescript\", \"swift\")\n - \\`codeNote\\` (string, optional): One-line hint or execution output\n\n3. **two-columns-compare** (Comparison / Pros vs Cons)\n - \\`tag\\` (string): Topic tag\n - \\`title\\` (string): Headline\n - \\`col1Title\\` (string): e.g. \"Synchronous I/O\"\n - \\`col1Items\\` (string[]): 3 to 4 points\n - \\`col2Title\\` (string): e.g. \"Asynchronous I/O\"\n - \\`col2Items\\` (string[]): 3 to 4 points\n\n4. **three-cards-grid** (3 Core Pillars / Architecture)\n - \\`tag\\` (string): e.g. \"Core Principles\"\n - \\`title\\` (string): Overview headline\n - \\`cards\\` (array of objects): Exactly 3 cards:\n - \\`badge\\`: e.g. \"01\", \"LAYER 1\"\n - \\`title\\`: Card headline\n - \\`desc\\`: 1-2 sentence description\n - \\`footer\\` (optional): Key takeaway\n\n5. **timeline-steps** (Algorithm / Execution Pipeline)\n - \\`tag\\` (string): e.g. \"Workflow\"\n - \\`title\\` (string): Headline\n - \\`steps\\` (array of objects): 3 to 5 steps:\n - \\`stepNum\\` (number/string): 1, 2, 3...\n - \\`title\\`: Step name\n - \\`desc\\`: What happens at this step\n\n6. **metric-callout** (Key Theorem / Benchmark Statistic)\n - \\`tag\\` (string): e.g. \"Time Complexity\"\n - \\`metric\\` (string): Big stat (e.g. \"O(log N)\", \"99.99%\", \"10x\")\n - \\`metricLabel\\` (string): e.g. \"Lookup Efficiency\"\n - \\`title\\` (string): Main takeaway\n - \\`desc\\` (string): Contextual explanation\n\n7. **checkpoint-quiz** (Interactive Checkpoint)\n - \\`tag\\` (string): e.g. \"Quick Knowledge Check\"\n - \\`question\\` (string): Clear question prompt\n - \\`options\\` (array of objects): 2 to 4 options:\n - \\`label\\`: \"A\", \"B\", \"C\", \"D\"\n - \\`text\\`: Option text\n - \\`explanation\\` (string): Explanatory rationale\n\n8. **summary-takeaways** (Wrap-Up / Next Steps)\n - \\`tag\\` (string): e.g. \"Recap\"\n - \\`title\\` (string): Wrap-up headline\n - \\`takeaways\\` (string[]): 3 to 4 memorable bullet points\n - \\`nextStep\\` (string): Teaser for the next lesson or project\n\n## Aesthetic & Quality Invariants (\"Anti-AI-Slop\"):\n- **Brevity is King (Zero-Scroll Invariant):** Each slide is calibrated for a 1920×1080 canvas. Maximum **35–40 words** per card or column; maximum **15 words** per bullet item. Never write dense multi-sentence paragraphs that cause vertical scrolling.\n- **Pedagogical Pacing:** Start with \\`hero-cover\\`, alternate between \\`split-concept-code\\`, \\`two-columns-compare\\` and \\`three-cards-grid\\`, insert a \\`checkpoint-quiz\\` midway, and finish with \\`summary-takeaways\\`.\n- **Theme Selection:**\n - \\`blue-professional\\`: General academic, clean engineering, trustworthy.\n - \\`cobalt-grid\\`: Advanced tech, algorithms, robotics, cybersecurity.\n - \\`editorial-forest\\`: Thoughtful design, literature, ethics, science.\n - \\`studio\\`: Minimalist product design, modern software.\n - \\`monochrome\\`: Pure high-contrast dark mode.\n\n## 🪄 Step Reveal & Progressive Disclosure:\n- The presentation shell supports sequential step reveal via mouse click or Space/Arrow keys.\n- Bullet lists (\\`points\\`, \\`col1Items\\`, \\`col2Items\\`), cards in \\`three-cards-grid\\`, and steps in \\`timeline-steps\\` reveal progressively one by one before navigating to the next slide.\n- In custom HTML slots, you can attach \\`class=\"step-reveal\"\\`, \\`data-step\\`, \\`data-reveal\\`, or \\`data-auto-reveal=\"true\"\\` on parent containers to enable click-by-click stepped appearance.\n\n## 🎙️ Mandatory 3-Part Presenter Notes Contract:\nEvery single slide MUST include the \\`notes\\` property structured with these 3 explicit components:\n1. **Talk Track:** 2-3 sentences of exact conversational speaking script for the teacher/presenter.\n2. **Cold-Call Check Question:** 1 diagnostic question to check understanding with a named student or attendee.\n3. **Scaffolding Tip:** 1 intuitive analogy or troubleshooting hint in case learners struggle with the concept.\n\nExample Notes:\n\\`\\`\\`markdown\nTalk Track: Here we contrast synchronous blocking I/O with asynchronous event-driven handling. Notice how threads remain idle while waiting for network responses.\nCold-Call: \"Jordan, looking at the left column, what happens to thread pool throughput when network latency quadruples?\"\nScaffolding Tip: Compare it to ordering coffee at a counter (async buzzer) versus waiting at the register until the cup is brewed (sync blocking).\n\\`\\`\\`\n\n## 🧱 MANDATORY JSON DECK OUTPUT STRUCTURE & SCHEMA:\nYou MUST output a single valid JSON object.\nCRITICAL: All layout data MUST be placed inside the \\`slots\\` object of each slide. Never put raw unstructured strings like \\`content: \"...\"\\`!\n\n\\`\\`\\`json\n{\n \"title\": \"Full Lesson Presentation Title\",\n \"theme\": \"blue-professional\",\n \"slides\": [\n {\n \"id\": 1,\n \"layoutId\": \"hero-cover\",\n \"slots\": {\n \"tag\": \"Unit 01 · Lesson 01\",\n \"title\": \"macOS & Xcode Environment Setup\",\n \"subtitle\": \"Master the Apple developer toolchain and build your first SwiftUI application lifecycle\",\n \"author\": \"Curriculum OS\",\n \"date\": \"2026\"\n },\n \"notes\": \"Talk Track: Welcome everyone. Today we establish our core iOS development environment...\\\\nCold-Call: 'Alex, why do we need Xcode Command Line Tools?'\\\\nScaffolding Tip: Think of Xcode as the full workshop and the SDK as the raw materials.\"\n },\n {\n \"id\": 2,\n \"layoutId\": \"split-concept-code\",\n \"slots\": {\n \"tag\": \"Architecture & Syntax\",\n \"title\": \"SwiftUI App Entry Point\",\n \"points\": [\n \"@main attribute designates the entry point of the app\",\n \"App protocol defines the structure and scene hierarchy\",\n \"WindowGroup manages the root view lifecycle across platforms\"\n ],\n \"code\": \"import SwiftUI\\\\n\\\\n@main\\\\nstruct MyApp: App {\\\\n var body: some Scene {\\\\n WindowGroup {\\\\n ContentView()\\\\n }\\\\n }\\\\n}\",\n \"language\": \"swift\",\n \"codeNote\": \"Notice how Scene encapsulates WindowGroup automatically\"\n },\n \"notes\": \"Talk Track: ...\\\\nCold-Call: ...\\\\nScaffolding Tip: ...\"\n },\n {\n \"id\": 3,\n \"layoutId\": \"three-cards-grid\",\n \"slots\": {\n \"tag\": \"Core Pillars\",\n \"title\": \"Three Pillars of App State\",\n \"cards\": [\n { \"badge\": \"01\", \"title\": \"Active State\", \"desc\": \"App is in foreground and responding to user events directly.\" },\n { \"badge\": \"02\", \"title\": \"Inactive State\", \"desc\": \"App is transitioning, interrupted by system dialogs or Control Center.\" },\n { \"badge\": \"03\", \"title\": \"Background State\", \"desc\": \"Executing background tasks or preparing for memory suspension.\" }\n ]\n },\n \"notes\": \"Talk Track: ...\\\\nCold-Call: ...\\\\nScaffolding Tip: ...\"\n },\n {\n \"id\": 4,\n \"layoutId\": \"timeline-steps\",\n \"slots\": {\n \"tag\": \"Step-by-Step\",\n \"title\": \"Xcode Setup Workflow\",\n \"steps\": [\n { \"stepNum\": 1, \"title\": \"Download Xcode\", \"desc\": \"Install latest Xcode from the Mac App Store\" },\n { \"stepNum\": 2, \"title\": \"Command Line Tools\", \"desc\": \"Run xcode-select --install in Terminal\" },\n { \"stepNum\": 3, \"title\": \"Select Simulators\", \"desc\": \"Download iOS 18+ runtime simulators\" },\n { \"stepNum\": 4, \"title\": \"Verify Build\", \"desc\": \"Create a new SwiftUI project and press Cmd+R\" }\n ]\n },\n \"notes\": \"Talk Track: ...\\\\nCold-Call: ...\\\\nScaffolding Tip: ...\"\n },\n {\n \"id\": 5,\n \"layoutId\": \"two-columns-compare\",\n \"slots\": {\n \"tag\": \"Comparison\",\n \"title\": \"SwiftUI vs UIKit Architecture\",\n \"col1Title\": \"SwiftUI (Declarative)\",\n \"col1Items\": [\n \"State drives the UI automatically\",\n \"Lightweight immutable structs\",\n \"Cross-platform unified API\"\n ],\n \"col2Title\": \"UIKit (Imperative)\",\n \"col2Items\": [\n \"Manual view controller manipulation\",\n \"Heavyweight class hierarchies\",\n \"Explicit event-driven updates\"\n ]\n },\n \"notes\": \"Talk Track: ...\\\\nCold-Call: ...\\\\nScaffolding Tip: ...\"\n },\n {\n \"id\": 6,\n \"layoutId\": \"checkpoint-quiz\",\n \"slots\": {\n \"tag\": \"Knowledge Check\",\n \"question\": \"Which SwiftUI modifier is used to observe external observable state objects?\",\n \"options\": [\n { \"label\": \"A\", \"text\": \"@State\" },\n { \"label\": \"B\", \"text\": \"@StateObject / @ObservedObject\" },\n { \"label\": \"C\", \"text\": \"@Binding\" },\n { \"label\": \"D\", \"text\": \"@Environment\" }\n ],\n \"explanation\": \"@StateObject manages the lifecycle of reference-type ObservableObjects, while @State is for value types.\"\n },\n \"notes\": \"Talk Track: ...\\\\nCold-Call: ...\\\\nScaffolding Tip: ...\"\n },\n {\n \"id\": 7,\n \"layoutId\": \"summary-takeaways\",\n \"slots\": {\n \"tag\": \"Recap & Next\",\n \"title\": \"Lesson Summary & Key Takeaways\",\n \"takeaways\": [\n \"Configured complete developer toolchain with Xcode 16+\",\n \"Understood SwiftUI declarative lifecycle and @main entry point\",\n \"Mastered App State transitions between active, inactive, and background\"\n ],\n \"nextStep\": \"Lesson 02: State Management & Reactive Data Flow with @State and @Binding\"\n },\n \"notes\": \"Talk Track: ...\\\\nCold-Call: ...\\\\nScaffolding Tip: ...\"\n }\n ]\n}\n\\`\\`\\`\n\n## 🚫 STRICT ANTI-SLOP CONSTRAINTS:\n1. NEVER output a raw unstructured string like \\`content: \"...\"\\` or \\`content: \"Concept: ... Code snippet: ...\"\\`. All slide content MUST be placed inside the \\`slots\\` object with its specific keys (\\`points\\`, \\`code\\`, \\`cards\\`, \\`steps\\`, \\`options\\`, \\`takeaways\\`).\n2. NEVER use ellipsis \\`...\\` or placeholder comments in \\`code\\`. Every code snippet MUST be real, fully typed, syntax-valid, and pedagogical.\n3. NEVER leave \\`slots\\` empty \\`{}\\`.\n4. Output 6 to 8 substantive, rich slides covering the lesson plan thoroughly.\n`;\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit — AI Tool Handlers for HTML Slide Engine\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { HTML_SLIDE_PRESETS } from '../../html-engine/presets.js';\nimport { HTML_THEMES } from '../../html-engine/themes.js';\nimport { compileHtmlDeck } from '../../html-engine/compiler.js';\nimport type { HtmlDeckData, HtmlSlideSlotData } from '../../html-engine/types.js';\n\nexport function handleListHtmlSlidePresets(input: { category?: string }) {\n const category = input.category || 'all';\n const presets = Object.values(HTML_SLIDE_PRESETS)\n .filter((p) => category === 'all' || p.category === category)\n .map((p) => ({\n id: p.id,\n name: p.name,\n category: p.category,\n description: p.description,\n slots: p.slots.map((s) => ({\n name: s.name,\n label: s.label,\n type: s.type,\n required: Boolean(s.required),\n description: s.description,\n })),\n }));\n\n return {\n success: true,\n presets,\n availableThemes: Object.keys(HTML_THEMES),\n };\n}\n\nexport function handleGenerateHtmlDeck(input: HtmlDeckData) {\n try {\n const result = compileHtmlDeck(input);\n return {\n success: true,\n title: result.title,\n slideCount: result.slideCount,\n theme: result.theme.id,\n html: result.html,\n };\n } catch (err: any) {\n return {\n success: false,\n error: err.message || 'Failed to compile HTML slide deck',\n };\n }\n}\n\nexport function handleCreateHtmlSlide(input: HtmlSlideSlotData) {\n const preset = HTML_SLIDE_PRESETS[input.layoutId];\n if (!preset) {\n return {\n success: false,\n error: `Unknown layout preset: ${input.layoutId}`,\n };\n }\n\n return {\n success: true,\n slide: {\n layoutId: input.layoutId,\n slots: input.slots,\n notes: input.notes,\n },\n };\n}\n\n// Aliases for unified naming convention across AI toolbelt\nexport const executeListHtmlSlidePresets = handleListHtmlSlidePresets;\nexport const executeGenerateHtmlDeck = handleGenerateHtmlDeck;\nexport const executeCreateHtmlSlide = handleCreateHtmlSlide;\n"]}
@@ -3369,6 +3369,219 @@ function generateHtmlShell(options) {
3369
3369
  </html>`;
3370
3370
  }
3371
3371
 
3372
+ // src/html-engine/normalizer.ts
3373
+ function normalizeSlideSlots(slide) {
3374
+ if (!slide || typeof slide !== "object") {
3375
+ return { title: "Slide" };
3376
+ }
3377
+ const slots = {
3378
+ ...slide,
3379
+ ...slide.slots || {}
3380
+ };
3381
+ delete slots.slots;
3382
+ slots.title = String(slots.title || slide.title || slide.heading || slide.name || "").trim();
3383
+ slots.tag = String(slots.tag || slide.tag || slide.badge || "").trim();
3384
+ const rawContent = typeof slots.content === "string" && slots.content.trim() ? slots.content.trim() : typeof slide.content === "string" && slide.content.trim() ? slide.content.trim() : "";
3385
+ const layoutId = slide.layoutId || "hero-cover";
3386
+ switch (layoutId) {
3387
+ case "hero-cover": {
3388
+ slots.subtitle = slots.subtitle || slide.subtitle || slots.desc || rawContent || "";
3389
+ slots.author = slots.author || slide.author || "";
3390
+ slots.date = slots.date || slide.date || "";
3391
+ break;
3392
+ }
3393
+ case "split-concept-code": {
3394
+ if (!slots.code) {
3395
+ if (slide.code) {
3396
+ slots.code = slide.code;
3397
+ } else if (rawContent) {
3398
+ const fenceMatch = rawContent.match(/```(?:\w+)?\s*\n?([\s\S]*?)\n?```/);
3399
+ if (fenceMatch) {
3400
+ slots.code = fenceMatch[1].trim();
3401
+ } else if (/Code(?:\s+snippet)?:\s*/i.test(rawContent)) {
3402
+ const parts = rawContent.split(/Code(?:\s+snippet)?:\s*/i);
3403
+ if (parts[1] && parts[1].trim()) {
3404
+ slots.code = parts[1].trim();
3405
+ }
3406
+ }
3407
+ }
3408
+ }
3409
+ if (!Array.isArray(slots.points) || slots.points.length === 0) {
3410
+ if (Array.isArray(slide.points) && slide.points.length > 0) {
3411
+ slots.points = slide.points;
3412
+ } else if (rawContent) {
3413
+ const textOnly = rawContent.replace(/```[\s\S]*?```/g, "").replace(/Code(?:\s+snippet)?:\s*[\s\S]*/i, "").trim();
3414
+ const lines = textOnly.split(/\n|\.\s+/).map((l) => l.replace(/^(?:Concept:\s*|[-*•]|\d+\.)\s*/i, "").trim()).filter((l) => l.length > 3);
3415
+ slots.points = lines.length > 0 ? lines.slice(0, 4) : [textOnly || slots.title || "Core Concept"];
3416
+ }
3417
+ }
3418
+ if (!slots.code || slots.code === "...") {
3419
+ const lang = (slots.language || "code").toLowerCase();
3420
+ if (lang.includes("swift")) {
3421
+ slots.code = `// ${slots.title || "Swift Implementation"}
3422
+ import SwiftUI
3423
+
3424
+ struct PreviewView: View {
3425
+ var body: some View {
3426
+ Text("${slots.title || "Hello, World!"}")
3427
+ .padding()
3428
+ }
3429
+ }`;
3430
+ slots.language = slots.language || "swift";
3431
+ } else if (lang.includes("py")) {
3432
+ slots.code = `# ${slots.title || "Python Implementation"}
3433
+ def execute():
3434
+ print("${slots.title || "Ready"}")
3435
+
3436
+ execute()`;
3437
+ slots.language = slots.language || "python";
3438
+ } else {
3439
+ slots.code = `// ${slots.title || "Code Example"}
3440
+ function main() {
3441
+ console.log("${slots.title || "Executing"}");
3442
+ }
3443
+ main();`;
3444
+ slots.language = slots.language || "typescript";
3445
+ }
3446
+ }
3447
+ break;
3448
+ }
3449
+ case "two-columns-compare": {
3450
+ slots.col1Title = slots.col1Title || slide.col1Title || "Approach A";
3451
+ slots.col2Title = slots.col2Title || slide.col2Title || "Approach B";
3452
+ if (!Array.isArray(slots.col1Items) || slots.col1Items.length === 0) {
3453
+ if (Array.isArray(slide.col1Items) && slide.col1Items.length > 0) {
3454
+ slots.col1Items = slide.col1Items;
3455
+ } else if (rawContent) {
3456
+ const items = rawContent.split(/\n|\.\s+/).map((l) => l.replace(/^(?:[-*•]|\d+\.)\s*/, "").trim()).filter((l) => l.length > 3);
3457
+ const half = Math.max(1, Math.ceil(items.length / 2));
3458
+ slots.col1Items = items.slice(0, half);
3459
+ if (!slots.col2Items || !Array.isArray(slots.col2Items)) {
3460
+ slots.col2Items = items.slice(half);
3461
+ }
3462
+ }
3463
+ }
3464
+ slots.col1Items = Array.isArray(slots.col1Items) && slots.col1Items.length > 0 ? slots.col1Items : ["Primary Characteristics", "Standard Practice"];
3465
+ slots.col2Items = Array.isArray(slots.col2Items) && slots.col2Items.length > 0 ? slots.col2Items : Array.isArray(slide.col2Items) ? slide.col2Items : ["Alternative Paradigm", "Trade-offs & Edge Cases"];
3466
+ break;
3467
+ }
3468
+ case "three-cards-grid": {
3469
+ if (!Array.isArray(slots.cards) || slots.cards.length === 0) {
3470
+ if (Array.isArray(slide.cards) && slide.cards.length > 0) {
3471
+ slots.cards = slide.cards;
3472
+ } else if (rawContent) {
3473
+ const cardTokens = rawContent.split(/Card\s*\d+:\s*|(?:\r?\n){2,}|\.\s+/i).map((c) => c.trim()).filter(Boolean);
3474
+ if (cardTokens.length >= 2) {
3475
+ slots.cards = cardTokens.slice(0, 3).map((txt, idx) => {
3476
+ const colonIdx = txt.indexOf(":");
3477
+ const cardTitle = colonIdx > 0 && colonIdx < 30 ? txt.slice(0, colonIdx).trim() : `Pillar ${idx + 1}`;
3478
+ const cardDesc = colonIdx > 0 && colonIdx < 30 ? txt.slice(colonIdx + 1).trim() : txt;
3479
+ return { badge: `0${idx + 1}`, title: cardTitle, desc: cardDesc };
3480
+ });
3481
+ } else {
3482
+ const lines = rawContent.split(/\n|\.\s+/).map((l) => l.replace(/^(?:[-*•]|\d+\.)\s*/, "").trim()).filter((l) => l.length > 3);
3483
+ slots.cards = lines.slice(0, 3).map((line, idx) => ({
3484
+ badge: `0${idx + 1}`,
3485
+ title: line.split(":")[0]?.slice(0, 30) || `Pillar 0${idx + 1}`,
3486
+ desc: line
3487
+ }));
3488
+ }
3489
+ }
3490
+ }
3491
+ if (!Array.isArray(slots.cards) || slots.cards.length === 0) {
3492
+ slots.cards = [
3493
+ { badge: "01", title: "Foundation", desc: rawContent || "Core fundamentals and design principles" },
3494
+ { badge: "02", title: "Architecture", desc: "Component relationships and data flow patterns" },
3495
+ { badge: "03", title: "Practice", desc: "Real-world application and hands-on synthesis" }
3496
+ ];
3497
+ }
3498
+ break;
3499
+ }
3500
+ case "timeline-steps": {
3501
+ if (!Array.isArray(slots.steps) || slots.steps.length === 0) {
3502
+ if (Array.isArray(slide.steps) && slide.steps.length > 0) {
3503
+ slots.steps = slide.steps;
3504
+ } else if (rawContent) {
3505
+ const stepMatches = rawContent.split(/(?:\d+\.|\bStep\s*\d+:)\s*/i).map((s) => s.trim()).filter(Boolean);
3506
+ if (stepMatches.length > 0) {
3507
+ slots.steps = stepMatches.slice(0, 5).map((txt, idx) => {
3508
+ const periodIdx = txt.indexOf(".");
3509
+ const stepTitle = periodIdx > 0 && periodIdx < 35 ? txt.slice(0, periodIdx).trim() : txt.slice(0, 30);
3510
+ const stepDesc = periodIdx > 0 && periodIdx < 35 ? txt.slice(periodIdx + 1).trim() : txt;
3511
+ return { stepNum: idx + 1, title: stepTitle || `Step ${idx + 1}`, desc: stepDesc || stepTitle };
3512
+ });
3513
+ }
3514
+ }
3515
+ }
3516
+ if (!Array.isArray(slots.steps) || slots.steps.length === 0) {
3517
+ slots.steps = [
3518
+ { stepNum: 1, title: "Analyze", desc: "Deconstruct requirements and constraints" },
3519
+ { stepNum: 2, title: "Implement", desc: rawContent || "Build component logic and structure" },
3520
+ { stepNum: 3, title: "Verify", desc: "Test behavior and validate outcomes" }
3521
+ ];
3522
+ }
3523
+ break;
3524
+ }
3525
+ case "metric-callout": {
3526
+ slots.desc = slots.desc || slide.desc || rawContent || "";
3527
+ slots.metricLabel = slots.metricLabel || slide.metricLabel || "KEY METRIC";
3528
+ if (!slots.metric) {
3529
+ const numMatch = (slots.desc || slots.title).match(/(\d+(?:\.\d+)?%?|O\([^)]+\)|\d+x|\b[A-Z0-9_-]{2,}\b)/i);
3530
+ slots.metric = numMatch ? numMatch[1] : "100%";
3531
+ }
3532
+ break;
3533
+ }
3534
+ case "checkpoint-quiz": {
3535
+ slots.question = slots.question || slide.question || slots.title || "Check Your Understanding";
3536
+ if (!Array.isArray(slots.options) || slots.options.length === 0) {
3537
+ if (Array.isArray(slide.options) && slide.options.length > 0) {
3538
+ slots.options = slide.options;
3539
+ } else if (rawContent) {
3540
+ const items = rawContent.split(/(?:\d+\.|\b[A-D]\))\s*/i).map((l) => l.trim()).filter((l) => l.length > 3);
3541
+ if (items.length >= 2) {
3542
+ slots.options = items.slice(0, 4).map((text, idx) => ({
3543
+ label: String.fromCharCode(65 + idx),
3544
+ text
3545
+ }));
3546
+ }
3547
+ }
3548
+ }
3549
+ if (!Array.isArray(slots.options) || slots.options.length === 0) {
3550
+ slots.options = [
3551
+ { label: "A", text: "Option A (Core Concept)" },
3552
+ { label: "B", text: "Option B (Alternative Approach)" },
3553
+ { label: "C", text: "Option C (Edge Case)" }
3554
+ ];
3555
+ }
3556
+ slots.explanation = slots.explanation || slide.explanation || "";
3557
+ break;
3558
+ }
3559
+ case "summary-takeaways": {
3560
+ if (!Array.isArray(slots.takeaways) || slots.takeaways.length === 0) {
3561
+ if (Array.isArray(slide.takeaways) && slide.takeaways.length > 0) {
3562
+ slots.takeaways = slide.takeaways;
3563
+ } else if (rawContent) {
3564
+ const lines = rawContent.split(/\n|\.\s+/).map((l) => l.replace(/^(?:[-*•]|\d+\.)\s*/, "").trim()).filter((l) => l.length > 3);
3565
+ slots.takeaways = lines.length > 0 ? lines.slice(0, 4) : [rawContent];
3566
+ }
3567
+ }
3568
+ if (!Array.isArray(slots.takeaways) || slots.takeaways.length === 0) {
3569
+ slots.takeaways = [
3570
+ slots.title || "Key lesson principles mastered",
3571
+ "Applied hands-on practice through guided examples",
3572
+ "Ready for independent challenge and synthesis"
3573
+ ];
3574
+ }
3575
+ slots.nextStep = slots.nextStep || slide.nextStep || "Next: Practical Hands-On Lab";
3576
+ break;
3577
+ }
3578
+ }
3579
+ if (rawContent && !slots.rawContent) {
3580
+ slots.rawContent = rawContent;
3581
+ }
3582
+ return slots;
3583
+ }
3584
+
3372
3585
  // src/html-engine/compiler.ts
3373
3586
  function compileHtmlDeck(deckData, options) {
3374
3587
  const theme = options?.themeOverride || resolveHtmlTheme(deckData.theme);
@@ -3376,7 +3589,8 @@ function compileHtmlDeck(deckData, options) {
3376
3589
  const slideCount = Math.max(slides.length, 1);
3377
3590
  const renderedSlides = slides.map((slide, index) => {
3378
3591
  const preset = HTML_SLIDE_PRESETS[slide.layoutId] || HTML_SLIDE_PRESETS["hero-cover"];
3379
- const innerHtml = preset.template(slide.slots || {}, theme);
3592
+ const normalizedSlots = normalizeSlideSlots(slide);
3593
+ const innerHtml = preset.template(normalizedSlots, theme);
3380
3594
  const notesAttr = slide.notes ? ` data-notes="${encodeURIComponent(slide.notes)}"` : "";
3381
3595
  const customClass = slide.customClass ? ` ${slide.customClass}` : "";
3382
3596
  return `
@@ -3403,6 +3617,6 @@ function compileHtmlDeck(deckData, options) {
3403
3617
  };
3404
3618
  }
3405
3619
 
3406
- export { HTML_SLIDE_PRESETS, HTML_THEMES, SLIDE_LAYOUT_PRESETS, compileHtmlDeck, generateHtmlShell, getSlideLayoutPresetById, getSlideLayoutPresetsByCategory, removeSlideElementFromMarkdown, resolveHtmlTheme, serializeLayoutToComment, splitMarkdownSlides, updateSlideLayoutInMarkdown, updateSlideTextInMarkdown };
3407
- //# sourceMappingURL=chunk-YPYAP4TF.js.map
3408
- //# sourceMappingURL=chunk-YPYAP4TF.js.map
3620
+ export { HTML_SLIDE_PRESETS, HTML_THEMES, SLIDE_LAYOUT_PRESETS, compileHtmlDeck, generateHtmlShell, getSlideLayoutPresetById, getSlideLayoutPresetsByCategory, normalizeSlideSlots, removeSlideElementFromMarkdown, resolveHtmlTheme, serializeLayoutToComment, splitMarkdownSlides, updateSlideLayoutInMarkdown, updateSlideTextInMarkdown };
3621
+ //# sourceMappingURL=chunk-7QHDWDSB.js.map
3622
+ //# sourceMappingURL=chunk-7QHDWDSB.js.map