@dolusoft/hirebase-mcp 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/application/use-cases/add-reference-cv.d.ts +16 -0
  2. package/dist/application/use-cases/add-reference-cv.js +36 -0
  3. package/dist/application/use-cases/add-reference-cv.js.map +1 -0
  4. package/dist/application/use-cases/create-call-batch.d.ts +25 -0
  5. package/dist/application/use-cases/create-call-batch.js +72 -0
  6. package/dist/application/use-cases/create-call-batch.js.map +1 -0
  7. package/dist/application/use-cases/get-call-batch-status.d.ts +19 -0
  8. package/dist/application/use-cases/get-call-batch-status.js +23 -0
  9. package/dist/application/use-cases/get-call-batch-status.js.map +1 -0
  10. package/dist/application/use-cases/list-reference-cvs.d.ts +17 -0
  11. package/dist/application/use-cases/list-reference-cvs.js +21 -0
  12. package/dist/application/use-cases/list-reference-cvs.js.map +1 -0
  13. package/dist/application/use-cases/match-candidates.d.ts +6 -1
  14. package/dist/application/use-cases/match-candidates.js +55 -3
  15. package/dist/application/use-cases/match-candidates.js.map +1 -1
  16. package/dist/application/use-cases/remove-reference-cv.d.ts +6 -0
  17. package/dist/application/use-cases/remove-reference-cv.js +10 -0
  18. package/dist/application/use-cases/remove-reference-cv.js.map +1 -0
  19. package/dist/application/use-cases/update-call-outcome.d.ts +19 -0
  20. package/dist/application/use-cases/update-call-outcome.js +63 -0
  21. package/dist/application/use-cases/update-call-outcome.js.map +1 -0
  22. package/dist/domain/entities/application.d.ts +1 -1
  23. package/dist/domain/entities/call-batch.d.ts +21 -0
  24. package/dist/domain/entities/call-batch.js +2 -0
  25. package/dist/domain/entities/call-batch.js.map +1 -0
  26. package/dist/domain/entities/index.d.ts +2 -0
  27. package/dist/domain/entities/reference-cv.d.ts +8 -0
  28. package/dist/domain/entities/reference-cv.js +2 -0
  29. package/dist/domain/entities/reference-cv.js.map +1 -0
  30. package/dist/domain/repositories/call-batch-repository.d.ts +17 -0
  31. package/dist/domain/repositories/call-batch-repository.js +2 -0
  32. package/dist/domain/repositories/call-batch-repository.js.map +1 -0
  33. package/dist/domain/repositories/index.d.ts +2 -0
  34. package/dist/domain/repositories/reference-cv-repository.d.ts +8 -0
  35. package/dist/domain/repositories/reference-cv-repository.js +2 -0
  36. package/dist/domain/repositories/reference-cv-repository.js.map +1 -0
  37. package/dist/infrastructure/persistence/database.d.ts +6 -0
  38. package/dist/infrastructure/persistence/database.js +46 -0
  39. package/dist/infrastructure/persistence/database.js.map +1 -1
  40. package/dist/infrastructure/persistence/lancedb-call-batch-repository.d.ts +33 -0
  41. package/dist/infrastructure/persistence/lancedb-call-batch-repository.js +216 -0
  42. package/dist/infrastructure/persistence/lancedb-call-batch-repository.js.map +1 -0
  43. package/dist/infrastructure/persistence/lancedb-reference-cv-repository.d.ts +17 -0
  44. package/dist/infrastructure/persistence/lancedb-reference-cv-repository.js +97 -0
  45. package/dist/infrastructure/persistence/lancedb-reference-cv-repository.js.map +1 -0
  46. package/dist/interface/dashboard/public/200.html +1 -1
  47. package/dist/interface/dashboard/public/404.html +1 -1
  48. package/dist/interface/dashboard/public/_nuxt/builds/latest.json +1 -1
  49. package/dist/interface/dashboard/public/_nuxt/builds/meta/269a33f3-c36d-4ceb-ae10-e708da6c151c.json +1 -0
  50. package/dist/interface/dashboard/public/_nuxt/builds/meta/6d598d93-4de0-403a-a158-2c2529504b0f.json +1 -0
  51. package/dist/interface/dashboard/public/_nuxt/builds/meta/71752c9b-993c-4c33-8131-3ea5f76f183f.json +1 -0
  52. package/dist/interface/dashboard/public/_nuxt/builds/meta/83d6f570-2c34-4be5-9948-1051c85501d8.json +1 -0
  53. package/dist/interface/dashboard/public/_nuxt/builds/meta/b35b302f-e133-4121-8657-1ff4b7a84dbe.json +1 -0
  54. package/dist/interface/dashboard/public/_nuxt/builds/meta/cfdbad0b-52a7-4db5-a767-c65e5a0af0b2.json +1 -0
  55. package/dist/interface/dashboard/public/_nuxt/builds/meta/e2007138-fb12-4dd0-908b-9a9d452bb2a3.json +1 -0
  56. package/dist/interface/dashboard/public/_nuxt/builds/meta/eac7333a-e06c-4c97-ae42-eeea7caaa1b3.json +1 -0
  57. package/dist/interface/dashboard/public/_nuxt/builds/meta/fccb7849-b9fa-40e3-919d-c1085fce9db2.json +1 -0
  58. package/dist/interface/dashboard/public/index.html +1 -1
  59. package/dist/interface/mcp/server.js +20 -0
  60. package/dist/interface/mcp/server.js.map +1 -1
  61. package/dist/interface/mcp/tools/add-pipeline-note.js +1 -3
  62. package/dist/interface/mcp/tools/add-pipeline-note.js.map +1 -1
  63. package/dist/interface/mcp/tools/add-reference-cv.d.ts +3 -0
  64. package/dist/interface/mcp/tools/add-reference-cv.js +28 -0
  65. package/dist/interface/mcp/tools/add-reference-cv.js.map +1 -0
  66. package/dist/interface/mcp/tools/create-call-batch.d.ts +3 -0
  67. package/dist/interface/mcp/tools/create-call-batch.js +30 -0
  68. package/dist/interface/mcp/tools/create-call-batch.js.map +1 -0
  69. package/dist/interface/mcp/tools/get-call-batch-status.d.ts +3 -0
  70. package/dist/interface/mcp/tools/get-call-batch-status.js +22 -0
  71. package/dist/interface/mcp/tools/get-call-batch-status.js.map +1 -0
  72. package/dist/interface/mcp/tools/list-reference-cvs.d.ts +3 -0
  73. package/dist/interface/mcp/tools/list-reference-cvs.js +22 -0
  74. package/dist/interface/mcp/tools/list-reference-cvs.js.map +1 -0
  75. package/dist/interface/mcp/tools/match-candidates.js +4 -2
  76. package/dist/interface/mcp/tools/match-candidates.js.map +1 -1
  77. package/dist/interface/mcp/tools/remove-reference-cv.d.ts +3 -0
  78. package/dist/interface/mcp/tools/remove-reference-cv.js +22 -0
  79. package/dist/interface/mcp/tools/remove-reference-cv.js.map +1 -0
  80. package/dist/interface/mcp/tools/update-call-outcome.d.ts +3 -0
  81. package/dist/interface/mcp/tools/update-call-outcome.js +30 -0
  82. package/dist/interface/mcp/tools/update-call-outcome.js.map +1 -0
  83. package/dist/interface/mcp/tools/update-pipeline-status.js +1 -16
  84. package/dist/interface/mcp/tools/update-pipeline-status.js.map +1 -1
  85. package/dist/interface/mcp/types.d.ts +5 -0
  86. package/package.json +1 -1
@@ -0,0 +1,16 @@
1
+ import type { IReferenceCvRepository } from '../../domain/repositories/reference-cv-repository.js';
2
+ import type { ICandidateRepository } from '../../domain/repositories/candidate-repository.js';
3
+ import type { IJobPostingRepository } from '../../domain/repositories/job-posting-repository.js';
4
+ import type { ReferenceCv } from '../../domain/entities/reference-cv.js';
5
+ export interface AddReferenceCvInput {
6
+ jobPostingId: string;
7
+ candidateId: string;
8
+ note?: string;
9
+ }
10
+ export declare class AddReferenceCvUseCase {
11
+ private referenceCvRepo;
12
+ private candidateRepo;
13
+ private jobPostingRepo;
14
+ constructor(referenceCvRepo: IReferenceCvRepository, candidateRepo: ICandidateRepository, jobPostingRepo: IJobPostingRepository);
15
+ execute(input: AddReferenceCvInput): Promise<ReferenceCv>;
16
+ }
@@ -0,0 +1,36 @@
1
+ import { nanoid } from 'nanoid';
2
+ export class AddReferenceCvUseCase {
3
+ referenceCvRepo;
4
+ candidateRepo;
5
+ jobPostingRepo;
6
+ constructor(referenceCvRepo, candidateRepo, jobPostingRepo) {
7
+ this.referenceCvRepo = referenceCvRepo;
8
+ this.candidateRepo = candidateRepo;
9
+ this.jobPostingRepo = jobPostingRepo;
10
+ }
11
+ async execute(input) {
12
+ const jobPosting = await this.jobPostingRepo.findById(input.jobPostingId);
13
+ if (!jobPosting) {
14
+ throw new Error(`Job posting not found: ${input.jobPostingId}`);
15
+ }
16
+ const candidate = await this.candidateRepo.findById(input.candidateId);
17
+ if (!candidate) {
18
+ throw new Error(`Candidate not found: ${input.candidateId}`);
19
+ }
20
+ const existing = await this.referenceCvRepo.findByJobAndCandidate(input.jobPostingId, input.candidateId);
21
+ if (existing) {
22
+ throw new Error(`Candidate "${candidate.name}" is already a reference CV for "${jobPosting.title}"`);
23
+ }
24
+ const ref = {
25
+ id: nanoid(),
26
+ jobPostingId: input.jobPostingId,
27
+ candidateId: input.candidateId,
28
+ candidateName: candidate.name,
29
+ note: input.note ?? '',
30
+ createdAt: new Date().toISOString(),
31
+ };
32
+ await this.referenceCvRepo.save(ref);
33
+ return ref;
34
+ }
35
+ }
36
+ //# sourceMappingURL=add-reference-cv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-reference-cv.js","sourceRoot":"","sources":["../../../src/application/use-cases/add-reference-cv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAYhC,MAAM,OAAO,qBAAqB;IAEtB;IACA;IACA;IAHV,YACU,eAAuC,EACvC,aAAmC,EACnC,cAAqC;QAFrC,oBAAe,GAAf,eAAe,CAAwB;QACvC,kBAAa,GAAb,aAAa,CAAsB;QACnC,mBAAc,GAAd,cAAc,CAAuB;IAC5C,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,KAA0B;QACtC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1E,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,qBAAqB,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QACzG,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,cAAc,SAAS,CAAC,IAAI,oCAAoC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC;QACvG,CAAC;QAED,MAAM,GAAG,GAAgB;YACvB,EAAE,EAAE,MAAM,EAAE;YACZ,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,aAAa,EAAE,SAAS,CAAC,IAAI;YAC7B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import type { IApplicationRepository } from '../../domain/repositories/application-repository.js';
2
+ import type { IApplicationEventRepository } from '../../domain/repositories/application-event-repository.js';
3
+ import type { ICandidateRepository } from '../../domain/repositories/candidate-repository.js';
4
+ import type { ICallBatchRepository } from '../../domain/repositories/call-batch-repository.js';
5
+ import type { ICallBatchItemRepository } from '../../domain/repositories/call-batch-repository.js';
6
+ import type { CallBatch, CallBatchItem } from '../../domain/entities/call-batch.js';
7
+ export interface CreateCallBatchInput {
8
+ jobPostingId: string;
9
+ sentTo: string;
10
+ candidateIds: string[];
11
+ note?: string;
12
+ }
13
+ export interface CreateCallBatchResult {
14
+ batch: CallBatch;
15
+ items: CallBatchItem[];
16
+ }
17
+ export declare class CreateCallBatchUseCase {
18
+ private applicationRepo;
19
+ private applicationEventRepo;
20
+ private candidateRepo;
21
+ private callBatchRepo;
22
+ private callBatchItemRepo;
23
+ constructor(applicationRepo: IApplicationRepository, applicationEventRepo: IApplicationEventRepository, candidateRepo: ICandidateRepository, callBatchRepo: ICallBatchRepository, callBatchItemRepo: ICallBatchItemRepository);
24
+ execute(input: CreateCallBatchInput): Promise<CreateCallBatchResult>;
25
+ }
@@ -0,0 +1,72 @@
1
+ import { nanoid } from 'nanoid';
2
+ export class CreateCallBatchUseCase {
3
+ applicationRepo;
4
+ applicationEventRepo;
5
+ candidateRepo;
6
+ callBatchRepo;
7
+ callBatchItemRepo;
8
+ constructor(applicationRepo, applicationEventRepo, candidateRepo, callBatchRepo, callBatchItemRepo) {
9
+ this.applicationRepo = applicationRepo;
10
+ this.applicationEventRepo = applicationEventRepo;
11
+ this.candidateRepo = candidateRepo;
12
+ this.callBatchRepo = callBatchRepo;
13
+ this.callBatchItemRepo = callBatchItemRepo;
14
+ }
15
+ async execute(input) {
16
+ const now = new Date().toISOString();
17
+ const batchId = nanoid();
18
+ const batch = {
19
+ id: batchId,
20
+ jobPostingId: input.jobPostingId,
21
+ sentTo: input.sentTo,
22
+ note: input.note ?? '',
23
+ createdAt: now,
24
+ updatedAt: now,
25
+ };
26
+ await this.callBatchRepo.save(batch);
27
+ const items = [];
28
+ for (const candidateId of input.candidateIds) {
29
+ const application = await this.applicationRepo.findByJobAndCandidate(input.jobPostingId, candidateId);
30
+ if (!application) {
31
+ throw new Error(`No application found for candidate ${candidateId} in job ${input.jobPostingId}`);
32
+ }
33
+ const candidate = await this.candidateRepo.findById(candidateId);
34
+ const phone = candidate?.contact?.phone ?? '';
35
+ const candidateName = candidate?.name ?? candidateId;
36
+ const item = {
37
+ id: nanoid(),
38
+ batchId,
39
+ applicationId: application.id,
40
+ candidateId,
41
+ candidateName,
42
+ phone,
43
+ outcome: 'pending',
44
+ note: '',
45
+ createdAt: now,
46
+ updatedAt: now,
47
+ };
48
+ await this.callBatchItemRepo.save(item);
49
+ items.push(item);
50
+ // Mark application as to_call
51
+ const updatedApp = {
52
+ ...application,
53
+ status: 'to_call',
54
+ notes: `${application.notes}\n[${now}] Batch ${batchId} için to_call listesine alındı — ${input.sentTo}'e iletildi`.trim(),
55
+ updatedAt: now,
56
+ };
57
+ await this.applicationRepo.update(updatedApp);
58
+ const event = {
59
+ id: nanoid(),
60
+ applicationId: application.id,
61
+ eventType: 'status_change',
62
+ fromStatus: application.status,
63
+ toStatus: 'to_call',
64
+ note: `Call batch oluşturuldu (${batchId}) — ${input.sentTo} arayacak`,
65
+ createdAt: now,
66
+ };
67
+ await this.applicationEventRepo.save(event);
68
+ }
69
+ return { batch, items };
70
+ }
71
+ }
72
+ //# sourceMappingURL=create-call-batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-call-batch.js","sourceRoot":"","sources":["../../../src/application/use-cases/create-call-batch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ICallBatchRepository } from '../../domain/repositories/call-batch-repository.js';
2
+ import type { ICallBatchItemRepository } from '../../domain/repositories/call-batch-repository.js';
3
+ import type { CallBatch, CallBatchItem } from '../../domain/entities/call-batch.js';
4
+ export interface GetCallBatchStatusResult {
5
+ batch: CallBatch;
6
+ items: CallBatchItem[];
7
+ summary: {
8
+ total: number;
9
+ pending: number;
10
+ reached: number;
11
+ unreachable: number;
12
+ };
13
+ }
14
+ export declare class GetCallBatchStatusUseCase {
15
+ private callBatchRepo;
16
+ private callBatchItemRepo;
17
+ constructor(callBatchRepo: ICallBatchRepository, callBatchItemRepo: ICallBatchItemRepository);
18
+ execute(batchId: string): Promise<GetCallBatchStatusResult>;
19
+ }
@@ -0,0 +1,23 @@
1
+ export class GetCallBatchStatusUseCase {
2
+ callBatchRepo;
3
+ callBatchItemRepo;
4
+ constructor(callBatchRepo, callBatchItemRepo) {
5
+ this.callBatchRepo = callBatchRepo;
6
+ this.callBatchItemRepo = callBatchItemRepo;
7
+ }
8
+ async execute(batchId) {
9
+ const batch = await this.callBatchRepo.findById(batchId);
10
+ if (!batch) {
11
+ throw new Error(`Call batch not found: ${batchId}`);
12
+ }
13
+ const items = await this.callBatchItemRepo.findByBatchId(batchId);
14
+ const summary = {
15
+ total: items.length,
16
+ pending: items.filter((i) => i.outcome === 'pending').length,
17
+ reached: items.filter((i) => i.outcome === 'reached').length,
18
+ unreachable: items.filter((i) => i.outcome === 'unreachable').length,
19
+ };
20
+ return { batch, items, summary };
21
+ }
22
+ }
23
+ //# sourceMappingURL=get-call-batch-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-call-batch-status.js","sourceRoot":"","sources":["../../../src/application/use-cases/get-call-batch-status.ts"],"names":[],"mappings":"AAeA,MAAM,OAAO,yBAAyB;IAE1B;IACA;IAFV,YACU,aAAmC,EACnC,iBAA2C;QAD3C,kBAAa,GAAb,aAAa,CAAsB;QACnC,sBAAiB,GAAjB,iBAAiB,CAA0B;IAClD,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAAe;QAC3B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAElE,MAAM,OAAO,GAAG;YACd,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,MAAM;YAC5D,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,MAAM;YAC5D,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,aAAa,CAAC,CAAC,MAAM;SACrE,CAAC;QAEF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ import type { IReferenceCvRepository } from '../../domain/repositories/reference-cv-repository.js';
2
+ import type { IJobPostingRepository } from '../../domain/repositories/job-posting-repository.js';
3
+ import type { ReferenceCv } from '../../domain/entities/reference-cv.js';
4
+ export interface ListReferenceCvsInput {
5
+ jobPostingId: string;
6
+ }
7
+ export interface ListReferenceCvsResult {
8
+ jobPostingTitle: string;
9
+ references: ReferenceCv[];
10
+ total: number;
11
+ }
12
+ export declare class ListReferenceCvsUseCase {
13
+ private referenceCvRepo;
14
+ private jobPostingRepo;
15
+ constructor(referenceCvRepo: IReferenceCvRepository, jobPostingRepo: IJobPostingRepository);
16
+ execute(input: ListReferenceCvsInput): Promise<ListReferenceCvsResult>;
17
+ }
@@ -0,0 +1,21 @@
1
+ export class ListReferenceCvsUseCase {
2
+ referenceCvRepo;
3
+ jobPostingRepo;
4
+ constructor(referenceCvRepo, jobPostingRepo) {
5
+ this.referenceCvRepo = referenceCvRepo;
6
+ this.jobPostingRepo = jobPostingRepo;
7
+ }
8
+ async execute(input) {
9
+ const jobPosting = await this.jobPostingRepo.findById(input.jobPostingId);
10
+ if (!jobPosting) {
11
+ throw new Error(`Job posting not found: ${input.jobPostingId}`);
12
+ }
13
+ const references = await this.referenceCvRepo.findByJobPostingId(input.jobPostingId);
14
+ return {
15
+ jobPostingTitle: jobPosting.title,
16
+ references,
17
+ total: references.length,
18
+ };
19
+ }
20
+ }
21
+ //# sourceMappingURL=list-reference-cvs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-reference-cvs.js","sourceRoot":"","sources":["../../../src/application/use-cases/list-reference-cvs.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,uBAAuB;IAExB;IACA;IAFV,YACU,eAAuC,EACvC,cAAqC;QADrC,oBAAe,GAAf,eAAe,CAAwB;QACvC,mBAAc,GAAd,cAAc,CAAuB;IAC5C,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,KAA4B;QACxC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1E,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAErF,OAAO;YACL,eAAe,EAAE,UAAU,CAAC,KAAK;YACjC,UAAU;YACV,KAAK,EAAE,UAAU,CAAC,MAAM;SACzB,CAAC;IACJ,CAAC;CACF"}
@@ -2,6 +2,7 @@ import type { IJobPostingRepository } from '../../domain/repositories/job-postin
2
2
  import type { ICandidateRepository } from '../../domain/repositories/candidate-repository.js';
3
3
  import type { IChunkRepository } from '../../domain/repositories/chunk-repository.js';
4
4
  import type { IApplicationRepository } from '../../domain/repositories/application-repository.js';
5
+ import type { IReferenceCvRepository } from '../../domain/repositories/reference-cv-repository.js';
5
6
  import type { IEmbeddingService } from '../ports/embedding-service.js';
6
7
  import type { ApplicationStatus } from '../../domain/entities/application.js';
7
8
  export interface MatchCandidatesInput {
@@ -12,6 +13,7 @@ export interface MatchCandidatesInput {
12
13
  location?: string;
13
14
  requiredSkills?: string[];
14
15
  includeLoyaltyDetail?: boolean;
16
+ useReferences?: boolean;
15
17
  }
16
18
  export interface MatchResult {
17
19
  candidateId: string;
@@ -22,6 +24,7 @@ export interface MatchResult {
22
24
  loyaltyFactor: number;
23
25
  matchedSkills: string[];
24
26
  missingSkills: string[];
27
+ referenceBoost?: number;
25
28
  pipelineStatus?: ApplicationStatus;
26
29
  location?: string;
27
30
  avgTenureMonths?: number;
@@ -33,7 +36,9 @@ export declare class MatchCandidatesUseCase {
33
36
  private chunkRepo;
34
37
  private embeddingService;
35
38
  private applicationRepo?;
36
- constructor(jobPostingRepo: IJobPostingRepository, candidateRepo: ICandidateRepository, chunkRepo: IChunkRepository, embeddingService: IEmbeddingService, applicationRepo?: IApplicationRepository | undefined);
39
+ private referenceCvRepo?;
40
+ constructor(jobPostingRepo: IJobPostingRepository, candidateRepo: ICandidateRepository, chunkRepo: IChunkRepository, embeddingService: IEmbeddingService, applicationRepo?: IApplicationRepository | undefined, referenceCvRepo?: IReferenceCvRepository | undefined);
37
41
  execute(input: MatchCandidatesInput): Promise<MatchResult[]>;
42
+ private cosineSimilarity;
38
43
  private computeSkillOverlap;
39
44
  }
@@ -9,15 +9,17 @@ export class MatchCandidatesUseCase {
9
9
  chunkRepo;
10
10
  embeddingService;
11
11
  applicationRepo;
12
- constructor(jobPostingRepo, candidateRepo, chunkRepo, embeddingService, applicationRepo) {
12
+ referenceCvRepo;
13
+ constructor(jobPostingRepo, candidateRepo, chunkRepo, embeddingService, applicationRepo, referenceCvRepo) {
13
14
  this.jobPostingRepo = jobPostingRepo;
14
15
  this.candidateRepo = candidateRepo;
15
16
  this.chunkRepo = chunkRepo;
16
17
  this.embeddingService = embeddingService;
17
18
  this.applicationRepo = applicationRepo;
19
+ this.referenceCvRepo = referenceCvRepo;
18
20
  }
19
21
  async execute(input) {
20
- const { jobPostingId, limit = 10, excludePipeline = false, excludeScreened = false, location, requiredSkills, includeLoyaltyDetail = false, } = input;
22
+ const { jobPostingId, limit = 10, excludePipeline = false, excludeScreened = false, location, requiredSkills, includeLoyaltyDetail = false, useReferences = false, } = input;
21
23
  const jobPosting = await this.jobPostingRepo.findById(jobPostingId);
22
24
  if (!jobPosting) {
23
25
  throw new Error(`Job posting not found: ${jobPostingId}`);
@@ -25,6 +27,23 @@ export class MatchCandidatesUseCase {
25
27
  // Build search text from job posting (prefer rawText for richer semantic matching)
26
28
  const searchText = [jobPosting.rawText, jobPosting.description, jobPosting.requirements].filter(Boolean).join('\n');
27
29
  const [queryVector] = await this.embeddingService.embedBatch([searchText]);
30
+ // Reference CV vector boost: compute average vector from reference CVs' chunks
31
+ let referenceVectors = [];
32
+ const referenceCandidateIds = new Set();
33
+ if (useReferences && this.referenceCvRepo) {
34
+ const refs = await this.referenceCvRepo.findByJobPostingId(jobPostingId);
35
+ for (const ref of refs) {
36
+ referenceCandidateIds.add(ref.candidateId);
37
+ }
38
+ if (referenceCandidateIds.size > 0) {
39
+ const refChunkResults = await this.chunkRepo.semanticSearch(queryVector, referenceCandidateIds.size * 10);
40
+ for (const result of refChunkResults) {
41
+ if (referenceCandidateIds.has(result.chunk.candidateId)) {
42
+ referenceVectors.push(result.chunk.vector);
43
+ }
44
+ }
45
+ }
46
+ }
28
47
  // Search chunks (fetch more than needed to aggregate by candidate)
29
48
  const chunkLimit = limit * 8;
30
49
  const searchResults = await this.chunkRepo.semanticSearch(queryVector, chunkLimit);
@@ -73,7 +92,25 @@ export class MatchCandidatesUseCase {
73
92
  // Compute scores
74
93
  const { skillOverlap, matchedSkills, missingSkills } = this.computeSkillOverlap(candidate, requiredSkillsLower, jobPosting.requiredSkills);
75
94
  const loyaltyFactor = LOYALTY_FACTORS[candidate.loyaltyScore ?? ''] ?? 0.7;
76
- const compositeScore = 0.5 * vectorScore + 0.3 * skillOverlap + 0.2 * loyaltyFactor;
95
+ // Reference boost: compute cosine similarity to reference CV vectors
96
+ let referenceBoost = 0;
97
+ if (useReferences && referenceVectors.length > 0) {
98
+ // Get this candidate's best chunk from search results
99
+ const candidateChunks = searchResults.filter((r) => r.chunk.candidateId === candidateId);
100
+ if (candidateChunks.length > 0) {
101
+ const bestChunkVector = candidateChunks[0].chunk.vector;
102
+ let totalSim = 0;
103
+ for (const refVec of referenceVectors) {
104
+ totalSim += this.cosineSimilarity(bestChunkVector, refVec);
105
+ }
106
+ referenceBoost = totalSim / referenceVectors.length;
107
+ }
108
+ }
109
+ // Scoring: with references 40% vector + 25% skill + 15% loyalty + 20% reference
110
+ // Without references: 50% vector + 30% skill + 20% loyalty (original)
111
+ const compositeScore = useReferences && referenceVectors.length > 0
112
+ ? 0.4 * vectorScore + 0.25 * skillOverlap + 0.15 * loyaltyFactor + 0.2 * referenceBoost
113
+ : 0.5 * vectorScore + 0.3 * skillOverlap + 0.2 * loyaltyFactor;
77
114
  results.push({
78
115
  candidateId,
79
116
  candidateName: candidate.name,
@@ -83,6 +120,7 @@ export class MatchCandidatesUseCase {
83
120
  loyaltyFactor,
84
121
  matchedSkills,
85
122
  missingSkills,
123
+ ...(useReferences && referenceVectors.length > 0 ? { referenceBoost: Math.round(referenceBoost * 1000) / 1000 } : {}),
86
124
  pipelineStatus,
87
125
  location: candidate.contact.location,
88
126
  ...(includeLoyaltyDetail
@@ -94,6 +132,20 @@ export class MatchCandidatesUseCase {
94
132
  results.sort((a, b) => b.compositeScore - a.compositeScore);
95
133
  return results.slice(0, limit);
96
134
  }
135
+ cosineSimilarity(a, b) {
136
+ if (a.length !== b.length || a.length === 0)
137
+ return 0;
138
+ let dot = 0;
139
+ let normA = 0;
140
+ let normB = 0;
141
+ for (let i = 0; i < a.length; i++) {
142
+ dot += a[i] * b[i];
143
+ normA += a[i] * a[i];
144
+ normB += b[i] * b[i];
145
+ }
146
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
147
+ return denom === 0 ? 0 : dot / denom;
148
+ }
97
149
  computeSkillOverlap(candidate, requiredSkillsLower, requiredSkillsOriginal) {
98
150
  if (requiredSkillsLower.length === 0) {
99
151
  return { skillOverlap: 1, matchedSkills: [], missingSkills: [] };
@@ -1 +1 @@
1
- {"version":3,"file":"match-candidates.js","sourceRoot":"","sources":["../../../src/application/use-cases/match-candidates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"match-candidates.js","sourceRoot":"","sources":["../../../src/application/use-cases/match-candidates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { IReferenceCvRepository } from '../../domain/repositories/reference-cv-repository.js';
2
+ export declare class RemoveReferenceCvUseCase {
3
+ private referenceCvRepo;
4
+ constructor(referenceCvRepo: IReferenceCvRepository);
5
+ execute(id: string): Promise<void>;
6
+ }
@@ -0,0 +1,10 @@
1
+ export class RemoveReferenceCvUseCase {
2
+ referenceCvRepo;
3
+ constructor(referenceCvRepo) {
4
+ this.referenceCvRepo = referenceCvRepo;
5
+ }
6
+ async execute(id) {
7
+ await this.referenceCvRepo.delete(id);
8
+ }
9
+ }
10
+ //# sourceMappingURL=remove-reference-cv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-reference-cv.js","sourceRoot":"","sources":["../../../src/application/use-cases/remove-reference-cv.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,wBAAwB;IACf;IAApB,YAAoB,eAAuC;QAAvC,oBAAe,GAAf,eAAe,CAAwB;IAAG,CAAC;IAE/D,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import type { IApplicationRepository } from '../../domain/repositories/application-repository.js';
2
+ import type { IApplicationEventRepository } from '../../domain/repositories/application-event-repository.js';
3
+ import type { ICallBatchRepository } from '../../domain/repositories/call-batch-repository.js';
4
+ import type { ICallBatchItemRepository } from '../../domain/repositories/call-batch-repository.js';
5
+ import type { CallBatchItem, CallBatchItemOutcome } from '../../domain/entities/call-batch.js';
6
+ export interface UpdateCallOutcomeInput {
7
+ batchId: string;
8
+ applicationId: string;
9
+ outcome: CallBatchItemOutcome;
10
+ note?: string;
11
+ }
12
+ export declare class UpdateCallOutcomeUseCase {
13
+ private callBatchRepo;
14
+ private callBatchItemRepo;
15
+ private applicationRepo;
16
+ private applicationEventRepo;
17
+ constructor(callBatchRepo: ICallBatchRepository, callBatchItemRepo: ICallBatchItemRepository, applicationRepo: IApplicationRepository, applicationEventRepo: IApplicationEventRepository);
18
+ execute(input: UpdateCallOutcomeInput): Promise<CallBatchItem>;
19
+ }
@@ -0,0 +1,63 @@
1
+ import { nanoid } from 'nanoid';
2
+ export class UpdateCallOutcomeUseCase {
3
+ callBatchRepo;
4
+ callBatchItemRepo;
5
+ applicationRepo;
6
+ applicationEventRepo;
7
+ constructor(callBatchRepo, callBatchItemRepo, applicationRepo, applicationEventRepo) {
8
+ this.callBatchRepo = callBatchRepo;
9
+ this.callBatchItemRepo = callBatchItemRepo;
10
+ this.applicationRepo = applicationRepo;
11
+ this.applicationEventRepo = applicationEventRepo;
12
+ }
13
+ async execute(input) {
14
+ const batch = await this.callBatchRepo.findById(input.batchId);
15
+ if (!batch) {
16
+ throw new Error(`Call batch not found: ${input.batchId}`);
17
+ }
18
+ const item = await this.callBatchItemRepo.findByBatchAndApplication(input.batchId, input.applicationId);
19
+ if (!item) {
20
+ throw new Error(`Batch item not found for application ${input.applicationId} in batch ${input.batchId}`);
21
+ }
22
+ const now = new Date().toISOString();
23
+ const updatedItem = {
24
+ ...item,
25
+ outcome: input.outcome,
26
+ note: input.note ?? item.note,
27
+ updatedAt: now,
28
+ };
29
+ await this.callBatchItemRepo.update(updatedItem);
30
+ // Update application status based on outcome
31
+ const application = await this.applicationRepo.findById(input.applicationId);
32
+ if (application) {
33
+ const newStatus = input.outcome === 'reached'
34
+ ? 'contacted'
35
+ : input.outcome === 'unreachable'
36
+ ? 'unreachable'
37
+ : null;
38
+ if (newStatus && application.status !== newStatus) {
39
+ const noteText = input.note
40
+ ? `${input.note} (Batch: ${input.batchId})`
41
+ : `Arama sonucu: ${input.outcome} (Batch: ${input.batchId})`;
42
+ await this.applicationRepo.update({
43
+ ...application,
44
+ status: newStatus,
45
+ notes: `${application.notes}\n[${now}] ${noteText}`.trim(),
46
+ updatedAt: now,
47
+ });
48
+ const event = {
49
+ id: nanoid(),
50
+ applicationId: input.applicationId,
51
+ eventType: 'call_attempt',
52
+ fromStatus: application.status,
53
+ toStatus: newStatus,
54
+ note: noteText,
55
+ createdAt: now,
56
+ };
57
+ await this.applicationEventRepo.save(event);
58
+ }
59
+ }
60
+ return updatedItem;
61
+ }
62
+ }
63
+ //# sourceMappingURL=update-call-outcome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-call-outcome.js","sourceRoot":"","sources":["../../../src/application/use-cases/update-call-outcome.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAehC,MAAM,OAAO,wBAAwB;IAEzB;IACA;IACA;IACA;IAJV,YACU,aAAmC,EACnC,iBAA2C,EAC3C,eAAuC,EACvC,oBAAiD;QAHjD,kBAAa,GAAb,aAAa,CAAsB;QACnC,sBAAiB,GAAjB,iBAAiB,CAA0B;QAC3C,oBAAe,GAAf,eAAe,CAAwB;QACvC,yBAAoB,GAApB,oBAAoB,CAA6B;IACxD,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,KAA6B;QACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CACjE,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,aAAa,CACpB,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CACb,wCAAwC,KAAK,CAAC,aAAa,aAAa,KAAK,CAAC,OAAO,EAAE,CACxF,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,WAAW,GAAkB;YACjC,GAAG,IAAI;YACP,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI;YAC7B,SAAS,EAAE,GAAG;SACf,CAAC;QAEF,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAEjD,6CAA6C;QAC7C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7E,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,SAAS,GACb,KAAK,CAAC,OAAO,KAAK,SAAS;gBACzB,CAAC,CAAE,WAAqB;gBACxB,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,aAAa;oBAC/B,CAAC,CAAE,aAAuB;oBAC1B,CAAC,CAAC,IAAI,CAAC;YAEb,IAAI,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI;oBACzB,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,YAAY,KAAK,CAAC,OAAO,GAAG;oBAC3C,CAAC,CAAC,iBAAiB,KAAK,CAAC,OAAO,YAAY,KAAK,CAAC,OAAO,GAAG,CAAC;gBAE/D,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;oBAChC,GAAG,WAAW;oBACd,MAAM,EAAE,SAAS;oBACjB,KAAK,EAAE,GAAG,WAAW,CAAC,KAAK,MAAM,GAAG,KAAK,QAAQ,EAAE,CAAC,IAAI,EAAE;oBAC1D,SAAS,EAAE,GAAG;iBACf,CAAC,CAAC;gBAEH,MAAM,KAAK,GAAqB;oBAC9B,EAAE,EAAE,MAAM,EAAE;oBACZ,aAAa,EAAE,KAAK,CAAC,aAAa;oBAClC,SAAS,EAAE,cAAc;oBACzB,UAAU,EAAE,WAAW,CAAC,MAAM;oBAC9B,QAAQ,EAAE,SAAS;oBACnB,IAAI,EAAE,QAAQ;oBACd,SAAS,EAAE,GAAG;iBACf,CAAC;gBACF,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;CACF"}
@@ -1,4 +1,4 @@
1
- export type ApplicationStatus = 'new' | 'contacted' | 'unreachable' | 'not_interested' | 'interview_scheduled' | 'no_show' | 'interviewed' | 'rejected' | 'offer_sent' | 'hired' | 'shortlisted' | 'screened_out';
1
+ export type ApplicationStatus = 'new' | 'to_call' | 'contacted' | 'unreachable' | 'not_interested' | 'interview_scheduled' | 'no_show' | 'interviewed' | 'rejected' | 'offer_sent' | 'hired' | 'shortlisted' | 'screened_out';
2
2
  export interface Application {
3
3
  readonly id: string;
4
4
  readonly jobPostingId: string;
@@ -0,0 +1,21 @@
1
+ export type CallBatchItemOutcome = 'pending' | 'reached' | 'unreachable';
2
+ export interface CallBatch {
3
+ readonly id: string;
4
+ readonly jobPostingId: string;
5
+ readonly sentTo: string;
6
+ readonly note: string;
7
+ readonly createdAt: string;
8
+ readonly updatedAt: string;
9
+ }
10
+ export interface CallBatchItem {
11
+ readonly id: string;
12
+ readonly batchId: string;
13
+ readonly applicationId: string;
14
+ readonly candidateId: string;
15
+ readonly candidateName: string;
16
+ readonly phone: string;
17
+ readonly outcome: CallBatchItemOutcome;
18
+ readonly note: string;
19
+ readonly createdAt: string;
20
+ readonly updatedAt: string;
21
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=call-batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-batch.js","sourceRoot":"","sources":["../../../src/domain/entities/call-batch.ts"],"names":[],"mappings":""}
@@ -4,3 +4,5 @@ export type { CvVersion } from './cv-version.js';
4
4
  export type { JobPosting } from './job-posting.js';
5
5
  export type { Application, ApplicationStatus } from './application.js';
6
6
  export type { ApplicationEvent, ApplicationEventType } from './application-event.js';
7
+ export type { CallBatch, CallBatchItem, CallBatchItemOutcome } from './call-batch.js';
8
+ export type { ReferenceCv } from './reference-cv.js';
@@ -0,0 +1,8 @@
1
+ export interface ReferenceCv {
2
+ readonly id: string;
3
+ readonly jobPostingId: string;
4
+ readonly candidateId: string;
5
+ readonly candidateName: string;
6
+ readonly note: string;
7
+ readonly createdAt: string;
8
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reference-cv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-cv.js","sourceRoot":"","sources":["../../../src/domain/entities/reference-cv.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import type { CallBatch, CallBatchItem } from '../entities/call-batch.js';
2
+ export interface ICallBatchRepository {
3
+ save(batch: CallBatch): Promise<void>;
4
+ findById(id: string): Promise<CallBatch | null>;
5
+ findByJobPostingId(jobPostingId: string): Promise<CallBatch[]>;
6
+ update(batch: CallBatch): Promise<void>;
7
+ delete(id: string): Promise<void>;
8
+ count(): Promise<number>;
9
+ }
10
+ export interface ICallBatchItemRepository {
11
+ save(item: CallBatchItem): Promise<void>;
12
+ findByBatchId(batchId: string): Promise<CallBatchItem[]>;
13
+ findByBatchAndApplication(batchId: string, applicationId: string): Promise<CallBatchItem | null>;
14
+ update(item: CallBatchItem): Promise<void>;
15
+ deleteByBatchId(batchId: string): Promise<void>;
16
+ count(): Promise<number>;
17
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=call-batch-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-batch-repository.js","sourceRoot":"","sources":["../../../src/domain/repositories/call-batch-repository.ts"],"names":[],"mappings":""}
@@ -4,3 +4,5 @@ export type { IVersionRepository } from './version-repository.js';
4
4
  export type { IJobPostingRepository } from './job-posting-repository.js';
5
5
  export type { IApplicationRepository } from './application-repository.js';
6
6
  export type { IApplicationEventRepository } from './application-event-repository.js';
7
+ export type { ICallBatchRepository, ICallBatchItemRepository } from './call-batch-repository.js';
8
+ export type { IReferenceCvRepository } from './reference-cv-repository.js';