@pranavraut033/ats-checker 1.3.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +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.\n// ponytail: German/French descriptive words added inline alongside English — same flat map.\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 // German\n grundkenntnisse: 1,\n gering: 2,\n gut: 3,\n fortgeschritten: 4,\n fließend: 5,\n muttersprache: 6, muttersprachler: 6,\n // French\n \"débutant\": 1, \"élémentaire\": 1,\n \"limité\": 2,\n \"intermédiaire\": 3,\n \"avancé\": 4,\n courant: 5,\n natif: 6, \"langue maternelle\": 6, bilingue: 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).\n// ponytail: plain \\b fails on words with a leading/trailing accented letter (e.g. \"élémentaire\",\n// \"avancé\") because JS treats accented chars as non-word for \\b purposes. Lookaround boundaries\n// scoped to the actual a-zà-ÿ alphabet used here sidestep that without a full Unicode regex.\nconst BOUNDARY_START = \"(?:^|(?<=[^a-zà-ÿ]))\";\nconst BOUNDARY_END = \"(?:$|(?=[^a-zà-ÿ]))\";\nconst LANGUAGE_LEVEL_RE = new RegExp(\n `\\\\b(${LANGUAGE_GROUP})\\\\b(?:\\\\s*[\\\\(:\\\\-]?\\\\s*(${BOUNDARY_START}(?:${LEVEL_GROUP})${BOUNDARY_END}|[abc][12]))?`,\n \"gi\"\n);\nconst LEVEL_BEFORE_LANGUAGE_RE = new RegExp(\n `${BOUNDARY_START}(${LEVEL_GROUP})${BOUNDARY_END}\\\\s+(?:in\\\\s+)?(${LANGUAGE_GROUP})\\\\b`,\n \"gi\"\n);\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, ParsedLanguage } 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.\n// ponytail: German/French degree terms added inline alongside English — same flat list.\nconst DEGREE_VARIANTS: [RegExp, string][] = [\n [/\\b(?:bachelor(?:'s)?|b\\.s\\.?|bs\\.?|bsc\\.?|licence)\\b/i, \"bachelor\"],\n [/\\b(?:master(?:'s)?|m\\.s\\.?|ms\\.?|msc\\.?|diplom)\\b/i, \"master\"],\n [/\\b(?:phd|ph\\.d\\.?|doctorate|doktor|doctorat)\\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 // ponytail: match every occurrence (not just the first) so multi-role JDs surface all titles.\n const roleMatches = text.match(/(engineer|developer|manager|scientist|analyst|designer|architect|director|consultant|lead|vp)/gi) ?? [];\n const fallback = roleMatches.length === 0 ? [text.split(/\\n/)[0] ?? \"\"] : [];\n return unique(tokenize([...roleMatches, ...fallback].join(\" \")));\n}\n\nfunction extractMinExperience(text: string): number | undefined {\n // ponytail: accept \"yrs.\" and German/French year words alongside \"years\".\n const match = text.match(/(\\d{1,2})\\+?\\s*(?:years?|yrs\\.?|jahre?|ans?|années?)/i);\n if (!match) return undefined;\n const parsed = Number.parseInt(match[1], 10);\n // ponytail: cap at 60 — realistic max; ignore implausible matches.\n return parsed <= 60 ? parsed : 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\nconst LANG_SECTION_RE = /^\\s*(?:languages?|sprache|langue)s?\\s*[:\\-–—]?\\s*/i;\nconst LANG_REQUIREMENT_HINT_RE = /\\b(fluent|required|must|need|speak|proficient|native|conversational|intermediate|advanced|professional|[abc][12])\\b/i;\n\n// A language mention only counts as required if its line carries a requirement/level cue\n// or sits in a \"Languages:\" line — otherwise plain mentions (\"our Berlin office\") false-positive.\nfunction isLanguageRequired(lang: ParsedLanguage, jobDescription: string): boolean {\n return splitLines(jobDescription).some((line) => {\n const lower = line.toLowerCase();\n if (!lower.includes(lang.name)) return false;\n return LANG_SECTION_RE.test(line) || LANG_REQUIREMENT_HINT_RE.test(line);\n });\n}\n\n// Shared with scorer.ts so resume abbreviations (\"B.S.\") normalize to the same\n// canonical degree names as JD requirements (\"bachelor\") before comparison.\nexport function extractDegreeLevels(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: extractDegreeLevels(jobDescription),\n keywordSurfaceForms: collectKeywordSurfaceForms(jobDescription, config.skillAliases),\n // A language only counts as required if its mention carries a requirement/level cue\n // or sits in a \"Languages:\" line — plain references (\"our Berlin office\") don't count.\n requiredLanguages: parseLanguageMentions(jobDescription).filter((lang) =>\n isLanguageRequired(lang, jobDescription)\n ),\n };\n}\n","import { ParsedDateRange } from \"../types/parser\";\n\n// ponytail: German/French month names added inline alongside English — same flat map.\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 // German\n januar: 1,\n jänner: 1,\n februar: 2,\n märz: 3,\n maerz: 3,\n mai: 5,\n juni: 6,\n juli: 7,\n oktober: 10,\n dezember: 12,\n // French\n janvier: 1,\n février: 2,\n fevrier: 2,\n mars: 3,\n avril: 4,\n juin: 6,\n juillet: 7,\n août: 8,\n aout: 8,\n septembre: 9,\n octobre: 10,\n novembre: 11,\n décembre: 12,\n decembre: 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 // ponytail: à-ÿ range added so accented German/French month names (März, août) still match.\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 // ponytail: localized range separators (German \"bis\", French \"à\"/\"jusqu'à\") and accented\n // month names (à-ÿ) added inline alongside English so the same regex covers all three.\n const rangeMatch = normalized.match(\n /(\\d{1,2}\\/\\d{4}|[A-Za-zà-ÿ]{3,9}\\s+\\d{4}|\\d{4})\\s*(?:-|to|through|until|bis|jusqu'à|à|–|—)\\s*(Present|Current|Now|Aktuell|Heute|Actuellement|Présent|\\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|aktuell|heute|actuellement|présent|actuel/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\n// ponytail: German/French aliases added inline alongside English — same flat list, no locale plumbing.\nconst SECTION_ALIASES: Record<ResumeSection, string[]> = {\n summary: [\"summary\", \"profile\", \"about\", \"zusammenfassung\", \"profil\", \"résumé\", \"à propos\"],\n experience: [\n \"experience\", \"work experience\", \"professional experience\", \"employment\",\n \"erfahrung\", \"berufserfahrung\", \"expérience\", \"expérience professionnelle\",\n ],\n skills: [\"skills\", \"technical skills\", \"technologies\", \"fähigkeiten\", \"kenntnisse\", \"compétences\"],\n education: [\"education\", \"academics\", \"academic background\", \"ausbildung\", \"formation\", \"études\"],\n projects: [\"projects\", \"portfolio\", \"projekte\", \"projets\"],\n certifications: [\"certifications\", \"licenses\", \"zertifizierungen\", \"certifications professionnelles\"]\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 // ponytail: bullet-separated skill lists wrap across lines in PDF text extraction,\n // so treat common bullet glyphs as the delimiter and fold newlines into spaces when present.\n const hasBullets = /[•·‣▪○●◦]/.test(sectionContent);\n const normalized = hasBullets ? sectionContent.replace(/\\n/g, \" \") : sectionContent;\n const raw = normalized\n .split(/[,;\\n]|[•·‣▪○●◦]/)\n .map((skill) => skill.trim().replace(/^[-•·‣▪○●◦\\s]+|[-•·‣▪○●◦\\s]+$/g, \"\").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|VP|Director|Consultant|Architect|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 const parsed = Number.parseInt(yearsMatch[1], 10);\n // ponytail: cap at 60 — realistic max career length; ignore garbage matches like \"97 years\".\n totalExperienceYears = parsed <= 60 ? parsed : 0;\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\";\nimport { extractDegreeLevels } from \"../parser/jd.parser\";\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 resumeDegreeLevels = extractDegreeLevels(resume.educationEntries.join(\" \"));\n const matched = job.educationRequirements.filter((requirement) =>\n resumeDegreeLevels.includes(requirement)\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"]}
1
+ {"version":3,"sources":["../src/utils/languages.ts","../src/utils/match.ts","../src/utils/text.ts","../src/utils/skills.ts","../src/utils/titles.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":["titleMatch","SENIORITY_RANK"],"mappings":"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","file":"index.cjs","sourcesContent":["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\",\n \"spanish\",\n \"french\",\n \"german\",\n \"italian\",\n \"portuguese\",\n \"dutch\",\n \"russian\",\n \"mandarin\",\n \"chinese\",\n \"cantonese\",\n \"japanese\",\n \"korean\",\n \"arabic\",\n \"hindi\",\n \"polish\",\n \"turkish\",\n \"vietnamese\",\n \"swedish\",\n \"norwegian\",\n \"danish\",\n \"finnish\",\n \"greek\",\n \"hebrew\",\n \"thai\",\n \"indonesian\",\n \"ukrainian\",\n \"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.\n// ponytail: German/French descriptive words added inline alongside English — same flat map.\nconst LEVEL_RANK: Record<string, number> = {\n a1: 1,\n a2: 2,\n b1: 3,\n b2: 4,\n c1: 5,\n c2: 6,\n basic: 1,\n elementary: 1,\n limited: 2,\n conversational: 3,\n intermediate: 3,\n professional: 4,\n \"upper intermediate\": 4,\n advanced: 4,\n fluent: 5,\n native: 6,\n \"native speaker\": 6,\n bilingual: 6,\n // German\n grundkenntnisse: 1,\n gering: 2,\n gut: 3,\n fortgeschritten: 4,\n fließend: 5,\n muttersprache: 6,\n muttersprachler: 6,\n // French\n débutant: 1,\n élémentaire: 1,\n limité: 2,\n intermédiaire: 3,\n avancé: 4,\n courant: 5,\n natif: 6,\n \"langue maternelle\": 6,\n bilingue: 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).\n// ponytail: plain \\b fails on words with a leading/trailing accented letter (e.g. \"élémentaire\",\n// \"avancé\") because JS treats accented chars as non-word for \\b purposes. Lookaround boundaries\n// scoped to the actual a-zà-ÿ alphabet used here sidestep that without a full Unicode regex.\nconst BOUNDARY_START = \"(?:^|(?<=[^a-zà-ÿ]))\";\nconst BOUNDARY_END = \"(?:$|(?=[^a-zà-ÿ]))\";\nconst LANGUAGE_LEVEL_RE = new RegExp(\n `\\\\b(${LANGUAGE_GROUP})\\\\b(?:\\\\s*[\\\\(:\\\\-]?\\\\s*(${BOUNDARY_START}(?:${LEVEL_GROUP})${BOUNDARY_END}|[abc][12]))?`,\n \"gi\"\n);\nconst LEVEL_BEFORE_LANGUAGE_RE = new RegExp(\n `${BOUNDARY_START}(${LEVEL_GROUP})${BOUNDARY_END}\\\\s+(?:in\\\\s+)?(${LANGUAGE_GROUP})\\\\b`,\n \"gi\"\n);\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","// ponytail: hand-rolled stemmer + bounded Levenshtein — both stay well under the\n// \"reach for a dep\" threshold (~20 lines each) per the plan's zero-dependency note.\n\n// Longest-suffix-first so e.g. \"-ation\" is stripped before \"-tion\" mis-fires, and\n// \"-ies\"/\"-ied\" before the generic \"-s\"/\"-ed\" catch-alls.\nconst SUFFIXES: {\n suffix: string;\n replacement: string;\n minStemLength: number;\n}[] = [\n { suffix: \"ational\", replacement: \"ate\", minStemLength: 3 },\n { suffix: \"ization\", replacement: \"ize\", minStemLength: 3 },\n { suffix: \"ations\", replacement: \"ate\", minStemLength: 3 },\n { suffix: \"ation\", replacement: \"ate\", minStemLength: 3 },\n { suffix: \"ements\", replacement: \"e\", minStemLength: 3 },\n { suffix: \"ement\", replacement: \"e\", minStemLength: 3 },\n { suffix: \"ments\", replacement: \"ment\", minStemLength: 3 },\n { suffix: \"ment\", replacement: \"\", minStemLength: 3 },\n { suffix: \"ies\", replacement: \"y\", minStemLength: 2 },\n { suffix: \"ied\", replacement: \"y\", minStemLength: 2 },\n { suffix: \"ying\", replacement: \"y\", minStemLength: 2 },\n { suffix: \"tion\", replacement: \"t\", minStemLength: 3 },\n { suffix: \"sion\", replacement: \"s\", minStemLength: 3 },\n { suffix: \"ness\", replacement: \"\", minStemLength: 3 },\n { suffix: \"fully\", replacement: \"ful\", minStemLength: 3 },\n { suffix: \"ally\", replacement: \"al\", minStemLength: 3 },\n { suffix: \"ing\", replacement: \"\", minStemLength: 3 },\n { suffix: \"edly\", replacement: \"\", minStemLength: 3 },\n { suffix: \"ed\", replacement: \"\", minStemLength: 3 },\n { suffix: \"ly\", replacement: \"\", minStemLength: 3 },\n { suffix: \"er\", replacement: \"\", minStemLength: 3 },\n { suffix: \"es\", replacement: \"\", minStemLength: 3 },\n { suffix: \"s\", replacement: \"\", minStemLength: 3 },\n];\n\n/**\n * Hand-rolled suffix normalizer: strips common English inflectional/derivational\n * suffixes so word-form variants (developing/developed/develops -> develop) collapse\n * to the same stem. Not a full Porter stemmer — deliberately simple, deterministic,\n * and tuned for resume/JD vocabulary rather than general English.\n */\nfunction stripOneSuffix(lower: string): string {\n for (const { suffix, replacement, minStemLength } of SUFFIXES) {\n if (\n lower.endsWith(suffix) &&\n lower.length - suffix.length >= minStemLength\n ) {\n // Collapse a doubled trailing consonant left behind by stripping \"-ing\"/\"-ed\"\n // (e.g. \"running\" -> \"runn\" -> \"run\", \"planned\" -> \"plann\" -> \"plan\").\n let stemmed = lower.slice(0, lower.length - suffix.length) + replacement;\n if (\n replacement === \"\" &&\n stemmed.length >= 3 &&\n stemmed[stemmed.length - 1] === stemmed[stemmed.length - 2] &&\n !/[aeiou]/.test(stemmed[stemmed.length - 1])\n ) {\n stemmed = stemmed.slice(0, -1);\n }\n return stemmed;\n }\n }\n return lower;\n}\n\n/**\n * Runs suffix-stripping up to twice so a stacked plural+derivational ending (e.g.\n * \"managers\" -> \"manager\" -> \"manag\") converges to the same stem as its singular\n * form, without letting an unbounded loop over-strip short base words (each pass is\n * gated by minStemLength, and stripping stops as soon as a pass makes no change).\n */\nexport function stem(token: string): string {\n let word = token.trim().toLowerCase();\n for (let pass = 0; pass < 2 && word.length > 3; pass++) {\n const next = stripOneSuffix(word);\n if (next === word) {\n break;\n }\n word = next;\n }\n return word;\n}\n\n/**\n * Bounded Levenshtein edit distance. Stops early (returns Infinity-ish maxDistance+1)\n * once it's clear the distance exceeds maxDistance, keeping the cost close to O(n*m)\n * but cheap in practice for the short strings this library compares.\n */\nexport function levenshteinDistance(\n a: string,\n b: string,\n maxDistance: number\n): number {\n const s = a.toLowerCase();\n const t = b.toLowerCase();\n if (s === t) return 0;\n const lenDiff = Math.abs(s.length - t.length);\n if (lenDiff > maxDistance) return maxDistance + 1;\n\n let prevRow = new Array(t.length + 1);\n for (let j = 0; j <= t.length; j++) prevRow[j] = j;\n\n for (let i = 1; i <= s.length; i++) {\n const currRow = new Array(t.length + 1);\n currRow[0] = i;\n let rowMin = currRow[0];\n for (let j = 1; j <= t.length; j++) {\n const cost = s[i - 1] === t[j - 1] ? 0 : 1;\n currRow[j] = Math.min(\n prevRow[j] + 1, // deletion\n currRow[j - 1] + 1, // insertion\n prevRow[j - 1] + cost // substitution\n );\n if (currRow[j] < rowMin) rowMin = currRow[j];\n }\n if (rowMin > maxDistance) {\n // Every entry in this row already exceeds the budget; distance can only grow.\n return maxDistance + 1;\n }\n prevRow = currRow;\n }\n return prevRow[t.length];\n}\n\n/**\n * Fuzzy string equality via bounded Levenshtein distance, used to catch typos/near\n * variants (e.g. \"ReactJS\" vs \"react\" after stemming, or a plain typo). Default\n * threshold scales with length: maxDistance 1 for strings <=6 chars, 2 for longer,\n * matching the plan's \"short vs long\" bound.\n */\nexport function fuzzyEqual(\n a: string,\n b: string,\n opts?: { maxDistance?: number }\n): boolean {\n const x = a.trim().toLowerCase();\n const y = b.trim().toLowerCase();\n if (x === y) return true;\n if (!x || !y) return false;\n const longer = Math.max(x.length, y.length);\n const defaultMax = longer <= 6 ? 1 : 2;\n const maxDistance = opts?.maxDistance ?? defaultMax;\n return levenshteinDistance(x, y, maxDistance) <= maxDistance;\n}\n","import { stem } from \"./match\";\n\nexport const STOP_WORDS = new Set([\n // articles / prepositions / conjunctions\n \"the\",\n \"and\",\n \"or\",\n \"a\",\n \"an\",\n \"of\",\n \"for\",\n \"to\",\n \"with\",\n \"in\",\n \"on\",\n \"at\",\n \"by\",\n \"from\",\n \"as\",\n \"into\",\n \"onto\",\n \"upon\",\n \"via\",\n \"per\",\n \"plus\",\n // verbs / modals\n \"is\",\n \"are\",\n \"be\",\n \"was\",\n \"were\",\n \"will\",\n \"can\",\n \"should\",\n \"must\",\n \"have\",\n \"has\",\n \"had\",\n \"do\",\n \"does\",\n \"did\",\n \"get\",\n \"give\",\n \"go\",\n \"use\",\n \"see\",\n \"help\",\n \"work\",\n \"build\",\n \"show\",\n \"need\",\n \"want\",\n \"make\",\n \"let\",\n // pronouns / determiners\n \"it\",\n \"its\",\n \"this\",\n \"that\",\n \"these\",\n \"those\",\n \"we\",\n \"our\",\n \"you\",\n \"your\",\n \"they\",\n \"their\",\n \"us\",\n \"who\",\n \"what\",\n \"which\",\n \"how\",\n // common English fillers that leak into JDs\n \"no\",\n \"not\",\n \"all\",\n \"any\",\n \"also\",\n \"more\",\n \"well\",\n \"very\",\n \"highly\",\n \"across\",\n \"over\",\n \"under\",\n \"within\",\n \"about\",\n \"out\",\n \"up\",\n \"down\",\n \"new\",\n \"if\",\n \"so\",\n \"such\",\n \"both\",\n \"each\",\n \"one\",\n \"many\",\n \"only\",\n // JD/HR boilerplate — never skills\n \"years\",\n \"year\",\n \"experience\",\n \"required\",\n \"requirement\",\n \"requirements\",\n \"preferred\",\n \"role\",\n \"degree\",\n \"practices\",\n \"best\",\n \"skills\",\n \"team\",\n \"field\",\n \"related\",\n \"relevant\",\n \"desired\",\n \"strong\",\n \"solid\",\n \"good\",\n \"first\",\n \"based\",\n \"day\",\n \"week\",\n \"month\",\n \"time\",\n \"fast\",\n \"open\",\n \"dynamic\",\n]);\n\n// Shared role-noun vocabulary so the JD side (extractRoleKeywords) and the resume side\n// (title detection) agree on what counts as a \"role\" — this is what makes the two sides\n// comparable via token overlap instead of silently diverging whitelists. Broadened well\n// past engineering so non-eng resumes/JDs (design, sales, HR, finance, ...) get titles too.\nexport const ROLE_NOUNS = [\n \"engineer\",\n \"developer\",\n \"manager\",\n \"scientist\",\n \"analyst\",\n \"designer\",\n \"architect\",\n \"director\",\n \"consultant\",\n \"lead\",\n \"vp\",\n \"specialist\",\n \"coordinator\",\n \"administrator\",\n \"accountant\",\n \"recruiter\",\n \"nurse\",\n \"teacher\",\n \"associate\",\n \"representative\",\n \"executive\",\n \"officer\",\n \"technician\",\n \"strategist\",\n \"marketer\",\n \"writer\",\n \"editor\",\n \"product\",\n \"principal\",\n \"staff\",\n \"head\",\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, options?: { stem?: boolean }): 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 const tokens = (normalized.match(TECH_TOKEN_RE) ?? []).filter(\n (t) => /[a-z]/.test(t) && !STOP_WORDS.has(t)\n );\n if (!options?.stem) {\n return tokens;\n }\n return tokens.map((t) => stem(t));\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\n/** ATS-relevant parseability signals extracted from a resume's raw text. */\nexport interface FormattingSignals {\n /** Pipe/tab/aligned-space table structure (reuses containsTableLikeStructure). */\n hasTables: boolean;\n /** Very wide, inconsistent whitespace gaps suggesting a PDF-extracted multi-column layout. */\n hasMultiColumn: boolean;\n /** Control chars / private-use-area glyphs (icon fonts) / replacement chars from a bad extraction. */\n hasSpecialChars: boolean;\n /** Bullets other than the common -, *, •, o, numbered/lettered list markers. */\n nonStandardBullets: boolean;\n /** Text density/shape consistent with a scanned image (no embedded text layer) rather than real text. */\n likelyScanned: boolean;\n /** A plausible email address is present in the raw text (contact info is extractable). */\n contactParseable: boolean;\n}\n\nconst STANDARD_BULLET_RE = /^\\s*(?:[-*•o‣▪]|\\(?[a-z0-9]+[.)])\\s+/i;\n// Common non-standard bullet glyphs PDF/Word exports emit (arrows, checks, diamonds, dingbats).\nconst NON_STANDARD_BULLET_RE = /^\\s*[➤➢✓✔✗➔❖◆♦❯›»★☆♥❤]/;\n// Private-use-area codepoints (icon fonts mis-decoded as text) + the Unicode replacement char.\nconst SPECIAL_CHAR_RE = /[-�]|[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/;\n\n/**\n * Heuristic parseability/formatting detector for raw resume text. Reuses\n * containsTableLikeStructure for hasTables; the rest are lightweight regex/line\n * scans in the same style. Informational only — callers decide how to score it.\n */\nexport function detectFormatting(raw: string): FormattingSignals {\n const lines = splitLines(raw);\n\n const hasTables = containsTableLikeStructure(raw);\n\n // Multi-column PDFs often extract as lines with very large, irregular whitespace\n // gaps between short fragments (columns interleaved) rather than the more regular\n // 3+ space alignment the table heuristic looks for.\n let wideGapLines = 0;\n for (const line of lines) {\n if (/\\S( {6,})\\S/.test(line)) {\n wideGapLines += 1;\n }\n }\n const hasMultiColumn = wideGapLines >= 2;\n\n const hasSpecialChars = SPECIAL_CHAR_RE.test(raw);\n\n let bulletLines = 0;\n let nonStandardBulletLines = 0;\n for (const line of lines) {\n if (NON_STANDARD_BULLET_RE.test(line)) {\n bulletLines += 1;\n nonStandardBulletLines += 1;\n } else if (STANDARD_BULLET_RE.test(line)) {\n bulletLines += 1;\n }\n }\n const nonStandardBullets =\n nonStandardBulletLines > 0 && nonStandardBulletLines >= bulletLines / 2;\n\n // Very little recognizable alphabetic content relative to overall length suggests a\n // scanned image whose \"text layer\" is empty/garbled rather than genuine extracted text.\n const trimmed = raw.trim();\n const letterCount = (trimmed.match(/[a-zA-Z]/g) ?? []).length;\n const likelyScanned =\n trimmed.length > 0 &&\n (letterCount < 20 || letterCount / trimmed.length < 0.2);\n\n const contactParseable =\n /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/.test(raw);\n\n return {\n hasTables,\n hasMultiColumn,\n hasSpecialChars,\n nonStandardBullets,\n likelyScanned,\n contactParseable,\n };\n}\n","import { fuzzyEqual, stem } from \"./match\";\nimport { unique } from \"./text\";\nimport {\n KeywordCategory,\n KeywordRegistry,\n SkillAliases,\n} from \"../types/config\";\n\n// Map lookup by default; stem/fuzzy fallback is opt-in (see NormalizeSkillOptions) so\n// existing exact-match callers/tests keep their current behavior until SCORING opts in.\nconst aliasIndexCache = new WeakMap<SkillAliases, Map<string, string>>();\n// Cache of stemmed-alias-key -> canonical, built lazily alongside the exact index so the\n// fuzzy fallback also stays a Map lookup (plus a bounded distance check) rather than a scan.\nconst stemIndexCache = 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\nfunction getStemIndex(aliases: SkillAliases): Map<string, string> {\n let index = stemIndexCache.get(aliases);\n if (!index) {\n index = new Map();\n for (const [key, canonical] of getAliasIndex(aliases)) {\n const stemmed = stem(key);\n // First writer wins so aliasing collisions stay deterministic across runs.\n if (!index.has(stemmed)) {\n index.set(stemmed, canonical);\n }\n }\n stemIndexCache.set(aliases, index);\n }\n return index;\n}\n\nexport interface NormalizeSkillOptions {\n /** Fall back to stemmed/fuzzy matching when the exact alias lookup misses. Default: false. */\n fuzzy?: boolean;\n /** Passed through to fuzzyEqual when fuzzy fallback is enabled. */\n maxDistance?: number;\n}\n\nexport function normalizeSkill(\n skill: string,\n aliases: SkillAliases,\n options?: NormalizeSkillOptions\n): string {\n const normalized = skill.trim().toLowerCase();\n const exact = getAliasIndex(aliases).get(normalized);\n if (exact) {\n return exact;\n }\n if (!options?.fuzzy) {\n return normalized;\n }\n\n const stemmed = stem(normalized);\n const stemIndex = getStemIndex(aliases);\n const stemHit = stemIndex.get(stemmed);\n if (stemHit) {\n return stemHit;\n }\n\n // Bounded fuzzy scan of alias keys, stem-first to skip obviously distant candidates\n // before paying for Levenshtein.\n for (const [key, canonical] of stemIndex) {\n if (fuzzyEqual(stemmed, key, { maxDistance: options.maxDistance })) {\n return canonical;\n }\n }\n return normalized;\n}\n\nexport function normalizeSkills(\n skills: string[],\n aliases: SkillAliases,\n options?: NormalizeSkillOptions\n): string[] {\n return unique(skills.map((skill) => normalizeSkill(skill, aliases, options)));\n}\n\nexport function skillMatched(\n candidate: string,\n targetSkills: Set<string>,\n aliases: SkillAliases,\n options?: NormalizeSkillOptions\n): boolean {\n const normalizedCandidate = normalizeSkill(candidate, aliases, options);\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(\n registry: KeywordRegistry\n): 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(\n base: KeywordRegistry,\n overrides: KeywordRegistry\n): KeywordRegistry {\n const byCanonical = new Map<string, KeywordRegistry[number]>();\n for (const entry of base)\n byCanonical.set(entry.canonical.toLowerCase(), entry);\n for (const entry of overrides)\n byCanonical.set(entry.canonical.toLowerCase(), entry);\n return [...byCanonical.values()];\n}\n","import { stem } from \"./match\";\nimport { ROLE_NOUNS, STOP_WORDS } from \"./text\";\n\nexport type Seniority = \"junior\" | \"mid\" | \"senior\" | \"lead\" | \"principal\";\n\n// Ordered by specificity so a title like \"Senior Staff Engineer\" resolves to the\n// higher-ranked signal (principal-ish) rather than the first substring hit.\nconst SENIORITY_SIGNALS: { seniority: Seniority; pattern: RegExp }[] = [\n { seniority: \"principal\", pattern: /\\bprincipal\\b/i },\n { seniority: \"lead\", pattern: /\\b(lead|staff|head of|director)\\b/i },\n { seniority: \"senior\", pattern: /\\b(senior|sr\\.?)\\b/i },\n {\n seniority: \"junior\",\n pattern: /\\b(junior|jr\\.?|entry[\\s-]?level|intern(?:ship)?|associate)\\b/i,\n },\n];\n\n// Rank used to pick the strongest signal when a title matches more than one tier\n// (e.g. \"Senior Staff Engineer\" hits both senior and lead).\nconst SENIORITY_RANK: Record<Seniority, number> = {\n junior: 0,\n mid: 1,\n senior: 2,\n lead: 3,\n principal: 4,\n};\n\n/**\n * Infer overall seniority from a resume's job titles. Looks at every title (not just\n * the most recent) and returns the highest-ranked signal found; if titles exist but\n * none carry a seniority keyword, returns undefined (unknown) rather than guessing\n * \"mid\" — callers can default to 'mid' themselves if they want that fallback.\n */\nexport function inferSeniority(titles: string[]): Seniority | undefined {\n let best: Seniority | undefined;\n for (const title of titles) {\n for (const { seniority, pattern } of SENIORITY_SIGNALS) {\n if (pattern.test(title)) {\n if (!best || SENIORITY_RANK[seniority] > SENIORITY_RANK[best]) {\n best = seniority;\n }\n break; // first (most specific) match per title wins for that title\n }\n }\n }\n return best;\n}\n\n/** Lowercase + collapse whitespace/punctuation noise from a raw job title string. */\nexport function normalizeTitle(title: string): string {\n return title\n .toLowerCase()\n .replace(/[.,/#!$%^&*;:{}=_`~()]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction titleTokens(title: string): Set<string> {\n const tokens = normalizeTitle(title)\n .split(\" \")\n .filter((t) => t && !STOP_WORDS.has(t))\n .map((t) => stem(t));\n return new Set(tokens);\n}\n\n/**\n * Coverage ratio (0-1) of JD role keywords found in the resume's titles, matched on\n * stemmed/normalized tokens rather than raw single-token overlap so \"Developer\" vs\n * \"Developing\"/\"Devs\" or \"Sr Engineer\" vs \"Senior Engineer\" still line up. Also treats\n * the shared ROLE_NOUNS vocabulary as a soft synonym set: any resume title token that\n * shares a stemmed role-noun with a JD keyword counts as a match.\n */\nexport function titleMatch(\n resumeTitles: string[],\n jdRoleKeywords: string[]\n): number {\n const keywords = jdRoleKeywords\n .map((k) => stem(normalizeTitle(k)))\n .filter(Boolean);\n if (keywords.length === 0) {\n return 0;\n }\n\n const resumeTokenSets = resumeTitles.map(titleTokens);\n const roleNounStems = new Set(ROLE_NOUNS.map((n) => stem(n)));\n\n let matched = 0;\n for (const keyword of keywords) {\n const isRoleNoun = roleNounStems.has(keyword);\n const hit = resumeTokenSets.some((tokens) => {\n if (tokens.has(keyword)) {\n return true;\n }\n // Soft synonym: both sides reference a shared role noun (e.g. \"engineer\").\n return (\n isRoleNoun &&\n [...tokens].some((t) => roleNounStems.has(t) && t === keyword)\n );\n });\n if (hit) {\n matched += 1;\n }\n }\n return matched / keywords.length;\n}\n","import { ResolvedATSConfig, SkillAliases } from \"../../types/config\";\nimport {\n ParsedJobDescription,\n ParsedLanguage,\n SkillExperienceRequirement,\n} from \"../../types/parser\";\nimport { parseLanguageMentions } from \"../../utils/languages\";\nimport { normalizeSkill, normalizeSkills } from \"../../utils/skills\";\nimport {\n normalizeWhitespace,\n splitLines,\n tokenize,\n unique,\n STOP_WORDS,\n ROLE_NOUNS,\n} from \"../../utils/text\";\nimport { inferSeniority } from \"../../utils/titles\";\n\n// Map any variant found in JD text to a canonical form that also appears in resume text.\n// ponytail: German/French degree terms added inline alongside English — same flat list.\nconst DEGREE_VARIANTS: [RegExp, string][] = [\n [/\\b(?:bachelor(?:'s)?|b\\.s\\.?|bs\\.?|bsc\\.?|licence)\\b/i, \"bachelor\"],\n [/\\b(?:master(?:'s)?|m\\.s\\.?|ms\\.?|msc\\.?|diplom)\\b/i, \"master\"],\n [/\\b(?:phd|ph\\.d\\.?|doctorate|doktor|doctorat)\\b/i, \"phd\"],\n [/\\bmba\\b/i, \"mba\"],\n [/\\bassociate(?:'s)?\\b/i, \"associate\"],\n];\n\n// ponytail: line-level regex match — JDs with word-wrap corruption (trigger phrase split\n// across two lines, e.g. copy-pasted from a columned layout) silently fall through to the\n// unweighted body-keyword bucket instead. See README caveat; upgrade path is LLM-assisted\n// section classification if this proves common in practice.\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\n// Block-scoped required/preferred detection: a line that's JUST a header (nothing but the\n// header phrase, optionally colon-terminated) scopes every subsequent line to that bucket\n// until the next header (of either flavor) or an unrelated section header. This supplements\n// (doesn't replace) the line-local cue-word heuristics above, since some JDs mix inline cues\n// without ever using a dedicated header.\nconst REQUIRED_HEADER_RE =\n /^(?:requirements?|must[\\s-]?haves?|required\\s+skills?|required\\s+qualifications?|qualifications?|minimum\\s+qualifications?)\\s*:?\\s*$/i;\nconst PREFERRED_HEADER_RE =\n /^(?:preferred(?:\\s+skills?|\\s+qualifications?)?|nice[\\s-]?to[\\s-]?haves?|bonus(?:\\s+points?)?|pluses?)\\s*:?\\s*$/i;\n// Unrelated headers that end an open required/preferred scope without opening a new one, so\n// \"Requirements:\" bullets don't keep absorbing \"Responsibilities:\"/\"About us:\" prose below them.\nconst OTHER_HEADER_RE =\n /^(?:responsibilities|duties|about(?:\\s+the)?(?:\\s+role|\\s+us|\\s+company|\\s+team)?|what\\s+you.?ll\\s+do|who\\s+you\\s+are|benefits|perks|compensation|how\\s+to\\s+apply|overview|summary|about)\\s*:?\\s*$/i;\n\nfunction extractHeaderScopedSkills(lines: string[]): {\n required: string[];\n preferred: string[];\n} {\n const required: string[] = [];\n const preferred: string[] = [];\n let scope: \"required\" | \"preferred\" | null = null;\n\n for (const line of lines) {\n if (REQUIRED_HEADER_RE.test(line)) {\n scope = \"required\";\n continue;\n }\n if (PREFERRED_HEADER_RE.test(line)) {\n scope = \"preferred\";\n continue;\n }\n if (OTHER_HEADER_RE.test(line)) {\n scope = null;\n continue;\n }\n if (scope === \"required\") {\n required.push(...tokenize(line));\n } else if (scope === \"preferred\") {\n preferred.push(...tokenize(line));\n }\n }\n\n return { required, preferred };\n}\n\n// Shared with resume.parser.ts's title detection so both sides agree on role vocabulary —\n// this is the root cause fix for #1 (JD single-token roleKeywords never matching resume title phrases).\nconst ROLE_NOUN_RE = new RegExp(`(${ROLE_NOUNS.join(\"|\")})`, \"gi\");\n\nfunction extractRoleKeywords(text: string): string[] {\n // ponytail: match every occurrence (not just the first) so multi-role JDs surface all titles.\n const roleMatches = text.match(ROLE_NOUN_RE) ?? [];\n const fallback = roleMatches.length === 0 ? [text.split(/\\n/)[0] ?? \"\"] : [];\n return unique(tokenize([...roleMatches, ...fallback].join(\" \")));\n}\n\n// Lines that mention a role noun (e.g. \"Senior Backend Engineer\", \"hiring a Product Designer\")\n// carry the JD's title/seniority context; fall back to the first line (typically the job title\n// heading) when no role noun appears anywhere. Uses .match (not .test) against the shared global\n// ROLE_NOUN_RE so we don't trip over its persisted lastIndex state between calls.\nfunction extractTitleContextLines(text: string): string[] {\n const lines = splitLines(text);\n const roleLines = lines.filter((line) => line.match(ROLE_NOUN_RE) !== null);\n return roleLines.length > 0 ? roleLines : lines.slice(0, 1);\n}\n\nfunction extractMinExperience(text: string): number | undefined {\n // ponytail: accept \"yrs.\" and German/French year words alongside \"years\".\n const match = text.match(\n /(\\d{1,2})\\+?\\s*(?:years?|yrs\\.?|jahre?|ans?|années?)/i\n );\n if (!match) return undefined;\n const parsed = Number.parseInt(match[1], 10);\n // ponytail: cap at 60 — realistic max; ignore implausible matches.\n return parsed <= 60 ? parsed : 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(\n rawText: string,\n aliases: SkillAliases\n): 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\nconst LANG_SECTION_RE = /^\\s*(?:languages?|sprache|langue)s?\\s*[:\\-–—]?\\s*/i;\nconst LANG_REQUIREMENT_HINT_RE =\n /\\b(fluent|required|must|need|speak|proficient|native|conversational|intermediate|advanced|professional|[abc][12])\\b/i;\n\n// A language mention only counts as required if its line carries a requirement/level cue\n// or sits in a \"Languages:\" line — otherwise plain mentions (\"our Berlin office\") false-positive.\nfunction isLanguageRequired(\n lang: ParsedLanguage,\n jobDescription: string\n): boolean {\n return splitLines(jobDescription).some((line) => {\n const lower = line.toLowerCase();\n if (!lower.includes(lang.name)) return false;\n return LANG_SECTION_RE.test(line) || LANG_REQUIREMENT_HINT_RE.test(line);\n });\n}\n\n// Matches \"N(+)? years [of/in/with] <skill words...>\" e.g. \"5+ years of Figma experience\".\nconst YEARS_BEFORE_SKILL_RE =\n /(\\d{1,2})\\+?\\s*years?\\s*(?:of|in|with)?\\s*((?:[a-z0-9][a-z0-9.#+\\-/]*\\s*){1,4})/gi;\n// Matches \"<skill words...> N(+)? years\" e.g. \"React (3+ years)\" or \"Figma experience: 5 years\".\nconst SKILL_BEFORE_YEARS_RE =\n /((?:[a-z0-9][a-z0-9.#+\\-/]*[\\s,]*){1,4})\\(?(\\d{1,2})\\+?\\s*years?\\)?/gi;\n\n// Parse per-skill year requirements (\"5+ years of React\", \"GraphQL (3+ years)\") out of the JD,\n// gated through the same skillVocab used for required/preferred skill extraction so generic\n// filler words (\"must\", \"have\", \"of\") never turn into bogus skill-experience entries.\nfunction extractSkillExperienceRequirements(\n lines: string[],\n skillVocab: Set<string>,\n aliases: SkillAliases\n): SkillExperienceRequirement[] {\n const requirements = new Map<string, number>();\n\n const record = (rawWord: string, years: number) => {\n if (!Number.isFinite(years) || years <= 0 || years > 60) return;\n const canonical = normalizeSkill(rawWord, aliases);\n if (!skillVocab.has(rawWord.toLowerCase()) && !skillVocab.has(canonical))\n return;\n const existing = requirements.get(canonical);\n if (existing === undefined || years > existing) {\n requirements.set(canonical, years);\n }\n };\n\n for (const line of lines) {\n for (const re of [YEARS_BEFORE_SKILL_RE, SKILL_BEFORE_YEARS_RE]) {\n re.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = re.exec(line))) {\n const years = Number.parseInt(\n re === YEARS_BEFORE_SKILL_RE ? match[1] : match[2],\n 10\n );\n const candidateWords = tokenize(\n re === YEARS_BEFORE_SKILL_RE ? match[2] : match[1]\n );\n for (const word of candidateWords) record(word, years);\n }\n }\n }\n\n return [...requirements.entries()]\n .map(([skill, years]) => ({ skill, years }))\n .sort((a, b) => a.skill.localeCompare(b.skill));\n}\n\n// Shared with scorer.ts so resume abbreviations (\"B.S.\") normalize to the same\n// canonical degree names as JD requirements (\"bachelor\") before comparison.\nexport function extractDegreeLevels(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 ?? [])\n skillVocab.add(s.toLowerCase());\n for (const s of config.profile?.optionalSkills ?? [])\n 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(\"/\"))\n return t.split(\"/\").some((p) => p.length >= 2 && !STOP_WORDS.has(p));\n return false;\n };\n\n const headerScoped = extractHeaderScopedSkills(lines);\n const requiredSkillsRaw = unique([\n ...extractRequiredSkills(lines),\n ...headerScoped.required,\n ]).filter(isSkillLike);\n const preferredSkillsRaw = unique([\n ...extractPreferredSkills(lines),\n ...headerScoped.preferred,\n ]).filter(isSkillLike);\n\n const requiredSkills = normalizeSkills(\n requiredSkillsRaw,\n config.skillAliases\n );\n const preferredSkills = normalizeSkills(\n preferredSkillsRaw,\n config.skillAliases\n );\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([\n ...requiredSkills,\n ...preferredSkills,\n ...roleKeywords,\n ...bodyTokens,\n ]);\n const skillExperienceRequirements = extractSkillExperienceRequirements(\n lines,\n skillVocab,\n config.skillAliases\n );\n\n return {\n raw: jobDescription,\n normalizedText,\n requiredSkills,\n preferredSkills,\n roleKeywords,\n keywords,\n minExperienceYears: extractMinExperience(jobDescription),\n skillExperienceRequirements,\n educationRequirements: extractDegreeLevels(jobDescription),\n keywordSurfaceForms: collectKeywordSurfaceForms(\n jobDescription,\n config.skillAliases\n ),\n // A language only counts as required if its mention carries a requirement/level cue\n // or sits in a \"Languages:\" line — plain references (\"our Berlin office\") don't count.\n requiredLanguages: parseLanguageMentions(jobDescription).filter((lang) =>\n isLanguageRequired(lang, jobDescription)\n ),\n seniority: inferSeniority(extractTitleContextLines(jobDescription)),\n };\n}\n","import { ParsedDateRange, ParsedExperienceEntry } from \"../types/parser\";\n\n// ponytail: German/French month names added inline alongside English — same flat map.\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 // German\n januar: 1,\n jänner: 1,\n februar: 2,\n märz: 3,\n maerz: 3,\n mai: 5,\n juni: 6,\n juli: 7,\n oktober: 10,\n dezember: 12,\n // French\n janvier: 1,\n février: 2,\n fevrier: 2,\n mars: 3,\n avril: 4,\n juin: 6,\n juillet: 7,\n août: 8,\n aout: 8,\n septembre: 9,\n octobre: 10,\n novembre: 11,\n décembre: 12,\n decembre: 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 // ponytail: à-ÿ range added so accented German/French month names (März, août) still match.\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(\n text: string,\n referenceDate?: Date\n): ParsedDateRange | null {\n const normalized = text.trim();\n // ponytail: localized range separators (German \"bis\", French \"à\"/\"jusqu'à\") and accented\n // month names (à-ÿ) added inline alongside English so the same regex covers all three.\n const rangeMatch = normalized.match(\n /(\\d{1,2}\\/\\d{4}|[A-Za-zà-ÿ]{3,9}\\s+\\d{4}|\\d{4})\\s*(?:-|to|through|until|bis|jusqu'à|à|–|—)\\s*(Present|Current|Now|Aktuell|Heute|Actuellement|Présent|\\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 =\n /present|current|now|aktuell|heute|actuellement|présent|actuel/i.test(\n endRaw\n );\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(\n (total, r) => total + (r.durationInMonths ?? 0),\n 0\n );\n return Number((months / 12).toFixed(2));\n}\n\nexport interface EmploymentGap {\n /** Title (or company/fallback label) of the role worked immediately before the gap. */\n afterRole: string;\n months: number;\n}\n\n/**\n * Detect gaps between consecutive roles (sorted chronologically, with overlapping/\n * concurrent roles merged first — same overlap-merge approach as sumExperienceYears,\n * so a freelance gig running alongside a full-time role doesn't register as a \"gap\").\n * Only entries with fully resolved date bounds (startYear + endYear) are considered;\n * entries missing bounds are skipped since a gap can't be computed without them.\n */\nexport function detectEmploymentGaps(\n entries: ParsedExperienceEntry[],\n minGapMonths = 3\n): EmploymentGap[] {\n const toIndex = (year: number, month: number) => year * 12 + month;\n\n const intervals = entries\n .filter(\n (e): e is ParsedExperienceEntry & { dates: ParsedDateRange } =>\n e.dates?.startYear !== undefined && e.dates?.endYear !== undefined\n )\n .map((e) => ({\n s: toIndex(e.dates.startYear!, e.dates.startMonth ?? 1),\n e: toIndex(e.dates.endYear!, e.dates.endMonth ?? 12),\n label: e.title || e.company || \"previous role\",\n }))\n .sort((a, b) => a.s - b.s || b.e - a.e);\n\n if (intervals.length < 2) {\n return [];\n }\n\n const gaps: EmploymentGap[] = [];\n let curEnd = intervals[0].e;\n let curEndLabel = intervals[0].label;\n\n for (let i = 1; i < intervals.length; i++) {\n const interval = intervals[i];\n if (interval.s <= curEnd + 1) {\n // Overlapping or contiguous — merge, keeping whichever role's end extends furthest.\n if (interval.e > curEnd) {\n curEnd = interval.e;\n curEndLabel = interval.label;\n }\n continue;\n }\n const gapMonths = interval.s - curEnd - 1;\n if (gapMonths >= minGapMonths) {\n gaps.push({ afterRole: curEndLabel, months: gapMonths });\n }\n curEnd = interval.e;\n curEndLabel = interval.label;\n }\n\n return gaps;\n}\n","import { ResolvedATSConfig, SkillAliases } from \"../../types/config\";\nimport {\n ParsedAchievement,\n ParsedExperienceEntry,\n ParsedResume,\n ResumeSection,\n} from \"../../types/parser\";\nimport {\n detectEmploymentGaps,\n parseDateRange,\n sumExperienceYears,\n} from \"../../utils/dates\";\nimport { parseLanguageMentions } from \"../../utils/languages\";\nimport { fuzzyEqual, stem } from \"../../utils/match\";\nimport { normalizeSkill, normalizeSkills } from \"../../utils/skills\";\nimport {\n detectFormatting,\n escapeRegExp,\n normalizeForComparison,\n normalizeWhitespace,\n ROLE_NOUNS,\n splitLines,\n tokenize,\n unique,\n} from \"../../utils/text\";\nimport { inferSeniority } from \"../../utils/titles\";\n\n// ponytail: German/French aliases added inline alongside English — same flat list, no locale plumbing.\nconst SECTION_ALIASES: Record<ResumeSection, string[]> = {\n summary: [\n \"summary\",\n \"profile\",\n \"about\",\n \"zusammenfassung\",\n \"profil\",\n \"résumé\",\n \"à propos\",\n ],\n experience: [\n \"experience\",\n \"work experience\",\n \"professional experience\",\n \"employment\",\n \"work history\",\n \"employment history\",\n \"erfahrung\",\n \"berufserfahrung\",\n \"expérience\",\n \"expérience professionnelle\",\n ],\n skills: [\n \"skills\",\n \"technical skills\",\n \"technologies\",\n \"fähigkeiten\",\n \"kenntnisse\",\n \"compétences\",\n ],\n education: [\n \"education\",\n \"academics\",\n \"academic background\",\n \"ausbildung\",\n \"formation\",\n \"études\",\n ],\n projects: [\"projects\", \"portfolio\", \"projekte\", \"projets\"],\n certifications: [\n \"certifications\",\n \"licenses\",\n \"zertifizierungen\",\n \"certifications professionnelles\",\n ],\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 = [\n \"worked\",\n \"helped\",\n \"performed\",\n \"responsible\",\n \"assisted\",\n \"participated\",\n \"involved\",\n];\n\n// Seniority words that precede a role noun (\"Senior Engineer\", \"VP Engineering\") but aren't role\n// nouns themselves. Legacy modifier words kept alongside so \"Software Engineer\"/\"Full Stack\n// Developer\"/\"Frontend Developer\"/\"Backend Engineer\" (the original narrower whitelist) still match.\nconst TITLE_SENIORITY_PREFIXES = [\n \"senior\",\n \"lead\",\n \"principal\",\n \"staff\",\n \"vp\",\n \"director\",\n];\nconst TITLE_MODIFIER_WORDS = [\n \"software\",\n \"full\\\\s*stack\",\n \"frontend\",\n \"backend\",\n];\n// Shared with jd.parser.ts's extractRoleKeywords — root cause fix for #1 (JD roleKeywords vs\n// resume title phrases previously drawing from two different, disagreeing whitelists).\nconst TITLE_PREFIX_WORDS = unique([\n ...TITLE_SENIORITY_PREFIXES,\n ...TITLE_MODIFIER_WORDS,\n ...ROLE_NOUNS,\n]);\n// Stop at comma / hyphen / open-paren so an inline date range (\"(Jan 2020 - Present)\") on a\n// combined title+dates line doesn't leak into the captured title.\nconst TITLE_RE = new RegExp(`^(${TITLE_PREFIX_WORDS.join(\"|\")})[^,(-]*`, \"i\");\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) =>\n new RegExp(`\\\\b${verb}\\\\b`).test(lower)\n );\n const hasWeakVerb = WEAK_VERBS.some((verb) =>\n new RegExp(`\\\\b${verb}\\\\b`).test(lower)\n );\n\n if (hasStrongVerb && hasMetric) {\n return {\n text: line,\n strength: \"strong\",\n reason: \"strong verb + quantified impact\",\n };\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// A \"tail\" following the alias phrase that still counts as a header line rather than body\n// prose: punctuation (colon/dash/period), whitespace, and/or a trailing date/date-range\n// (e.g. \"WORK HISTORY 2015-2024\", \"Professional Experience —\", \"EXPERIENCE:\"). Anything\n// else after the alias (real words) means it's a sentence, not a header.\nconst HEADER_TAIL_RE =\n /^[\\s:.\\-–—,]*(?:\\d{4}\\s*(?:[-–—]|to)\\s*(?:\\d{4}|present|current|now)|\\d{4})?[\\s:.\\-–—,]*$/i;\n\n// Header lines are short by convention — guards both the exact and fuzzy passes below\n// against matching inside a long line of body prose that merely starts with an alias word.\nconst MAX_HEADER_LINE_LENGTH = 60;\n\nfunction detectSection(line: string): ResumeSection | null {\n // Normalize and trim line before matching\n const trimmed = line.trim();\n if (!trimmed || trimmed.length > MAX_HEADER_LINE_LENGTH) return null;\n const normalized = trimmed.toLowerCase();\n\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}(.*)$`, \"i\");\n const match = normalized.match(headerPattern);\n if (match && HEADER_TAIL_RE.test(match[1])) {\n return section as ResumeSection;\n }\n }\n }\n\n // Fuzzy fallback: catch near-miss synonyms/typos (e.g. \"Employements\" for \"employment\")\n // via stemmed Levenshtein comparison. Requires the same word count as the alias so a\n // stray single-word match in the middle of a longer phrase can't fire, and still enforces\n // the header-tail rule on whatever follows the matched words.\n const coreLine = normalized.replace(/[\\s:.\\-–—,]+$/, \"\");\n const lineWords = coreLine.split(/\\s+/).filter(Boolean);\n for (const [section, aliases] of Object.entries(SECTION_ALIASES)) {\n for (const alias of aliases) {\n const aliasWords = alias.split(/\\s+/);\n if (lineWords.length < aliasWords.length) continue;\n const candidateWords = lineWords.slice(0, aliasWords.length);\n const allFuzzy = aliasWords.every(\n (aliasWord, i) =>\n aliasWord !== candidateWords[i] &&\n fuzzyEqual(stem(aliasWord), stem(candidateWords[i]))\n );\n if (!allFuzzy) continue;\n const prefixPattern = new RegExp(\n `^\\\\s*${candidateWords.map((w) => escapeRegExp(w)).join(\"\\\\s+\")}(.*)$`,\n \"i\"\n );\n const prefixMatch = normalized.match(prefixPattern);\n if (prefixMatch && HEADER_TAIL_RE.test(prefixMatch[1])) {\n return section as ResumeSection;\n }\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 parseExplicitSkillList(sectionContent: string | undefined): string[] {\n if (!sectionContent) return [];\n // ponytail: bullet-separated skill lists wrap across lines in PDF text extraction,\n // so treat common bullet glyphs as the delimiter and fold newlines into spaces when present.\n const hasBullets = /[•·‣▪○●◦]/.test(sectionContent);\n const normalized = hasBullets\n ? sectionContent.replace(/\\n/g, \" \")\n : sectionContent;\n return normalized\n .split(/[,;\\n]|[•·‣▪○●◦]/)\n .map((skill) =>\n skill\n .trim()\n .replace(/^[-•·‣▪○●◦\\s]+|[-•·‣▪○●◦\\s]+$/g, \"\")\n .trim()\n )\n .filter(Boolean);\n}\n\n/**\n * Scan free-form text (experience bullets, summary) for tokens that resolve to a known\n * registry canonical/alias, so skills demonstrated outside a dedicated \"Skills\" section\n * still get credit. Only tokens that actually resolve to a known canonical are kept —\n * unlike parseExplicitSkillList, we don't want to just tokenize everything and treat it\n * as a skill (that would be noise: \"led\", \"team\", \"quarterly\" aren't skills).\n */\nfunction extractKnownSkillsFromText(\n text: string | undefined,\n aliases: SkillAliases\n): string[] {\n if (!text) return [];\n const canonicalSet = new Set(\n Object.keys(aliases).map((c) => c.toLowerCase())\n );\n const found: string[] = [];\n for (const token of tokenize(text)) {\n const canonical = normalizeSkill(token, aliases);\n if (canonicalSet.has(canonical)) {\n found.push(canonical);\n }\n }\n return unique(found);\n}\n\nfunction parseSkills(\n sections: Partial<Record<ResumeSection, string>>,\n aliases: ResolvedATSConfig[\"skillAliases\"]\n): string[] {\n const explicit = normalizeSkills(\n parseExplicitSkillList(sections.skills),\n aliases\n );\n const fromExperience = extractKnownSkillsFromText(\n sections.experience,\n aliases\n );\n const fromSummary = extractKnownSkillsFromText(sections.summary, aliases);\n return normalizeSkills(\n unique([...explicit, ...fromExperience, ...fromSummary]),\n aliases\n );\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(\n sectionContent: string | undefined,\n referenceDate: Date | undefined,\n aliases: SkillAliases\n): {\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 const titleMatch = line.match(TITLE_RE);\n const title = titleMatch ? titleMatch[0].trim() : undefined;\n\n if (range) {\n if (title) {\n // Title and dates on the same line — the common \"Senior Engineer, Company (2020–Present)\"\n // layout. Without this, the date branch consumed the whole line and the title (and thus\n // the experience role-match component) was silently dropped. We capture the title only —\n // not an achievement, matching the pre-existing behavior that dated lines aren't bullets.\n jobTitles.push(title.toLowerCase());\n entries.push({ title, dates: range, description: line, skills: [] });\n } else {\n const previous = entries[entries.length - 1];\n if (previous && !previous.dates) {\n previous.dates = range;\n } else {\n entries.push({ dates: range, skills: [] });\n }\n }\n if (range.durationInMonths) {\n rangesInMonths.push(range.durationInMonths);\n }\n continue;\n }\n\n if (title) {\n jobTitles.push(title.toLowerCase());\n const entry: ParsedExperienceEntry = {\n title,\n description: line,\n skills: [],\n };\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]\n .filter(Boolean)\n .join(\" \")\n .trim();\n }\n achievements.push(classifyAchievement(line));\n }\n\n // Per-role skill dating: resolved once the full description (title line + trailing\n // bullets folded in above) is assembled, using the same alias/fuzzy resolution as the\n // whole-document extraction so a skill mentioned only in a role's bullets still counts.\n for (const entry of entries) {\n entry.skills = extractKnownSkillsFromText(entry.description, aliases);\n }\n\n return {\n entries,\n rangesInMonths,\n jobTitles: unique(jobTitles),\n achievements,\n };\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\nconst EMAIL_RE = /[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}/i;\n// ponytail: lenient international-ish pattern — optional leading +country code, then 2-4\n// groups of 2-4 digits separated by space/dot/dash. Good enough to flag presence, not validate.\nconst PHONE_RE = /\\+?\\(?\\d{1,4}\\)?(?:[\\s.-]?\\d{2,4}){2,4}/;\n// LinkedIn profile URL (with or without protocol/www) or bare \"linkedin.com/in/<handle>\" mention.\nconst LINKEDIN_RE =\n /(?:https?:\\/\\/)?(?:[a-z]{2,3}\\.)?linkedin\\.com\\/(?:in|pub)\\/[a-z0-9\\-_%]+\\/?/i;\n// Best-effort \"City, ST\"/\"City, Country\" line — deliberately strict (whole-line match, title-case\n// segments, no digits) so it doesn't false-positive on \"Doe, Jane\" or bullet text.\nconst LOCATION_RE =\n /^[A-Z][A-Za-z.'-]+(?:\\s[A-Z][A-Za-z.'-]+)*,\\s*[A-Z][A-Za-z]{1,20}$/;\n\nfunction extractLocation(text: string): string | undefined {\n // Location is almost always near the top of the document, alongside the rest of the\n // contact block — scanning the whole resume risks matching an unrelated \"City, ST\" inside\n // an address in the experience section.\n const candidateLines = splitLines(text).slice(0, 8);\n for (const line of candidateLines) {\n if (EMAIL_RE.test(line) || /\\d/.test(line)) continue;\n if (LOCATION_RE.test(line)) {\n return line;\n }\n }\n return undefined;\n}\n\nfunction extractContact(text: string): ParsedResume[\"contact\"] {\n const email = text.match(EMAIL_RE)?.[0];\n const phone = text.match(PHONE_RE)?.[0]?.trim();\n const linkedin = text.match(LINKEDIN_RE)?.[0];\n const location = extractLocation(text);\n if (!email && !phone && !linkedin && !location) return undefined;\n return { email, phone, linkedin, location };\n}\n\nexport function parseResume(\n resumeText: string,\n config: ResolvedATSConfig\n): ParsedResume {\n const normalizedText = normalizeWhitespace(resumeText);\n const { sections, detected } = extractSections(resumeText);\n const skills = parseSkills(sections, config.skillAliases);\n const actionVerbs = parseActionVerbs(normalizedText);\n const experienceData = parseExperience(\n sections.experience,\n config.referenceDate,\n config.skillAliases\n );\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 const parsed = Number.parseInt(yearsMatch[1], 10);\n // ponytail: cap at 60 — realistic max career length; ignore garbage matches like \"97 years\".\n totalExperienceYears = parsed <= 60 ? parsed : 0;\n }\n }\n\n const requiredSections: ResumeSection[] = [\n \"summary\",\n \"experience\",\n \"skills\",\n \"education\",\n ];\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 const contact = extractContact(resumeText);\n if (!contact?.email) {\n warnings.push(\n \"No email address detected — most ATS require a parseable contact email\"\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 contact,\n seniority: inferSeniority(experienceData.jobTitles),\n employmentGaps: detectEmploymentGaps(experienceData.entries),\n formatting: detectFormatting(resumeText),\n warnings,\n };\n}\n","import { ResolvedATSConfig, RuleContext } from \"../../types/config\";\nimport {\n ParsedJobDescription,\n ParsedResume,\n ResumeSection,\n} from \"../../types/parser\";\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[] = [\n \"summary\",\n \"experience\",\n \"skills\",\n \"education\",\n ];\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 // Single source of truth: reuse the already-computed FormattingSignals instead of\n // re-running the raw-text table heuristic independently (parser owns detection).\n if (input.resume.formatting.hasTables) {\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 =\n input.overusedKeywords.length *\n this.config.keywordDensity.overusePenalty;\n totalPenalty += penalty;\n warnings.push(\n `Keyword stuffing detected for: ${input.overusedKeywords.join(\", \")} (penalty ${penalty})`\n );\n }\n\n if (input.resume.detectedSections.length < 3) {\n totalPenalty += 5;\n warnings.push(\"Few recognizable sections found (penalty 5)\");\n }\n\n if (!input.resume.contact?.email) {\n const penalty = this.config.sectionPenalties.missingContact;\n totalPenalty += penalty;\n warnings.push(`Missing contact email (penalty ${penalty})`);\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 { KeywordCategory, ResolvedATSConfig } from \"../../types/config\";\nimport {\n ParsedDateRange,\n ParsedJobDescription,\n ParsedResume,\n ResumeSection,\n} from \"../../types/parser\";\nimport {\n ATSAnalysisResult,\n ATSBreakdown,\n KeywordWeight,\n ParseabilityReport,\n SeniorityMatch,\n} from \"../../types/scoring\";\nimport { sumExperienceYears } from \"../../utils/dates\";\nimport { diffLanguages } from \"../../utils/languages\";\nimport {\n normalizeSkill,\n normalizeSkills,\n NormalizeSkillOptions,\n} from \"../../utils/skills\";\nimport { clamp, countFrequencies, tokenize, unique } from \"../../utils/text\";\nimport { Seniority, titleMatch } from \"../../utils/titles\";\nimport { extractDegreeLevels } from \"../parser/jd.parser\";\n\nimport type { FormattingSignals } from \"../../utils/text\";\n\nconst REQUIRED_SKILL_WEIGHT = 0.7;\nconst OPTIONAL_SKILL_WEIGHT = 0.3;\n\n// Experience sub-weights: years-worked stays the dominant signal; title-coverage keeps its\n// prior share; seniority match is new and deliberately small (max ~15% swing on this component,\n// which itself is ~20% of the overall score — see the plan's \"keep it proportionate\" note).\nconst EXPERIENCE_YEARS_WEIGHT = 0.65;\nconst EXPERIENCE_ROLE_WEIGHT = 0.2;\nconst EXPERIENCE_SENIORITY_WEIGHT = 0.15;\n\nconst ALL_CATEGORIES: KeywordCategory[] = [\n \"technical\",\n \"tool\",\n \"concept\",\n \"soft\",\n \"marketing\",\n \"domain\",\n];\n\n// Rank used to compare resume vs JD seniority. Mirrors utils/titles.ts's internal rank\n// (not exported there) — kept in sync manually since the Seniority union is small/stable.\nconst SENIORITY_RANK: Record<Seniority, number> = {\n junior: 0,\n mid: 1,\n senior: 2,\n lead: 3,\n principal: 4,\n};\n\n// Degree \"adjacency\" rank for softened education scoring (see scoreEducation). MBA shares\n// master's rank since it's a peer-level credential, not a subset/superset of it.\nconst DEGREE_RANK: Record<string, number> = {\n associate: 1,\n bachelor: 2,\n master: 3,\n mba: 3,\n phd: 4,\n};\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 matchOptions: NormalizeSkillOptions\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(\n [...job.requiredSkills, ...profileRequired],\n config.skillAliases,\n matchOptions\n )\n );\n const optional = new Set(\n normalizeSkills(\n [...job.preferredSkills, ...profileOptional],\n config.skillAliases,\n matchOptions\n )\n );\n const resumeSkills = new Set(\n normalizeSkills(resume.skills, config.skillAliases, matchOptions)\n );\n\n const matchedRequired = [...required].filter((skill) =>\n resumeSkills.has(skill)\n );\n const matchedOptional = [...optional].filter((skill) =>\n resumeSkills.has(skill)\n );\n\n const requiredCoverage =\n required.size === 0 ? 1 : matchedRequired.length / required.size;\n const optionalCoverage =\n optional.size === 0 ? 1 : matchedOptional.length / optional.size;\n\n const score = clamp(\n (requiredCoverage * REQUIRED_SKILL_WEIGHT +\n optionalCoverage * OPTIONAL_SKILL_WEIGHT) *\n 100,\n 0,\n 100\n );\n\n const matched = [...required]\n .filter((skill) => resumeSkills.has(skill))\n .sort();\n const missing = [...required]\n .filter((skill) => !resumeSkills.has(skill))\n .sort();\n return { score, matched, missing };\n}\n\n/**\n * Compare resume vs JD seniority. Never penalizes on missing signal (met=true when either\n * side is unknown) — only a confirmed resume-below-required mismatch counts as unmet.\n */\nfunction computeSeniorityMatch(\n resume: ParsedResume,\n job: ParsedJobDescription\n): SeniorityMatch {\n const resumeSeniority = resume.seniority;\n const required = job.seniority;\n const met =\n !resumeSeniority ||\n !required ||\n SENIORITY_RANK[resumeSeniority] >= SENIORITY_RANK[required];\n return { resume: resumeSeniority, required, met };\n}\n\nfunction scoreExperience(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): { score: number; missingYears: number; seniorityMatch: SeniorityMatch } {\n const seniorityMatch = computeSeniorityMatch(resume, job);\n const requiredYears =\n job.minExperienceYears ?? config.profile?.minExperience ?? 0;\n if (!requiredYears) {\n return { score: 100, missingYears: 0, seniorityMatch };\n }\n const yearCoverage = clamp(resume.totalExperienceYears / requiredYears, 0, 2);\n const yearsComponent = clamp(yearCoverage, 0, 1) * EXPERIENCE_YEARS_WEIGHT;\n\n // titleMatch() gives real coverage via stemmed/synonym matching (see utils/titles.ts); an\n // empty JD role-keyword list means the JD asserts no title requirement, so treat that as full\n // credit rather than titleMatch's own \"no keywords -> 0\" contract (which assumes keywords exist).\n const titleCoverage =\n job.roleKeywords.length === 0\n ? 1\n : titleMatch(resume.jobTitles, job.roleKeywords);\n const roleComponent = clamp(titleCoverage, 0, 1) * EXPERIENCE_ROLE_WEIGHT;\n\n // Modest, capped seniority contribution — at most EXPERIENCE_SENIORITY_WEIGHT (15%) of this\n // component, only applied when the JD actually specifies an experience requirement.\n const seniorityComponent =\n (seniorityMatch.met ? 1 : 0) * EXPERIENCE_SENIORITY_WEIGHT;\n\n const score = clamp(\n (yearsComponent + roleComponent + seniorityComponent) * 100,\n 0,\n 100\n );\n const missingYears = Math.max(requiredYears - resume.totalExperienceYears, 0);\n return {\n score,\n missingYears: Number(missingYears.toFixed(2)),\n seniorityMatch,\n };\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 matchOptions: NormalizeSkillOptions\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) =>\n normalizeSkill(k, config.skillAliases, matchOptions)\n )\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, matchOptions)\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) =>\n normalizeSkill(t, config.skillAliases, matchOptions)\n )\n );\n const weightOf = (keyword: string) =>\n keywordWeightOf(keyword, requiredSet, preferredSet, jdFrequencies);\n\n const matchedKeywords = [...jobKeywordSet].filter((keyword) =>\n resumeTokenSet.has(keyword)\n );\n const missingKeywords = [...jobKeywordSet].filter(\n (keyword) => !resumeTokenSet.has(keyword)\n );\n\n // Weighted coverage: a missing required/high-frequency keyword costs more than a body-only one.\n const totalWeight = [...jobKeywordSet].reduce(\n (sum, keyword) => sum + weightOf(keyword),\n 0\n );\n const matchedWeight = matchedKeywords.reduce(\n (sum, keyword) => sum + weightOf(keyword),\n 0\n );\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[\n config.categoryIndex.get(keyword) ?? \"technical\"\n ].matched.push(keyword);\n }\n for (const keyword of missingKeywords) {\n keywordsByCategory[\n config.categoryIndex.get(keyword) ?? \"technical\"\n ].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\n/**\n * Per-skill years of experience derived from per-role dating: for each canonical skill, merge\n * (overlap-aware, via sumExperienceYears) the date ranges of every experience entry whose\n * per-role `skills` list mentions it. Replaces the old approximation that assumed a matched\n * skill spanned the resume's entire parsed tenure. A skill the resume lists but that never\n * appears in any dated role's bullets gets 0 years here (no dating evidence), which is the\n * correct conservative answer, not a bug.\n */\nfunction computePerSkillExperience(\n resume: ParsedResume,\n config: ResolvedATSConfig,\n matchOptions: NormalizeSkillOptions\n): ATSAnalysisResult[\"perSkillExperience\"] {\n const bySkill = new Map<string, ParsedDateRange[]>();\n for (const entry of resume.experience) {\n if (!entry.dates || entry.skills.length === 0) continue;\n const skillsInRole = normalizeSkills(\n entry.skills,\n config.skillAliases,\n matchOptions\n );\n for (const skill of skillsInRole) {\n const list = bySkill.get(skill) ?? [];\n list.push(entry.dates);\n bySkill.set(skill, list);\n }\n }\n return [...bySkill.entries()]\n .map(([skill, dates]) => ({ skill, years: sumExperienceYears(dates) }))\n .sort((a, b) => a.skill.localeCompare(b.skill));\n}\n\n// Informational only — never feeds score/breakdown, same as diffLanguages() below. Now uses\n// computePerSkillExperience's per-role dating instead of assuming a matched skill spans the\n// resume's overall totalExperienceYears (the naive assumption this replaces).\nfunction computeSkillExperienceGaps(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig,\n matchOptions: NormalizeSkillOptions,\n perSkillExperience: ATSAnalysisResult[\"perSkillExperience\"]\n): ATSAnalysisResult[\"skillExperienceGaps\"] {\n if (job.skillExperienceRequirements.length === 0) return [];\n const resumeSkills = new Set(\n normalizeSkills(resume.skills, config.skillAliases, matchOptions)\n );\n const yearsBySkill = new Map(\n perSkillExperience.map((p) => [p.skill, p.years])\n );\n const gaps: ATSAnalysisResult[\"skillExperienceGaps\"] = [];\n for (const { skill, years } of job.skillExperienceRequirements) {\n if (!resumeSkills.has(skill)) continue;\n const resumeYears = yearsBySkill.get(skill) ?? 0;\n if (resumeYears < years) {\n gaps.push({ skill, requiredYears: years, resumeYears });\n }\n }\n return gaps.sort((a, b) => a.skill.localeCompare(b.skill));\n}\n\n/**\n * Softened education scoring: an exact degree-level match is full credit, but a resume degree\n * \"adjacent\" to what's required also earns partial credit instead of falling off a 0-cliff.\n * \"Adjacent\" here means by DEGREE_RANK: holding a higher-ranked degree than required (e.g.\n * Master's when Bachelor's is asked for) earns strong credit (0.85) since it clearly satisfies\n * the underlying requirement; a same-ranked peer credential that isn't a literal string match\n * (e.g. MBA vs \"Master's\") earns moderate credit (0.6); one rank below (e.g. Bachelor's when\n * Master's is required) earns light credit (0.35); two+ ranks below or no recognizable degree\n * at all earns 0. Multiple JD requirements are averaged.\n */\nfunction scoreEducation(\n resume: ParsedResume,\n job: ParsedJobDescription\n): number {\n if (job.educationRequirements.length === 0) {\n return 100;\n }\n const resumeDegreeLevels = extractDegreeLevels(\n resume.educationEntries.join(\" \")\n );\n if (resumeDegreeLevels.length === 0) {\n return 0;\n }\n const resumeMaxRank = Math.max(\n ...resumeDegreeLevels.map((d) => DEGREE_RANK[d] ?? 0)\n );\n\n const perRequirementCredit: number[] = job.educationRequirements.map(\n (requirement) => {\n if (resumeDegreeLevels.includes(requirement)) return 1;\n const requiredRank = DEGREE_RANK[requirement] ?? 0;\n const diff = resumeMaxRank - requiredRank;\n if (diff >= 1) return 0.85;\n if (diff === 0) return 0.6;\n if (diff === -1) return 0.35;\n return 0;\n }\n );\n\n const avgCredit =\n perRequirementCredit.reduce((sum, credit) => sum + credit, 0) /\n perRequirementCredit.length;\n return clamp(avgCredit * 100, 0, 100);\n}\n\n/**\n * Real-ATS parseability score (0-100): starts at 100 and deducts for each formatting/contact/\n * structural signal that would actually trip up an ATS parser (tables/columns misaligning\n * fields, special/control chars corrupting extraction, non-standard bullets not being\n * recognized as list items, scanned/image-only text, unparseable contact info, and too few\n * recognizable sections suggesting the document didn't extract cleanly at all). This is the\n * \"real ATS reject reason\" dimension the plan calls out — formatting problems are the single\n * biggest cause of real-world ATS rejections, more than any single missing keyword.\n */\nexport function scoreParseability(\n formatting: FormattingSignals,\n contact: ParsedResume[\"contact\"],\n detectedSections: ResumeSection[]\n): { score: number; report: ParseabilityReport } {\n let score = 100;\n const deductions: ParseabilityReport[\"deductions\"] = [];\n const deduct = (points: number, reason: string) => {\n score -= points;\n deductions.push({ reason, points });\n };\n\n // Tables/columns commonly misalign fields (dates ending up in the wrong \"cell\") when an ATS\n // parser flattens them back to plain text.\n if (formatting.hasTables) {\n deduct(\n 20,\n \"Table or columnar formatting detected — ATS parsers often misalign fields extracted from tables\"\n );\n }\n // Multi-column layouts frequently interleave text from different columns out of reading order.\n if (formatting.hasMultiColumn) {\n deduct(\n 20,\n \"Multi-column layout detected — text may extract out of reading order in real ATS systems\"\n );\n }\n // Icon fonts / control chars / replacement chars indicate a lossy extraction upstream.\n if (formatting.hasSpecialChars) {\n deduct(\n 10,\n \"Special or control characters detected — likely icon fonts or a lossy text extraction\"\n );\n }\n // Non-standard bullet glyphs (arrows, checkmarks, dingbats) aren't always recognized as list\n // markers by simpler ATS text parsers.\n if (formatting.nonStandardBullets) {\n deduct(\n 8,\n \"Non-standard bullet characters detected — some ATS parsers won't recognize them as list items\"\n );\n }\n // A scanned/image-based resume has little to no real extractable text at all — the most\n // severe parseability failure.\n if (formatting.likelyScanned) {\n deduct(\n 30,\n \"Resume text looks scanned or image-based with little extractable text\"\n );\n }\n // No parseable email means the ATS/recruiter has no reliable way to reach the candidate.\n if (!contact?.email || !formatting.contactParseable) {\n deduct(15, \"No parseable contact email detected\");\n }\n // Very few recognizable sections suggests the document didn't extract cleanly in the first\n // place (headers not being recognized, or genuinely missing structure).\n if (detectedSections.length < 3) {\n deduct(10, \"Fewer than 3 standard resume sections were detected\");\n }\n\n return {\n score: clamp(score, 0, 100),\n report: {\n ...formatting,\n detectedSectionCount: detectedSections.length,\n deductions,\n },\n };\n}\n\nexport function calculateScore(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): ScoreComputation {\n const matchOptions: NormalizeSkillOptions = {\n fuzzy: config.matching.fuzzy,\n maxDistance: config.matching.threshold,\n };\n\n const skillsResult = scoreSkills(resume, job, config, matchOptions);\n const experienceResult = scoreExperience(resume, job, config);\n const keywordResult = scoreKeywords(resume, job, config, matchOptions);\n const educationScore = scoreEducation(resume, job);\n const parseabilityResult = scoreParseability(\n resume.formatting,\n resume.contact,\n resume.detectedSections\n );\n\n const breakdown: ATSBreakdown = {\n skills: skillsResult.score,\n experience: experienceResult.score,\n keywords: keywordResult.score,\n parseability: parseabilityResult.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.parseability * config.weights.parseability +\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 } =\n diffLanguages(resume.languages, job.requiredLanguages);\n\n const perSkillExperience = computePerSkillExperience(\n resume,\n config,\n matchOptions\n );\n const skillExperienceGaps = computeSkillExperienceGaps(\n resume,\n job,\n config,\n matchOptions,\n perSkillExperience\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 skillExperienceGaps,\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 parseabilityReport: parseabilityResult.report,\n employmentGaps: resume.employmentGaps,\n seniorityMatch: experienceResult.seniorityMatch,\n perSkillExperience,\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 {\n canonical: \"javascript\",\n aliases: [\"js\", \"ecmascript\", \"es6\"],\n category: \"technical\",\n },\n { canonical: \"node\", aliases: [\"node.js\", \"nodejs\"], category: \"technical\" },\n { canonical: \"typescript\", aliases: [\"ts\"], category: \"technical\" },\n {\n canonical: \"react\",\n aliases: [\"reactjs\", \"react.js\"],\n category: \"technical\",\n },\n {\n canonical: \"angular\",\n aliases: [\"angularjs\", \"angular2+\"],\n category: \"technical\",\n },\n { canonical: \"vue\", aliases: [\"vue.js\", \"vuejs\"], category: \"technical\" },\n { canonical: \"svelte\", aliases: [\"sveltekit\"], category: \"technical\" },\n { canonical: \"next.js\", aliases: [\"nextjs\"], category: \"technical\" },\n { canonical: \"nuxt.js\", aliases: [\"nuxtjs\", \"nuxt\"], category: \"technical\" },\n { canonical: \"remix\", aliases: [], 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 {\n canonical: \"ruby\",\n aliases: [\"ruby on rails\", \"rails\"],\n category: \"technical\",\n },\n { canonical: \"php\", aliases: [], category: \"technical\" },\n { canonical: \"swift\", aliases: [\"swiftui\"], category: \"technical\" },\n { canonical: \"kotlin\", aliases: [], category: \"technical\" },\n { canonical: \"scala\", aliases: [], category: \"technical\" },\n { canonical: \"perl\", aliases: [], category: \"technical\" },\n {\n canonical: \"r\",\n aliases: [\"r language\", \"r programming\"],\n category: \"technical\",\n },\n { canonical: \"matlab\", aliases: [], category: \"technical\" },\n {\n canonical: \"objective-c\",\n aliases: [\"objective c\", \"objc\"],\n category: \"technical\",\n },\n { canonical: \"dart\", aliases: [], category: \"technical\" },\n { canonical: \"elixir\", aliases: [], category: \"technical\" },\n { canonical: \"haskell\", aliases: [], category: \"technical\" },\n { canonical: \"html\", aliases: [\"html5\"], category: \"technical\" },\n { canonical: \"css\", aliases: [\"css3\"], category: \"technical\" },\n { canonical: \"sass\", aliases: [\"scss\"], category: \"technical\" },\n { canonical: \"less\", aliases: [], category: \"technical\" },\n {\n canonical: \"tailwind css\",\n aliases: [\"tailwind\", \"tailwindcss\"],\n category: \"technical\",\n },\n { canonical: \"bootstrap\", aliases: [], category: \"technical\" },\n { canonical: \"webassembly\", aliases: [\"wasm\"], category: \"technical\" },\n { canonical: \"ios development\", aliases: [\"ios\"], category: \"technical\" },\n {\n canonical: \"android development\",\n aliases: [\"android\"],\n category: \"technical\",\n },\n { canonical: \"react native\", aliases: [], category: \"technical\" },\n { canonical: \"flutter\", aliases: [], category: \"technical\" },\n { canonical: \"xamarin\", aliases: [], category: \"technical\" },\n { canonical: \"machine learning\", aliases: [\"ml\"], category: \"technical\" },\n { canonical: \"deep learning\", aliases: [\"dl\"], category: \"technical\" },\n {\n canonical: \"natural language processing\",\n aliases: [\"nlp\"],\n category: \"technical\",\n },\n { canonical: \"computer vision\", aliases: [\"cv\"], category: \"technical\" },\n {\n canonical: \"large language models\",\n aliases: [\"llm\", \"llms\"],\n category: \"technical\",\n },\n {\n canonical: \"generative ai\",\n aliases: [\"genai\", \"gen ai\"],\n category: \"technical\",\n },\n {\n canonical: \"reinforcement learning\",\n aliases: [\"rl\"],\n category: \"technical\",\n },\n {\n canonical: \"neural networks\",\n aliases: [\"neural network\"],\n category: \"technical\",\n },\n { canonical: \"data engineering\", aliases: [], category: \"technical\" },\n {\n canonical: \"data warehousing\",\n aliases: [\"data warehouse\"],\n category: \"technical\",\n },\n {\n canonical: \"etl\",\n aliases: [\"extract transform load\", \"elt\"],\n category: \"technical\",\n },\n { canonical: \"distributed systems\", aliases: [], category: \"technical\" },\n { canonical: \"embedded systems\", aliases: [], category: \"technical\" },\n {\n canonical: \"firmware development\",\n aliases: [\"firmware\"],\n category: \"technical\",\n },\n { canonical: \"game development\", aliases: [], category: \"technical\" },\n { canonical: \"unity\", aliases: [], category: \"technical\" },\n { canonical: \"unreal engine\", aliases: [\"unreal\"], category: \"technical\" },\n { canonical: \"web development\", aliases: [], category: \"technical\" },\n {\n canonical: \"full stack development\",\n aliases: [\"full-stack development\", \"full stack\"],\n category: \"technical\",\n },\n { canonical: \"api development\", aliases: [], category: \"technical\" },\n { canonical: \"grpc\", aliases: [], category: \"technical\" },\n { canonical: \"websockets\", aliases: [\"websocket\"], category: \"technical\" },\n { canonical: \"linux\", aliases: [], category: \"technical\" },\n { canonical: \"unix\", aliases: [], category: \"technical\" },\n {\n canonical: \"bash scripting\",\n aliases: [\"bash\", \"shell scripting\"],\n category: \"technical\",\n },\n { canonical: \"powershell\", aliases: [], category: \"technical\" },\n // tools / platforms / infra\n {\n canonical: \"sql\",\n aliases: [\"structured query language\"],\n category: \"tool\",\n },\n { canonical: \"postgresql\", aliases: [\"postgres\", \"psql\"], category: \"tool\" },\n { canonical: \"mysql\", aliases: [], category: \"tool\" },\n { canonical: \"sqlite\", aliases: [], category: \"tool\" },\n {\n canonical: \"microsoft sql server\",\n aliases: [\"mssql\", \"sql server\", \"t-sql\"],\n category: \"tool\",\n },\n {\n canonical: \"oracle database\",\n aliases: [\"oracle db\", \"oracle\"],\n category: \"tool\",\n },\n { canonical: \"mongodb\", aliases: [\"mongo\"], category: \"tool\" },\n { canonical: \"cassandra\", aliases: [\"apache cassandra\"], category: \"tool\" },\n { canonical: \"dynamodb\", aliases: [\"amazon dynamodb\"], category: \"tool\" },\n { canonical: \"couchbase\", aliases: [], category: \"tool\" },\n { canonical: \"neo4j\", aliases: [], category: \"tool\" },\n { canonical: \"firebase\", aliases: [], category: \"tool\" },\n { canonical: \"supabase\", aliases: [], category: \"tool\" },\n { canonical: \"graphql\", aliases: [\"gql\"], category: \"tool\" },\n { canonical: \"aws\", aliases: [\"amazon web services\"], category: \"tool\" },\n { canonical: \"amazon ec2\", aliases: [\"ec2\"], category: \"tool\" },\n { canonical: \"amazon s3\", aliases: [\"s3\"], category: \"tool\" },\n { canonical: \"amazon rds\", aliases: [\"rds\"], category: \"tool\" },\n { canonical: \"aws lambda\", aliases: [\"lambda\"], category: \"tool\" },\n { canonical: \"amazon cloudfront\", aliases: [\"cloudfront\"], category: \"tool\" },\n { canonical: \"amazon sqs\", aliases: [\"sqs\"], category: \"tool\" },\n { canonical: \"amazon sns\", aliases: [\"sns\"], category: \"tool\" },\n { canonical: \"azure\", aliases: [\"microsoft azure\"], category: \"tool\" },\n { canonical: \"azure devops\", aliases: [], category: \"tool\" },\n { canonical: \"azure functions\", aliases: [], category: \"tool\" },\n {\n canonical: \"google cloud platform\",\n aliases: [\"gcp\", \"google cloud\"],\n category: \"tool\",\n },\n { canonical: \"google bigquery\", aliases: [\"bigquery\"], category: \"tool\" },\n { canonical: \"google kubernetes engine\", aliases: [\"gke\"], category: \"tool\" },\n {\n canonical: \"docker\",\n aliases: [\"containers\", \"containerization\"],\n category: \"tool\",\n },\n { canonical: \"kubernetes\", aliases: [\"k8s\"], category: \"tool\" },\n { canonical: \"helm\", aliases: [], category: \"tool\" },\n { canonical: \"terraform\", aliases: [], category: \"tool\" },\n { canonical: \"pulumi\", aliases: [], category: \"tool\" },\n { canonical: \"ansible\", aliases: [], category: \"tool\" },\n { canonical: \"puppet\", aliases: [], category: \"tool\" },\n { canonical: \"chef\", aliases: [], category: \"tool\" },\n { canonical: \"jenkins\", aliases: [], category: \"tool\" },\n { canonical: \"circleci\", aliases: [\"circle ci\"], category: \"tool\" },\n { canonical: \"github actions\", aliases: [], category: \"tool\" },\n { canonical: \"gitlab ci\", aliases: [\"gitlab ci/cd\"], category: \"tool\" },\n { canonical: \"travis ci\", aliases: [], category: \"tool\" },\n {\n canonical: \"git\",\n aliases: [\"github\", \"gitlab\", \"bitbucket\"],\n category: \"tool\",\n },\n { canonical: \"jira\", aliases: [], category: \"tool\" },\n { canonical: \"confluence\", aliases: [], category: \"tool\" },\n { canonical: \"trello\", aliases: [], category: \"tool\" },\n { canonical: \"asana\", aliases: [], category: \"tool\" },\n { canonical: \"monday.com\", aliases: [\"monday\"], category: \"tool\" },\n { canonical: \"notion\", aliases: [], category: \"tool\" },\n { canonical: \"linear\", aliases: [], category: \"tool\" },\n { canonical: \"slack\", aliases: [], category: \"tool\" },\n { canonical: \"microsoft teams\", aliases: [\"ms teams\"], category: \"tool\" },\n { canonical: \"pytorch\", aliases: [\"torch\"], category: \"tool\" },\n { canonical: \"tensorflow\", aliases: [\"tf\"], category: \"tool\" },\n { canonical: \"keras\", aliases: [], category: \"tool\" },\n { canonical: \"scikit-learn\", aliases: [\"sklearn\"], category: \"tool\" },\n { canonical: \"pandas\", aliases: [], category: \"tool\" },\n { canonical: \"numpy\", aliases: [], category: \"tool\" },\n {\n canonical: \"hugging face\",\n aliases: [\"huggingface\", \"transformers\"],\n category: \"tool\",\n },\n { canonical: \"langchain\", aliases: [], category: \"tool\" },\n { canonical: \"openai api\", aliases: [\"openai\", \"gpt api\"], category: \"tool\" },\n { canonical: \"jupyter\", aliases: [\"jupyter notebook\"], category: \"tool\" },\n { canonical: \"fastapi\", aliases: [], category: \"tool\" },\n { canonical: \"flask\", aliases: [], category: \"tool\" },\n { canonical: \"django\", aliases: [], category: \"tool\" },\n {\n canonical: \"express.js\",\n aliases: [\"express\", \"expressjs\"],\n category: \"tool\",\n },\n { canonical: \"spring boot\", aliases: [\"spring\"], category: \"tool\" },\n { canonical: \"laravel\", aliases: [], category: \"tool\" },\n { canonical: \"kafka\", aliases: [\"apache kafka\"], category: \"tool\" },\n { canonical: \"rabbitmq\", aliases: [], category: \"tool\" },\n { canonical: \"redis\", aliases: [], category: \"tool\" },\n { canonical: \"memcached\", aliases: [], category: \"tool\" },\n { canonical: \"elasticsearch\", aliases: [\"elastic\"], category: \"tool\" },\n { canonical: \"logstash\", aliases: [], category: \"tool\" },\n { canonical: \"kibana\", aliases: [], category: \"tool\" },\n { canonical: \"grafana\", aliases: [], category: \"tool\" },\n { canonical: \"prometheus\", aliases: [], category: \"tool\" },\n { canonical: \"datadog\", aliases: [], category: \"tool\" },\n { canonical: \"new relic\", aliases: [], category: \"tool\" },\n { canonical: \"splunk\", aliases: [], category: \"tool\" },\n {\n canonical: \"spark\",\n aliases: [\"apache spark\", \"pyspark\"],\n category: \"tool\",\n },\n { canonical: \"hadoop\", aliases: [\"apache hadoop\"], category: \"tool\" },\n { canonical: \"airflow\", aliases: [\"apache airflow\"], category: \"tool\" },\n { canonical: \"dbt\", aliases: [\"data build tool\"], category: \"tool\" },\n { canonical: \"snowflake\", aliases: [], category: \"tool\" },\n { canonical: \"databricks\", aliases: [], category: \"tool\" },\n { canonical: \"looker\", aliases: [], category: \"tool\" },\n { canonical: \"tableau\", aliases: [], category: \"tool\" },\n { canonical: \"power bi\", aliases: [\"powerbi\"], category: \"tool\" },\n {\n canonical: \"excel\",\n aliases: [\"microsoft excel\", \"ms excel\"],\n category: \"tool\",\n },\n { canonical: \"google sheets\", aliases: [], category: \"tool\" },\n { canonical: \"spss\", aliases: [], category: \"tool\" },\n { canonical: \"sas\", aliases: [], category: \"tool\" },\n { canonical: \"salesforce\", aliases: [], category: \"tool\" },\n { canonical: \"hubspot\", aliases: [], category: \"tool\" },\n { canonical: \"marketo\", aliases: [], category: \"tool\" },\n { canonical: \"mailchimp\", aliases: [], category: \"tool\" },\n { canonical: \"google analytics\", aliases: [\"ga4\"], category: \"tool\" },\n { canonical: \"google tag manager\", aliases: [\"gtm\"], category: \"tool\" },\n { canonical: \"sap\", aliases: [], category: \"tool\" },\n { canonical: \"quickbooks\", aliases: [], category: \"tool\" },\n { canonical: \"netsuite\", aliases: [], category: \"tool\" },\n { canonical: \"workday\", aliases: [], category: \"tool\" },\n { canonical: \"zendesk\", aliases: [], category: \"tool\" },\n { canonical: \"servicenow\", aliases: [], category: \"tool\" },\n { canonical: \"freshdesk\", aliases: [], category: \"tool\" },\n { canonical: \"figma\", aliases: [], category: \"tool\" },\n { canonical: \"sketch\", aliases: [], category: \"tool\" },\n { canonical: \"adobe xd\", aliases: [\"xd\"], category: \"tool\" },\n { canonical: \"invision\", aliases: [], category: \"tool\" },\n { canonical: \"photoshop\", aliases: [\"adobe photoshop\"], category: \"tool\" },\n {\n canonical: \"illustrator\",\n aliases: [\"adobe illustrator\"],\n category: \"tool\",\n },\n {\n canonical: \"after effects\",\n aliases: [\"adobe after effects\"],\n category: \"tool\",\n },\n { canonical: \"premiere pro\", aliases: [\"adobe premiere\"], category: \"tool\" },\n { canonical: \"autocad\", aliases: [], category: \"tool\" },\n { canonical: \"solidworks\", aliases: [], category: \"tool\" },\n { canonical: \"postman\", aliases: [], category: \"tool\" },\n { canonical: \"selenium\", aliases: [], category: \"tool\" },\n { canonical: \"cypress\", aliases: [], category: \"tool\" },\n { canonical: \"playwright\", aliases: [], category: \"tool\" },\n { canonical: \"jest\", aliases: [], category: \"tool\" },\n { canonical: \"mocha\", aliases: [], category: \"tool\" },\n { canonical: \"junit\", 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 {\n canonical: \"security\",\n aliases: [\"cybersecurity\", \"infosec\"],\n category: \"concept\",\n },\n {\n canonical: \"application security\",\n aliases: [\"appsec\"],\n category: \"concept\",\n },\n {\n canonical: \"penetration testing\",\n aliases: [\"pentesting\", \"pen testing\"],\n category: \"concept\",\n },\n { canonical: \"vulnerability assessment\", aliases: [], category: \"concept\" },\n {\n canonical: \"identity and access management\",\n aliases: [\"iam\"],\n category: \"concept\",\n },\n { canonical: \"zero trust\", aliases: [], category: \"concept\" },\n { canonical: \"encryption\", aliases: [], category: \"concept\" },\n {\n canonical: \"testing\",\n aliases: [\"unittest\", \"pytest\"],\n category: \"concept\",\n },\n { canonical: \"unit testing\", aliases: [], category: \"concept\" },\n { canonical: \"integration testing\", aliases: [], category: \"concept\" },\n {\n canonical: \"end-to-end testing\",\n aliases: [\"e2e testing\"],\n category: \"concept\",\n },\n { canonical: \"regression testing\", aliases: [], category: \"concept\" },\n { canonical: \"microservices\", aliases: [], category: \"concept\" },\n {\n canonical: \"monolithic architecture\",\n aliases: [\"monolith\"],\n category: \"concept\",\n },\n {\n canonical: \"event-driven architecture\",\n aliases: [\"event driven architecture\"],\n category: \"concept\",\n },\n {\n canonical: \"serverless\",\n aliases: [\"serverless architecture\"],\n category: \"concept\",\n },\n { canonical: \"agile\", aliases: [], category: \"concept\" },\n { canonical: \"scrum\", aliases: [], category: \"concept\" },\n { canonical: \"kanban\", aliases: [], category: \"concept\" },\n { canonical: \"waterfall\", aliases: [], category: \"concept\" },\n { canonical: \"sprint planning\", aliases: [], category: \"concept\" },\n { canonical: \"blockchain\", aliases: [], category: \"concept\" },\n { canonical: \"smart contracts\", aliases: [], category: \"concept\" },\n { canonical: \"devops\", aliases: [], category: \"concept\" },\n {\n canonical: \"site reliability engineering\",\n aliases: [\"sre\"],\n category: \"concept\",\n },\n {\n canonical: \"infrastructure as code\",\n aliases: [\"iac\"],\n category: \"concept\",\n },\n {\n canonical: \"ci/cd\",\n aliases: [\n \"continuous integration\",\n \"continuous deployment\",\n \"continuous delivery\",\n ],\n category: \"concept\",\n },\n {\n canonical: \"rest api\",\n aliases: [\"restful api\", \"rest apis\"],\n category: \"concept\",\n },\n { canonical: \"api design\", aliases: [], category: \"concept\" },\n { canonical: \"design patterns\", aliases: [], category: \"concept\" },\n { canonical: \"data structures\", aliases: [], category: \"concept\" },\n { canonical: \"algorithms\", aliases: [], category: \"concept\" },\n {\n canonical: \"object-oriented programming\",\n aliases: [\"oop\", \"object oriented programming\"],\n category: \"concept\",\n },\n { canonical: \"functional programming\", aliases: [], category: \"concept\" },\n { canonical: \"cloud computing\", aliases: [], category: \"concept\" },\n { canonical: \"cloud migration\", aliases: [], category: \"concept\" },\n { canonical: \"system design\", aliases: [], category: \"concept\" },\n { canonical: \"high availability\", aliases: [], category: \"concept\" },\n { canonical: \"scalability\", aliases: [], category: \"concept\" },\n { canonical: \"load balancing\", aliases: [], category: \"concept\" },\n { canonical: \"caching\", aliases: [], category: \"concept\" },\n {\n canonical: \"tdd\",\n aliases: [\"test driven development\", \"test-driven development\"],\n category: \"concept\",\n },\n {\n canonical: \"bdd\",\n aliases: [\"behavior driven development\", \"behavior-driven development\"],\n category: \"concept\",\n },\n { canonical: \"code review\", aliases: [\"code reviews\"], category: \"concept\" },\n { canonical: \"pair programming\", aliases: [], category: \"concept\" },\n { canonical: \"ux design\", aliases: [\"user experience\"], category: \"concept\" },\n {\n canonical: \"ui design\",\n aliases: [\"user interface design\"],\n category: \"concept\",\n },\n { canonical: \"user research\", aliases: [], category: \"concept\" },\n { canonical: \"wireframing\", aliases: [], category: \"concept\" },\n { canonical: \"prototyping\", aliases: [], category: \"concept\" },\n { canonical: \"design systems\", aliases: [], category: \"concept\" },\n { canonical: \"responsive design\", aliases: [], category: \"concept\" },\n { canonical: \"project management\", aliases: [], category: \"concept\" },\n { canonical: \"program 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 { canonical: \"data privacy\", aliases: [], category: \"concept\" },\n { canonical: \"version control\", aliases: [], category: \"concept\" },\n {\n canonical: \"documentation\",\n aliases: [\"technical documentation\"],\n category: \"concept\",\n },\n { canonical: \"requirements gathering\", aliases: [], category: \"concept\" },\n {\n canonical: \"business process improvement\",\n aliases: [],\n category: \"concept\",\n },\n { canonical: \"root cause analysis\", aliases: [], category: \"concept\" },\n { canonical: \"lean\", aliases: [\"lean methodology\"], category: \"concept\" },\n { canonical: \"six sigma\", aliases: [], category: \"concept\" },\n // product / data domain\n { canonical: \"roadmap\", aliases: [\"product roadmap\"], 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 { canonical: \"data governance\", aliases: [], category: \"domain\" },\n { canonical: \"product management\", aliases: [], category: \"domain\" },\n { canonical: \"product strategy\", aliases: [], category: \"domain\" },\n {\n canonical: \"go-to-market strategy\",\n aliases: [\"go to market\", \"gtm strategy\"],\n category: \"domain\",\n },\n {\n canonical: \"user story writing\",\n aliases: [\"user stories\"],\n category: \"domain\",\n },\n { canonical: \"competitive analysis\", aliases: [], category: \"domain\" },\n {\n canonical: \"okrs\",\n aliases: [\"objectives and key results\"],\n category: \"domain\",\n },\n {\n canonical: \"kpis\",\n aliases: [\"key performance indicators\"],\n category: \"domain\",\n },\n // finance / accounting domain\n { canonical: \"financial analysis\", aliases: [], category: \"domain\" },\n { canonical: \"financial modeling\", 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 { canonical: \"ifrs\", aliases: [], category: \"domain\" },\n {\n canonical: \"reconciliation\",\n aliases: [\"account reconciliation\"],\n category: \"domain\",\n },\n { canonical: \"general ledger\", aliases: [], category: \"domain\" },\n { canonical: \"cost accounting\", aliases: [], category: \"domain\" },\n {\n canonical: \"mergers and acquisitions\",\n aliases: [\"m&a\"],\n category: \"domain\",\n },\n { canonical: \"investment banking\", aliases: [], category: \"domain\" },\n { canonical: \"portfolio management\", aliases: [], category: \"domain\" },\n { canonical: \"equity research\", aliases: [], category: \"domain\" },\n {\n canonical: \"treasury management\",\n aliases: [\"treasury\"],\n category: \"domain\",\n },\n { canonical: \"fintech\", aliases: [], category: \"domain\" },\n {\n canonical: \"payments processing\",\n aliases: [\"payment processing\"],\n category: \"domain\",\n },\n // sales / account management domain\n { canonical: \"lead generation\", aliases: [], category: \"domain\" },\n { canonical: \"account management\", aliases: [], category: \"domain\" },\n {\n canonical: \"crm\",\n aliases: [\"customer relationship management\"],\n category: \"domain\",\n },\n {\n canonical: \"sales pipeline\",\n aliases: [\"pipeline management\"],\n category: \"domain\",\n },\n { canonical: \"cold calling\", aliases: [], category: \"domain\" },\n { canonical: \"upselling\", aliases: [\"cross-selling\"], category: \"domain\" },\n { canonical: \"customer retention\", aliases: [], category: \"domain\" },\n {\n canonical: \"business development\",\n aliases: [\"bizdev\"],\n category: \"domain\",\n },\n { canonical: \"quota attainment\", aliases: [], category: \"domain\" },\n { canonical: \"b2b sales\", aliases: [], category: \"domain\" },\n { canonical: \"b2c sales\", aliases: [], category: \"domain\" },\n { canonical: \"saas\", aliases: [\"software as a service\"], category: \"domain\" },\n { canonical: \"e-commerce\", aliases: [\"ecommerce\"], category: \"domain\" },\n // human resources domain\n {\n canonical: \"recruiting\",\n aliases: [\"talent acquisition\"],\n category: \"domain\",\n },\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 {\n canonical: \"compensation and benefits\",\n aliases: [\"comp and benefits\"],\n category: \"domain\",\n },\n {\n canonical: \"diversity and inclusion\",\n aliases: [\"dei\"],\n category: \"domain\",\n },\n { canonical: \"employee engagement\", aliases: [], category: \"domain\" },\n {\n canonical: \"hris\",\n aliases: [\"human resources information system\"],\n category: \"domain\",\n },\n // healthcare domain\n { canonical: \"patient care\", aliases: [], category: \"domain\" },\n { canonical: \"clinical documentation\", aliases: [], category: \"domain\" },\n { canonical: \"hipaa\", aliases: [], category: \"domain\" },\n {\n canonical: \"electronic health records\",\n aliases: [\"ehr\", \"emr\"],\n category: \"domain\",\n },\n { canonical: \"medical billing\", aliases: [], category: \"domain\" },\n {\n canonical: \"medical coding\",\n aliases: [\"icd-10\", \"cpt coding\"],\n category: \"domain\",\n },\n { canonical: \"telehealth\", aliases: [], category: \"domain\" },\n { canonical: \"clinical trials\", aliases: [], category: \"domain\" },\n { canonical: \"regulatory affairs\", 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 {\n canonical: \"regulatory compliance\",\n aliases: [\"compliance\"],\n category: \"domain\",\n },\n { canonical: \"due diligence\", aliases: [], category: \"domain\" },\n {\n canonical: \"intellectual property\",\n aliases: [\"ip law\"],\n category: \"domain\",\n },\n {\n canonical: \"gdpr\",\n aliases: [\"general data protection regulation\"],\n category: \"domain\",\n },\n { canonical: \"soc 2\", aliases: [\"soc2\"], category: \"domain\" },\n { canonical: \"iso 27001\", aliases: [], category: \"domain\" },\n { canonical: \"pci dss\", aliases: [\"pci compliance\"], 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 { canonical: \"student assessment\", aliases: [], category: \"domain\" },\n { canonical: \"e-learning\", aliases: [\"elearning\"], category: \"domain\" },\n // operations / supply chain domain\n {\n canonical: \"supply chain management\",\n aliases: [\"supply chain\"],\n category: \"domain\",\n },\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 { canonical: \"warehouse management\", aliases: [], category: \"domain\" },\n { canonical: \"demand planning\", aliases: [], category: \"domain\" },\n { canonical: \"manufacturing\", aliases: [], category: \"domain\" },\n { canonical: \"quality control\", aliases: [], category: \"domain\" },\n { canonical: \"lean manufacturing\", aliases: [], category: \"domain\" },\n // customer service domain\n {\n canonical: \"customer support\",\n aliases: [\"customer service\"],\n category: \"domain\",\n },\n { canonical: \"technical support\", aliases: [], category: \"domain\" },\n { canonical: \"conflict resolution\", aliases: [], category: \"domain\" },\n { canonical: \"customer success\", aliases: [], category: \"domain\" },\n { canonical: \"help desk\", aliases: [\"helpdesk\"], category: \"domain\" },\n // soft skills\n { canonical: \"communication\", aliases: [], category: \"soft\" },\n { canonical: \"written communication\", aliases: [], category: \"soft\" },\n { canonical: \"verbal communication\", aliases: [], category: \"soft\" },\n { canonical: \"leadership\", aliases: [], category: \"soft\" },\n { canonical: \"team leadership\", aliases: [], category: \"soft\" },\n { canonical: \"teamwork\", aliases: [\"collaboration\"], category: \"soft\" },\n {\n canonical: \"cross-functional collaboration\",\n aliases: [\"cross functional collaboration\"],\n category: \"soft\",\n },\n {\n canonical: \"problem solving\",\n aliases: [\"problem-solving\"],\n category: \"soft\",\n },\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 {\n canonical: \"decision making\",\n aliases: [\"decision-making\"],\n category: \"soft\",\n },\n { canonical: \"emotional intelligence\", aliases: [], category: \"soft\" },\n { canonical: \"negotiation\", aliases: [], category: \"soft\" },\n {\n canonical: \"organization\",\n aliases: [\"organizational skills\"],\n category: \"soft\",\n },\n {\n canonical: \"public speaking\",\n aliases: [\"presentation skills\"],\n category: \"soft\",\n },\n { canonical: \"mentoring\", aliases: [\"coaching\"], category: \"soft\" },\n { canonical: \"interpersonal skills\", aliases: [], category: \"soft\" },\n { canonical: \"work ethic\", aliases: [], category: \"soft\" },\n { canonical: \"stakeholder communication\", aliases: [], category: \"soft\" },\n {\n canonical: \"self-motivation\",\n aliases: [\"self motivation\"],\n category: \"soft\",\n },\n { canonical: \"resilience\", aliases: [], category: \"soft\" },\n { canonical: \"empathy\", aliases: [], category: \"soft\" },\n { canonical: \"active listening\", aliases: [], category: \"soft\" },\n { canonical: \"delegation\", aliases: [], category: \"soft\" },\n { canonical: \"strategic thinking\", aliases: [], category: \"soft\" },\n { canonical: \"multitasking\", aliases: [], category: \"soft\" },\n // marketing\n {\n canonical: \"seo\",\n aliases: [\"search engine optimization\"],\n category: \"marketing\",\n },\n {\n canonical: \"sem\",\n aliases: [\"search engine marketing\"],\n category: \"marketing\",\n },\n { canonical: \"branding\", aliases: [\"brand strategy\"], category: \"marketing\" },\n { canonical: \"campaign management\", aliases: [], category: \"marketing\" },\n { canonical: \"content marketing\", aliases: [], category: \"marketing\" },\n { canonical: \"content strategy\", aliases: [], category: \"marketing\" },\n {\n canonical: \"social media marketing\",\n aliases: [\"social media\"],\n category: \"marketing\",\n },\n { canonical: \"email marketing\", aliases: [], category: \"marketing\" },\n { canonical: \"digital marketing\", aliases: [], category: \"marketing\" },\n {\n canonical: \"growth marketing\",\n aliases: [\"growth hacking\"],\n category: \"marketing\",\n },\n { canonical: \"copywriting\", aliases: [], category: \"marketing\" },\n { canonical: \"market research\", aliases: [], category: \"marketing\" },\n {\n canonical: \"ppc\",\n aliases: [\"pay-per-click\", \"google ads\"],\n category: \"marketing\",\n },\n {\n canonical: \"conversion rate optimization\",\n aliases: [\"cro\"],\n category: \"marketing\",\n },\n { canonical: \"public relations\", aliases: [\"pr\"], category: \"marketing\" },\n { canonical: \"marketing automation\", aliases: [], category: \"marketing\" },\n { canonical: \"affiliate marketing\", aliases: [], category: \"marketing\" },\n { canonical: \"influencer marketing\", aliases: [], category: \"marketing\" },\n { canonical: \"product marketing\", aliases: [], category: \"marketing\" },\n { canonical: \"event marketing\", aliases: [], category: \"marketing\" },\n { canonical: \"brand awareness\", aliases: [], category: \"marketing\" },\n { canonical: \"media planning\", aliases: [], category: \"marketing\" },\n { canonical: \"lead nurturing\", aliases: [], 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 defaultKeywordRegistry,\n softwareEngineerProfile,\n} from \"../../profiles\";\nimport {\n ATSConfig,\n ATSWeights,\n KeywordDensityConfig,\n NormalizedWeights,\n ResolvedATSConfig,\n SectionPenaltyConfig,\n} from \"../../types/config\";\nimport {\n buildCategoryIndex,\n deriveSkillAliases,\n mergeKeywordRegistries,\n} from \"../../utils/skills\";\n\n// v2 weights: parseability joins the aggregate as the \"real ATS reject reason\" dimension;\n// skills/experience/education give up some share to make room for it, keywords unchanged.\nconst DEFAULT_WEIGHTS: ATSWeights = {\n skills: 0.25,\n experience: 0.2,\n keywords: 0.25,\n parseability: 0.2,\n education: 0.1,\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 // Raised from 0 (warning-only) in v1 — a real ATS treats an unparseable contact email as a\n // near-knockout (no way to reach the candidate at all), so this now actually moves the score.\n missingContact: 12,\n};\n\nfunction normalizeWeights(weights: ATSWeights): NormalizedWeights {\n const total =\n weights.skills +\n weights.experience +\n weights.keywords +\n weights.parseability +\n weights.education;\n if (total === 0) {\n // Guard against misconfigured zero weights by falling back to equal distribution\n const equal = 1 / 5;\n return {\n skills: equal,\n experience: equal,\n keywords: equal,\n parseability: 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 parseability: weights.parseability / 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 parseability: config.weights?.parseability ?? DEFAULT_WEIGHTS.parseability,\n education: config.weights?.education ?? DEFAULT_WEIGHTS.education,\n };\n\n const keywordRegistry = mergeKeywordRegistries(\n defaultKeywordRegistry,\n config.keywordRegistry ?? []\n );\n\n const resolved: ResolvedATSConfig = {\n weights: normalizeWeights(weights),\n skillAliases: {\n ...deriveSkillAliases(keywordRegistry),\n ...(config.skillAliases ?? {}),\n },\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 // Fuzzy/stem matching is on by default in v2 (typos, word-form variants like \"developing\"\n // vs \"develop\", \"ReactJS\" vs \"react\") — callers who want v1's exact-match-only behavior can\n // override via config.matching = { fuzzy: false }.\n matching: {\n fuzzy: config.matching?.fuzzy ?? true,\n threshold: config.matching?.threshold,\n },\n referenceDate: config.referenceDate\n ? new Date(config.referenceDate)\n : 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(\n job.keywords.map((k) => normalizeSkill(k, config.skillAliases))\n );\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 (\n jdSurface &&\n jobKeywordSet.has(canonical) &&\n jdSurface.toLowerCase() !== token.toLowerCase()\n ) {\n replacements.push(\n `Replace \"${token}\" with \"${jdSurface}\" to match the job description's wording.`\n );\n }\n }\n return unique(replacements).slice(0, 5);\n}\n\nexport class SuggestionEngine {\n generate(\n input: SuggestionInput\n ): Pick<ATSAnalysisResult, \"suggestions\" | \"warnings\"> {\n const suggestions: string[] = [];\n const warnings: string[] = [\n ...input.ruleWarnings,\n ...input.resume.warnings,\n ];\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(\n ...buildAliasReplacementSuggestions(input.resume, input.job, input.config)\n );\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 // Threshold widened from \"exactly 0\" to \"meaningfully short\" now that scoreEducation gives\n // partial credit for adjacent degree levels (see scorer.ts) instead of a hard 0-cliff.\n if (\n input.job.educationRequirements.length > 0 &&\n input.score.educationScore < 60\n ) {\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(\n (a) => a.strength === \"weak\"\n );\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 if (!input.resume.contact?.email) {\n suggestions.push(\n \"Add a clearly formatted email address near the top of your resume so ATS and recruiters can contact you.\"\n );\n }\n\n for (const gap of input.score.skillExperienceGaps) {\n suggestions.push(\n `The role asks for ${gap.requiredYears}+ years of ${gap.skill}; make that duration explicit in your experience section.`\n );\n }\n\n // Low parseability: call out the specific formatting issue(s) an ATS parser would trip on,\n // rather than a generic \"formatting is bad\" message.\n if (input.score.breakdown.parseability < 80) {\n for (const deduction of input.score.parseabilityReport.deductions) {\n suggestions.push(`Improve resume parseability: ${deduction.reason}.`);\n }\n }\n\n // Employment gaps: only worth a suggestion once they're long enough to likely draw a\n // recruiter's attention (6+ months), so short/normal between-role gaps stay silent.\n const GAP_THRESHOLD_MONTHS = 6;\n for (const gap of input.score.employmentGaps) {\n if (gap.months >= GAP_THRESHOLD_MONTHS) {\n suggestions.push(\n `Address the ${gap.months}-month employment gap after \"${gap.afterRole}\" — a brief explanation (upskilling, caregiving, freelance work, etc.) reassures recruiters.`\n );\n }\n }\n\n if (!input.score.seniorityMatch.met) {\n suggestions.push(\n `This role expects ${input.score.seniorityMatch.required} seniority, but your resume reads as ${input.score.seniorityMatch.resume}; emphasize scope/ownership that reflects the level the role expects.`\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(\n 0,\n this.limits.maxTotalTokens - this.totalTokensUsed\n ),\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)\n 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 JSONSchema).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 JSONSchema).items as\n JSONSchema | undefined;\n if (items && items.type && Array.isArray(value)) {\n const itemType = items.type;\n for (const item of value as unknown[]) {\n if (itemType === \"string\" && typeof item !== \"string\")\n return false;\n if (itemType === \"number\" && typeof item !== \"number\")\n return false;\n if (\n itemType === \"object\" &&\n (typeof item !== \"object\" || item === null)\n )\n 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 { LLMBudgetManager } from \"./llm.budget\";\nimport { validateJsonSchema } from \"./validation\";\nimport { LLMClient, LLMConfig, LLMResult } from \"../types/llm\";\nimport { JSONSchema } from \"../types/llm\";\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(\n `Unhandled rejection during LLM call: ${String(reason)}`\n );\n };\n process.on(\"unhandledRejection\", onUnhandled);\n\n let clientPromise:\n | Promise<{ content: unknown; usage?: { total_tokens?: number } }>\n | undefined = undefined;\n\n try {\n // Check budget before attempting call\n const estimatedTokens = this.estimateTokens(\n systemPrompt,\n userPrompt,\n options.requestedTokens\n );\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(\n () => process.removeListener(\"unhandledRejection\", onUnhandled),\n 100\n );\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(\n () => process.removeListener(\"unhandledRejection\", onUnhandled),\n 100\n );\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 ||\n this.config.models?.default ||\n \"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(\n () => reject(new Error(`LLM call timeout after ${this.timeoutMs}ms`)),\n this.timeoutMs\n );\n // Clear timeout when client settles to avoid the timer firing after client finishes.\n // .finally() re-throws the original rejection into a new promise, so it needs its\n // own catch — clientPromise already having one doesn't cover this derived promise.\n void clientPromise!\n .finally(() => globalThis.clearTimeout(id))\n .catch(() => {});\n });\n // Prevent accidental unhandled rejections from the timeout promise\n void timeoutPromise.catch(() => {});\n\n const response = (await Promise.race([\n clientPromise,\n timeoutPromise,\n ])) 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([\n clientPromise!.catch(() => {}),\n new Promise((r) => setTimeout(r, graceMs)),\n ]);\n } catch {\n // intentionally ignore\n } finally {\n process.removeListener(\"unhandledRejection\", onUnhandled);\n }\n\n return {\n success: false,\n fallback: true,\n error: \"Empty response from LLM\",\n };\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([\n clientPromise!.catch(() => {}),\n new Promise((r) => setTimeout(r, graceMs)),\n ]);\n } catch {\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([\n clientPromise!.catch(() => {}),\n new Promise((r) => setTimeout(r, graceMs)),\n ]);\n } catch {\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([\n clientPromise!.catch(() => {}),\n new Promise((r) => setTimeout(r, graceMs)),\n ]);\n } catch {\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 * Estimate tokens for a call (rough approximation)\n * 1 token ≈ 4 characters average\n */\n private estimateTokens(\n systemPrompt: string,\n userPrompt: string,\n requestedTokens?: number\n ): 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 (\n schema &&\n schema.type === \"object\" &&\n !!(schema.properties || schema.required)\n );\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 {\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: [\n \"summary\",\n \"experience\",\n \"skills\",\n \"education\",\n \"projects\",\n \"certifications\",\n \"other\",\n ],\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: (\n headers: string[]\n ) => `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: (\n suggestions: string[]\n ) => `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: (\n jd: string\n ) => `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(\n data: unknown\n): { 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 [];\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 =\n 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: {\n header: string;\n classification: string;\n confidence?: number;\n }[] = [];\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 =\n 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: {\n original: string;\n enhanced: string;\n actionable?: boolean;\n }[] = [];\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 =\n typeof suggestion.actionable === \"boolean\"\n ? suggestion.actionable\n : 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(data: unknown): {\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)\n ? obj.implicitSkills.filter((s) => typeof s === \"string\")\n : [];\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 &&\n 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 &&\n Array.isArray((implicitExperience as Record<string, unknown>).domains)\n ? ((implicitExperience as Record<string, unknown>).domains as string[])\n : undefined;\n\n const clarityScore =\n 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(\n obj: unknown,\n key: string\n): 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(\n obj: unknown,\n key: string\n): 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 {\n LLMManager,\n LLMSchemas,\n LLMPrompts,\n adaptSuggestionEnhancementResponse,\n} from \"./llm\";\nimport {\n defaultKeywordRegistry,\n defaultProfiles,\n defaultSkillAliases,\n} from \"./profiles\";\nimport { ATSConfig } from \"./types/config\";\nimport { LLMConfig } from \"./types/llm\";\nimport { AnalyzeResumeInput, ATSAnalysisResult } from \"./types/scoring\";\nimport { clamp } from \"./utils/text\";\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(\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 skillExperienceGaps: scoring.skillExperienceGaps,\n experienceGap: scoring.experienceGap,\n detectedSections: parsedResume.detectedSections,\n parsedExperienceYears: parsedResume.totalExperienceYears,\n experienceEntries: parsedResume.experience,\n parseabilityReport: scoring.parseabilityReport,\n employmentGaps: scoring.employmentGaps,\n seniorityMatch: scoring.seniorityMatch,\n perSkillExperience: scoring.perSkillExperience,\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 // 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(\n input: AnalyzeResumeInput\n): 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 skillExperienceGaps: scoring.skillExperienceGaps,\n experienceGap: scoring.experienceGap,\n detectedSections: parsedResume.detectedSections,\n parsedExperienceYears: parsedResume.totalExperienceYears,\n experienceEntries: parsedResume.experience,\n parseabilityReport: scoring.parseabilityReport,\n employmentGaps: scoring.employmentGaps,\n seniorityMatch: scoring.seniorityMatch,\n perSkillExperience: scoring.perSkillExperience,\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<{\n success: boolean;\n enhancedSuggestions?: string[];\n warnings: string[];\n}> {\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 {\n success: false,\n warnings: [...warnings, ...llmManager.getWarnings()],\n };\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 {\n success: false,\n warnings: [...warnings, ...llmManager.getWarnings()],\n };\n }\n\n return {\n success: true,\n enhancedSuggestions,\n warnings: llmManager.getWarnings(),\n };\n } catch (e) {\n warnings.push(\n `Unexpected error in LLM enhancement: ${(e as Error).message}`\n );\n return { success: false, warnings };\n }\n}\n"]}