@credal/actions 0.2.90 → 0.2.92

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.
@@ -3231,6 +3231,10 @@ export const googleOauthCreateNewGoogleDocDefinition = {
3231
3231
  type: "string",
3232
3232
  description: "The content to add to the new Google Doc",
3233
3233
  },
3234
+ usesHtml: {
3235
+ type: "boolean",
3236
+ description: "Whether to interpret the content as HTML",
3237
+ },
3234
3238
  },
3235
3239
  },
3236
3240
  output: {
@@ -3137,12 +3137,15 @@ export type resendSendEmailHtmlFunction = ActionFunction<resendSendEmailHtmlPara
3137
3137
  export declare const googleOauthCreateNewGoogleDocParamsSchema: z.ZodObject<{
3138
3138
  title: z.ZodString;
3139
3139
  content: z.ZodOptional<z.ZodString>;
3140
+ usesHtml: z.ZodOptional<z.ZodBoolean>;
3140
3141
  }, "strip", z.ZodTypeAny, {
3141
3142
  title: string;
3142
3143
  content?: string | undefined;
3144
+ usesHtml?: boolean | undefined;
3143
3145
  }, {
3144
3146
  title: string;
3145
3147
  content?: string | undefined;
3148
+ usesHtml?: boolean | undefined;
3146
3149
  }>;
3147
3150
  export type googleOauthCreateNewGoogleDocParamsType = z.infer<typeof googleOauthCreateNewGoogleDocParamsSchema>;
3148
3151
  export declare const googleOauthCreateNewGoogleDocOutputSchema: z.ZodObject<{
@@ -970,6 +970,7 @@ export const resendSendEmailHtmlOutputSchema = z.object({
970
970
  export const googleOauthCreateNewGoogleDocParamsSchema = z.object({
971
971
  title: z.string().describe("The title of the new Google Doc"),
972
972
  content: z.string().describe("The content to add to the new Google Doc").optional(),
973
+ usesHtml: z.boolean().describe("Whether to interpret the content as HTML").optional(),
973
974
  });
974
975
  export const googleOauthCreateNewGoogleDocOutputSchema = z.object({
975
976
  documentId: z.string().describe("The ID of the created Google Doc"),
@@ -1,4 +1,4 @@
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, googleOauthSearchDriveByQueryAndGetFileContentDefinition, githubGetFileContentDefinition, githubListDirectoryDefinition, } from "./autogen/templates.js";
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, linearGetIssueDetailsDefinition, linearGetProjectsDefinition, linearGetProjectDetailsDefinition, linearGetTeamDetailsDefinition, linearGetTeamsDefinition, 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, googleOauthSearchDriveByQueryAndGetFileContentDefinition, githubGetFileContentDefinition, githubListDirectoryDefinition, } from "./autogen/templates.js";
2
2
  export const ACTION_GROUPS = {
3
3
  GENERIC: {
4
4
  description: "Generic utility actions",
@@ -248,4 +248,14 @@ export const ACTION_GROUPS = {
248
248
  oktaTriggerOktaWorkflowDefinition,
249
249
  ],
250
250
  },
251
+ LINEAR: {
252
+ description: "Actions for interacting with Linear",
253
+ actions: [
254
+ linearGetIssueDetailsDefinition,
255
+ linearGetProjectsDefinition,
256
+ linearGetProjectDetailsDefinition,
257
+ linearGetTeamDetailsDefinition,
258
+ linearGetTeamsDefinition,
259
+ ],
260
+ },
251
261
  };
@@ -0,0 +1,3 @@
1
+ import { confluenceUpdatePageFunction } from "../../../actions/autogen/types";
2
+ declare const confluenceUpdatePage: confluenceUpdatePageFunction;
3
+ export default confluenceUpdatePage;
@@ -0,0 +1,47 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const axios_1 = __importDefault(require("axios"));
16
+ function getConfluenceApi(baseUrl, username, apiToken) {
17
+ const api = axios_1.default.create({
18
+ baseURL: baseUrl,
19
+ headers: {
20
+ Accept: "application/json",
21
+ // Tokens are associated with a specific user.
22
+ Authorization: `Basic ${Buffer.from(`${username}:${apiToken}`).toString("base64")}`,
23
+ },
24
+ });
25
+ return api;
26
+ }
27
+ const confluenceUpdatePage = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
28
+ const { pageId, username, content, title } = params;
29
+ const { baseUrl, authToken } = authParams;
30
+ const api = getConfluenceApi(baseUrl, username, authToken);
31
+ // Get current version number
32
+ const response = yield api.get(`/api/v2/pages/${pageId}`);
33
+ const currVersion = response.data.version.number;
34
+ yield api.put(`/api/v2/pages/${pageId}`, {
35
+ id: pageId,
36
+ status: "current",
37
+ title,
38
+ body: {
39
+ representation: "storage",
40
+ value: content,
41
+ },
42
+ version: {
43
+ number: currVersion + 1,
44
+ },
45
+ });
46
+ });
47
+ exports.default = confluenceUpdatePage;
@@ -0,0 +1,3 @@
1
+ import type { credalCallCopilotFunction } from "../../autogen/types";
2
+ declare const callCopilot: credalCallCopilotFunction;
3
+ export default callCopilot;
@@ -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;
@@ -9,6 +9,99 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import { axiosClient } from "../../util/axiosClient.js";
11
11
  import { MISSING_AUTH_TOKEN } from "../../util/missingAuthConstants.js";
12
+ /**
13
+ * Parses HTML content and converts it to Google Docs API batch update requests
14
+ */
15
+ function parseHtmlToDocRequests(htmlContent) {
16
+ const requests = [];
17
+ let currentIndex = 1;
18
+ // Strip HTML tags and extract text with basic formatting
19
+ const textWithFormatting = parseHtmlContent(htmlContent);
20
+ for (const item of textWithFormatting) {
21
+ // Insert text
22
+ requests.push({
23
+ insertText: {
24
+ location: { index: currentIndex },
25
+ text: item.text,
26
+ },
27
+ });
28
+ // Apply formatting if present
29
+ if (item.formatting && Object.keys(item.formatting).length > 0) {
30
+ const endIndex = currentIndex + item.text.length;
31
+ requests.push({
32
+ updateTextStyle: {
33
+ range: { startIndex: currentIndex, endIndex },
34
+ textStyle: item.formatting,
35
+ fields: Object.keys(item.formatting).join(","),
36
+ },
37
+ });
38
+ }
39
+ currentIndex += item.text.length;
40
+ }
41
+ return requests;
42
+ }
43
+ /**
44
+ * Basic HTML parser that extracts text and formatting
45
+ */
46
+ function parseHtmlContent(html) {
47
+ var _a;
48
+ const result = [];
49
+ // Handle line breaks
50
+ html = html.replace(/<br\s*\/?>/gi, "\n");
51
+ html = html.replace(/<\/p>/gi, "\n");
52
+ html = html.replace(/<p[^>]*>/gi, "");
53
+ // Simple regex-based parsing for basic HTML tags
54
+ const segments = html.split(/(<[^>]+>)/);
55
+ const currentFormatting = {};
56
+ for (let i = 0; i < segments.length; i++) {
57
+ const segment = segments[i];
58
+ if (segment.startsWith("<")) {
59
+ // This is an HTML tag
60
+ if (segment.match(/<\s*b\s*>/i) || segment.match(/<\s*strong\s*>/i)) {
61
+ currentFormatting.bold = true;
62
+ }
63
+ else if (segment.match(/<\/\s*b\s*>/i) || segment.match(/<\/\s*strong\s*>/i)) {
64
+ delete currentFormatting.bold;
65
+ }
66
+ else if (segment.match(/<\s*i\s*>/i) || segment.match(/<\s*em\s*>/i)) {
67
+ currentFormatting.italic = true;
68
+ }
69
+ else if (segment.match(/<\/\s*i\s*>/i) || segment.match(/<\/\s*em\s*>/i)) {
70
+ delete currentFormatting.italic;
71
+ }
72
+ else if (segment.match(/<\s*u\s*>/i)) {
73
+ currentFormatting.underline = true;
74
+ }
75
+ else if (segment.match(/<\/\s*u\s*>/i)) {
76
+ delete currentFormatting.underline;
77
+ }
78
+ else if (segment.match(/<\s*h[1-6]\s*>/i)) {
79
+ const headingLevel = (_a = segment.match(/<\s*h([1-6])\s*>/i)) === null || _a === void 0 ? void 0 : _a[1];
80
+ currentFormatting.fontSize = { magnitude: 18 - (parseInt(headingLevel || "1") - 1) * 2, unit: "PT" };
81
+ currentFormatting.bold = true;
82
+ }
83
+ else if (segment.match(/<\/\s*h[1-6]\s*>/i)) {
84
+ delete currentFormatting.fontSize;
85
+ delete currentFormatting.bold;
86
+ }
87
+ }
88
+ else if (segment.trim()) {
89
+ // This is text content
90
+ result.push({
91
+ text: segment,
92
+ formatting: Object.keys(currentFormatting).length > 0 ? Object.assign({}, currentFormatting) : undefined,
93
+ });
94
+ }
95
+ }
96
+ // If no formatted content was found, return the plain text
97
+ if (result.length === 0) {
98
+ const plainText = html.replace(/<[^>]*>/g, "");
99
+ if (plainText.trim()) {
100
+ result.push({ text: plainText });
101
+ }
102
+ }
103
+ return result;
104
+ }
12
105
  /**
13
106
  * Creates a new Google Doc document using OAuth authentication
14
107
  */
@@ -16,7 +109,7 @@ const createNewGoogleDoc = (_a) => __awaiter(void 0, [_a], void 0, function* ({
16
109
  if (!authParams.authToken) {
17
110
  throw new Error(MISSING_AUTH_TOKEN);
18
111
  }
19
- const { title, content } = params;
112
+ const { title, content, usesHtml } = params;
20
113
  const baseApiUrl = "https://docs.googleapis.com/v1/documents";
21
114
  // Create the document with the provided title
22
115
  const response = yield axiosClient.post(baseApiUrl, { title }, {
@@ -28,24 +121,36 @@ const createNewGoogleDoc = (_a) => __awaiter(void 0, [_a], void 0, function* ({
28
121
  // If content is provided, update the document body with the content
29
122
  if (content) {
30
123
  const documentId = response.data.documentId;
31
- // Add the description to the document content
32
- yield axiosClient.post(`${baseApiUrl}/${documentId}:batchUpdate`, {
33
- requests: [
34
- {
35
- insertText: {
36
- location: {
37
- index: 1, // Insert at the beginning of the document
124
+ if (usesHtml) {
125
+ // Parse HTML content and create requests for rich text formatting
126
+ const requests = parseHtmlToDocRequests(content);
127
+ yield axiosClient.post(`${baseApiUrl}/${documentId}:batchUpdate`, { requests }, {
128
+ headers: {
129
+ Authorization: `Bearer ${authParams.authToken}`,
130
+ "Content-Type": "application/json",
131
+ },
132
+ });
133
+ }
134
+ else {
135
+ // Add plain text content to the document
136
+ yield axiosClient.post(`${baseApiUrl}/${documentId}:batchUpdate`, {
137
+ requests: [
138
+ {
139
+ insertText: {
140
+ location: {
141
+ index: 1, // Insert at the beginning of the document
142
+ },
143
+ text: content,
38
144
  },
39
- text: content,
40
145
  },
146
+ ],
147
+ }, {
148
+ headers: {
149
+ Authorization: `Bearer ${authParams.authToken}`,
150
+ "Content-Type": "application/json",
41
151
  },
42
- ],
43
- }, {
44
- headers: {
45
- Authorization: `Bearer ${authParams.authToken}`,
46
- "Content-Type": "application/json",
47
- },
48
- });
152
+ });
153
+ }
49
154
  }
50
155
  return {
51
156
  documentId: response.data.documentId,
@@ -10,26 +10,37 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  import { axiosClient } from "../../util/axiosClient.js";
11
11
  import { MISSING_AUTH_TOKEN } from "../../util/missingAuthConstants.js";
12
12
  const searchDriveByKeywords = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
13
- var _b;
14
13
  if (!authParams.authToken) {
15
14
  return { success: false, error: MISSING_AUTH_TOKEN, files: [] };
16
15
  }
17
16
  const { keywords, limit } = params;
18
17
  // Build the query: fullText contains 'keyword1' or fullText contains 'keyword2' ...
19
18
  const query = keywords.map(kw => `fullText contains '${kw.replace(/'/g, "\\'")}'`).join(" or ");
20
- const url = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(query)}&fields=files(id,name,mimeType,webViewLink)&supportsAllDrives=true&includeItemsFromAllDrives=true&corpora=allDrives`;
21
19
  try {
22
- const res = yield axiosClient.get(url, {
20
+ 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=1000`;
21
+ const allDrivesRes = axiosClient.get(allDrivesUrl, {
23
22
  headers: {
24
23
  Authorization: `Bearer ${authParams.authToken}`,
25
24
  },
26
25
  });
27
- const files = ((_b = res.data.files) === null || _b === void 0 ? void 0 : _b.map((file) => ({
26
+ // need to search domain wide separately because the allDrives search doesn't include domain wide files
27
+ const orgWideUrl = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(query)}&fields=files(id,name,mimeType,webViewLink)&corpora=domain&pageSize=1000`;
28
+ const orgWideRes = axiosClient.get(orgWideUrl, {
29
+ headers: {
30
+ Authorization: `Bearer ${authParams.authToken}`,
31
+ },
32
+ });
33
+ const results = yield Promise.all([allDrivesRes, orgWideRes]);
34
+ const relevantResults = results
35
+ .map(result => result.data.files)
36
+ .flat()
37
+ .filter(Boolean);
38
+ const files = relevantResults.map((file) => ({
28
39
  id: file.id || "",
29
40
  name: file.name || "",
30
41
  mimeType: file.mimeType || "",
31
42
  url: file.webViewLink || "",
32
- }))) || [];
43
+ })) || [];
33
44
  return { success: true, files: limit ? files.splice(0, limit) : files };
34
45
  }
35
46
  catch (error) {
@@ -62,19 +62,30 @@ const searchDriveByQuery = (_a) => __awaiter(void 0, [_a], void 0, function* ({
62
62
  });
63
63
  // Original search method - search all drives at once
64
64
  const searchAllDrivesAtOnce = (query, authToken, limit, orderByQuery) => __awaiter(void 0, void 0, void 0, function* () {
65
- var _a;
66
- const url = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(query)}&fields=files(id,name,mimeType,webViewLink)&supportsAllDrives=true&includeItemsFromAllDrives=true&corpora=allDrives&pageSize=1000${orderByQuery ? `&orderBy=${encodeURIComponent(orderByQuery)}` : ""}`;
67
- const res = yield axiosClient.get(url, {
65
+ 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=1000${orderByQuery ? `&orderBy=${encodeURIComponent(orderByQuery)}` : ""}`;
66
+ const allDrivesRes = axiosClient.get(allDrivesUrl, {
68
67
  headers: {
69
68
  Authorization: `Bearer ${authToken}`,
70
69
  },
71
70
  });
72
- const files = ((_a = res.data.files) === null || _a === void 0 ? void 0 : _a.map((file) => ({
71
+ // need to search domain wide separately because the allDrives search doesn't include domain wide files
72
+ const orgWideUrl = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(query)}&fields=files(id,name,mimeType,webViewLink)&corpora=domain&pageSize=1000${orderByQuery ? `&orderBy=${encodeURIComponent(orderByQuery)}` : ""}`;
73
+ const orgWideRes = axiosClient.get(orgWideUrl, {
74
+ headers: {
75
+ Authorization: `Bearer ${authToken}`,
76
+ },
77
+ });
78
+ const results = yield Promise.all([allDrivesRes, orgWideRes]);
79
+ const relevantResults = results
80
+ .map(result => result.data.files)
81
+ .flat()
82
+ .filter(Boolean);
83
+ const files = relevantResults.map((file) => ({
73
84
  id: file.id || "",
74
85
  name: file.name || "",
75
86
  mimeType: file.mimeType || "",
76
87
  url: file.webViewLink || "",
77
- }))) || [];
88
+ })) || [];
78
89
  // Filter out images and folders
79
90
  const readableFiles = filterReadableFiles(files);
80
91
  return {
@@ -86,25 +97,46 @@ const searchAllDrivesAtOnce = (query, authToken, limit, orderByQuery) => __await
86
97
  const searchAllDrivesIndividually = (query, authToken, limit, orderByQuery) => __awaiter(void 0, void 0, void 0, function* () {
87
98
  const drives = yield getAllDrives(authToken);
88
99
  let allFiles = [];
100
+ const domainUrl = `https://www.googleapis.com/drive/v3/files?` +
101
+ `q=${encodeURIComponent(query)}&` +
102
+ `fields=files(id,name,mimeType,webViewLink),nextPageToken&` +
103
+ `corpora=domain&` +
104
+ `pageSize=1000${orderByQuery ? `&orderBy=${encodeURIComponent(orderByQuery)}` : ""}`;
105
+ const domainDriveFunction = () => __awaiter(void 0, void 0, void 0, function* () {
106
+ var _a, _b;
107
+ const domainRes = yield axiosClient.get(domainUrl, {
108
+ headers: { Authorization: `Bearer ${authToken}` },
109
+ });
110
+ return ((_b = (_a = domainRes.data.files) === null || _a === void 0 ? void 0 : _a.map((file) => ({
111
+ id: file.id || "",
112
+ name: file.name || "",
113
+ mimeType: file.mimeType || "",
114
+ url: file.webViewLink || "",
115
+ }))) !== null && _b !== void 0 ? _b : []);
116
+ });
89
117
  // Search each drive individually
90
- for (const drive of drives) {
91
- try {
92
- const driveFiles = yield searchSingleDrive(query, drive.id, authToken, orderByQuery);
93
- // Filter out images and folders before adding to results
94
- const readableDriveFiles = filterReadableFiles(driveFiles);
95
- allFiles = allFiles.concat(readableDriveFiles);
96
- // If we have a limit and we've reached it, break early
97
- if (limit && allFiles.length >= limit) {
98
- break;
118
+ const results = yield Promise.allSettled([
119
+ domainDriveFunction(),
120
+ ...drives.map((drive) => __awaiter(void 0, void 0, void 0, function* () {
121
+ try {
122
+ const driveFiles = yield searchSingleDrive(query, drive.id, authToken, orderByQuery);
123
+ // Filter out images and folders before adding to results
124
+ return filterReadableFiles(driveFiles);
99
125
  }
100
- }
101
- catch (error) {
102
- console.error(`Error searching drive ${drive.name} (${drive.id}):`, error);
126
+ catch (error) {
127
+ console.error(`Error searching drive ${drive.name} (${drive.id}):`, error);
128
+ return [];
129
+ }
130
+ })),
131
+ ]);
132
+ for (const result of results) {
133
+ if (result.status === "fulfilled") {
134
+ allFiles = allFiles.concat(result.value.slice(0, limit));
103
135
  }
104
136
  }
105
137
  return {
106
138
  success: true,
107
- files: limit ? allFiles.slice(0, limit) : allFiles,
139
+ files: allFiles,
108
140
  };
109
141
  });
110
142
  // Get all drives (shared drives + user's drive)
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ export declare const TokenResponseSchema: z.ZodObject<{
3
+ token: z.ZodString;
4
+ }, "strip", z.ZodTypeAny, {
5
+ token: string;
6
+ }, {
7
+ token: string;
8
+ }>;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TokenResponseSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.TokenResponseSchema = zod_1.z.object({
6
+ token: zod_1.z.string(),
7
+ });
@@ -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 @@
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,3 @@
1
+ import type { slackListConversationsFunction } from "../../autogen/types";
2
+ declare const slackListConversations: slackListConversationsFunction;
3
+ export default slackListConversations;
@@ -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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@credal/actions",
3
- "version": "0.2.90",
3
+ "version": "0.2.92",
4
4
  "type": "module",
5
5
  "description": "AI Actions by Credal AI",
6
6
  "sideEffects": false,
@@ -1,3 +0,0 @@
1
- import type { githubSearchRepositoryFunction } from "../../autogen/types.js";
2
- declare const searchRepository: githubSearchRepositoryFunction;
3
- export default searchRepository;
@@ -1,131 +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 { 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;
@@ -1,3 +0,0 @@
1
- import type { githubSearchRepositoryFunction } from "../../autogen/types.js";
2
- declare const searchRepository: githubSearchRepositoryFunction;
3
- export default searchRepository;
@@ -1,41 +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 { 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;