hirebase-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +133 -0
- package/dist/application/dto/candidate-summary.d.ts +10 -0
- package/dist/application/dto/candidate-summary.js +2 -0
- package/dist/application/dto/candidate-summary.js.map +1 -0
- package/dist/application/dto/extracted-cv.d.ts +43 -0
- package/dist/application/dto/extracted-cv.js +2 -0
- package/dist/application/dto/extracted-cv.js.map +1 -0
- package/dist/application/dto/filter-input.d.ts +7 -0
- package/dist/application/dto/filter-input.js +2 -0
- package/dist/application/dto/filter-input.js.map +1 -0
- package/dist/application/dto/index.d.ts +5 -0
- package/dist/application/dto/index.js +2 -0
- package/dist/application/dto/index.js.map +1 -0
- package/dist/application/dto/search-results.d.ts +13 -0
- package/dist/application/dto/search-results.js +2 -0
- package/dist/application/dto/search-results.js.map +1 -0
- package/dist/application/dto/stats.d.ts +8 -0
- package/dist/application/dto/stats.js +2 -0
- package/dist/application/dto/stats.js.map +1 -0
- package/dist/application/ports/document-parser.d.ts +8 -0
- package/dist/application/ports/document-parser.js +2 -0
- package/dist/application/ports/document-parser.js.map +1 -0
- package/dist/application/ports/embedding-service.d.ts +4 -0
- package/dist/application/ports/embedding-service.js +2 -0
- package/dist/application/ports/embedding-service.js.map +1 -0
- package/dist/application/ports/export-service.d.ts +5 -0
- package/dist/application/ports/export-service.js +2 -0
- package/dist/application/ports/export-service.js.map +1 -0
- package/dist/application/ports/index.d.ts +4 -0
- package/dist/application/ports/index.js +2 -0
- package/dist/application/ports/index.js.map +1 -0
- package/dist/application/ports/structured-extractor.d.ts +4 -0
- package/dist/application/ports/structured-extractor.js +2 -0
- package/dist/application/ports/structured-extractor.js.map +1 -0
- package/dist/application/use-cases/add-cv.d.ts +15 -0
- package/dist/application/use-cases/add-cv.js +88 -0
- package/dist/application/use-cases/add-cv.js.map +1 -0
- package/dist/application/use-cases/bulk-add-cvs.d.ts +14 -0
- package/dist/application/use-cases/bulk-add-cvs.js +32 -0
- package/dist/application/use-cases/bulk-add-cvs.js.map +1 -0
- package/dist/application/use-cases/delete-cv.d.ts +10 -0
- package/dist/application/use-cases/delete-cv.js +21 -0
- package/dist/application/use-cases/delete-cv.js.map +1 -0
- package/dist/application/use-cases/export-results.d.ts +9 -0
- package/dist/application/use-cases/export-results.js +21 -0
- package/dist/application/use-cases/export-results.js.map +1 -0
- package/dist/application/use-cases/filter-candidates.d.ts +9 -0
- package/dist/application/use-cases/filter-candidates.js +51 -0
- package/dist/application/use-cases/filter-candidates.js.map +1 -0
- package/dist/application/use-cases/get-cv-chunks.d.ts +15 -0
- package/dist/application/use-cases/get-cv-chunks.js +18 -0
- package/dist/application/use-cases/get-cv-chunks.js.map +1 -0
- package/dist/application/use-cases/get-cv-detail.d.ts +7 -0
- package/dist/application/use-cases/get-cv-detail.js +15 -0
- package/dist/application/use-cases/get-cv-detail.js.map +1 -0
- package/dist/application/use-cases/get-cv-versions.d.ts +9 -0
- package/dist/application/use-cases/get-cv-versions.js +18 -0
- package/dist/application/use-cases/get-cv-versions.js.map +1 -0
- package/dist/application/use-cases/get-stats.d.ts +9 -0
- package/dist/application/use-cases/get-stats.js +42 -0
- package/dist/application/use-cases/get-stats.js.map +1 -0
- package/dist/application/use-cases/index.d.ts +13 -0
- package/dist/application/use-cases/index.js +14 -0
- package/dist/application/use-cases/index.js.map +1 -0
- package/dist/application/use-cases/list-cvs.d.ts +8 -0
- package/dist/application/use-cases/list-cvs.js +20 -0
- package/dist/application/use-cases/list-cvs.js.map +1 -0
- package/dist/application/use-cases/manage-tags.d.ts +7 -0
- package/dist/application/use-cases/manage-tags.js +36 -0
- package/dist/application/use-cases/manage-tags.js.map +1 -0
- package/dist/application/use-cases/semantic-search.d.ts +11 -0
- package/dist/application/use-cases/semantic-search.js +40 -0
- package/dist/application/use-cases/semantic-search.js.map +1 -0
- package/dist/application/use-cases/update-cv.d.ts +17 -0
- package/dist/application/use-cases/update-cv.js +94 -0
- package/dist/application/use-cases/update-cv.js.map +1 -0
- package/dist/domain/entities/candidate.d.ts +22 -0
- package/dist/domain/entities/candidate.js +2 -0
- package/dist/domain/entities/candidate.js.map +1 -0
- package/dist/domain/entities/cv-chunk.d.ts +10 -0
- package/dist/domain/entities/cv-chunk.js +2 -0
- package/dist/domain/entities/cv-chunk.js.map +1 -0
- package/dist/domain/entities/cv-version.d.ts +7 -0
- package/dist/domain/entities/cv-version.js +2 -0
- package/dist/domain/entities/cv-version.js.map +1 -0
- package/dist/domain/entities/index.d.ts +3 -0
- package/dist/domain/entities/index.js +2 -0
- package/dist/domain/entities/index.js.map +1 -0
- package/dist/domain/repositories/candidate-repository.d.ts +12 -0
- package/dist/domain/repositories/candidate-repository.js +2 -0
- package/dist/domain/repositories/candidate-repository.js.map +1 -0
- package/dist/domain/repositories/chunk-repository.d.ts +13 -0
- package/dist/domain/repositories/chunk-repository.js +2 -0
- package/dist/domain/repositories/chunk-repository.js.map +1 -0
- package/dist/domain/repositories/index.d.ts +3 -0
- package/dist/domain/repositories/index.js +2 -0
- package/dist/domain/repositories/index.js.map +1 -0
- package/dist/domain/repositories/version-repository.d.ts +6 -0
- package/dist/domain/repositories/version-repository.js +2 -0
- package/dist/domain/repositories/version-repository.js.map +1 -0
- package/dist/domain/value-objects/certification.d.ts +5 -0
- package/dist/domain/value-objects/certification.js +2 -0
- package/dist/domain/value-objects/certification.js.map +1 -0
- package/dist/domain/value-objects/contact-info.d.ts +5 -0
- package/dist/domain/value-objects/contact-info.js +2 -0
- package/dist/domain/value-objects/contact-info.js.map +1 -0
- package/dist/domain/value-objects/education.d.ts +7 -0
- package/dist/domain/value-objects/education.js +2 -0
- package/dist/domain/value-objects/education.js.map +1 -0
- package/dist/domain/value-objects/experience.d.ts +7 -0
- package/dist/domain/value-objects/experience.js +2 -0
- package/dist/domain/value-objects/experience.js.map +1 -0
- package/dist/domain/value-objects/index.d.ts +7 -0
- package/dist/domain/value-objects/index.js +2 -0
- package/dist/domain/value-objects/index.js.map +1 -0
- package/dist/domain/value-objects/language.d.ts +4 -0
- package/dist/domain/value-objects/language.js +2 -0
- package/dist/domain/value-objects/language.js.map +1 -0
- package/dist/domain/value-objects/links.d.ts +6 -0
- package/dist/domain/value-objects/links.js +2 -0
- package/dist/domain/value-objects/links.js.map +1 -0
- package/dist/domain/value-objects/project.d.ts +5 -0
- package/dist/domain/value-objects/project.js +2 -0
- package/dist/domain/value-objects/project.js.map +1 -0
- package/dist/infrastructure/ai/index.d.ts +2 -0
- package/dist/infrastructure/ai/index.js +3 -0
- package/dist/infrastructure/ai/index.js.map +1 -0
- package/dist/infrastructure/ai/openai-embedding-service.d.ts +8 -0
- package/dist/infrastructure/ai/openai-embedding-service.js +39 -0
- package/dist/infrastructure/ai/openai-embedding-service.js.map +1 -0
- package/dist/infrastructure/ai/openai-structured-extractor.d.ts +9 -0
- package/dist/infrastructure/ai/openai-structured-extractor.js +117 -0
- package/dist/infrastructure/ai/openai-structured-extractor.js.map +1 -0
- package/dist/infrastructure/config/app-config.d.ts +7 -0
- package/dist/infrastructure/config/app-config.js +13 -0
- package/dist/infrastructure/config/app-config.js.map +1 -0
- package/dist/infrastructure/export/csv-export-service.d.ts +6 -0
- package/dist/infrastructure/export/csv-export-service.js +24 -0
- package/dist/infrastructure/export/csv-export-service.js.map +1 -0
- package/dist/infrastructure/parsers/docx-parser.d.ts +5 -0
- package/dist/infrastructure/parsers/docx-parser.js +17 -0
- package/dist/infrastructure/parsers/docx-parser.js.map +1 -0
- package/dist/infrastructure/parsers/index.d.ts +2 -0
- package/dist/infrastructure/parsers/index.js +3 -0
- package/dist/infrastructure/parsers/index.js.map +1 -0
- package/dist/infrastructure/parsers/pdf-parser.d.ts +5 -0
- package/dist/infrastructure/parsers/pdf-parser.js +20 -0
- package/dist/infrastructure/parsers/pdf-parser.js.map +1 -0
- package/dist/infrastructure/persistence/database.d.ts +12 -0
- package/dist/infrastructure/persistence/database.js +77 -0
- package/dist/infrastructure/persistence/database.js.map +1 -0
- package/dist/infrastructure/persistence/index.d.ts +4 -0
- package/dist/infrastructure/persistence/index.js +5 -0
- package/dist/infrastructure/persistence/index.js.map +1 -0
- package/dist/infrastructure/persistence/lancedb-candidate-repository.d.ts +20 -0
- package/dist/infrastructure/persistence/lancedb-candidate-repository.js +158 -0
- package/dist/infrastructure/persistence/lancedb-candidate-repository.js.map +1 -0
- package/dist/infrastructure/persistence/lancedb-chunk-repository.d.ts +17 -0
- package/dist/infrastructure/persistence/lancedb-chunk-repository.js +102 -0
- package/dist/infrastructure/persistence/lancedb-chunk-repository.js.map +1 -0
- package/dist/infrastructure/persistence/lancedb-version-repository.d.ts +12 -0
- package/dist/infrastructure/persistence/lancedb-version-repository.js +59 -0
- package/dist/infrastructure/persistence/lancedb-version-repository.js.map +1 -0
- package/dist/interface/cli/index.d.ts +2 -0
- package/dist/interface/cli/index.js +14 -0
- package/dist/interface/cli/index.js.map +1 -0
- package/dist/interface/mcp/server.d.ts +2 -0
- package/dist/interface/mcp/server.js +63 -0
- package/dist/interface/mcp/server.js.map +1 -0
- package/dist/interface/mcp/tools/add-cv.d.ts +3 -0
- package/dist/interface/mcp/tools/add-cv.js +20 -0
- package/dist/interface/mcp/tools/add-cv.js.map +1 -0
- package/dist/interface/mcp/tools/bulk-add-cvs.d.ts +3 -0
- package/dist/interface/mcp/tools/bulk-add-cvs.js +28 -0
- package/dist/interface/mcp/tools/bulk-add-cvs.js.map +1 -0
- package/dist/interface/mcp/tools/delete-cv.d.ts +3 -0
- package/dist/interface/mcp/tools/delete-cv.js +20 -0
- package/dist/interface/mcp/tools/delete-cv.js.map +1 -0
- package/dist/interface/mcp/tools/export-results.d.ts +3 -0
- package/dist/interface/mcp/tools/export-results.js +23 -0
- package/dist/interface/mcp/tools/export-results.js.map +1 -0
- package/dist/interface/mcp/tools/filter-candidates.d.ts +3 -0
- package/dist/interface/mcp/tools/filter-candidates.js +32 -0
- package/dist/interface/mcp/tools/filter-candidates.js.map +1 -0
- package/dist/interface/mcp/tools/get-cv-chunks.d.ts +3 -0
- package/dist/interface/mcp/tools/get-cv-chunks.js +26 -0
- package/dist/interface/mcp/tools/get-cv-chunks.js.map +1 -0
- package/dist/interface/mcp/tools/get-cv-detail.d.ts +3 -0
- package/dist/interface/mcp/tools/get-cv-detail.js +20 -0
- package/dist/interface/mcp/tools/get-cv-detail.js.map +1 -0
- package/dist/interface/mcp/tools/get-cv-versions.d.ts +3 -0
- package/dist/interface/mcp/tools/get-cv-versions.js +20 -0
- package/dist/interface/mcp/tools/get-cv-versions.js.map +1 -0
- package/dist/interface/mcp/tools/get-stats.d.ts +3 -0
- package/dist/interface/mcp/tools/get-stats.js +19 -0
- package/dist/interface/mcp/tools/get-stats.js.map +1 -0
- package/dist/interface/mcp/tools/list-cvs.d.ts +3 -0
- package/dist/interface/mcp/tools/list-cvs.js +32 -0
- package/dist/interface/mcp/tools/list-cvs.js.map +1 -0
- package/dist/interface/mcp/tools/manage-tags.d.ts +3 -0
- package/dist/interface/mcp/tools/manage-tags.js +24 -0
- package/dist/interface/mcp/tools/manage-tags.js.map +1 -0
- package/dist/interface/mcp/tools/semantic-search.d.ts +3 -0
- package/dist/interface/mcp/tools/semantic-search.js +27 -0
- package/dist/interface/mcp/tools/semantic-search.js.map +1 -0
- package/dist/interface/mcp/tools/update-cv.d.ts +3 -0
- package/dist/interface/mcp/tools/update-cv.js +23 -0
- package/dist/interface/mcp/tools/update-cv.js.map +1 -0
- package/dist/interface/mcp/types.d.ts +16 -0
- package/dist/interface/mcp/types.js +2 -0
- package/dist/interface/mcp/types.js.map +1 -0
- package/dist/shared/errors/index.d.ts +32 -0
- package/dist/shared/errors/index.js +56 -0
- package/dist/shared/errors/index.js.map +1 -0
- package/dist/shared/types/index.d.ts +19 -0
- package/dist/shared/types/index.js +2 -0
- package/dist/shared/types/index.js.map +1 -0
- package/dist/shared/utils/chunking.d.ts +3 -0
- package/dist/shared/utils/chunking.js +89 -0
- package/dist/shared/utils/chunking.js.map +1 -0
- package/dist/shared/utils/index.d.ts +2 -0
- package/dist/shared/utils/index.js +3 -0
- package/dist/shared/utils/index.js.map +1 -0
- package/dist/shared/utils/text.d.ts +5 -0
- package/dist/shared/utils/text.js +21 -0
- package/dist/shared/utils/text.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-results.js","sourceRoot":"","sources":["../../../../src/interface/mcp/tools/export-results.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAC;AAIxF,MAAM,UAAU,yBAAyB,CAAC,MAAiB,EAAE,IAAkB;IAC7E,MAAM,OAAO,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAEjF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,8CAA8C,EAC9C;QACE,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAC9E,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;KAC1D,EACD,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,MAAsB,CAAC,CAAC;YAC5E,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aACnD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC/F,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { FilterCandidatesUseCase } from '../../../application/use-cases/filter-candidates.js';
|
|
3
|
+
export function registerFilterCandidatesTool(server, deps) {
|
|
4
|
+
const useCase = new FilterCandidatesUseCase(deps.candidateRepo);
|
|
5
|
+
server.tool('filter_candidates', 'Filter candidates using structured criteria like skills, location, experience years, languages, and tags.', {
|
|
6
|
+
skills: z.array(z.string()).optional().describe('Required skills to filter by'),
|
|
7
|
+
location: z.string().optional().describe('Location to filter by (partial match)'),
|
|
8
|
+
min_experience_years: z.number().optional().describe('Minimum years of experience'),
|
|
9
|
+
languages: z.array(z.string()).optional().describe('Required languages'),
|
|
10
|
+
tags: z.array(z.string()).optional().describe('Required tags'),
|
|
11
|
+
}, async ({ skills, location, min_experience_years, languages, tags }) => {
|
|
12
|
+
try {
|
|
13
|
+
const results = await useCase.execute({
|
|
14
|
+
skills,
|
|
15
|
+
location,
|
|
16
|
+
minExperienceYears: min_experience_years,
|
|
17
|
+
languages,
|
|
18
|
+
tags,
|
|
19
|
+
});
|
|
20
|
+
return {
|
|
21
|
+
content: [{ type: 'text', text: JSON.stringify(results, null, 2) }],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
return {
|
|
26
|
+
content: [{ type: 'text', text: JSON.stringify({ error: error.message }) }],
|
|
27
|
+
isError: true,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=filter-candidates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-candidates.js","sourceRoot":"","sources":["../../../../src/interface/mcp/tools/filter-candidates.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAC;AAG9F,MAAM,UAAU,4BAA4B,CAAC,MAAiB,EAAE,IAAkB;IAChF,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAEhE,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,2GAA2G,EAC3G;QACE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC/E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QACjF,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACnF,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QACxE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KAC/D,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;QACpE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;gBACpC,MAAM;gBACN,QAAQ;gBACR,kBAAkB,EAAE,oBAAoB;gBACxC,SAAS;gBACT,IAAI;aACL,CAAC,CAAC;YACH,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC7E,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC/F,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { GetCvChunksUseCase } from '../../../application/use-cases/get-cv-chunks.js';
|
|
3
|
+
export function registerGetCvChunksTool(server, deps) {
|
|
4
|
+
const useCase = new GetCvChunksUseCase(deps.chunkRepo);
|
|
5
|
+
server.tool('get_cv_chunks', 'Get the text chunks (sections) of a specific candidate. Optionally filter by section type.', {
|
|
6
|
+
candidate_id: z.string().describe('ID of the candidate'),
|
|
7
|
+
section_type: z
|
|
8
|
+
.enum(['summary', 'experience', 'education', 'skills', 'projects', 'certifications', 'full'])
|
|
9
|
+
.optional()
|
|
10
|
+
.describe('Filter to a specific section type'),
|
|
11
|
+
}, async ({ candidate_id, section_type }) => {
|
|
12
|
+
try {
|
|
13
|
+
const chunks = await useCase.execute(candidate_id, section_type);
|
|
14
|
+
return {
|
|
15
|
+
content: [{ type: 'text', text: JSON.stringify(chunks, null, 2) }],
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
return {
|
|
20
|
+
content: [{ type: 'text', text: JSON.stringify({ error: error.message }) }],
|
|
21
|
+
isError: true,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=get-cv-chunks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-cv-chunks.js","sourceRoot":"","sources":["../../../../src/interface/mcp/tools/get-cv-chunks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AAIrF,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,IAAkB;IAC3E,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEvD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,4FAA4F,EAC5F;QACE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACxD,YAAY,EAAE,CAAC;aACZ,IAAI,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;aAC5F,QAAQ,EAAE;aACV,QAAQ,CAAC,mCAAmC,CAAC;KACjD,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,YAAuC,CAAC,CAAC;YAC5F,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC5E,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC/F,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { GetCvDetailUseCase } from '../../../application/use-cases/get-cv-detail.js';
|
|
3
|
+
export function registerGetCvDetailTool(server, deps) {
|
|
4
|
+
const useCase = new GetCvDetailUseCase(deps.candidateRepo);
|
|
5
|
+
server.tool('get_cv_detail', 'Get the full structured data of a specific candidate by their ID.', { candidate_id: z.string().describe('ID of the candidate') }, async ({ candidate_id }) => {
|
|
6
|
+
try {
|
|
7
|
+
const candidate = await useCase.execute(candidate_id);
|
|
8
|
+
return {
|
|
9
|
+
content: [{ type: 'text', text: JSON.stringify(candidate, null, 2) }],
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: 'text', text: JSON.stringify({ error: error.message }) }],
|
|
15
|
+
isError: true,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=get-cv-detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-cv-detail.js","sourceRoot":"","sources":["../../../../src/interface/mcp/tools/get-cv-detail.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AAGrF,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,IAAkB;IAC3E,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAE3D,MAAM,CAAC,IAAI,CACT,eAAe,EACf,mEAAmE,EACnE,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,EAC5D,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACtD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC/E,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC/F,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { GetCvVersionsUseCase } from '../../../application/use-cases/get-cv-versions.js';
|
|
3
|
+
export function registerGetCvVersionsTool(server, deps) {
|
|
4
|
+
const useCase = new GetCvVersionsUseCase(deps.candidateRepo, deps.versionRepo);
|
|
5
|
+
server.tool('get_cv_versions', 'Get the version history of a candidate. Shows previous versions of their CV data.', { candidate_id: z.string().describe('ID of the candidate') }, async ({ candidate_id }) => {
|
|
6
|
+
try {
|
|
7
|
+
const versions = await useCase.execute(candidate_id);
|
|
8
|
+
return {
|
|
9
|
+
content: [{ type: 'text', text: JSON.stringify(versions, null, 2) }],
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: 'text', text: JSON.stringify({ error: error.message }) }],
|
|
15
|
+
isError: true,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=get-cv-versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-cv-versions.js","sourceRoot":"","sources":["../../../../src/interface/mcp/tools/get-cv-versions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;AAGzF,MAAM,UAAU,yBAAyB,CAAC,MAAiB,EAAE,IAAkB;IAC7E,MAAM,OAAO,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAE/E,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,mFAAmF,EACnF,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,EAC5D,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACrD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC9E,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC/F,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { GetStatsUseCase } from '../../../application/use-cases/get-stats.js';
|
|
2
|
+
export function registerGetStatsTool(server, deps) {
|
|
3
|
+
const useCase = new GetStatsUseCase(deps.candidateRepo, deps.chunkRepo);
|
|
4
|
+
server.tool('get_stats', 'Get database statistics: total candidates, chunks, skill distribution, location counts, etc.', {}, async () => {
|
|
5
|
+
try {
|
|
6
|
+
const stats = await useCase.execute();
|
|
7
|
+
return {
|
|
8
|
+
content: [{ type: 'text', text: JSON.stringify(stats, null, 2) }],
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
return {
|
|
13
|
+
content: [{ type: 'text', text: JSON.stringify({ error: error.message }) }],
|
|
14
|
+
isError: true,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=get-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-stats.js","sourceRoot":"","sources":["../../../../src/interface/mcp/tools/get-stats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAG9E,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,IAAkB;IACxE,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAExE,MAAM,CAAC,IAAI,CACT,WAAW,EACX,8FAA8F,EAC9F,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACtC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC3E,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC/F,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { ListCvsUseCase } from '../../../application/use-cases/list-cvs.js';
|
|
3
|
+
export function registerListCvsTool(server, deps) {
|
|
4
|
+
const useCase = new ListCvsUseCase(deps.candidateRepo);
|
|
5
|
+
server.tool('list_cvs', 'List all candidates in the database with optional pagination and sorting.', {
|
|
6
|
+
offset: z.number().optional().describe('Number of records to skip (default: 0)'),
|
|
7
|
+
limit: z.number().optional().describe('Maximum number of records to return (default: 50)'),
|
|
8
|
+
sort_by: z
|
|
9
|
+
.enum(['name', 'created_at', 'updated_at', 'experience_years'])
|
|
10
|
+
.optional()
|
|
11
|
+
.describe('Field to sort by'),
|
|
12
|
+
sort_order: z.enum(['asc', 'desc']).optional().describe('Sort direction'),
|
|
13
|
+
}, async ({ offset, limit, sort_by, sort_order }) => {
|
|
14
|
+
try {
|
|
15
|
+
const pagination = { offset: offset ?? 0, limit: limit ?? 50 };
|
|
16
|
+
const sort = sort_by
|
|
17
|
+
? { field: sort_by, order: (sort_order ?? 'asc') }
|
|
18
|
+
: undefined;
|
|
19
|
+
const results = await useCase.execute(pagination, sort);
|
|
20
|
+
return {
|
|
21
|
+
content: [{ type: 'text', text: JSON.stringify(results, null, 2) }],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
return {
|
|
26
|
+
content: [{ type: 'text', text: JSON.stringify({ error: error.message }) }],
|
|
27
|
+
isError: true,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=list-cvs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-cvs.js","sourceRoot":"","sources":["../../../../src/interface/mcp/tools/list-cvs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAI5E,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,IAAkB;IACvE,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAEvD,MAAM,CAAC,IAAI,CACT,UAAU,EACV,2EAA2E,EAC3E;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;QAChF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QAC1F,OAAO,EAAE,CAAC;aACP,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC;aAC9D,QAAQ,EAAE;aACV,QAAQ,CAAC,kBAAkB,CAAC;QAC/B,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;KAC1E,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE;QAC/C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;YAC/D,MAAM,IAAI,GAAG,OAAO;gBAClB,CAAC,CAAC,EAAE,KAAK,EAAE,OAAoB,EAAE,KAAK,EAAE,CAAC,UAAU,IAAI,KAAK,CAAc,EAAE;gBAC5E,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACxD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC7E,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC/F,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { ManageTagsUseCase } from '../../../application/use-cases/manage-tags.js';
|
|
3
|
+
export function registerManageTagsTool(server, deps) {
|
|
4
|
+
const useCase = new ManageTagsUseCase(deps.candidateRepo);
|
|
5
|
+
server.tool('manage_tags', 'Add, remove, or list tags for a candidate. Tags can be used for filtering.', {
|
|
6
|
+
candidate_id: z.string().describe('ID of the candidate'),
|
|
7
|
+
action: z.enum(['add', 'remove', 'list']).describe('Tag action to perform'),
|
|
8
|
+
tags: z.array(z.string()).optional().describe('Tags to add or remove (not needed for list action)'),
|
|
9
|
+
}, async ({ candidate_id, action, tags }) => {
|
|
10
|
+
try {
|
|
11
|
+
const result = await useCase.execute(candidate_id, action, tags);
|
|
12
|
+
return {
|
|
13
|
+
content: [{ type: 'text', text: JSON.stringify({ tags: result }) }],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
return {
|
|
18
|
+
content: [{ type: 'text', text: JSON.stringify({ error: error.message }) }],
|
|
19
|
+
isError: true,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=manage-tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manage-tags.js","sourceRoot":"","sources":["../../../../src/interface/mcp/tools/manage-tags.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAIlF,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,IAAkB;IAC1E,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAE1D,MAAM,CAAC,IAAI,CACT,aAAa,EACb,4EAA4E,EAC5E;QACE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACxD,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC3E,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;KACpG,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,MAAmB,EAAE,IAAI,CAAC,CAAC;YAC9E,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;aAC7E,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC/F,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { SemanticSearchUseCase } from '../../../application/use-cases/semantic-search.js';
|
|
3
|
+
export function registerSemanticSearchTool(server, deps) {
|
|
4
|
+
const useCase = new SemanticSearchUseCase(deps.chunkRepo, deps.embeddingService, deps.candidateRepo);
|
|
5
|
+
server.tool('semantic_search', 'Search for candidates matching a text query using vector similarity. Returns ranked results with relevance scores.', {
|
|
6
|
+
query: z.string().describe('Search query text (e.g., job description or skill requirements)'),
|
|
7
|
+
limit: z.number().optional().describe('Maximum number of results (default: 10)'),
|
|
8
|
+
section_type: z
|
|
9
|
+
.enum(['summary', 'experience', 'education', 'skills', 'projects', 'certifications', 'full'])
|
|
10
|
+
.optional()
|
|
11
|
+
.describe('Filter results to a specific CV section type'),
|
|
12
|
+
}, async ({ query, limit, section_type }) => {
|
|
13
|
+
try {
|
|
14
|
+
const results = await useCase.execute({ query, limit, sectionType: section_type });
|
|
15
|
+
return {
|
|
16
|
+
content: [{ type: 'text', text: JSON.stringify(results, null, 2) }],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
return {
|
|
21
|
+
content: [{ type: 'text', text: JSON.stringify({ error: error.message }) }],
|
|
22
|
+
isError: true,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=semantic-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-search.js","sourceRoot":"","sources":["../../../../src/interface/mcp/tools/semantic-search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAC;AAG1F,MAAM,UAAU,0BAA0B,CAAC,MAAiB,EAAE,IAAkB;IAC9E,MAAM,OAAO,GAAG,IAAI,qBAAqB,CACvC,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,aAAa,CACnB,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,oHAAoH,EACpH;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iEAAiE,CAAC;QAC7F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QAChF,YAAY,EAAE,CAAC;aACZ,IAAI,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;aAC5F,QAAQ,EAAE;aACV,QAAQ,CAAC,8CAA8C,CAAC;KAC5D,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;YACnF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC7E,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC/F,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { UpdateCvUseCase } from '../../../application/use-cases/update-cv.js';
|
|
3
|
+
export function registerUpdateCvTool(server, deps) {
|
|
4
|
+
const useCase = new UpdateCvUseCase(deps.candidateRepo, deps.chunkRepo, deps.versionRepo, deps.parsers, deps.embeddingService, deps.extractor);
|
|
5
|
+
server.tool('update_cv', 'Update an existing CV with a new file. Archives the old version and replaces with new data.', {
|
|
6
|
+
candidate_id: z.string().describe('ID of the candidate to update'),
|
|
7
|
+
file_path: z.string().describe('Absolute path to the new CV file (PDF or DOCX)'),
|
|
8
|
+
}, async ({ candidate_id, file_path }) => {
|
|
9
|
+
try {
|
|
10
|
+
const candidate = await useCase.execute(candidate_id, file_path);
|
|
11
|
+
return {
|
|
12
|
+
content: [{ type: 'text', text: JSON.stringify(candidate, null, 2) }],
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
return {
|
|
17
|
+
content: [{ type: 'text', text: JSON.stringify({ error: error.message }) }],
|
|
18
|
+
isError: true,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=update-cv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-cv.js","sourceRoot":"","sources":["../../../../src/interface/mcp/tools/update-cv.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAG9E,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,IAAkB;IACxE,MAAM,OAAO,GAAG,IAAI,eAAe,CACjC,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,SAAS,CACf,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,WAAW,EACX,6FAA6F,EAC7F;QACE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAClE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;KACjF,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC/E,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC/F,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ICandidateRepository } from '../../domain/repositories/candidate-repository.js';
|
|
2
|
+
import type { IChunkRepository } from '../../domain/repositories/chunk-repository.js';
|
|
3
|
+
import type { IVersionRepository } from '../../domain/repositories/version-repository.js';
|
|
4
|
+
import type { IDocumentParser } from '../../application/ports/document-parser.js';
|
|
5
|
+
import type { IEmbeddingService } from '../../application/ports/embedding-service.js';
|
|
6
|
+
import type { IStructuredExtractor } from '../../application/ports/structured-extractor.js';
|
|
7
|
+
import type { IExportService } from '../../application/ports/export-service.js';
|
|
8
|
+
export interface Dependencies {
|
|
9
|
+
candidateRepo: ICandidateRepository;
|
|
10
|
+
chunkRepo: IChunkRepository;
|
|
11
|
+
versionRepo: IVersionRepository;
|
|
12
|
+
parsers: IDocumentParser[];
|
|
13
|
+
embeddingService: IEmbeddingService;
|
|
14
|
+
extractor: IStructuredExtractor;
|
|
15
|
+
exportService: IExportService;
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/interface/mcp/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare class AppError extends Error {
|
|
2
|
+
readonly code: string;
|
|
3
|
+
readonly cause?: unknown | undefined;
|
|
4
|
+
constructor(code: string, message: string, cause?: unknown | undefined);
|
|
5
|
+
}
|
|
6
|
+
export declare class CandidateNotFoundError extends AppError {
|
|
7
|
+
constructor(candidateId: string);
|
|
8
|
+
}
|
|
9
|
+
export declare class DuplicateCandidateError extends AppError {
|
|
10
|
+
constructor(identifier: string);
|
|
11
|
+
}
|
|
12
|
+
export declare class DocumentParseError extends AppError {
|
|
13
|
+
constructor(message: string, cause?: unknown);
|
|
14
|
+
}
|
|
15
|
+
export declare class EmbeddingError extends AppError {
|
|
16
|
+
constructor(message: string, cause?: unknown);
|
|
17
|
+
}
|
|
18
|
+
export declare class ExtractionError extends AppError {
|
|
19
|
+
constructor(message: string, cause?: unknown);
|
|
20
|
+
}
|
|
21
|
+
export declare class DatabaseError extends AppError {
|
|
22
|
+
constructor(message: string, cause?: unknown);
|
|
23
|
+
}
|
|
24
|
+
export declare class ValidationError extends AppError {
|
|
25
|
+
constructor(message: string);
|
|
26
|
+
}
|
|
27
|
+
export declare class FileNotFoundError extends AppError {
|
|
28
|
+
constructor(filePath: string);
|
|
29
|
+
}
|
|
30
|
+
export declare class UnsupportedFileTypeError extends AppError {
|
|
31
|
+
constructor(fileType: string);
|
|
32
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export class AppError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
cause;
|
|
4
|
+
constructor(code, message, cause) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.cause = cause;
|
|
8
|
+
this.name = this.constructor.name;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class CandidateNotFoundError extends AppError {
|
|
12
|
+
constructor(candidateId) {
|
|
13
|
+
super('CANDIDATE_NOT_FOUND', `Candidate not found: ${candidateId}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class DuplicateCandidateError extends AppError {
|
|
17
|
+
constructor(identifier) {
|
|
18
|
+
super('DUPLICATE_CANDIDATE', `Candidate already exists: ${identifier}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export class DocumentParseError extends AppError {
|
|
22
|
+
constructor(message, cause) {
|
|
23
|
+
super('DOCUMENT_PARSE_ERROR', message, cause);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class EmbeddingError extends AppError {
|
|
27
|
+
constructor(message, cause) {
|
|
28
|
+
super('EMBEDDING_ERROR', message, cause);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class ExtractionError extends AppError {
|
|
32
|
+
constructor(message, cause) {
|
|
33
|
+
super('EXTRACTION_ERROR', message, cause);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class DatabaseError extends AppError {
|
|
37
|
+
constructor(message, cause) {
|
|
38
|
+
super('DATABASE_ERROR', message, cause);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export class ValidationError extends AppError {
|
|
42
|
+
constructor(message) {
|
|
43
|
+
super('VALIDATION_ERROR', message);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export class FileNotFoundError extends AppError {
|
|
47
|
+
constructor(filePath) {
|
|
48
|
+
super('FILE_NOT_FOUND', `File not found: ${filePath}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export class UnsupportedFileTypeError extends AppError {
|
|
52
|
+
constructor(fileType) {
|
|
53
|
+
super('UNSUPPORTED_FILE_TYPE', `Unsupported file type: ${fileType}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/errors/index.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEf;IAEA;IAHlB,YACkB,IAAY,EAC5B,OAAe,EACC,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAQ;QAEZ,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,QAAQ;IAClD,YAAY,WAAmB;QAC7B,KAAK,CAAC,qBAAqB,EAAE,wBAAwB,WAAW,EAAE,CAAC,CAAC;IACtE,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,QAAQ;IACnD,YAAY,UAAkB;QAC5B,KAAK,CAAC,qBAAqB,EAAE,6BAA6B,UAAU,EAAE,CAAC,CAAC;IAC1E,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,QAAQ;IAC9C,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,sBAAsB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,QAAQ;IAC1C,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,iBAAiB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,QAAQ;IACzC,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,gBAAgB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,QAAQ;IAC7C,YAAY,QAAgB;QAC1B,KAAK,CAAC,gBAAgB,EAAE,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IACzD,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,QAAQ;IACpD,YAAY,QAAgB;QAC1B,KAAK,CAAC,uBAAuB,EAAE,0BAA0B,QAAQ,EAAE,CAAC,CAAC;IACvE,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type SectionType = 'summary' | 'experience' | 'education' | 'skills' | 'projects' | 'certifications' | 'full';
|
|
2
|
+
export type FileType = 'pdf' | 'docx';
|
|
3
|
+
export type TagAction = 'add' | 'remove' | 'list';
|
|
4
|
+
export type ExportFormat = 'json' | 'csv';
|
|
5
|
+
export type SortField = 'name' | 'created_at' | 'updated_at' | 'experience_years';
|
|
6
|
+
export type SortOrder = 'asc' | 'desc';
|
|
7
|
+
export interface PaginationOptions {
|
|
8
|
+
offset: number;
|
|
9
|
+
limit: number;
|
|
10
|
+
}
|
|
11
|
+
export interface SortOptions {
|
|
12
|
+
field: SortField;
|
|
13
|
+
order: SortOrder;
|
|
14
|
+
}
|
|
15
|
+
export interface ChunkInput {
|
|
16
|
+
sectionType: SectionType;
|
|
17
|
+
content: string;
|
|
18
|
+
metadata: Record<string, unknown>;
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/types/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export function createChunks(extracted, rawText) {
|
|
2
|
+
const chunks = [];
|
|
3
|
+
if (extracted.summary) {
|
|
4
|
+
chunks.push({
|
|
5
|
+
sectionType: 'summary',
|
|
6
|
+
content: extracted.summary,
|
|
7
|
+
metadata: {},
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
for (let i = 0; i < extracted.experience.length; i++) {
|
|
11
|
+
const exp = extracted.experience[i];
|
|
12
|
+
const parts = [
|
|
13
|
+
`${exp.position} at ${exp.company}`,
|
|
14
|
+
exp.startDate || exp.endDate
|
|
15
|
+
? `(${exp.startDate ?? '?'} - ${exp.endDate ?? 'Present'})`
|
|
16
|
+
: '',
|
|
17
|
+
exp.description ?? '',
|
|
18
|
+
].filter(Boolean);
|
|
19
|
+
chunks.push({
|
|
20
|
+
sectionType: 'experience',
|
|
21
|
+
content: parts.join(' '),
|
|
22
|
+
metadata: { index: i, company: exp.company, position: exp.position },
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
if (extracted.education.length > 0) {
|
|
26
|
+
const content = extracted.education
|
|
27
|
+
.map((e) => {
|
|
28
|
+
const parts = [
|
|
29
|
+
e.degree,
|
|
30
|
+
e.field ? `in ${e.field}` : '',
|
|
31
|
+
`at ${e.institution}`,
|
|
32
|
+
e.startDate || e.endDate
|
|
33
|
+
? `(${e.startDate ?? '?'} - ${e.endDate ?? '?'})`
|
|
34
|
+
: '',
|
|
35
|
+
].filter(Boolean);
|
|
36
|
+
return parts.join(' ');
|
|
37
|
+
})
|
|
38
|
+
.join('\n');
|
|
39
|
+
chunks.push({
|
|
40
|
+
sectionType: 'education',
|
|
41
|
+
content,
|
|
42
|
+
metadata: { count: extracted.education.length },
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (extracted.skills.length > 0) {
|
|
46
|
+
chunks.push({
|
|
47
|
+
sectionType: 'skills',
|
|
48
|
+
content: extracted.skills.join(', '),
|
|
49
|
+
metadata: { count: extracted.skills.length },
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
if (extracted.projects.length > 0) {
|
|
53
|
+
const content = extracted.projects
|
|
54
|
+
.map((p) => {
|
|
55
|
+
const parts = [
|
|
56
|
+
p.name,
|
|
57
|
+
p.description ?? '',
|
|
58
|
+
p.technologies ? `Technologies: ${p.technologies.join(', ')}` : '',
|
|
59
|
+
].filter(Boolean);
|
|
60
|
+
return parts.join(' - ');
|
|
61
|
+
})
|
|
62
|
+
.join('\n');
|
|
63
|
+
chunks.push({
|
|
64
|
+
sectionType: 'projects',
|
|
65
|
+
content,
|
|
66
|
+
metadata: { count: extracted.projects.length },
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (extracted.certifications.length > 0) {
|
|
70
|
+
const content = extracted.certifications
|
|
71
|
+
.map((c) => {
|
|
72
|
+
const parts = [c.name, c.issuer ? `by ${c.issuer}` : '', c.date ?? ''].filter(Boolean);
|
|
73
|
+
return parts.join(' ');
|
|
74
|
+
})
|
|
75
|
+
.join('\n');
|
|
76
|
+
chunks.push({
|
|
77
|
+
sectionType: 'certifications',
|
|
78
|
+
content,
|
|
79
|
+
metadata: { count: extracted.certifications.length },
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
chunks.push({
|
|
83
|
+
sectionType: 'full',
|
|
84
|
+
content: rawText,
|
|
85
|
+
metadata: {},
|
|
86
|
+
});
|
|
87
|
+
return chunks;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=chunking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunking.js","sourceRoot":"","sources":["../../../src/shared/utils/chunking.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FileType } from '../types/index.js';
|
|
2
|
+
export declare function normalizeWhitespace(text: string): string;
|
|
3
|
+
export declare function truncateText(text: string, maxLength: number): string;
|
|
4
|
+
export declare function detectFileType(filePath: string): FileType;
|
|
5
|
+
export declare function escapeFilterValue(value: string): string;
|