@credal/actions 0.2.24 → 0.2.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/actions/actionMapper.js +7 -1
  2. package/dist/actions/autogen/templates.d.ts +1 -0
  3. package/dist/actions/autogen/templates.js +235 -0
  4. package/dist/actions/autogen/types.d.ts +288 -12
  5. package/dist/actions/autogen/types.js +64 -0
  6. package/dist/actions/providers/confluence/updatePage.js +13 -9
  7. package/dist/actions/providers/github/searchRepository.d.ts +3 -0
  8. package/dist/actions/providers/github/searchRepository.js +131 -0
  9. package/dist/actions/providers/okta/triggerOktaWorkflow.js +5 -10
  10. package/dist/actions/providers/slack/listConversations.d.ts +1 -1
  11. package/package.json +2 -1
  12. package/dist/actions/autogen/definitions.d.ts +0 -5
  13. package/dist/actions/autogen/definitions.js +0 -132
  14. package/dist/actions/definitions.js +0 -35
  15. package/dist/actions/invokeMapper.d.ts +0 -9
  16. package/dist/actions/invokeMapper.js +0 -33
  17. package/dist/actions/providers/google-oauth/listGmailThreads.d.ts +0 -3
  18. package/dist/actions/providers/google-oauth/listGmailThreads.js +0 -98
  19. package/dist/actions/providers/google-oauth/searchGmailMessages.d.ts +0 -3
  20. package/dist/actions/providers/google-oauth/searchGmailMessages.js +0 -91
  21. package/dist/actions/providers/googlemaps/nearbysearch.d.ts +0 -3
  22. package/dist/actions/providers/googlemaps/nearbysearch.js +0 -96
  23. package/dist/actions/providers/jira/createTicket.d.ts +0 -3
  24. package/dist/actions/providers/jira/createTicket.js +0 -34
  25. package/dist/actions/providers/salesforce/getSalesforceRecordByQuery.d.ts +0 -3
  26. package/dist/actions/providers/salesforce/getSalesforceRecordByQuery.js +0 -43
  27. package/dist/actions/providers/slack/list_conversations.d.ts +0 -3
  28. package/dist/actions/providers/slack/list_conversations.js +0 -60
  29. package/dist/actions/providers/slack/summarizeChannel.d.ts +0 -3
  30. package/dist/actions/providers/slack/summarizeChannel.js +0 -51
  31. package/dist/actions/schema.js +0 -6
  32. package/dist/actions/types.js +0 -2
  33. package/dist/main.js +0 -11
@@ -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
+ import * as github from "@actions/github";
12
+ // Limits on the number of results to return
13
+ const MAX_CODE_RESULTS = 15;
14
+ const MAX_COMMITS = 10;
15
+ const MAX_FILES_PER_COMMIT = 5;
16
+ const MAX_ISSUES_OR_PRS = 10;
17
+ const MAX_FILES_PER_PR = 5;
18
+ const MAX_PATCH_LINES = 20;
19
+ const MAX_FRAGMENT_LINES = 20;
20
+ const searchRepository = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
21
+ if (!authParams.authToken) {
22
+ throw new Error(MISSING_AUTH_TOKEN);
23
+ }
24
+ const octokit = github.getOctokit(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} 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;
@@ -7,8 +7,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { AxiosError } from "axios";
11
- import { axiosClient } from "../../util/axiosClient.js";
10
+ import { ApiError, axiosClient } from "../../util/axiosClient.js";
12
11
  const triggerOktaWorkflow = (_a) => __awaiter(void 0, [_a], void 0, function* ({ authParams, params, }) {
13
12
  var _b, _c;
14
13
  const { authToken, subdomain } = authParams;
@@ -21,7 +20,7 @@ const triggerOktaWorkflow = (_a) => __awaiter(void 0, [_a], void 0, function* ({
21
20
  headers: Object.assign({ Accept: "application/json", "Content-Type": "application/json" }, (authToken && { Authorization: `Bearer ${authToken}` })),
22
21
  };
23
22
  const workflowUrl = `https://${subdomain}.workflows.okta.com/api/flo/${workflowId}/invoke`;
24
- const response = yield axiosClient.post(workflowUrl, workflowParameters || {}, requestConfig);
23
+ const response = yield axiosClient.post(workflowUrl, workflowParameters !== null && workflowParameters !== void 0 ? workflowParameters : {}, requestConfig);
25
24
  if (response.status >= 200 && response.status < 300) {
26
25
  return { success: true, output: response.data };
27
26
  }
@@ -31,14 +30,10 @@ const triggerOktaWorkflow = (_a) => __awaiter(void 0, [_a], void 0, function* ({
31
30
  }
32
31
  }
33
32
  catch (error) {
34
- console.error("Error triggering Okta workflow:", error);
35
33
  let errorMessage = "Unknown error while triggering workflow";
36
- if (error instanceof AxiosError && error.response) {
37
- const workflowError = error.response.data;
38
- errorMessage =
39
- (workflowError === null || workflowError === void 0 ? void 0 : workflowError.errorSummary) ||
40
- (workflowError === null || workflowError === void 0 ? void 0 : workflowError.message) ||
41
- `Workflow request failed with status ${error.response.status}`;
34
+ if (error instanceof ApiError && error.data) {
35
+ const workflowError = error.data.error;
36
+ errorMessage = workflowError + ` Status: ${error.status}`;
42
37
  }
43
38
  else if (error instanceof Error) {
44
39
  errorMessage = error.message;
@@ -1,3 +1,3 @@
1
- import { slackListConversationsFunction } from "../../autogen/types";
1
+ import type { slackListConversationsFunction } from "../../autogen/types";
2
2
  declare const slackListConversations: slackListConversationsFunction;
3
3
  export default slackListConversations;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@credal/actions",
3
- "version": "0.2.24",
3
+ "version": "0.2.26",
4
4
  "type": "module",
5
5
  "description": "AI Actions by Credal AI",
6
6
  "sideEffects": false,
@@ -46,6 +46,7 @@
46
46
  "typescript-eslint": "^8.18.0"
47
47
  },
48
48
  "dependencies": {
49
+ "@actions/github": "^6.0.1",
49
50
  "@credal/sdk": "^0.0.21",
50
51
  "@mendable/firecrawl-js": "^1.24.0",
51
52
  "@microsoft/microsoft-graph-client": "^3.0.7",
@@ -1,5 +0,0 @@
1
- import { ActionTemplate } from "@/actions/parse";
2
- export declare const slackSendMessageDefinition: ActionTemplate;
3
- export declare const slackListConversationsDefinition: ActionTemplate;
4
- export declare const mathAddDefinition: ActionTemplate;
5
- export declare const confluenceUpdatePageDefinition: ActionTemplate;
@@ -1,132 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.confluenceUpdatePageDefinition = exports.mathAddDefinition = exports.slackListConversationsDefinition = exports.slackSendMessageDefinition = void 0;
4
- exports.slackSendMessageDefinition = {
5
- provider: "slack",
6
- name: "send_message",
7
- description: "Sends a message to a Slack channel",
8
- scopes: ["chat:write"],
9
- parameters: {
10
- channel: {
11
- type: "string",
12
- description: "The Slack channel to send the message to (e.g., \\#general, \\#alerts)",
13
- required: true,
14
- },
15
- message: {
16
- type: "string",
17
- description: "The message content to send to Slack. Can include markdown formatting.",
18
- required: true,
19
- },
20
- },
21
- output: {},
22
- };
23
- exports.slackListConversationsDefinition = {
24
- provider: "slack",
25
- name: "list_conversations",
26
- description: "Lists all conversations in a Slack workspace",
27
- scopes: ["channels:read", "groups:read", "im:read", "mpim:read"],
28
- authToken: {
29
- type: "string",
30
- description: "The Slack access token to use",
31
- required: true,
32
- },
33
- parameters: {},
34
- output: {
35
- channels: {
36
- type: "array",
37
- description: "A list of channels in Slack",
38
- required: true,
39
- items: {
40
- type: "object",
41
- description: "A channel in Slack",
42
- required: true,
43
- properties: {
44
- id: {
45
- type: "string",
46
- description: "The ID of the channel",
47
- required: true,
48
- },
49
- name: {
50
- type: "string",
51
- description: "The name of the channel",
52
- required: true,
53
- },
54
- topic: {
55
- type: "string",
56
- description: "The topic of the channel",
57
- required: true,
58
- },
59
- purpose: {
60
- type: "string",
61
- description: "The purpose of the channel",
62
- required: true,
63
- },
64
- },
65
- },
66
- },
67
- },
68
- };
69
- exports.mathAddDefinition = {
70
- provider: "math",
71
- name: "add",
72
- description: "Adds two numbers together",
73
- scopes: [],
74
- parameters: {
75
- a: {
76
- type: "number",
77
- description: "The first number to add",
78
- required: true,
79
- },
80
- b: {
81
- type: "number",
82
- description: "The second number to add",
83
- required: true,
84
- },
85
- },
86
- output: {
87
- result: {
88
- type: "number",
89
- description: "The sum of the two numbers",
90
- required: true,
91
- },
92
- },
93
- };
94
- exports.confluenceUpdatePageDefinition = {
95
- provider: "confluence",
96
- name: "updatePage",
97
- description: "Updates a confluence page with the new content specified",
98
- scopes: [],
99
- authToken: {
100
- type: "string",
101
- description: "The access token to use for confluence",
102
- required: true,
103
- },
104
- baseUrl: {
105
- type: "string",
106
- description: "The base url required to access the confluence instance",
107
- required: true,
108
- },
109
- parameters: {
110
- pageId: {
111
- type: "string",
112
- description: "The page id that should be updated",
113
- required: true,
114
- },
115
- title: {
116
- type: "string",
117
- description: "The title of the page that should be updated",
118
- required: true,
119
- },
120
- username: {
121
- type: "string",
122
- description: "The username of the person updating the page",
123
- required: true,
124
- },
125
- content: {
126
- type: "string",
127
- description: "The new content for the page",
128
- required: true,
129
- },
130
- },
131
- output: {},
132
- };
@@ -1,35 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mathAddDefinition = exports.slackSendMessageDefinition = void 0;
4
- exports.slackSendMessageDefinition = {
5
- name: "send_message",
6
- description: "Sends a message to a Slack channel",
7
- parameters: {
8
- "channel": {
9
- "type": "string",
10
- "description": "The Slack channel to send the message to (e.g., \\#general, \\#alerts)",
11
- "required": true
12
- },
13
- "message": {
14
- "type": "string",
15
- "description": "The message content to send to Slack. Can include markdown formatting.",
16
- "required": true
17
- }
18
- }
19
- };
20
- exports.mathAddDefinition = {
21
- name: "add",
22
- description: "Adds two numbers together",
23
- parameters: {
24
- "a": {
25
- "type": "number",
26
- "description": "The first number to add",
27
- "required": true
28
- },
29
- "b": {
30
- "type": "number",
31
- "description": "The second number to add",
32
- "required": true
33
- }
34
- }
35
- };
@@ -1,9 +0,0 @@
1
- import { type ActionFunction } from "./autogen/types";
2
- import { z } from "zod";
3
- interface ActionFunctionComponents {
4
- fn: ActionFunction<any, any, any>;
5
- paramsSchema: z.ZodSchema;
6
- outputSchema: z.ZodSchema;
7
- }
8
- export declare const FunctionMapper: Record<string, Record<string, ActionFunctionComponents>>;
9
- export {};
@@ -1,33 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.FunctionMapper = void 0;
7
- const add_1 = __importDefault(require("./providers/math/add"));
8
- const list_conversations_1 = __importDefault(require("./providers/slack/list_conversations"));
9
- const updatePage_1 = __importDefault(require("./providers/confluence/updatePage"));
10
- const types_1 = require("./autogen/types");
11
- exports.FunctionMapper = {
12
- math: {
13
- add: {
14
- fn: add_1.default,
15
- paramsSchema: types_1.mathAddParamsSchema,
16
- outputSchema: types_1.mathAddOutputSchema,
17
- },
18
- },
19
- slack: {
20
- listConversations: {
21
- fn: list_conversations_1.default,
22
- paramsSchema: types_1.slackListConversationsParamsSchema,
23
- outputSchema: types_1.slackListConversationsOutputSchema,
24
- },
25
- },
26
- confluence: {
27
- updatePage: {
28
- fn: updatePage_1.default,
29
- paramsSchema: types_1.confluenceUpdatePageParamsSchema,
30
- outputSchema: types_1.confluenceUpdatePageOutputSchema,
31
- },
32
- },
33
- };
@@ -1,3 +0,0 @@
1
- import type { googleOauthListGmailThreadsFunction } from "../../autogen/types";
2
- declare const listGmailThreads: googleOauthListGmailThreadsFunction;
3
- export default listGmailThreads;
@@ -1,98 +0,0 @@
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 missingAuthConstants_1 = require("../../util/missingAuthConstants");
14
- const decodeMessage_1 = require("./utils/decodeMessage");
15
- const listGmailThreads = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
16
- if (!authParams.authToken) {
17
- return { success: false, error: missingAuthConstants_1.MISSING_AUTH_TOKEN, threads: [] };
18
- }
19
- const { query, maxResults } = params;
20
- const allThreads = [];
21
- const errorMessages = [];
22
- const max = maxResults !== null && maxResults !== void 0 ? maxResults : 100;
23
- let fetched = 0;
24
- let pageToken = undefined;
25
- try {
26
- while (fetched < max) {
27
- const url = `https://gmail.googleapis.com/gmail/v1/users/me/threads?q=${encodeURIComponent(query)}` +
28
- (pageToken ? `&pageToken=${encodeURIComponent(pageToken)}` : "") +
29
- `&maxResults=${Math.min(100, max - fetched)}`;
30
- const listRes = yield axiosClient_1.axiosClient.get(url, {
31
- headers: {
32
- Authorization: `Bearer ${authParams.authToken}`,
33
- },
34
- });
35
- const { threads: threadList = [], nextPageToken } = listRes.data;
36
- if (!Array.isArray(threadList) || threadList.length === 0)
37
- break;
38
- const remaining = max - allThreads.length;
39
- const batch = threadList.slice(0, remaining);
40
- const results = yield Promise.all(batch.map((thread) => __awaiter(void 0, void 0, void 0, function* () {
41
- try {
42
- const threadRes = yield axiosClient_1.axiosClient.get(`https://gmail.googleapis.com/gmail/v1/users/me/threads/${thread.id}?format=full`, {
43
- headers: {
44
- Authorization: `Bearer ${authParams.authToken}`,
45
- },
46
- });
47
- const { id, historyId, messages } = threadRes.data;
48
- return {
49
- id,
50
- historyId,
51
- messages: Array.isArray(messages)
52
- ? messages.map(msg => {
53
- const { id, threadId, snippet, labelIds, internalDate } = msg;
54
- const emailBody = (0, decodeMessage_1.getEmailContent)(msg) || "";
55
- return {
56
- id,
57
- threadId,
58
- snippet,
59
- labelIds,
60
- internalDate,
61
- emailBody,
62
- };
63
- })
64
- : [],
65
- };
66
- }
67
- catch (err) {
68
- errorMessages.push(err instanceof Error ? err.message : "Failed to fetch thread details");
69
- return {
70
- id: thread.id,
71
- snippet: "",
72
- historyId: "",
73
- messages: [],
74
- error: err instanceof Error ? err.message : "Failed to fetch thread details",
75
- };
76
- }
77
- })));
78
- allThreads.push(...results);
79
- fetched = allThreads.length;
80
- if (!nextPageToken || allThreads.length >= max)
81
- break;
82
- pageToken = nextPageToken;
83
- }
84
- return {
85
- success: errorMessages.length === 0,
86
- threads: allThreads,
87
- error: errorMessages.join("; "),
88
- };
89
- }
90
- catch (error) {
91
- return {
92
- success: false,
93
- error: error instanceof Error ? error.message : "Unknown error listing Gmail threads",
94
- threads: [],
95
- };
96
- }
97
- });
98
- exports.default = listGmailThreads;
@@ -1,3 +0,0 @@
1
- import type { googleOauthSearchGmailMessagesFunction } from "../../autogen/types";
2
- declare const searchGmailMessages: googleOauthSearchGmailMessagesFunction;
3
- export default searchGmailMessages;
@@ -1,91 +0,0 @@
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 missingAuthConstants_1 = require("../../util/missingAuthConstants");
14
- const decodeMessage_1 = require("./utils/decodeMessage");
15
- const searchGmailMessages = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
16
- if (!authParams.authToken) {
17
- return { success: false, error: missingAuthConstants_1.MISSING_AUTH_TOKEN, messages: [] };
18
- }
19
- const { query, maxResults } = params;
20
- const allMessages = [];
21
- const max = maxResults !== null && maxResults !== void 0 ? maxResults : 100;
22
- const errorMessages = [];
23
- let pageToken = undefined;
24
- let fetched = 0;
25
- try {
26
- while (fetched < max) {
27
- const url = `https://gmail.googleapis.com/gmail/v1/users/me/messages?q=${encodeURIComponent(query)}` +
28
- (pageToken ? `&pageToken=${encodeURIComponent(pageToken)}` : "") +
29
- `&maxResults=${Math.min(100, max - fetched)}`;
30
- const listRes = yield axiosClient_1.axiosClient.get(url, {
31
- headers: {
32
- Authorization: `Bearer ${authParams.authToken}`,
33
- },
34
- });
35
- const { messages: messageList = [], nextPageToken } = listRes.data;
36
- if (!Array.isArray(messageList) || messageList.length === 0)
37
- break;
38
- const remaining = max - allMessages.length;
39
- const batch = messageList.slice(0, remaining);
40
- const results = yield Promise.all(batch.map((msg) => __awaiter(void 0, void 0, void 0, function* () {
41
- try {
42
- const msgRes = yield axiosClient_1.axiosClient.get(`https://gmail.googleapis.com/gmail/v1/users/me/messages/${msg.id}?format=full`, {
43
- headers: {
44
- Authorization: `Bearer ${authParams.authToken}`,
45
- },
46
- });
47
- const { id, threadId, snippet, labelIds, internalDate } = msgRes.data;
48
- const emailBody = (0, decodeMessage_1.getEmailContent)(msgRes.data) || "";
49
- return {
50
- id,
51
- threadId,
52
- snippet,
53
- labelIds,
54
- internalDate,
55
- emailBody,
56
- };
57
- }
58
- catch (err) {
59
- errorMessages.push(err instanceof Error ? err.message : "Failed to fetch message details");
60
- return {
61
- id: msg.id,
62
- threadId: "",
63
- snippet: "",
64
- labelIds: [],
65
- internalDate: "",
66
- payload: {},
67
- error: err instanceof Error ? err.message : "Failed to fetch message details",
68
- };
69
- }
70
- })));
71
- allMessages.push(...results);
72
- fetched = allMessages.length;
73
- if (!nextPageToken || allMessages.length >= max)
74
- break;
75
- pageToken = nextPageToken;
76
- }
77
- return {
78
- success: errorMessages.length === 0,
79
- messages: allMessages,
80
- error: errorMessages.join("; "),
81
- };
82
- }
83
- catch (error) {
84
- return {
85
- success: false,
86
- error: error instanceof Error ? error.message : "Unknown error searching Gmail",
87
- messages: [],
88
- };
89
- }
90
- });
91
- exports.default = searchGmailMessages;
@@ -1,3 +0,0 @@
1
- import { googlemapsNearbysearchFunction } from "../../autogen/types";
2
- declare const nearbysearch: googlemapsNearbysearchFunction;
3
- export default nearbysearch;