@credal/actions 0.2.142 → 0.2.143
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/groups.d.ts +6 -0
- package/dist/actions/groups.js +248 -0
- package/dist/actions/providers/credal/callCopilot.d.ts +3 -0
- package/dist/actions/providers/credal/callCopilot.js +36 -0
- package/dist/actions/providers/google-oauth/searchDriveByKeywordsAndGetFileContent.js +40 -7
- package/dist/actions/providers/google-oauth/searchDriveByQuery.js +5 -5
- package/dist/actions/providers/math/index.d.ts +1 -0
- package/dist/actions/providers/math/index.js +37 -0
- package/dist/actions/providers/salesforce/getSalesforceRecordByQuery.d.ts +3 -0
- package/dist/actions/providers/salesforce/getSalesforceRecordByQuery.js +43 -0
- package/dist/actions/providers/slack/archiveChannel.d.ts +3 -0
- package/dist/actions/providers/slack/archiveChannel.js +35 -0
- package/dist/actions/providers/slack/index.d.ts +1 -0
- package/dist/actions/providers/slack/index.js +37 -0
- package/dist/actions/providers/slack/listConversations.d.ts +3 -0
- package/dist/actions/providers/slack/listConversations.js +41 -0
- package/dist/utils/google.js +53 -28
- package/package.json +1 -1
- package/dist/actions/providers/jira/updateServiceDeskRequest.d.ts +0 -3
- package/dist/actions/providers/jira/updateServiceDeskRequest.js +0 -72
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { genericFillTemplateDefinition, confluenceOverwritePageDefinition, googlemapsValidateAddressDefinition, mathAddDefinition, mongoInsertMongoDocDefinition, slackSendMessageDefinition, slackGetChannelMessagesDefinition, slackCreateChannelDefinition, slackArchiveChannelDefinition, snowflakeGetRowByFieldValueDefinition, zendeskCreateZendeskTicketDefinition, zendeskListZendeskTicketsDefinition, zendeskGetTicketDetailsDefinition, zendeskUpdateTicketStatusDefinition, zendeskAddCommentToTicketDefinition, zendeskAssignTicketDefinition, openstreetmapGetLatitudeLongitudeFromLocationDefinition, nwsGetForecastForLocationDefinition, jiraAssignJiraTicketDefinition, jiraCommentJiraTicketDefinition, jiraCreateJiraTicketDefinition, jiraGetJiraTicketDetailsDefinition, jiraGetJiraTicketHistoryDefinition, jiraUpdateJiraTicketDetailsDefinition, jiraUpdateJiraTicketStatusDefinition, jiraGetServiceDesksDefinition, jiraCreateServiceDeskRequestDefinition, googlemapsNearbysearchRestaurantsDefinition, firecrawlScrapeUrlDefinition, resendSendEmailDefinition, linkedinCreateShareLinkedinPostUrlDefinition, googleOauthCreateNewGoogleDocDefinition, xCreateShareXPostUrlDefinition, firecrawlScrapeTweetDataWithNitterDefinition, finnhubSymbolLookupDefinition, finnhubGetBasicFinancialsDefinition, confluenceFetchPageContentDefinition, snowflakeRunSnowflakeQueryDefinition, lookerEnableUserByEmailDefinition, googleOauthUpdateDocDefinition, googleOauthScheduleCalendarMeetingDefinition, googleOauthListCalendarsDefinition, googleOauthListCalendarEventsDefinition, googleOauthUpdateCalendarEventDefinition, googleOauthDeleteCalendarEventDefinition, googleOauthCreateSpreadsheetDefinition, googleOauthUpdateSpreadsheetDefinition, googleOauthCreatePresentationDefinition, googleOauthUpdatePresentationDefinition, googleOauthSearchDriveByKeywordsDefinition, googlemailSearchGmailMessagesDefinition, googlemailListGmailThreadsDefinition, googleOauthListGroupsDefinition, googleOauthGetGroupDefinition, googleOauthListGroupMembersDefinition, googleOauthHasGroupMemberDefinition, googleOauthAddGroupMemberDefinition, googleOauthDeleteGroupMemberDefinition, salesforceUpdateRecordDefinition, salesforceCreateCaseDefinition, salesforceGenerateSalesReportDefinition, salesforceGetRecordDefinition, salesforceGetSalesforceRecordsByQueryDefinition, microsoftMessageTeamsChatDefinition, microsoftMessageTeamsChannelDefinition, asanaCommentTaskDefinition, asanaCreateTaskDefinition, asanaUpdateTaskDefinition, asanaSearchTasksDefinition, githubCreateOrUpdateFileDefinition, githubCreateBranchDefinition, githubCreatePullRequestDefinition, microsoftUpdateSpreadsheetDefinition, microsoftUpdateDocumentDefinition, microsoftCreateDocumentDefinition, microsoftGetDocumentDefinition, salesforceFetchSalesforceSchemaByObjectDefinition, firecrawlDeepResearchDefinition, jiraGetJiraIssuesByQueryDefinition, githubListPullRequestsDefinition, salesforceCreateRecordDefinition, ashbyCreateNoteDefinition, ashbyGetCandidateInfoDefinition, ashbyListCandidatesDefinition, ashbyListCandidateNotesDefinition, ashbySearchCandidatesDefinition, ashbyCreateCandidateDefinition, ashbyUpdateCandidateDefinition, ashbyAddCandidateToProjectDefinition, bingGetTopNSearchResultUrlsDefinition, gongGetGongTranscriptsDefinition, kandjiGetFVRecoveryKeyForDeviceDefinition, asanaListAsanaTasksByProjectDefinition, notionSearchByTitleDefinition, asanaGetTasksDetailsDefinition, jamfGetJamfComputerInventoryDefinition, jamfGetJamfFileVaultRecoveryKeyDefinition, oktaListOktaUsersDefinition, oktaGetOktaUserDefinition, oktaListOktaUserGroupsDefinition, oktaListOktaGroupsDefinition, oktaGetOktaGroupDefinition, oktaListOktaGroupMembersDefinition, oktaRemoveUserFromGroupDefinition, oktaAddUserToGroupDefinition, oktaResetPasswordDefinition, oktaResetMFADefinition, oktaListMFADefinition, jamfGetJamfUserComputerIdDefinition, jamfLockJamfComputerByIdDefinition, oktaTriggerOktaWorkflowDefinition, jiraOrgAssignJiraTicketDefinition, jiraOrgCreateJiraTicketDefinition, jiraOrgCommentJiraTicketDefinition, jiraOrgGetJiraTicketDetailsDefinition, jiraOrgGetJiraTicketHistoryDefinition, jiraOrgUpdateJiraTicketDetailsDefinition, jiraOrgUpdateJiraTicketStatusDefinition, jiraOrgGetJiraIssuesByQueryDefinition, googleOauthGetDriveFileContentByIdDefinition, googleOauthSearchDriveByQueryDefinition, } from "./autogen/templates.js";
|
|
2
|
+
export const ACTION_GROUPS = {
|
|
3
|
+
GENERIC: {
|
|
4
|
+
description: "Generic utility actions",
|
|
5
|
+
actions: [genericFillTemplateDefinition],
|
|
6
|
+
},
|
|
7
|
+
ASANA: {
|
|
8
|
+
description: "Actions for interacting with Asana",
|
|
9
|
+
actions: [
|
|
10
|
+
asanaCommentTaskDefinition,
|
|
11
|
+
asanaCreateTaskDefinition,
|
|
12
|
+
asanaUpdateTaskDefinition,
|
|
13
|
+
asanaSearchTasksDefinition,
|
|
14
|
+
asanaListAsanaTasksByProjectDefinition,
|
|
15
|
+
asanaGetTasksDetailsDefinition,
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
SLACK_LIST_CONVERSATIONS: {
|
|
19
|
+
description: "Actions for interacting with Slack",
|
|
20
|
+
actions: [
|
|
21
|
+
slackSendMessageDefinition,
|
|
22
|
+
slackGetChannelMessagesDefinition,
|
|
23
|
+
slackCreateChannelDefinition,
|
|
24
|
+
slackArchiveChannelDefinition,
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
CONFLUENCE: {
|
|
28
|
+
description: "Action for interacting with Confluence",
|
|
29
|
+
actions: [confluenceOverwritePageDefinition, confluenceFetchPageContentDefinition],
|
|
30
|
+
},
|
|
31
|
+
MATH_ADD: {
|
|
32
|
+
description: "Action for adding two numbers",
|
|
33
|
+
actions: [mathAddDefinition],
|
|
34
|
+
},
|
|
35
|
+
GOOGLE_MAPS: {
|
|
36
|
+
description: "Action for interacting with Google Maps",
|
|
37
|
+
actions: [googlemapsValidateAddressDefinition, googlemapsNearbysearchRestaurantsDefinition],
|
|
38
|
+
},
|
|
39
|
+
GOOGLE_DRIVE: {
|
|
40
|
+
description: "Action for interacting with Google Drive",
|
|
41
|
+
actions: [
|
|
42
|
+
googleOauthCreateNewGoogleDocDefinition,
|
|
43
|
+
googleOauthUpdateDocDefinition,
|
|
44
|
+
googleOauthCreateSpreadsheetDefinition,
|
|
45
|
+
googleOauthUpdateSpreadsheetDefinition,
|
|
46
|
+
googleOauthCreatePresentationDefinition,
|
|
47
|
+
googleOauthUpdatePresentationDefinition,
|
|
48
|
+
googleOauthSearchDriveByKeywordsDefinition,
|
|
49
|
+
googleOauthSearchDriveByQueryDefinition,
|
|
50
|
+
googleOauthGetDriveFileContentByIdDefinition,
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
GOOGLE_CALENDAR: {
|
|
54
|
+
description: "Actions for interacting with Google Calendar",
|
|
55
|
+
actions: [
|
|
56
|
+
googleOauthScheduleCalendarMeetingDefinition,
|
|
57
|
+
googleOauthListCalendarsDefinition,
|
|
58
|
+
googleOauthListCalendarEventsDefinition,
|
|
59
|
+
googleOauthUpdateCalendarEventDefinition,
|
|
60
|
+
googleOauthDeleteCalendarEventDefinition,
|
|
61
|
+
],
|
|
62
|
+
},
|
|
63
|
+
GMAIL: {
|
|
64
|
+
description: "Actions for interacting with Gmail",
|
|
65
|
+
actions: [googlemailSearchGmailMessagesDefinition, googlemailListGmailThreadsDefinition],
|
|
66
|
+
},
|
|
67
|
+
LINKEDIN_SHARE_POST: {
|
|
68
|
+
description: "Action for creating a share post url on linkedin",
|
|
69
|
+
actions: [linkedinCreateShareLinkedinPostUrlDefinition],
|
|
70
|
+
},
|
|
71
|
+
ZENDESK_ACTIONS: {
|
|
72
|
+
description: "Actions for interacting with Zendesk",
|
|
73
|
+
actions: [
|
|
74
|
+
zendeskCreateZendeskTicketDefinition,
|
|
75
|
+
zendeskListZendeskTicketsDefinition,
|
|
76
|
+
zendeskGetTicketDetailsDefinition,
|
|
77
|
+
zendeskUpdateTicketStatusDefinition,
|
|
78
|
+
zendeskAddCommentToTicketDefinition,
|
|
79
|
+
zendeskAssignTicketDefinition,
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
BING_SEARCH: {
|
|
83
|
+
description: "Action for searching Bing",
|
|
84
|
+
actions: [bingGetTopNSearchResultUrlsDefinition],
|
|
85
|
+
},
|
|
86
|
+
MONGO_INSERT_DOC: {
|
|
87
|
+
description: "Action for inserting a document into a MongoDB collection",
|
|
88
|
+
actions: [mongoInsertMongoDocDefinition],
|
|
89
|
+
},
|
|
90
|
+
SNOWFLAKE_ACTIONS: {
|
|
91
|
+
description: "Action for getting content from a Snowflake table",
|
|
92
|
+
actions: [snowflakeGetRowByFieldValueDefinition, snowflakeRunSnowflakeQueryDefinition],
|
|
93
|
+
},
|
|
94
|
+
JIRA_ACTIONS: {
|
|
95
|
+
description: "Action for interacting with Jira tickets",
|
|
96
|
+
actions: [
|
|
97
|
+
jiraAssignJiraTicketDefinition,
|
|
98
|
+
jiraCreateJiraTicketDefinition,
|
|
99
|
+
jiraCommentJiraTicketDefinition,
|
|
100
|
+
jiraGetJiraTicketDetailsDefinition,
|
|
101
|
+
jiraGetJiraTicketHistoryDefinition,
|
|
102
|
+
jiraUpdateJiraTicketDetailsDefinition,
|
|
103
|
+
jiraUpdateJiraTicketStatusDefinition,
|
|
104
|
+
jiraGetJiraIssuesByQueryDefinition,
|
|
105
|
+
jiraGetServiceDesksDefinition,
|
|
106
|
+
jiraCreateServiceDeskRequestDefinition,
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
JIRA_ORG_ACTIONS: {
|
|
110
|
+
description: "Action for interacting with Jira tickets",
|
|
111
|
+
actions: [
|
|
112
|
+
jiraOrgAssignJiraTicketDefinition,
|
|
113
|
+
jiraOrgCreateJiraTicketDefinition,
|
|
114
|
+
jiraOrgCommentJiraTicketDefinition,
|
|
115
|
+
jiraOrgGetJiraTicketDetailsDefinition,
|
|
116
|
+
jiraOrgGetJiraTicketHistoryDefinition,
|
|
117
|
+
jiraOrgUpdateJiraTicketDetailsDefinition,
|
|
118
|
+
jiraOrgUpdateJiraTicketStatusDefinition,
|
|
119
|
+
jiraOrgGetJiraIssuesByQueryDefinition,
|
|
120
|
+
],
|
|
121
|
+
},
|
|
122
|
+
OPENSTREETMAP_GET_LATITUDE_LONGITUDE_FROM_LOCATION: {
|
|
123
|
+
description: "Action for getting the latitude and longitude of a location",
|
|
124
|
+
actions: [openstreetmapGetLatitudeLongitudeFromLocationDefinition],
|
|
125
|
+
},
|
|
126
|
+
NWS_GET_FORECAST_FOR_LOCATION: {
|
|
127
|
+
description: "Action for getting the weather forecast for a location",
|
|
128
|
+
actions: [nwsGetForecastForLocationDefinition],
|
|
129
|
+
},
|
|
130
|
+
FIRECRAWL: {
|
|
131
|
+
description: "Actions for interacting with Firecrawl",
|
|
132
|
+
actions: [
|
|
133
|
+
firecrawlScrapeUrlDefinition,
|
|
134
|
+
firecrawlScrapeTweetDataWithNitterDefinition,
|
|
135
|
+
firecrawlDeepResearchDefinition,
|
|
136
|
+
],
|
|
137
|
+
},
|
|
138
|
+
RESEND: {
|
|
139
|
+
description: "Action for sending an email",
|
|
140
|
+
actions: [resendSendEmailDefinition],
|
|
141
|
+
},
|
|
142
|
+
X: {
|
|
143
|
+
description: "Actions for interacting with X(formerly twitter)",
|
|
144
|
+
actions: [xCreateShareXPostUrlDefinition],
|
|
145
|
+
},
|
|
146
|
+
GONG: {
|
|
147
|
+
description: "Actions for interacting with Gong",
|
|
148
|
+
actions: [gongGetGongTranscriptsDefinition],
|
|
149
|
+
},
|
|
150
|
+
FINNHUB: {
|
|
151
|
+
description: "Action for interacting with Finnhub for stock market data",
|
|
152
|
+
actions: [finnhubSymbolLookupDefinition, finnhubGetBasicFinancialsDefinition],
|
|
153
|
+
},
|
|
154
|
+
JAMF: {
|
|
155
|
+
description: "Actions for interacting with Jamf",
|
|
156
|
+
actions: [
|
|
157
|
+
jamfGetJamfComputerInventoryDefinition,
|
|
158
|
+
jamfGetJamfFileVaultRecoveryKeyDefinition,
|
|
159
|
+
jamfGetJamfUserComputerIdDefinition,
|
|
160
|
+
jamfLockJamfComputerByIdDefinition,
|
|
161
|
+
],
|
|
162
|
+
},
|
|
163
|
+
LOOKER: {
|
|
164
|
+
description: "Actions for interacting with Looker",
|
|
165
|
+
actions: [lookerEnableUserByEmailDefinition],
|
|
166
|
+
},
|
|
167
|
+
SALESFORCE: {
|
|
168
|
+
description: "Actions for interacting with Salesforce",
|
|
169
|
+
actions: [
|
|
170
|
+
salesforceUpdateRecordDefinition,
|
|
171
|
+
salesforceCreateRecordDefinition,
|
|
172
|
+
salesforceCreateCaseDefinition,
|
|
173
|
+
salesforceGenerateSalesReportDefinition,
|
|
174
|
+
salesforceGetRecordDefinition,
|
|
175
|
+
salesforceGetSalesforceRecordsByQueryDefinition,
|
|
176
|
+
salesforceFetchSalesforceSchemaByObjectDefinition,
|
|
177
|
+
],
|
|
178
|
+
},
|
|
179
|
+
MICROSOFT: {
|
|
180
|
+
description: "Actions for interacting with Microsoft 365",
|
|
181
|
+
actions: [
|
|
182
|
+
microsoftMessageTeamsChatDefinition,
|
|
183
|
+
microsoftMessageTeamsChannelDefinition,
|
|
184
|
+
microsoftUpdateSpreadsheetDefinition,
|
|
185
|
+
microsoftUpdateDocumentDefinition,
|
|
186
|
+
microsoftCreateDocumentDefinition,
|
|
187
|
+
microsoftGetDocumentDefinition,
|
|
188
|
+
],
|
|
189
|
+
},
|
|
190
|
+
KANDJI: {
|
|
191
|
+
description: "Actions for interacting with Kandji",
|
|
192
|
+
actions: [kandjiGetFVRecoveryKeyForDeviceDefinition],
|
|
193
|
+
},
|
|
194
|
+
GITHUB: {
|
|
195
|
+
description: "Actions for interacting with GitHub",
|
|
196
|
+
actions: [
|
|
197
|
+
githubCreateOrUpdateFileDefinition,
|
|
198
|
+
githubCreateBranchDefinition,
|
|
199
|
+
githubCreatePullRequestDefinition,
|
|
200
|
+
githubListPullRequestsDefinition,
|
|
201
|
+
],
|
|
202
|
+
},
|
|
203
|
+
ASHBY: {
|
|
204
|
+
description: "Actions for interacting with Ashby",
|
|
205
|
+
actions: [
|
|
206
|
+
ashbyCreateNoteDefinition,
|
|
207
|
+
ashbyGetCandidateInfoDefinition,
|
|
208
|
+
ashbyListCandidatesDefinition,
|
|
209
|
+
ashbyListCandidateNotesDefinition,
|
|
210
|
+
ashbySearchCandidatesDefinition,
|
|
211
|
+
ashbyCreateCandidateDefinition,
|
|
212
|
+
ashbyUpdateCandidateDefinition,
|
|
213
|
+
ashbyAddCandidateToProjectDefinition,
|
|
214
|
+
],
|
|
215
|
+
},
|
|
216
|
+
NOTION: {
|
|
217
|
+
description: "Actions for interacting with Notion",
|
|
218
|
+
actions: [notionSearchByTitleDefinition],
|
|
219
|
+
},
|
|
220
|
+
GOOGLE_GROUPS: {
|
|
221
|
+
description: "Google Workspace Groups management actions",
|
|
222
|
+
actions: [
|
|
223
|
+
googleOauthListGroupsDefinition,
|
|
224
|
+
googleOauthGetGroupDefinition,
|
|
225
|
+
googleOauthListGroupMembersDefinition,
|
|
226
|
+
googleOauthHasGroupMemberDefinition,
|
|
227
|
+
googleOauthAddGroupMemberDefinition,
|
|
228
|
+
googleOauthDeleteGroupMemberDefinition,
|
|
229
|
+
],
|
|
230
|
+
},
|
|
231
|
+
OKTA: {
|
|
232
|
+
description: "Actions for interacting with Okta",
|
|
233
|
+
actions: [
|
|
234
|
+
oktaListOktaUsersDefinition,
|
|
235
|
+
oktaGetOktaUserDefinition,
|
|
236
|
+
oktaListOktaUserGroupsDefinition,
|
|
237
|
+
oktaListOktaGroupsDefinition,
|
|
238
|
+
oktaGetOktaGroupDefinition,
|
|
239
|
+
oktaListOktaGroupMembersDefinition,
|
|
240
|
+
oktaRemoveUserFromGroupDefinition,
|
|
241
|
+
oktaAddUserToGroupDefinition,
|
|
242
|
+
oktaResetPasswordDefinition,
|
|
243
|
+
oktaResetMFADefinition,
|
|
244
|
+
oktaListMFADefinition,
|
|
245
|
+
oktaTriggerOktaWorkflowDefinition,
|
|
246
|
+
],
|
|
247
|
+
},
|
|
248
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const sdk_1 = require("@credal/sdk");
|
|
13
|
+
const callCopilot = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
|
|
14
|
+
var _b;
|
|
15
|
+
const requestBody = {
|
|
16
|
+
agentId: params.agentId,
|
|
17
|
+
query: params.query,
|
|
18
|
+
userEmail: params.userEmail,
|
|
19
|
+
};
|
|
20
|
+
const baseUrl = (_b = authParams.baseUrl) !== null && _b !== void 0 ? _b : "https://app.credal.ai/api";
|
|
21
|
+
const client = new sdk_1.CredalClient({ environment: baseUrl, apiKey: authParams.apiKey });
|
|
22
|
+
const response = yield client.copilots.sendMessage({
|
|
23
|
+
agentId: requestBody.agentId,
|
|
24
|
+
message: requestBody.query,
|
|
25
|
+
userEmail: requestBody.userEmail,
|
|
26
|
+
});
|
|
27
|
+
return {
|
|
28
|
+
response: response.sendChatResult.type === "ai_response_result"
|
|
29
|
+
? response.sendChatResult.response.message
|
|
30
|
+
: "Error getting response",
|
|
31
|
+
referencedSources: response.sendChatResult.type === "ai_response_result" ? response.sendChatResult.referencedSources : [],
|
|
32
|
+
sourcesInDataContext: response.sendChatResult.type === "ai_response_result" ? response.sendChatResult.sourcesInDataContext : [],
|
|
33
|
+
webSearchResults: response.sendChatResult.type === "ai_response_result" ? response.sendChatResult.webSearchResults : [],
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
exports.default = callCopilot;
|
|
@@ -10,6 +10,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
import { MISSING_AUTH_TOKEN } from "../../util/missingAuthConstants.js";
|
|
11
11
|
import searchDriveByQuery from "./searchDriveByQuery.js";
|
|
12
12
|
import getDriveFileContentById from "./getDriveFileContentById.js";
|
|
13
|
+
// Helper function to process files in batches with concurrency control
|
|
14
|
+
const processBatch = (items_1, processor_1, ...args_1) => __awaiter(void 0, [items_1, processor_1, ...args_1], void 0, function* (items, processor, batchSize = 3) {
|
|
15
|
+
const results = [];
|
|
16
|
+
for (let i = 0; i < items.length; i += batchSize) {
|
|
17
|
+
const batch = items.slice(i, i + batchSize);
|
|
18
|
+
const batchResults = yield Promise.allSettled(batch.map(processor));
|
|
19
|
+
for (const result of batchResults) {
|
|
20
|
+
if (result.status === "fulfilled") {
|
|
21
|
+
results.push(result.value);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return results;
|
|
26
|
+
});
|
|
13
27
|
const searchDriveByKeywordsAndGetFileContent = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
|
|
14
28
|
var _b;
|
|
15
29
|
if (!authParams.authToken) {
|
|
@@ -29,13 +43,33 @@ const searchDriveByKeywordsAndGetFileContent = (_a) => __awaiter(void 0, [_a], v
|
|
|
29
43
|
if (!searchResult.success) {
|
|
30
44
|
return { success: false, error: searchResult.error };
|
|
31
45
|
}
|
|
32
|
-
// For each file, fetch its content in parallel
|
|
33
46
|
const files = (_b = searchResult.files) !== null && _b !== void 0 ? _b : [];
|
|
34
|
-
|
|
47
|
+
// File types that are likely to fail or have no useful text content
|
|
48
|
+
const problematicMimeTypes = new Set([
|
|
49
|
+
"application/vnd.google-apps.form",
|
|
50
|
+
"application/vnd.google-apps.site",
|
|
51
|
+
"application/vnd.google-apps.map",
|
|
52
|
+
"application/vnd.google-apps.drawing",
|
|
53
|
+
"application/vnd.openxmlformats-officedocument.presentationml.presentation", // PowerPoint
|
|
54
|
+
"application/vnd.ms-powerpoint",
|
|
55
|
+
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // Excel (not supported yet)
|
|
56
|
+
"application/vnd.ms-excel",
|
|
57
|
+
]);
|
|
58
|
+
// Filter out problematic files BEFORE processing to avoid wasting resources
|
|
59
|
+
const validFiles = files
|
|
60
|
+
.slice(0, limit)
|
|
61
|
+
.filter(file => file.id && file.name && !problematicMimeTypes.has(file.mimeType));
|
|
62
|
+
// Process only valid files in smaller batches to avoid overwhelming the API
|
|
63
|
+
const filesWithContent = yield processBatch(validFiles, (file) => __awaiter(void 0, void 0, void 0, function* () {
|
|
35
64
|
var _a, _b, _c;
|
|
36
65
|
try {
|
|
66
|
+
// Add timeout for individual file content requests with shorter timeout
|
|
37
67
|
const contentResult = yield getDriveFileContentById({
|
|
38
|
-
params: {
|
|
68
|
+
params: {
|
|
69
|
+
fileId: file.id,
|
|
70
|
+
limit: maxChars,
|
|
71
|
+
timeoutLimit: 2,
|
|
72
|
+
},
|
|
39
73
|
authParams,
|
|
40
74
|
});
|
|
41
75
|
return {
|
|
@@ -46,17 +80,16 @@ const searchDriveByKeywordsAndGetFileContent = (_a) => __awaiter(void 0, [_a], v
|
|
|
46
80
|
content: contentResult.success ? (_c = (_b = (_a = contentResult.results) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.contents) === null || _c === void 0 ? void 0 : _c.content : undefined,
|
|
47
81
|
};
|
|
48
82
|
}
|
|
49
|
-
catch (
|
|
50
|
-
console.error(`Error fetching content for file ${file.id}:`, error);
|
|
83
|
+
catch (_d) {
|
|
51
84
|
return {
|
|
52
85
|
id: file.id,
|
|
53
86
|
name: file.name,
|
|
54
87
|
mimeType: file.mimeType,
|
|
55
88
|
url: file.url,
|
|
89
|
+
content: undefined, // Gracefully handle errors
|
|
56
90
|
};
|
|
57
91
|
}
|
|
58
|
-
}));
|
|
59
|
-
const filesWithContent = yield Promise.all(contentPromises);
|
|
92
|
+
}), 5);
|
|
60
93
|
// Return combined results
|
|
61
94
|
return {
|
|
62
95
|
success: true,
|
|
@@ -37,14 +37,14 @@ const searchDriveByQuery = (_a) => __awaiter(void 0, [_a], void 0, function* ({
|
|
|
37
37
|
});
|
|
38
38
|
// Original search method - search all drives at once
|
|
39
39
|
const searchAllDrivesAtOnce = (query, authToken, limit, orderByQuery) => __awaiter(void 0, void 0, void 0, function* () {
|
|
40
|
-
const allDrivesUrl = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(query)}&fields=files(id,name,mimeType,webViewLink)&supportsAllDrives=true&includeItemsFromAllDrives=true&corpora=allDrives&pageSize=
|
|
40
|
+
const allDrivesUrl = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(query)}&fields=files(id,name,mimeType,webViewLink)&supportsAllDrives=true&includeItemsFromAllDrives=true&corpora=allDrives&pageSize=100${orderByQuery ? `&orderBy=${encodeURIComponent(orderByQuery)}` : ""}`;
|
|
41
41
|
const allDrivesRes = axiosClient.get(allDrivesUrl, {
|
|
42
42
|
headers: {
|
|
43
43
|
Authorization: `Bearer ${authToken}`,
|
|
44
44
|
},
|
|
45
45
|
});
|
|
46
46
|
// need to search domain wide separately because the allDrives search doesn't include domain wide files
|
|
47
|
-
const orgWideUrl = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(query)}&fields=files(id,name,mimeType,webViewLink)&corpora=domain&pageSize=
|
|
47
|
+
const orgWideUrl = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(query)}&fields=files(id,name,mimeType,webViewLink)&corpora=domain&pageSize=100${orderByQuery ? `&orderBy=${encodeURIComponent(orderByQuery)}` : ""}`;
|
|
48
48
|
const orgWideRes = axiosClient.get(orgWideUrl, {
|
|
49
49
|
headers: {
|
|
50
50
|
Authorization: `Bearer ${authToken}`,
|
|
@@ -76,7 +76,7 @@ const searchAllDrivesIndividually = (query, authToken, limit, orderByQuery) => _
|
|
|
76
76
|
`q=${encodeURIComponent(query)}&` +
|
|
77
77
|
`fields=files(id,name,mimeType,webViewLink),nextPageToken&` +
|
|
78
78
|
`corpora=domain&` +
|
|
79
|
-
`pageSize=
|
|
79
|
+
`pageSize=100${orderByQuery ? `&orderBy=${encodeURIComponent(orderByQuery)}` : ""}`;
|
|
80
80
|
const domainDriveFunction = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
81
81
|
var _a, _b;
|
|
82
82
|
const domainRes = yield axiosClient.get(domainUrl, {
|
|
@@ -148,11 +148,11 @@ const searchSingleDrive = (query, driveId, authToken, orderByQuery) => __awaiter
|
|
|
148
148
|
let url;
|
|
149
149
|
if (driveId === "root") {
|
|
150
150
|
// Search in user's personal drive
|
|
151
|
-
url = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(query)}&fields=files(id,name,mimeType,webViewLink),nextPageToken&pageSize=
|
|
151
|
+
url = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(query)}&fields=files(id,name,mimeType,webViewLink),nextPageToken&pageSize=100${orderByQuery ? `&orderBy=${encodeURIComponent(orderByQuery)}` : ""}${nextPageToken ? `&pageToken=${nextPageToken}` : ""}`;
|
|
152
152
|
}
|
|
153
153
|
else {
|
|
154
154
|
// Search in specific shared drive
|
|
155
|
-
url = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(`${query} and parents in '${driveId}'`)}&fields=files(id,name,mimeType,webViewLink),nextPageToken&supportsAllDrives=true&includeItemsFromAllDrives=true&corpora=drive&driveId=${driveId}&pageSize=
|
|
155
|
+
url = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(`${query} and parents in '${driveId}'`)}&fields=files(id,name,mimeType,webViewLink),nextPageToken&supportsAllDrives=true&includeItemsFromAllDrives=true&corpora=drive&driveId=${driveId}&pageSize=100${orderByQuery ? `&orderBy=${encodeURIComponent(orderByQuery)}` : ""}${nextPageToken ? `&pageToken=${nextPageToken}` : ""}`;
|
|
156
156
|
}
|
|
157
157
|
const res = yield axiosClient.get(url, {
|
|
158
158
|
headers: {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * as add from "./add";
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.add = void 0;
|
|
37
|
+
exports.add = __importStar(require("./add"));
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const axiosClient_1 = require("../../util/axiosClient");
|
|
13
|
+
const getSalesforceRecordByQuery = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
|
|
14
|
+
const { authToken, baseUrl } = authParams;
|
|
15
|
+
const { query, limit } = params;
|
|
16
|
+
if (!authToken || !baseUrl) {
|
|
17
|
+
return {
|
|
18
|
+
success: false,
|
|
19
|
+
error: "authToken and baseUrl are required for Salesforce API",
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// The API limits the maximum number of records returned to 2000, the limit lets the user set a smaller custom limit
|
|
23
|
+
const url = `${baseUrl}/services/data/v56.0/query/?q=${encodeURIComponent(query + " LIMIT " + (limit != undefined && limit <= 2000 ? limit : 2000))}`;
|
|
24
|
+
try {
|
|
25
|
+
const response = yield axiosClient_1.axiosClient.get(url, {
|
|
26
|
+
headers: {
|
|
27
|
+
Authorization: `Bearer ${authToken}`,
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
success: true,
|
|
32
|
+
records: response.data,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
console.error("Error retrieving Salesforce record:", error);
|
|
37
|
+
return {
|
|
38
|
+
success: false,
|
|
39
|
+
error: error instanceof Error ? error.message : "An unknown error occurred",
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
exports.default = getSalesforceRecordByQuery;
|
|
@@ -0,0 +1,35 @@
|
|
|
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 { WebClient } from "@slack/web-api";
|
|
11
|
+
import { MISSING_AUTH_TOKEN } from "../../util/missingAuthConstants.js";
|
|
12
|
+
const archiveChannel = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
|
|
13
|
+
if (!authParams.authToken) {
|
|
14
|
+
throw new Error(MISSING_AUTH_TOKEN);
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const client = new WebClient(authParams.authToken);
|
|
18
|
+
const { channelId } = params;
|
|
19
|
+
const result = yield client.conversations.archive({ channel: channelId });
|
|
20
|
+
if (!result.ok) {
|
|
21
|
+
return {
|
|
22
|
+
success: false,
|
|
23
|
+
error: result.error || "Unknown error archiving channel",
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return { success: true };
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
return {
|
|
30
|
+
success: false,
|
|
31
|
+
error: error instanceof Error ? error.message : "Unknown error archiving channel",
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
export default archiveChannel;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * as listConversations from "./listConversations";
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.listConversations = void 0;
|
|
37
|
+
exports.listConversations = __importStar(require("./listConversations"));
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const web_api_1 = require("@slack/web-api");
|
|
13
|
+
const helpers_1 = require("./helpers");
|
|
14
|
+
const slackListConversations = (_a) => __awaiter(void 0, [_a], void 0, function* ({ authParams, }) {
|
|
15
|
+
const client = new web_api_1.WebClient(authParams.authToken);
|
|
16
|
+
try {
|
|
17
|
+
const allChannels = yield (0, helpers_1.getSlackChannels)(client);
|
|
18
|
+
const filteredChannels = [];
|
|
19
|
+
for (const channel of allChannels) {
|
|
20
|
+
if (channel.name && channel.topic && channel.topic.value && channel.purpose && channel.purpose.value) {
|
|
21
|
+
const purpose = channel.purpose.value;
|
|
22
|
+
const topic = channel.topic.value;
|
|
23
|
+
const name = channel.name;
|
|
24
|
+
filteredChannels.push(Object.assign(Object.assign({}, channel), { purpose, topic, name }));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
channels: filteredChannels,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (error instanceof Error) {
|
|
33
|
+
// Enhance error with more context
|
|
34
|
+
throw new Error(`Failed to list Slack conversations: ${error.message}`);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
exports.default = slackListConversations;
|
package/dist/utils/google.js
CHANGED
|
@@ -263,45 +263,70 @@ export function getGoogleDocContent(fileId, authToken, axiosClient, sharedDriveP
|
|
|
263
263
|
}
|
|
264
264
|
else {
|
|
265
265
|
console.log("Error using Google Docs API", docsError);
|
|
266
|
-
//
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
266
|
+
// Check if it's a 404 or permission error - don't retry these
|
|
267
|
+
if (docsError && typeof docsError === "object" && "status" in docsError) {
|
|
268
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
269
|
+
const status = docsError.status;
|
|
270
|
+
if (status === 404 || status === 403) {
|
|
271
|
+
throw new Error(`File not accessible (${status}): ${fileId}`);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
// Fallback to Drive API export if Docs API fails
|
|
276
|
+
const exportUrl = `${GDRIVE_BASE_URL}${encodeURIComponent(fileId)}/export?mimeType=text/plain${sharedDriveParams}`;
|
|
277
|
+
const exportRes = yield axiosClient.get(exportUrl, {
|
|
278
|
+
headers: { Authorization: `Bearer ${authToken}` },
|
|
279
|
+
responseType: "text",
|
|
280
|
+
});
|
|
281
|
+
return exportRes.data;
|
|
282
|
+
}
|
|
283
|
+
catch (_a) {
|
|
284
|
+
throw new Error(`Unable to access document content: ${fileId}`);
|
|
285
|
+
}
|
|
273
286
|
}
|
|
274
287
|
}
|
|
275
288
|
});
|
|
276
289
|
}
|
|
277
290
|
export function getGoogleSheetContent(fileId, authToken, axiosClient, sharedDriveParams) {
|
|
278
291
|
return __awaiter(this, void 0, void 0, function* () {
|
|
292
|
+
// Use CSV export as primary method - it's much faster and more reliable for large sheets
|
|
293
|
+
// The Sheets API with includeGridData can timeout on large spreadsheets
|
|
279
294
|
try {
|
|
280
|
-
const
|
|
281
|
-
const
|
|
282
|
-
headers: {
|
|
283
|
-
|
|
284
|
-
},
|
|
295
|
+
const exportUrl = `${GDRIVE_BASE_URL}${encodeURIComponent(fileId)}/export?mimeType=text/csv${sharedDriveParams}`;
|
|
296
|
+
const exportRes = yield axiosClient.get(exportUrl, {
|
|
297
|
+
headers: { Authorization: `Bearer ${authToken}` },
|
|
298
|
+
responseType: "text",
|
|
285
299
|
});
|
|
286
|
-
return
|
|
300
|
+
return exportRes.data
|
|
301
|
+
.split("\n")
|
|
302
|
+
.map((line) => line.replace(/,+$/, ""))
|
|
303
|
+
.map((line) => line.replace(/,{2,}/g, ","))
|
|
304
|
+
.join("\n");
|
|
287
305
|
}
|
|
288
|
-
catch (
|
|
289
|
-
if
|
|
290
|
-
|
|
291
|
-
|
|
306
|
+
catch (exportError) {
|
|
307
|
+
// Check if it's a 404 or permission error
|
|
308
|
+
if (exportError && typeof exportError === "object" && "status" in exportError) {
|
|
309
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
310
|
+
const status = exportError.status;
|
|
311
|
+
if (status === 404 || status === 403) {
|
|
312
|
+
throw new Error(`Spreadsheet not accessible (${status}): ${fileId}`);
|
|
313
|
+
}
|
|
292
314
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
const
|
|
296
|
-
const
|
|
297
|
-
headers: {
|
|
298
|
-
|
|
315
|
+
// If CSV export fails, try the Sheets API as fallback (but this is slower)
|
|
316
|
+
try {
|
|
317
|
+
const sheetsUrl = `https://sheets.googleapis.com/v4/spreadsheets/${fileId}?includeGridData=true`;
|
|
318
|
+
const sheetsRes = yield axiosClient.get(sheetsUrl, {
|
|
319
|
+
headers: {
|
|
320
|
+
Authorization: `Bearer ${authToken}`,
|
|
321
|
+
},
|
|
299
322
|
});
|
|
300
|
-
return
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
323
|
+
return parseGoogleSheetsFromRawContentToPlainText(sheetsRes.data);
|
|
324
|
+
}
|
|
325
|
+
catch (sheetsError) {
|
|
326
|
+
if (isAxiosTimeoutError(sheetsError)) {
|
|
327
|
+
throw new Error("Request timed out using Google Sheets API");
|
|
328
|
+
}
|
|
329
|
+
throw new Error(`Unable to access spreadsheet content: ${fileId}`);
|
|
305
330
|
}
|
|
306
331
|
}
|
|
307
332
|
});
|
package/package.json
CHANGED
|
@@ -1,72 +0,0 @@
|
|
|
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
|
-
const updateServiceDeskRequest = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
|
|
12
|
-
const { issueId, requestTypeId, summary, description, priority, customFields } = params;
|
|
13
|
-
const { authToken, cloudId, baseUrl } = authParams;
|
|
14
|
-
if (!cloudId || !authToken) {
|
|
15
|
-
throw new Error("Valid Cloud ID and auth token are required to update service desk request");
|
|
16
|
-
}
|
|
17
|
-
// Use the regular Jira API for updating service desk requests as they are still Jira issues
|
|
18
|
-
const apiUrl = `https://api.atlassian.com/ex/jira/${cloudId}/rest/api/3/issue/${issueId}`;
|
|
19
|
-
const formattedDescription = description
|
|
20
|
-
? {
|
|
21
|
-
type: "doc",
|
|
22
|
-
version: 1,
|
|
23
|
-
content: [
|
|
24
|
-
{
|
|
25
|
-
type: "paragraph",
|
|
26
|
-
content: [
|
|
27
|
-
{
|
|
28
|
-
type: "text",
|
|
29
|
-
text: description,
|
|
30
|
-
},
|
|
31
|
-
],
|
|
32
|
-
},
|
|
33
|
-
],
|
|
34
|
-
}
|
|
35
|
-
: undefined;
|
|
36
|
-
const payload = {
|
|
37
|
-
fields: Object.assign(Object.assign(Object.assign(Object.assign({}, (summary && { summary })), (formattedDescription && { description: formattedDescription })), (priority && { priority: { name: priority } })), (customFields && Object.assign({}, customFields))),
|
|
38
|
-
};
|
|
39
|
-
try {
|
|
40
|
-
yield axiosClient.put(apiUrl, payload, {
|
|
41
|
-
headers: {
|
|
42
|
-
Authorization: `Bearer ${authToken}`,
|
|
43
|
-
Accept: "application/json",
|
|
44
|
-
"Content-Type": "application/json",
|
|
45
|
-
},
|
|
46
|
-
});
|
|
47
|
-
// Get the updated issue details to return current status and web link
|
|
48
|
-
const getResponse = yield axiosClient.get(apiUrl, {
|
|
49
|
-
headers: {
|
|
50
|
-
Authorization: `Bearer ${authToken}`,
|
|
51
|
-
Accept: "application/json",
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
const issueKey = getResponse.data.key;
|
|
55
|
-
const currentStatus = getResponse.data.fields.status.name;
|
|
56
|
-
const webLink = `${baseUrl}/browse/${issueKey}`;
|
|
57
|
-
return {
|
|
58
|
-
success: true,
|
|
59
|
-
issueKey,
|
|
60
|
-
webLink,
|
|
61
|
-
currentStatus,
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
catch (error) {
|
|
65
|
-
console.error("Error updating service desk request:", error);
|
|
66
|
-
return {
|
|
67
|
-
success: false,
|
|
68
|
-
error: error instanceof Error ? error.message : "Unknown error",
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
export default updateServiceDeskRequest;
|