@thanh01.pmt/curriculum-kit 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +22 -0
  2. package/dist/ai/index.cjs +4980 -0
  3. package/dist/ai/index.cjs.map +1 -0
  4. package/dist/ai/index.d.cts +1287 -0
  5. package/dist/ai/index.d.ts +1287 -0
  6. package/dist/ai/index.mjs +4924 -0
  7. package/dist/ai/index.mjs.map +1 -0
  8. package/dist/index.cjs +15308 -0
  9. package/dist/index.cjs.map +1 -0
  10. package/dist/index.d.cts +747 -0
  11. package/dist/index.d.ts +747 -0
  12. package/dist/index.mjs +14965 -0
  13. package/dist/index.mjs.map +1 -0
  14. package/dist/media/index.cjs +1238 -0
  15. package/dist/media/index.cjs.map +1 -0
  16. package/dist/media/index.d.cts +254 -0
  17. package/dist/media/index.d.ts +254 -0
  18. package/dist/media/index.mjs +1221 -0
  19. package/dist/media/index.mjs.map +1 -0
  20. package/dist/milestoneBundleGenerator-CbXhs1CP.d.ts +62 -0
  21. package/dist/milestoneBundleGenerator-DrBtHzBO.d.cts +62 -0
  22. package/dist/pipeline/index.cjs +4894 -0
  23. package/dist/pipeline/index.cjs.map +1 -0
  24. package/dist/pipeline/index.d.cts +161 -0
  25. package/dist/pipeline/index.d.ts +161 -0
  26. package/dist/pipeline/index.mjs +4869 -0
  27. package/dist/pipeline/index.mjs.map +1 -0
  28. package/dist/provider-factory-DH3udYlN.d.cts +25 -0
  29. package/dist/provider-factory-DH3udYlN.d.ts +25 -0
  30. package/dist/publishers/index.cjs +575 -0
  31. package/dist/publishers/index.cjs.map +1 -0
  32. package/dist/publishers/index.d.cts +85 -0
  33. package/dist/publishers/index.d.ts +85 -0
  34. package/dist/publishers/index.mjs +561 -0
  35. package/dist/publishers/index.mjs.map +1 -0
  36. package/dist/schemas/index.cjs +1640 -0
  37. package/dist/schemas/index.cjs.map +1 -0
  38. package/dist/schemas/index.d.cts +14194 -0
  39. package/dist/schemas/index.d.ts +14194 -0
  40. package/dist/schemas/index.mjs +1517 -0
  41. package/dist/schemas/index.mjs.map +1 -0
  42. package/dist/standards/index.cjs +910 -0
  43. package/dist/standards/index.cjs.map +1 -0
  44. package/dist/standards/index.d.cts +130 -0
  45. package/dist/standards/index.d.ts +130 -0
  46. package/dist/standards/index.mjs +890 -0
  47. package/dist/standards/index.mjs.map +1 -0
  48. package/dist/standardsCoverageGate-BWAkXY76.d.cts +767 -0
  49. package/dist/standardsCoverageGate-BWAkXY76.d.ts +767 -0
  50. package/dist/storage/index.cjs +595 -0
  51. package/dist/storage/index.cjs.map +1 -0
  52. package/dist/storage/index.d.cts +77 -0
  53. package/dist/storage/index.d.ts +77 -0
  54. package/dist/storage/index.mjs +583 -0
  55. package/dist/storage/index.mjs.map +1 -0
  56. package/dist/streamRunner-C7j5LKon.d.cts +60 -0
  57. package/dist/streamRunner-C7j5LKon.d.ts +60 -0
  58. package/dist/supabasePublisher-C627qXFT.d.cts +63 -0
  59. package/dist/supabasePublisher-C627qXFT.d.ts +63 -0
  60. package/dist/types-BUJGYiep.d.cts +89 -0
  61. package/dist/types-BUJGYiep.d.ts +89 -0
  62. package/dist/workflow/index.cjs +5266 -0
  63. package/dist/workflow/index.cjs.map +1 -0
  64. package/dist/workflow/index.d.cts +295 -0
  65. package/dist/workflow/index.d.ts +295 -0
  66. package/dist/workflow/index.mjs +5216 -0
  67. package/dist/workflow/index.mjs.map +1 -0
  68. package/package.json +105 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/storage/fileSystemCurriculumAdapter.ts","../../src/storage/supabaseCurriculumAdapter.ts","../../src/storage/factory.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\nimport type { \n ICurriculumStorage, \n SotDocument, \n LessonArtifactSummary, \n ProjectStatusReport,\n PipelineState,\n ArtifactLifecycleInfo\n} from './types';\n\nexport function computeContentHash(content: string): string {\n return 'sha256:' + crypto.createHash('sha256').update(content.trim(), 'utf-8').digest('hex');\n}\n\nexport const STANDARD_SOT_FILES = [\n 'PROJECT_BRIEF.md',\n 'LEARNER_PROFILE.md',\n 'CURRICULUM_FRAMEWORK.md',\n 'PROJECT_STATUS.md',\n 'CONTENT_STYLE_GUIDE.md',\n 'ART_DIRECTION.md',\n 'REFERENCE_PACK.md'\n];\n\nexport interface FileSystemStorageOptions {\n baseDir?: string;\n}\n\nexport class FileSystemCurriculumAdapter implements ICurriculumStorage {\n private baseDir: string;\n\n constructor(options: FileSystemStorageOptions = {}) {\n this.baseDir = options.baseDir || path.resolve(process.cwd(), 'output', 'projects');\n }\n\n private getProjectDir(projectId: string): string {\n const raw = (projectId || '').replace('proj_', '');\n const directPath = path.join(this.baseDir, raw);\n if (fs.existsSync(directPath)) return directPath;\n const fullIdPath = path.join(this.baseDir, projectId);\n if (fs.existsSync(fullIdPath)) return fullIdPath;\n return directPath;\n }\n\n /** Ensures the resolved path stays within the project directory (prevents path traversal). */\n private assertInsideProject(projectDir: string, targetPath: string): void {\n const resolvedProject = path.resolve(projectDir);\n const resolvedTarget = path.resolve(targetPath);\n if (!resolvedTarget.startsWith(resolvedProject + path.sep) && resolvedTarget !== resolvedProject) {\n throw new Error(`[FileSystemCurriculumAdapter] Path traversal blocked: ${targetPath} is outside project directory ${projectDir}`);\n }\n }\n\n async projectExists(projectId: string): Promise<boolean> {\n return fs.existsSync(this.getProjectDir(projectId));\n }\n\n async readSotDocument(projectId: string, filename: string): Promise<string | null> {\n const projectDir = this.getProjectDir(projectId);\n const possiblePaths = [\n path.join(projectDir, '_sot', filename),\n path.join(projectDir, filename),\n ];\n\n for (const p of possiblePaths) {\n if (fs.existsSync(p) && fs.statSync(p).isFile()) {\n return fs.readFileSync(p, 'utf-8');\n }\n }\n return null;\n }\n\n async listSotDocuments(projectId: string): Promise<SotDocument[]> {\n const projectDir = this.getProjectDir(projectId);\n const sotDir = path.join(projectDir, '_sot');\n\n return STANDARD_SOT_FILES.map(filename => {\n const p = fs.existsSync(path.join(sotDir, filename))\n ? path.join(sotDir, filename)\n : (fs.existsSync(path.join(projectDir, filename)) ? path.join(projectDir, filename) : null);\n\n if (p && fs.existsSync(p)) {\n const stats = fs.statSync(p);\n return {\n name: filename.replace('.md', '').replace(/_/g, ' '),\n filename,\n exists: true,\n sizeBytes: stats.size\n };\n }\n\n return {\n name: filename.replace('.md', '').replace(/_/g, ' '),\n filename,\n exists: false,\n sizeBytes: 0\n };\n });\n }\n\n async readArtifact(projectId: string, relPathOrIdentifier: string): Promise<string | null> {\n const projectDir = this.getProjectDir(projectId);\n\n // Block path traversal attempts\n const directCandidate = path.join(projectDir, relPathOrIdentifier);\n this.assertInsideProject(projectDir, directCandidate);\n\n // 1. Direct file path lookup\n const possiblePaths = [\n directCandidate,\n path.join(projectDir, '_sot', relPathOrIdentifier),\n path.join(projectDir, 'lessons', relPathOrIdentifier),\n path.join(projectDir, '_sot', path.basename(relPathOrIdentifier)),\n path.join(projectDir, 'lessons', path.basename(relPathOrIdentifier)),\n ];\n\n for (const p of possiblePaths) {\n if (fs.existsSync(p) && fs.statSync(p).isFile()) {\n return fs.readFileSync(p, 'utf-8');\n }\n }\n\n // If relPathOrIdentifier was an explicit filename with extension, don't guess\n if (relPathOrIdentifier.includes('.md') || relPathOrIdentifier.includes('/')) {\n return null;\n }\n\n // 2. Intelligent Identifier Resolution for query strings (e.g. \"U01_M01_L01 — Giáo án 5E\")\n const lessonMatch = relPathOrIdentifier.match(/U\\d+_M\\d+_L\\d+/i);\n if (lessonMatch) {\n const lessonId = lessonMatch[0].toUpperCase();\n const lessonDir = path.join(projectDir, 'lessons', lessonId);\n\n if (fs.existsSync(lessonDir) && fs.statSync(lessonDir).isDirectory()) {\n const lower = relPathOrIdentifier.toLowerCase();\n let artifactPrefix = 'LESSON';\n if (lower.includes('act') || lower.includes('lab') || lower.includes('thực hành')) {\n artifactPrefix = 'ACT';\n } else if (lower.includes('quiz') || lower.includes('trắc nghiệm') || lower.includes('đánh giá')) {\n artifactPrefix = 'QUIZ';\n } else if (lower.includes('slide') || lower.includes('bài giảng') || lower.includes('trình chiếu')) {\n artifactPrefix = 'SLIDE';\n } else if (lower.includes('guide') || lower.includes('hướng dẫn')) {\n artifactPrefix = 'GUIDE';\n } else if (lower.includes('wks') || lower.includes('worksheet') || lower.includes('phiếu bài tập')) {\n artifactPrefix = 'WKS';\n } else if (lower.includes('handout') || lower.includes('tài liệu')) {\n artifactPrefix = 'HANDOUT';\n } else if (lower.includes('code')) {\n artifactPrefix = 'CODE';\n } else if (lower.includes('ext') || lower.includes('extension')) {\n artifactPrefix = 'EXT';\n }\n\n const candidateFile = path.join(lessonDir, `${artifactPrefix}_${lessonId}.md`);\n if (fs.existsSync(candidateFile)) {\n return fs.readFileSync(candidateFile, 'utf-8');\n }\n }\n }\n\n return null;\n }\n\n async saveArtifact(projectId: string, relPath: string, content: string): Promise<void> {\n const projectDir = this.getProjectDir(projectId);\n const targetPath = path.join(projectDir, relPath);\n this.assertInsideProject(projectDir, targetPath);\n const targetDir = path.dirname(targetPath);\n\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n\n // Version history (P2): ghi đè file đã tồn tại → chép bản cũ vào .history/ trước (giữ tối đa 10 bản gần nhất)\n if (fs.existsSync(targetPath)) {\n try {\n const oldContent = fs.readFileSync(targetPath, 'utf-8');\n if (oldContent !== content) {\n const historyDir = path.join(projectDir, '.history', relPath);\n fs.mkdirSync(historyDir, { recursive: true });\n fs.writeFileSync(path.join(historyDir, `${Date.now()}.md`), oldContent, 'utf-8');\n const versions = fs.readdirSync(historyDir).filter((f) => f.endsWith('.md')).sort();\n while (versions.length > 10) {\n fs.unlinkSync(path.join(historyDir, versions.shift() as string));\n }\n }\n } catch (histErr: any) {\n // History failure KHÔNG chặn ghi chính — nhưng không âm thầm: log rõ\n console.warn('[FileSystemCurriculumAdapter] version history snapshot failed:', histErr?.message || histErr);\n }\n }\n\n fs.writeFileSync(targetPath, content, 'utf-8');\n\n // Also auto-sync to lessons/ directory if this is a lesson artifact (e.g. _content/U01/SLIDE_U01_M01_L01.md)\n const filename = path.basename(relPath);\n const match = filename.match(/(LESSON|ACT|QUIZ|SLIDE|GUIDE|HANDOUT|WKS|EXT)_(U\\d+_M\\d+_L\\d+)\\.md/i);\n if (match) {\n const lessonId = match[2].toUpperCase();\n const lessonsDir = path.join(projectDir, 'lessons', lessonId);\n if (!fs.existsSync(lessonsDir)) {\n fs.mkdirSync(lessonsDir, { recursive: true });\n }\n fs.writeFileSync(path.join(lessonsDir, filename), content, 'utf-8');\n\n // Also sync to legacy _content/U01_M01_L01/ folder if it exists\n const legacyContentDir = path.join(projectDir, '_content', lessonId);\n if (fs.existsSync(legacyContentDir)) {\n fs.writeFileSync(path.join(legacyContentDir, filename), content, 'utf-8');\n }\n }\n }\n\n async listLessons(projectId: string): Promise<LessonArtifactSummary[]> {\n const lessonsDir = path.join(this.getProjectDir(projectId), 'lessons');\n if (!fs.existsSync(lessonsDir)) return [];\n\n const lessonFolders = fs.readdirSync(lessonsDir).filter(f => !f.startsWith('.'));\n return lessonFolders.map(folder => {\n const lDir = path.join(lessonsDir, folder);\n const isDir = fs.statSync(lDir).isDirectory();\n if (!isDir) {\n return {\n lessonId: folder,\n artifactsCount: 0,\n isComplete: false,\n artifacts: []\n };\n }\n\n const artifacts = fs.readdirSync(lDir).filter(f => !f.startsWith('.'));\n return {\n lessonId: folder,\n artifactsCount: artifacts.length,\n isComplete: artifacts.length >= 4,\n artifacts\n };\n });\n }\n\n async getProjectStatus(projectId: string): Promise<ProjectStatusReport> {\n const sotList = await this.listSotDocuments(projectId);\n const lessons = await this.listLessons(projectId);\n\n const completedCount = lessons.filter(l => l.isComplete).length;\n const totalLessons = lessons.length || 4;\n const progressPercent = Math.round((completedCount / totalLessons) * 100);\n\n const sotTable = sotList.map(doc => `| \\`${doc.filename}\\` | ${doc.exists ? '✅ Sẵn sàng' : '❌ Chưa có'} |`).join('\\n');\n const lessonTable = lessons.length > 0 \n ? lessons.map(l => `| **${l.lessonId}** | ${l.artifactsCount}/4 Artifacts | ${l.isComplete ? '✅ Hoàn tất' : '⏳ Đang tạo sinh'} | ${l.artifacts.join(', ') || '-'} |`).join('\\n')\n : '| Chưa có bài học nào trên đĩa cứng | 0/4 | ⏳ Chờ chạy | - |';\n\n const rawMarkdownReport = `## 📊 BÁO CÁO TRẠNG THÁI DỰ ÁN: \\`${projectId.toUpperCase()}\\`\n\n### 1. Nền tảng Tài liệu (SOT Readiness)\n| Tài liệu SOT | Trạng thái |\n|---|:---:|\n${sotTable}\n\n### 2. Danh mục Bài học & Học liệu (Lessons & Artifacts Matrix)\n| Mã bài học | Số lượng Artifact | Trạng thái | Danh sách Artifact đã tạo |\n|---|:---:|:---:|---|\n${lessonTable}\n\n**Tiến độ tổng thể:** ${completedCount}/${totalLessons} bài học (${progressPercent}%)\n\n### 3. Đề xuất Hành động Tiếp theo:\n- Sử dụng lệnh \\`/create-lesson <id>\\` để tạo sinh các bài học tiếp theo trong pipeline.\n- Sử dụng lệnh \\`/audit-quality\\` để chạy kiểm thử tiêu chuẩn Bloom và Alignment Matrix.`;\n\n return {\n projectId,\n sotReadiness: sotList,\n lessons,\n completedCount,\n totalLessons,\n progressPercent,\n rawMarkdownReport\n };\n }\n\n async getPipelineState(projectId: string): Promise<PipelineState> {\n const projectDir = this.getProjectDir(projectId);\n const stateFile = path.join(projectDir, '_pipeline', 'state.json');\n\n if (fs.existsSync(stateFile)) {\n try {\n const raw = fs.readFileSync(stateFile, 'utf-8');\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === 'object' && parsed.tasks) {\n return parsed as PipelineState;\n }\n } catch (err) {\n console.warn(`[FileSystemCurriculumAdapter] Error reading pipeline state for ${projectId}:`, err);\n }\n }\n\n // Default empty pipeline state\n return {\n projectId,\n updatedAt: new Date().toISOString(),\n tasks: {}\n };\n }\n\n async savePipelineState(projectId: string, state: PipelineState): Promise<void> {\n const projectDir = this.getProjectDir(projectId);\n const pipelineDir = path.join(projectDir, '_pipeline');\n\n if (!fs.existsSync(pipelineDir)) {\n fs.mkdirSync(pipelineDir, { recursive: true });\n }\n\n const stateFile = path.join(pipelineDir, 'state.json');\n state.updatedAt = new Date().toISOString();\n fs.writeFileSync(stateFile, JSON.stringify(state, null, 2), 'utf-8');\n }\n\n async updateArtifactState(\n projectId: string,\n taskId: string,\n artifactType: string,\n update: Partial<ArtifactLifecycleInfo>\n ): Promise<PipelineState> {\n const current = await this.getPipelineState(projectId);\n if (!current.tasks[taskId]) {\n current.tasks[taskId] = {};\n }\n\n const existingInfo = current.tasks[taskId][artifactType] || {\n state: 'pending',\n };\n\n current.tasks[taskId][artifactType] = {\n ...existingInfo,\n ...update,\n };\n\n await this.savePipelineState(projectId, current);\n return current;\n }\n}\n","import { createClient, type SupabaseClient } from '@supabase/supabase-js';\nimport type { MilestoneCurriculumBundle } from '../pipeline';\nimport type { \n ICurriculumStorage, \n SotDocument, \n LessonArtifactSummary, \n ProjectStatusReport \n} from './types';\nimport { STANDARD_SOT_FILES } from './fileSystemCurriculumAdapter';\n\nexport interface SupabaseStorageConfig {\n supabaseUrl?: string;\n supabaseServiceRoleKey?: string;\n bucketName?: string;\n client?: SupabaseClient;\n}\n\n/**\n * Supabase Curriculum Adapter — Syncs Markdown artifacts to Storage & Database\n * Implements ICurriculumStorage for multi-tenant Cloud deployment (Vercel, Netlify, Cloudflare, etc.).\n */\nexport class SupabaseCurriculumAdapter implements ICurriculumStorage {\n private client: SupabaseClient;\n private bucketName: string;\n\n constructor(config: SupabaseStorageConfig = {}) {\n this.bucketName = config.bucketName || process.env.SUPABASE_STORAGE_BUCKET || 'course-materials';\n\n if (config.client) {\n this.client = config.client;\n } else {\n const url = config.supabaseUrl || process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL || '';\n const key =\n config.supabaseServiceRoleKey ||\n process.env.SUPABASE_SERVICE_ROLE_KEY ||\n process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY ||\n '';\n\n if (!url || !key) {\n throw new Error('Supabase URL or Key is missing in SupabaseCurriculumAdapter');\n }\n\n this.client = createClient(url, key);\n }\n }\n\n async projectExists(projectId: string): Promise<boolean> {\n try {\n const { data, error } = await this.client.storage\n .from(this.bucketName)\n .list(projectId, { limit: 5 });\n return !error && !!data && data.length > 0;\n } catch {\n return false;\n }\n }\n\n async readSotDocument(projectId: string, filename: string): Promise<string | null> {\n const paths = [\n `${projectId}/_sot/${filename}`,\n `${projectId}/${filename}`,\n `${projectId}/_designer/${filename}`,\n `${projectId}/_analyst/${filename}`\n ];\n for (const p of paths) {\n try {\n const { data, error } = await this.client.storage.from(this.bucketName).download(p);\n if (!error && data) {\n return await data.text();\n }\n } catch {}\n }\n return null;\n }\n\n async listSotDocuments(projectId: string): Promise<SotDocument[]> {\n const results: SotDocument[] = [];\n for (const filename of STANDARD_SOT_FILES) {\n const content = await this.readSotDocument(projectId, filename);\n results.push({\n name: filename.replace('.md', '').replace(/_/g, ' '),\n filename,\n exists: !!content,\n content: content || undefined,\n sizeBytes: content ? content.length : 0\n });\n }\n return results;\n }\n\n async readArtifact(projectId: string, relPathOrIdentifier: string): Promise<string | null> {\n const cleanPath = relPathOrIdentifier.replace(/^\\//, '');\n\n // 1. Direct path lookup attempts\n const possiblePaths = [\n `${projectId}/${cleanPath}`,\n `${projectId}/_sot/${cleanPath}`,\n `${projectId}/_content/${cleanPath}`,\n `${projectId}/lessons/${cleanPath}`,\n `${projectId}/_sot/${cleanPath.split('/').pop()}`,\n `${projectId}/lessons/${cleanPath.split('/').pop()}`,\n ];\n\n for (const p of possiblePaths) {\n try {\n const { data, error } = await this.client.storage.from(this.bucketName).download(p);\n if (!error && data) {\n return await data.text();\n }\n } catch {}\n }\n\n // 2. Intelligent Identifier Resolution (e.g. \"U01_M01_L01 — Giáo án 5E\" or \"U01_M01_L01\")\n const lessonMatch = relPathOrIdentifier.match(/U\\d+_M\\d+_L\\d+/i);\n if (lessonMatch) {\n const lessonId = lessonMatch[0].toUpperCase();\n const unitCode = lessonId.split('_')[0] || 'U01';\n const lower = relPathOrIdentifier.toLowerCase();\n\n let artifactPrefix = 'LESSON';\n if (lower.includes('act') || lower.includes('lab') || lower.includes('thực hành')) {\n artifactPrefix = 'ACT';\n } else if (lower.includes('quiz') || lower.includes('trắc nghiệm') || lower.includes('đánh giá')) {\n artifactPrefix = 'QUIZ';\n } else if (lower.includes('slide') || lower.includes('bài giảng') || lower.includes('trình chiếu')) {\n artifactPrefix = 'SLIDE';\n } else if (lower.includes('guide') || lower.includes('hướng dẫn')) {\n artifactPrefix = 'GUIDE';\n }\n\n const candidatePaths = [\n `${projectId}/_content/${unitCode}/${artifactPrefix}_${lessonId}.md`,\n `${projectId}/lessons/${lessonId}/${artifactPrefix}_${lessonId}.md`,\n `${projectId}/${artifactPrefix}_${lessonId}.md`,\n ];\n\n for (const p of candidatePaths) {\n try {\n const { data, error } = await this.client.storage.from(this.bucketName).download(p);\n if (!error && data) {\n return await data.text();\n }\n } catch {}\n }\n }\n\n return null;\n }\n\n async saveArtifact(projectId: string, relPath: string, content: string): Promise<void> {\n const fullPath = `${projectId}/${relPath.replace(/^\\//, '')}`;\n const { error } = await this.client.storage\n .from(this.bucketName)\n .upload(fullPath, Buffer.from(content, 'utf-8'), {\n contentType: 'text/markdown',\n upsert: true,\n });\n\n if (error) {\n throw new Error(`Failed to upload artifact to Supabase Storage: ${error.message}`);\n }\n\n // Optional DB Upsert for fast indexed searching if artifacts table exists\n try {\n await this.client.from('curriculum_artifacts').upsert({\n project_id: projectId,\n rel_path: relPath,\n content: content,\n updated_at: new Date().toISOString(),\n }, { onConflict: 'project_id,rel_path' });\n } catch {\n // Ignore if table not yet migrated\n }\n }\n\n async listLessons(projectId: string): Promise<LessonArtifactSummary[]> {\n const summaries: LessonArtifactSummary[] = [];\n const processedLessons = new Set<string>();\n\n try {\n // 1. Scan _content/ folders (e.g. _content/U01/, _content/U02/)\n const { data: unitDirs } = await this.client.storage\n .from(this.bucketName)\n .list(`${projectId}/_content`);\n\n if (unitDirs) {\n for (const u of unitDirs) {\n const { data: files } = await this.client.storage\n .from(this.bucketName)\n .list(`${projectId}/_content/${u.name}`);\n\n if (files) {\n const lessonMap: Record<string, string[]> = {};\n files.forEach(f => {\n const m = f.name.match(/U\\d+_M\\d+_L\\d+/i);\n if (m) {\n const lid = m[0].toUpperCase();\n lessonMap[lid] = lessonMap[lid] || [];\n lessonMap[lid].push(f.name);\n }\n });\n\n for (const [lid, arts] of Object.entries(lessonMap)) {\n if (!processedLessons.has(lid)) {\n processedLessons.add(lid);\n summaries.push({\n lessonId: lid,\n artifactsCount: arts.length,\n isComplete: arts.length >= 4,\n artifacts: arts,\n });\n }\n }\n }\n }\n }\n\n // 2. Scan lessons/ folders (legacy / alternate structure)\n const { data: lessonDirs } = await this.client.storage\n .from(this.bucketName)\n .list(`${projectId}/lessons`);\n\n if (lessonDirs) {\n for (const dir of lessonDirs) {\n if (!processedLessons.has(dir.name)) {\n const { data: files } = await this.client.storage\n .from(this.bucketName)\n .list(`${projectId}/lessons/${dir.name}`);\n \n const artifacts = (files || []).map(f => f.name).filter(n => !n.startsWith('.'));\n processedLessons.add(dir.name);\n summaries.push({\n lessonId: dir.name,\n artifactsCount: artifacts.length,\n isComplete: artifacts.length >= 4,\n artifacts\n });\n }\n }\n }\n } catch {\n // Fallback\n }\n\n return summaries;\n }\n\n async getProjectStatus(projectId: string): Promise<ProjectStatusReport> {\n const sotList = await this.listSotDocuments(projectId);\n const lessons = await this.listLessons(projectId);\n\n const completedCount = lessons.filter(l => l.isComplete).length;\n const totalLessons = lessons.length || 4;\n const progressPercent = Math.round((completedCount / totalLessons) * 100);\n\n const sotTable = sotList.map(doc => `| \\`${doc.filename}\\` | ${doc.exists ? '✅ Sẵn sàng' : '❌ Chưa có'} |`).join('\\n');\n const lessonTable = lessons.length > 0 \n ? lessons.map(l => `| **${l.lessonId}** | ${l.artifactsCount}/4 Artifacts | ${l.isComplete ? '✅ Hoàn tất' : '⏳ Đang tạo sinh'} | ${l.artifacts.join(', ') || '-'} |`).join('\\n')\n : '| Chưa có bài học nào trên cloud storage | 0/4 | ⏳ Chờ chạy | - |';\n\n const rawMarkdownReport = `## 📊 BÁO CÁO TRẠNG THÁI DỰ ÁN (CLOUD): \\`${projectId.toUpperCase()}\\`\n\n### 1. Nền tảng Tài liệu (SOT Readiness)\n| Tài liệu SOT | Trạng thái |\n|---|:---:|\n${sotTable}\n\n### 2. Danh mục Bài học & Học liệu (Lessons & Artifacts Matrix)\n| Mã bài học | Số lượng Artifact | Trạng thái | Danh sách Artifact đã tạo |\n|---|:---:|:---:|---|\n${lessonTable}\n\n**Tiến độ tổng thể:** ${completedCount}/${totalLessons} bài học (${progressPercent}%)`;\n\n return {\n projectId,\n sotReadiness: sotList,\n lessons,\n completedCount,\n totalLessons,\n progressPercent,\n rawMarkdownReport\n };\n }\n\n /**\n * Uploads a complete milestone bundle (Markdown files) to Supabase Storage\n */\n async uploadMilestoneBundle(\n projectSlug: string,\n bundle: MilestoneCurriculumBundle\n ): Promise<{ lessonUrl?: string; activityUrl?: string; handoutUrl?: string }> {\n const basePath = `${projectSlug}/${bundle.milestoneId}`;\n\n const uploads = [\n {\n path: `${basePath}/LESSON.md`,\n content: bundle.lessonMarkdown,\n type: 'text/markdown',\n },\n {\n path: `${basePath}/ACT.md`,\n content: bundle.activityMarkdown,\n type: 'text/markdown',\n },\n {\n path: `${basePath}/HANDOUT.md`,\n content: bundle.handoutMarkdown,\n type: 'text/markdown',\n },\n ];\n\n const results: Record<string, string> = {};\n\n for (const item of uploads) {\n const { data, error } = await this.client.storage\n .from(this.bucketName)\n .upload(item.path, Buffer.from(item.content, 'utf-8'), {\n contentType: item.type,\n upsert: true,\n });\n\n if (!error && data) {\n const { data: publicUrlData } = this.client.storage.from(this.bucketName).getPublicUrl(item.path);\n results[item.path] = publicUrlData.publicUrl;\n }\n }\n\n return {\n lessonUrl: results[`${basePath}/LESSON.md`],\n activityUrl: results[`${basePath}/ACT.md`],\n handoutUrl: results[`${basePath}/HANDOUT.md`],\n };\n }\n\n async getPipelineState(projectId: string): Promise<import('./types').PipelineState> {\n const p = `${projectId}/_pipeline/state.json`;\n try {\n const { data, error } = await this.client.storage.from(this.bucketName).download(p);\n if (!error && data) {\n const text = await data.text();\n return JSON.parse(text);\n }\n } catch {}\n\n return {\n projectId,\n updatedAt: new Date().toISOString(),\n tasks: {}\n };\n }\n\n async savePipelineState(projectId: string, state: import('./types').PipelineState): Promise<void> {\n const p = `${projectId}/_pipeline/state.json`;\n state.updatedAt = new Date().toISOString();\n await this.client.storage.from(this.bucketName).upload(p, Buffer.from(JSON.stringify(state, null, 2), 'utf-8'), {\n contentType: 'application/json',\n upsert: true,\n });\n }\n\n async updateArtifactState(\n projectId: string,\n taskId: string,\n artifactType: string,\n update: Partial<import('./types').ArtifactLifecycleInfo>\n ): Promise<import('./types').PipelineState> {\n const current = await this.getPipelineState(projectId);\n if (!current.tasks[taskId]) {\n current.tasks[taskId] = {};\n }\n current.tasks[taskId][artifactType] = {\n ...(current.tasks[taskId][artifactType] || { state: 'pending' }),\n ...update,\n };\n await this.savePipelineState(projectId, current);\n return current;\n }\n}\n","import type { ICurriculumStorage } from './types';\nimport { FileSystemCurriculumAdapter, FileSystemStorageOptions } from './fileSystemCurriculumAdapter';\nimport { SupabaseCurriculumAdapter, SupabaseStorageConfig } from './supabaseCurriculumAdapter';\n\nexport interface StorageFactoryOptions {\n provider?: 'filesystem' | 'supabase' | 'auto';\n fileSystemOptions?: FileSystemStorageOptions;\n supabaseConfig?: SupabaseStorageConfig;\n}\n\n/**\n * Creates and returns the appropriate ICurriculumStorage instance based on environment or explicit config.\n */\nexport function createCurriculumStorage(options: StorageFactoryOptions = {}): ICurriculumStorage {\n const provider = options.provider || process.env.CURRICULUM_STORAGE_PROVIDER || 'auto';\n\n if (provider === 'supabase') {\n return new SupabaseCurriculumAdapter(options.supabaseConfig);\n }\n\n if (provider === 'auto') {\n const hasSupabase = Boolean(\n (process.env.SUPABASE_URL || process.env.NEXT_PUBLIC_SUPABASE_URL) &&\n (process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY) &&\n process.env.STORAGE_USE_SUPABASE === 'true'\n );\n\n if (hasSupabase) {\n try {\n return new SupabaseCurriculumAdapter(options.supabaseConfig);\n } catch (e) {\n console.warn('⚠️ Falling back to FileSystemCurriculumAdapter due to Supabase initialization error:', e);\n }\n }\n }\n\n return new FileSystemCurriculumAdapter(options.fileSystemOptions);\n}\n"]}
@@ -0,0 +1,60 @@
1
+ interface ChatMessage {
2
+ role: 'user' | 'assistant' | 'system' | 'model';
3
+ content: string;
4
+ }
5
+ interface StreamRunnerOptions {
6
+ openrouterKey?: string;
7
+ deepseekKey?: string;
8
+ alibabaKey?: string;
9
+ geminiKey?: string;
10
+ nvidiaKey?: string;
11
+ openaiKey?: string;
12
+ anthropicKey?: string;
13
+ model?: string;
14
+ systemPersona?: string;
15
+ maxTokens?: number;
16
+ temperature?: number;
17
+ reasoningEffort?: 'off' | 'low' | 'medium' | 'high' | 'max';
18
+ }
19
+ /**
20
+ * Checks if a specific AI provider is enabled via environment variables.
21
+ * Supported env controls:
22
+ * 1. ENABLE_<PROVIDER>=true|false (e.g. ENABLE_ALIBABA=false, ENABLE_OPENROUTER=true)
23
+ * 2. ALLOWED_AI_PROVIDERS=openrouter,nvidia
24
+ * 3. DISABLED_AI_PROVIDERS=alibaba,deepseek,gemini
25
+ */
26
+ declare function isProviderEnabled(provider: string): boolean;
27
+ /**
28
+ * Checks if a model is permitted by ALLOWED_AI_MODELS filter (supports wildcards e.g. nvidia/*, *:free)
29
+ */
30
+ declare function isModelAllowed(model: string): boolean;
31
+ interface FallbackTarget {
32
+ provider: string;
33
+ model: string;
34
+ }
35
+ /**
36
+ * Resolves the designated last-resort fallback chain from environment variables.
37
+ * Comma-separated lists are parsed in left-to-right priority order:
38
+ * - FALLBACK_AI_PROVIDER=nvidia,openrouter (Must be enabled / in ALLOWED_AI_PROVIDERS)
39
+ * - FALLBACK_AI_MODEL=nvidia/nemotron-3-ultra-550b-a55b,@preset/coding-free,deepseek/deepseek-chat:free
40
+ */
41
+ declare function getDesignatedFallbackChain(): FallbackTarget[];
42
+ declare function getDesignatedFallbackConfig(): FallbackTarget;
43
+ type ChunkType = 'content' | 'thought' | 'tool_call' | 'usage';
44
+ /**
45
+ * Separate thinking process from main content safely
46
+ */
47
+ declare function extractThoughtAndContent(rawText: string): {
48
+ thought: string;
49
+ content: string;
50
+ };
51
+ /**
52
+ * Real-time Streaming Multi-Provider Inference Runner with Thinking & Tool Streaming
53
+ */
54
+ declare function streamCurriculumAIInference(messages: ChatMessage[], projectContext: string, options?: StreamRunnerOptions, onChunk?: (token: string, type: ChunkType) => void): Promise<string>;
55
+ /**
56
+ * Synchronous Multi-Model Inference Wrapper with strict error propagation
57
+ */
58
+ declare function runCurriculumAIInference(messages: ChatMessage[], projectContext: string, options?: StreamRunnerOptions, onChunk?: (token: string, type: ChunkType) => void): Promise<string>;
59
+
60
+ export { type ChatMessage as C, type FallbackTarget as F, type StreamRunnerOptions as S, isModelAllowed as a, getDesignatedFallbackConfig as b, type ChunkType as c, extractThoughtAndContent as e, getDesignatedFallbackChain as g, isProviderEnabled as i, runCurriculumAIInference as r, streamCurriculumAIInference as s };
@@ -0,0 +1,60 @@
1
+ interface ChatMessage {
2
+ role: 'user' | 'assistant' | 'system' | 'model';
3
+ content: string;
4
+ }
5
+ interface StreamRunnerOptions {
6
+ openrouterKey?: string;
7
+ deepseekKey?: string;
8
+ alibabaKey?: string;
9
+ geminiKey?: string;
10
+ nvidiaKey?: string;
11
+ openaiKey?: string;
12
+ anthropicKey?: string;
13
+ model?: string;
14
+ systemPersona?: string;
15
+ maxTokens?: number;
16
+ temperature?: number;
17
+ reasoningEffort?: 'off' | 'low' | 'medium' | 'high' | 'max';
18
+ }
19
+ /**
20
+ * Checks if a specific AI provider is enabled via environment variables.
21
+ * Supported env controls:
22
+ * 1. ENABLE_<PROVIDER>=true|false (e.g. ENABLE_ALIBABA=false, ENABLE_OPENROUTER=true)
23
+ * 2. ALLOWED_AI_PROVIDERS=openrouter,nvidia
24
+ * 3. DISABLED_AI_PROVIDERS=alibaba,deepseek,gemini
25
+ */
26
+ declare function isProviderEnabled(provider: string): boolean;
27
+ /**
28
+ * Checks if a model is permitted by ALLOWED_AI_MODELS filter (supports wildcards e.g. nvidia/*, *:free)
29
+ */
30
+ declare function isModelAllowed(model: string): boolean;
31
+ interface FallbackTarget {
32
+ provider: string;
33
+ model: string;
34
+ }
35
+ /**
36
+ * Resolves the designated last-resort fallback chain from environment variables.
37
+ * Comma-separated lists are parsed in left-to-right priority order:
38
+ * - FALLBACK_AI_PROVIDER=nvidia,openrouter (Must be enabled / in ALLOWED_AI_PROVIDERS)
39
+ * - FALLBACK_AI_MODEL=nvidia/nemotron-3-ultra-550b-a55b,@preset/coding-free,deepseek/deepseek-chat:free
40
+ */
41
+ declare function getDesignatedFallbackChain(): FallbackTarget[];
42
+ declare function getDesignatedFallbackConfig(): FallbackTarget;
43
+ type ChunkType = 'content' | 'thought' | 'tool_call' | 'usage';
44
+ /**
45
+ * Separate thinking process from main content safely
46
+ */
47
+ declare function extractThoughtAndContent(rawText: string): {
48
+ thought: string;
49
+ content: string;
50
+ };
51
+ /**
52
+ * Real-time Streaming Multi-Provider Inference Runner with Thinking & Tool Streaming
53
+ */
54
+ declare function streamCurriculumAIInference(messages: ChatMessage[], projectContext: string, options?: StreamRunnerOptions, onChunk?: (token: string, type: ChunkType) => void): Promise<string>;
55
+ /**
56
+ * Synchronous Multi-Model Inference Wrapper with strict error propagation
57
+ */
58
+ declare function runCurriculumAIInference(messages: ChatMessage[], projectContext: string, options?: StreamRunnerOptions, onChunk?: (token: string, type: ChunkType) => void): Promise<string>;
59
+
60
+ export { type ChatMessage as C, type FallbackTarget as F, type StreamRunnerOptions as S, isModelAllowed as a, getDesignatedFallbackConfig as b, type ChunkType as c, extractThoughtAndContent as e, getDesignatedFallbackChain as g, isProviderEnabled as i, runCurriculumAIInference as r, streamCurriculumAIInference as s };
@@ -0,0 +1,63 @@
1
+ interface GitPublishOptions {
2
+ jobId: string;
3
+ localJobDir: string;
4
+ githubToken?: string;
5
+ owner: string;
6
+ repo: string;
7
+ branch?: string;
8
+ commitMessage?: string;
9
+ createPullRequest?: boolean;
10
+ }
11
+ interface GitPublishResult {
12
+ success: boolean;
13
+ commitSha?: string;
14
+ branch: string;
15
+ pullRequestUrl?: string;
16
+ publishedFilesCount: number;
17
+ error?: string;
18
+ }
19
+ /**
20
+ * Publishes generated course artifacts to a designated GitHub Repository (Git-as-CMS)
21
+ */
22
+ declare function publishToGitHub(options: GitPublishOptions): Promise<GitPublishResult>;
23
+
24
+ interface SupabasePublishOptions {
25
+ jobId: string;
26
+ courseTitle: string;
27
+ topic: string;
28
+ language: string;
29
+ milestones: Array<{
30
+ milestoneId: string;
31
+ milestoneName: string;
32
+ lessonSlug: string;
33
+ summary?: string;
34
+ }>;
35
+ supabaseUrl?: string;
36
+ supabaseServiceKey?: string;
37
+ bucketName?: string;
38
+ }
39
+ interface SupabasePublishResult {
40
+ success: boolean;
41
+ learningPathId?: string;
42
+ syncedMilestonesCount: number;
43
+ uploadedAssetsCount: number;
44
+ error?: string;
45
+ }
46
+ /**
47
+ * Publishes metadata and binary assets to Supabase PostgreSQL & Storage Bucket
48
+ */
49
+ declare function publishToSupabase(options: SupabasePublishOptions): Promise<SupabasePublishResult>;
50
+ /**
51
+ * Uploads a binary asset (MP3, SCORM zip, PNG) to Supabase Storage Bucket
52
+ */
53
+ declare function uploadAssetToBucket(filePath: string, storagePath: string, options?: {
54
+ supabaseUrl?: string;
55
+ supabaseServiceKey?: string;
56
+ bucketName?: string;
57
+ }): Promise<{
58
+ success: boolean;
59
+ publicUrl?: string;
60
+ error?: string;
61
+ }>;
62
+
63
+ export { type GitPublishOptions as G, type SupabasePublishOptions as S, type GitPublishResult as a, type SupabasePublishResult as b, publishToSupabase as c, publishToGitHub as p, uploadAssetToBucket as u };
@@ -0,0 +1,63 @@
1
+ interface GitPublishOptions {
2
+ jobId: string;
3
+ localJobDir: string;
4
+ githubToken?: string;
5
+ owner: string;
6
+ repo: string;
7
+ branch?: string;
8
+ commitMessage?: string;
9
+ createPullRequest?: boolean;
10
+ }
11
+ interface GitPublishResult {
12
+ success: boolean;
13
+ commitSha?: string;
14
+ branch: string;
15
+ pullRequestUrl?: string;
16
+ publishedFilesCount: number;
17
+ error?: string;
18
+ }
19
+ /**
20
+ * Publishes generated course artifacts to a designated GitHub Repository (Git-as-CMS)
21
+ */
22
+ declare function publishToGitHub(options: GitPublishOptions): Promise<GitPublishResult>;
23
+
24
+ interface SupabasePublishOptions {
25
+ jobId: string;
26
+ courseTitle: string;
27
+ topic: string;
28
+ language: string;
29
+ milestones: Array<{
30
+ milestoneId: string;
31
+ milestoneName: string;
32
+ lessonSlug: string;
33
+ summary?: string;
34
+ }>;
35
+ supabaseUrl?: string;
36
+ supabaseServiceKey?: string;
37
+ bucketName?: string;
38
+ }
39
+ interface SupabasePublishResult {
40
+ success: boolean;
41
+ learningPathId?: string;
42
+ syncedMilestonesCount: number;
43
+ uploadedAssetsCount: number;
44
+ error?: string;
45
+ }
46
+ /**
47
+ * Publishes metadata and binary assets to Supabase PostgreSQL & Storage Bucket
48
+ */
49
+ declare function publishToSupabase(options: SupabasePublishOptions): Promise<SupabasePublishResult>;
50
+ /**
51
+ * Uploads a binary asset (MP3, SCORM zip, PNG) to Supabase Storage Bucket
52
+ */
53
+ declare function uploadAssetToBucket(filePath: string, storagePath: string, options?: {
54
+ supabaseUrl?: string;
55
+ supabaseServiceKey?: string;
56
+ bucketName?: string;
57
+ }): Promise<{
58
+ success: boolean;
59
+ publicUrl?: string;
60
+ error?: string;
61
+ }>;
62
+
63
+ export { type GitPublishOptions as G, type SupabasePublishOptions as S, type GitPublishResult as a, type SupabasePublishResult as b, publishToSupabase as c, publishToGitHub as p, uploadAssetToBucket as u };
@@ -0,0 +1,89 @@
1
+ interface SotDocument {
2
+ name: string;
3
+ filename: string;
4
+ exists: boolean;
5
+ content?: string;
6
+ sizeBytes?: number;
7
+ }
8
+ interface LessonArtifactSummary {
9
+ lessonId: string;
10
+ artifactsCount: number;
11
+ isComplete: boolean;
12
+ artifacts: string[];
13
+ }
14
+ interface ProjectStatusReport {
15
+ projectId: string;
16
+ sotReadiness: SotDocument[];
17
+ lessons: LessonArtifactSummary[];
18
+ completedCount: number;
19
+ totalLessons: number;
20
+ progressPercent: number;
21
+ rawMarkdownReport: string;
22
+ }
23
+ interface SmartResumeContext {
24
+ projectId: string;
25
+ currentPhase: number;
26
+ nextLessonId?: string;
27
+ nextLessonTitle?: string;
28
+ recommendedAction: string;
29
+ rawMarkdownReport: string;
30
+ }
31
+ interface QualityAuditReport {
32
+ projectId: string;
33
+ pedagogy5EPass: boolean;
34
+ bloomAlignmentPass: boolean;
35
+ strictConcurrencyPass: boolean;
36
+ alignmentMatrixPass: boolean;
37
+ score: number;
38
+ details: string[];
39
+ rawMarkdownReport: string;
40
+ }
41
+ type ArtifactLifecycleState = 'pending' | 'queued' | 'generating' | 'awaiting_review' | 'approved' | 'rejected' | 'completed' | 'cancelled';
42
+ interface ReviewRecord {
43
+ decision: 'APPROVED' | 'REJECTED' | 'NEEDS_REVISION';
44
+ reviewedBy: 'human' | '@agent-as-judge' | '@heuristic-linter';
45
+ reviewedAt: string;
46
+ score?: number;
47
+ feedback?: string;
48
+ critique?: string;
49
+ contentHash?: string;
50
+ }
51
+ interface ArtifactLifecycleInfo {
52
+ state: ArtifactLifecycleState;
53
+ generatedAt?: string;
54
+ contentHash?: string;
55
+ review?: ReviewRecord | null;
56
+ }
57
+ interface TaskLifecycleState {
58
+ taskId: string;
59
+ artifacts: Record<string, ArtifactLifecycleInfo>;
60
+ }
61
+ interface PipelineState {
62
+ projectId: string;
63
+ updatedAt: string;
64
+ tasks: Record<string, Record<string, ArtifactLifecycleInfo>>;
65
+ }
66
+ interface ICurriculumStorage {
67
+ /** Check if a project exists */
68
+ projectExists(projectId: string): Promise<boolean>;
69
+ /** Read SOT document content or return null if not found */
70
+ readSotDocument(projectId: string, filename: string): Promise<string | null>;
71
+ /** List all SOT documents with existence status */
72
+ listSotDocuments(projectId: string): Promise<SotDocument[]>;
73
+ /** Read an arbitrary artifact file by relative path */
74
+ readArtifact(projectId: string, relPath: string): Promise<string | null>;
75
+ /** Save an artifact file to persistent storage */
76
+ saveArtifact(projectId: string, relPath: string, content: string): Promise<void>;
77
+ /** List all lessons in the project with their generated artifacts */
78
+ listLessons(projectId: string): Promise<LessonArtifactSummary[]>;
79
+ /** Get complete structured project status report */
80
+ getProjectStatus(projectId: string): Promise<ProjectStatusReport>;
81
+ /** Get durable pipeline lifecycle state */
82
+ getPipelineState(projectId: string): Promise<PipelineState>;
83
+ /** Save durable pipeline lifecycle state */
84
+ savePipelineState(projectId: string, state: PipelineState): Promise<void>;
85
+ /** Update review or state for a single artifact in pipeline state */
86
+ updateArtifactState(projectId: string, taskId: string, artifactType: string, update: Partial<ArtifactLifecycleInfo>): Promise<PipelineState>;
87
+ }
88
+
89
+ export type { ArtifactLifecycleState as A, ICurriculumStorage as I, LessonArtifactSummary as L, ProjectStatusReport as P, QualityAuditReport as Q, ReviewRecord as R, SmartResumeContext as S, TaskLifecycleState as T, SotDocument as a, ArtifactLifecycleInfo as b, PipelineState as c };
@@ -0,0 +1,89 @@
1
+ interface SotDocument {
2
+ name: string;
3
+ filename: string;
4
+ exists: boolean;
5
+ content?: string;
6
+ sizeBytes?: number;
7
+ }
8
+ interface LessonArtifactSummary {
9
+ lessonId: string;
10
+ artifactsCount: number;
11
+ isComplete: boolean;
12
+ artifacts: string[];
13
+ }
14
+ interface ProjectStatusReport {
15
+ projectId: string;
16
+ sotReadiness: SotDocument[];
17
+ lessons: LessonArtifactSummary[];
18
+ completedCount: number;
19
+ totalLessons: number;
20
+ progressPercent: number;
21
+ rawMarkdownReport: string;
22
+ }
23
+ interface SmartResumeContext {
24
+ projectId: string;
25
+ currentPhase: number;
26
+ nextLessonId?: string;
27
+ nextLessonTitle?: string;
28
+ recommendedAction: string;
29
+ rawMarkdownReport: string;
30
+ }
31
+ interface QualityAuditReport {
32
+ projectId: string;
33
+ pedagogy5EPass: boolean;
34
+ bloomAlignmentPass: boolean;
35
+ strictConcurrencyPass: boolean;
36
+ alignmentMatrixPass: boolean;
37
+ score: number;
38
+ details: string[];
39
+ rawMarkdownReport: string;
40
+ }
41
+ type ArtifactLifecycleState = 'pending' | 'queued' | 'generating' | 'awaiting_review' | 'approved' | 'rejected' | 'completed' | 'cancelled';
42
+ interface ReviewRecord {
43
+ decision: 'APPROVED' | 'REJECTED' | 'NEEDS_REVISION';
44
+ reviewedBy: 'human' | '@agent-as-judge' | '@heuristic-linter';
45
+ reviewedAt: string;
46
+ score?: number;
47
+ feedback?: string;
48
+ critique?: string;
49
+ contentHash?: string;
50
+ }
51
+ interface ArtifactLifecycleInfo {
52
+ state: ArtifactLifecycleState;
53
+ generatedAt?: string;
54
+ contentHash?: string;
55
+ review?: ReviewRecord | null;
56
+ }
57
+ interface TaskLifecycleState {
58
+ taskId: string;
59
+ artifacts: Record<string, ArtifactLifecycleInfo>;
60
+ }
61
+ interface PipelineState {
62
+ projectId: string;
63
+ updatedAt: string;
64
+ tasks: Record<string, Record<string, ArtifactLifecycleInfo>>;
65
+ }
66
+ interface ICurriculumStorage {
67
+ /** Check if a project exists */
68
+ projectExists(projectId: string): Promise<boolean>;
69
+ /** Read SOT document content or return null if not found */
70
+ readSotDocument(projectId: string, filename: string): Promise<string | null>;
71
+ /** List all SOT documents with existence status */
72
+ listSotDocuments(projectId: string): Promise<SotDocument[]>;
73
+ /** Read an arbitrary artifact file by relative path */
74
+ readArtifact(projectId: string, relPath: string): Promise<string | null>;
75
+ /** Save an artifact file to persistent storage */
76
+ saveArtifact(projectId: string, relPath: string, content: string): Promise<void>;
77
+ /** List all lessons in the project with their generated artifacts */
78
+ listLessons(projectId: string): Promise<LessonArtifactSummary[]>;
79
+ /** Get complete structured project status report */
80
+ getProjectStatus(projectId: string): Promise<ProjectStatusReport>;
81
+ /** Get durable pipeline lifecycle state */
82
+ getPipelineState(projectId: string): Promise<PipelineState>;
83
+ /** Save durable pipeline lifecycle state */
84
+ savePipelineState(projectId: string, state: PipelineState): Promise<void>;
85
+ /** Update review or state for a single artifact in pipeline state */
86
+ updateArtifactState(projectId: string, taskId: string, artifactType: string, update: Partial<ArtifactLifecycleInfo>): Promise<PipelineState>;
87
+ }
88
+
89
+ export type { ArtifactLifecycleState as A, ICurriculumStorage as I, LessonArtifactSummary as L, ProjectStatusReport as P, QualityAuditReport as Q, ReviewRecord as R, SmartResumeContext as S, TaskLifecycleState as T, SotDocument as a, ArtifactLifecycleInfo as b, PipelineState as c };