@pranavraut033/ats-checker 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/text.ts","../src/utils/skills.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/index.ts"],"names":[],"mappings":";AAAO,IAAM,UAAA,uBAAiB,GAAA,CAAI;AAAA,EAChC,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,oBAAoB,IAAA,EAAsB;AACxD,EAAA,OAAO,IAAA,CAAK,QAAQ,QAAA,EAAU,IAAI,EAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,IAAA,EAAK;AAChE;AAEO,SAAS,uBAAuB,IAAA,EAAsB;AAC3D,EAAA,OAAO,mBAAA,CAAoB,IAAI,CAAA,CAAE,WAAA,EAAY;AAC/C;AAEO,SAAS,WAAW,IAAA,EAAwB;AACjD,EAAA,OAAO,KACJ,OAAA,CAAQ,QAAA,EAAU,IAAI,CAAA,CACtB,MAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,IAAA,EAAM,CAAA,CACzB,OAAO,OAAO,CAAA;AACnB;AAEO,SAAS,SAAS,IAAA,EAAwB;AAC/C,EAAA,OAAO,sBAAA,CAAuB,IAAI,CAAA,CAC/B,KAAA,CAAM,cAAc,CAAA,CACpB,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA,CACzB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,GAAS,KAAK,CAAC,UAAA,CAAW,GAAA,CAAI,IAAI,CAAC,CAAA;AAC9D;AAEO,SAAS,OAAO,MAAA,EAA4B;AACjD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACpB,MAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AACd,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAqB;AACrE,EAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,KAAA,EAAO,GAAG,GAAG,GAAG,CAAA;AAC3C;AAEO,SAAS,iBAAiB,MAAA,EAA0C;AACzE,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAA,CAAO,KAAK,CAAA,GAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA,IAAK,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,2BAA2B,IAAA,EAAuB;AAChE,EAAA,MAAM,KAAA,GAAQ,WAAW,IAAI,CAAA;AAC7B,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,cAAA,GAAiB,KAAK,QAAA,CAAS,GAAG,KAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,IAAU,CAAA;AACvE,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACxC,IAAA,MAAM,gBAAA,GAAmB,wBAAA,CAAyB,IAAA,CAAK,IAAI,CAAA;AAC3D,IAAA,IAAI,cAAA,IAAkB,iBAAiB,gBAAA,EAAkB;AACvD,MAAA,UAAA,IAAc,CAAA;AAAA,IAChB;AAAA,EACF;AACA,EAAA,OAAO,UAAA,IAAc,CAAA;AACvB;;;AC1FO,SAAS,cAAA,CAAe,OAAe,OAAA,EAA+B;AAC3E,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AAC5C,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC5D,IAAA,IAAI,SAAA,CAAU,WAAA,EAAY,KAAM,UAAA,EAAY;AAC1C,MAAA,OAAO,UAAU,WAAA,EAAY;AAAA,IAC/B;AACA,IAAA,IAAI,SAAA,CAAU,KAAK,CAAC,KAAA,KAAU,MAAM,WAAA,EAAY,KAAM,UAAU,CAAA,EAAG;AACjE,MAAA,OAAO,UAAU,WAAA,EAAY;AAAA,IAC/B;AAAA,EACF;AACA,EAAA,OAAO,UAAA;AACT;AAEO,SAAS,eAAA,CAAgB,QAAkB,OAAA,EAAiC;AACjF,EAAA,OAAO,MAAA,CAAO,OAAO,GAAA,CAAI,CAAC,UAAU,cAAA,CAAe,KAAA,EAAO,OAAO,CAAC,CAAC,CAAA;AACrE;;;ACbA,IAAM,eAAA,GAAkB;AAAA,EACtB,UAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,sBAAsB,KAAA,EAA2B;AACxD,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,6BAAA,CAA8B,IAAA,CAAK,IAAI,CAAA,EAAG;AAC5C,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,IACxC;AAAA,EACF;AACA,EAAA,OAAO,QAAA,CAAS,IAAI,CAAC,KAAA,KAAU,MAAM,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAC7D;AAEA,SAAS,uBAAuB,KAAA,EAA2B;AACzD,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,8BAAA,CAA+B,IAAA,CAAK,IAAI,CAAA,EAAG;AAC7C,MAAA,SAAA,CAAU,IAAA,CAAK,GAAG,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,IACzC;AAAA,EACF;AACA,EAAA,OAAO,SAAA,CAAU,IAAI,CAAC,KAAA,KAAU,MAAM,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAC9D;AAEA,SAAS,oBAAoB,IAAA,EAAwB;AACnD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,oEAAoE,CAAA;AACjG,EAAA,MAAM,WAAA,GAAc,YAAY,SAAA,CAAU,CAAC,EAAE,KAAA,CAAM,KAAK,IAAI,EAAC;AAC7D,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA;AAC5E;AAEA,SAAS,qBAAqB,IAAA,EAAkC;AAC9D,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA;AACxD,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,6BAA6B,IAAA,EAAwB;AAC5D,EAAA,MAAM,UAAA,GAAa,uBAAuB,IAAI,CAAA;AAC9C,EAAA,OAAO,gBAAgB,MAAA,CAAO,CAAC,WAAW,UAAA,CAAW,QAAA,CAAS,MAAM,CAAC,CAAA;AACvE;AAEO,SAAS,mBAAA,CACd,gBACA,MAAA,EACsB;AACtB,EAAA,MAAM,cAAA,GAAiB,oBAAoB,cAAc,CAAA;AACzD,EAAA,MAAM,KAAA,GAAQ,WAAW,cAAc,CAAA;AAEvC,EAAA,MAAM,iBAAA,GAAoB,sBAAsB,KAAK,CAAA;AACrD,EAAA,MAAM,kBAAA,GAAqB,uBAAuB,KAAK,CAAA;AAEvD,EAAA,MAAM,cAAA,GAAiB,eAAA,CAAgB,iBAAA,EAAmB,MAAA,CAAO,YAAY,CAAA;AAC7E,EAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,kBAAA,EAAoB,MAAA,CAAO,YAAY,CAAA;AAC/E,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,CAAC,GAAG,cAAA,EAAgB,GAAG,eAAA,EAAiB,GAAG,QAAA,CAAS,cAAc,CAAC,CAAC,CAAA;AAE5F,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,cAAA;AAAA,IACL,cAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAA,EAAc,oBAAoB,cAAc,CAAA;AAAA,IAChD,QAAA;AAAA,IACA,kBAAA,EAAoB,qBAAqB,cAAc,CAAA;AAAA,IACvD,qBAAA,EAAuB,6BAA6B,cAAc;AAAA,GACpE;AACF;;;ACjFA,IAAM,MAAA,GAAiC;AAAA,EACrC,GAAA,EAAK,CAAA;AAAA,EACL,OAAA,EAAS,CAAA;AAAA,EACT,GAAA,EAAK,CAAA;AAAA,EACL,QAAA,EAAU,CAAA;AAAA,EACV,GAAA,EAAK,CAAA;AAAA,EACL,KAAA,EAAO,CAAA;AAAA,EACP,GAAA,EAAK,CAAA;AAAA,EACL,KAAA,EAAO,CAAA;AAAA,EACP,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,IAAA,EAAM,CAAA;AAAA,EACN,GAAA,EAAK,CAAA;AAAA,EACL,IAAA,EAAM,CAAA;AAAA,EACN,GAAA,EAAK,CAAA;AAAA,EACL,MAAA,EAAQ,CAAA;AAAA,EACR,GAAA,EAAK,CAAA;AAAA,EACL,IAAA,EAAM,CAAA;AAAA,EACN,SAAA,EAAW,CAAA;AAAA,EACX,GAAA,EAAK,EAAA;AAAA,EACL,OAAA,EAAS,EAAA;AAAA,EACT,GAAA,EAAK,EAAA;AAAA,EACL,QAAA,EAAU,EAAA;AAAA,EACV,GAAA,EAAK,EAAA;AAAA,EACL,QAAA,EAAU;AACZ,CAAA;AAOA,SAAS,eAAe,GAAA,EAAqC;AAC3D,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AACvC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,yBAAyB,CAAA;AAC1D,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,CAAC,CAAA,CAAE,WAAA,EAAY;AAC5C,IAAA,MAAM,OAAO,MAAA,CAAO,QAAA,CAAS,UAAA,CAAW,CAAC,GAAG,EAAE,CAAA;AAC9C,IAAA,MAAM,KAAA,GAAQ,OAAO,SAAS,CAAA;AAC9B,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AACvB,MAAA,OAAO,EAAE,MAAM,KAAA,EAAM;AAAA,IACvB;AAAA,EACF;AACA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,mBAAmB,CAAA;AACnD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,OAAO,MAAA,CAAO,QAAA,CAAS,SAAA,CAAU,CAAC,GAAG,EAAE,CAAA;AAC7C,IAAA,OAAO,EAAE,IAAA,EAAK;AAAA,EAChB;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,aAAA,CAAc,OAAwB,GAAA,EAA8B;AAC3E,EAAA,MAAM,UAAA,GAAa,MAAM,KAAA,IAAS,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,IAAI,KAAA,IAAS,EAAA;AAC9B,EAAA,OAAA,CAAQ,IAAI,IAAA,GAAO,KAAA,CAAM,IAAA,IAAQ,EAAA,IAAM,WAAW,UAAA,GAAa,CAAA,CAAA;AACjE;AAEO,SAAS,eAAe,IAAA,EAAsC;AACnE,EAAA,MAAM,UAAA,GAAa,KAAK,IAAA,EAAK;AAC7B,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,mGAAmG,CAAA;AACvI,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,UAAA,CAAW,CAAC,CAAC,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,WAAW,CAAC,CAAA;AAC3B,EAAA,MAAM,SAAA,GAAY,sBAAA,CAAuB,IAAA,CAAK,MAAM,CAAA;AACpD,EAAA,MAAM,QAAA,GAAW,SAAA,GAAY,MAAA,GAAY,cAAA,CAAe,MAAM,CAAA;AAC9D,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,mBAAoC,QAAA,IAAY;AAAA,IACpD,IAAA,EAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAC7B,KAAA,EAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,UAAS,GAAI;AAAA,GACjC;AACA,EAAA,MAAM,gBAAA,GAAmB,aAAA,CAAc,UAAA,EAAY,gBAAgB,CAAA;AACnE,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,UAAA;AAAA,IACL,KAAA,EAAO,WAAW,CAAC,CAAA;AAAA,IACnB,GAAA,EAAK,SAAA,GAAY,SAAA,GAAY,UAAA,CAAW,CAAC,CAAA;AAAA,IACzC,gBAAA,EAAkB,gBAAA,GAAmB,CAAA,GAAI,gBAAA,GAAmB;AAAA,GAC9D;AACF;AAEO,SAAS,mBAAmB,MAAA,EAAmC;AACpE,EAAA,MAAM,MAAA,GAAS,MAAA,CACZ,GAAA,CAAI,CAAC,UAAU,KAAA,CAAM,gBAAA,IAAoB,CAAC,CAAA,CAC1C,OAAO,CAAC,KAAA,EAAO,KAAA,KAAU,KAAA,GAAQ,OAAO,CAAC,CAAA;AAC5C,EAAA,OAAO,MAAA,CAAA,CAAQ,MAAA,GAAS,EAAA,EAAI,OAAA,CAAQ,CAAC,CAAC,CAAA;AACxC;;;AC9EA,IAAM,eAAA,GAAmD;AAAA,EACvD,OAAA,EAAS,CAAC,SAAA,EAAW,SAAA,EAAW,OAAO,CAAA;AAAA,EACvC,UAAA,EAAY,CAAC,YAAA,EAAc,iBAAA,EAAmB,2BAA2B,YAAY,CAAA;AAAA,EACrF,MAAA,EAAQ,CAAC,QAAA,EAAU,kBAAA,EAAoB,cAAc,CAAA;AAAA,EACrD,SAAA,EAAW,CAAC,WAAA,EAAa,WAAA,EAAa,qBAAqB,CAAA;AAAA,EAC3D,QAAA,EAAU,CAAC,UAAA,EAAY,WAAW,CAAA;AAAA,EAClC,cAAA,EAAgB,CAAC,gBAAA,EAAkB,UAAU;AAC/C,CAAA;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,KAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,cAAc,IAAA,EAAoC;AACzD,EAAA,MAAM,UAAA,GAAa,KAAK,WAAA,EAAY;AACpC,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AAChE,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,gBAAgB,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,KAAK,WAAY,GAAG,CAAA;AACzD,MAAA,IAAI,aAAA,CAAc,IAAA,CAAK,UAAU,CAAA,EAAG;AAClC,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,gBAAgB,IAAA,EAGvB;AACA,EAAA,MAAM,KAAA,GAAQ,WAAW,IAAI,CAAA;AAC7B,EAAA,MAAM,WAAmD,EAAC;AAC1D,EAAA,MAAM,WAA4B,EAAC;AACnC,EAAA,IAAI,OAAA,GAAgC,IAAA;AACpC,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,QAAA,CAAS,OAAO,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,IAAI,EAAE,IAAA,EAAK;AAC3C,MAAA,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,YAAA,GAAe,cAAc,IAAI,CAAA;AACvC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,KAAA,EAAM;AACN,MAAA,OAAA,GAAU,YAAA;AACV,MAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,EAClB;AACA,EAAA,KAAA,EAAM;AACN,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,MAAA,CAAO,QAAQ,CAAA,EAAE;AAChD;AAEA,SAAS,WAAA,CAAY,gBAAoC,OAAA,EAAsD;AAC7G,EAAA,IAAI,CAAC,cAAA,EAAgB,OAAO,EAAC;AAC7B,EAAA,MAAM,GAAA,GAAM,cAAA,CACT,KAAA,CAAM,QAAQ,CAAA,CACd,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,IAAA,EAAM,CAAA,CAC3B,OAAO,OAAO,CAAA;AACjB,EAAA,OAAO,eAAA,CAAgB,KAAK,OAAO,CAAA;AACrC;AAEA,SAAS,iBAAiB,IAAA,EAAwB;AAChD,EAAA,MAAM,KAAA,GAAQ,SAAS,IAAI,CAAA;AAC3B,EAAA,OAAO,aAAa,MAAA,CAAO,CAAC,SAAS,KAAA,CAAM,QAAA,CAAS,IAAI,CAAC,CAAA;AAC3D;AAEA,SAAS,gBAAgB,cAAA,EAIvB;AACA,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,OAAO,EAAE,SAAS,EAAC,EAAG,gBAAgB,EAAC,EAAG,SAAA,EAAW,EAAC,EAAE;AAAA,EAC1D;AACA,EAAA,MAAM,KAAA,GAAQ,WAAW,cAAc,CAAA;AACvC,EAAA,MAAM,UAAmC,EAAC;AAC1C,EAAA,MAAM,iBAA2B,EAAC;AAClC,EAAA,MAAM,YAAsB,EAAC;AAE7B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,eAAe,IAAI,CAAA;AACjC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC3C,MAAA,IAAI,QAAA,IAAY,CAAC,QAAA,CAAS,KAAA,EAAO;AAC/B,QAAA,QAAA,CAAS,KAAA,GAAQ,KAAA;AAAA,MACnB,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA;AAAA,MAC/B;AACA,MAAA,IAAI,MAAM,gBAAA,EAAkB;AAC1B,QAAA,cAAA,CAAe,IAAA,CAAK,MAAM,gBAAgB,CAAA;AAAA,MAC5C;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,iHAAiH,CAAA;AAC/I,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAC,CAAA,CAAE,IAAA,EAAK;AACjC,MAAA,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,WAAA,EAAa,CAAA;AAClC,MAAA,MAAM,KAAA,GAA+B,EAAE,KAAA,EAAO,WAAA,EAAa,IAAA,EAAK;AAChE,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC1C,MAAA,OAAA,CAAQ,WAAA,GAAc,CAAC,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,EAAK;AAAA,IACnF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,cAAA,EAAgB,SAAA,EAAW,MAAA,CAAO,SAAS,CAAA,EAAE;AACjE;AAEA,SAAS,eAAe,cAAA,EAA8C;AACpE,EAAA,IAAI,CAAC,cAAA,EAAgB,OAAO,EAAC;AAC7B,EAAA,OAAO,UAAA,CAAW,cAAc,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,sBAAA,CAAuB,IAAI,CAAC,CAAA;AAC9E;AAEA,SAAS,gBAAgB,IAAA,EAAwB;AAC/C,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,IAAI,CAAC,CAAA;AAC9B;AAEO,SAAS,WAAA,CAAY,YAAoB,MAAA,EAAyC;AACvF,EAAA,MAAM,cAAA,GAAiB,oBAAoB,UAAU,CAAA;AACrD,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,gBAAgB,UAAU,CAAA;AACzD,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,QAAA,CAAS,MAAA,EAAQ,OAAO,YAAY,CAAA;AAC/D,EAAA,MAAM,WAAA,GAAc,iBAAiB,cAAc,CAAA;AACnD,EAAA,MAAM,cAAA,GAAiB,eAAA,CAAgB,QAAA,CAAS,UAAU,CAAA;AAC1D,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,QAAA,CAAS,SAAS,CAAA;AAC1D,EAAA,MAAM,oBAAA,GAAuB,kBAAA;AAAA,IAC3B,cAAA,CAAe,OAAA,CACZ,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,KAAK,CAAA,CAC1B,MAAA,CAAO,CAAC,KAAA,KAA8C,OAAA,CAAQ,KAAK,CAAC;AAAA,GACzE;AAEA,EAAA,MAAM,gBAAA,GAAoC,CAAC,SAAA,EAAW,YAAA,EAAc,UAAU,WAAW,CAAA;AACzF,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,WAAW,gBAAA,EAAkB;AACtC,IAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AAC/B,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,qBAAA,CAAuB,CAAA;AAAA,IACjD;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,UAAA;AAAA,IACL,cAAA;AAAA,IACA,gBAAA,EAAkB,QAAA;AAAA,IAClB,cAAA,EAAgB,QAAA;AAAA,IAChB,MAAA;AAAA,IACA,WAAW,cAAA,CAAe,SAAA;AAAA,IAC1B,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,YAAY,cAAA,CAAe,OAAA;AAAA,IAC3B,oBAAA;AAAA,IACA,QAAA,EAAU,gBAAgB,cAAc,CAAA;AAAA,IACxC;AAAA,GACF;AACF;;;AC9KO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,MAAA,EAA2B;AAA3B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAA4B;AAAA,EAEjD,sBAAsB,MAAA,EAA4C;AACxE,IAAA,MAAM,gBAAA,GAAoC,CAAC,SAAA,EAAW,YAAA,EAAc,UAAU,WAAW,CAAA;AACzF,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,MAAM,WAAqB,EAAC;AAE5B,IAAA,MAAM,gBAAA,GAAkD;AAAA,MACtD,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,cAAA;AAAA,MACtC,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,iBAAA;AAAA,MACzC,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,aAAA;AAAA,MACrC,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,gBAAA;AAAA,MACxC,QAAA,EAAU,CAAA;AAAA,MACV,cAAA,EAAgB;AAAA,KAClB;AAEA,IAAA,KAAA,MAAW,WAAW,gBAAA,EAAkB;AACtC,MAAA,IAAI,CAAC,MAAA,CAAO,gBAAA,CAAiB,QAAA,CAAS,OAAO,CAAA,EAAG;AAC9C,QAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,OAAO,CAAA,IAAK,CAAA;AAC7C,QAAA,YAAA,IAAgB,OAAA;AAChB,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,MACjE;AAAA,IACF;AACA,IAAA,OAAO,EAAE,cAAc,QAAA,EAAS;AAAA,EAClC;AAAA,EAEQ,kBAAkB,KAAA,EAAkD;AAC1E,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,MAAM,WAAqB,EAAC;AAE5B,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,qBAAA,CAAsB,KAAA,CAAM,MAAM,CAAA;AAC7D,IAAA,YAAA,IAAgB,aAAA,CAAc,YAAA;AAC9B,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,aAAA,CAAc,QAAQ,CAAA;AAEvC,IAAA,IAAI,0BAAA,CAA2B,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA,EAAG;AAChD,MAAA,YAAA,IAAgB,CAAA;AAChB,MAAA,QAAA,CAAS,KAAK,wDAAwD,CAAA;AAAA,IACxE;AAEA,IAAA,IAAI,KAAA,CAAM,gBAAA,IAAoB,KAAA,CAAM,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/D,MAAA,MAAM,UAAU,KAAA,CAAM,gBAAA,CAAiB,MAAA,GAAS,IAAA,CAAK,OAAO,cAAA,CAAe,cAAA;AAC3E,MAAA,YAAA,IAAgB,OAAA;AAChB,MAAA,QAAA,CAAS,IAAA,CAAK,kCAAkC,KAAA,CAAM,gBAAA,CAAiB,KAAK,IAAI,CAAC,CAAA,UAAA,EAAa,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC1G;AAEA,IAAA,IAAI,KAAA,CAAM,MAAA,CAAO,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AAC5C,MAAA,YAAA,IAAgB,CAAA;AAChB,MAAA,QAAA,CAAS,KAAK,6CAA6C,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,EAAE,cAAc,QAAA,EAAS;AAAA,EAClC;AAAA,EAEA,SAAS,KAAA,EAAkD;AACzD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAClD,IAAA,IAAI,eAAe,aAAA,CAAc,YAAA;AACjC,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,aAAA,CAAc,QAAQ,CAAA;AAE3C,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AACpC,MAAA,MAAM,OAAA,GAAuB;AAAA,QAC3B,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,QACrB,cAAA,EAAgB,KAAK,MAAA,CAAO,cAAA;AAAA,QAC5B,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,iBAAiB,KAAA,CAAM,eAAA;AAAA,QACvB,kBAAkB,KAAA,CAAM;AAAA,OAC1B;AACA,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,EAAG;AAC3B,QAAA,YAAA,IAAgB,IAAA,CAAK,OAAA;AACrB,QAAA,IAAI,KAAK,OAAA,EAAS;AAChB,UAAA,QAAA,CAAS,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,cAAc,QAAA,EAAS;AAAA,EAClC;AACF,CAAA;;;AC1FA,IAAM,qBAAA,GAAwB,GAAA;AAC9B,IAAM,qBAAA,GAAwB,GAAA;AAC9B,IAAM,uBAAA,GAA0B,IAAA;AAChC,IAAM,sBAAA,GAAyB,IAAA;AAc/B,SAAS,WAAA,CACP,MAAA,EACA,GAAA,EACA,MAAA,EACsC;AACtC,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,OAAA,EAAS,eAAA,IAAmB,EAAC;AAC5D,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,OAAA,EAAS,cAAA,IAAkB,EAAC;AAE3D,EAAA,MAAM,WAAW,IAAI,GAAA;AAAA,IACnB,eAAA,CAAgB,CAAC,GAAG,GAAA,CAAI,gBAAgB,GAAG,eAAe,CAAA,EAAG,MAAA,CAAO,YAAY;AAAA,GAClF;AACA,EAAA,MAAM,WAAW,IAAI,GAAA;AAAA,IACnB,eAAA,CAAgB,CAAC,GAAG,GAAA,CAAI,iBAAiB,GAAG,eAAe,CAAA,EAAG,MAAA,CAAO,YAAY;AAAA,GACnF;AACA,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,eAAA,CAAgB,OAAO,MAAA,EAAQ,MAAA,CAAO,YAAY,CAAC,CAAA;AAEhF,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,KAAA,KAAU,YAAA,CAAa,GAAA,CAAI,KAAK,CAAC,CAAA;AAC/E,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,KAAA,KAAU,YAAA,CAAa,GAAA,CAAI,KAAK,CAAC,CAAA;AAE/E,EAAA,MAAM,mBAAmB,QAAA,CAAS,IAAA,KAAS,IAAI,CAAA,GAAI,eAAA,CAAgB,SAAS,QAAA,CAAS,IAAA;AACrF,EAAA,MAAM,mBAAmB,QAAA,CAAS,IAAA,KAAS,IAAI,CAAA,GAAI,eAAA,CAAgB,SAAS,QAAA,CAAS,IAAA;AAErF,EAAA,MAAM,KAAA,GAAQ,KAAA;AAAA,IAAA,CACX,gBAAA,GAAmB,qBAAA,GAAwB,gBAAA,GAAmB,qBAAA,IAAyB,GAAA;AAAA,IACxF,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,KAAA,KAAU,CAAC,YAAA,CAAa,GAAA,CAAI,KAAK,CAAC,CAAA;AACxE,EAAA,OAAO,EAAE,OAAO,OAAA,EAAQ;AAC1B;AAEA,SAAS,eAAA,CACP,MAAA,EACA,GAAA,EACA,MAAA,EACyC;AACzC,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,kBAAA,IAAsB,MAAA,CAAO,SAAS,aAAA,IAAiB,CAAA;AACjF,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,YAAA,EAAc,CAAA,EAAE;AAAA,EACvC;AACA,EAAA,MAAM,eAAe,KAAA,CAAM,MAAA,CAAO,oBAAA,GAAuB,aAAA,EAAe,GAAG,CAAC,CAAA;AAC5E,EAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,YAAA,EAAc,CAAA,EAAG,CAAC,CAAA,GAAI,uBAAA;AAEnD,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,WAAA,EAAa,CAAC,CAAA;AAC/E,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,CAAC,KAAA,KAAU,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,WAAA,EAAa,CAAC,CAAA;AAC3F,EAAA,MAAM,gBAAgB,UAAA,CAAW,IAAA,KAAS,IAAI,CAAA,GAAI,YAAA,CAAa,SAAS,UAAA,CAAW,IAAA;AACnF,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,aAAA,EAAe,CAAA,EAAG,CAAC,CAAA,GAAI,sBAAA;AAEnD,EAAA,MAAM,QAAQ,KAAA,CAAA,CAAO,cAAA,GAAiB,aAAA,IAAiB,GAAA,EAAK,GAAG,GAAG,CAAA;AAClE,EAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,aAAA,GAAgB,MAAA,CAAO,sBAAsB,CAAC,CAAA;AAC5E,EAAA,OAAO,EAAE,OAAO,YAAA,EAAc,MAAA,CAAO,aAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAE;AAChE;AAEA,SAAS,aAAA,CACP,MAAA,EACA,GAAA,EACA,MAAA,EACsC;AACtC,EAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,WAAA,EAAa,CAAC,CAAA;AAC9E,EAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,IAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,eAAA,EAAiB,EAAC,EAAG,eAAA,EAAiB,EAAC,EAAG,gBAAA,EAAkB,EAAC,EAAE;AAAA,EACtF;AAEA,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,MAAA,CAAO,cAAc,CAAA;AACnD,EAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,YAAY,CAAA;AAC3C,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,aAAa,CAAA,CAAE,MAAA,CAAO,CAAC,OAAA,KAAY,cAAA,CAAe,GAAA,CAAI,OAAO,CAAC,CAAA;AAC1F,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,aAAa,CAAA,CAAE,MAAA,CAAO,CAAC,OAAA,KAAY,CAAC,cAAA,CAAe,GAAA,CAAI,OAAO,CAAC,CAAA;AAE3F,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,MAAA,GAAS,aAAA,CAAc,IAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,GAAW,GAAA,EAAK,GAAG,GAAG,CAAA;AAE1C,EAAA,MAAM,WAAA,GAAc,iBAAiB,YAAY,CAAA;AACjD,EAAA,MAAM,WAAA,GAAc,aAAa,MAAA,IAAU,CAAA;AAC3C,EAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,MAAA,CAAO,CAAC,OAAA,KAAY;AAC3D,IAAA,MAAM,OAAA,GAAA,CAAW,WAAA,CAAY,OAAO,CAAA,IAAK,CAAA,IAAK,WAAA;AAC9C,IAAA,OAAO,OAAA,GAAU,OAAO,cAAA,CAAe,GAAA;AAAA,EACzC,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,eAAA,EAAiB,OAAO,eAAe,CAAA;AAAA,IACvC,eAAA,EAAiB,OAAO,eAAe,CAAA;AAAA,IACvC,gBAAA,EAAkB,OAAO,gBAAgB;AAAA,GAC3C;AACF;AAEA,SAAS,cAAA,CAAe,QAAsB,GAAA,EAAmC;AAC/E,EAAA,IAAI,GAAA,CAAI,qBAAA,CAAsB,MAAA,KAAW,CAAA,EAAG;AAC1C,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,MAAM,mBAAA,GAAsB,MAAA,CAAO,gBAAA,CAAiB,IAAA,CAAK,GAAG,CAAA;AAC5D,EAAA,MAAM,mBAAA,GAAsB,oBAAoB,WAAA,EAAY;AAC5D,EAAA,MAAM,OAAA,GAAU,IAAI,qBAAA,CAAsB,MAAA;AAAA,IAAO,CAAC,WAAA,KAChD,mBAAA,CAAoB,QAAA,CAAS,WAAA,CAAY,aAAa;AAAA,GACxD;AACA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA,CAAO,QAAQ,MAAA,GAAS,GAAA,CAAI,sBAAsB,MAAA,GAAU,GAAA,EAAK,GAAG,GAAG,CAAA;AAChF;AAEO,SAAS,cAAA,CACd,MAAA,EACA,GAAA,EACA,MAAA,EACkB;AAClB,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,MAAA,EAAQ,GAAA,EAAK,MAAM,CAAA;AACpD,EAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,MAAA,EAAQ,GAAA,EAAK,MAAM,CAAA;AAC5D,EAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,MAAA,EAAQ,GAAA,EAAK,MAAM,CAAA;AACvD,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,MAAA,EAAQ,GAAG,CAAA;AAEjD,EAAA,MAAM,SAAA,GAA0B;AAAA,IAC9B,QAAQ,YAAA,CAAa,KAAA;AAAA,IACrB,YAAY,gBAAA,CAAiB,KAAA;AAAA,IAC7B,UAAU,aAAA,CAAc,KAAA;AAAA,IACxB,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,MAAM,gBACJ,SAAA,CAAU,MAAA,GAAS,OAAO,OAAA,CAAQ,MAAA,GAClC,UAAU,UAAA,GAAa,MAAA,CAAO,QAAQ,UAAA,GACtC,SAAA,CAAU,WAAW,MAAA,CAAO,OAAA,CAAQ,WACpC,SAAA,CAAU,SAAA,GAAY,OAAO,OAAA,CAAQ,SAAA;AAEvC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,MAAM,MAAA,CAAO,aAAA,CAAc,QAAQ,CAAC,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAAA,IACrD,SAAA;AAAA,IACA,iBAAiB,aAAA,CAAc,eAAA;AAAA,IAC/B,iBAAiB,aAAA,CAAc,eAAA;AAAA,IAC/B,kBAAkB,aAAA,CAAc,gBAAA;AAAA,IAChC,aAAa,EAAC;AAAA,IACd,UAAU,EAAC;AAAA,IACX,eAAe,YAAA,CAAa,OAAA;AAAA,IAC5B,wBAAwB,gBAAA,CAAiB,YAAA;AAAA,IACzC;AAAA,GACF;AACF;;;AC9JO,IAAM,mBAAA,GAAoC;AAAA,EAC/C,UAAA,EAAY,CAAC,IAAA,EAAM,MAAA,EAAQ,WAAW,QAAQ,CAAA;AAAA,EAC9C,UAAA,EAAY,CAAC,IAAI,CAAA;AAAA,EACjB,KAAA,EAAO,CAAC,SAAA,EAAW,UAAU,CAAA;AAAA,EAC7B,KAAA,EAAO,CAAC,KAAK,CAAA;AAAA,EACb,IAAA,EAAM,CAAC,QAAQ,CAAA;AAAA,EACf,MAAA,EAAQ,CAAC,IAAI,CAAA;AAAA,EACb,GAAA,EAAK,CAAC,UAAA,EAAY,OAAA,EAAS,QAAQ,CAAA;AAAA,EACnC,OAAA,EAAS,CAAC,KAAK,CAAA;AAAA,EACf,GAAA,EAAK,CAAC,qBAAqB,CAAA;AAAA,EAC3B,KAAA,EAAO,CAAC,iBAAiB,CAAA;AAAA,EACzB,GAAA,EAAK,CAAC,cAAA,EAAgB,uBAAuB,CAAA;AAAA,EAC7C,MAAA,EAAQ,CAAC,YAAY,CAAA;AAAA,EACrB,UAAA,EAAY,CAAC,KAAK,CAAA;AAAA,EAClB,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,EACd,GAAA,EAAK,CAAC,MAAM;AACd;AAEO,IAAM,uBAAA,GAAsC;AAAA,EACjD,IAAA,EAAM,mBAAA;AAAA,EACN,eAAA,EAAiB,CAAC,YAAA,EAAc,YAAA,EAAc,SAAS,MAAM,CAAA;AAAA,EAC7D,cAAA,EAAgB,CAAC,SAAA,EAAW,KAAA,EAAO,QAAQ,CAAA;AAAA,EAC3C,aAAA,EAAe;AACjB,CAAA;AAEO,IAAM,oBAAA,GAAmC;AAAA,EAC9C,IAAA,EAAM,gBAAA;AAAA,EACN,eAAA,EAAiB,CAAC,QAAA,EAAU,KAAA,EAAO,YAAY,CAAA;AAAA,EAC/C,cAAA,EAAgB,CAAC,QAAA,EAAU,OAAA,EAAS,WAAW,YAAY,CAAA;AAAA,EAC3D,aAAA,EAAe;AACjB,CAAA;AAEO,IAAM,qBAAA,GAAoC;AAAA,EAC/C,IAAA,EAAM,iBAAA;AAAA,EACN,eAAA,EAAiB,CAAC,SAAA,EAAW,wBAAA,EAA0B,gBAAgB,CAAA;AAAA,EACvE,cAAA,EAAgB,CAAC,aAAA,EAAe,WAAA,EAAa,KAAK,CAAA;AAAA,EAClD,aAAA,EAAe;AACjB,CAAA;AAEO,IAAM,eAAA,GAAgC;AAAA,EAC3C,uBAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF;;;ACnCA,IAAM,eAAA,GAA8B;AAAA,EAClC,MAAA,EAAQ,GAAA;AAAA,EACR,UAAA,EAAY,GAAA;AAAA,EACZ,QAAA,EAAU,IAAA;AAAA,EACV,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,uBAAA,GAAgD;AAAA,EACpD,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,IAAA;AAAA,EACL,cAAA,EAAgB;AAClB,CAAA;AAEA,IAAM,yBAAA,GAA4D;AAAA,EAChE,cAAA,EAAgB,CAAA;AAAA,EAChB,iBAAA,EAAmB,EAAA;AAAA,EACnB,aAAA,EAAe,CAAA;AAAA,EACf,gBAAA,EAAkB;AACpB,CAAA;AAEA,SAAS,iBAAiB,OAAA,EAAwC;AAChE,EAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,GAAS,QAAQ,UAAA,GAAa,OAAA,CAAQ,WAAW,OAAA,CAAQ,SAAA;AAC/E,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,OAAO,EAAE,GAAG,OAAA,EAAS,eAAA,EAAiB,CAAA,EAAE;AAAA,EAC1C;AACA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,QAAQ,MAAA,GAAS,KAAA;AAAA,IACzB,UAAA,EAAY,QAAQ,UAAA,GAAa,KAAA;AAAA,IACjC,QAAA,EAAU,QAAQ,QAAA,GAAW,KAAA;AAAA,IAC7B,SAAA,EAAW,QAAQ,SAAA,GAAY,KAAA;AAAA,IAC/B,eAAA,EAAiB;AAAA,GACnB;AACF;AAEO,SAAS,aAAA,CAAc,MAAA,GAAoB,EAAC,EAAsB;AACvE,EAAA,MAAM,OAAA,GAAsB;AAAA,IAC1B,MAAA,EAAQ,MAAA,CAAO,OAAA,EAAS,MAAA,IAAU,eAAA,CAAgB,MAAA;AAAA,IAClD,UAAA,EAAY,MAAA,CAAO,OAAA,EAAS,UAAA,IAAc,eAAA,CAAgB,UAAA;AAAA,IAC1D,QAAA,EAAU,MAAA,CAAO,OAAA,EAAS,QAAA,IAAY,eAAA,CAAgB,QAAA;AAAA,IACtD,SAAA,EAAW,MAAA,CAAO,OAAA,EAAS,SAAA,IAAa,eAAA,CAAgB;AAAA,GAC1D;AAEA,EAAA,MAAM,QAAA,GAA8B;AAAA,IAClC,OAAA,EAAS,iBAAiB,OAAO,CAAA;AAAA,IACjC,YAAA,EAAc,EAAE,GAAG,mBAAA,EAAqB,GAAI,MAAA,CAAO,YAAA,IAAgB,EAAC,EAAG;AAAA,IACvE,OAAA,EAAS,OAAO,OAAA,IAAW,uBAAA;AAAA,IAC3B,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,EAAC;AAAA,IACxB,cAAA,EAAgB,OAAO,cAAA,IAAkB,uBAAA;AAAA,IACzC,gBAAA,EAAkB;AAAA,MAChB,GAAG,yBAAA;AAAA,MACH,GAAI,MAAA,CAAO,gBAAA,IAAoB;AAAC,KAClC;AAAA,IACA,mBAAA,EAAqB,OAAO,mBAAA,IAAuB;AAAA,GACrD;AAEA,EAAA,OAAO,QAAA;AACT;;;ACvDA,SAAS,UAAA,CAAW,MAAA,EAAkB,GAAA,GAAM,CAAA,EAAW;AACrD,EAAA,MAAM,eAAe,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACzC,EAAA,OAAO,QAAQ,IAAA,CAAK,IAAI,KAAK,YAAA,CAAa,MAAA,GAAS,MAAM,KAAA,GAAQ,EAAA,CAAA;AACnE;AAEO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,SAAS,KAAA,EAA6E;AACpF,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,MAAM,QAAA,GAAqB,CAAC,GAAG,KAAA,CAAM,cAAc,GAAG,KAAA,CAAM,OAAO,QAAQ,CAAA;AAE3E,IAAA,IAAI,KAAA,CAAM,KAAA,CAAM,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AACxC,MAAA,WAAA,CAAY,IAAA;AAAA,QACV,CAAA,iCAAA,EAAoC,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,OAC3E;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,KAAA,CAAM,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AAC1C,MAAA,WAAA,CAAY,IAAA;AAAA,QACV,CAAA,mCAAA,EAAsC,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,eAAe,CAAC,CAAA;AAAA,OAC/E;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,KAAA,CAAM,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AAC3C,MAAA,WAAA,CAAY,IAAA;AAAA,QACV,CAAA,4BAAA,EAA+B,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,gBAAgB,CAAC,CAAA;AAAA,OACzE;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,KAAA,CAAM,sBAAA,GAAyB,CAAA,EAAG;AAC1C,MAAA,WAAA,CAAY,IAAA;AAAA,QACV,oBAAoB,KAAA,CAAM,GAAA,CAAI,kBAAA,IAAsB,KAAA,CAAM,MAAM,sBAAsB,CAAA,2DAAA;AAAA,OACxF;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,IAAI,qBAAA,CAAsB,MAAA,GAAS,KAAK,KAAA,CAAM,KAAA,CAAM,mBAAmB,CAAA,EAAG;AAClF,MAAA,WAAA,CAAY,IAAA;AAAA,QACV,CAAA,2CAAA,EAA8C,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,qBAAqB,CAAC,CAAA;AAAA,OAC3F;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,MAAA,CAAO,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACvC,MAAA,WAAA,CAAY,IAAA;AAAA,QACV;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,aAAa,QAAA,EAAS;AAAA,EACjC;AACF,CAAA;;;AC3CO,SAAS,cAAc,KAAA,EAA8C;AAC1E,EAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,KAAA,CAAM,MAAA,IAAW,EAAgB,CAAA;AACtE,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,KAAA,CAAM,UAAA,EAAY,cAAc,CAAA;AACjE,EAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,KAAA,CAAM,cAAA,EAAgB,cAAc,CAAA;AAE1E,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,YAAA,EAAc,SAAA,EAAW,cAAc,CAAA;AACtE,EAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,cAAc,CAAA;AAChD,EAAA,MAAM,UAAA,GAAa,WAAW,QAAA,CAAS;AAAA,IACrC,MAAA,EAAQ,YAAA;AAAA,IACR,GAAA,EAAK,SAAA;AAAA,IACL,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,IACzB,kBAAkB,OAAA,CAAQ;AAAA,GAC3B,CAAA;AAED,EAAA,MAAM,gBAAA,GAAmB,IAAI,gBAAA,EAAiB;AAC9C,EAAA,MAAM,gBAAA,GAAmB,iBAAiB,QAAA,CAAS;AAAA,IACjD,MAAA,EAAQ,YAAA;AAAA,IACR,GAAA,EAAK,SAAA;AAAA,IACL,KAAA,EAAO,OAAA;AAAA,IACP,cAAc,UAAA,CAAW;AAAA,GAC1B,CAAA;AAED,EAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,QAAQ,UAAA,CAAW,YAAA,EAAc,GAAG,GAAG,CAAA;AAExE,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,UAAA;AAAA,IACP,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,IACzB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,IACzB,kBAAkB,OAAA,CAAQ,gBAAA;AAAA,IAC1B,aAAa,gBAAA,CAAiB,WAAA;AAAA,IAC9B,UAAU,gBAAA,CAAiB;AAAA,GAC7B;AACF","file":"index.mjs","sourcesContent":["export const STOP_WORDS = new Set([\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 \"is\",\n \"are\",\n \"be\",\n \"this\",\n \"that\",\n \"it\",\n \"was\",\n \"were\",\n \"will\",\n \"can\",\n \"should\",\n \"must\",\n \"have\",\n \"has\",\n \"had\",\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 return normalizeWhitespace(text).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\nexport function tokenize(text: string): string[] {\n return normalizeForComparison(text)\n .split(/[^a-z0-9+]+/i)\n .map((word) => word.trim())\n .filter((word) => word.length > 1 && !STOP_WORDS.has(word));\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 { SkillAliases } from \"../types/config\";\nimport { unique } from \"./text\";\n\nexport function normalizeSkill(skill: string, aliases: SkillAliases): string {\n const normalized = skill.trim().toLowerCase();\n for (const [canonical, aliasList] of Object.entries(aliases)) {\n if (canonical.toLowerCase() === normalized) {\n return canonical.toLowerCase();\n }\n if (aliasList.some((alias) => alias.toLowerCase() === normalized)) {\n return canonical.toLowerCase();\n }\n }\n return normalized;\n}\n\nexport function normalizeSkills(skills: string[], aliases: SkillAliases): string[] {\n return unique(skills.map((skill) => normalizeSkill(skill, aliases)));\n}\n\nexport function expandAliases(skills: string[], aliases: SkillAliases): string[] {\n const expanded: string[] = [];\n for (const skill of skills) {\n const canonical = normalizeSkill(skill, aliases);\n expanded.push(canonical);\n const aliasList = aliases[canonical];\n if (aliasList) {\n expanded.push(...aliasList.map((alias) => alias.toLowerCase()));\n }\n }\n return unique(expanded);\n}\n\nexport function skillMatched(candidate: string, targetSkills: Set<string>, aliases: SkillAliases): boolean {\n const normalizedCandidate = normalizeSkill(candidate, aliases);\n if (targetSkills.has(normalizedCandidate)) {\n return true;\n }\n for (const alias of Object.values(aliases)) {\n if (alias.map((value) => value.toLowerCase()).includes(normalizedCandidate)) {\n return true;\n }\n }\n return false;\n}\n","import { ResolvedATSConfig } from \"../../types/config\";\nimport { ParsedJobDescription } from \"../../types/parser\";\nimport { normalizeForComparison, normalizeWhitespace, splitLines, tokenize, unique } from \"../../utils/text\";\nimport { normalizeSkills } from \"../../utils/skills\";\n\nconst DEGREE_KEYWORDS = [\n \"bachelor\",\n \"b.s\",\n \"bs\",\n \"bsc\",\n \"master\",\n \"m.s\",\n \"ms\",\n \"msc\",\n \"phd\",\n \"doctorate\",\n \"mba\",\n \"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(...line.split(/[,.;•-]/));\n }\n }\n return required.map((value) => value.trim()).filter(Boolean);\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(...line.split(/[,.;•-]/));\n }\n }\n return preferred.map((value) => value.trim()).filter(Boolean);\n}\n\nfunction extractRoleKeywords(text: string): string[] {\n const roleMatch = text.match(/(engineer|developer|manager|scientist|analyst|designer|architect)/i);\n const titleTokens = roleMatch ? roleMatch[0].split(/\\s+/) : [];\n return unique(tokenize(titleTokens.join(\" \") || text.split(/\\n/)[0] || \"\"));\n}\n\nfunction extractMinExperience(text: string): number | undefined {\n const match = text.match(/(\\d{1,2})\\+?\\s+(?:years|yrs)/i);\n if (match) {\n return Number.parseInt(match[1], 10);\n }\n return undefined;\n}\n\nfunction extractEducationRequirements(text: string): string[] {\n const normalized = normalizeForComparison(text);\n return DEGREE_KEYWORDS.filter((degree) => normalized.includes(degree));\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 const requiredSkillsRaw = extractRequiredSkills(lines);\n const preferredSkillsRaw = extractPreferredSkills(lines);\n\n const requiredSkills = normalizeSkills(requiredSkillsRaw, config.skillAliases);\n const preferredSkills = normalizeSkills(preferredSkillsRaw, config.skillAliases);\n const keywords = unique([...requiredSkills, ...preferredSkills, ...tokenize(normalizedText)]);\n\n return {\n raw: jobDescription,\n normalizedText,\n requiredSkills,\n preferredSkills,\n roleKeywords: extractRoleKeywords(jobDescription),\n keywords,\n minExperienceYears: extractMinExperience(jobDescription),\n educationRequirements: extractEducationRequirements(jobDescription),\n };\n}\n","import { ParsedDateRange } from \"../types/parser\";\n\nconst MONTHS: Record<string, number> = {\n jan: 1,\n january: 1,\n feb: 2,\n february: 2,\n mar: 3,\n march: 3,\n apr: 4,\n april: 4,\n may: 5,\n jun: 6,\n june: 6,\n jul: 7,\n july: 7,\n aug: 8,\n august: 8,\n sep: 9,\n sept: 9,\n september: 9,\n oct: 10,\n october: 10,\n nov: 11,\n november: 11,\n dec: 12,\n december: 12,\n};\n\ninterface ParsedDateToken {\n year: number;\n month?: number;\n}\n\nfunction parseDateToken(raw: string): ParsedDateToken | null {\n const cleaned = raw.trim().toLowerCase();\n const monthMatch = cleaned.match(/([a-z]{3,9})\\s*(\\d{4})/i);\n if (monthMatch) {\n const monthName = monthMatch[1].toLowerCase();\n const year = Number.parseInt(monthMatch[2], 10);\n const month = MONTHS[monthName];\n if (!Number.isNaN(year)) {\n return { year, month };\n }\n }\n 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): ParsedDateRange | null {\n const normalized = text.trim();\n const rangeMatch = normalized.match(/([A-Za-z]{3,9}\\s+\\d{4}|\\d{4})\\s*(?:-|to|–|—)\\s*(Present|Current|Now|[A-Za-z]{3,9}\\s+\\d{4}|\\d{4})/i);\n if (!rangeMatch) {\n return null;\n }\n const startToken = parseDateToken(rangeMatch[1]);\n const endRaw = rangeMatch[2];\n const isPresent = /present|current|now/i.test(endRaw);\n const endToken = isPresent ? undefined : parseDateToken(endRaw);\n if (!startToken) {\n return null;\n }\n const endTokenResolved: ParsedDateToken = endToken ?? {\n year: new Date().getFullYear(),\n month: new Date().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 };\n}\n\nexport function sumExperienceYears(ranges: ParsedDateRange[]): number {\n const months = ranges\n .map((range) => range.durationInMonths ?? 0)\n .reduce((total, value) => total + value, 0);\n return Number((months / 12).toFixed(2));\n}\n","import { ResolvedATSConfig } from \"../../types/config\";\nimport { ParsedExperienceEntry, ParsedResume, ResumeSection } from \"../../types/parser\";\nimport { parseDateRange, sumExperienceYears } from \"../../utils/dates\";\nimport {\n normalizeForComparison,\n normalizeWhitespace,\n splitLines,\n tokenize,\n unique,\n} from \"../../utils/text\";\nimport { normalizeSkills } from \"../../utils/skills\";\n\nconst SECTION_ALIASES: Record<ResumeSection, string[]> = {\n summary: [\"summary\", \"profile\", \"about\"],\n experience: [\"experience\", \"work experience\", \"professional experience\", \"employment\"],\n skills: [\"skills\", \"technical skills\", \"technologies\"],\n education: [\"education\", \"academics\", \"academic background\"],\n projects: [\"projects\", \"portfolio\"],\n certifications: [\"certifications\", \"licenses\"]\n};\n\nconst ACTION_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\nfunction detectSection(line: string): ResumeSection | null {\n const normalized = line.toLowerCase();\n for (const [section, aliases] of Object.entries(SECTION_ALIASES)) {\n for (const alias of aliases) {\n const headerPattern = new RegExp(`^${alias}(\\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) };\n}\n\nfunction parseSkills(sectionContent: string | undefined, aliases: ResolvedATSConfig[\"skillAliases\"]): string[] {\n if (!sectionContent) return [];\n const raw = sectionContent\n .split(/[,;\\n]/)\n .map((skill) => skill.trim())\n .filter(Boolean);\n return normalizeSkills(raw, aliases);\n}\n\nfunction parseActionVerbs(text: string): string[] {\n const words = tokenize(text);\n return ACTION_VERBS.filter((verb) => words.includes(verb));\n}\n\nfunction parseExperience(sectionContent: string | undefined): {\n entries: ParsedExperienceEntry[];\n rangesInMonths: number[];\n jobTitles: string[];\n} {\n if (!sectionContent) {\n return { entries: [], rangesInMonths: [], jobTitles: [] };\n }\n const lines = splitLines(sectionContent);\n const entries: ParsedExperienceEntry[] = [];\n const rangesInMonths: number[] = [];\n const jobTitles: string[] = [];\n\n for (const line of lines) {\n const range = parseDateRange(line);\n if (range) {\n const previous = entries[entries.length - 1];\n if (previous && !previous.dates) {\n previous.dates = range;\n } else {\n entries.push({ dates: range });\n }\n if (range.durationInMonths) {\n rangesInMonths.push(range.durationInMonths);\n }\n continue;\n }\n\n const titleMatch = line.match(/^(Senior|Lead|Principal|Staff|Software|Full\\s*Stack|Frontend|Backend|Engineer|Developer|Manager|Analyst)[^,-]*/i);\n if (titleMatch) {\n const title = titleMatch[0].trim();\n jobTitles.push(title.toLowerCase());\n const entry: ParsedExperienceEntry = { title, description: line };\n entries.push(entry);\n 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 }\n\n return { entries, rangesInMonths, jobTitles: unique(jobTitles) };\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);\n const educationEntries = parseEducation(sections.education);\n const totalExperienceYears = sumExperienceYears(\n experienceData.entries\n .map((entry) => entry.dates)\n .filter((range): range is NonNullable<typeof range> => Boolean(range))\n );\n\n const requiredSections: ResumeSection[] = [\"summary\", \"experience\", \"skills\", \"education\"];\n const warnings: string[] = [];\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,\n educationEntries,\n experience: experienceData.entries,\n totalExperienceYears,\n keywords: collectKeywords(normalizedText),\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 } from \"../../types/scoring\";\nimport { ResolvedATSConfig } from \"../../types/config\";\nimport { clamp, countFrequencies, tokenize, unique } from \"../../utils/text\";\nimport { normalizeSkills } from \"../../utils/skills\";\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\ninterface ScoringArtifacts {\n matchedKeywords: string[];\n missingKeywords: string[];\n overusedKeywords: string[];\n}\n\nexport interface ScoreComputation extends ATSAnalysisResult {\n missingSkills: string[];\n missingExperienceYears: number;\n educationScore: number;\n}\n\nfunction scoreSkills(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): { score: number; 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 missing = [...required].filter((skill) => !resumeSkills.has(skill));\n return { score, 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\nfunction scoreKeywords(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): { score: number } & ScoringArtifacts {\n const jobKeywordSet = new Set(job.keywords.map((value) => value.toLowerCase()));\n if (jobKeywordSet.size === 0) {\n return { score: 100, matchedKeywords: [], missingKeywords: [], overusedKeywords: [] };\n }\n\n const resumeTokens = tokenize(resume.normalizedText);\n const resumeTokenSet = new Set(resumeTokens);\n const matchedKeywords = [...jobKeywordSet].filter((keyword) => resumeTokenSet.has(keyword));\n const missingKeywords = [...jobKeywordSet].filter((keyword) => !resumeTokenSet.has(keyword));\n\n const coverage = matchedKeywords.length / jobKeywordSet.size;\n const score = clamp(coverage * 100, 0, 100);\n\n const frequencies = countFrequencies(resumeTokens);\n const totalTokens = resumeTokens.length || 1;\n const overusedKeywords = matchedKeywords.filter((keyword) => {\n const density = (frequencies[keyword] ?? 0) / totalTokens;\n return density > config.keywordDensity.max;\n });\n\n return {\n score,\n matchedKeywords: unique(matchedKeywords),\n missingKeywords: unique(missingKeywords),\n overusedKeywords: unique(overusedKeywords),\n };\n}\n\nfunction scoreEducation(resume: ParsedResume, job: ParsedJobDescription): number {\n if (job.educationRequirements.length === 0) {\n return 100;\n }\n const resumeEducationText = resume.educationEntries.join(\" \");\n const normalizedEducation = resumeEducationText.toLowerCase();\n const matched = job.educationRequirements.filter((requirement) =>\n normalizedEducation.includes(requirement.toLowerCase())\n );\n if (matched.length === 0) {\n return 0;\n }\n return clamp((matched.length / job.educationRequirements.length) * 100, 0, 100);\n}\n\nexport function calculateScore(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): ScoreComputation {\n const skillsResult = scoreSkills(resume, job, config);\n const experienceResult = scoreExperience(resume, job, config);\n const keywordResult = scoreKeywords(resume, job, config);\n const educationScore = scoreEducation(resume, job);\n\n const breakdown: ATSBreakdown = {\n skills: skillsResult.score,\n experience: experienceResult.score,\n keywords: keywordResult.score,\n education: educationScore,\n };\n\n const weightedScore =\n breakdown.skills * config.weights.skills +\n breakdown.experience * config.weights.experience +\n breakdown.keywords * config.weights.keywords +\n breakdown.education * config.weights.education;\n\n return {\n score: clamp(Number(weightedScore.toFixed(2)), 0, 100),\n breakdown,\n matchedKeywords: keywordResult.matchedKeywords,\n missingKeywords: keywordResult.missingKeywords,\n overusedKeywords: keywordResult.overusedKeywords,\n suggestions: [],\n warnings: [],\n missingSkills: skillsResult.missing,\n missingExperienceYears: experienceResult.missingYears,\n educationScore,\n };\n}\n","import { ATSProfile, SkillAliases } from \"../types/config\";\n\nexport const defaultSkillAliases: SkillAliases = {\n javascript: [\"js\", \"node\", \"node.js\", \"nodejs\"],\n typescript: [\"ts\"],\n react: [\"reactjs\", \"react.js\"],\n \"c++\": [\"cpp\"],\n \"c#\": [\"csharp\"],\n python: [\"py\"],\n sql: [\"postgres\", \"mysql\", \"sqlite\"],\n graphql: [\"gql\"],\n aws: [\"amazon web services\"],\n azure: [\"microsoft azure\"],\n gcp: [\"google cloud\", \"google cloud platform\"],\n docker: [\"containers\"],\n kubernetes: [\"k8s\"],\n html: [\"html5\"],\n css: [\"css3\"],\n};\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 { defaultSkillAliases, softwareEngineerProfile } from \"../../profiles\";\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 return { ...weights, normalizedTotal: 1 };\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 resolved: ResolvedATSConfig = {\n weights: normalizeWeights(weights),\n skillAliases: { ...defaultSkillAliases, ...(config.skillAliases ?? {}) },\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 };\n\n return resolved;\n}\n","import { ParsedJobDescription, ParsedResume } from \"../../types/parser\";\nimport { ATSAnalysisResult } from \"../../types/scoring\";\nimport { ScoreComputation } from \"../scoring/scorer\";\n\ninterface SuggestionInput {\n resume: ParsedResume;\n job: ParsedJobDescription;\n score: ScoreComputation;\n ruleWarnings: string[];\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\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 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 return { suggestions, warnings };\n }\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 { clamp } from \"./utils/text\";\nimport { defaultProfiles, defaultSkillAliases } from \"./profiles\";\n\nexport * from \"./types\";\nexport { defaultProfiles, defaultSkillAliases };\n\n/**\n * Analyze a resume against a job description using deterministic, explainable rules.\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 });\n\n const finalScore = clamp(scoring.score - ruleResult.totalPenalty, 0, 100);\n\n return {\n score: finalScore,\n breakdown: scoring.breakdown,\n matchedKeywords: scoring.matchedKeywords,\n missingKeywords: scoring.missingKeywords,\n overusedKeywords: scoring.overusedKeywords,\n suggestions: suggestionResult.suggestions,\n warnings: suggestionResult.warnings,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/text.ts","../src/utils/skills.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/llm.manager.ts","../src/llm/llm.schemas.ts","../src/llm/llm.prompts.ts","../src/llm/llm.adapters.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export const STOP_WORDS = new Set([\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 \"is\",\n \"are\",\n \"be\",\n \"this\",\n \"that\",\n \"it\",\n \"was\",\n \"were\",\n \"will\",\n \"can\",\n \"should\",\n \"must\",\n \"have\",\n \"has\",\n \"had\",\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 return normalizeWhitespace(text).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\nexport function tokenize(text: string): string[] {\n return normalizeForComparison(text)\n .split(/[^a-z0-9+]+/i)\n .map((word) => word.trim())\n .filter((word) => word.length > 1 && !STOP_WORDS.has(word));\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 { SkillAliases } from \"../types/config\";\nimport { unique } from \"./text\";\n\nexport function normalizeSkill(skill: string, aliases: SkillAliases): string {\n const normalized = skill.trim().toLowerCase();\n for (const [canonical, aliasList] of Object.entries(aliases)) {\n if (canonical.toLowerCase() === normalized) {\n return canonical.toLowerCase();\n }\n if (aliasList.some((alias) => alias.toLowerCase() === normalized)) {\n return canonical.toLowerCase();\n }\n }\n return normalized;\n}\n\nexport function normalizeSkills(skills: string[], aliases: SkillAliases): string[] {\n return unique(skills.map((skill) => normalizeSkill(skill, aliases)));\n}\n\nexport function expandAliases(skills: string[], aliases: SkillAliases): string[] {\n const expanded: string[] = [];\n for (const skill of skills) {\n const canonical = normalizeSkill(skill, aliases);\n expanded.push(canonical);\n const aliasList = aliases[canonical];\n if (aliasList) {\n expanded.push(...aliasList.map((alias) => alias.toLowerCase()));\n }\n }\n return unique(expanded);\n}\n\nexport function skillMatched(candidate: string, targetSkills: Set<string>, aliases: SkillAliases): boolean {\n const normalizedCandidate = normalizeSkill(candidate, aliases);\n if (targetSkills.has(normalizedCandidate)) {\n return true;\n }\n for (const alias of Object.values(aliases)) {\n if (alias.map((value) => value.toLowerCase()).includes(normalizedCandidate)) {\n return true;\n }\n }\n return false;\n}\n","import { ResolvedATSConfig } from \"../../types/config\";\nimport { ParsedJobDescription } from \"../../types/parser\";\nimport { normalizeForComparison, normalizeWhitespace, splitLines, tokenize, unique } from \"../../utils/text\";\nimport { normalizeSkills } from \"../../utils/skills\";\n\nconst DEGREE_KEYWORDS = [\n \"bachelor\",\n \"b.s\",\n \"bs\",\n \"bsc\",\n \"master\",\n \"m.s\",\n \"ms\",\n \"msc\",\n \"phd\",\n \"doctorate\",\n \"mba\",\n \"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(...line.split(/[,.;•-]/));\n }\n }\n return required.map((value) => value.trim()).filter(Boolean);\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(...line.split(/[,.;•-]/));\n }\n }\n return preferred.map((value) => value.trim()).filter(Boolean);\n}\n\nfunction extractRoleKeywords(text: string): string[] {\n const roleMatch = text.match(/(engineer|developer|manager|scientist|analyst|designer|architect)/i);\n const titleTokens = roleMatch ? roleMatch[0].split(/\\s+/) : [];\n return unique(tokenize(titleTokens.join(\" \") || text.split(/\\n/)[0] || \"\"));\n}\n\nfunction extractMinExperience(text: string): number | undefined {\n const match = text.match(/(\\d{1,2})\\+?\\s+(?:years|yrs)/i);\n if (match) {\n return Number.parseInt(match[1], 10);\n }\n return undefined;\n}\n\nfunction extractEducationRequirements(text: string): string[] {\n const normalized = normalizeForComparison(text);\n return DEGREE_KEYWORDS.filter((degree) => normalized.includes(degree));\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 const requiredSkillsRaw = extractRequiredSkills(lines);\n const preferredSkillsRaw = extractPreferredSkills(lines);\n\n const requiredSkills = normalizeSkills(requiredSkillsRaw, config.skillAliases);\n const preferredSkills = normalizeSkills(preferredSkillsRaw, config.skillAliases);\n const keywords = unique([...requiredSkills, ...preferredSkills, ...tokenize(normalizedText)]);\n\n return {\n raw: jobDescription,\n normalizedText,\n requiredSkills,\n preferredSkills,\n roleKeywords: extractRoleKeywords(jobDescription),\n keywords,\n minExperienceYears: extractMinExperience(jobDescription),\n educationRequirements: extractEducationRequirements(jobDescription),\n };\n}\n","import { ParsedDateRange } from \"../types/parser\";\n\nconst MONTHS: Record<string, number> = {\n jan: 1,\n january: 1,\n feb: 2,\n february: 2,\n mar: 3,\n march: 3,\n apr: 4,\n april: 4,\n may: 5,\n jun: 6,\n june: 6,\n jul: 7,\n july: 7,\n aug: 8,\n august: 8,\n sep: 9,\n sept: 9,\n september: 9,\n oct: 10,\n october: 10,\n nov: 11,\n november: 11,\n dec: 12,\n december: 12,\n};\n\ninterface ParsedDateToken {\n year: number;\n month?: number;\n}\n\nfunction parseDateToken(raw: string): ParsedDateToken | null {\n const cleaned = raw.trim().toLowerCase();\n const monthMatch = cleaned.match(/([a-z]{3,9})\\s*(\\d{4})/i);\n if (monthMatch) {\n const monthName = monthMatch[1].toLowerCase();\n const year = Number.parseInt(monthMatch[2], 10);\n const month = MONTHS[monthName];\n if (!Number.isNaN(year)) {\n return { year, month };\n }\n }\n 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): ParsedDateRange | null {\n const normalized = text.trim();\n const rangeMatch = normalized.match(/([A-Za-z]{3,9}\\s+\\d{4}|\\d{4})\\s*(?:-|to|–|—)\\s*(Present|Current|Now|[A-Za-z]{3,9}\\s+\\d{4}|\\d{4})/i);\n if (!rangeMatch) {\n return null;\n }\n const startToken = parseDateToken(rangeMatch[1]);\n const endRaw = rangeMatch[2];\n const isPresent = /present|current|now/i.test(endRaw);\n const endToken = isPresent ? undefined : parseDateToken(endRaw);\n if (!startToken) {\n return null;\n }\n const endTokenResolved: ParsedDateToken = endToken ?? {\n year: new Date().getFullYear(),\n month: new Date().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 };\n}\n\nexport function sumExperienceYears(ranges: ParsedDateRange[]): number {\n const months = ranges\n .map((range) => range.durationInMonths ?? 0)\n .reduce((total, value) => total + value, 0);\n return Number((months / 12).toFixed(2));\n}\n","import { ResolvedATSConfig } from \"../../types/config\";\nimport { ParsedExperienceEntry, ParsedResume, ResumeSection } from \"../../types/parser\";\nimport { parseDateRange, sumExperienceYears } from \"../../utils/dates\";\nimport {\n normalizeForComparison,\n normalizeWhitespace,\n splitLines,\n tokenize,\n unique,\n} from \"../../utils/text\";\nimport { normalizeSkills } from \"../../utils/skills\";\n\nconst SECTION_ALIASES: Record<ResumeSection, string[]> = {\n summary: [\"summary\", \"profile\", \"about\"],\n experience: [\"experience\", \"work experience\", \"professional experience\", \"employment\"],\n skills: [\"skills\", \"technical skills\", \"technologies\"],\n education: [\"education\", \"academics\", \"academic background\"],\n projects: [\"projects\", \"portfolio\"],\n certifications: [\"certifications\", \"licenses\"]\n};\n\nconst ACTION_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\nfunction detectSection(line: string): ResumeSection | null {\n const normalized = line.toLowerCase();\n for (const [section, aliases] of Object.entries(SECTION_ALIASES)) {\n for (const alias of aliases) {\n const headerPattern = new RegExp(`^${alias}(\\s*:)?$`, \"i\");\n if (headerPattern.test(normalized)) {\n return section as ResumeSection;\n }\n }\n }\n return null;\n}\n\nfunction extractSections(text: string): {\n sections: Partial<Record<ResumeSection, string>>;\n detected: ResumeSection[];\n} {\n const lines = splitLines(text);\n const sections: Partial<Record<ResumeSection, string>> = {};\n const detected: ResumeSection[] = [];\n let current: ResumeSection | null = null;\n const buffer: string[] = [];\n\n const flush = () => {\n if (current) {\n sections[current] = buffer.join(\"\\n\").trim();\n buffer.length = 0;\n }\n };\n\n for (const line of lines) {\n const maybeSection = detectSection(line);\n if (maybeSection) {\n flush();\n current = maybeSection;\n detected.push(maybeSection);\n continue;\n }\n buffer.push(line);\n }\n flush();\n return { sections, detected: unique(detected) as ResumeSection[] };\n}\n\nfunction parseSkills(sectionContent: string | undefined, aliases: ResolvedATSConfig[\"skillAliases\"]): string[] {\n if (!sectionContent) return [];\n const raw = sectionContent\n .split(/[,;\\n]/)\n .map((skill) => skill.trim())\n .filter(Boolean);\n return normalizeSkills(raw, aliases);\n}\n\nfunction parseActionVerbs(text: string): string[] {\n const words = tokenize(text);\n return ACTION_VERBS.filter((verb) => words.includes(verb));\n}\n\nfunction parseExperience(sectionContent: string | undefined): {\n entries: ParsedExperienceEntry[];\n rangesInMonths: number[];\n jobTitles: string[];\n} {\n if (!sectionContent) {\n return { entries: [], rangesInMonths: [], jobTitles: [] };\n }\n const lines = splitLines(sectionContent);\n const entries: ParsedExperienceEntry[] = [];\n const rangesInMonths: number[] = [];\n const jobTitles: string[] = [];\n\n for (const line of lines) {\n const range = parseDateRange(line);\n if (range) {\n const previous = entries[entries.length - 1];\n if (previous && !previous.dates) {\n previous.dates = range;\n } else {\n entries.push({ dates: range });\n }\n if (range.durationInMonths) {\n rangesInMonths.push(range.durationInMonths);\n }\n continue;\n }\n\n const titleMatch = line.match(/^(Senior|Lead|Principal|Staff|Software|Full\\s*Stack|Frontend|Backend|Engineer|Developer|Manager|Analyst)[^,-]*/i);\n if (titleMatch) {\n const title = titleMatch[0].trim();\n jobTitles.push(title.toLowerCase());\n const entry: ParsedExperienceEntry = { title, description: line };\n entries.push(entry);\n 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 }\n\n return { entries, rangesInMonths, jobTitles: unique(jobTitles) };\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);\n const educationEntries = parseEducation(sections.education);\n const totalExperienceYears = sumExperienceYears(\n experienceData.entries\n .map((entry) => entry.dates)\n .filter((range): range is NonNullable<typeof range> => Boolean(range))\n );\n\n const requiredSections: ResumeSection[] = [\"summary\", \"experience\", \"skills\", \"education\"];\n const warnings: string[] = [];\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,\n educationEntries,\n experience: experienceData.entries,\n totalExperienceYears,\n keywords: collectKeywords(normalizedText),\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 } from \"../../types/scoring\";\nimport { ResolvedATSConfig } from \"../../types/config\";\nimport { clamp, countFrequencies, tokenize, unique } from \"../../utils/text\";\nimport { normalizeSkills } from \"../../utils/skills\";\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\ninterface ScoringArtifacts {\n matchedKeywords: string[];\n missingKeywords: string[];\n overusedKeywords: string[];\n}\n\nexport interface ScoreComputation extends ATSAnalysisResult {\n missingSkills: string[];\n missingExperienceYears: number;\n educationScore: number;\n}\n\nfunction scoreSkills(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): { score: number; 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 missing = [...required].filter((skill) => !resumeSkills.has(skill));\n return { score, 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\nfunction scoreKeywords(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): { score: number } & ScoringArtifacts {\n const jobKeywordSet = new Set(job.keywords.map((value) => value.toLowerCase()));\n if (jobKeywordSet.size === 0) {\n return { score: 100, matchedKeywords: [], missingKeywords: [], overusedKeywords: [] };\n }\n\n const resumeTokens = tokenize(resume.normalizedText);\n const resumeTokenSet = new Set(resumeTokens);\n const matchedKeywords = [...jobKeywordSet].filter((keyword) => resumeTokenSet.has(keyword));\n const missingKeywords = [...jobKeywordSet].filter((keyword) => !resumeTokenSet.has(keyword));\n\n const coverage = matchedKeywords.length / jobKeywordSet.size;\n const score = clamp(coverage * 100, 0, 100);\n\n const frequencies = countFrequencies(resumeTokens);\n const totalTokens = resumeTokens.length || 1;\n const overusedKeywords = matchedKeywords.filter((keyword) => {\n const density = (frequencies[keyword] ?? 0) / totalTokens;\n return density > config.keywordDensity.max;\n });\n\n return {\n score,\n matchedKeywords: unique(matchedKeywords),\n missingKeywords: unique(missingKeywords),\n overusedKeywords: unique(overusedKeywords),\n };\n}\n\nfunction scoreEducation(resume: ParsedResume, job: ParsedJobDescription): number {\n if (job.educationRequirements.length === 0) {\n return 100;\n }\n const resumeEducationText = resume.educationEntries.join(\" \");\n const normalizedEducation = resumeEducationText.toLowerCase();\n const matched = job.educationRequirements.filter((requirement) =>\n normalizedEducation.includes(requirement.toLowerCase())\n );\n if (matched.length === 0) {\n return 0;\n }\n return clamp((matched.length / job.educationRequirements.length) * 100, 0, 100);\n}\n\nexport function calculateScore(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): ScoreComputation {\n const skillsResult = scoreSkills(resume, job, config);\n const experienceResult = scoreExperience(resume, job, config);\n const keywordResult = scoreKeywords(resume, job, config);\n const educationScore = scoreEducation(resume, job);\n\n const breakdown: ATSBreakdown = {\n skills: skillsResult.score,\n experience: experienceResult.score,\n keywords: keywordResult.score,\n education: educationScore,\n };\n\n const weightedScore =\n breakdown.skills * config.weights.skills +\n breakdown.experience * config.weights.experience +\n breakdown.keywords * config.weights.keywords +\n breakdown.education * config.weights.education;\n\n return {\n score: clamp(Number(weightedScore.toFixed(2)), 0, 100),\n breakdown,\n matchedKeywords: keywordResult.matchedKeywords,\n missingKeywords: keywordResult.missingKeywords,\n overusedKeywords: keywordResult.overusedKeywords,\n suggestions: [],\n warnings: [],\n missingSkills: skillsResult.missing,\n missingExperienceYears: experienceResult.missingYears,\n educationScore,\n };\n}\n","import { ATSProfile, SkillAliases } from \"../types/config\";\n\nexport const defaultSkillAliases: SkillAliases = {\n javascript: [\"js\", \"node\", \"node.js\", \"nodejs\"],\n typescript: [\"ts\"],\n react: [\"reactjs\", \"react.js\"],\n \"c++\": [\"cpp\"],\n \"c#\": [\"csharp\"],\n python: [\"py\"],\n sql: [\"postgres\", \"mysql\", \"sqlite\"],\n graphql: [\"gql\"],\n aws: [\"amazon web services\"],\n azure: [\"microsoft azure\"],\n gcp: [\"google cloud\", \"google cloud platform\"],\n docker: [\"containers\"],\n kubernetes: [\"k8s\"],\n html: [\"html5\"],\n css: [\"css3\"],\n};\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 { defaultSkillAliases, softwareEngineerProfile } from \"../../profiles\";\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 return { ...weights, normalizedTotal: 1 };\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 resolved: ResolvedATSConfig = {\n weights: normalizeWeights(weights),\n skillAliases: { ...defaultSkillAliases, ...(config.skillAliases ?? {}) },\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 };\n\n return resolved;\n}\n","import { ParsedJobDescription, ParsedResume } from \"../../types/parser\";\nimport { ATSAnalysisResult } from \"../../types/scoring\";\nimport { ScoreComputation } from \"../scoring/scorer\";\n\ninterface SuggestionInput {\n resume: ParsedResume;\n job: ParsedJobDescription;\n score: ScoreComputation;\n ruleWarnings: string[];\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\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 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 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","/**\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\";\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 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 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 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\n const response = await Promise.race([\n 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 this.createTimeout(this.timeoutMs),\n ]) as { content: unknown; usage?: { total_tokens?: number } };\n\n // Validate response structure\n if (!response || !response.content) {\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 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 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 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 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 * Create a timeout promise\n */\n private createTimeout<T>(ms: number): Promise<T> {\n return new Promise((_, reject) => {\n const handle = globalThis.setTimeout(() => reject(new Error(`LLM call timeout after ${ms}ms`)), ms);\n // Ensure we can cancel if needed\n void handle;\n });\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 private validateAgainstSchema(data: unknown, schema: JSONSchema): boolean {\n if (typeof data !== \"object\" || data === null) {\n return false;\n }\n\n const obj = data as Record<string, unknown>;\n\n if (schema.required) {\n for (const field of schema.required) {\n if (!(field in obj)) {\n return false;\n }\n }\n }\n\n return true;\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 */\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\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 { defaultProfiles, defaultSkillAliases } from \"./profiles\";\nimport { LLMManager, LLMSchemas, LLMPrompts, adaptSuggestionEnhancementResponse } from \"./llm\";\n\nexport * from \"./types\";\nexport { defaultProfiles, defaultSkillAliases };\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 });\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 matchedKeywords: scoring.matchedKeywords,\n missingKeywords: scoring.missingKeywords,\n overusedKeywords: scoring.overusedKeywords,\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 * Async version: Analyze a resume with full LLM support\n * This version properly handles async LLM calls\n *\n * @param input Resume, job description, and optional LLM config\n * @returns Promise<ATSAnalysisResult>\n *\n * @example\n * const result = await analyzeResumeAsync({\n * resumeText,\n * jobDescription,\n * llm: { client, limits: {...}, enable: { suggestions: true } }\n * });\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 });\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 matchedKeywords: scoring.matchedKeywords,\n missingKeywords: scoring.missingKeywords,\n overusedKeywords: scoring.overusedKeywords,\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pranavraut033/ats-checker",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Deterministic, configurable ATS compatibility checker with no external dependencies.",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",