@pranavraut033/ats-checker 1.1.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +111 -5
- package/dist/chunk-ZJ5E4H7Z.mjs +446 -0
- package/dist/chunk-ZJ5E4H7Z.mjs.map +1 -0
- package/dist/{index.js → index.cjs} +512 -67
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +4 -259
- package/dist/index.d.ts +4 -259
- package/dist/index.mjs +278 -274
- package/dist/index.mjs.map +1 -1
- package/dist/lang/de/index.cjs +70 -0
- package/dist/lang/de/index.cjs.map +1 -0
- package/dist/lang/de/index.d.mts +16 -0
- package/dist/lang/de/index.d.ts +16 -0
- package/dist/lang/de/index.mjs +65 -0
- package/dist/lang/de/index.mjs.map +1 -0
- package/dist/lang/en/index.cjs +212 -0
- package/dist/lang/en/index.cjs.map +1 -0
- package/dist/lang/en/index.d.mts +5 -0
- package/dist/lang/en/index.d.ts +5 -0
- package/dist/lang/en/index.mjs +9 -0
- package/dist/lang/en/index.mjs.map +1 -0
- package/dist/pdf/index.cjs +81 -0
- package/dist/pdf/index.cjs.map +1 -0
- package/dist/pdf/index.d.mts +12 -0
- package/dist/pdf/index.d.ts +12 -0
- package/dist/pdf/index.mjs +79 -0
- package/dist/pdf/index.mjs.map +1 -0
- package/dist/scoring-BCShrnki.d.mts +319 -0
- package/dist/scoring-BCShrnki.d.ts +319 -0
- package/package.json +30 -3
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/text.ts","../src/utils/skills.ts","../src/utils/languages.ts","../src/core/parser/jd.parser.ts","../src/utils/dates.ts","../src/core/parser/resume.parser.ts","../src/core/rules/rule.engine.ts","../src/core/scoring/scorer.ts","../src/profiles/index.ts","../src/core/scoring/weights.ts","../src/core/suggestions/suggestion.engine.ts","../src/llm/llm.budget.ts","../src/llm/validation.ts","../src/llm/llm.manager.ts","../src/llm/llm.schemas.ts","../src/llm/llm.prompts.ts","../src/llm/llm.adapters.ts","../src/index.ts"],"names":["e"],"mappings":"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","file":"index.cjs","sourcesContent":["export const STOP_WORDS = new Set([\n // articles / prepositions / conjunctions\n \"the\", \"and\", \"or\", \"a\", \"an\", \"of\", \"for\", \"to\", \"with\", \"in\", \"on\", \"at\",\n \"by\", \"from\", \"as\", \"into\", \"onto\", \"upon\", \"via\", \"per\", \"plus\",\n // verbs / modals\n \"is\", \"are\", \"be\", \"was\", \"were\", \"will\", \"can\", \"should\", \"must\", \"have\",\n \"has\", \"had\", \"do\", \"does\", \"did\", \"get\", \"give\", \"go\", \"use\", \"see\",\n \"help\", \"work\", \"build\", \"show\", \"need\", \"want\", \"make\", \"let\",\n // pronouns / determiners\n \"it\", \"its\", \"this\", \"that\", \"these\", \"those\", \"we\", \"our\", \"you\", \"your\",\n \"they\", \"their\", \"us\", \"who\", \"what\", \"which\", \"how\",\n // common English fillers that leak into JDs\n \"no\", \"not\", \"all\", \"any\", \"also\", \"more\", \"well\", \"very\", \"highly\",\n \"across\", \"over\", \"under\", \"within\", \"about\", \"out\", \"up\", \"down\",\n \"new\", \"if\", \"so\", \"such\", \"both\", \"each\", \"one\", \"many\", \"only\",\n // JD/HR boilerplate — never skills\n \"years\", \"year\", \"experience\", \"required\", \"requirement\", \"requirements\",\n \"preferred\", \"role\", \"degree\", \"practices\", \"best\", \"skills\", \"team\",\n \"field\", \"related\", \"relevant\", \"desired\", \"strong\", \"solid\", \"good\",\n \"first\", \"based\", \"day\", \"week\", \"month\", \"time\", \"fast\", \"open\", \"dynamic\",\n]);\n\nexport function normalizeWhitespace(text: string): string {\n return text.replace(/\\r\\n?/g, \"\\n\").replace(/\\s+/g, \" \").trim();\n}\n\nexport function normalizeForComparison(text: string): string {\n // NFKC folds fullwidth/accented chars before lowercasing (locale-independent)\n return normalizeWhitespace(text).normalize(\"NFKC\").toLowerCase();\n}\n\nexport function splitLines(text: string): string[] {\n return text\n .replace(/\\r\\n?/g, \"\\n\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n}\n\n// Tech-aware token pattern: alnum start, optional internal . # + - / chars, alnum-or-symbol end.\n// Preserves c#, c++, node.js, ci/cd, full-stack, a/b as single tokens; drops lone single chars.\n// ponytail: custom regex beats any NLP lib here — domain-specific, no dep, fully deterministic\nconst TECH_TOKEN_RE = /[a-z0-9][a-z0-9.#+\\-/]*[a-z0-9#+]/g;\n\nexport function tokenize(text: string): string[] {\n const normalized = normalizeForComparison(text);\n // Require at least one letter: drops bare numbers (100, 3+, 50%) and keeps c#, 3d, node.js\n return (normalized.match(TECH_TOKEN_RE) ?? []).filter(\n (t) => /[a-z]/.test(t) && !STOP_WORDS.has(t)\n );\n}\n\nexport function escapeRegExp(input: string): string {\n return input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport function unique(values: string[]): string[] {\n const seen = new Set<string>();\n const output: string[] = [];\n for (const value of values) {\n const lower = value.toLowerCase();\n if (!seen.has(lower)) {\n seen.add(lower);\n output.push(value);\n }\n }\n return output;\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport function countFrequencies(values: string[]): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const value of values) {\n counts[value] = (counts[value] ?? 0) + 1;\n }\n return counts;\n}\n\nexport function containsTableLikeStructure(text: string): boolean {\n const lines = splitLines(text);\n let tableLines = 0;\n for (const line of lines) {\n const hasPipeColumns = line.includes(\"|\") && line.split(\"|\").length >= 3;\n const hasTabColumns = /\\t.+\\t/.test(line);\n const hasAlignedSpaces = /( {3,})(\\S+)( {3,}\\S+)/.test(line);\n if (hasPipeColumns || hasTabColumns || hasAlignedSpaces) {\n tableLines += 1;\n }\n }\n return tableLines >= 2;\n}\n","import { KeywordCategory, KeywordRegistry, SkillAliases } from \"../types/config\";\nimport { unique } from \"./text\";\n\n// ponytail: Map lookup, not fuzzy match — add fuzzy only if real misses show up.\nconst aliasIndexCache = new WeakMap<SkillAliases, Map<string, string>>();\n\nfunction getAliasIndex(aliases: SkillAliases): Map<string, string> {\n let index = aliasIndexCache.get(aliases);\n if (!index) {\n index = new Map();\n for (const [canonical, aliasList] of Object.entries(aliases)) {\n const lower = canonical.toLowerCase();\n index.set(lower, lower);\n for (const alias of aliasList) {\n index.set(alias.toLowerCase(), lower);\n }\n }\n aliasIndexCache.set(aliases, index);\n }\n return index;\n}\n\nexport function normalizeSkill(skill: string, aliases: SkillAliases): string {\n const normalized = skill.trim().toLowerCase();\n return getAliasIndex(aliases).get(normalized) ?? normalized;\n}\n\nexport function normalizeSkills(skills: string[], aliases: SkillAliases): string[] {\n return unique(skills.map((skill) => normalizeSkill(skill, aliases)));\n}\n\nexport function skillMatched(candidate: string, targetSkills: Set<string>, aliases: SkillAliases): boolean {\n const normalizedCandidate = normalizeSkill(candidate, aliases);\n return targetSkills.has(normalizedCandidate);\n}\n\n/** Derive a flat canonical->aliases map from a keyword registry (back-compat with SkillAliases). */\nexport function deriveSkillAliases(registry: KeywordRegistry): SkillAliases {\n const aliases: SkillAliases = {};\n for (const entry of registry) {\n aliases[entry.canonical] = entry.aliases;\n }\n return aliases;\n}\n\n/** Derive a canonical->category lookup from a keyword registry. */\nexport function buildCategoryIndex(registry: KeywordRegistry): Map<string, KeywordCategory> {\n const index = new Map<string, KeywordCategory>();\n for (const entry of registry) {\n index.set(entry.canonical.toLowerCase(), entry.category);\n }\n return index;\n}\n\n/** Merge two registries by canonical term; entries in `overrides` win. */\nexport function mergeKeywordRegistries(base: KeywordRegistry, overrides: KeywordRegistry): KeywordRegistry {\n const byCanonical = new Map<string, KeywordRegistry[number]>();\n for (const entry of base) byCanonical.set(entry.canonical.toLowerCase(), entry);\n for (const entry of overrides) byCanonical.set(entry.canonical.toLowerCase(), entry);\n return [...byCanonical.values()];\n}\n","import { ParsedLanguage } from \"../types/parser\";\n\n// ponytail: seed list of common languages — extend as real-world JDs/resumes surface gaps.\nconst KNOWN_LANGUAGES = [\n \"english\", \"spanish\", \"french\", \"german\", \"italian\", \"portuguese\", \"dutch\",\n \"russian\", \"mandarin\", \"chinese\", \"cantonese\", \"japanese\", \"korean\", \"arabic\",\n \"hindi\", \"polish\", \"turkish\", \"vietnamese\", \"swedish\", \"norwegian\", \"danish\",\n \"finnish\", \"greek\", \"hebrew\", \"thai\", \"indonesian\", \"ukrainian\", \"czech\",\n];\n\nconst LANGUAGE_ALIASES: Record<string, string> = {\n mandarin: \"chinese\",\n cantonese: \"chinese\",\n};\n\n// CEFR rank (1-6) plus common descriptive proficiency words mapped to the closest CEFR band.\nconst LEVEL_RANK: Record<string, number> = {\n a1: 1, a2: 2, b1: 3, b2: 4, c1: 5, c2: 6,\n basic: 1, elementary: 1,\n limited: 2,\n conversational: 3, intermediate: 3,\n professional: 4, \"upper intermediate\": 4, advanced: 4,\n fluent: 5,\n native: 6, \"native speaker\": 6, bilingual: 6,\n};\n\nconst LANGUAGE_GROUP = KNOWN_LANGUAGES.join(\"|\");\nconst LEVEL_GROUP = Object.keys(LEVEL_RANK)\n .sort((a, b) => b.length - a.length)\n .map((l) => l.replace(/\\s+/g, \"\\\\s+\"))\n .join(\"|\");\n\n// Matches \"German (C1)\", \"German - C1\", \"German: fluent\", \"fluent German\", \"native German speaker\"\n// Comma deliberately excluded from the separator class — it's used to delimit list items\n// (\"German, native; Spanish, fluent\"), and treating it as a level separator would let one\n// entry's level bleed onto the next (\"Spanish, native English\" misreading Spanish as native).\nconst LANGUAGE_LEVEL_RE = new RegExp(\n `\\\\b(${LANGUAGE_GROUP})\\\\b(?:\\\\s*[\\\\(:\\\\-]?\\\\s*(${LEVEL_GROUP}|[abc][12]))?`,\n \"gi\"\n);\nconst LEVEL_BEFORE_LANGUAGE_RE = new RegExp(`\\\\b(${LEVEL_GROUP})\\\\s+(?:in\\\\s+)?(${LANGUAGE_GROUP})\\\\b`, \"gi\");\n\nfunction canonicalLanguage(name: string): string {\n const lower = name.toLowerCase();\n return LANGUAGE_ALIASES[lower] ?? lower;\n}\n\nfunction toParsedLanguage(name: string, level?: string): ParsedLanguage {\n const normalizedLevel = level?.toLowerCase().replace(/\\s+/g, \" \");\n return {\n name: canonicalLanguage(name),\n level: normalizedLevel,\n levelRank: normalizedLevel ? LEVEL_RANK[normalizedLevel] : undefined,\n };\n}\n\n/** Scan free text for \"<Language> (<level>)\" / \"<level> <Language>\" mentions. No section required. */\nexport function parseLanguageMentions(text: string): ParsedLanguage[] {\n const found = new Map<string, ParsedLanguage>();\n\n for (const match of text.matchAll(LANGUAGE_LEVEL_RE)) {\n const parsed = toParsedLanguage(match[1], match[2]);\n const existing = found.get(parsed.name);\n if (!existing || (parsed.levelRank ?? 0) > (existing.levelRank ?? 0)) {\n found.set(parsed.name, parsed);\n }\n }\n\n for (const match of text.matchAll(LEVEL_BEFORE_LANGUAGE_RE)) {\n const parsed = toParsedLanguage(match[2], match[1]);\n const existing = found.get(parsed.name);\n if (!existing || (parsed.levelRank ?? 0) > (existing.levelRank ?? 0)) {\n found.set(parsed.name, parsed);\n }\n }\n\n return [...found.values()].sort((a, b) => a.name.localeCompare(b.name));\n}\n\n/** Required language missing, or present at a lower CEFR rank than required. */\nexport function diffLanguages(\n resumeLanguages: ParsedLanguage[],\n requiredLanguages: ParsedLanguage[]\n): { matched: ParsedLanguage[]; missing: ParsedLanguage[] } {\n const byName = new Map(resumeLanguages.map((l) => [l.name, l]));\n const matched: ParsedLanguage[] = [];\n const missing: ParsedLanguage[] = [];\n\n for (const required of requiredLanguages) {\n const have = byName.get(required.name);\n const requiredRank = required.levelRank ?? 0;\n const haveRank = have?.levelRank ?? 0;\n if (have && haveRank >= requiredRank) {\n matched.push(required);\n } else {\n missing.push(required);\n }\n }\n\n return { matched, missing };\n}\n","import { ResolvedATSConfig, SkillAliases } from \"../../types/config\";\nimport { ParsedJobDescription } from \"../../types/parser\";\nimport { normalizeWhitespace, splitLines, tokenize, unique, STOP_WORDS } from \"../../utils/text\";\nimport { normalizeSkill, normalizeSkills } from \"../../utils/skills\";\nimport { parseLanguageMentions } from \"../../utils/languages\";\n\n// Map any variant found in JD text to a canonical form that also appears in resume text\nconst DEGREE_VARIANTS: [RegExp, string][] = [\n [/\\b(?:bachelor(?:'s)?|b\\.s\\.?|bs\\.?|bsc\\.?)\\b/i, \"bachelor\"],\n [/\\b(?:master(?:'s)?|m\\.s\\.?|ms\\.?|msc\\.?)\\b/i, \"master\"],\n [/\\b(?:phd|ph\\.d\\.?|doctorate)\\b/i, \"phd\"],\n [/\\bmba\\b/i, \"mba\"],\n [/\\bassociate(?:'s)?\\b/i, \"associate\"],\n];\n\nfunction extractRequiredSkills(lines: string[]): string[] {\n const required: string[] = [];\n for (const line of lines) {\n if (/must|require|required|need/i.test(line)) {\n required.push(...tokenize(line));\n }\n }\n return required;\n}\n\nfunction extractPreferredSkills(lines: string[]): string[] {\n const preferred: string[] = [];\n for (const line of lines) {\n if (/preferred|nice to have|plus/i.test(line)) {\n preferred.push(...tokenize(line));\n }\n }\n return preferred;\n}\n\nfunction extractRoleKeywords(text: string): string[] {\n const roleMatch = text.match(/(engineer|developer|manager|scientist|analyst|designer|architect)/i);\n const titleTokens = roleMatch ? roleMatch[0].split(/\\s+/) : [];\n return unique(tokenize(titleTokens.join(\" \") || text.split(/\\n/)[0] || \"\"));\n}\n\nfunction extractMinExperience(text: string): number | undefined {\n const match = text.match(/(\\d{1,2})\\+?\\s+(?:years|yrs)/i);\n if (match) {\n return Number.parseInt(match[1], 10);\n }\n return undefined;\n}\n\n// Case-preserving mirror of the tech-token pattern in utils/text.ts, so suggestions can quote\n// the JD's actual spelling/casing (\"JavaScript\") instead of the lowercased canonical form.\nconst SURFACE_TOKEN_RE = /[a-z0-9][a-z0-9.#+\\-/]*[a-z0-9#+]/gi;\n\nfunction collectKeywordSurfaceForms(rawText: string, aliases: SkillAliases): Record<string, string> {\n const matches = rawText.match(SURFACE_TOKEN_RE) ?? [];\n const surfaceForms: Record<string, string> = {};\n for (const match of matches) {\n const canonical = normalizeSkill(match, aliases);\n if (!(canonical in surfaceForms)) {\n surfaceForms[canonical] = match;\n }\n }\n return surfaceForms;\n}\n\nfunction extractEducationRequirements(text: string): string[] {\n const found = new Set<string>();\n for (const [pattern, canonical] of DEGREE_VARIANTS) {\n if (pattern.test(text)) found.add(canonical);\n }\n return [...found];\n}\n\nexport function parseJobDescription(\n jobDescription: string,\n config: ResolvedATSConfig\n): ParsedJobDescription {\n const normalizedText = normalizeWhitespace(jobDescription);\n const lines = splitLines(jobDescription);\n\n // Build vocab first — used to filter both skill lines AND body tokens\n const skillVocab = new Set<string>();\n for (const [canonical, aliases] of Object.entries(config.skillAliases)) {\n skillVocab.add(canonical.toLowerCase());\n for (const alias of aliases) skillVocab.add(alias.toLowerCase());\n }\n for (const s of config.profile?.mandatorySkills ?? []) skillVocab.add(s.toLowerCase());\n for (const s of config.profile?.optionalSkills ?? []) skillVocab.add(s.toLowerCase());\n\n // A skill-like token must be in vocab OR match a tech-symbol pattern:\n // . # + → always tech (c#, c++, node.js)\n // / → slash-compound: at least one part is 2+ chars AND not a stopword\n // (rest/graphql ✓, and/or ✗, m/f/d ✗, hours/week ✗)\n // - → only via vocab (scikit-learn ✓, berlin-based ✗, work-from-home ✗)\n const isSkillLike = (t: string): boolean => {\n if (skillVocab.has(t)) return true;\n if (/[.#+]/.test(t) && /[a-z]/.test(t)) return true;\n if (t.includes('/')) return t.split('/').some(p => p.length >= 2 && !STOP_WORDS.has(p));\n return false;\n };\n\n const requiredSkillsRaw = extractRequiredSkills(lines).filter(isSkillLike);\n const preferredSkillsRaw = extractPreferredSkills(lines).filter(isSkillLike);\n\n const requiredSkills = normalizeSkills(requiredSkillsRaw, config.skillAliases);\n const preferredSkills = normalizeSkills(preferredSkillsRaw, config.skillAliases);\n\n // Curated keyword list: explicit skills + role keywords + skill-like JD body tokens\n const bodyTokens = tokenize(normalizedText).filter(isSkillLike);\n const roleKeywords = extractRoleKeywords(jobDescription);\n const keywords = unique([...requiredSkills, ...preferredSkills, ...roleKeywords, ...bodyTokens]);\n\n return {\n raw: jobDescription,\n normalizedText,\n requiredSkills,\n preferredSkills,\n roleKeywords,\n keywords,\n minExperienceYears: extractMinExperience(jobDescription),\n educationRequirements: extractEducationRequirements(jobDescription),\n keywordSurfaceForms: collectKeywordSurfaceForms(jobDescription, config.skillAliases),\n // ponytail: any language mention in the JD is treated as a requirement — good enough until\n // JDs that merely *reference* a language (not require it) show up as false positives.\n requiredLanguages: parseLanguageMentions(jobDescription),\n };\n}\n","import { ParsedDateRange } from \"../types/parser\";\n\nconst MONTHS: Record<string, number> = {\n jan: 1,\n january: 1,\n feb: 2,\n february: 2,\n mar: 3,\n march: 3,\n apr: 4,\n april: 4,\n may: 5,\n jun: 6,\n june: 6,\n jul: 7,\n july: 7,\n aug: 8,\n august: 8,\n sep: 9,\n sept: 9,\n september: 9,\n oct: 10,\n october: 10,\n nov: 11,\n november: 11,\n dec: 12,\n december: 12,\n};\n\ninterface ParsedDateToken {\n year: number;\n month?: number;\n}\n\nfunction parseDateToken(raw: string): ParsedDateToken | null {\n const cleaned = raw.trim().toLowerCase();\n const monthMatch = cleaned.match(/([a-z]{3,9})\\s*(\\d{4})/i);\n if (monthMatch) {\n const monthName = monthMatch[1].toLowerCase();\n const year = Number.parseInt(monthMatch[2], 10);\n const month = MONTHS[monthName];\n if (!Number.isNaN(year)) {\n return { year, month };\n }\n }\n // MM/YYYY format (e.g. 10/2022)\n const slashMatch = cleaned.match(/^(\\d{1,2})\\/(\\d{4})$/);\n if (slashMatch) {\n const month = Number.parseInt(slashMatch[1], 10);\n const year = Number.parseInt(slashMatch[2], 10);\n if (month >= 1 && month <= 12 && !Number.isNaN(year)) {\n return { year, month };\n }\n }\n const yearMatch = cleaned.match(/(20\\d{2}|19\\d{2})/);\n if (yearMatch) {\n const year = Number.parseInt(yearMatch[1], 10);\n return { year };\n }\n return null;\n}\n\nfunction monthsBetween(start: ParsedDateToken, end: ParsedDateToken): number {\n const startMonth = start.month ?? 1;\n const endMonth = end.month ?? 12;\n return (end.year - start.year) * 12 + (endMonth - startMonth + 1);\n}\n\nexport function parseDateRange(text: string, referenceDate?: Date): ParsedDateRange | null {\n const normalized = text.trim();\n const rangeMatch = normalized.match(\n /(\\d{1,2}\\/\\d{4}|[A-Za-z]{3,9}\\s+\\d{4}|\\d{4})\\s*(?:-|to|–|—)\\s*(Present|Current|Now|\\d{1,2}\\/\\d{4}|[A-Za-z]{3,9}\\s+\\d{4}|\\d{4})/i\n );\n if (!rangeMatch) {\n return null;\n }\n const startToken = parseDateToken(rangeMatch[1]);\n const endRaw = rangeMatch[2];\n const isPresent = /present|current|now/i.test(endRaw);\n const endToken = isPresent ? undefined : parseDateToken(endRaw);\n if (!startToken) {\n return null;\n }\n // ponytail: referenceDate injected for determinism; falls back to Date.now() in live use\n const ref = referenceDate ?? new Date();\n const endTokenResolved: ParsedDateToken = endToken ?? {\n year: ref.getFullYear(),\n month: ref.getMonth() + 1,\n };\n const durationInMonths = monthsBetween(startToken, endTokenResolved);\n return {\n raw: normalized,\n start: rangeMatch[1],\n end: isPresent ? \"present\" : rangeMatch[2],\n durationInMonths: durationInMonths > 0 ? durationInMonths : undefined,\n startYear: startToken.year,\n startMonth: startToken.month,\n endYear: endTokenResolved.year,\n endMonth: endTokenResolved.month,\n };\n}\n\nexport function sumExperienceYears(ranges: ParsedDateRange[]): number {\n // If all ranges carry year/month data, merge overlapping intervals first so\n // concurrent roles (freelance + full-time) aren't double-counted.\n const withBounds = ranges.filter(\n (r) => r.startYear !== undefined && r.endYear !== undefined\n );\n if (withBounds.length === ranges.length && ranges.length > 0) {\n const toIndex = (year: number, month: number) => year * 12 + month;\n const intervals = withBounds\n .map((r) => ({\n s: toIndex(r.startYear!, r.startMonth ?? 1),\n e: toIndex(r.endYear!, r.endMonth ?? 12),\n }))\n .sort((a, b) => a.s - b.s);\n\n let totalMonths = 0;\n let curStart = intervals[0].s;\n let curEnd = intervals[0].e;\n for (let i = 1; i < intervals.length; i++) {\n const { s, e } = intervals[i];\n if (s <= curEnd) {\n curEnd = Math.max(curEnd, e);\n } else {\n totalMonths += curEnd - curStart + 1;\n curStart = s;\n curEnd = e;\n }\n }\n totalMonths += curEnd - curStart + 1;\n return Number((totalMonths / 12).toFixed(2));\n }\n\n // Fallback: naive sum (no overlap detection possible without bounds)\n const months = ranges.reduce((total, r) => total + (r.durationInMonths ?? 0), 0);\n return Number((months / 12).toFixed(2));\n}\n","import { ResolvedATSConfig } from \"../../types/config\";\nimport { ParsedAchievement, ParsedExperienceEntry, ParsedResume, ResumeSection } from \"../../types/parser\";\nimport { parseDateRange, sumExperienceYears } from \"../../utils/dates\";\nimport {\n escapeRegExp,\n normalizeForComparison,\n normalizeWhitespace,\n splitLines,\n tokenize,\n unique,\n} from \"../../utils/text\";\nimport { normalizeSkills } from \"../../utils/skills\";\nimport { parseLanguageMentions } from \"../../utils/languages\";\n\nconst SECTION_ALIASES: Record<ResumeSection, string[]> = {\n summary: [\"summary\", \"profile\", \"about\"],\n experience: [\"experience\", \"work experience\", \"professional experience\", \"employment\"],\n skills: [\"skills\", \"technical skills\", \"technologies\"],\n education: [\"education\", \"academics\", \"academic background\"],\n projects: [\"projects\", \"portfolio\"],\n certifications: [\"certifications\", \"licenses\"]\n};\n\nconst STRONG_VERBS = [\n \"led\",\n \"managed\",\n \"built\",\n \"designed\",\n \"implemented\",\n \"developed\",\n \"created\",\n \"improved\",\n \"optimized\",\n \"launched\",\n \"architected\",\n \"delivered\",\n \"shipped\",\n \"collaborated\",\n \"automated\",\n \"mentored\",\n \"modernized\",\n \"reduced\",\n \"increased\",\n];\n\nconst WEAK_VERBS = [\"worked\", \"helped\", \"performed\", \"responsible\", \"assisted\", \"participated\", \"involved\"];\n\n// ponytail: verb+metric heuristic — no sentence parsing until it misclassifies in practice.\nconst METRIC_RE = /\\d|%|\\$|\\bk\\+|\\bm\\+/i;\n\nfunction classifyAchievement(line: string): ParsedAchievement {\n const lower = line.toLowerCase();\n const hasMetric = METRIC_RE.test(line);\n const hasStrongVerb = STRONG_VERBS.some((verb) => new RegExp(`\\\\b${verb}\\\\b`).test(lower));\n const hasWeakVerb = WEAK_VERBS.some((verb) => new RegExp(`\\\\b${verb}\\\\b`).test(lower));\n\n if (hasStrongVerb && hasMetric) {\n return { text: line, strength: \"strong\", reason: \"strong verb + quantified impact\" };\n }\n if (hasWeakVerb) {\n return { text: line, strength: \"weak\", reason: \"weak verb\" };\n }\n return { text: line, strength: \"weak\", reason: \"no quantified impact\" };\n}\n\n\nfunction detectSection(line: string): ResumeSection | null {\n // Normalize and trim line before matching\n const normalized = line.trim().toLowerCase();\n for (const [section, aliases] of Object.entries(SECTION_ALIASES)) {\n for (const alias of aliases) {\n const safeAlias = escapeRegExp(alias);\n const headerPattern = new RegExp(`^${safeAlias}(\\\\s*:)?$`, \"i\");\n if (headerPattern.test(normalized)) {\n return section as ResumeSection;\n }\n }\n }\n return null;\n}\n\nfunction extractSections(text: string): {\n sections: Partial<Record<ResumeSection, string>>;\n detected: ResumeSection[];\n} {\n const lines = splitLines(text);\n const sections: Partial<Record<ResumeSection, string>> = {};\n const detected: ResumeSection[] = [];\n let current: ResumeSection | null = null;\n const buffer: string[] = [];\n\n const flush = () => {\n if (current) {\n sections[current] = buffer.join(\"\\n\").trim();\n buffer.length = 0;\n }\n };\n\n for (const line of lines) {\n const maybeSection = detectSection(line);\n if (maybeSection) {\n flush();\n current = maybeSection;\n detected.push(maybeSection);\n continue;\n }\n buffer.push(line);\n }\n flush();\n return { sections, detected: unique(detected) as ResumeSection[] };\n}\n\nfunction parseSkills(sectionContent: string | undefined, aliases: ResolvedATSConfig[\"skillAliases\"]): string[] {\n if (!sectionContent) return [];\n const raw = sectionContent\n .split(/[,;\\n]/)\n .map((skill) => skill.trim())\n .filter(Boolean);\n return normalizeSkills(raw, aliases);\n}\n\nfunction parseActionVerbs(text: string): { strong: string[]; weak: string[] } {\n const words = tokenize(text);\n return {\n strong: STRONG_VERBS.filter((verb) => words.includes(verb)),\n weak: WEAK_VERBS.filter((verb) => words.includes(verb)),\n };\n}\n\nfunction parseExperience(sectionContent: string | undefined, referenceDate?: Date): {\n entries: ParsedExperienceEntry[];\n rangesInMonths: number[];\n jobTitles: string[];\n achievements: ParsedAchievement[];\n} {\n if (!sectionContent) {\n return { entries: [], rangesInMonths: [], jobTitles: [], achievements: [] };\n }\n const lines = splitLines(sectionContent);\n const entries: ParsedExperienceEntry[] = [];\n const rangesInMonths: number[] = [];\n const jobTitles: string[] = [];\n const achievements: ParsedAchievement[] = [];\n\n for (const line of lines) {\n const range = parseDateRange(line, referenceDate);\n if (range) {\n const previous = entries[entries.length - 1];\n if (previous && !previous.dates) {\n previous.dates = range;\n } else {\n entries.push({ dates: range });\n }\n if (range.durationInMonths) {\n rangesInMonths.push(range.durationInMonths);\n }\n continue;\n }\n\n const titleMatch = line.match(/^(Senior|Lead|Principal|Staff|Software|Full\\s*Stack|Frontend|Backend|Engineer|Developer|Manager|Analyst)[^,-]*/i);\n if (titleMatch) {\n const title = titleMatch[0].trim();\n jobTitles.push(title.toLowerCase());\n const entry: ParsedExperienceEntry = { title, description: line };\n entries.push(entry);\n achievements.push(classifyAchievement(line));\n continue;\n }\n\n if (entries.length > 0) {\n const current = entries[entries.length - 1];\n current.description = [current.description, line].filter(Boolean).join(\" \").trim();\n }\n achievements.push(classifyAchievement(line));\n }\n\n return { entries, rangesInMonths, jobTitles: unique(jobTitles), achievements };\n}\n\nfunction parseEducation(sectionContent: string | undefined): string[] {\n if (!sectionContent) return [];\n return splitLines(sectionContent).map((line) => normalizeForComparison(line));\n}\n\nfunction collectKeywords(text: string): string[] {\n return unique(tokenize(text));\n}\n\nexport function parseResume(resumeText: string, config: ResolvedATSConfig): ParsedResume {\n const normalizedText = normalizeWhitespace(resumeText);\n const { sections, detected } = extractSections(resumeText);\n const skills = parseSkills(sections.skills, config.skillAliases);\n const actionVerbs = parseActionVerbs(normalizedText);\n const experienceData = parseExperience(sections.experience, config.referenceDate);\n const educationEntries = parseEducation(sections.education);\n let totalExperienceYears = sumExperienceYears(\n experienceData.entries\n .map((entry) => entry.dates)\n .filter((range): range is NonNullable<typeof range> => Boolean(range))\n );\n // ponytail: fallback heuristic — scan summary/full text for \"N+ years\" when no dated ranges parsed\n if (totalExperienceYears === 0) {\n const textToScan = sections.summary ?? normalizedText;\n const yearsMatch = textToScan.match(/(\\d{1,2})\\+?\\s*years?/i);\n if (yearsMatch) {\n totalExperienceYears = Number.parseInt(yearsMatch[1], 10);\n }\n }\n\n const requiredSections: ResumeSection[] = [\"summary\", \"experience\", \"skills\", \"education\"];\n const warnings: string[] = [];\n\n // ponytail: flag flattened/empty extraction (common with multi-column or scanned PDFs)\n // so the user fixes the source rather than trusting a garbage parse\n const lineCount = splitLines(resumeText).length;\n if (resumeText.trim().length < 100) {\n warnings.push(\n \"Almost no text was extracted — the resume may be a scanned/image PDF. Upload a text-based PDF or paste the text directly.\"\n );\n } else if (lineCount <= 2) {\n warnings.push(\n \"Resume text has no line breaks — the PDF layout likely didn't export cleanly (common with multi-column designs). Export as a single-column PDF or paste plain text for accurate parsing.\"\n );\n }\n\n for (const section of requiredSections) {\n if (!detected.includes(section)) {\n warnings.push(`${section} section not detected`);\n }\n }\n\n return {\n raw: resumeText,\n normalizedText,\n detectedSections: detected,\n sectionContent: sections,\n skills,\n jobTitles: experienceData.jobTitles,\n actionVerbs: actionVerbs.strong,\n weakVerbs: actionVerbs.weak,\n achievements: experienceData.achievements,\n educationEntries,\n experience: experienceData.entries,\n totalExperienceYears,\n keywords: collectKeywords(normalizedText),\n languages: parseLanguageMentions(resumeText),\n warnings,\n };\n}\n","import { ResolvedATSConfig, RuleContext } from \"../../types/config\";\nimport { ParsedJobDescription, ParsedResume, ResumeSection } from \"../../types/parser\";\nimport { containsTableLikeStructure } from \"../../utils/text\";\n\ninterface RuleEvaluationInput {\n resume: ParsedResume;\n job: ParsedJobDescription;\n breakdown?: RuleContext[\"breakdown\"];\n matchedKeywords?: string[];\n overusedKeywords?: string[];\n}\n\nexport interface RuleEvaluationResult {\n totalPenalty: number;\n warnings: string[];\n}\n\nexport class RuleEngine {\n constructor(private readonly config: ResolvedATSConfig) {}\n\n private applySectionPenalties(resume: ParsedResume): RuleEvaluationResult {\n const requiredSections: ResumeSection[] = [\"summary\", \"experience\", \"skills\", \"education\"];\n let totalPenalty = 0;\n const warnings: string[] = [];\n\n const penaltyBySection: Record<ResumeSection, number> = {\n summary: this.config.sectionPenalties.missingSummary,\n experience: this.config.sectionPenalties.missingExperience,\n skills: this.config.sectionPenalties.missingSkills,\n education: this.config.sectionPenalties.missingEducation,\n projects: 0,\n certifications: 0,\n };\n\n for (const section of requiredSections) {\n if (!resume.detectedSections.includes(section)) {\n const penalty = penaltyBySection[section] ?? 0;\n totalPenalty += penalty;\n warnings.push(`${section} section missing (penalty ${penalty})`);\n }\n }\n return { totalPenalty, warnings };\n }\n\n private applyDefaultRules(input: RuleEvaluationInput): RuleEvaluationResult {\n let totalPenalty = 0;\n const warnings: string[] = [];\n\n const sectionResult = this.applySectionPenalties(input.resume);\n totalPenalty += sectionResult.totalPenalty;\n warnings.push(...sectionResult.warnings);\n\n if (containsTableLikeStructure(input.resume.raw)) {\n totalPenalty += 8;\n warnings.push(\"Detected table-like or columnar formatting (penalty 8)\");\n }\n\n if (input.overusedKeywords && input.overusedKeywords.length > 0) {\n const penalty = input.overusedKeywords.length * this.config.keywordDensity.overusePenalty;\n totalPenalty += penalty;\n warnings.push(`Keyword stuffing detected for: ${input.overusedKeywords.join(\", \")} (penalty ${penalty})`);\n }\n\n if (input.resume.detectedSections.length < 3) {\n totalPenalty += 5;\n warnings.push(\"Few recognizable sections found (penalty 5)\");\n }\n\n return { totalPenalty, warnings };\n }\n\n evaluate(input: RuleEvaluationInput): RuleEvaluationResult {\n const defaultResult = this.applyDefaultRules(input);\n let totalPenalty = defaultResult.totalPenalty;\n const warnings = [...defaultResult.warnings];\n\n for (const rule of this.config.rules) {\n const context: RuleContext = {\n resume: input.resume,\n job: input.job,\n weights: this.config.weights,\n keywordDensity: this.config.keywordDensity,\n breakdown: input.breakdown,\n matchedKeywords: input.matchedKeywords,\n overusedKeywords: input.overusedKeywords,\n };\n if (rule.condition(context)) {\n totalPenalty += rule.penalty;\n if (rule.warning) {\n warnings.push(rule.warning);\n }\n }\n }\n\n return { totalPenalty, warnings };\n }\n}\n","import { ParsedJobDescription, ParsedResume } from \"../../types/parser\";\nimport { ATSAnalysisResult, ATSBreakdown, KeywordWeight } from \"../../types/scoring\";\nimport { KeywordCategory, ResolvedATSConfig } from \"../../types/config\";\nimport { clamp, countFrequencies, tokenize, unique } from \"../../utils/text\";\nimport { normalizeSkill, normalizeSkills } from \"../../utils/skills\";\nimport { diffLanguages } from \"../../utils/languages\";\n\nconst REQUIRED_SKILL_WEIGHT = 0.7;\nconst OPTIONAL_SKILL_WEIGHT = 0.3;\nconst EXPERIENCE_YEARS_WEIGHT = 0.75;\nconst EXPERIENCE_ROLE_WEIGHT = 0.25;\n\nconst ALL_CATEGORIES: KeywordCategory[] = [\"technical\", \"tool\", \"concept\", \"soft\", \"marketing\", \"domain\"];\n\ninterface ScoringArtifacts {\n matchedKeywords: string[];\n missingKeywords: string[];\n overusedKeywords: string[];\n keywordsByCategory: ATSAnalysisResult[\"keywordsByCategory\"];\n keywordWeights: KeywordWeight[];\n}\n\nexport interface ScoreComputation extends ATSAnalysisResult {\n // missingSkills / matchedSkills inherited from ATSAnalysisResult\n missingExperienceYears: number;\n educationScore: number;\n}\n\nfunction emptyCategoryBuckets(): ATSAnalysisResult[\"keywordsByCategory\"] {\n const buckets = {} as ATSAnalysisResult[\"keywordsByCategory\"];\n for (const category of ALL_CATEGORIES) {\n buckets[category] = { matched: [], missing: [] };\n }\n return buckets;\n}\n\nfunction scoreSkills(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): { score: number; matched: string[]; missing: string[] } {\n const profileRequired = config.profile?.mandatorySkills ?? [];\n const profileOptional = config.profile?.optionalSkills ?? [];\n\n const required = new Set(\n normalizeSkills([...job.requiredSkills, ...profileRequired], config.skillAliases)\n );\n const optional = new Set(\n normalizeSkills([...job.preferredSkills, ...profileOptional], config.skillAliases)\n );\n const resumeSkills = new Set(normalizeSkills(resume.skills, config.skillAliases));\n\n const matchedRequired = [...required].filter((skill) => resumeSkills.has(skill));\n const matchedOptional = [...optional].filter((skill) => resumeSkills.has(skill));\n\n const requiredCoverage = required.size === 0 ? 1 : matchedRequired.length / required.size;\n const optionalCoverage = optional.size === 0 ? 1 : matchedOptional.length / optional.size;\n\n const score = clamp(\n (requiredCoverage * REQUIRED_SKILL_WEIGHT + optionalCoverage * OPTIONAL_SKILL_WEIGHT) * 100,\n 0,\n 100\n );\n\n const matched = [...required].filter((skill) => resumeSkills.has(skill)).sort();\n const missing = [...required].filter((skill) => !resumeSkills.has(skill)).sort();\n return { score, matched, missing };\n}\n\nfunction scoreExperience(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): { score: number; missingYears: number } {\n const requiredYears = job.minExperienceYears ?? config.profile?.minExperience ?? 0;\n if (!requiredYears) {\n return { score: 100, missingYears: 0 };\n }\n const yearCoverage = clamp(resume.totalExperienceYears / requiredYears, 0, 2);\n const yearsComponent = clamp(yearCoverage, 0, 1) * EXPERIENCE_YEARS_WEIGHT;\n\n const jobRoleSet = new Set(job.roleKeywords.map((value) => value.toLowerCase()));\n const titleMatches = resume.jobTitles.filter((title) => jobRoleSet.has(title.toLowerCase()));\n const titleCoverage = jobRoleSet.size === 0 ? 1 : titleMatches.length / jobRoleSet.size;\n const roleComponent = clamp(titleCoverage, 0, 1) * EXPERIENCE_ROLE_WEIGHT;\n\n const score = clamp((yearsComponent + roleComponent) * 100, 0, 100);\n const missingYears = Math.max(requiredYears - resume.totalExperienceYears, 0);\n return { score, missingYears: Number(missingYears.toFixed(2)) };\n}\n\n// ponytail: linear location+freq weighting — no TF-IDF until needed.\nfunction keywordWeightOf(\n keyword: string,\n requiredSet: Set<string>,\n preferredSet: Set<string>,\n jdFrequencies: Record<string, number>\n): number {\n const base = requiredSet.has(keyword) ? 3 : preferredSet.has(keyword) ? 2 : 1;\n const freqBonus = Math.min((jdFrequencies[keyword] ?? 1) - 1, 3) * 0.25;\n return base + freqBonus;\n}\n\nfunction scoreKeywords(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): { score: number } & ScoringArtifacts {\n // Normalize both sides through the alias map so e.g. \"js\" ↔ \"javascript\" match symmetrically\n const jobKeywordSet = new Set(\n job.keywords.map((k) => normalizeSkill(k, config.skillAliases))\n );\n if (jobKeywordSet.size === 0) {\n return {\n score: 100,\n matchedKeywords: [],\n missingKeywords: [],\n overusedKeywords: [],\n keywordsByCategory: emptyCategoryBuckets(),\n keywordWeights: [],\n };\n }\n\n const resumeTokens = tokenize(resume.normalizedText).map((t) =>\n normalizeSkill(t, config.skillAliases)\n );\n const resumeTokenSet = new Set(resumeTokens);\n const resumeFrequencies = countFrequencies(resumeTokens);\n\n const requiredSet = new Set(job.requiredSkills);\n const preferredSet = new Set(job.preferredSkills);\n const jdFrequencies = countFrequencies(\n tokenize(job.normalizedText).map((t) => normalizeSkill(t, config.skillAliases))\n );\n const weightOf = (keyword: string) => keywordWeightOf(keyword, requiredSet, preferredSet, jdFrequencies);\n\n const matchedKeywords = [...jobKeywordSet].filter((keyword) => resumeTokenSet.has(keyword));\n const missingKeywords = [...jobKeywordSet].filter((keyword) => !resumeTokenSet.has(keyword));\n\n // Weighted coverage: a missing required/high-frequency keyword costs more than a body-only one.\n const totalWeight = [...jobKeywordSet].reduce((sum, keyword) => sum + weightOf(keyword), 0);\n const matchedWeight = matchedKeywords.reduce((sum, keyword) => sum + weightOf(keyword), 0);\n const score = clamp((matchedWeight / totalWeight) * 100, 0, 100);\n\n const totalTokens = resumeTokens.length || 1;\n const overusedKeywords = matchedKeywords.filter((keyword) => {\n const density = (resumeFrequencies[keyword] ?? 0) / totalTokens;\n return density > config.keywordDensity.max;\n });\n\n const keywordsByCategory = emptyCategoryBuckets();\n for (const keyword of matchedKeywords) {\n keywordsByCategory[config.categoryIndex.get(keyword) ?? \"technical\"].matched.push(keyword);\n }\n for (const keyword of missingKeywords) {\n keywordsByCategory[config.categoryIndex.get(keyword) ?? \"technical\"].missing.push(keyword);\n }\n for (const bucket of Object.values(keywordsByCategory)) {\n bucket.matched.sort();\n bucket.missing.sort();\n }\n\n const keywordWeights: KeywordWeight[] = [...jobKeywordSet]\n .map((term) => {\n const weight = Number(weightOf(term).toFixed(2));\n return {\n term,\n category: config.categoryIndex.get(term) ?? \"technical\",\n jdWeight: weight,\n resumeWeight: resumeFrequencies[term] ?? 0,\n importance: weight,\n };\n })\n .sort((a, b) => a.term.localeCompare(b.term));\n\n // Sort for canonical, input-order-independent output\n return {\n score,\n matchedKeywords: unique(matchedKeywords).sort(),\n missingKeywords: unique(missingKeywords).sort(),\n overusedKeywords: unique(overusedKeywords).sort(),\n keywordsByCategory,\n keywordWeights,\n };\n}\n\nfunction scoreEducation(resume: ParsedResume, job: ParsedJobDescription): number {\n if (job.educationRequirements.length === 0) {\n return 100;\n }\n const resumeEducationText = resume.educationEntries.join(\" \");\n const normalizedEducation = resumeEducationText.toLowerCase();\n const matched = job.educationRequirements.filter((requirement) =>\n normalizedEducation.includes(requirement.toLowerCase())\n );\n if (matched.length === 0) {\n return 0;\n }\n return clamp((matched.length / job.educationRequirements.length) * 100, 0, 100);\n}\n\nexport function calculateScore(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): ScoreComputation {\n const skillsResult = scoreSkills(resume, job, config);\n const experienceResult = scoreExperience(resume, job, config);\n const keywordResult = scoreKeywords(resume, job, config);\n const educationScore = scoreEducation(resume, job);\n\n const breakdown: ATSBreakdown = {\n skills: skillsResult.score,\n experience: experienceResult.score,\n keywords: keywordResult.score,\n education: educationScore,\n };\n\n const weightedScore =\n breakdown.skills * config.weights.skills +\n breakdown.experience * config.weights.experience +\n breakdown.keywords * config.weights.keywords +\n breakdown.education * config.weights.education;\n\n const achievementStrength = {\n strong: resume.achievements.filter((a) => a.strength === \"strong\").length,\n weak: resume.achievements.filter((a) => a.strength === \"weak\").length,\n };\n\n // ponytail: language proficiency is informational, not part of the weighted score —\n // promote to a breakdown component if a real JD weights it explicitly.\n const { matched: matchedLanguages, missing: missingLanguages } = diffLanguages(\n resume.languages,\n job.requiredLanguages\n );\n\n return {\n score: clamp(Number(weightedScore.toFixed(2)), 0, 100),\n breakdown,\n matchedSkills: skillsResult.matched,\n missingSkills: skillsResult.missing,\n matchedKeywords: keywordResult.matchedKeywords,\n missingKeywords: keywordResult.missingKeywords,\n overusedKeywords: keywordResult.overusedKeywords,\n keywordsByCategory: keywordResult.keywordsByCategory,\n keywordWeights: keywordResult.keywordWeights,\n achievementStrength,\n matchedLanguages,\n missingLanguages,\n suggestions: [],\n warnings: [],\n // detectedSections / parsedExperienceYears / experienceGap / experienceEntries: filled by index.ts\n experienceGap: experienceResult.missingYears,\n detectedSections: [],\n parsedExperienceYears: 0,\n experienceEntries: [],\n missingExperienceYears: experienceResult.missingYears,\n educationScore,\n };\n}\n","import { ATSProfile, KeywordRegistry } from \"../types/config\";\nimport { deriveSkillAliases } from \"../utils/skills\";\n\n// ponytail: broad seed set per category, still not an exhaustive taxonomy — grow on demand.\nexport const defaultKeywordRegistry: KeywordRegistry = [\n // languages / frameworks\n // ponytail: \"node\" split from javascript — Node.js runtime !== JS language\n { canonical: \"javascript\", aliases: [\"js\"], category: \"technical\" },\n { canonical: \"node\", aliases: [\"node.js\", \"nodejs\"], category: \"technical\" },\n { canonical: \"typescript\", aliases: [\"ts\"], category: \"technical\" },\n { canonical: \"react\", aliases: [\"reactjs\", \"react.js\"], category: \"technical\" },\n { canonical: \"angular\", aliases: [\"angularjs\"], category: \"technical\" },\n { canonical: \"vue\", aliases: [\"vue.js\", \"vuejs\"], category: \"technical\" },\n { canonical: \"svelte\", aliases: [], category: \"technical\" },\n { canonical: \"next.js\", aliases: [\"nextjs\"], category: \"technical\" },\n { canonical: \"c++\", aliases: [\"cpp\"], category: \"technical\" },\n { canonical: \"c#\", aliases: [\"csharp\", \".net\"], category: \"technical\" },\n { canonical: \"java\", aliases: [], category: \"technical\" },\n { canonical: \"python\", aliases: [\"py\"], category: \"technical\" },\n { canonical: \"go\", aliases: [\"golang\"], category: \"technical\" },\n { canonical: \"rust\", aliases: [], category: \"technical\" },\n { canonical: \"ruby\", aliases: [\"ruby on rails\", \"rails\"], category: \"technical\" },\n { canonical: \"php\", aliases: [], category: \"technical\" },\n { canonical: \"swift\", aliases: [], category: \"technical\" },\n { canonical: \"kotlin\", aliases: [], category: \"technical\" },\n { canonical: \"scala\", aliases: [], category: \"technical\" },\n { canonical: \"html\", aliases: [\"html5\"], category: \"technical\" },\n { canonical: \"css\", aliases: [\"css3\"], category: \"technical\" },\n { canonical: \"ios development\", aliases: [\"ios\"], category: \"technical\" },\n { canonical: \"android development\", aliases: [\"android\"], category: \"technical\" },\n { canonical: \"react native\", aliases: [], category: \"technical\" },\n { canonical: \"flutter\", aliases: [], category: \"technical\" },\n { canonical: \"machine learning\", aliases: [\"ml\"], category: \"technical\" },\n { canonical: \"deep learning\", aliases: [], category: \"technical\" },\n { canonical: \"natural language processing\", aliases: [\"nlp\"], category: \"technical\" },\n // tools / platforms / infra\n { canonical: \"sql\", aliases: [\"postgres\", \"mysql\", \"sqlite\"], category: \"tool\" },\n { canonical: \"graphql\", aliases: [\"gql\"], category: \"tool\" },\n { canonical: \"aws\", aliases: [\"amazon web services\"], category: \"tool\" },\n { canonical: \"azure\", aliases: [\"microsoft azure\"], category: \"tool\" },\n { canonical: \"gcp\", aliases: [\"google cloud\", \"google cloud platform\"], category: \"tool\" },\n { canonical: \"docker\", aliases: [\"containers\"], category: \"tool\" },\n { canonical: \"kubernetes\", aliases: [\"k8s\"], category: \"tool\" },\n { canonical: \"terraform\", aliases: [], category: \"tool\" },\n { canonical: \"ansible\", aliases: [], category: \"tool\" },\n { canonical: \"jenkins\", aliases: [], category: \"tool\" },\n { canonical: \"git\", aliases: [\"github\", \"gitlab\"], category: \"tool\" },\n { canonical: \"jira\", aliases: [], category: \"tool\" },\n { canonical: \"confluence\", aliases: [], category: \"tool\" },\n { canonical: \"pytorch\", aliases: [\"torch\"], category: \"tool\" },\n { canonical: \"tensorflow\", aliases: [\"tf\"], category: \"tool\" },\n { canonical: \"scikit-learn\", aliases: [\"sklearn\"], category: \"tool\" },\n { canonical: \"pandas\", aliases: [], category: \"tool\" },\n { canonical: \"numpy\", aliases: [], category: \"tool\" },\n { canonical: \"fastapi\", aliases: [], category: \"tool\" },\n { canonical: \"flask\", aliases: [], category: \"tool\" },\n { canonical: \"django\", aliases: [], category: \"tool\" },\n { canonical: \"kafka\", aliases: [], category: \"tool\" },\n { canonical: \"redis\", aliases: [], category: \"tool\" },\n { canonical: \"elasticsearch\", aliases: [\"elastic\"], category: \"tool\" },\n { canonical: \"spark\", aliases: [\"apache spark\"], category: \"tool\" },\n { canonical: \"tableau\", aliases: [], category: \"tool\" },\n { canonical: \"power bi\", aliases: [\"powerbi\"], category: \"tool\" },\n { canonical: \"excel\", aliases: [\"microsoft excel\", \"ms excel\"], category: \"tool\" },\n { canonical: \"salesforce\", aliases: [], category: \"tool\" },\n { canonical: \"hubspot\", aliases: [], category: \"tool\" },\n { canonical: \"sap\", aliases: [], category: \"tool\" },\n { canonical: \"quickbooks\", aliases: [], category: \"tool\" },\n { canonical: \"workday\", aliases: [], category: \"tool\" },\n { canonical: \"zendesk\", aliases: [], category: \"tool\" },\n { canonical: \"servicenow\", aliases: [], category: \"tool\" },\n { canonical: \"figma\", aliases: [], category: \"tool\" },\n { canonical: \"photoshop\", aliases: [\"adobe photoshop\"], category: \"tool\" },\n { canonical: \"illustrator\", aliases: [\"adobe illustrator\"], category: \"tool\" },\n { canonical: \"autocad\", aliases: [], category: \"tool\" },\n // engineering concepts\n { canonical: \"accessibility\", aliases: [\"a11y\"], category: \"concept\" },\n { canonical: \"frontend\", aliases: [\"front-end\"], category: \"concept\" },\n { canonical: \"backend\", aliases: [\"back-end\"], category: \"concept\" },\n { canonical: \"security\", aliases: [\"cybersecurity\"], category: \"concept\" },\n { canonical: \"testing\", aliases: [\"unittest\", \"pytest\"], category: \"concept\" },\n { canonical: \"microservices\", aliases: [], category: \"concept\" },\n { canonical: \"agile\", aliases: [\"scrum\"], category: \"concept\" },\n { canonical: \"kanban\", aliases: [], category: \"concept\" },\n { canonical: \"blockchain\", aliases: [], category: \"concept\" },\n { canonical: \"devops\", aliases: [], category: \"concept\" },\n { canonical: \"ci/cd\", aliases: [\"continuous integration\", \"continuous deployment\"], category: \"concept\" },\n { canonical: \"rest api\", aliases: [\"restful api\", \"rest apis\"], category: \"concept\" },\n { canonical: \"design patterns\", aliases: [], category: \"concept\" },\n { canonical: \"data structures\", aliases: [], category: \"concept\" },\n { canonical: \"algorithms\", aliases: [], category: \"concept\" },\n { canonical: \"cloud computing\", aliases: [], category: \"concept\" },\n { canonical: \"system design\", aliases: [], category: \"concept\" },\n { canonical: \"tdd\", aliases: [\"test driven development\", \"test-driven development\"], category: \"concept\" },\n { canonical: \"ux design\", aliases: [\"user experience\"], category: \"concept\" },\n { canonical: \"ui design\", aliases: [\"user interface design\"], category: \"concept\" },\n { canonical: \"project management\", aliases: [], category: \"concept\" },\n { canonical: \"change management\", aliases: [], category: \"concept\" },\n { canonical: \"risk management\", aliases: [], category: \"concept\" },\n { canonical: \"quality assurance\", aliases: [\"qa\"], category: \"concept\" },\n // product / data domain\n { canonical: \"roadmap\", aliases: [], category: \"domain\" },\n { canonical: \"stakeholder management\", aliases: [], category: \"domain\" },\n { canonical: \"prioritization\", aliases: [], category: \"domain\" },\n { canonical: \"a/b testing\", aliases: [\"ab testing\"], category: \"domain\" },\n { canonical: \"analytics\", aliases: [], category: \"domain\" },\n { canonical: \"statistics\", aliases: [\"stats\"], category: \"domain\" },\n { canonical: \"data visualization\", aliases: [], category: \"domain\" },\n // finance / accounting domain\n { canonical: \"financial analysis\", aliases: [], category: \"domain\" },\n { canonical: \"budgeting\", aliases: [], category: \"domain\" },\n { canonical: \"forecasting\", aliases: [], category: \"domain\" },\n { canonical: \"bookkeeping\", aliases: [], category: \"domain\" },\n { canonical: \"accounts payable\", aliases: [\"ap\"], category: \"domain\" },\n { canonical: \"accounts receivable\", aliases: [\"ar\"], category: \"domain\" },\n { canonical: \"payroll\", aliases: [], category: \"domain\" },\n { canonical: \"auditing\", aliases: [\"audit\"], category: \"domain\" },\n { canonical: \"tax preparation\", aliases: [], category: \"domain\" },\n { canonical: \"gaap\", aliases: [], category: \"domain\" },\n // sales / account management domain\n { canonical: \"lead generation\", aliases: [], category: \"domain\" },\n { canonical: \"account management\", aliases: [], category: \"domain\" },\n { canonical: \"crm\", aliases: [\"customer relationship management\"], category: \"domain\" },\n { canonical: \"sales pipeline\", aliases: [], category: \"domain\" },\n { canonical: \"cold calling\", aliases: [], category: \"domain\" },\n { canonical: \"upselling\", aliases: [\"cross-selling\"], category: \"domain\" },\n { canonical: \"customer retention\", aliases: [], category: \"domain\" },\n // human resources domain\n { canonical: \"recruiting\", aliases: [\"talent acquisition\"], category: \"domain\" },\n { canonical: \"onboarding\", aliases: [], category: \"domain\" },\n { canonical: \"employee relations\", aliases: [], category: \"domain\" },\n { canonical: \"benefits administration\", aliases: [], category: \"domain\" },\n { canonical: \"performance management\", aliases: [], category: \"domain\" },\n // healthcare domain\n { canonical: \"patient care\", aliases: [], category: \"domain\" },\n { canonical: \"clinical documentation\", aliases: [], category: \"domain\" },\n { canonical: \"hipaa\", aliases: [], category: \"domain\" },\n { canonical: \"electronic health records\", aliases: [\"ehr\", \"emr\"], category: \"domain\" },\n { canonical: \"medical billing\", aliases: [], category: \"domain\" },\n // legal domain\n { canonical: \"contract review\", aliases: [], category: \"domain\" },\n { canonical: \"legal research\", aliases: [], category: \"domain\" },\n { canonical: \"litigation\", aliases: [], category: \"domain\" },\n { canonical: \"regulatory compliance\", aliases: [\"compliance\"], category: \"domain\" },\n { canonical: \"due diligence\", aliases: [], category: \"domain\" },\n // education domain\n { canonical: \"curriculum development\", aliases: [], category: \"domain\" },\n { canonical: \"lesson planning\", aliases: [], category: \"domain\" },\n { canonical: \"classroom management\", aliases: [], category: \"domain\" },\n { canonical: \"instructional design\", aliases: [], category: \"domain\" },\n // operations / supply chain domain\n { canonical: \"supply chain management\", aliases: [\"supply chain\"], category: \"domain\" },\n { canonical: \"inventory management\", aliases: [], category: \"domain\" },\n { canonical: \"procurement\", aliases: [], category: \"domain\" },\n { canonical: \"vendor management\", aliases: [], category: \"domain\" },\n { canonical: \"logistics\", aliases: [], category: \"domain\" },\n // customer service domain\n { canonical: \"customer support\", aliases: [\"customer service\"], category: \"domain\" },\n { canonical: \"technical support\", aliases: [], category: \"domain\" },\n { canonical: \"conflict resolution\", aliases: [], category: \"domain\" },\n // soft skills\n { canonical: \"communication\", aliases: [], category: \"soft\" },\n { canonical: \"leadership\", aliases: [], category: \"soft\" },\n { canonical: \"teamwork\", aliases: [\"collaboration\"], category: \"soft\" },\n { canonical: \"problem solving\", aliases: [\"problem-solving\"], category: \"soft\" },\n { canonical: \"adaptability\", aliases: [\"flexibility\"], category: \"soft\" },\n { canonical: \"time management\", aliases: [], category: \"soft\" },\n { canonical: \"critical thinking\", aliases: [], category: \"soft\" },\n { canonical: \"creativity\", aliases: [], category: \"soft\" },\n { canonical: \"attention to detail\", aliases: [], category: \"soft\" },\n { canonical: \"decision making\", aliases: [\"decision-making\"], category: \"soft\" },\n { canonical: \"emotional intelligence\", aliases: [], category: \"soft\" },\n { canonical: \"negotiation\", aliases: [], category: \"soft\" },\n { canonical: \"organization\", aliases: [\"organizational skills\"], category: \"soft\" },\n { canonical: \"public speaking\", aliases: [\"presentation skills\"], category: \"soft\" },\n { canonical: \"mentoring\", aliases: [\"coaching\"], category: \"soft\" },\n { canonical: \"interpersonal skills\", aliases: [], category: \"soft\" },\n { canonical: \"work ethic\", aliases: [], category: \"soft\" },\n // marketing\n { canonical: \"seo\", aliases: [\"search engine optimization\"], category: \"marketing\" },\n { canonical: \"branding\", aliases: [\"brand strategy\"], category: \"marketing\" },\n { canonical: \"campaign management\", aliases: [], category: \"marketing\" },\n { canonical: \"content marketing\", aliases: [], category: \"marketing\" },\n { canonical: \"social media marketing\", aliases: [\"social media\"], category: \"marketing\" },\n { canonical: \"email marketing\", aliases: [], category: \"marketing\" },\n { canonical: \"digital marketing\", aliases: [], category: \"marketing\" },\n { canonical: \"copywriting\", aliases: [], category: \"marketing\" },\n { canonical: \"market research\", aliases: [], category: \"marketing\" },\n { canonical: \"ppc\", aliases: [\"pay-per-click\", \"google ads\"], category: \"marketing\" },\n { canonical: \"conversion rate optimization\", aliases: [\"cro\"], category: \"marketing\" },\n { canonical: \"public relations\", aliases: [\"pr\"], category: \"marketing\" },\n];\n\nexport const defaultSkillAliases = deriveSkillAliases(defaultKeywordRegistry);\n\nexport const softwareEngineerProfile: ATSProfile = {\n name: \"software-engineer\",\n mandatorySkills: [\"javascript\", \"typescript\", \"react\", \"node\"],\n optionalSkills: [\"graphql\", \"sql\", \"docker\"],\n minExperience: 3,\n};\n\nexport const dataScientistProfile: ATSProfile = {\n name: \"data-scientist\",\n mandatorySkills: [\"python\", \"sql\", \"statistics\"],\n optionalSkills: [\"pandas\", \"numpy\", \"pytorch\", \"tensorflow\"],\n minExperience: 2,\n};\n\nexport const productManagerProfile: ATSProfile = {\n name: \"product-manager\",\n mandatorySkills: [\"roadmap\", \"stakeholder management\", \"prioritization\"],\n optionalSkills: [\"a/b testing\", \"analytics\", \"sql\"],\n minExperience: 3,\n};\n\nexport const defaultProfiles: ATSProfile[] = [\n softwareEngineerProfile,\n dataScientistProfile,\n productManagerProfile,\n];\n","import {\n ATSConfig,\n ATSWeights,\n KeywordDensityConfig,\n NormalizedWeights,\n ResolvedATSConfig,\n SectionPenaltyConfig,\n} from \"../../types/config\";\nimport { defaultKeywordRegistry, softwareEngineerProfile } from \"../../profiles\";\nimport { buildCategoryIndex, deriveSkillAliases, mergeKeywordRegistries } from \"../../utils/skills\";\n\nconst DEFAULT_WEIGHTS: ATSWeights = {\n skills: 0.3,\n experience: 0.3,\n keywords: 0.25,\n education: 0.15,\n};\n\nconst DEFAULT_KEYWORD_DENSITY: KeywordDensityConfig = {\n min: 0.0025,\n max: 0.04,\n overusePenalty: 5,\n};\n\nconst DEFAULT_SECTION_PENALTIES: Required<SectionPenaltyConfig> = {\n missingSummary: 4,\n missingExperience: 10,\n missingSkills: 8,\n missingEducation: 6,\n};\n\nfunction normalizeWeights(weights: ATSWeights): NormalizedWeights {\n const total = weights.skills + weights.experience + weights.keywords + weights.education;\n if (total === 0) {\n // Guard against misconfigured zero weights by falling back to equal distribution\n const equal = 1 / 4;\n return {\n skills: equal,\n experience: equal,\n keywords: equal,\n education: equal,\n normalizedTotal: 1,\n };\n }\n return {\n skills: weights.skills / total,\n experience: weights.experience / total,\n keywords: weights.keywords / total,\n education: weights.education / total,\n normalizedTotal: 1,\n };\n}\n\nexport function resolveConfig(config: ATSConfig = {}): ResolvedATSConfig {\n const weights: ATSWeights = {\n skills: config.weights?.skills ?? DEFAULT_WEIGHTS.skills,\n experience: config.weights?.experience ?? DEFAULT_WEIGHTS.experience,\n keywords: config.weights?.keywords ?? DEFAULT_WEIGHTS.keywords,\n education: config.weights?.education ?? DEFAULT_WEIGHTS.education,\n };\n\n const keywordRegistry = mergeKeywordRegistries(defaultKeywordRegistry, config.keywordRegistry ?? []);\n\n const resolved: ResolvedATSConfig = {\n weights: normalizeWeights(weights),\n skillAliases: { ...deriveSkillAliases(keywordRegistry), ...(config.skillAliases ?? {}) },\n keywordRegistry,\n categoryIndex: buildCategoryIndex(keywordRegistry),\n profile: config.profile ?? softwareEngineerProfile,\n rules: config.rules ?? [],\n keywordDensity: config.keywordDensity ?? DEFAULT_KEYWORD_DENSITY,\n sectionPenalties: {\n ...DEFAULT_SECTION_PENALTIES,\n ...(config.sectionPenalties ?? {}),\n },\n allowPartialMatches: config.allowPartialMatches ?? true,\n referenceDate: config.referenceDate ? new Date(config.referenceDate) : undefined,\n };\n\n return resolved;\n}\n","import { ResolvedATSConfig } from \"../../types/config\";\nimport { ParsedJobDescription, ParsedResume } from \"../../types/parser\";\nimport { ATSAnalysisResult } from \"../../types/scoring\";\nimport { normalizeSkill } from \"../../utils/skills\";\nimport { tokenize, unique } from \"../../utils/text\";\nimport { ScoreComputation } from \"../scoring/scorer\";\n\ninterface SuggestionInput {\n resume: ParsedResume;\n job: ParsedJobDescription;\n score: ScoreComputation;\n ruleWarnings: string[];\n config: ResolvedATSConfig;\n}\n\nfunction formatList(values: string[], max = 6): string {\n const uniqueValues = Array.from(new Set(values));\n const trimmed = uniqueValues.slice(0, max);\n return trimmed.join(\", \") + (uniqueValues.length > max ? \"...\" : \"\");\n}\n\n// Resume term whose canonical matches a JD keyword but whose surface form differs from the\n// JD's own wording — e.g. resume says \"js\", JD says \"JavaScript\". Capped to keep suggestions short.\nfunction buildAliasReplacementSuggestions(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): string[] {\n const jobKeywordSet = new Set(job.keywords.map((k) => normalizeSkill(k, config.skillAliases)));\n const replacements: string[] = [];\n for (const token of unique(tokenize(resume.normalizedText))) {\n const canonical = normalizeSkill(token, config.skillAliases);\n const jdSurface = job.keywordSurfaceForms[canonical];\n if (jdSurface && jobKeywordSet.has(canonical) && jdSurface.toLowerCase() !== token.toLowerCase()) {\n replacements.push(`Replace \"${token}\" with \"${jdSurface}\" to match the job description's wording.`);\n }\n }\n return unique(replacements).slice(0, 5);\n}\n\nexport class SuggestionEngine {\n generate(input: SuggestionInput): Pick<ATSAnalysisResult, \"suggestions\" | \"warnings\"> {\n const suggestions: string[] = [];\n const warnings: string[] = [...input.ruleWarnings, ...input.resume.warnings];\n\n if (input.score.missingSkills.length > 0) {\n suggestions.push(\n `Highlight these required skills: ${formatList(input.score.missingSkills)}`\n );\n }\n\n if (input.score.missingKeywords.length > 0) {\n suggestions.push(\n `Incorporate job-specific keywords: ${formatList(input.score.missingKeywords)}`\n );\n }\n\n suggestions.push(...buildAliasReplacementSuggestions(input.resume, input.job, input.config));\n\n if (input.score.overusedKeywords.length > 0) {\n suggestions.push(\n `Avoid keyword stuffing for: ${formatList(input.score.overusedKeywords)}`\n );\n }\n\n if (input.score.missingExperienceYears > 0) {\n suggestions.push(\n `Clarify at least ${input.job.minExperienceYears ?? input.score.missingExperienceYears} years of relevant experience with quantified achievements.`\n );\n }\n\n if (input.job.educationRequirements.length > 0 && input.score.educationScore === 0) {\n suggestions.push(\n `State your education credentials matching: ${formatList(input.job.educationRequirements)}`\n );\n }\n\n if (input.resume.actionVerbs.length < 3) {\n suggestions.push(\n \"Strengthen bullet points with impact verbs (led, built, improved, delivered).\"\n );\n }\n\n if (input.resume.weakVerbs.length > 0) {\n suggestions.push(\n `Replace weak verbs (${formatList(input.resume.weakVerbs)}) with stronger ones (e.g. led, built, optimized).`\n );\n }\n\n if (input.score.missingLanguages.length > 0) {\n const formatted = input.score.missingLanguages\n .map((l) => (l.level ? `${l.name} (${l.level})` : l.name))\n .join(\", \");\n suggestions.push(`Mention your proficiency in: ${formatted}`);\n }\n\n const weakAchievement = input.resume.achievements.find((a) => a.strength === \"weak\");\n if (weakAchievement) {\n suggestions.push(\n `Strengthen \"${weakAchievement.text}\" — add scope/metrics, e.g. \"Built and maintained scalable services handling 500k+ requests/day.\"`\n );\n }\n\n // Long raw text but few detected sections → likely a multi-column PDF that\n // didn't parse cleanly even after line reconstruction\n if (\n input.resume.detectedSections.length < 2 &&\n input.resume.raw.trim().length > 300\n ) {\n suggestions.push(\n \"Your resume may use a multi-column layout. Export as a single-column PDF or paste plain text — most ATS systems and this parser work best with a linear layout.\"\n );\n }\n\n return { suggestions, warnings };\n }\n}\n","/**\n * LLM Budget Manager\n * Enforces call and token limits to prevent runaway costs\n */\n\nimport { LLMBudget } from \"../types/llm\";\n\nexport class LLMBudgetManager {\n private callCount: number = 0;\n private totalTokensUsed: number = 0;\n private readonly limits: LLMBudget;\n\n constructor(limits: LLMBudget) {\n this.limits = limits;\n }\n\n /**\n * Check if we can make a call with the given token estimate\n * Throws if budget would be exceeded\n */\n assertCanCall(requestedTokens: number): void {\n if (this.callCount >= this.limits.maxCalls) {\n throw new Error(\n `LLM call limit exceeded: ${this.callCount}/${this.limits.maxCalls} calls used`\n );\n }\n\n if (requestedTokens > this.limits.maxTokensPerCall) {\n throw new Error(\n `Requested tokens ${requestedTokens} exceeds per-call limit ${this.limits.maxTokensPerCall}`\n );\n }\n\n if (this.totalTokensUsed + requestedTokens > this.limits.maxTotalTokens) {\n throw new Error(\n `Total token budget exceeded: ${this.totalTokensUsed + requestedTokens}/${this.limits.maxTotalTokens}`\n );\n }\n }\n\n /**\n * Record actual token usage from a completed call\n */\n recordUsage(tokensUsed: number): void {\n this.callCount += 1;\n this.totalTokensUsed += tokensUsed;\n }\n\n /**\n * Get current budget state\n */\n getStats() {\n return {\n callsUsed: this.callCount,\n callsRemaining: Math.max(0, this.limits.maxCalls - this.callCount),\n tokensUsed: this.totalTokensUsed,\n tokensRemaining: Math.max(0, this.limits.maxTotalTokens - this.totalTokensUsed),\n totalCalls: this.limits.maxCalls,\n totalTokens: this.limits.maxTotalTokens,\n };\n }\n\n /**\n * Check if budget is exhausted\n */\n isExhausted(): boolean {\n return (\n this.callCount >= this.limits.maxCalls ||\n this.totalTokensUsed >= this.limits.maxTotalTokens\n );\n }\n\n /**\n * Reset budget (for testing)\n */\n reset(): void {\n this.callCount = 0;\n this.totalTokensUsed = 0;\n }\n}\n","import { JSONSchema } from \"../types/llm\";\n\n/**\n * Very small runtime JSON Schema validator for our limited schema shape.\n * Supports: object type with properties, required arrays, and simple primitive checks.\n */\nexport function validateJsonSchema(data: unknown, schema: JSONSchema): boolean {\n if (schema.type !== \"object\" || typeof data !== \"object\" || data === null) return false;\n const obj = data as Record<string, unknown>;\n\n if (schema.required) {\n for (const r of schema.required) {\n if (!(r in obj)) return false;\n }\n }\n\n if (schema.properties && typeof schema.properties === \"object\") {\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n const value = obj[key];\n if (value === undefined) continue; // handled by required above\n\n if (propSchema == null) continue;\n const expectedType = (propSchema as any).type;\n if (!expectedType) continue;\n\n switch (expectedType) {\n case \"string\":\n if (typeof value !== \"string\") return false;\n break;\n case \"number\":\n if (typeof value !== \"number\") return false;\n break;\n case \"boolean\":\n if (typeof value !== \"boolean\") return false;\n break;\n case \"array\":\n if (!Array.isArray(value)) return false;\n // optional: check item types when simple type is provided\n const items = (propSchema as any).items;\n if (items && (items as any).type && Array.isArray(value)) {\n const itemType = (items as any).type;\n for (const item of value as unknown[]) {\n if (itemType === \"string\" && typeof item !== \"string\") return false;\n if (itemType === \"number\" && typeof item !== \"number\") return false;\n if (itemType === \"object\" && (typeof item !== \"object\" || item === null)) return false;\n }\n }\n break;\n case \"object\":\n if (typeof value !== \"object\" || value === null) return false;\n break;\n default:\n // unknown expected type - be permissive\n break;\n }\n }\n }\n\n return true;\n}\n","/**\n * LLM Manager - Orchestrates all LLM operations with budget constraints\n * Provides safe fallback to v1 deterministic logic on any failure\n */\n\nimport { LLMClient, LLMConfig, LLMResult } from \"../types/llm\";\nimport { JSONSchema } from \"../types/llm\";\nimport { LLMBudgetManager } from \"./llm.budget\";\nimport { validateJsonSchema } from \"./validation\";\n\ninterface LLMCallOptions {\n model?: string;\n useThinking?: boolean;\n requestedTokens?: number;\n}\n\n/**\n * Core LLM manager - handles all interactions with the LLM client\n */\nexport class LLMManager {\n private client: LLMClient;\n private budgetManager: LLMBudgetManager;\n private config: LLMConfig;\n private timeoutMs: number;\n private warnings: string[] = [];\n\n constructor(config: LLMConfig) {\n this.config = config;\n this.client = config.client;\n this.budgetManager = new LLMBudgetManager(config.limits);\n this.timeoutMs = config.timeoutMs ?? 30000;\n }\n\n /**\n * Structured call to LLM with timeout and budget protection\n */\n async callLLM<T>(\n systemPrompt: string,\n userPrompt: string,\n schema: JSONSchema,\n options: LLMCallOptions = {}\n ): Promise<LLMResult<T>> {\n // Attach a temporary handler to catch any unhandled rejections that may occur\n // while the LLM call is in-flight (e.g., provider rejects after we timeout).\n const onUnhandled = (reason: unknown) => {\n this.warnings.push(`Unhandled rejection during LLM call: ${String(reason)}`);\n };\n process.on(\"unhandledRejection\", onUnhandled);\n\n let clientPromise: Promise<{ content: unknown; usage?: { total_tokens?: number } }> | undefined = undefined;\n\n try {\n // Check budget before attempting call\n const estimatedTokens = this.estimateTokens(systemPrompt, userPrompt, options.requestedTokens);\n\n try {\n this.budgetManager.assertCanCall(estimatedTokens);\n } catch (e) {\n const msg = `LLM budget exhausted: ${(e as Error).message}`;\n this.warnings.push(msg);\n // Ensure we remove handler shortly even on early return\n globalThis.setTimeout(() => process.removeListener(\"unhandledRejection\", onUnhandled), 100);\n return { success: false, fallback: true, error: msg };\n }\n\n // Validate that JSON output is requested\n if (!this.isValidJsonSchema(schema)) {\n const msg = \"Invalid JSON schema provided\";\n this.warnings.push(msg);\n globalThis.setTimeout(() => process.removeListener(\"unhandledRejection\", onUnhandled), 100);\n return { success: false, fallback: true, error: msg };\n }\n\n // Enforce strict JSON-only instruction\n const strictUserPrompt = `${userPrompt}\\n\\nReturn ONLY valid JSON matching the schema below.\\nNo explanations. No markdown. No additional text.`;\n\n // Execute with timeout - ensure timeout is cleared if client returns first to avoid unhandled rejections\n clientPromise = this.client.createCompletion({\n model: options.useThinking\n ? this.config.models?.thinking || this.config.models?.default || \"gpt-4o\"\n : this.config.models?.default || \"gpt-4o\",\n messages: [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: strictUserPrompt },\n ],\n max_tokens: options.requestedTokens || 2000,\n response_format: schema,\n });\n\n // Ensure client promise doesn't produce unhandled rejections if it settles later\n void clientPromise.catch(() => { });\n\n // Create a timeout promise that rejects after timeoutMs. Attach a noop catch\n // immediately to prevent unhandledRejection if the timer fires and no one\n // is observing the rejection later in the lifecycle.\n const timeoutPromise = new Promise<never>((_, reject) => {\n const id = globalThis.setTimeout(() => reject(new Error(`LLM call timeout after ${this.timeoutMs}ms`)), this.timeoutMs);\n // Clear timeout when client settles to avoid the timer firing after client finishes\n void clientPromise!.finally(() => globalThis.clearTimeout(id));\n });\n // Prevent accidental unhandled rejections from the timeout promise\n void timeoutPromise.catch(() => { });\n\n const response = (await Promise.race([clientPromise, timeoutPromise])) as {\n content: unknown;\n usage?: { total_tokens?: number };\n };\n\n // Validate response structure\n if (!response || !response.content) {\n // Wait a short grace period to allow the client promise to settle (resolve/reject)\n // while our handler is registered. This prevents unhandled rejections from\n // escaping when the provider rejects/settles after we timed out.\n const graceMs = Math.min(Math.max(this.timeoutMs * 2, 100), 500);\n\n try {\n // Wait until either client settles or graceMs elapses\n await Promise.race([clientPromise!.catch(() => { }), new Promise((r) => setTimeout(r, graceMs))]);\n } catch (e) {\n // intentionally ignore\n } finally {\n process.removeListener(\"unhandledRejection\", onUnhandled);\n }\n\n return { success: false, fallback: true, error: \"Empty response from LLM\" };\n }\n\n // Attempt to parse JSON\n let parsedContent: unknown;\n try {\n if (typeof response.content === \"string\") {\n parsedContent = JSON.parse(response.content);\n } else {\n parsedContent = response.content;\n }\n } catch (e) {\n const msg = `Invalid JSON in LLM response: ${(e as Error).message}`;\n this.warnings.push(msg);\n\n const graceMs = Math.min(Math.max(this.timeoutMs * 2, 100), 500);\n try {\n await Promise.race([clientPromise!.catch(() => { }), new Promise((r) => setTimeout(r, graceMs))]);\n } catch (e) {\n // intentionally ignore\n } finally {\n process.removeListener(\"unhandledRejection\", onUnhandled);\n }\n\n return { success: false, fallback: true, error: msg };\n }\n\n // Validate against schema\n if (!this.validateAgainstSchema(parsedContent, schema)) {\n const msg = \"LLM response does not match schema\";\n this.warnings.push(msg);\n\n const graceMs = Math.min(Math.max(this.timeoutMs * 2, 100), 500);\n try {\n await Promise.race([clientPromise!.catch(() => { }), new Promise((r) => setTimeout(r, graceMs))]);\n } catch (e) {\n // intentionally ignore\n } finally {\n process.removeListener(\"unhandledRejection\", onUnhandled);\n }\n\n return { success: false, fallback: true, error: msg };\n }\n\n // Record usage\n const tokensUsed = response.usage?.total_tokens || estimatedTokens;\n this.budgetManager.recordUsage(tokensUsed);\n\n // Success path: remove handler immediately\n process.removeListener(\"unhandledRejection\", onUnhandled);\n\n return {\n success: true,\n fallback: false,\n data: parsedContent as T,\n tokensUsed,\n };\n } catch (e) {\n const msg = `LLM call failed: ${(e as Error).message}`;\n this.warnings.push(msg);\n\n // Wait a short grace period to allow the client promise to settle (resolve/reject)\n // while our handler is registered. This prevents unhandled rejections from\n // escaping when the provider rejects/settles after we timed out.\n const graceMs = Math.min(Math.max(this.timeoutMs * 2, 100), 500);\n\n try {\n await Promise.race([clientPromise!.catch(() => { }), new Promise((r) => setTimeout(r, graceMs))]);\n } catch (e) {\n // intentionally ignore\n } finally {\n process.removeListener(\"unhandledRejection\", onUnhandled);\n }\n\n return { success: false, fallback: true, error: msg };\n }\n }\n\n /**\n * Get list of warnings from LLM operations\n */\n getWarnings(): string[] {\n return [...this.warnings];\n }\n\n /**\n * Get budget stats\n */\n getBudgetStats() {\n return this.budgetManager.getStats();\n }\n\n /**\n * Check if features are enabled\n */\n isFeatureEnabled(feature: keyof NonNullable<LLMConfig[\"enable\"]>): boolean {\n return this.config.enable?.[feature] === true;\n }\n\n // ============ Private helpers ============\n\n\n /**\n * Estimate tokens for a call (rough approximation)\n * 1 token ≈ 4 characters average\n */\n private estimateTokens(systemPrompt: string, userPrompt: string, requestedTokens?: number): number {\n if (requestedTokens) {\n return requestedTokens;\n }\n const totalChars = systemPrompt.length + userPrompt.length;\n const estimatedInputTokens = Math.ceil(totalChars / 4);\n // Assume output will be 50-50 ratio with input\n return estimatedInputTokens + Math.ceil(estimatedInputTokens / 2);\n }\n\n /**\n * Validate that schema looks like valid JSON schema\n */\n private isValidJsonSchema(schema: JSONSchema): boolean {\n return schema && schema.type === \"object\" && !!(schema.properties || schema.required);\n }\n\n /**\n * Simple schema validation - check required fields exist\n */\n\n private validateAgainstSchema(data: unknown, schema: JSONSchema): boolean {\n try {\n return validateJsonSchema(data, schema);\n } catch (e) {\n // If validator throws for any reason, gracefully fallback to simple existence check\n if (typeof data !== \"object\" || data === null) {\n return false;\n }\n const obj = data as Record<string, unknown>;\n if (schema.required) {\n for (const field of schema.required) {\n if (!(field in obj)) {\n return false;\n }\n }\n }\n return true;\n }\n }\n}\n","/**\n * JSON Schemas for LLM responses\n * These enforce structured output from the LLM\n */\n\nimport { JSONSchema } from \"../types/llm\";\n\n/**\n * Schema for skill normalization response\n * Example use: Normalize messy skill names from resume/JD\n */\nexport const skillNormalizationSchema: JSONSchema = {\n type: \"object\",\n properties: {\n canonicalSkills: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n input: {\n type: \"string\",\n description: \"Original skill name from input\",\n },\n normalized: {\n type: \"string\",\n description: \"Canonical/normalized skill name\",\n },\n confidence: {\n type: \"number\",\n description: \"Confidence score 0-1 that this is correct\",\n },\n },\n required: [\"input\", \"normalized\"],\n },\n description: \"Array of skill normalizations\",\n },\n },\n required: [\"canonicalSkills\"],\n};\n\n/**\n * Schema for section classification response\n * Example use: Classify non-standard section headers (e.g., \"My Stuff\" -> \"skills\")\n */\nexport const sectionClassificationSchema: JSONSchema = {\n type: \"object\",\n properties: {\n sections: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n header: {\n type: \"string\",\n description: \"The section header text\",\n },\n classification: {\n type: \"string\",\n enum: [\"summary\", \"experience\", \"skills\", \"education\", \"projects\", \"certifications\", \"other\"],\n description: \"Classified section type\",\n },\n confidence: {\n type: \"number\",\n description: \"Confidence 0-1 in the classification\",\n },\n },\n required: [\"header\", \"classification\"],\n },\n description: \"Array of section classifications\",\n },\n },\n required: [\"sections\"],\n};\n\n/**\n * Schema for suggestion enhancement response\n * Example use: Improve deterministic suggestions with better phrasing\n */\nexport const suggestionEnhancementSchema: JSONSchema = {\n type: \"object\",\n properties: {\n suggestions: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n original: {\n type: \"string\",\n description: \"Original suggestion from deterministic engine\",\n },\n enhanced: {\n type: \"string\",\n description: \"Improved phrasing of the suggestion\",\n },\n actionable: {\n type: \"boolean\",\n description: \"Whether the suggestion is concrete and actionable\",\n },\n },\n required: [\"original\", \"enhanced\"],\n },\n description: \"Array of enhanced suggestions\",\n },\n },\n required: [\"suggestions\"],\n};\n\n/**\n * Schema for JD clarification response\n * Example use: Extract implicit requirements from JD prose\n */\nexport const jdClarificationSchema: JSONSchema = {\n type: \"object\",\n properties: {\n implicitSkills: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Skills implied but not explicitly mentioned\",\n },\n implicitExperience: {\n type: \"object\",\n properties: {\n minYears: {\n type: \"number\",\n description: \"Inferred minimum experience years\",\n },\n domains: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Industry domains implied\",\n },\n },\n description: \"Inferred experience requirements\",\n },\n clarityScore: {\n type: \"number\",\n description: \"0-1 score indicating JD clarity\",\n },\n },\n required: [\"implicitSkills\", \"clarityScore\"],\n};\n\n/**\n * Schema for validation - minimal response for safe fallback testing\n */\nexport const validationSchema: JSONSchema = {\n type: \"object\",\n properties: {\n valid: {\n type: \"boolean\",\n description: \"Whether the input is valid\",\n },\n message: {\n type: \"string\",\n description: \"Validation message\",\n },\n },\n required: [\"valid\"],\n};\n\n/**\n * Type-safe schema accessor\n */\nexport const LLMSchemas = {\n skillNormalization: skillNormalizationSchema,\n sectionClassification: sectionClassificationSchema,\n suggestionEnhancement: suggestionEnhancementSchema,\n jdClarification: jdClarificationSchema,\n validation: validationSchema,\n} as const;\n","/**\n * LLM Prompt Templates\n * Strict prompts that enforce JSON output and role clarity\n */\n\n/**\n * System prompts for different LLM tasks\n */\nexport const LLMPrompts = {\n /**\n * System prompt for skill normalization\n */\n skillNormalizationSystem: `You are a technical skill normalization expert.\nYour task is to normalize and canonicalize technical skill names.\nHandle aliases, abbreviations, and variations.\nBe conservative - only group skills that are genuinely synonymous.\nReturn ONLY valid JSON.`,\n\n /**\n * User prompt for skill normalization\n */\n skillNormalizationUser: (skills: string[]) => `Normalize these skills:\n${skills.map((s) => `- ${s}`).join(\"\\n\")}\n\nReturn the canonical names with confidence scores.`,\n\n /**\n * System prompt for section classification\n */\n sectionClassificationSystem: `You are a resume section classifier.\nClassify ambiguous section headers into standard resume categories.\nBe strict - if uncertain, classify as \"other\".\nProvide confidence scores.\nReturn ONLY valid JSON.`,\n\n /**\n * User prompt for section classification\n */\n sectionClassificationUser: (headers: string[]) => `Classify these resume section headers:\n${headers.map((h) => `- \"${h}\"`).join(\"\\n\")}\n\nUse categories: summary, experience, skills, education, projects, certifications, other.`,\n\n /**\n * System prompt for suggestion enhancement\n */\n suggestionEnhancementSystem: `You are a resume advice expert.\nImprove suggestions to be more actionable and specific.\nMaintain the core message but make it more concrete.\nReturn ONLY valid JSON.`,\n\n /**\n * User prompt for suggestion enhancement\n * IMPORTANT: Includes strict JSON schema to ensure consistent output across all LLM providers\n */\n suggestionEnhancementUser: (suggestions: string[]) => `Enhance these suggestions for clarity and actionability:\n${suggestions.map((s) => `- ${s}`).join(\"\\n\")}\n\nMake them specific and measurable where possible.\n\nCRITICAL: You MUST return ONLY valid JSON in this exact format (no markdown, no extra text):\n{\n \"suggestions\": [\n {\n \"original\": \"the original suggestion text\",\n \"enhanced\": \"your improved, more actionable version\",\n \"actionable\": true\n }\n ]\n}`,\n\n /**\n * System prompt for JD clarification\n */\n jdClarificationSystem: `You are a job description analyzer.\nExtract implicit requirements not explicitly stated.\nBe conservative - stick to reasonable inferences.\nRate the clarity of the job description.\nReturn ONLY valid JSON.`,\n\n /**\n * User prompt for JD clarification\n */\n jdClarificationUser: (jd: string) => `Analyze this job description for implicit requirements:\n\n${jd}\n\nWhat skills are implied but not explicitly mentioned?\nWhat experience domains are indicated?\nHow clear is this job description (0-1)?`,\n};\n\n/**\n * Create a structured prompt for a task\n */\nexport function createPrompt(\n systemBase: string,\n userBuilder: (input: string) => string,\n input: string\n): { system: string; user: string } {\n return {\n system: systemBase,\n user: userBuilder(input),\n };\n}\n","/**\n * LLM Adapters - Transform LLM responses into usable data\n * Safely extract and validate results from LLM calls\n */\n\n/**\n * Adapter for skill normalization response\n */\nexport function adaptSkillNormalizationResponse(data: unknown): { input: string; normalized: string; confidence?: number }[] {\n if (!data || typeof data !== \"object\") {\n return [];\n }\n\n const obj = data as Record<string, unknown>;\n const canonicalSkills = obj.canonicalSkills;\n\n if (!Array.isArray(canonicalSkills)) {\n return [];\n }\n\n const results: { input: string; normalized: string; confidence?: number }[] = [];\n for (const item of canonicalSkills) {\n if (typeof item !== \"object\" || item === null) continue;\n const skill = item as Record<string, unknown>;\n const input = skill.input as string | undefined;\n const normalized = skill.normalized as string | undefined;\n const confidence = typeof skill.confidence === \"number\" ? skill.confidence : undefined;\n\n if (input && normalized) {\n results.push({ input, normalized, confidence });\n }\n }\n return results;\n}\n\n/**\n * Adapter for section classification response\n */\nexport function adaptSectionClassificationResponse(\n data: unknown\n): { header: string; classification: string; confidence?: number }[] {\n if (!data || typeof data !== \"object\") {\n return [];\n }\n\n const obj = data as Record<string, unknown>;\n const sections = obj.sections;\n\n if (!Array.isArray(sections)) {\n return [];\n }\n\n const results: { header: string; classification: string; confidence?: number }[] = [];\n for (const item of sections) {\n if (typeof item !== \"object\" || item === null) continue;\n const section = item as Record<string, unknown>;\n const header = section.header as string | undefined;\n const classification = section.classification as string | undefined;\n const confidence = typeof section.confidence === \"number\" ? section.confidence : undefined;\n\n if (header && classification) {\n results.push({ header, classification, confidence });\n }\n }\n return results;\n}\n\n/**\n * Adapter for suggestion enhancement response\n */\nexport function adaptSuggestionEnhancementResponse(\n data: unknown\n): { original: string; enhanced: string; actionable?: boolean }[] {\n if (!data || typeof data !== \"object\") {\n return [];\n }\n\n const obj = data as Record<string, unknown>;\n const suggestions = obj.suggestions;\n\n if (!Array.isArray(suggestions)) {\n return [];\n }\n\n const results: { original: string; enhanced: string; actionable?: boolean }[] = [];\n for (const item of suggestions) {\n if (typeof item !== \"object\" || item === null) continue;\n const suggestion = item as Record<string, unknown>;\n const original = suggestion.original as string | undefined;\n const enhanced = suggestion.enhanced as string | undefined;\n const actionable = typeof suggestion.actionable === \"boolean\" ? suggestion.actionable : undefined;\n\n if (original && enhanced) {\n results.push({ original, enhanced, actionable });\n }\n }\n return results;\n}\n\n/**\n * Adapter for JD clarification response\n */\nexport function adaptJdClarificationResponse(\n data: unknown\n): {\n implicitSkills: string[];\n implicitExperience?: { minYears?: number; domains?: string[] };\n clarityScore?: number;\n} {\n if (!data || typeof data !== \"object\") {\n return { implicitSkills: [] };\n }\n\n const obj = data as Record<string, unknown>;\n const implicitSkills = Array.isArray(obj.implicitSkills) ? obj.implicitSkills.filter((s) => typeof s === \"string\") : [];\n\n const implicitExperience =\n obj.implicitExperience && typeof obj.implicitExperience === \"object\"\n ? (obj.implicitExperience as Record<string, unknown>)\n : undefined;\n\n const minYears =\n implicitExperience && typeof (implicitExperience as Record<string, unknown>).minYears === \"number\"\n ? ((implicitExperience as Record<string, unknown>).minYears as number)\n : undefined;\n\n const domains =\n implicitExperience && Array.isArray((implicitExperience as Record<string, unknown>).domains)\n ? ((implicitExperience as Record<string, unknown>).domains as string[])\n : undefined;\n\n const clarityScore = typeof obj.clarityScore === \"number\" ? obj.clarityScore : undefined;\n\n return {\n implicitSkills,\n implicitExperience: minYears || domains ? { minYears, domains } : undefined,\n clarityScore,\n };\n}\n\n/**\n * Safe value extraction with type coercion\n */\nexport function safeExtractString(obj: unknown, key: string): string | undefined {\n if (typeof obj !== \"object\" || obj === null) return undefined;\n const value = (obj as Record<string, unknown>)[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\n/**\n * Safe array extraction\n */\nexport function safeExtractArray(obj: unknown, key: string): unknown[] {\n if (typeof obj !== \"object\" || obj === null) return [];\n const value = (obj as Record<string, unknown>)[key];\n return Array.isArray(value) ? value : [];\n}\n\n/**\n * Safe number extraction\n */\nexport function safeExtractNumber(obj: unknown, key: string): number | undefined {\n if (typeof obj !== \"object\" || obj === null) return undefined;\n const value = (obj as Record<string, unknown>)[key];\n return typeof value === \"number\" ? value : undefined;\n}\n","import { parseJobDescription } from \"./core/parser/jd.parser\";\nimport { parseResume } from \"./core/parser/resume.parser\";\nimport { RuleEngine } from \"./core/rules/rule.engine\";\nimport { calculateScore } from \"./core/scoring/scorer\";\nimport { resolveConfig } from \"./core/scoring/weights\";\nimport { SuggestionEngine } from \"./core/suggestions/suggestion.engine\";\nimport { AnalyzeResumeInput, ATSAnalysisResult } from \"./types/scoring\";\nimport { ATSConfig } from \"./types/config\";\nimport { LLMConfig } from \"./types/llm\";\nimport { clamp } from \"./utils/text\";\nimport { defaultKeywordRegistry, defaultProfiles, defaultSkillAliases } from \"./profiles\";\nimport { LLMManager, LLMSchemas, LLMPrompts, adaptSuggestionEnhancementResponse } from \"./llm\";\n\nexport * from \"./types\";\nexport { defaultProfiles, defaultSkillAliases, defaultKeywordRegistry };\nexport * from \"./llm\";\n\n/**\n * Analyze a resume against a job description using deterministic, explainable rules.\n * Optional LLM config enables v2 features while maintaining full backward compatibility.\n *\n * @param input Resume, job description, and optional LLM config\n * @returns ATS analysis result with score, breakdown, and suggestions\n *\n * @example\n * // v1 behavior - deterministic only\n * const result = analyzeResume({ resumeText, jobDescription });\n *\n * @example\n * // v2 with LLM - enhanced suggestions\n * const result = analyzeResume({\n * resumeText,\n * jobDescription,\n * llm: { client, limits: { maxCalls: 3, maxTokensPerCall: 2000, maxTotalTokens: 5000 } }\n * });\n */\nexport function analyzeResume(input: AnalyzeResumeInput): ATSAnalysisResult {\n const resolvedConfig = resolveConfig(input.config ?? ({} as ATSConfig));\n const parsedResume = parseResume(input.resumeText, resolvedConfig);\n const parsedJob = parseJobDescription(input.jobDescription, resolvedConfig);\n\n const scoring = calculateScore(parsedResume, parsedJob, resolvedConfig);\n const ruleEngine = new RuleEngine(resolvedConfig);\n const ruleResult = ruleEngine.evaluate({\n resume: parsedResume,\n job: parsedJob,\n breakdown: scoring.breakdown,\n matchedKeywords: scoring.matchedKeywords,\n overusedKeywords: scoring.overusedKeywords,\n });\n\n const suggestionEngine = new SuggestionEngine();\n const suggestionResult = suggestionEngine.generate({\n resume: parsedResume,\n job: parsedJob,\n score: scoring,\n ruleWarnings: ruleResult.warnings,\n config: resolvedConfig,\n });\n\n let suggestions = suggestionResult.suggestions;\n const llmWarnings: string[] = [];\n\n // V2: Optional LLM enhancement of suggestions (deterministic scores unchanged)\n if (input.llm && suggestionResult.suggestions.length > 0) {\n const llmResult = enhanceSuggestionsWithLLM(input.llm, suggestionResult.suggestions);\n if (llmResult.success) {\n suggestions = llmResult.enhancedSuggestions || suggestions;\n }\n llmWarnings.push(...llmResult.warnings);\n }\n\n const finalScore = clamp(scoring.score - ruleResult.totalPenalty, 0, 100);\n\n return {\n score: finalScore,\n breakdown: scoring.breakdown,\n matchedSkills: scoring.matchedSkills,\n missingSkills: scoring.missingSkills,\n matchedKeywords: scoring.matchedKeywords,\n missingKeywords: scoring.missingKeywords,\n overusedKeywords: scoring.overusedKeywords,\n keywordsByCategory: scoring.keywordsByCategory,\n keywordWeights: scoring.keywordWeights,\n achievementStrength: scoring.achievementStrength,\n matchedLanguages: scoring.matchedLanguages,\n missingLanguages: scoring.missingLanguages,\n experienceGap: scoring.experienceGap,\n detectedSections: parsedResume.detectedSections,\n parsedExperienceYears: parsedResume.totalExperienceYears,\n experienceEntries: parsedResume.experience,\n suggestions,\n warnings: [...suggestionResult.warnings, ...llmWarnings],\n };\n}\n\n/**\n * Internal: Enhance suggestions using LLM if configured\n * Failure gracefully falls back to deterministic suggestions\n */\nfunction enhanceSuggestionsWithLLM(\n config: LLMConfig,\n suggestions: string[]\n): { success: boolean; enhancedSuggestions?: string[]; warnings: string[] } {\n if (!config.enable?.suggestions) {\n return { success: false, warnings: [] };\n }\n\n const warnings: string[] = [];\n\n try {\n const llmManager = new LLMManager(config);\n\n // Use synchronous approach - we'll make this async-friendly in future\n // For now, we need to return synchronously, so we use a fallback pattern\n // In production, the calling code should make this async\n warnings.push(\n \"LLM suggestion enhancement skipped - use async analyzeResumeAsync for LLM features\"\n );\n\n return { success: false, warnings };\n } catch (e) {\n warnings.push(`Failed to enhance suggestions: ${(e as Error).message}`);\n return { success: false, warnings };\n }\n}\n\n/**\n * @deprecated The LLM layer only rewrites suggestion text and adds non-determinism.\n * Prefer `analyzeResume` (sync, deterministic) and call your own LLM on the result if needed.\n * This function will be removed in a future major version.\n *\n * @param input Resume, job description, and optional LLM config\n * @returns Promise<ATSAnalysisResult>\n */\nexport async function analyzeResumeAsync(input: AnalyzeResumeInput): Promise<ATSAnalysisResult> {\n // First pass: deterministic v1 logic\n const resolvedConfig = resolveConfig(input.config ?? ({} as ATSConfig));\n const parsedResume = parseResume(input.resumeText, resolvedConfig);\n const parsedJob = parseJobDescription(input.jobDescription, resolvedConfig);\n\n const scoring = calculateScore(parsedResume, parsedJob, resolvedConfig);\n const ruleEngine = new RuleEngine(resolvedConfig);\n const ruleResult = ruleEngine.evaluate({\n resume: parsedResume,\n job: parsedJob,\n breakdown: scoring.breakdown,\n matchedKeywords: scoring.matchedKeywords,\n overusedKeywords: scoring.overusedKeywords,\n });\n\n const suggestionEngine = new SuggestionEngine();\n const suggestionResult = suggestionEngine.generate({\n resume: parsedResume,\n job: parsedJob,\n score: scoring,\n ruleWarnings: ruleResult.warnings,\n config: resolvedConfig,\n });\n\n let suggestions = suggestionResult.suggestions;\n const llmWarnings: string[] = [];\n\n // V2: Optional async LLM enhancement\n if (input.llm && suggestionResult.suggestions.length > 0) {\n const llmResult = await enhanceSuggestionsWithLLMAsync(\n input.llm,\n suggestionResult.suggestions\n );\n if (llmResult.success) {\n suggestions = llmResult.enhancedSuggestions || suggestions;\n }\n llmWarnings.push(...llmResult.warnings);\n }\n\n const finalScore = clamp(scoring.score - ruleResult.totalPenalty, 0, 100);\n\n return {\n score: finalScore,\n breakdown: scoring.breakdown,\n matchedSkills: scoring.matchedSkills,\n missingSkills: scoring.missingSkills,\n matchedKeywords: scoring.matchedKeywords,\n missingKeywords: scoring.missingKeywords,\n overusedKeywords: scoring.overusedKeywords,\n keywordsByCategory: scoring.keywordsByCategory,\n keywordWeights: scoring.keywordWeights,\n achievementStrength: scoring.achievementStrength,\n matchedLanguages: scoring.matchedLanguages,\n missingLanguages: scoring.missingLanguages,\n experienceGap: scoring.experienceGap,\n detectedSections: parsedResume.detectedSections,\n parsedExperienceYears: parsedResume.totalExperienceYears,\n experienceEntries: parsedResume.experience,\n suggestions,\n warnings: [...suggestionResult.warnings, ...llmWarnings],\n };\n}\n\n/**\n * Internal async: Enhance suggestions using LLM\n */\nasync function enhanceSuggestionsWithLLMAsync(\n config: LLMConfig,\n suggestions: string[]\n): Promise<{ success: boolean; enhancedSuggestions?: string[]; warnings: string[] }> {\n if (!config.enable?.suggestions) {\n return { success: false, warnings: [] };\n }\n\n const warnings: string[] = [];\n\n try {\n const llmManager = new LLMManager(config);\n\n const result = await llmManager.callLLM(\n LLMPrompts.suggestionEnhancementSystem,\n LLMPrompts.suggestionEnhancementUser(suggestions),\n LLMSchemas.suggestionEnhancement,\n { requestedTokens: 2000 }\n );\n\n if (!result.success || !result.data) {\n if (result.error) {\n warnings.push(`LLM suggestion enhancement failed: ${result.error}`);\n }\n return { success: false, warnings: [...warnings, ...llmManager.getWarnings()] };\n }\n\n const enhanced = adaptSuggestionEnhancementResponse(result.data);\n const enhancedSuggestions = enhanced\n .filter((e) => e.actionable !== false)\n .map((e) => e.enhanced);\n\n if (enhancedSuggestions.length === 0) {\n warnings.push(\"LLM returned no actionable enhanced suggestions\");\n return { success: false, warnings: [...warnings, ...llmManager.getWarnings()] };\n }\n\n return {\n success: true,\n enhancedSuggestions,\n warnings: llmManager.getWarnings(),\n };\n } catch (e) {\n warnings.push(`Unexpected error in LLM enhancement: ${(e as Error).message}`);\n return { success: false, warnings };\n }\n}\n"]}
|