@thanh01.pmt/domain-kit 0.1.0 → 0.2.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 (81) hide show
  1. package/LICENSE +21 -0
  2. package/dist/chunk-7XGWW6CB.mjs +3 -0
  3. package/dist/{chunk-F4RZNBOE.mjs.map → chunk-7XGWW6CB.mjs.map} +1 -1
  4. package/dist/{chunk-VFART56O.mjs → chunk-BL5NBKPH.mjs} +12 -8
  5. package/dist/chunk-BL5NBKPH.mjs.map +1 -0
  6. package/dist/chunk-IJZUV7N3.mjs +3 -0
  7. package/dist/chunk-IJZUV7N3.mjs.map +1 -0
  8. package/dist/{chunk-3VVPSRAM.mjs → chunk-JE57VFWX.mjs} +1056 -92
  9. package/dist/chunk-JE57VFWX.mjs.map +1 -0
  10. package/dist/{chunk-GEUDHZE7.mjs → chunk-KPZKPNOJ.mjs} +173 -4
  11. package/dist/chunk-KPZKPNOJ.mjs.map +1 -0
  12. package/dist/chunk-R57WTNXW.mjs +3 -0
  13. package/dist/chunk-R57WTNXW.mjs.map +1 -0
  14. package/dist/{chunk-3H2HX7PR.mjs → chunk-RAR5MUUK.mjs} +57 -7
  15. package/dist/chunk-RAR5MUUK.mjs.map +1 -0
  16. package/dist/chunk-T4Y2DE2W.mjs +187 -0
  17. package/dist/chunk-T4Y2DE2W.mjs.map +1 -0
  18. package/dist/{chunk-PM42MMDJ.mjs → chunk-WHBAGJWN.mjs} +48 -3
  19. package/dist/chunk-WHBAGJWN.mjs.map +1 -0
  20. package/dist/chunk-ZKLT27T4.mjs +3 -0
  21. package/dist/chunk-ZKLT27T4.mjs.map +1 -0
  22. package/dist/concepts/index.d.cts +2 -2
  23. package/dist/concepts/index.d.ts +2 -2
  24. package/dist/cpp-CZUPqJt9.d.cts +98 -0
  25. package/dist/cpp-CZUPqJt9.d.ts +98 -0
  26. package/dist/curriculumFeedEmitter-UG664SWY.mjs +4 -0
  27. package/dist/curriculumFeedEmitter-UG664SWY.mjs.map +1 -0
  28. package/dist/detector/index.cjs +10 -6
  29. package/dist/detector/index.cjs.map +1 -1
  30. package/dist/detector/index.d.cts +4 -19
  31. package/dist/detector/index.d.ts +4 -19
  32. package/dist/detector/index.mjs +2 -1
  33. package/dist/domainProfileDetector-DHb1T0zB.d.ts +22 -0
  34. package/dist/domainProfileDetector-bzugdQmS.d.cts +22 -0
  35. package/dist/extractors/index.d.cts +3 -3
  36. package/dist/extractors/index.d.ts +3 -3
  37. package/dist/feed/index.cjs +55 -5
  38. package/dist/feed/index.cjs.map +1 -1
  39. package/dist/feed/index.mjs +2 -1
  40. package/dist/graph/index.cjs +368 -64
  41. package/dist/graph/index.cjs.map +1 -1
  42. package/dist/graph/index.d.cts +7 -67
  43. package/dist/graph/index.d.ts +7 -67
  44. package/dist/graph/index.mjs +3 -2
  45. package/dist/hybridGraphPipeline-DVZYLCAQ.d.ts +159 -0
  46. package/dist/hybridGraphPipeline-DmWRKYXf.d.cts +159 -0
  47. package/dist/index.cjs +1300 -697
  48. package/dist/index.cjs.map +1 -1
  49. package/dist/index.d.cts +9 -7
  50. package/dist/index.d.ts +9 -7
  51. package/dist/index.mjs +10 -7
  52. package/dist/{keywordExtractor-zPAz2isq.d.cts → keywordExtractor-BxlGRMHC.d.cts} +1 -1
  53. package/dist/{keywordExtractor-CKaXqSku.d.ts → keywordExtractor-DU5XRN8-.d.ts} +1 -1
  54. package/dist/parsers/index.cjs +185 -0
  55. package/dist/parsers/index.cjs.map +1 -1
  56. package/dist/parsers/index.d.cts +2 -98
  57. package/dist/parsers/index.d.ts +2 -98
  58. package/dist/parsers/index.mjs +2 -1
  59. package/dist/pipeline/index.cjs +3140 -6
  60. package/dist/pipeline/index.cjs.map +1 -1
  61. package/dist/pipeline/index.d.cts +87 -4
  62. package/dist/pipeline/index.d.ts +87 -4
  63. package/dist/pipeline/index.mjs +6 -2
  64. package/dist/schemas/index.cjs +51 -0
  65. package/dist/schemas/index.cjs.map +1 -1
  66. package/dist/schemas/index.d.cts +222 -3
  67. package/dist/schemas/index.d.ts +222 -3
  68. package/dist/schemas/index.mjs +1 -1
  69. package/dist/syllabusParser-MSX1fEzW.d.cts +40 -0
  70. package/dist/syllabusParser-MSX1fEzW.d.ts +40 -0
  71. package/package.json +9 -10
  72. package/dist/chunk-3H2HX7PR.mjs.map +0 -1
  73. package/dist/chunk-3VVPSRAM.mjs.map +0 -1
  74. package/dist/chunk-F4RZNBOE.mjs +0 -3
  75. package/dist/chunk-GEUDHZE7.mjs.map +0 -1
  76. package/dist/chunk-MOKNFLUD.mjs +0 -851
  77. package/dist/chunk-MOKNFLUD.mjs.map +0 -1
  78. package/dist/chunk-PM42MMDJ.mjs.map +0 -1
  79. package/dist/chunk-VFART56O.mjs.map +0 -1
  80. package/dist/graphVerifier-DsTP9uAN.d.ts +0 -37
  81. package/dist/graphVerifier-QjgDAJce.d.cts +0 -37
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Tony Pham
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-7XGWW6CB.mjs.map
3
+ //# sourceMappingURL=chunk-7XGWW6CB.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-F4RZNBOE.mjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-7XGWW6CB.mjs"}
@@ -827,11 +827,15 @@ function detectLearningMode(options) {
827
827
 
828
828
  // src/detector/domainProfileDetector.ts
829
829
  function detectDomainProfile(options) {
830
- const inputResult = detectInputType(options);
830
+ const effectiveSyllabus = options.syllabusText || options.parsedSyllabus?.rawText || "";
831
+ const inputResult = detectInputType({
832
+ ...options,
833
+ syllabusText: effectiveSyllabus
834
+ });
831
835
  const domainResult = detectDomain({
832
836
  description: options.description,
833
837
  goal: options.goal,
834
- syllabusText: options.syllabusText,
838
+ syllabusText: effectiveSyllabus,
835
839
  techStack: options.techStack,
836
840
  fileExtensions: options.fileExtensions,
837
841
  repoUrl: options.repoUrl
@@ -842,12 +846,12 @@ function detectDomainProfile(options) {
842
846
  goal: options.goal,
843
847
  description: options.description,
844
848
  hasRepo: !!(options.repoUrl || options.repoDir),
845
- hasSyllabus: !!(options.syllabusText || options.chapters && options.chapters.length > 0)
849
+ hasSyllabus: !!(effectiveSyllabus || options.chapters && options.chapters.length > 0 || options.parsedSyllabus)
846
850
  });
847
851
  const graphType = determineGraphType(modeResult.learningMode);
848
852
  return {
849
853
  inputType: inputResult.inputType,
850
- domainCategory: domainResult.domainCategory,
854
+ domainCategory: domainResult.domainCategory === "other" && options.parsedSyllabus?.subject.domain ? options.parsedSyllabus.subject.domain : domainResult.domainCategory,
851
855
  learningMode: modeResult.learningMode,
852
856
  graphType,
853
857
  confidence: {
@@ -857,13 +861,13 @@ function detectDomainProfile(options) {
857
861
  },
858
862
  evidence: [...inputResult.evidence, ...domainResult.evidence, ...modeResult.evidence],
859
863
  detectedTechStack: domainResult.detectedTechStack,
860
- detectedSubject: domainResult.detectedSubject,
864
+ detectedSubject: options.parsedSyllabus?.subject.title || domainResult.detectedSubject,
861
865
  detectedDomain: domainResult.domainCategory,
862
866
  goal: options.goal || "",
863
867
  description: options.description || "",
864
868
  repoUrl: options.repoUrl || "",
865
869
  repoDir: options.repoDir || "",
866
- syllabusText: options.syllabusText || ""
870
+ syllabusText: effectiveSyllabus
867
871
  };
868
872
  }
869
873
  function determineGraphType(learningMode) {
@@ -880,5 +884,5 @@ function determineGraphType(learningMode) {
880
884
  }
881
885
 
882
886
  export { detectDomain, detectDomainProfile, detectInputType, detectLearningMode };
883
- //# sourceMappingURL=chunk-VFART56O.mjs.map
884
- //# sourceMappingURL=chunk-VFART56O.mjs.map
887
+ //# sourceMappingURL=chunk-BL5NBKPH.mjs.map
888
+ //# sourceMappingURL=chunk-BL5NBKPH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/detector/inputTypeDetector.ts","../src/detector/domainDetector.ts","../src/detector/learningModeDetector.ts","../src/detector/domainProfileDetector.ts"],"names":["raw"],"mappings":"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","file":"chunk-BL5NBKPH.mjs","sourcesContent":["/**\n * Input Type Detection — determines what kind of input the user provided.\n *\n * Signals:\n * repository: repoUrl, repoDir, or source code files present\n * syllabus: syllabusText, chapters[], or curriculum-like structure\n * files: non-code files (3D models, images, documents)\n * description: free-text description (>100 chars)\n * mixed: combination of the above\n */\n\nimport type { InputType } from '../schemas/domainProfileSchema';\n\nexport interface InputTypeDetectionResult {\n inputType: InputType;\n confidence: number;\n evidence: string[];\n}\n\nexport interface DetectInputTypeOptions {\n repoUrl?: string;\n repoDir?: string;\n description?: string;\n syllabusText?: string;\n chapters?: string[];\n fileExtensions?: string[];\n goal?: string;\n}\n\nconst CODE_EXTENSIONS = new Set([\n '.swift', '.ts', '.tsx', '.js', '.jsx', '.py', '.ino', '.cpp', '.c', '.h', '.hpp',\n '.kt', '.kts', '.java', '.cs', '.rb', '.go', '.rs', '.php', '.lua', '.r', '.m',\n]);\n\nconst NON_CODE_EXTENSIONS = new Set([\n '.stl', '.obj', '.step', '.stp', '.iges', '.igs', // 3D models\n '.png', '.jpg', '.jpeg', '.gif', '.svg', '.bmp', // Images\n '.pdf', '.doc', '.docx', '.pptx', '.xlsx', // Documents\n '.tc3', '.f3d', // CAD files\n '.mp3', '.wav', '.midi', // Audio\n '.mp4', '.avi', '.mov', // Video\n]);\n\n/**\n * Detect input type from user-provided options.\n */\nexport function detectInputType(options: DetectInputTypeOptions): InputTypeDetectionResult {\n const evidence: string[] = [];\n let repoScore = 0;\n let syllabusScore = 0;\n let filesScore = 0;\n let descriptionScore = 0;\n\n // Check for repository signals\n if (options.repoUrl) {\n repoScore += 0.5;\n evidence.push(`repoUrl provided: ${options.repoUrl}`);\n }\n if (options.repoDir) {\n repoScore += 0.5;\n evidence.push(`repoDir provided: ${options.repoDir}`);\n }\n\n // Check for syllabus signals\n if (options.syllabusText && options.syllabusText.length > 50) {\n syllabusScore += 0.6;\n evidence.push(`syllabusText provided (${options.syllabusText.length} chars)`);\n }\n if (options.chapters && options.chapters.length > 0) {\n syllabusScore += 0.4;\n evidence.push(`${options.chapters.length} chapters provided`);\n }\n\n // Check for file signals\n if (options.fileExtensions && options.fileExtensions.length > 0) {\n const codeCount = options.fileExtensions.filter(ext => CODE_EXTENSIONS.has(ext)).length;\n const nonCodeCount = options.fileExtensions.filter(ext => NON_CODE_EXTENSIONS.has(ext)).length;\n\n if (nonCodeCount > 0) {\n filesScore += 0.7;\n evidence.push(`${nonCodeCount} non-code files detected: ${options.fileExtensions.filter(ext => NON_CODE_EXTENSIONS.has(ext)).join(', ')}`);\n }\n if (codeCount > 0 && repoScore === 0) {\n repoScore += 0.3;\n evidence.push(`${codeCount} source code files detected`);\n }\n }\n\n // Check for description signals\n if (options.description && options.description.length > 100) {\n descriptionScore += 0.5;\n evidence.push(`description provided (${options.description.length} chars)`);\n }\n if (options.goal && options.goal.length > 20) {\n descriptionScore += 0.3;\n evidence.push(`goal provided (${options.goal.length} chars)`);\n }\n\n // Determine winner\n const scores = [\n { type: 'repository' as InputType, score: repoScore },\n { type: 'syllabus' as InputType, score: syllabusScore },\n { type: 'files' as InputType, score: filesScore },\n { type: 'description' as InputType, score: descriptionScore },\n ];\n\n scores.sort((a, b) => b.score - a.score);\n const winner = scores[0];\n\n // Check for mixed\n const activeTypes = scores.filter(s => s.score >= 0.3);\n if (activeTypes.length >= 2) {\n return {\n inputType: 'mixed',\n confidence: 0.7,\n evidence: [...evidence, `Mixed input detected: ${activeTypes.map(t => t.type).join(' + ')}`],\n };\n }\n\n if (winner.score === 0) {\n return {\n inputType: 'description',\n confidence: 0.3,\n evidence: [...evidence, 'No strong signals — defaulting to description'],\n };\n }\n\n return {\n inputType: winner.type,\n confidence: Math.min(winner.score, 1.0),\n evidence,\n };\n}\n","/**\n * Domain Category Detection — determines the subject domain from context.\n *\n * Uses multi-signal scoring:\n * - File extensions (code vs non-code, context-dependent)\n * - Keywords in description/goal (multi-language)\n * - Tech stack mentions\n * - Subject-specific vocabulary\n * - Disambiguation for overlapping domains (e.g., .cpp in software vs hardware)\n */\n\nimport type { DomainCategory } from '../schemas/domainProfileSchema';\n\nexport interface DomainDetectionResult {\n domainCategory: DomainCategory;\n confidence: number;\n evidence: string[];\n detectedTechStack: string[];\n detectedSubject: string;\n ambiguous?: { domain1: DomainCategory; domain2: DomainCategory; reason: string };\n}\n\nexport interface DetectDomainOptions {\n description?: string;\n goal?: string;\n syllabusText?: string;\n techStack?: string;\n fileExtensions?: string[];\n repoUrl?: string;\n}\n\n\n\n\n// ─── Keyword lists per domain (broad matching) ──────────────────────────────\nconst DOMAIN_KEYWORDS: Record<DomainCategory, string[]> = {\n software: [\n 'app', 'web', 'api', 'database', 'frontend', 'backend', 'mobile',\n 'swift', 'react', 'vue', 'angular', 'node', 'python', 'java',\n 'typescript', 'javascript', 'html', 'css', 'sql', 'rest', 'graphql',\n 'git', 'docker', 'kubernetes', 'ci/cd', 'deploy',\n 'swiftui', 'uikit', 'flutter', 'kotlin', 'android', 'ios',\n 'nextjs', 'nuxt', 'svelte', 'django', 'flask', 'express',\n ],\n hardware_iot: [\n 'arduino', 'robot', 'sensor', 'motor', 'esp32', 'gpio',\n 'raspberry pi', 'iot', 'firmware', 'embedded', 'microcontroller',\n 'led', 'servo', 'potentiometer', 'breadboard', 'soldering',\n 'i2c', 'spi', 'pwm', 'uart', 'analog', 'digital',\n 'ultrasonic', 'infrared', 'bluetooth', 'wifi module',\n 'pin', 'voltage', 'resistor', 'capacitor', 'circuit',\n ],\n '3d_design': [\n 'tinkercad', '3d model', 'cad', 'parametric', 'stl', 'obj',\n 'fusion360', 'blender', 'solidworks', 'autocad', 'freecad',\n 'shape', 'dimension', 'extrude', 'revolve', 'fillet', 'chamfer',\n 'assembly', 'constraint', 'sketch', 'plane', 'axis',\n 'render', 'mesh', 'nurbs', 'surface', 'volume',\n ],\n math: [\n // Vietnamese\n 'hình học', 'đại số', 'giải tích', 'xác suất', 'thống kê',\n 'tam giác', 'đường tròn', 'phương trình', 'bất phương trình',\n 'số học', 'tổ hợp', 'hoán vị', 'độ đo', 'góc', 'cạnh',\n 'diện tích', 'thể tích', 'chu vi', 'đường cao', 'trung tuyến',\n // English\n 'geometry', 'algebra', 'calculus', 'trigonometry', 'logarithm',\n 'probability', 'statistics', 'derivative', 'integral', 'matrix',\n 'vector', 'theorem', 'proof', 'angle', 'perimeter', 'area',\n // Chinese\n '几何', '代数', '微积分', '概率', '统计', '三角形', '圆', '方程',\n // Japanese\n '幾何', '代数', '微分', '積分', '確率', '統計',\n // French\n 'géométrie', 'algèbre', 'calcul', 'trigonométrie', 'probabilité',\n ],\n science: [\n // Vietnamese\n 'lý thuyết', 'nguyên lý', 'thí nghiệm', 'điện', 'lực',\n 'hóa học', 'sinh học', 'vật lý', 'địa lý',\n 'phản ứng', 'nguyên tố', 'phân tử',\n 'năng lượng', 'cảm ứng', 'từ trường', 'quang học',\n 'môi trường', 'sinh thái',\n // English\n 'physics', 'chemistry', 'biology', 'earth science',\n 'cell', 'gene', 'evolution', 'ecosystem', 'molecule', 'atom',\n // Chinese\n '物理', '化学', '生物', '地理',\n // Japanese\n '物理', '化学', '生物',\n // French\n 'physique', 'chimie', 'biologie',\n ],\n language: [\n // Vietnamese\n 'tiếng anh', 'tiếng việt', 'ngữ pháp', 'từ vựng',\n 'đọc', 'viết', 'nói', 'nghe',\n // English\n 'grammar', 'vocabulary', 'writing', 'reading', 'speaking',\n 'listening', 'pronunciation', 'essay', 'paragraph', 'sentence',\n 'verb', 'noun', 'adjective', 'ielts', 'toeic', 'toefl',\n // Chinese\n '英语', '语法', '词汇', '阅读', '写作',\n // Japanese\n '英語', '文法', '語彙', '読解', '作文',\n // French\n 'anglais', 'grammaire', 'vocabulaire', 'lecture', 'écriture',\n ],\n arts: [\n // Vietnamese\n 'âm nhạc', 'nhạc lý', 'solfège', 'đàn', 'piano', 'guitar',\n 'hội họa', 'thiết kế', 'nhiếp ảnh',\n 'tranh', 'màu', 'sáng tác', 'biên khúc',\n // English\n 'music', 'art', 'painting', 'drawing', 'sketch', 'photography',\n 'color theory', 'composition', 'typography', 'layout',\n 'digital art', 'illustration', 'figma',\n // Chinese\n '音乐', '美术', '绘画', '摄影', '设计',\n // Japanese\n '音楽', '美術', '絵画', '写真', 'デザイン',\n // French\n 'musique', 'art', 'peinture', 'dessin', 'photographie',\n ],\n research: [\n // Vietnamese\n 'nghiên cứu', 'thống kê', 'phương pháp luận', 'phân tích dữ liệu',\n 'định tính', 'định lượng', 'giả thuyết',\n 'mẫu', 'tổng thể', 'tương quan', 'hồi quy',\n 'tài liệu tham khảo', 'trích dẫn', 'tóm tắt',\n // English\n 'research', 'survey', 'methodology', 'data analysis',\n 'qualitative', 'quantitative', 'hypothesis', 'experiment',\n 'sample', 'population', 'correlation', 'regression',\n 'literature review', 'citation', 'abstract',\n // Chinese\n '研究', '调查', '方法论', '数据分析',\n // Japanese\n '研究', '調査', '方法論', 'データ分析',\n // French\n 'recherche', 'enquête', 'méthodologie', 'analyse de données',\n ],\n business: [\n // Vietnamese\n 'kinh doanh', 'tài chính', 'quản lý', 'marketing', 'bán hàng',\n 'khởi nghiệp', 'kế hoạch kinh doanh', 'doanh thu', 'lợi nhuận',\n 'quản trị', 'tài khoản', 'đầu tư', 'ngân sách',\n // English\n 'business', 'finance', 'accounting', 'investment', 'budget',\n 'startup', 'revenue', 'profit', 'roi', 'sales',\n 'product management', 'agile', 'scrum', 'kanban',\n // Chinese\n '商业', '金融', '会计', '投资', '营销',\n // Japanese\n 'ビジネス', '金融', '会計', '投資', 'マーケティング',\n // French\n 'affaires', 'finance', 'comptabilité', 'investissement',\n ],\n other: [],\n};\n\n// ─── Extension → Domain mapping (context-dependent for ambiguous extensions) ──\nconst EXTENSION_DOMAIN: Record<string, DomainCategory> = {\n '.swift': 'software',\n '.ts': 'software', '.tsx': 'software',\n '.js': 'software', '.jsx': 'software',\n '.py': 'software',\n '.kt': 'software', '.kts': 'software',\n '.java': 'software', '.cs': 'software',\n '.go': 'software', '.rs': 'software',\n '.rb': 'software', '.php': 'software',\n '.lua': 'software', '.r': 'software',\n // .ino is ALWAYS hardware\n '.ino': 'hardware_iot',\n // .cpp/.c/.h are CONTEXT-DEPENDENT → resolve in detection logic\n '.stl': '3d_design', '.obj': '3d_design',\n '.step': '3d_design', '.stp': '3d_design',\n '.tc3': '3d_design', '.f3d': '3d_design',\n};\n\n// Extensions that need context disambiguation\nconst AMBIGUOUS_EXTENSIONS = new Set(['.cpp', '.c', '.h', '.hpp']);\n\n// ─── Syllabus language detection ─────────────────────────────────────────────\nconst LANG_PATTERNS: Array<{ lang: string; patterns: RegExp[] }> = [\n { lang: 'vi', patterns: [/[ạảãàáạảãạ]/i, /\\bgiải\\b/, /\\btính\\b/] },\n { lang: 'zh', patterns: [/[\\u4e00-\\u9fff]{2,}/] },\n { lang: 'ja', patterns: [/[\\u3040-\\u309f\\u30a0-\\u30ff]{2,}/] },\n { lang: 'ko', patterns: [/[\\uac00-\\ud7af]{2,}/] },\n { lang: 'fr', patterns: [/\\b(la|le|les|des|une|est|sont|avec|pour|dans)\\b/i] },\n];\n\nfunction detectSyllabusLanguage(text: string): string {\n for (const { lang, patterns } of LANG_PATTERNS) {\n if (patterns.some(p => p.test(text))) return lang;\n }\n return 'en';\n}\n\n// ─── Main Detection Function ─────────────────────────────────────────────────\nexport function detectDomain(options: DetectDomainOptions): DomainDetectionResult {\n const evidence: string[] = [];\n const detectedTechStack: string[] = [];\n let detectedSubject = '';\n let ambiguous: DomainDetectionResult['ambiguous'];\n\n const scores: Record<DomainCategory, number> = {\n software: 0, hardware_iot: 0, '3d_design': 0,\n math: 0, science: 0, language: 0, arts: 0,\n research: 0, business: 0, other: 0,\n };\n\n // ─── 1. File Extension Signals ───────────────────────────────────────────\n const hasHardwareContext = !!(\n options.techStack?.toLowerCase().match(/arduino|esp32|raspberry|embedded|iot/)\n || options.description?.toLowerCase().match(/arduino|robot|sensor|motor|circuit/)\n || options.goal?.toLowerCase().match(/arduino|robot|sensor|motor|circuit/)\n );\n\n const hasSoftwareContext = !!(\n options.techStack?.toLowerCase().match(/swift|react|vue|angular|python|java|typescript|javascript/)\n || options.description?.toLowerCase().match(/app|web|api|frontend|backend|mobile/)\n || options.goal?.toLowerCase().match(/app|web|api|frontend|backend|mobile/)\n );\n\n if (options.fileExtensions) {\n for (const ext of options.fileExtensions) {\n const extLower = ext.toLowerCase();\n\n // Always-hardware extensions\n if (extLower === '.ino') {\n scores.hardware_iot += 0.5;\n evidence.push(`File extension ${ext} → hardware_iot (always)`);\n continue;\n }\n\n // Ambiguous extensions → context-dependent\n if (AMBIGUOUS_EXTENSIONS.has(extLower)) {\n if (hasHardwareContext && !hasSoftwareContext) {\n scores.hardware_iot += 0.3;\n evidence.push(`File extension ${ext} → hardware_iot (hardware context)`);\n } else if (hasSoftwareContext && !hasHardwareContext) {\n scores.software += 0.3;\n evidence.push(`File extension ${ext} → software (software context)`);\n } else if (hasHardwareContext && hasSoftwareContext) {\n // Both contexts → slight preference for software (more common for .cpp)\n scores.software += 0.15;\n scores.hardware_iot += 0.15;\n evidence.push(`File extension ${ext} → ambiguous (both software and hardware context)`);\n ambiguous = {\n domain1: 'software',\n domain2: 'hardware_iot',\n reason: `.cpp/.c/.h files present with both software and hardware context keywords`,\n };\n } else {\n // No context → default to software\n scores.software += 0.2;\n evidence.push(`File extension ${ext} → software (default, no context)`);\n }\n continue;\n }\n\n // Clear mapping extensions\n const domain = EXTENSION_DOMAIN[extLower];\n if (domain) {\n scores[domain] += 0.3;\n evidence.push(`File extension ${ext} → ${domain}`);\n }\n }\n }\n\n // ─── 2. Text Content Signals (multi-language) ─────────────────────────────\n const textContent = [\n options.description || '',\n options.goal || '',\n options.syllabusText || '',\n ].join(' ').toLowerCase();\n\n for (const [domain, keywords] of Object.entries(DOMAIN_KEYWORDS)) {\n const cat = domain as DomainCategory;\n for (const kw of keywords) {\n if (textContent.includes(kw.toLowerCase())) {\n scores[cat] += 0.1;\n if (!evidence.some(e => e.includes(`\"${kw}\"`))) {\n evidence.push(`Keyword \"${kw}\" → ${cat}`);\n }\n }\n }\n }\n\n // ─── 3. Tech Stack Signals ────────────────────────────────────────────────\n if (options.techStack) {\n const techItems = options.techStack.split(',').map(t => t.trim());\n for (const tech of techItems) {\n const techL = tech.toLowerCase();\n if (['swift', 'swiftui', 'uikit', 'ios'].some(k => techL.includes(k))) {\n scores.software += 0.4;\n detectedTechStack.push(tech);\n } else if (['react', 'vue', 'angular', 'next', 'nuxt', 'typescript', 'javascript'].some(k => techL.includes(k))) {\n scores.software += 0.4;\n detectedTechStack.push(tech);\n } else if (['python', 'django', 'flask'].some(k => techL.includes(k))) {\n scores.software += 0.3;\n detectedTechStack.push(tech);\n } else if (['arduino', 'esp32', 'raspberry'].some(k => techL.includes(k))) {\n scores.hardware_iot += 0.5;\n detectedTechStack.push(tech);\n } else if (['tinkercad', 'fusion360', 'blender'].some(k => techL.includes(k))) {\n scores['3d_design'] += 0.5;\n detectedTechStack.push(tech);\n } else if (['c++', 'c', 'cpp'].some(k => techL === k || techL.endsWith(k))) {\n // C++/C → context-dependent\n if (hasHardwareContext) {\n scores.hardware_iot += 0.3;\n } else {\n scores.software += 0.3;\n }\n detectedTechStack.push(tech);\n }\n }\n }\n\n // ─── 4. Syllabus Content Signals (with language detection) ────────────────\n if (options.syllabusText) {\n const syllabusLang = detectSyllabusLanguage(options.syllabusText);\n const syllabusLower = options.syllabusText.toLowerCase();\n\n if (syllabusLower.includes('hình học') || syllabusLower.includes('đại số')\n || syllabusLower.includes('geometry') || syllabusLower.includes('algebra')\n || syllabusLower.includes('几何') || syllabusLower.includes('代数')\n || syllabusLower.includes('幾何') || syllabusLower.includes('代数')\n || syllabusLower.includes('géométrie') || syllabusLower.includes('algèbre')) {\n scores.math += 0.5;\n detectedSubject = 'Mathematics';\n } else if (syllabusLower.includes('vật lý') || syllabusLower.includes('hóa')\n || syllabusLower.includes('sinh') || syllabusLower.includes('physics')\n || syllabusLower.includes('chemistry') || syllabusLower.includes('biology')\n || syllabusLower.includes('物理') || syllabusLower.includes('化学')\n || syllabusLower.includes('物理') || syllabusLower.includes('化学')\n || syllabusLower.includes('physique') || syllabusLower.includes('chimie')) {\n scores.science += 0.5;\n detectedSubject = 'Natural Science';\n } else if (syllabusLower.includes('tiếng anh') || syllabusLower.includes('english')\n || syllabusLower.includes('grammar') || syllabusLower.includes('英语')\n || syllabusLower.includes('英語') || syllabusLower.includes('anglais')) {\n scores.language += 0.5;\n detectedSubject = 'English Language';\n }\n\n evidence.push(`Syllabus language detected: ${syllabusLang}`);\n }\n\n // ─── 5. Scoring & Winner ─────────────────────────────────────────────────\n const entries = Object.entries(scores).filter(([k]) => k !== 'other') as [DomainCategory, number][];\n entries.sort((a, b) => b[1] - a[1]);\n const [winner, winnerScore] = entries[0];\n\n if (winnerScore === 0) {\n return {\n domainCategory: 'other',\n confidence: 0.2,\n evidence: [...evidence, 'No domain signals detected'],\n detectedTechStack,\n detectedSubject,\n };\n }\n\n // Check for near-tie (within 0.15) → ambiguous\n const second = entries[1];\n if (second && (winnerScore - second[1]) < 0.15 && winnerScore > 0) {\n ambiguous = {\n domain1: winner,\n domain2: second[0],\n reason: `Scores very close: ${winner}=${winnerScore.toFixed(2)}, ${second[0]}=${second[1].toFixed(2)}`,\n };\n }\n\n const totalScore = entries.reduce((sum, [, s]) => sum + s, 0);\n const confidence = totalScore > 0 ? Math.min(winnerScore / totalScore + 0.3, 1.0) : 0.3;\n\n return {\n domainCategory: winner,\n confidence,\n evidence: evidence.slice(0, 20),\n detectedTechStack,\n detectedSubject,\n ambiguous,\n };\n}\n","/**\n * Learning Mode Detection — determines product vs concept vs hybrid.\n *\n * Logic:\n * - Repository + build verbs → product\n * - Syllabus + no source code → concept\n * - Repository + understanding verbs → hybrid\n * - Domain category heuristic (math/science → concept, software/hardware → product)\n */\n\nimport type { LearningMode, DomainCategory, InputType } from '../schemas/domainProfileSchema';\n\nexport interface LearningModeDetectionResult {\n learningMode: LearningMode;\n confidence: number;\n evidence: string[];\n}\n\nexport interface DetectLearningModeOptions {\n inputType: InputType;\n domainCategory: DomainCategory;\n goal?: string;\n description?: string;\n hasRepo: boolean;\n hasSyllabus: boolean;\n}\n\n// ─── Verb patterns ───────────────────────────────────────────────────────────\n\nconst BUILD_VERBS = [\n 'build', 'create', 'develop', 'implement', 'construct', 'make',\n 'xây dựng', 'tạo', 'phát triển', 'triển khai', 'lắp ráp',\n 'code', 'program', 'design a', 'set up', 'deploy',\n];\n\nconst UNDERSTAND_VERBS = [\n 'understand', 'learn', 'grasp', 'comprehend', 'master',\n 'hiểu', 'nắm vững', 'học', 'tiếp thu', 'am hiểu',\n 'vận dụng', 'phân tích', 'đánh giá', 'so sánh',\n 'explain', 'describe', 'analyze', 'evaluate', 'compare',\n];\n\nconst CONCEPT_DOMAINS: DomainCategory[] = ['math', 'science', 'language', 'arts', 'research', 'business'];\nconst PRODUCT_DOMAINS: DomainCategory[] = ['software', 'hardware_iot', '3d_design'];\n\n/**\n * Detect learning mode from context.\n */\nexport function detectLearningMode(options: DetectLearningModeOptions): LearningModeDetectionResult {\n const evidence: string[] = [];\n const text = [options.goal || '', options.description || ''].join(' ').toLowerCase();\n\n let productScore = 0;\n let conceptScore = 0;\n\n // 1. Input type signals\n if (options.hasRepo) {\n productScore += 0.3;\n evidence.push('Repository present → product signal');\n }\n if (options.hasSyllabus) {\n conceptScore += 0.3;\n evidence.push('Syllabus present → concept signal');\n }\n\n // 2. Domain category heuristic\n if (PRODUCT_DOMAINS.includes(options.domainCategory)) {\n productScore += 0.2;\n evidence.push(`Domain ${options.domainCategory} → product倾向`);\n }\n if (CONCEPT_DOMAINS.includes(options.domainCategory)) {\n conceptScore += 0.2;\n evidence.push(`Domain ${options.domainCategory} → concept倾向`);\n }\n\n // 3. Verb pattern matching\n const hasBuildVerbs = BUILD_VERBS.some(v => text.includes(v));\n const hasUnderstandVerbs = UNDERSTAND_VERBS.some(v => text.includes(v));\n\n if (hasBuildVerbs) {\n productScore += 0.3;\n evidence.push('Build verbs detected in goal/description');\n }\n if (hasUnderstandVerbs) {\n conceptScore += 0.3;\n evidence.push('Understand verbs detected in goal/description');\n }\n\n // 4. Determine mode\n const total = productScore + conceptScore;\n if (total === 0) {\n return {\n learningMode: 'product',\n confidence: 0.3,\n evidence: [...evidence, 'No signals — defaulting to product'],\n };\n }\n\n // Check for hybrid\n if (productScore >= 0.3 && conceptScore >= 0.3) {\n const hybridConf = Math.min((productScore + conceptScore) / 2, 1.0);\n return {\n learningMode: 'hybrid',\n confidence: hybridConf,\n evidence: [...evidence, `Mixed signals: product=${productScore.toFixed(2)}, concept=${conceptScore.toFixed(2)} → hybrid`],\n };\n }\n\n if (productScore > conceptScore) {\n const raw = total > 0 ? productScore / total : 0.5;\n return {\n learningMode: 'product',\n confidence: Math.min(Math.max(raw, 0) + 0.2, 1.0),\n evidence,\n };\n }\n\n const raw = total > 0 ? conceptScore / total : 0.5;\n return {\n learningMode: 'concept',\n confidence: Math.min(Math.max(raw, 0) + 0.2, 1.0),\n evidence,\n };\n}\n","/**\n * Domain Profile Detection Orchestrator — combines all detection modules.\n */\n\nimport { detectInputType, type DetectInputTypeOptions } from './inputTypeDetector';\nimport { detectDomain, type DetectDomainOptions } from './domainDetector';\nimport { detectLearningMode } from './learningModeDetector';\nimport type { DomainProfile, GraphType } from '../schemas/domainProfileSchema';\nimport type { ParsedSyllabus } from '../parsers/syllabusParser';\n\nexport interface DetectDomainProfileOptions {\n repoUrl?: string;\n repoDir?: string;\n description?: string;\n goal?: string;\n syllabusText?: string;\n parsedSyllabus?: ParsedSyllabus;\n chapters?: string[];\n fileExtensions?: string[];\n techStack?: string;\n gradeBand?: [number, number];\n}\n\nexport function detectDomainProfile(options: DetectDomainProfileOptions): DomainProfile {\n const effectiveSyllabus = options.syllabusText || options.parsedSyllabus?.rawText || '';\n const inputResult = detectInputType({\n ...options,\n syllabusText: effectiveSyllabus,\n });\n\n const domainResult = detectDomain({\n description: options.description,\n goal: options.goal,\n syllabusText: effectiveSyllabus,\n techStack: options.techStack,\n fileExtensions: options.fileExtensions,\n repoUrl: options.repoUrl,\n });\n\n const modeResult = detectLearningMode({\n inputType: inputResult.inputType,\n domainCategory: domainResult.domainCategory,\n goal: options.goal,\n description: options.description,\n hasRepo: !!(options.repoUrl || options.repoDir),\n hasSyllabus: !!(effectiveSyllabus || (options.chapters && options.chapters.length > 0) || options.parsedSyllabus),\n });\n\n const graphType = determineGraphType(modeResult.learningMode);\n\n return {\n inputType: inputResult.inputType,\n domainCategory: (domainResult.domainCategory === 'other' && options.parsedSyllabus?.subject.domain)\n ? (options.parsedSyllabus.subject.domain as any)\n : domainResult.domainCategory,\n learningMode: modeResult.learningMode,\n graphType,\n confidence: {\n inputType: inputResult.confidence,\n domainCategory: domainResult.confidence,\n learningMode: modeResult.confidence,\n },\n evidence: [...inputResult.evidence, ...domainResult.evidence, ...modeResult.evidence],\n detectedTechStack: domainResult.detectedTechStack,\n detectedSubject: options.parsedSyllabus?.subject.title || domainResult.detectedSubject,\n detectedDomain: domainResult.domainCategory,\n goal: options.goal || '',\n description: options.description || '',\n repoUrl: options.repoUrl || '',\n repoDir: options.repoDir || '',\n syllabusText: effectiveSyllabus,\n };\n}\n\nfunction determineGraphType(learningMode: string): GraphType {\n switch (learningMode) {\n case 'product': return 'project_graph';\n case 'concept': return 'knowledge_graph';\n case 'hybrid': return 'hybrid_graph';\n default: return 'project_graph';\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-IJZUV7N3.mjs.map
3
+ //# sourceMappingURL=chunk-IJZUV7N3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-IJZUV7N3.mjs"}