@credal/actions 0.2.133 → 0.2.135
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/autogen/templates.js +16 -0
- package/dist/actions/autogen/types.d.ts +12 -0
- package/dist/actions/autogen/types.js +4 -0
- package/dist/actions/providers/confluence/updatePage.js +14 -15
- package/dist/actions/providers/generic/fillTemplateAction.d.ts +7 -0
- package/dist/actions/providers/generic/fillTemplateAction.js +18 -0
- package/dist/actions/providers/generic/genericApiCall.d.ts +3 -0
- package/dist/actions/providers/generic/genericApiCall.js +38 -0
- package/dist/actions/providers/google-oauth/getDriveContentById.d.ts +3 -0
- package/dist/actions/providers/google-oauth/getDriveContentById.js +161 -0
- package/dist/actions/providers/google-oauth/searchAndGetDriveContentByKeywords.d.ts +3 -0
- package/dist/actions/providers/google-oauth/searchAndGetDriveContentByKeywords.js +47 -0
- package/dist/actions/providers/google-oauth/searchDriveAndGetContentByKeywords.d.ts +3 -0
- package/dist/actions/providers/google-oauth/searchDriveAndGetContentByKeywords.js +110 -0
- package/dist/actions/providers/google-oauth/searchDriveAndGetContentByQuery.d.ts +3 -0
- package/dist/actions/providers/google-oauth/searchDriveAndGetContentByQuery.js +78 -0
- package/dist/actions/providers/google-oauth/searchDriveByKeywords.js +4 -3
- package/dist/actions/providers/google-oauth/searchDriveByKeywordsAndGetFileContent.js +2 -2
- package/dist/actions/providers/google-oauth/searchDriveByQuery.js +4 -3
- package/dist/actions/providers/google-oauth/searchDriveByQueryAndGetFileContent.js +2 -2
- package/dist/actions/providers/google-oauth/utils/extractContentFromDriveFileId.d.ts +15 -0
- package/dist/actions/providers/google-oauth/utils/extractContentFromDriveFileId.js +129 -0
- package/dist/actions/providers/googlemaps/nearbysearch.d.ts +3 -0
- package/dist/actions/providers/googlemaps/nearbysearch.js +96 -0
- package/dist/actions/providers/salesforce/updateRecord.js +13 -1
- package/dist/actions/providers/snowflake/runSnowflakeQueryWriteResultsToS3.d.ts +3 -0
- package/dist/actions/providers/snowflake/runSnowflakeQueryWriteResultsToS3.js +154 -0
- package/dist/actions/providers/x/scrapeTweetDataWithNitter.d.ts +3 -0
- package/dist/actions/providers/x/scrapeTweetDataWithNitter.js +45 -0
- package/dist/utils/pdf.d.ts +1 -1
- package/dist/utils/pdf.js +27 -20
- package/package.json +1 -2
- package/dist/actions/providers/jamf/types.d.ts +0 -8
- package/dist/actions/providers/jamf/types.js +0 -7
|
@@ -7184,6 +7184,10 @@ export const googleOauthSearchDriveByKeywordsDefinition = {
|
|
|
7184
7184
|
type: "number",
|
|
7185
7185
|
description: "The maximum number of files to return",
|
|
7186
7186
|
},
|
|
7187
|
+
includeTrashed: {
|
|
7188
|
+
type: "boolean",
|
|
7189
|
+
description: "Whether to include trashed files in the search results",
|
|
7190
|
+
},
|
|
7187
7191
|
},
|
|
7188
7192
|
},
|
|
7189
7193
|
output: {
|
|
@@ -7252,6 +7256,10 @@ export const googleOauthSearchDriveByQueryDefinition = {
|
|
|
7252
7256
|
type: "string",
|
|
7253
7257
|
description: "The orderBy query for sorting results (e.g., 'modifiedTime desc', 'name', 'createdTime desc'). Defaults to 'modifiedTime desc'",
|
|
7254
7258
|
},
|
|
7259
|
+
includeTrashed: {
|
|
7260
|
+
type: "boolean",
|
|
7261
|
+
description: "Whether to include trashed files in the search results",
|
|
7262
|
+
},
|
|
7255
7263
|
},
|
|
7256
7264
|
},
|
|
7257
7265
|
output: {
|
|
@@ -7324,6 +7332,10 @@ export const googleOauthSearchDriveByKeywordsAndGetFileContentDefinition = {
|
|
|
7324
7332
|
type: "string",
|
|
7325
7333
|
description: "The orderBy query for sorting results (e.g., 'modifiedTime desc', 'name', 'createdTime desc'). Defaults to 'modifiedTime desc'",
|
|
7326
7334
|
},
|
|
7335
|
+
includeTrashed: {
|
|
7336
|
+
type: "boolean",
|
|
7337
|
+
description: "Whether to include trashed files in the search results",
|
|
7338
|
+
},
|
|
7327
7339
|
},
|
|
7328
7340
|
},
|
|
7329
7341
|
output: {
|
|
@@ -7415,6 +7427,10 @@ export const googleOauthSearchDriveByQueryAndGetFileContentDefinition = {
|
|
|
7415
7427
|
type: "string",
|
|
7416
7428
|
description: "The orderBy query for sorting results (e.g., 'modifiedTime desc', 'name', 'createdTime desc'). Defaults to 'modifiedTime desc'",
|
|
7417
7429
|
},
|
|
7430
|
+
includeTrashed: {
|
|
7431
|
+
type: "boolean",
|
|
7432
|
+
description: "Whether to include trashed files in the search results",
|
|
7433
|
+
},
|
|
7418
7434
|
},
|
|
7419
7435
|
},
|
|
7420
7436
|
output: {
|
|
@@ -4403,12 +4403,15 @@ export type googleOauthGetPresentationFunction = ActionFunction<googleOauthGetPr
|
|
|
4403
4403
|
export declare const googleOauthSearchDriveByKeywordsParamsSchema: z.ZodObject<{
|
|
4404
4404
|
keywords: z.ZodArray<z.ZodString, "many">;
|
|
4405
4405
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
4406
|
+
includeTrashed: z.ZodOptional<z.ZodBoolean>;
|
|
4406
4407
|
}, "strip", z.ZodTypeAny, {
|
|
4407
4408
|
keywords: string[];
|
|
4408
4409
|
limit?: number | undefined;
|
|
4410
|
+
includeTrashed?: boolean | undefined;
|
|
4409
4411
|
}, {
|
|
4410
4412
|
keywords: string[];
|
|
4411
4413
|
limit?: number | undefined;
|
|
4414
|
+
includeTrashed?: boolean | undefined;
|
|
4412
4415
|
}>;
|
|
4413
4416
|
export type googleOauthSearchDriveByKeywordsParamsType = z.infer<typeof googleOauthSearchDriveByKeywordsParamsSchema>;
|
|
4414
4417
|
export declare const googleOauthSearchDriveByKeywordsOutputSchema: z.ZodObject<{
|
|
@@ -4456,15 +4459,18 @@ export declare const googleOauthSearchDriveByQueryParamsSchema: z.ZodObject<{
|
|
|
4456
4459
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
4457
4460
|
searchDriveByDrive: z.ZodBoolean;
|
|
4458
4461
|
orderByQuery: z.ZodOptional<z.ZodString>;
|
|
4462
|
+
includeTrashed: z.ZodOptional<z.ZodBoolean>;
|
|
4459
4463
|
}, "strip", z.ZodTypeAny, {
|
|
4460
4464
|
query: string;
|
|
4461
4465
|
searchDriveByDrive: boolean;
|
|
4462
4466
|
limit?: number | undefined;
|
|
4467
|
+
includeTrashed?: boolean | undefined;
|
|
4463
4468
|
orderByQuery?: string | undefined;
|
|
4464
4469
|
}, {
|
|
4465
4470
|
query: string;
|
|
4466
4471
|
searchDriveByDrive: boolean;
|
|
4467
4472
|
limit?: number | undefined;
|
|
4473
|
+
includeTrashed?: boolean | undefined;
|
|
4468
4474
|
orderByQuery?: string | undefined;
|
|
4469
4475
|
}>;
|
|
4470
4476
|
export type googleOauthSearchDriveByQueryParamsType = z.infer<typeof googleOauthSearchDriveByQueryParamsSchema>;
|
|
@@ -4514,16 +4520,19 @@ export declare const googleOauthSearchDriveByKeywordsAndGetFileContentParamsSche
|
|
|
4514
4520
|
fileSizeLimit: z.ZodOptional<z.ZodNumber>;
|
|
4515
4521
|
searchDriveByDrive: z.ZodBoolean;
|
|
4516
4522
|
orderByQuery: z.ZodOptional<z.ZodString>;
|
|
4523
|
+
includeTrashed: z.ZodOptional<z.ZodBoolean>;
|
|
4517
4524
|
}, "strip", z.ZodTypeAny, {
|
|
4518
4525
|
searchDriveByDrive: boolean;
|
|
4519
4526
|
searchQuery: string;
|
|
4520
4527
|
limit?: number | undefined;
|
|
4528
|
+
includeTrashed?: boolean | undefined;
|
|
4521
4529
|
orderByQuery?: string | undefined;
|
|
4522
4530
|
fileSizeLimit?: number | undefined;
|
|
4523
4531
|
}, {
|
|
4524
4532
|
searchDriveByDrive: boolean;
|
|
4525
4533
|
searchQuery: string;
|
|
4526
4534
|
limit?: number | undefined;
|
|
4535
|
+
includeTrashed?: boolean | undefined;
|
|
4527
4536
|
orderByQuery?: string | undefined;
|
|
4528
4537
|
fileSizeLimit?: number | undefined;
|
|
4529
4538
|
}>;
|
|
@@ -4611,16 +4620,19 @@ export declare const googleOauthSearchDriveByQueryAndGetFileContentParamsSchema:
|
|
|
4611
4620
|
fileSizeLimit: z.ZodOptional<z.ZodNumber>;
|
|
4612
4621
|
searchDriveByDrive: z.ZodBoolean;
|
|
4613
4622
|
orderByQuery: z.ZodOptional<z.ZodString>;
|
|
4623
|
+
includeTrashed: z.ZodOptional<z.ZodBoolean>;
|
|
4614
4624
|
}, "strip", z.ZodTypeAny, {
|
|
4615
4625
|
query: string;
|
|
4616
4626
|
searchDriveByDrive: boolean;
|
|
4617
4627
|
limit?: number | undefined;
|
|
4628
|
+
includeTrashed?: boolean | undefined;
|
|
4618
4629
|
orderByQuery?: string | undefined;
|
|
4619
4630
|
fileSizeLimit?: number | undefined;
|
|
4620
4631
|
}, {
|
|
4621
4632
|
query: string;
|
|
4622
4633
|
searchDriveByDrive: boolean;
|
|
4623
4634
|
limit?: number | undefined;
|
|
4635
|
+
includeTrashed?: boolean | undefined;
|
|
4624
4636
|
orderByQuery?: string | undefined;
|
|
4625
4637
|
fileSizeLimit?: number | undefined;
|
|
4626
4638
|
}>;
|
|
@@ -2714,6 +2714,7 @@ export const googleOauthGetPresentationOutputSchema = z.object({
|
|
|
2714
2714
|
export const googleOauthSearchDriveByKeywordsParamsSchema = z.object({
|
|
2715
2715
|
keywords: z.array(z.string()).describe("List of keywords to search for in file contents."),
|
|
2716
2716
|
limit: z.number().describe("The maximum number of files to return").optional(),
|
|
2717
|
+
includeTrashed: z.boolean().describe("Whether to include trashed files in the search results").optional(),
|
|
2717
2718
|
});
|
|
2718
2719
|
export const googleOauthSearchDriveByKeywordsOutputSchema = z.object({
|
|
2719
2720
|
success: z.boolean().describe("Whether the search was successful"),
|
|
@@ -2736,6 +2737,7 @@ export const googleOauthSearchDriveByQueryParamsSchema = z.object({
|
|
|
2736
2737
|
.string()
|
|
2737
2738
|
.describe("The orderBy query for sorting results (e.g., 'modifiedTime desc', 'name', 'createdTime desc'). Defaults to 'modifiedTime desc'")
|
|
2738
2739
|
.optional(),
|
|
2740
|
+
includeTrashed: z.boolean().describe("Whether to include trashed files in the search results").optional(),
|
|
2739
2741
|
});
|
|
2740
2742
|
export const googleOauthSearchDriveByQueryOutputSchema = z.object({
|
|
2741
2743
|
success: z.boolean().describe("Whether the search was successful"),
|
|
@@ -2759,6 +2761,7 @@ export const googleOauthSearchDriveByKeywordsAndGetFileContentParamsSchema = z.o
|
|
|
2759
2761
|
.string()
|
|
2760
2762
|
.describe("The orderBy query for sorting results (e.g., 'modifiedTime desc', 'name', 'createdTime desc'). Defaults to 'modifiedTime desc'")
|
|
2761
2763
|
.optional(),
|
|
2764
|
+
includeTrashed: z.boolean().describe("Whether to include trashed files in the search results").optional(),
|
|
2762
2765
|
});
|
|
2763
2766
|
export const googleOauthSearchDriveByKeywordsAndGetFileContentOutputSchema = z.object({
|
|
2764
2767
|
success: z.boolean().describe("Whether the search was successful"),
|
|
@@ -2789,6 +2792,7 @@ export const googleOauthSearchDriveByQueryAndGetFileContentParamsSchema = z.obje
|
|
|
2789
2792
|
.string()
|
|
2790
2793
|
.describe("The orderBy query for sorting results (e.g., 'modifiedTime desc', 'name', 'createdTime desc'). Defaults to 'modifiedTime desc'")
|
|
2791
2794
|
.optional(),
|
|
2795
|
+
includeTrashed: z.boolean().describe("Whether to include trashed files in the search results").optional(),
|
|
2792
2796
|
});
|
|
2793
2797
|
export const googleOauthSearchDriveByQueryAndGetFileContentOutputSchema = z.object({
|
|
2794
2798
|
success: z.boolean().describe("Whether the search was successful"),
|
|
@@ -8,30 +8,28 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
const
|
|
16
|
-
function
|
|
17
|
-
|
|
12
|
+
const axiosClient_1 = require("../../util/axiosClient");
|
|
13
|
+
function getConfluenceRequestConfig(baseUrl, username, apiToken) {
|
|
14
|
+
return {
|
|
18
15
|
baseURL: baseUrl,
|
|
19
16
|
headers: {
|
|
20
17
|
Accept: "application/json",
|
|
21
|
-
// Tokens are associated with a specific user.
|
|
22
18
|
Authorization: `Basic ${Buffer.from(`${username}:${apiToken}`).toString("base64")}`,
|
|
23
19
|
},
|
|
24
|
-
}
|
|
25
|
-
return api;
|
|
20
|
+
};
|
|
26
21
|
}
|
|
27
22
|
const confluenceUpdatePage = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
|
|
28
|
-
const { pageId,
|
|
29
|
-
const { baseUrl, authToken } = authParams;
|
|
30
|
-
|
|
23
|
+
const { pageId, content, title } = params;
|
|
24
|
+
const { baseUrl, authToken, username } = authParams;
|
|
25
|
+
if (!baseUrl || !authToken || !username) {
|
|
26
|
+
throw new Error("Missing required authentication information");
|
|
27
|
+
}
|
|
28
|
+
const config = getConfluenceRequestConfig(baseUrl, username, authToken);
|
|
31
29
|
// Get current version number
|
|
32
|
-
const response = yield
|
|
30
|
+
const response = yield axiosClient_1.axiosClient.get(`/api/v2/pages/${pageId}`, config);
|
|
33
31
|
const currVersion = response.data.version.number;
|
|
34
|
-
|
|
32
|
+
const payload = {
|
|
35
33
|
id: pageId,
|
|
36
34
|
status: "current",
|
|
37
35
|
title,
|
|
@@ -42,6 +40,7 @@ const confluenceUpdatePage = (_a) => __awaiter(void 0, [_a], void 0, function* (
|
|
|
42
40
|
version: {
|
|
43
41
|
number: currVersion + 1,
|
|
44
42
|
},
|
|
45
|
-
}
|
|
43
|
+
};
|
|
44
|
+
yield axiosClient_1.axiosClient.put(`/api/v2/pages/${pageId}`, payload, config);
|
|
46
45
|
});
|
|
47
46
|
exports.default = confluenceUpdatePage;
|
|
@@ -0,0 +1,18 @@
|
|
|
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 fillTemplateAction = (_a) => __awaiter(void 0, [_a], void 0, function* ({ template }) {
|
|
13
|
+
// Simply return the template without any modification
|
|
14
|
+
return {
|
|
15
|
+
result: template,
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
exports.default = fillTemplateAction;
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
const genericApiCall = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, }) {
|
|
17
|
+
try {
|
|
18
|
+
const { endpoint, method, headers, body } = params;
|
|
19
|
+
const response = yield (0, axios_1.default)({
|
|
20
|
+
url: endpoint,
|
|
21
|
+
method,
|
|
22
|
+
headers,
|
|
23
|
+
data: method !== "GET" ? body : undefined,
|
|
24
|
+
});
|
|
25
|
+
return {
|
|
26
|
+
statusCode: response.status,
|
|
27
|
+
headers: response.headers,
|
|
28
|
+
data: response.data,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
33
|
+
throw Error("Axios Error: " + (error.message || "Failed to make API call"));
|
|
34
|
+
}
|
|
35
|
+
throw Error("Error: " + (error || "Failed to make API call"));
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
exports.default = genericApiCall;
|
|
@@ -0,0 +1,161 @@
|
|
|
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 pdf from "pdf-parse/lib/pdf-parse.js";
|
|
11
|
+
import { axiosClient } from "../../util/axiosClient.js";
|
|
12
|
+
import mammoth from "mammoth";
|
|
13
|
+
import { MISSING_AUTH_TOKEN } from "../../util/missingAuthConstants.js";
|
|
14
|
+
const getDriveFileContentByID = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
|
|
15
|
+
if (!authParams.authToken) {
|
|
16
|
+
return { success: false, error: MISSING_AUTH_TOKEN };
|
|
17
|
+
}
|
|
18
|
+
const { fileId, limit } = params;
|
|
19
|
+
try {
|
|
20
|
+
// First, get file metadata to determine the file type
|
|
21
|
+
const metadataUrl = `https://www.googleapis.com/drive/v3/files/${encodeURIComponent(fileId)}?fields=name,mimeType,size`;
|
|
22
|
+
const metadataRes = yield axiosClient.get(metadataUrl, {
|
|
23
|
+
headers: {
|
|
24
|
+
Authorization: `Bearer ${authParams.authToken}`,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
const { name: fileName, mimeType, size } = metadataRes.data;
|
|
28
|
+
// Check if file is too large (50MB limit for safety)
|
|
29
|
+
if (size && parseInt(size) > 50 * 1024 * 1024) {
|
|
30
|
+
return {
|
|
31
|
+
success: false,
|
|
32
|
+
error: "File too large (>50MB)",
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
let content = "";
|
|
36
|
+
// Handle different file types - read content directly
|
|
37
|
+
if (mimeType === "application/vnd.google-apps.document") {
|
|
38
|
+
// Google Docs - download as plain text
|
|
39
|
+
const downloadUrl = `https://www.googleapis.com/drive/v3/files/${encodeURIComponent(fileId)}?alt=media&format=txt`;
|
|
40
|
+
const downloadRes = yield axiosClient.get(downloadUrl, {
|
|
41
|
+
headers: {
|
|
42
|
+
Authorization: `Bearer ${authParams.authToken}`,
|
|
43
|
+
},
|
|
44
|
+
responseType: 'text',
|
|
45
|
+
});
|
|
46
|
+
content = downloadRes.data;
|
|
47
|
+
}
|
|
48
|
+
else if (mimeType === "application/vnd.google-apps.spreadsheet") {
|
|
49
|
+
// Google Sheets - download as CSV
|
|
50
|
+
const downloadUrl = `https://www.googleapis.com/drive/v3/files/${encodeURIComponent(fileId)}?alt=media&format=csv`;
|
|
51
|
+
const downloadRes = yield axiosClient.get(downloadUrl, {
|
|
52
|
+
headers: {
|
|
53
|
+
Authorization: `Bearer ${authParams.authToken}`,
|
|
54
|
+
},
|
|
55
|
+
responseType: 'text',
|
|
56
|
+
});
|
|
57
|
+
content = downloadRes.data;
|
|
58
|
+
}
|
|
59
|
+
else if (mimeType === "application/vnd.google-apps.presentation") {
|
|
60
|
+
// Google Slides - download as plain text
|
|
61
|
+
const downloadUrl = `https://www.googleapis.com/drive/v3/files/${encodeURIComponent(fileId)}?alt=media&format=txt`;
|
|
62
|
+
const downloadRes = yield axiosClient.get(downloadUrl, {
|
|
63
|
+
headers: {
|
|
64
|
+
Authorization: `Bearer ${authParams.authToken}`,
|
|
65
|
+
},
|
|
66
|
+
responseType: 'text',
|
|
67
|
+
});
|
|
68
|
+
content = downloadRes.data;
|
|
69
|
+
}
|
|
70
|
+
else if (mimeType === "application/pdf") {
|
|
71
|
+
// PDF files - use pdf-parse
|
|
72
|
+
const downloadUrl = `https://www.googleapis.com/drive/v3/files/${encodeURIComponent(fileId)}?alt=media`;
|
|
73
|
+
const downloadRes = yield axiosClient.get(downloadUrl, {
|
|
74
|
+
headers: {
|
|
75
|
+
Authorization: `Bearer ${authParams.authToken}`,
|
|
76
|
+
},
|
|
77
|
+
responseType: 'arraybuffer',
|
|
78
|
+
});
|
|
79
|
+
try {
|
|
80
|
+
const pdfData = yield pdf(downloadRes.data);
|
|
81
|
+
content = pdfData.text;
|
|
82
|
+
}
|
|
83
|
+
catch (pdfError) {
|
|
84
|
+
return {
|
|
85
|
+
success: false,
|
|
86
|
+
error: `Failed to parse PDF: ${pdfError instanceof Error ? pdfError.message : 'Unknown PDF error'}`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else if (mimeType === "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ||
|
|
91
|
+
mimeType === "application/msword") {
|
|
92
|
+
// Word documents (.docx or .doc) - download and extract text using mammoth
|
|
93
|
+
const downloadUrl = `https://www.googleapis.com/drive/v3/files/${encodeURIComponent(fileId)}?alt=media`;
|
|
94
|
+
const downloadRes = yield axiosClient.get(downloadUrl, {
|
|
95
|
+
headers: {
|
|
96
|
+
Authorization: `Bearer ${authParams.authToken}`,
|
|
97
|
+
},
|
|
98
|
+
responseType: 'arraybuffer',
|
|
99
|
+
});
|
|
100
|
+
try {
|
|
101
|
+
// mammoth works with .docx files. It will ignore formatting and return raw text
|
|
102
|
+
const result = yield mammoth.extractRawText({ buffer: Buffer.from(downloadRes.data) });
|
|
103
|
+
content = result.value; // raw text
|
|
104
|
+
}
|
|
105
|
+
catch (wordError) {
|
|
106
|
+
return {
|
|
107
|
+
success: false,
|
|
108
|
+
error: `Failed to parse Word document: ${wordError instanceof Error ? wordError.message : 'Unknown Word error'}`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else if (mimeType === "text/plain" ||
|
|
113
|
+
mimeType === "text/html" ||
|
|
114
|
+
mimeType === "application/rtf" ||
|
|
115
|
+
(mimeType === null || mimeType === void 0 ? void 0 : mimeType.startsWith("text/"))) {
|
|
116
|
+
// Text-based files
|
|
117
|
+
const downloadUrl = `https://www.googleapis.com/drive/v3/files/${encodeURIComponent(fileId)}?alt=media`;
|
|
118
|
+
const downloadRes = yield axiosClient.get(downloadUrl, {
|
|
119
|
+
headers: {
|
|
120
|
+
Authorization: `Bearer ${authParams.authToken}`,
|
|
121
|
+
},
|
|
122
|
+
responseType: 'text',
|
|
123
|
+
});
|
|
124
|
+
content = downloadRes.data;
|
|
125
|
+
}
|
|
126
|
+
else if (mimeType === null || mimeType === void 0 ? void 0 : mimeType.startsWith("image/")) {
|
|
127
|
+
// Skip images
|
|
128
|
+
return {
|
|
129
|
+
success: false,
|
|
130
|
+
error: "Image files are not supported for text extraction",
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
// Unsupported file type
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
error: `Unsupported file type: ${mimeType}`,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
content = content.trim();
|
|
141
|
+
const originalLength = content.length;
|
|
142
|
+
// Naive way to truncate content
|
|
143
|
+
if (limit && content.length > limit) {
|
|
144
|
+
content = content.substring(0, limit);
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
success: true,
|
|
148
|
+
content,
|
|
149
|
+
fileName,
|
|
150
|
+
fileLength: originalLength,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.error("Error getting Google Drive file content", error);
|
|
155
|
+
return {
|
|
156
|
+
success: false,
|
|
157
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
export default getDriveFileContentByID;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { axiosClient } from "../../util/axiosClient.js";
|
|
11
|
+
import { MISSING_AUTH_TOKEN } from "../../util/missingAuthConstants.js";
|
|
12
|
+
const searchDriveByKeywords = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
|
|
13
|
+
var _b;
|
|
14
|
+
if (!authParams.authToken) {
|
|
15
|
+
return { success: false, error: MISSING_AUTH_TOKEN, files: [] };
|
|
16
|
+
}
|
|
17
|
+
const { keywords, limit } = params;
|
|
18
|
+
// Build the query: fullText contains 'keyword1' or fullText contains 'keyword2' ...
|
|
19
|
+
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`;
|
|
21
|
+
// 1. Get the file metadata from google drive search
|
|
22
|
+
let files = [];
|
|
23
|
+
try {
|
|
24
|
+
const res = yield axiosClient.get(url, {
|
|
25
|
+
headers: {
|
|
26
|
+
Authorization: `Bearer ${authParams.authToken}`,
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
files =
|
|
30
|
+
((_b = res.data.files) === null || _b === void 0 ? void 0 : _b.map((file) => ({
|
|
31
|
+
id: file.id || "",
|
|
32
|
+
name: file.name || "",
|
|
33
|
+
mimeType: file.mimeType || "",
|
|
34
|
+
url: file.webViewLink || "",
|
|
35
|
+
}))) || [];
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
console.error("Error searching Google Drive", error);
|
|
39
|
+
return {
|
|
40
|
+
success: false,
|
|
41
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
42
|
+
files: [],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
files = limit ? files.splice(0, limit) : files;
|
|
46
|
+
});
|
|
47
|
+
export default searchDriveByKeywords;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { axiosClient } from "../../util/axiosClient.js";
|
|
11
|
+
import { MISSING_AUTH_TOKEN } from "../../util/missingAuthConstants.js";
|
|
12
|
+
import extractContentFromDriveFileId from "./utils/extractContentFromDriveFileId.js";
|
|
13
|
+
import { normalizeText } from "../../../utils/string.js";
|
|
14
|
+
/** Intelligently selects a section of text around the median occurrence of keywords */
|
|
15
|
+
const intelligentSelectByMedianSection = (text, keywords, limit) => {
|
|
16
|
+
if (!text || text.length <= limit)
|
|
17
|
+
return text;
|
|
18
|
+
if (!(keywords === null || keywords === void 0 ? void 0 : keywords.length))
|
|
19
|
+
return text.substring(0, limit);
|
|
20
|
+
// Find all keyword positions (case-insensitive, limited to first 1000 matches)
|
|
21
|
+
const positions = [];
|
|
22
|
+
const normalizedText = normalizeText(text);
|
|
23
|
+
for (const keyword of keywords) {
|
|
24
|
+
if (keyword.length < 3)
|
|
25
|
+
continue; // Skip very short keywords
|
|
26
|
+
let pos = -1;
|
|
27
|
+
const normalizedKeyword = normalizeText(keyword);
|
|
28
|
+
while ((pos = normalizedText.indexOf(normalizedKeyword, pos + 1)) !== -1 && positions.length < 1000) {
|
|
29
|
+
positions.push(pos);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (!positions.length)
|
|
33
|
+
return text.substring(0, limit);
|
|
34
|
+
// Find median position (using sort for simplicity, still fast for 1000 elements)
|
|
35
|
+
positions.sort((a, b) => a - b);
|
|
36
|
+
const medianPos = positions[Math.floor(positions.length / 2)];
|
|
37
|
+
// Return window around median
|
|
38
|
+
const half = Math.floor(limit / 2);
|
|
39
|
+
const start = Math.max(0, medianPos - half);
|
|
40
|
+
const end = Math.min(text.length, start + limit);
|
|
41
|
+
return text.substring(start, end);
|
|
42
|
+
};
|
|
43
|
+
const searchDriveAndGetContentByKeywords = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params, authParams, }) {
|
|
44
|
+
var _b;
|
|
45
|
+
if (!authParams.authToken) {
|
|
46
|
+
return { success: false, error: MISSING_AUTH_TOKEN, files: [] };
|
|
47
|
+
}
|
|
48
|
+
const { keywords, fileLimit, fileSizeLimit } = params;
|
|
49
|
+
let files = [];
|
|
50
|
+
// 1. Search for files and get their metadata
|
|
51
|
+
// Build the query: fullText contains 'keyword1' or fullText contains 'keyword2' ...
|
|
52
|
+
const query = keywords.map(kw => `fullText contains '${kw.replace(/'/g, "\\'")}'`).join(" or ");
|
|
53
|
+
const url = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(query)}&fields=files(id,name,mimeType,webViewLink)&supportsAllDrives=true&includeItemsFromAllDrives=true`;
|
|
54
|
+
try {
|
|
55
|
+
const res = yield axiosClient.get(url, {
|
|
56
|
+
headers: {
|
|
57
|
+
Authorization: `Bearer ${authParams.authToken}`,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
files =
|
|
61
|
+
((_b = res.data.files) === null || _b === void 0 ? void 0 : _b.map((file) => ({
|
|
62
|
+
id: file.id,
|
|
63
|
+
name: file.name,
|
|
64
|
+
mimeType: file.mimeType,
|
|
65
|
+
url: file.webViewLink,
|
|
66
|
+
}))) || [];
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.error("Error searching Google Drive", error);
|
|
70
|
+
return {
|
|
71
|
+
success: false,
|
|
72
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
73
|
+
files: [],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
files = fileLimit ? files.splice(0, fileLimit) : files;
|
|
77
|
+
// 2. Extract content from files and do some smart range selection
|
|
78
|
+
const processedFiles = yield Promise.all(files
|
|
79
|
+
.filter((file) => file.id && file.mimeType)
|
|
80
|
+
.map((file) => __awaiter(void 0, void 0, void 0, function* () {
|
|
81
|
+
const content = yield extractContentFromDriveFileId({
|
|
82
|
+
params: { fileId: file.id, mimeType: file.mimeType },
|
|
83
|
+
authParams,
|
|
84
|
+
});
|
|
85
|
+
if (content.success) {
|
|
86
|
+
let selectedContent = content.content;
|
|
87
|
+
if (fileSizeLimit && selectedContent && selectedContent.length > fileSizeLimit) {
|
|
88
|
+
selectedContent = intelligentSelectByMedianSection(selectedContent, keywords, fileSizeLimit);
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
id: file.id || "",
|
|
92
|
+
name: file.name || "",
|
|
93
|
+
mimeType: file.mimeType || "",
|
|
94
|
+
url: file.url || "",
|
|
95
|
+
content: selectedContent,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
return {
|
|
100
|
+
id: file.id || "",
|
|
101
|
+
name: file.name || "",
|
|
102
|
+
mimeType: file.mimeType || "",
|
|
103
|
+
url: file.url || "",
|
|
104
|
+
error: content.error,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
})));
|
|
108
|
+
return { success: true, files: processedFiles };
|
|
109
|
+
});
|
|
110
|
+
export default searchDriveAndGetContentByKeywords;
|