@dolusoft/hirebase-mcp 1.1.14 → 1.1.16
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 +1 -20
- 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/infrastructure/config/app-config.d.ts +0 -2
- package/dist/infrastructure/config/app-config.js +0 -2
- package/dist/infrastructure/config/app-config.js.map +1 -1
- package/dist/interface/dashboard/html.d.ts +1 -0
- package/dist/interface/dashboard/html.js +1007 -0
- package/dist/interface/dashboard/html.js.map +1 -0
- package/dist/interface/dashboard/public/200.html +1 -1
- package/dist/interface/dashboard/public/404.html +1 -1
- package/dist/interface/dashboard/public/_nuxt/{0AdCNZ2r.js → BTmld7lv.js} +1 -1
- package/dist/interface/dashboard/public/_nuxt/BtFgTcXQ.js +30 -0
- package/dist/interface/dashboard/public/_nuxt/{BLxpBE0v.js → BwTYWIW-.js} +1 -1
- package/dist/interface/dashboard/public/_nuxt/{CWPXgICh.js → CdJZeyak.js} +3 -3
- package/dist/interface/dashboard/public/_nuxt/{BTjyj6yg.js → D9vxbU2B.js} +1 -1
- package/dist/interface/dashboard/public/_nuxt/{QW9Ku0B8.js → DHg6ig_T.js} +1 -1
- package/dist/interface/dashboard/public/_nuxt/DhFk2_Al.js +1 -0
- package/dist/interface/dashboard/public/_nuxt/{DGNE26xE.js → DtX-aPBA.js} +1 -1
- package/dist/interface/dashboard/public/_nuxt/{Bq8olVvK.js → DvCMYK3d.js} +1 -1
- package/dist/interface/dashboard/public/_nuxt/{BgeIs7YY.js → FR49ZCl_.js} +3 -3
- package/dist/interface/dashboard/public/_nuxt/builds/latest.json +1 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/027020ec-4e7d-4fc7-8447-19800f7d0bac.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/149e5d62-f8be-402c-b0cc-2efe0560d9d2.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/18e19101-a96b-41dc-b602-f9a8f013a036.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/2fd3d0d3-6004-4659-9055-d27aa6656fd3.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/32cf8bd4-f9b8-477d-bcff-75df710335e1.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/4d9b8de6-1292-42ca-8f07-c47ba5f61768.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/54792d4b-ca55-4b5d-b0dd-1d7dc34de344.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/5959a14b-2494-4e0d-be28-fef9adfd889d.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/60cda583-d704-4d4e-b37e-7ab337e3b6cc.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/64d05a43-99ec-4c22-934e-071b310b968f.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/6c1632a5-f0af-41e3-9d88-12294e03a0b9.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/6c80982c-5e2c-446c-aaf6-7000a976e493.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/79161adb-748c-4d36-a031-a71899a56ecd.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/84e5a87d-4ae5-48dd-8d5e-5b1fe89f7243.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/86082677-a11d-4acf-ab04-c3c067a71622.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/8892e611-c2b4-425b-a6a5-988314d8da4d.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/9bfe6b22-73f8-4584-b13d-ed1df5600e12.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/a39bf957-ddae-41a6-a183-08292363098b.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/aba3eed8-dd4e-4a25-a13d-7dd320288af5.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/b0bf7fc4-02c1-46fd-acca-f4458feed978.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/b2847d83-b695-45d4-9dca-d7498158a501.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/c73136b0-98f2-4b13-bce6-b2c2bffada81.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/c8382eda-1354-4f92-b6d0-5b5b9f43354a.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/e707aa44-7202-413d-bcd5-1538b5b56570.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/ea661002-05ab-4bfb-b02f-c91bb721c5e9.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/ec2a9f02-6137-4473-bc4f-0e48df1e085b.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/f2f23a12-a792-480e-922a-ee8b73dc0310.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/f4e23d88-bf4b-4110-976f-4e7a2c538e98.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/f6503b83-d731-40f8-9110-c1599663b3ba.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/fb00efc4-219c-4174-8827-fe876fe21945.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/builds/meta/feac6d04-6bc5-4fa4-a241-79e897d7f8c1.json +1 -0
- package/dist/interface/dashboard/public/_nuxt/entry.BSUaoqsu.css +1 -0
- package/dist/interface/dashboard/public/_nuxt/entry.Cjj6Q9Tz.css +1 -0
- package/dist/interface/dashboard/public/_nuxt/index.BH5Gbe6q.css +1 -0
- package/dist/interface/dashboard/public/_nuxt/index.CEZKOBlO.css +1 -0
- package/dist/interface/dashboard/public/_nuxt/index.TQmbXYdV.css +1 -0
- package/dist/interface/dashboard/public/_nuxt/iov8YEuI.js +1 -0
- package/dist/interface/dashboard/public/_nuxt/{CMEleUsa.js → qq1iUjth.js} +1 -1
- package/dist/interface/dashboard/public/index.html +1 -1
- package/dist/interface/mcp/server.js +0 -12
- package/dist/interface/mcp/server.js.map +1 -1
- package/dist/interface/mcp/tools/{add-contact.d.ts → bulk-add-cvs.d.ts} +1 -1
- 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/types.d.ts +0 -2
- package/package.json +72 -72
- package/dist/application/ports/calendar-service.d.ts +0 -42
- package/dist/application/ports/calendar-service.js +0 -2
- package/dist/application/ports/calendar-service.js.map +0 -1
- package/dist/infrastructure/calendar/google-calendar.service.d.ts +0 -24
- package/dist/infrastructure/calendar/google-calendar.service.js +0 -353
- package/dist/infrastructure/calendar/google-calendar.service.js.map +0 -1
- package/dist/infrastructure/calendar/index.d.ts +0 -1
- package/dist/infrastructure/calendar/index.js +0 -2
- package/dist/infrastructure/calendar/index.js.map +0 -1
- package/dist/interface/dashboard/public/_nuxt/-_rMc6Se.js +0 -401
- package/dist/interface/dashboard/public/_nuxt/B4WYmHkq.js +0 -1
- package/dist/interface/dashboard/public/_nuxt/BeosaLTc.js +0 -1
- package/dist/interface/dashboard/public/_nuxt/Br9ERNIk.js +0 -401
- package/dist/interface/dashboard/public/_nuxt/CVllyrh5.js +0 -1
- package/dist/interface/dashboard/public/_nuxt/CXsAVqtn.js +0 -1
- package/dist/interface/dashboard/public/_nuxt/D0GfmhnA.js +0 -412
- package/dist/interface/dashboard/public/_nuxt/D6QLZU2u.js +0 -1
- package/dist/interface/dashboard/public/_nuxt/DP7mgmwO.js +0 -1
- package/dist/interface/dashboard/public/_nuxt/DPvkvsJV.js +0 -1
- package/dist/interface/dashboard/public/_nuxt/DxJl84Er.js +0 -1
- package/dist/interface/dashboard/public/_nuxt/JwuJcHj8.js +0 -1
- package/dist/interface/dashboard/public/_nuxt/XEtfQxBf.js +0 -1
- package/dist/interface/dashboard/public/_nuxt/bQmPafrB.js +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/055843bb-5e41-4bc3-b42b-417d89074bec.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/0887dec6-b9e4-4d5c-aa20-c4d3743164d1.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/131e7c46-6af5-4dbc-a481-1e187b75e916.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/20776565-55f5-45a5-9256-34c44a89cabb.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/270f5a83-1457-4ae7-9cc9-e677a3d11f3f.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/359e6b85-6a49-4c04-9d61-55b27d691ee2.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/3d499c69-a6ad-40af-aa0f-3de728bce182.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/4a4130b0-8c3a-45a8-b0ec-75fb365382a4.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/5b1398f2-12db-4829-bd27-8f6bea84da51.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/5f5dc585-4404-4cc1-aed7-f41e599fa82b.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/6288f3fe-6fd0-4910-840f-965365a82bbe.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/7d22d81c-6f64-4bbf-95cc-7bfaaa0a4e40.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/88c871e1-0450-4184-8097-9b16d5055c91.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/8d4cac7e-e9ef-4e89-9b6e-f688d6c878c0.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/a6dffe72-f4cc-4c31-aa18-893d6b1f925a.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/ac99623a-06e9-4b63-975f-d2bdc89c09c0.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/ae588cf0-9aba-4273-90ff-7dba058efdbb.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/b2c71ec3-fe3e-4002-8e4c-c70c755ffa47.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/b5e2b874-04ff-45e9-812e-19ff99dedd2b.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/bb377d8b-070b-490b-89de-8b16bf942832.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/c0c615e1-5140-47a4-b69b-45cd18b1bd53.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/c8f77a43-342e-4c12-b54f-a5a303d0bfc1.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/dcd6fa82-0beb-4b20-a2e0-bc4e6105f567.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/dd11345e-76cc-4eda-8846-6955403f11f4.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/e0401d8c-cb34-406e-b220-bbb78db509ed.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/e3b88d80-27cc-46a4-aa8c-5eb9f2b1afe4.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/edf56071-c990-47a9-adea-2c94846f4652.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/f2781c1c-3867-4fd2-a6bb-b35695221f0d.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/builds/meta/f2cd9466-7680-4df3-88a7-7b7428a61966.json +0 -1
- package/dist/interface/dashboard/public/_nuxt/entry.BdLSmlNR.css +0 -1
- package/dist/interface/dashboard/public/_nuxt/entry.CCPYWN-f.css +0 -1
- package/dist/interface/dashboard/public/_nuxt/entry.u_d2fXHa.css +0 -1
- package/dist/interface/dashboard/public/_nuxt/iHi62RBH.js +0 -412
- package/dist/interface/dashboard/public/_nuxt/index.B4sfIgIL.css +0 -1
- package/dist/interface/dashboard/public/_nuxt/index.C1uHm-Vo.css +0 -1
- package/dist/interface/dashboard/public/_nuxt/index.DCAZalej.css +0 -1
- package/dist/interface/dashboard/public/_nuxt/index.Dj1j62L8.css +0 -1
- package/dist/interface/dashboard/public/_nuxt/index.xroKz4Z7.css +0 -1
- package/dist/interface/mcp/tools/add-contact.js +0 -43
- package/dist/interface/mcp/tools/add-contact.js.map +0 -1
- package/dist/interface/mcp/tools/authorize-calendar.d.ts +0 -3
- package/dist/interface/mcp/tools/authorize-calendar.js +0 -20
- package/dist/interface/mcp/tools/authorize-calendar.js.map +0 -1
- package/dist/interface/mcp/tools/create-calendar-event.d.ts +0 -3
- package/dist/interface/mcp/tools/create-calendar-event.js +0 -46
- package/dist/interface/mcp/tools/create-calendar-event.js.map +0 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { AddCvUseCase } from '../../../application/use-cases/add-cv.js';
|
|
3
|
+
import { BulkAddCvsUseCase } from '../../../application/use-cases/bulk-add-cvs.js';
|
|
4
|
+
export function registerBulkAddCvsTool(server, deps) {
|
|
5
|
+
const addCvUseCase = new AddCvUseCase(deps.candidateRepo, deps.chunkRepo, deps.parsers, deps.embeddingService, deps.extractor);
|
|
6
|
+
const useCase = new BulkAddCvsUseCase(addCvUseCase);
|
|
7
|
+
server.tool('bulk_add_cvs', 'Process all CV files (PDF and DOCX) in a directory and add them to the database.', { directory_path: z.string().describe('Absolute path to the directory containing CV files') }, async ({ directory_path }) => {
|
|
8
|
+
try {
|
|
9
|
+
const result = await useCase.execute(directory_path);
|
|
10
|
+
const summary = {
|
|
11
|
+
succeeded: result.succeeded.length,
|
|
12
|
+
failed: result.failed.length,
|
|
13
|
+
succeededCandidates: result.succeeded.map((c) => ({ id: c.id, name: c.name })),
|
|
14
|
+
failedFiles: result.failed,
|
|
15
|
+
};
|
|
16
|
+
return {
|
|
17
|
+
content: [{ type: 'text', text: JSON.stringify(summary, null, 2) }],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
return {
|
|
22
|
+
content: [{ type: 'text', text: JSON.stringify({ error: error.message }) }],
|
|
23
|
+
isError: true,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=bulk-add-cvs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-add-cvs.js","sourceRoot":"","sources":["../../../../src/interface/mcp/tools/bulk-add-cvs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAGnF,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,IAAkB;IAC1E,MAAM,YAAY,GAAG,IAAI,YAAY,CACnC,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,SAAS,CACf,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAEpD,MAAM,CAAC,IAAI,CACT,cAAc,EACd,kFAAkF,EAClF,EAAE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC,EAAE,EAC7F,KAAK,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG;gBACd,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM;gBAClC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;gBAC5B,mBAAmB,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9E,WAAW,EAAE,MAAM,CAAC,MAAM;aAC3B,CAAC;YACF,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"}
|
|
@@ -5,7 +5,6 @@ import type { IDocumentParser } from '../../application/ports/document-parser.js
|
|
|
5
5
|
import type { IEmbeddingService } from '../../application/ports/embedding-service.js';
|
|
6
6
|
import type { IStructuredExtractor } from '../../application/ports/structured-extractor.js';
|
|
7
7
|
import type { IExportService } from '../../application/ports/export-service.js';
|
|
8
|
-
import type { ICalendarService } from '../../application/ports/calendar-service.js';
|
|
9
8
|
import type { IJobPostingRepository } from '../../domain/repositories/job-posting-repository.js';
|
|
10
9
|
import type { IApplicationRepository } from '../../domain/repositories/application-repository.js';
|
|
11
10
|
import type { IApplicationEventRepository } from '../../domain/repositories/application-event-repository.js';
|
|
@@ -23,6 +22,5 @@ export interface Dependencies {
|
|
|
23
22
|
embeddingService: IEmbeddingService;
|
|
24
23
|
extractor: IStructuredExtractor;
|
|
25
24
|
exportService: IExportService;
|
|
26
|
-
calendarService?: ICalendarService;
|
|
27
25
|
}
|
|
28
26
|
export {};
|
package/package.json
CHANGED
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@dolusoft/hirebase-mcp",
|
|
3
|
-
"version": "1.1.
|
|
4
|
-
"description": "HireBase - AI-powered CV search engine with LanceDB and MCP",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "dist/interface/cli/index.js",
|
|
7
|
-
"bin": {
|
|
8
|
-
"hirebase-mcp": "dist/interface/cli/index.js"
|
|
9
|
-
},
|
|
10
|
-
"files": [
|
|
11
|
-
"dist/**/*",
|
|
12
|
-
"README.md",
|
|
13
|
-
"LICENSE"
|
|
14
|
-
],
|
|
15
|
-
"scripts": {
|
|
16
|
-
"build": "tsc && cd dashboard && pnpm generate && cd .. && node scripts/copy-dashboard.mjs",
|
|
17
|
-
"build:server": "tsc",
|
|
18
|
-
"start": "node --env-file=.env dist/interface/cli/index.js",
|
|
19
|
-
"dev": "tsc --watch",
|
|
20
|
-
"prepublishOnly": "npm run build"
|
|
21
|
-
},
|
|
22
|
-
"engines": {
|
|
23
|
-
"node": ">=22.0.0"
|
|
24
|
-
},
|
|
25
|
-
"keywords": [
|
|
26
|
-
"mcp",
|
|
27
|
-
"mcp-server",
|
|
28
|
-
"rag",
|
|
29
|
-
"lancedb",
|
|
30
|
-
"cv",
|
|
31
|
-
"resume",
|
|
32
|
-
"recruitment",
|
|
33
|
-
"hiring",
|
|
34
|
-
"ai",
|
|
35
|
-
"vector-search",
|
|
36
|
-
"semantic-search",
|
|
37
|
-
"openai",
|
|
38
|
-
"embeddings",
|
|
39
|
-
"ocr",
|
|
40
|
-
"tesseract"
|
|
41
|
-
],
|
|
42
|
-
"repository": {
|
|
43
|
-
"type": "git",
|
|
44
|
-
"url": "https://github.com/dolusoft/hirebase.git"
|
|
45
|
-
},
|
|
46
|
-
"homepage": "https://github.com/dolusoft/hirebase#readme",
|
|
47
|
-
"author": "Dolusoft",
|
|
48
|
-
"license": "MIT",
|
|
49
|
-
"publishConfig": {
|
|
50
|
-
"access": "public"
|
|
51
|
-
},
|
|
52
|
-
"dependencies": {
|
|
53
|
-
"@lancedb/lancedb": "^0.26.2",
|
|
54
|
-
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
55
|
-
"@napi-rs/canvas": "^0.1.94",
|
|
56
|
-
"mammoth": "^1.11.0",
|
|
57
|
-
"nanoid": "^5.1.6",
|
|
58
|
-
"openai": "^6.22.0",
|
|
59
|
-
"papaparse": "^5.5.3",
|
|
60
|
-
"tesseract.js": "^7.0.0",
|
|
61
|
-
"unpdf": "^1.4.0",
|
|
62
|
-
"ws": "^8.19.0",
|
|
63
|
-
"zod": "^4.3.6",
|
|
64
|
-
"zod-to-json-schema": "^3.25.1"
|
|
65
|
-
},
|
|
66
|
-
"devDependencies": {
|
|
67
|
-
"@types/node": "^25.3.0",
|
|
68
|
-
"@types/papaparse": "^5.5.2",
|
|
69
|
-
"@types/ws": "^8.18.1",
|
|
70
|
-
"typescript": "^5.9.3"
|
|
71
|
-
}
|
|
72
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@dolusoft/hirebase-mcp",
|
|
3
|
+
"version": "1.1.16",
|
|
4
|
+
"description": "HireBase - AI-powered CV search engine with LanceDB and MCP",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/interface/cli/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"hirebase-mcp": "dist/interface/cli/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist/**/*",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc && cd dashboard && pnpm generate && cd .. && node scripts/copy-dashboard.mjs",
|
|
17
|
+
"build:server": "tsc",
|
|
18
|
+
"start": "node --env-file=.env dist/interface/cli/index.js",
|
|
19
|
+
"dev": "tsc --watch",
|
|
20
|
+
"prepublishOnly": "npm run build"
|
|
21
|
+
},
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=22.0.0"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"mcp",
|
|
27
|
+
"mcp-server",
|
|
28
|
+
"rag",
|
|
29
|
+
"lancedb",
|
|
30
|
+
"cv",
|
|
31
|
+
"resume",
|
|
32
|
+
"recruitment",
|
|
33
|
+
"hiring",
|
|
34
|
+
"ai",
|
|
35
|
+
"vector-search",
|
|
36
|
+
"semantic-search",
|
|
37
|
+
"openai",
|
|
38
|
+
"embeddings",
|
|
39
|
+
"ocr",
|
|
40
|
+
"tesseract"
|
|
41
|
+
],
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "https://github.com/dolusoft/hirebase.git"
|
|
45
|
+
},
|
|
46
|
+
"homepage": "https://github.com/dolusoft/hirebase#readme",
|
|
47
|
+
"author": "Dolusoft",
|
|
48
|
+
"license": "MIT",
|
|
49
|
+
"publishConfig": {
|
|
50
|
+
"access": "public"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@lancedb/lancedb": "^0.26.2",
|
|
54
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
55
|
+
"@napi-rs/canvas": "^0.1.94",
|
|
56
|
+
"mammoth": "^1.11.0",
|
|
57
|
+
"nanoid": "^5.1.6",
|
|
58
|
+
"openai": "^6.22.0",
|
|
59
|
+
"papaparse": "^5.5.3",
|
|
60
|
+
"tesseract.js": "^7.0.0",
|
|
61
|
+
"unpdf": "^1.4.0",
|
|
62
|
+
"ws": "^8.19.0",
|
|
63
|
+
"zod": "^4.3.6",
|
|
64
|
+
"zod-to-json-schema": "^3.25.1"
|
|
65
|
+
},
|
|
66
|
+
"devDependencies": {
|
|
67
|
+
"@types/node": "^25.3.0",
|
|
68
|
+
"@types/papaparse": "^5.5.2",
|
|
69
|
+
"@types/ws": "^8.18.1",
|
|
70
|
+
"typescript": "^5.9.3"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
export interface CalendarEventInput {
|
|
2
|
-
title: string;
|
|
3
|
-
description?: string;
|
|
4
|
-
location?: string;
|
|
5
|
-
startTime: string;
|
|
6
|
-
endTime: string;
|
|
7
|
-
attendees?: string[];
|
|
8
|
-
}
|
|
9
|
-
export interface CalendarEventResult {
|
|
10
|
-
id: string;
|
|
11
|
-
title: string;
|
|
12
|
-
htmlLink: string;
|
|
13
|
-
startTime: string;
|
|
14
|
-
endTime: string;
|
|
15
|
-
}
|
|
16
|
-
export interface ContactInput {
|
|
17
|
-
firstName: string;
|
|
18
|
-
lastName?: string;
|
|
19
|
-
phone?: string;
|
|
20
|
-
email?: string;
|
|
21
|
-
company?: string;
|
|
22
|
-
title?: string;
|
|
23
|
-
notes?: string;
|
|
24
|
-
groupName?: string;
|
|
25
|
-
}
|
|
26
|
-
export interface ContactResult {
|
|
27
|
-
resourceName: string;
|
|
28
|
-
name: string;
|
|
29
|
-
phone?: string;
|
|
30
|
-
email?: string;
|
|
31
|
-
groupName?: string;
|
|
32
|
-
}
|
|
33
|
-
export interface ICalendarService {
|
|
34
|
-
isAuthorized(): Promise<boolean>;
|
|
35
|
-
authorize(): Promise<{
|
|
36
|
-
success: boolean;
|
|
37
|
-
message: string;
|
|
38
|
-
}>;
|
|
39
|
-
createEvent(event: CalendarEventInput): Promise<CalendarEventResult>;
|
|
40
|
-
deleteEvent(eventId: string): Promise<void>;
|
|
41
|
-
createContact(contact: ContactInput): Promise<ContactResult>;
|
|
42
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"calendar-service.js","sourceRoot":"","sources":["../../../src/application/ports/calendar-service.ts"],"names":[],"mappings":""}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { ICalendarService, CalendarEventInput, CalendarEventResult, ContactInput, ContactResult } from '../../application/ports/calendar-service.js';
|
|
2
|
-
export declare class GoogleCalendarService implements ICalendarService {
|
|
3
|
-
private clientId;
|
|
4
|
-
private clientSecret;
|
|
5
|
-
private tokenPath;
|
|
6
|
-
private tokens;
|
|
7
|
-
private tokensLoaded;
|
|
8
|
-
constructor(clientId: string, clientSecret: string, dataPath: string);
|
|
9
|
-
isAuthorized(): Promise<boolean>;
|
|
10
|
-
authorize(): Promise<{
|
|
11
|
-
success: boolean;
|
|
12
|
-
message: string;
|
|
13
|
-
}>;
|
|
14
|
-
createEvent(event: CalendarEventInput): Promise<CalendarEventResult>;
|
|
15
|
-
deleteEvent(eventId: string): Promise<void>;
|
|
16
|
-
createContact(contact: ContactInput): Promise<ContactResult>;
|
|
17
|
-
private hasRequiredScopes;
|
|
18
|
-
private clearTokens;
|
|
19
|
-
private ensureTokensLoaded;
|
|
20
|
-
private saveTokens;
|
|
21
|
-
private getAccessToken;
|
|
22
|
-
private exchangeCodeForTokens;
|
|
23
|
-
private findOrCreateContactGroup;
|
|
24
|
-
}
|
|
@@ -1,353 +0,0 @@
|
|
|
1
|
-
import { createServer as createHttpServer } from 'node:http';
|
|
2
|
-
import { exec } from 'node:child_process';
|
|
3
|
-
import { readFile, writeFile, mkdir, unlink } from 'node:fs/promises';
|
|
4
|
-
import { existsSync } from 'node:fs';
|
|
5
|
-
import { join, dirname } from 'node:path';
|
|
6
|
-
const AUTH_URL = 'https://accounts.google.com/o/oauth2/v2/auth';
|
|
7
|
-
const TOKEN_URL = 'https://oauth2.googleapis.com/token';
|
|
8
|
-
const CALENDAR_API = 'https://www.googleapis.com/calendar/v3';
|
|
9
|
-
const PEOPLE_API = 'https://people.googleapis.com/v1';
|
|
10
|
-
const SCOPES = [
|
|
11
|
-
'https://www.googleapis.com/auth/calendar.events',
|
|
12
|
-
'https://www.googleapis.com/auth/contacts',
|
|
13
|
-
];
|
|
14
|
-
const AUTH_TIMEOUT_MS = 120_000;
|
|
15
|
-
const TOKEN_BUFFER_MS = 300_000; // Refresh 5 min before expiry
|
|
16
|
-
export class GoogleCalendarService {
|
|
17
|
-
clientId;
|
|
18
|
-
clientSecret;
|
|
19
|
-
tokenPath;
|
|
20
|
-
tokens = null;
|
|
21
|
-
tokensLoaded = false;
|
|
22
|
-
constructor(clientId, clientSecret, dataPath) {
|
|
23
|
-
this.clientId = clientId;
|
|
24
|
-
this.clientSecret = clientSecret;
|
|
25
|
-
this.tokenPath = join(dirname(dataPath), 'google-token.json');
|
|
26
|
-
}
|
|
27
|
-
async isAuthorized() {
|
|
28
|
-
await this.ensureTokensLoaded();
|
|
29
|
-
return this.tokens !== null && !!this.tokens.refresh_token && this.hasRequiredScopes();
|
|
30
|
-
}
|
|
31
|
-
async authorize() {
|
|
32
|
-
await this.ensureTokensLoaded();
|
|
33
|
-
// If already authorized with all required scopes, skip
|
|
34
|
-
if (this.tokens?.refresh_token && this.hasRequiredScopes()) {
|
|
35
|
-
return { success: true, message: 'Already authorized with Google (Calendar + Contacts).' };
|
|
36
|
-
}
|
|
37
|
-
// If scopes changed, clear old token to force re-auth
|
|
38
|
-
if (this.tokens?.refresh_token && !this.hasRequiredScopes()) {
|
|
39
|
-
await this.clearTokens();
|
|
40
|
-
}
|
|
41
|
-
return new Promise((resolve) => {
|
|
42
|
-
let resolved = false;
|
|
43
|
-
const httpServer = createHttpServer(async (req, res) => {
|
|
44
|
-
if (resolved)
|
|
45
|
-
return;
|
|
46
|
-
const url = new URL(req.url, 'http://localhost');
|
|
47
|
-
const code = url.searchParams.get('code');
|
|
48
|
-
const error = url.searchParams.get('error');
|
|
49
|
-
if (error) {
|
|
50
|
-
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
51
|
-
res.end(htmlPage('Yetkilendirme Başarısız', 'Erişim reddedildi. Bu pencereyi kapatabilirsiniz.'));
|
|
52
|
-
resolved = true;
|
|
53
|
-
httpServer.close();
|
|
54
|
-
resolve({ success: false, message: `Authorization denied: ${error}` });
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
if (code) {
|
|
58
|
-
const port = httpServer.address().port;
|
|
59
|
-
try {
|
|
60
|
-
await this.exchangeCodeForTokens(code, `http://localhost:${port}`);
|
|
61
|
-
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
62
|
-
res.end(htmlPage('HireBase Yetkilendirildi!', 'Google Calendar + Contacts bağlantısı başarılı. Bu pencereyi kapatabilirsiniz.'));
|
|
63
|
-
resolved = true;
|
|
64
|
-
httpServer.close();
|
|
65
|
-
resolve({ success: true, message: 'Google (Calendar + Contacts) successfully authorized. Token saved.' });
|
|
66
|
-
}
|
|
67
|
-
catch (err) {
|
|
68
|
-
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
69
|
-
res.end(htmlPage('Hata', 'Token alınamadı. Lütfen tekrar deneyin.'));
|
|
70
|
-
resolved = true;
|
|
71
|
-
httpServer.close();
|
|
72
|
-
resolve({ success: false, message: `Token exchange failed: ${err.message}` });
|
|
73
|
-
}
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
res.writeHead(404);
|
|
77
|
-
res.end();
|
|
78
|
-
});
|
|
79
|
-
httpServer.listen(0, () => {
|
|
80
|
-
const port = httpServer.address().port;
|
|
81
|
-
const redirectUri = `http://localhost:${port}`;
|
|
82
|
-
const authUrl = new URL(AUTH_URL);
|
|
83
|
-
authUrl.searchParams.set('client_id', this.clientId);
|
|
84
|
-
authUrl.searchParams.set('redirect_uri', redirectUri);
|
|
85
|
-
authUrl.searchParams.set('response_type', 'code');
|
|
86
|
-
authUrl.searchParams.set('scope', SCOPES.join(' '));
|
|
87
|
-
authUrl.searchParams.set('access_type', 'offline');
|
|
88
|
-
authUrl.searchParams.set('prompt', 'consent');
|
|
89
|
-
openBrowser(authUrl.toString());
|
|
90
|
-
setTimeout(() => {
|
|
91
|
-
if (!resolved) {
|
|
92
|
-
resolved = true;
|
|
93
|
-
httpServer.close();
|
|
94
|
-
resolve({ success: false, message: 'Authorization timed out after 120 seconds.' });
|
|
95
|
-
}
|
|
96
|
-
}, AUTH_TIMEOUT_MS);
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
// ── Calendar ─────────────────────────────────────────────────────
|
|
101
|
-
async createEvent(event) {
|
|
102
|
-
const accessToken = await this.getAccessToken();
|
|
103
|
-
const body = {
|
|
104
|
-
summary: event.title,
|
|
105
|
-
description: event.description,
|
|
106
|
-
location: event.location,
|
|
107
|
-
start: {
|
|
108
|
-
dateTime: event.startTime,
|
|
109
|
-
timeZone: 'Europe/Istanbul',
|
|
110
|
-
},
|
|
111
|
-
end: {
|
|
112
|
-
dateTime: event.endTime,
|
|
113
|
-
timeZone: 'Europe/Istanbul',
|
|
114
|
-
},
|
|
115
|
-
attendees: event.attendees?.map((email) => ({ email })),
|
|
116
|
-
reminders: {
|
|
117
|
-
useDefault: false,
|
|
118
|
-
overrides: [
|
|
119
|
-
{ method: 'popup', minutes: 30 },
|
|
120
|
-
{ method: 'popup', minutes: 10 },
|
|
121
|
-
],
|
|
122
|
-
},
|
|
123
|
-
};
|
|
124
|
-
const response = await fetch(`${CALENDAR_API}/calendars/primary/events`, {
|
|
125
|
-
method: 'POST',
|
|
126
|
-
headers: {
|
|
127
|
-
Authorization: `Bearer ${accessToken}`,
|
|
128
|
-
'Content-Type': 'application/json',
|
|
129
|
-
},
|
|
130
|
-
body: JSON.stringify(body),
|
|
131
|
-
});
|
|
132
|
-
if (!response.ok) {
|
|
133
|
-
const error = await response.text();
|
|
134
|
-
throw new Error(`Failed to create calendar event: ${error}`);
|
|
135
|
-
}
|
|
136
|
-
const data = (await response.json());
|
|
137
|
-
return {
|
|
138
|
-
id: data.id,
|
|
139
|
-
title: data.summary,
|
|
140
|
-
htmlLink: data.htmlLink,
|
|
141
|
-
startTime: data.start.dateTime,
|
|
142
|
-
endTime: data.end.dateTime,
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
async deleteEvent(eventId) {
|
|
146
|
-
const accessToken = await this.getAccessToken();
|
|
147
|
-
const response = await fetch(`${CALENDAR_API}/calendars/primary/events/${eventId}`, {
|
|
148
|
-
method: 'DELETE',
|
|
149
|
-
headers: { Authorization: `Bearer ${accessToken}` },
|
|
150
|
-
});
|
|
151
|
-
if (!response.ok && response.status !== 404) {
|
|
152
|
-
const error = await response.text();
|
|
153
|
-
throw new Error(`Failed to delete calendar event: ${error}`);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
// ── Contacts ─────────────────────────────────────────────────────
|
|
157
|
-
async createContact(contact) {
|
|
158
|
-
const accessToken = await this.getAccessToken();
|
|
159
|
-
// Build People API person resource
|
|
160
|
-
const person = {
|
|
161
|
-
names: [{ givenName: contact.firstName, familyName: contact.lastName ?? '' }],
|
|
162
|
-
};
|
|
163
|
-
if (contact.phone) {
|
|
164
|
-
person.phoneNumbers = [{ value: contact.phone, type: 'mobile' }];
|
|
165
|
-
}
|
|
166
|
-
if (contact.email) {
|
|
167
|
-
person.emailAddresses = [{ value: contact.email, type: 'work' }];
|
|
168
|
-
}
|
|
169
|
-
if (contact.company || contact.title) {
|
|
170
|
-
person.organizations = [{ name: contact.company ?? '', title: contact.title ?? '' }];
|
|
171
|
-
}
|
|
172
|
-
if (contact.notes) {
|
|
173
|
-
person.biographies = [{ value: contact.notes, contentType: 'TEXT_PLAIN' }];
|
|
174
|
-
}
|
|
175
|
-
// If group requested, find or create it
|
|
176
|
-
let groupResourceName;
|
|
177
|
-
if (contact.groupName) {
|
|
178
|
-
groupResourceName = await this.findOrCreateContactGroup(accessToken, contact.groupName);
|
|
179
|
-
if (groupResourceName) {
|
|
180
|
-
person.memberships = [
|
|
181
|
-
{ contactGroupMembership: { contactGroupResourceName: groupResourceName } },
|
|
182
|
-
];
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
const response = await fetch(`${PEOPLE_API}/people:createContact`, {
|
|
186
|
-
method: 'POST',
|
|
187
|
-
headers: {
|
|
188
|
-
Authorization: `Bearer ${accessToken}`,
|
|
189
|
-
'Content-Type': 'application/json',
|
|
190
|
-
},
|
|
191
|
-
body: JSON.stringify(person),
|
|
192
|
-
});
|
|
193
|
-
if (!response.ok) {
|
|
194
|
-
const error = await response.text();
|
|
195
|
-
throw new Error(`Failed to create contact: ${error}`);
|
|
196
|
-
}
|
|
197
|
-
const data = (await response.json());
|
|
198
|
-
return {
|
|
199
|
-
resourceName: data.resourceName,
|
|
200
|
-
name: data.names?.[0]?.displayName ?? `${contact.firstName} ${contact.lastName ?? ''}`.trim(),
|
|
201
|
-
phone: data.phoneNumbers?.[0]?.value,
|
|
202
|
-
email: data.emailAddresses?.[0]?.value,
|
|
203
|
-
groupName: contact.groupName,
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
// ── Private helpers ──────────────────────────────────────────────
|
|
207
|
-
hasRequiredScopes() {
|
|
208
|
-
if (!this.tokens?.scopes)
|
|
209
|
-
return false;
|
|
210
|
-
return SCOPES.every((s) => this.tokens.scopes.includes(s));
|
|
211
|
-
}
|
|
212
|
-
async clearTokens() {
|
|
213
|
-
this.tokens = null;
|
|
214
|
-
this.tokensLoaded = true;
|
|
215
|
-
if (existsSync(this.tokenPath)) {
|
|
216
|
-
await unlink(this.tokenPath);
|
|
217
|
-
}
|
|
218
|
-
// Also clean up old token file name
|
|
219
|
-
const oldPath = join(dirname(this.tokenPath), 'google-calendar-token.json');
|
|
220
|
-
if (existsSync(oldPath)) {
|
|
221
|
-
await unlink(oldPath);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
async ensureTokensLoaded() {
|
|
225
|
-
if (this.tokensLoaded)
|
|
226
|
-
return;
|
|
227
|
-
try {
|
|
228
|
-
if (existsSync(this.tokenPath)) {
|
|
229
|
-
const data = await readFile(this.tokenPath, 'utf-8');
|
|
230
|
-
this.tokens = JSON.parse(data);
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
// Migrate from old token file name
|
|
234
|
-
const oldPath = join(dirname(this.tokenPath), 'google-calendar-token.json');
|
|
235
|
-
if (existsSync(oldPath)) {
|
|
236
|
-
const data = await readFile(oldPath, 'utf-8');
|
|
237
|
-
this.tokens = JSON.parse(data);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
catch {
|
|
242
|
-
this.tokens = null;
|
|
243
|
-
}
|
|
244
|
-
this.tokensLoaded = true;
|
|
245
|
-
}
|
|
246
|
-
async saveTokens(tokens) {
|
|
247
|
-
this.tokens = tokens;
|
|
248
|
-
const dir = dirname(this.tokenPath);
|
|
249
|
-
if (!existsSync(dir)) {
|
|
250
|
-
await mkdir(dir, { recursive: true });
|
|
251
|
-
}
|
|
252
|
-
await writeFile(this.tokenPath, JSON.stringify(tokens, null, 2));
|
|
253
|
-
}
|
|
254
|
-
async getAccessToken() {
|
|
255
|
-
await this.ensureTokensLoaded();
|
|
256
|
-
if (!this.tokens?.refresh_token) {
|
|
257
|
-
throw new Error('Not authorized. Call authorize_google first.');
|
|
258
|
-
}
|
|
259
|
-
// Return current token if still valid
|
|
260
|
-
if (this.tokens.expires_at && Date.now() < this.tokens.expires_at - TOKEN_BUFFER_MS) {
|
|
261
|
-
return this.tokens.access_token;
|
|
262
|
-
}
|
|
263
|
-
// Refresh the token
|
|
264
|
-
const response = await fetch(TOKEN_URL, {
|
|
265
|
-
method: 'POST',
|
|
266
|
-
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
267
|
-
body: new URLSearchParams({
|
|
268
|
-
client_id: this.clientId,
|
|
269
|
-
client_secret: this.clientSecret,
|
|
270
|
-
refresh_token: this.tokens.refresh_token,
|
|
271
|
-
grant_type: 'refresh_token',
|
|
272
|
-
}),
|
|
273
|
-
});
|
|
274
|
-
if (!response.ok) {
|
|
275
|
-
const error = await response.text();
|
|
276
|
-
throw new Error(`Token refresh failed: ${error}`);
|
|
277
|
-
}
|
|
278
|
-
const data = (await response.json());
|
|
279
|
-
this.tokens.access_token = data.access_token;
|
|
280
|
-
this.tokens.expires_at = Date.now() + data.expires_in * 1000;
|
|
281
|
-
await this.saveTokens(this.tokens);
|
|
282
|
-
return data.access_token;
|
|
283
|
-
}
|
|
284
|
-
async exchangeCodeForTokens(code, redirectUri) {
|
|
285
|
-
const response = await fetch(TOKEN_URL, {
|
|
286
|
-
method: 'POST',
|
|
287
|
-
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
288
|
-
body: new URLSearchParams({
|
|
289
|
-
code,
|
|
290
|
-
client_id: this.clientId,
|
|
291
|
-
client_secret: this.clientSecret,
|
|
292
|
-
redirect_uri: redirectUri,
|
|
293
|
-
grant_type: 'authorization_code',
|
|
294
|
-
}),
|
|
295
|
-
});
|
|
296
|
-
if (!response.ok) {
|
|
297
|
-
const error = await response.text();
|
|
298
|
-
throw new Error(error);
|
|
299
|
-
}
|
|
300
|
-
const data = (await response.json());
|
|
301
|
-
await this.saveTokens({
|
|
302
|
-
access_token: data.access_token,
|
|
303
|
-
refresh_token: data.refresh_token,
|
|
304
|
-
token_type: data.token_type,
|
|
305
|
-
expires_at: Date.now() + data.expires_in * 1000,
|
|
306
|
-
scopes: data.scope.split(' '),
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
async findOrCreateContactGroup(accessToken, groupName) {
|
|
310
|
-
// List existing groups
|
|
311
|
-
const listResponse = await fetch(`${PEOPLE_API}/contactGroups`, {
|
|
312
|
-
headers: { Authorization: `Bearer ${accessToken}` },
|
|
313
|
-
});
|
|
314
|
-
if (listResponse.ok) {
|
|
315
|
-
const groups = (await listResponse.json());
|
|
316
|
-
const existing = groups.contactGroups?.find((g) => g.name === groupName && g.groupType === 'USER_CONTACT_GROUP');
|
|
317
|
-
if (existing)
|
|
318
|
-
return existing.resourceName;
|
|
319
|
-
}
|
|
320
|
-
// Create new group
|
|
321
|
-
const createResponse = await fetch(`${PEOPLE_API}/contactGroups`, {
|
|
322
|
-
method: 'POST',
|
|
323
|
-
headers: {
|
|
324
|
-
Authorization: `Bearer ${accessToken}`,
|
|
325
|
-
'Content-Type': 'application/json',
|
|
326
|
-
},
|
|
327
|
-
body: JSON.stringify({ contactGroup: { name: groupName } }),
|
|
328
|
-
});
|
|
329
|
-
if (createResponse.ok) {
|
|
330
|
-
const created = (await createResponse.json());
|
|
331
|
-
return created.resourceName;
|
|
332
|
-
}
|
|
333
|
-
return undefined;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
// ── Utilities ──────────────────────────────────────────────────────
|
|
337
|
-
function openBrowser(url) {
|
|
338
|
-
const cmd = process.platform === 'win32'
|
|
339
|
-
? `start "" "${url}"`
|
|
340
|
-
: process.platform === 'darwin'
|
|
341
|
-
? `open "${url}"`
|
|
342
|
-
: `xdg-open "${url}"`;
|
|
343
|
-
exec(cmd);
|
|
344
|
-
}
|
|
345
|
-
function htmlPage(title, message) {
|
|
346
|
-
return `<!DOCTYPE html>
|
|
347
|
-
<html><head><meta charset="utf-8"><title>HireBase</title>
|
|
348
|
-
<style>body{font-family:system-ui;display:flex;justify-content:center;align-items:center;min-height:100vh;margin:0;background:#f8fafc}
|
|
349
|
-
.card{text-align:center;padding:3rem;border-radius:1rem;background:white;box-shadow:0 4px 24px rgba(0,0,0,.08)}
|
|
350
|
-
h1{color:#0f172a;margin-bottom:.5rem}p{color:#64748b}</style>
|
|
351
|
-
</head><body><div class="card"><h1>${title}</h1><p>${message}</p></div></body></html>`;
|
|
352
|
-
}
|
|
353
|
-
//# sourceMappingURL=google-calendar.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"google-calendar.service.js","sourceRoot":"","sources":["../../../src/infrastructure/calendar/google-calendar.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { GoogleCalendarService } from './google-calendar.service.js';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infrastructure/calendar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC"}
|