@credal/actions 0.2.205 → 0.2.207
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/dist/actions/autogen/templates.d.ts +1 -0
- package/dist/actions/autogen/templates.js +52 -2
- package/dist/actions/autogen/types.d.ts +61 -0
- package/dist/actions/autogen/types.js +29 -0
- package/dist/actions/groups.d.ts +6 -0
- package/dist/actions/groups.js +251 -0
- package/dist/actions/providers/ashby/addCandidateToProject.d.ts +3 -0
- package/dist/actions/providers/ashby/addCandidateToProject.js +31 -0
- package/dist/actions/providers/ashby/createCandidate.d.ts +3 -0
- package/dist/actions/providers/ashby/createCandidate.js +38 -0
- package/dist/actions/providers/ashby/createNote.d.ts +3 -0
- package/dist/actions/providers/ashby/createNote.js +31 -0
- package/dist/actions/providers/ashby/getCandidateInfo.d.ts +3 -0
- package/dist/actions/providers/ashby/getCandidateInfo.js +33 -0
- package/dist/actions/providers/ashby/listCandidateNotes.d.ts +3 -0
- package/dist/actions/providers/ashby/listCandidateNotes.js +33 -0
- package/dist/actions/providers/ashby/listCandidates.d.ts +3 -0
- package/dist/actions/providers/ashby/listCandidates.js +30 -0
- package/dist/actions/providers/ashby/searchCandidates.d.ts +3 -0
- package/dist/actions/providers/ashby/searchCandidates.js +34 -0
- package/dist/actions/providers/ashby/updateCandidate.d.ts +3 -0
- package/dist/actions/providers/ashby/updateCandidate.js +56 -0
- package/dist/actions/providers/github/fetchFile.d.ts +3 -0
- package/dist/actions/providers/github/fetchFile.js +131 -0
- package/dist/actions/providers/github/getContents.d.ts +3 -0
- package/dist/actions/providers/github/getContents.js +41 -0
- package/dist/actions/providers/gong/getGongTranscripts.d.ts +3 -0
- package/dist/actions/providers/gong/getGongTranscripts.js +315 -0
- package/dist/actions/providers/jamf/getJamfComputerInventory.d.ts +3 -0
- package/dist/actions/providers/jamf/getJamfComputerInventory.js +37 -0
- package/dist/actions/providers/jamf/getJamfFileVaultRecoveryKey.d.ts +3 -0
- package/dist/actions/providers/jamf/getJamfFileVaultRecoveryKey.js +39 -0
- package/dist/actions/providers/jamf/getJamfUserComputerId.d.ts +3 -0
- package/dist/actions/providers/jamf/getJamfUserComputerId.js +45 -0
- package/dist/actions/providers/jamf/lockJamfComputerById.d.ts +3 -0
- package/dist/actions/providers/jamf/lockJamfComputerById.js +39 -0
- package/dist/actions/providers/kandji/getFVRecoveryKeyForDevice.d.ts +3 -0
- package/dist/actions/providers/kandji/getFVRecoveryKeyForDevice.js +85 -0
- package/dist/actions/providers/okta/addUserToGroup.d.ts +3 -0
- package/dist/actions/providers/okta/addUserToGroup.js +56 -0
- package/dist/actions/providers/okta/getOktaGroup.d.ts +3 -0
- package/dist/actions/providers/okta/getOktaGroup.js +73 -0
- package/dist/actions/providers/okta/getOktaUser.d.ts +3 -0
- package/dist/actions/providers/okta/getOktaUser.js +40 -0
- package/dist/actions/providers/okta/listMFA.d.ts +3 -0
- package/dist/actions/providers/okta/listMFA.js +52 -0
- package/dist/actions/providers/okta/listOktaGroupMembers.d.ts +3 -0
- package/dist/actions/providers/okta/listOktaGroupMembers.js +99 -0
- package/dist/actions/providers/okta/listOktaGroups.d.ts +3 -0
- package/dist/actions/providers/okta/listOktaGroups.js +92 -0
- package/dist/actions/providers/okta/listOktaUserGroups.d.ts +3 -0
- package/dist/actions/providers/okta/listOktaUserGroups.js +83 -0
- package/dist/actions/providers/okta/listOktaUsers.d.ts +3 -0
- package/dist/actions/providers/okta/listOktaUsers.js +100 -0
- package/dist/actions/providers/okta/removeUserFromGroup.d.ts +3 -0
- package/dist/actions/providers/okta/removeUserFromGroup.js +56 -0
- package/dist/actions/providers/okta/resetMFA.d.ts +3 -0
- package/dist/actions/providers/okta/resetMFA.js +62 -0
- package/dist/actions/providers/okta/resetPassword.d.ts +3 -0
- package/dist/actions/providers/okta/resetPassword.js +57 -0
- package/dist/actions/providers/okta/triggerOktaWorkflow.d.ts +3 -0
- package/dist/actions/providers/okta/triggerOktaWorkflow.js +44 -0
- package/dist/actions/providers/salesforce/executeReport.js +2 -1
- package/dist/actions/providers/salesforce/fetchSalesforceSchema.d.ts +3 -0
- package/dist/actions/providers/salesforce/fetchSalesforceSchema.js +40 -0
- package/dist/actions/providers/slack/archiveChannel.d.ts +3 -0
- package/dist/actions/providers/slack/archiveChannel.js +42 -0
- package/package.json +5 -4
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { axiosClient } from "../../util/axiosClient.js";
|
|
11
|
+
import { MISSING_AUTH_TOKEN } from "../../util/missingAuthConstants.js";
|
|
12
|
+
const listCandidateNotes = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
|
|
13
|
+
const { candidateId } = params;
|
|
14
|
+
const { authToken } = authParams;
|
|
15
|
+
if (!authToken) {
|
|
16
|
+
throw new Error(MISSING_AUTH_TOKEN);
|
|
17
|
+
}
|
|
18
|
+
const response = yield axiosClient.post(`https://api.ashbyhq.com/candidate.listNotes`, {
|
|
19
|
+
candidateId,
|
|
20
|
+
}, {
|
|
21
|
+
auth: {
|
|
22
|
+
username: authToken,
|
|
23
|
+
password: "",
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
if (!response.data.success) {
|
|
27
|
+
throw new Error(response.data.errors.join("; "));
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
notes: response.data.results,
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
export default listCandidateNotes;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { axiosClient } from "../../util/axiosClient.js";
|
|
11
|
+
import { MISSING_AUTH_TOKEN } from "../../util/missingAuthConstants.js";
|
|
12
|
+
const listCandidates = (_a) => __awaiter(void 0, [_a], void 0, function* ({ authParams, }) {
|
|
13
|
+
const { authToken } = authParams;
|
|
14
|
+
if (!authToken) {
|
|
15
|
+
throw new Error(MISSING_AUTH_TOKEN);
|
|
16
|
+
}
|
|
17
|
+
const response = yield axiosClient.post(`https://api.ashbyhq.com/candidate.list`, null, {
|
|
18
|
+
auth: {
|
|
19
|
+
username: authToken,
|
|
20
|
+
password: "",
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
if (!response.data.success) {
|
|
24
|
+
throw new Error(response.data.errors.join("; "));
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
candidates: response.data.results,
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
export default listCandidates;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { axiosClient } from "../../util/axiosClient.js";
|
|
11
|
+
import { MISSING_AUTH_TOKEN } from "../../util/missingAuthConstants.js";
|
|
12
|
+
const searchCandidates = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
|
|
13
|
+
const { email, name } = params;
|
|
14
|
+
const { authToken } = authParams;
|
|
15
|
+
if (!authToken) {
|
|
16
|
+
throw new Error(MISSING_AUTH_TOKEN);
|
|
17
|
+
}
|
|
18
|
+
const response = yield axiosClient.post(`https://api.ashbyhq.com/candidate.search`, {
|
|
19
|
+
email,
|
|
20
|
+
name,
|
|
21
|
+
}, {
|
|
22
|
+
auth: {
|
|
23
|
+
username: authToken,
|
|
24
|
+
password: "",
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
if (!response.data.success) {
|
|
28
|
+
throw new Error(response.data.errors.join("; "));
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
candidates: response.data.results,
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
export default searchCandidates;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { axiosClient } from "../../util/axiosClient.js";
|
|
11
|
+
import { MISSING_AUTH_TOKEN } from "../../util/missingAuthConstants.js";
|
|
12
|
+
const updateCandidate = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
|
|
13
|
+
const { authToken } = authParams;
|
|
14
|
+
if (!authToken) {
|
|
15
|
+
throw new Error(MISSING_AUTH_TOKEN);
|
|
16
|
+
}
|
|
17
|
+
const body = {
|
|
18
|
+
candidateId: params.candidateId,
|
|
19
|
+
};
|
|
20
|
+
if (params.name !== undefined)
|
|
21
|
+
body.name = params.name;
|
|
22
|
+
if (params.email !== undefined)
|
|
23
|
+
body.email = params.email;
|
|
24
|
+
if (params.phoneNumber !== undefined)
|
|
25
|
+
body.phoneNumber = params.phoneNumber;
|
|
26
|
+
if (params.linkedInUrl !== undefined)
|
|
27
|
+
body.linkedInUrl = params.linkedInUrl;
|
|
28
|
+
if (params.githubUrl !== undefined)
|
|
29
|
+
body.githubUrl = params.githubUrl;
|
|
30
|
+
if (params.websiteUrl !== undefined)
|
|
31
|
+
body.websiteUrl = params.websiteUrl;
|
|
32
|
+
if (params.alternateEmail !== undefined)
|
|
33
|
+
body.alternateEmail = params.alternateEmail;
|
|
34
|
+
if (params.socialLinks !== undefined)
|
|
35
|
+
body.socialLinks = params.socialLinks;
|
|
36
|
+
if (params.sourceId !== undefined)
|
|
37
|
+
body.sourceId = params.sourceId;
|
|
38
|
+
if (params.creditedToUserId !== undefined)
|
|
39
|
+
body.creditedToUserId = params.creditedToUserId;
|
|
40
|
+
if (params.location !== undefined)
|
|
41
|
+
body.location = params.location;
|
|
42
|
+
if (params.createdAt !== undefined)
|
|
43
|
+
body.createdAt = params.createdAt;
|
|
44
|
+
if (params.sendNotifications !== undefined)
|
|
45
|
+
body.sendNotifications = params.sendNotifications;
|
|
46
|
+
const response = yield axiosClient.post(`https://api.ashbyhq.com/candidate.update`, body, {
|
|
47
|
+
auth: {
|
|
48
|
+
username: authToken,
|
|
49
|
+
password: "",
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
if (!response.data.success) {
|
|
53
|
+
throw new Error(response.data.errors.join("; "));
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
export default updateCandidate;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { MISSING_AUTH_TOKEN } from "../../util/missingAuthConstants.js";
|
|
11
|
+
// Limits on the number of results to return
|
|
12
|
+
const MAX_CODE_RESULTS = 15;
|
|
13
|
+
const MAX_COMMITS = 10;
|
|
14
|
+
const MAX_FILES_PER_COMMIT = 5;
|
|
15
|
+
const MAX_ISSUES_OR_PRS = 10;
|
|
16
|
+
const MAX_FILES_PER_PR = 5;
|
|
17
|
+
const MAX_PATCH_LINES = 20;
|
|
18
|
+
const MAX_FRAGMENT_LINES = 20;
|
|
19
|
+
const searchRepository = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
|
|
20
|
+
const { Octokit } = yield import("octokit");
|
|
21
|
+
if (!authParams.authToken) {
|
|
22
|
+
throw new Error(MISSING_AUTH_TOKEN);
|
|
23
|
+
}
|
|
24
|
+
const octokit = new Octokit({ auth: authParams.authToken });
|
|
25
|
+
const { organization, repository, query } = params;
|
|
26
|
+
// Search CODE with text match metadata
|
|
27
|
+
const codeResultsResponse = yield octokit.rest.search.code({
|
|
28
|
+
q: `${query} in:file,path repo:${organization}/${repository}`,
|
|
29
|
+
text_match: true,
|
|
30
|
+
headers: {
|
|
31
|
+
accept: "application/vnd.github.v3.text-match+json",
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
const codeResults = codeResultsResponse.data.items.slice(0, MAX_CODE_RESULTS).map(item => ({
|
|
35
|
+
name: item.name,
|
|
36
|
+
path: item.path,
|
|
37
|
+
sha: item.sha,
|
|
38
|
+
url: item.url,
|
|
39
|
+
repository: {
|
|
40
|
+
full_name: item.repository.full_name,
|
|
41
|
+
html_url: item.repository.html_url,
|
|
42
|
+
},
|
|
43
|
+
score: item.score,
|
|
44
|
+
textMatches: item.text_matches
|
|
45
|
+
? item.text_matches.map(match => {
|
|
46
|
+
var _a, _b, _c, _d;
|
|
47
|
+
return ({
|
|
48
|
+
object_url: (_a = match.object_url) !== null && _a !== void 0 ? _a : undefined,
|
|
49
|
+
object_type: (_b = match.object_type) !== null && _b !== void 0 ? _b : undefined,
|
|
50
|
+
fragment: (_c = match.fragment) === null || _c === void 0 ? void 0 : _c.split("\n").slice(0, MAX_FRAGMENT_LINES).join("\n"),
|
|
51
|
+
matches: (_d = match.matches) !== null && _d !== void 0 ? _d : [],
|
|
52
|
+
});
|
|
53
|
+
})
|
|
54
|
+
: [],
|
|
55
|
+
}));
|
|
56
|
+
// Search COMMITS
|
|
57
|
+
const commitResults = yield octokit.rest.search.commits({
|
|
58
|
+
q: `${query} repo:${organization}/${repository}`,
|
|
59
|
+
headers: {
|
|
60
|
+
accept: "application/vnd.github.cloak-preview+json",
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
const commitSHAs = commitResults.data.items.slice(0, MAX_COMMITS).map(item => item.sha);
|
|
64
|
+
const commitDetails = yield Promise.all(commitSHAs.map(sha => octokit.rest.repos.getCommit({ owner: organization, repo: repository, ref: sha })));
|
|
65
|
+
const enrichedCommits = commitResults.data.items.slice(0, MAX_COMMITS).map(item => {
|
|
66
|
+
var _a, _b;
|
|
67
|
+
const full = commitDetails.find(c => c.data.sha === item.sha);
|
|
68
|
+
return {
|
|
69
|
+
sha: item.sha,
|
|
70
|
+
url: item.url,
|
|
71
|
+
commit: {
|
|
72
|
+
message: item.commit.message,
|
|
73
|
+
author: item.commit.author,
|
|
74
|
+
},
|
|
75
|
+
score: item.score,
|
|
76
|
+
author: (_a = item.author) !== null && _a !== void 0 ? _a : undefined,
|
|
77
|
+
files: ((_b = full === null || full === void 0 ? void 0 : full.data.files) === null || _b === void 0 ? void 0 : _b.slice(0, MAX_FILES_PER_COMMIT).map(f => {
|
|
78
|
+
var _a;
|
|
79
|
+
return ({
|
|
80
|
+
filename: f.filename,
|
|
81
|
+
status: f.status,
|
|
82
|
+
patch: (_a = f.patch) === null || _a === void 0 ? void 0 : _a.split("\n").slice(0, MAX_PATCH_LINES).join("\n"),
|
|
83
|
+
});
|
|
84
|
+
})) || [],
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
// Search ISSUES & PRs
|
|
88
|
+
const issueResults = yield octokit.rest.search.issuesAndPullRequests({
|
|
89
|
+
q: `${query} repo:${organization}/${repository}`,
|
|
90
|
+
});
|
|
91
|
+
const prItems = issueResults.data.items.filter(item => item.pull_request).slice(0, MAX_ISSUES_OR_PRS);
|
|
92
|
+
const prNumbers = prItems.map(item => item.number);
|
|
93
|
+
const prFiles = yield Promise.all(prNumbers.map(number => octokit.rest.pulls.listFiles({ owner: organization, repo: repository, pull_number: number })));
|
|
94
|
+
const issuesAndPRs = issueResults.data.items
|
|
95
|
+
.slice(0, MAX_ISSUES_OR_PRS)
|
|
96
|
+
.map(item => {
|
|
97
|
+
var _a, _b, _c, _d;
|
|
98
|
+
const isPR = !!item.pull_request;
|
|
99
|
+
const prIndex = prNumbers.indexOf(item.number);
|
|
100
|
+
const files = isPR && prIndex !== -1
|
|
101
|
+
? prFiles[prIndex].data.slice(0, MAX_FILES_PER_PR).map(f => {
|
|
102
|
+
var _a;
|
|
103
|
+
return ({
|
|
104
|
+
filename: f.filename,
|
|
105
|
+
status: f.status,
|
|
106
|
+
patch: (_a = f.patch) === null || _a === void 0 ? void 0 : _a.split("\n").slice(0, MAX_PATCH_LINES).join("\n"),
|
|
107
|
+
});
|
|
108
|
+
})
|
|
109
|
+
: undefined;
|
|
110
|
+
return {
|
|
111
|
+
number: item.number,
|
|
112
|
+
title: item.title,
|
|
113
|
+
html_url: item.html_url,
|
|
114
|
+
state: item.state,
|
|
115
|
+
isPullRequest: isPR,
|
|
116
|
+
body: item.body,
|
|
117
|
+
user: {
|
|
118
|
+
email: (_b = (_a = item.user) === null || _a === void 0 ? void 0 : _a.email) !== null && _b !== void 0 ? _b : undefined,
|
|
119
|
+
name: (_d = (_c = item.user) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : undefined,
|
|
120
|
+
},
|
|
121
|
+
score: item.score,
|
|
122
|
+
files,
|
|
123
|
+
};
|
|
124
|
+
});
|
|
125
|
+
return {
|
|
126
|
+
code: codeResults,
|
|
127
|
+
commits: enrichedCommits,
|
|
128
|
+
issuesAndPullRequests: issuesAndPRs,
|
|
129
|
+
};
|
|
130
|
+
});
|
|
131
|
+
export default searchRepository;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { MISSING_AUTH_TOKEN } from "../../util/missingAuthConstants.js";
|
|
11
|
+
// Limits on the number of results to return
|
|
12
|
+
const MAX_CODE_RESULTS = 15;
|
|
13
|
+
const MAX_COMMITS = 10;
|
|
14
|
+
const MAX_FILES_PER_COMMIT = 5;
|
|
15
|
+
const MAX_ISSUES_OR_PRS = 10;
|
|
16
|
+
const MAX_FILES_PER_PR = 5;
|
|
17
|
+
const MAX_PATCH_LINES = 20;
|
|
18
|
+
const MAX_FRAGMENT_LINES = 20;
|
|
19
|
+
const searchRepository = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
|
|
20
|
+
const { Octokit } = yield import("octokit");
|
|
21
|
+
if (!authParams.authToken) {
|
|
22
|
+
throw new Error(MISSING_AUTH_TOKEN);
|
|
23
|
+
}
|
|
24
|
+
const octokit = new Octokit({ auth: authParams.authToken });
|
|
25
|
+
const { organization, repository, query } = params;
|
|
26
|
+
// Search CODE with text match metadata
|
|
27
|
+
const codeResultsResponse = yield octokit.rest.search.code({
|
|
28
|
+
q: `${query} in:file,path repo:${organization}/${repository}`,
|
|
29
|
+
text_match: true,
|
|
30
|
+
headers: {
|
|
31
|
+
accept: "application/vnd.github.v3.text-match+json",
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
const commitResults = yield octokit.rest.repos.getCommit({ owner: organization, repo: repository, ref: sha });
|
|
35
|
+
return {
|
|
36
|
+
code: codeResults,
|
|
37
|
+
commits: enrichedCommits,
|
|
38
|
+
issuesAndPullRequests: issuesAndPRs,
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
export default searchRepository;
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
11
|
+
var t = {};
|
|
12
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
13
|
+
t[p] = s[p];
|
|
14
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
15
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
16
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
17
|
+
t[p[i]] = s[p[i]];
|
|
18
|
+
}
|
|
19
|
+
return t;
|
|
20
|
+
};
|
|
21
|
+
import axios, { AxiosError } from "axios";
|
|
22
|
+
import { z } from "zod";
|
|
23
|
+
import { MISSING_AUTH_TOKEN } from "../../util/missingAuthConstants.js";
|
|
24
|
+
const UserSchema = z
|
|
25
|
+
.object({
|
|
26
|
+
id: z.string(),
|
|
27
|
+
firstName: z.string(),
|
|
28
|
+
lastName: z.string(),
|
|
29
|
+
title: z.string().nullable(),
|
|
30
|
+
emailAddress: z.string(),
|
|
31
|
+
})
|
|
32
|
+
.partial()
|
|
33
|
+
.passthrough();
|
|
34
|
+
const CallSchema = z
|
|
35
|
+
.object({
|
|
36
|
+
metaData: z.object({
|
|
37
|
+
id: z.string(),
|
|
38
|
+
primaryUserId: z.string(),
|
|
39
|
+
started: z.string(),
|
|
40
|
+
isPrivate: z.boolean(),
|
|
41
|
+
title: z.string(),
|
|
42
|
+
}),
|
|
43
|
+
parties: z.array(z
|
|
44
|
+
.object({
|
|
45
|
+
id: z.string(),
|
|
46
|
+
name: z.string(),
|
|
47
|
+
userId: z.string(),
|
|
48
|
+
emailAddress: z.string(),
|
|
49
|
+
speakerId: z.string().nullable(),
|
|
50
|
+
})
|
|
51
|
+
.partial()
|
|
52
|
+
.passthrough()),
|
|
53
|
+
content: z.object({
|
|
54
|
+
trackers: z.array(z.object({
|
|
55
|
+
id: z.string(),
|
|
56
|
+
name: z.string(),
|
|
57
|
+
})),
|
|
58
|
+
}),
|
|
59
|
+
})
|
|
60
|
+
.partial()
|
|
61
|
+
.passthrough();
|
|
62
|
+
const SentenceSchema = z
|
|
63
|
+
.object({
|
|
64
|
+
start: z.number(),
|
|
65
|
+
end: z.number(),
|
|
66
|
+
text: z.string(),
|
|
67
|
+
})
|
|
68
|
+
.partial()
|
|
69
|
+
.passthrough();
|
|
70
|
+
const TranscriptSchema = z
|
|
71
|
+
.object({
|
|
72
|
+
callId: z.string(),
|
|
73
|
+
transcript: z.array(z
|
|
74
|
+
.object({
|
|
75
|
+
speakerId: z.string(),
|
|
76
|
+
topic: z.string().nullable(),
|
|
77
|
+
sentences: z.array(SentenceSchema),
|
|
78
|
+
})
|
|
79
|
+
.partial()
|
|
80
|
+
.passthrough()),
|
|
81
|
+
})
|
|
82
|
+
.partial()
|
|
83
|
+
.passthrough();
|
|
84
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
85
|
+
const GongResponseSchema = z.object({
|
|
86
|
+
users: z.array(UserSchema).optional(),
|
|
87
|
+
calls: z.array(CallSchema).optional(),
|
|
88
|
+
callTranscripts: z.array(TranscriptSchema).optional(),
|
|
89
|
+
cursor: z.string().optional(),
|
|
90
|
+
});
|
|
91
|
+
function getUsers(authToken) {
|
|
92
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
93
|
+
var _a;
|
|
94
|
+
const results = [];
|
|
95
|
+
let cursor = undefined;
|
|
96
|
+
do {
|
|
97
|
+
const response = yield axios.get(`https://api.gong.io/v2/users` + (cursor ? `?cursor=${cursor}` : ""), {
|
|
98
|
+
headers: {
|
|
99
|
+
Authorization: `Bearer ${authToken}`,
|
|
100
|
+
"Content-Type": "application/json",
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
if (!response) {
|
|
104
|
+
return results;
|
|
105
|
+
}
|
|
106
|
+
for (const user of (_a = response.data.users) !== null && _a !== void 0 ? _a : []) {
|
|
107
|
+
const parsedUser = UserSchema.safeParse(user);
|
|
108
|
+
if (parsedUser.success) {
|
|
109
|
+
results.push(parsedUser.data);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
cursor = response.data.cursor;
|
|
113
|
+
} while (cursor);
|
|
114
|
+
return results;
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
function getCalls(authToken_1) {
|
|
118
|
+
return __awaiter(this, arguments, void 0, function* (authToken, params = {}) {
|
|
119
|
+
let results = [];
|
|
120
|
+
let cursor = undefined;
|
|
121
|
+
do {
|
|
122
|
+
const response = yield axios.post(`https://api.gong.io/v2/calls/extensive` + (cursor ? `?cursor=${cursor}` : ""), {
|
|
123
|
+
filter: Object.assign({}, params),
|
|
124
|
+
contentSelector: {
|
|
125
|
+
exposedFields: {
|
|
126
|
+
parties: true,
|
|
127
|
+
content: {
|
|
128
|
+
trackers: true,
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
}, {
|
|
133
|
+
headers: {
|
|
134
|
+
Authorization: `Bearer ${authToken}`,
|
|
135
|
+
"Content-Type": "application/json",
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
if (!response) {
|
|
139
|
+
return results;
|
|
140
|
+
}
|
|
141
|
+
const parsedItems = z.array(CallSchema).safeParse(response.data.calls);
|
|
142
|
+
if (parsedItems.success) {
|
|
143
|
+
results = [...results, ...parsedItems.data];
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
return results;
|
|
147
|
+
}
|
|
148
|
+
cursor = response.data.cursor;
|
|
149
|
+
} while (cursor);
|
|
150
|
+
return results;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
function getTranscripts(authToken_1) {
|
|
154
|
+
return __awaiter(this, arguments, void 0, function* (authToken, params = {}) {
|
|
155
|
+
let results = [];
|
|
156
|
+
let cursor = undefined;
|
|
157
|
+
do {
|
|
158
|
+
const response = yield axios.post(`https://api.gong.io/v2/calls/transcript` + (cursor ? `?cursor=${cursor}` : ""), {
|
|
159
|
+
filter: Object.assign({}, params),
|
|
160
|
+
}, {
|
|
161
|
+
headers: {
|
|
162
|
+
Authorization: `Bearer ${authToken}`,
|
|
163
|
+
"Content-Type": "application/json",
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
if (!response) {
|
|
167
|
+
return results;
|
|
168
|
+
}
|
|
169
|
+
const parsedItems = z.array(TranscriptSchema).safeParse(response.data.callTranscripts);
|
|
170
|
+
if (parsedItems.success) {
|
|
171
|
+
results = [...results, ...parsedItems.data];
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
return results;
|
|
175
|
+
}
|
|
176
|
+
cursor = response.data.cursor;
|
|
177
|
+
} while (cursor);
|
|
178
|
+
return results;
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
// Retrieves transcripts from Gong based on the provided parameters
|
|
182
|
+
const getGongTranscripts = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
|
|
183
|
+
var _b, _c, _d, _e, _f, _g, _h;
|
|
184
|
+
if (!authParams.authToken) {
|
|
185
|
+
return {
|
|
186
|
+
success: false,
|
|
187
|
+
error: MISSING_AUTH_TOKEN,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
if (!authParams.username) {
|
|
191
|
+
return {
|
|
192
|
+
success: false,
|
|
193
|
+
error: "Missing user email",
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
try {
|
|
197
|
+
const gongUsers = yield getUsers(authParams.authToken);
|
|
198
|
+
const userEmails = gongUsers.map(user => user.emailAddress);
|
|
199
|
+
if (!userEmails.includes(authParams.username)) {
|
|
200
|
+
return {
|
|
201
|
+
success: false,
|
|
202
|
+
error: "User email not found in Gong users",
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
const filteredGongUsers = gongUsers.filter(user => user.title === params.userRole);
|
|
206
|
+
const filteredPrimaryIds = filteredGongUsers.map(user => user.id).filter((id) => id !== undefined);
|
|
207
|
+
if (filteredPrimaryIds.length === 0) {
|
|
208
|
+
return {
|
|
209
|
+
success: false,
|
|
210
|
+
error: "No Gong users found with the specified role",
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
const calls = yield getCalls(authParams.authToken, {
|
|
214
|
+
fromDateTime: (_b = params.startDate) !== null && _b !== void 0 ? _b : "",
|
|
215
|
+
toDateTime: (_c = params.endDate) !== null && _c !== void 0 ? _c : "",
|
|
216
|
+
primaryUserIds: filteredPrimaryIds,
|
|
217
|
+
});
|
|
218
|
+
const callsWithTrackers = calls.filter(call => {
|
|
219
|
+
// If the user didn't provide any trackers to filter on, return all calls
|
|
220
|
+
if (!params.trackers || params.trackers.length === 0) {
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
// Filter out calls that don't have trackers if the user specified trackers
|
|
224
|
+
if (!call.content || !call.content.trackers) {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
const trackerNames = call.content.trackers.map(tracker => tracker.name);
|
|
228
|
+
// Check if any of the trackers in the call match the ones provided by the user
|
|
229
|
+
return params.trackers.some(tr => trackerNames.includes(tr));
|
|
230
|
+
});
|
|
231
|
+
const publicCalls = callsWithTrackers.filter(call => {
|
|
232
|
+
if (!call.metaData) {
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
return !call.metaData.isPrivate;
|
|
236
|
+
});
|
|
237
|
+
if (publicCalls.length === 0) {
|
|
238
|
+
return {
|
|
239
|
+
success: true,
|
|
240
|
+
callTranscripts: [],
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
// Get transcripts for the calls we found
|
|
244
|
+
const callTranscripts = yield getTranscripts(authParams.authToken, {
|
|
245
|
+
fromDateTime: (_d = params.startDate) !== null && _d !== void 0 ? _d : "",
|
|
246
|
+
toDateTime: (_e = params.endDate) !== null && _e !== void 0 ? _e : "",
|
|
247
|
+
callIds: publicCalls.map(call => { var _a; return (_a = call.metaData) === null || _a === void 0 ? void 0 : _a.id; }).filter((id) => id !== undefined),
|
|
248
|
+
});
|
|
249
|
+
// Map speaker IDs to names in the transcripts
|
|
250
|
+
const userIdToNameMap = {};
|
|
251
|
+
const userIdToEmailMap = {};
|
|
252
|
+
const callIdToEmails = {};
|
|
253
|
+
publicCalls.forEach(call => {
|
|
254
|
+
var _a;
|
|
255
|
+
// Check if call has parties array
|
|
256
|
+
if (call.parties && Array.isArray(call.parties)) {
|
|
257
|
+
// Iterate through each party in the call
|
|
258
|
+
if ((_a = call.metaData) === null || _a === void 0 ? void 0 : _a.id) {
|
|
259
|
+
callIdToEmails[call.metaData.id] = [];
|
|
260
|
+
call.parties.forEach(party => {
|
|
261
|
+
var _a;
|
|
262
|
+
// Add the mapping of speakerId to name
|
|
263
|
+
if (party.speakerId) {
|
|
264
|
+
if (party.name) {
|
|
265
|
+
userIdToNameMap[party.speakerId] = party.name;
|
|
266
|
+
}
|
|
267
|
+
if (party.emailAddress) {
|
|
268
|
+
userIdToEmailMap[party.speakerId] = party.emailAddress;
|
|
269
|
+
if ((_a = call.metaData) === null || _a === void 0 ? void 0 : _a.id) {
|
|
270
|
+
callIdToEmails[call.metaData.id].push(party.emailAddress);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
const callTranscriptsWithNames = callTranscripts
|
|
279
|
+
.map(callTranscript => {
|
|
280
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
281
|
+
const currTranscript = Object.assign({}, callTranscript);
|
|
282
|
+
const callId = callTranscript.callId;
|
|
283
|
+
currTranscript.transcript = (_a = callTranscript.transcript) === null || _a === void 0 ? void 0 : _a.map(transcript => {
|
|
284
|
+
var _a, _b;
|
|
285
|
+
const { speakerId } = transcript, rest = __rest(transcript, ["speakerId"]);
|
|
286
|
+
return Object.assign(Object.assign({}, rest), { speakerName: (_a = userIdToNameMap[speakerId !== null && speakerId !== void 0 ? speakerId : ""]) !== null && _a !== void 0 ? _a : "Unknown", speakerEmail: (_b = userIdToEmailMap[speakerId !== null && speakerId !== void 0 ? speakerId : ""]) !== null && _b !== void 0 ? _b : "Unknown" });
|
|
287
|
+
});
|
|
288
|
+
return Object.assign({ callName: (_d = (_c = (_b = publicCalls.find(call => { var _a; return ((_a = call.metaData) === null || _a === void 0 ? void 0 : _a.id) === callTranscript.callId; })) === null || _b === void 0 ? void 0 : _b.metaData) === null || _c === void 0 ? void 0 : _c.title) !== null && _d !== void 0 ? _d : "", userEmails: (_e = callIdToEmails[callId]) !== null && _e !== void 0 ? _e : [], startTime: (_h = (_g = (_f = publicCalls.find(call => { var _a; return ((_a = call.metaData) === null || _a === void 0 ? void 0 : _a.id) === callTranscript.callId; })) === null || _f === void 0 ? void 0 : _f.metaData) === null || _g === void 0 ? void 0 : _g.started) !== null && _h !== void 0 ? _h : "" }, currTranscript);
|
|
289
|
+
})
|
|
290
|
+
.filter(callTranscript => {
|
|
291
|
+
var _a;
|
|
292
|
+
if (!params.company || params.company === "") {
|
|
293
|
+
return true; // If no company filter is provided, include all transcripts
|
|
294
|
+
}
|
|
295
|
+
for (const email of callIdToEmails[callTranscript.callId]) {
|
|
296
|
+
const companyName = (_a = params.company) === null || _a === void 0 ? void 0 : _a.toLowerCase().replace(/ /g, "");
|
|
297
|
+
if (email.includes(companyName)) {
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return false;
|
|
302
|
+
});
|
|
303
|
+
return {
|
|
304
|
+
success: true,
|
|
305
|
+
callTranscripts: callTranscriptsWithNames,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
catch (error) {
|
|
309
|
+
return {
|
|
310
|
+
success: false,
|
|
311
|
+
error: error instanceof AxiosError ? ((_h = (_g = (_f = error.response) === null || _f === void 0 ? void 0 : _f.data) === null || _g === void 0 ? void 0 : _g.errors) !== null && _h !== void 0 ? _h : error.message) : error,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
export default getGongTranscripts;
|