Files
2026-07-13 13:34:48 +08:00

229 lines
6.2 KiB
TypeScript

import * as sdk from '@botpress/sdk'
import filesReadonly from './bp_modules/files-readonly'
import {
fileSchema,
createFileArgSchema,
updateFileArgSchema,
uploadFileDataArgSchema,
downloadFileDataArgSchema,
listFoldersOutputSchema,
listFilesOutputSchema,
readFileArgSchema,
listItemsInputSchema,
deleteFileArgSchema,
downloadFileDataOutputSchema,
fileDeletedEventSchema,
folderSchema,
folderDeletedEventSchema,
baseDiscriminatedFileSchema,
fileChannelSchema,
} from './src/schemas'
// TODO: use default options
const toJSONSchemaOptions: Partial<sdk.z.transforms.JSONSchemaGenerationOptions> = {
discriminatedUnionStrategy: 'anyOf',
discriminator: false,
}
export default new sdk.IntegrationDefinition({
name: 'googledrive',
title: 'Google Drive',
description: 'Access and manage your Google Drive files from your bot.',
version: '0.4.3',
readme: 'hub.md',
icon: 'icon.svg',
attributes: {
category: 'File Management',
repo: 'botpress',
},
configuration: {
identifier: {
linkTemplateScript: 'linkTemplate.vrl',
},
schema: sdk.z.object({}),
},
actions: {
listFiles: {
// TODO: Implement listable
title: 'List Files',
description: 'List files in Google Drive',
input: {
schema: listItemsInputSchema,
},
output: {
schema: listFilesOutputSchema,
},
},
listFolders: {
// TODO: Implement listable
title: 'List folders',
description: 'List folders in Google Drive',
input: {
schema: listItemsInputSchema,
},
output: {
schema: listFoldersOutputSchema,
},
},
createFile: {
// TODO: Implement creatable
title: 'Create File',
description: 'Create an empty file in Google Drive',
input: {
schema: createFileArgSchema,
},
output: {
schema: fileSchema.describe('The file created in Google Drive'),
},
},
readFile: {
// TODO: Implement readable
title: 'Read File',
description: "Read a file's metadata in a Google Drive",
input: {
schema: readFileArgSchema,
},
output: {
schema: fileSchema.describe('The file read from Google Drive'),
},
},
updateFile: {
// TODO: Implement updatable
title: 'Update File',
description: "Update a file's metadata in Google Drive",
input: {
schema: updateFileArgSchema,
},
output: {
schema: fileSchema.describe('The file updated in Google Drive'),
},
},
deleteFile: {
// TODO: Implement deletable
title: 'Delete File',
description: 'Deletes a file in Google Drive',
input: {
schema: deleteFileArgSchema,
},
output: {
schema: sdk.z.object({}),
},
},
uploadFileData: {
title: 'Upload file data',
description: 'Upload data to a file in Google Drive',
input: {
schema: uploadFileDataArgSchema,
},
output: {
schema: sdk.z.object({}),
},
},
downloadFileData: {
title: 'Download file data',
description: 'Download data from a file in Google Drive',
input: {
schema: downloadFileDataArgSchema,
},
output: {
schema: downloadFileDataOutputSchema,
},
},
syncChannels: {
title: 'Sync Channels',
description: 'Sync channels for file change subscriptions',
input: {
schema: sdk.z.object({}),
},
output: {
schema: sdk.z.object({}),
},
},
},
events: {
fileCreated: {
title: 'File Created',
description: 'Triggered when a file is created in Google Drive',
schema: fileSchema,
},
fileDeleted: {
title: 'File Deleted',
description: 'Triggered when a file is deleted in Google Drive',
schema: fileDeletedEventSchema,
},
folderCreated: {
title: 'Folder Created',
description: 'Triggered when a folder is created in Google Drive',
schema: folderSchema,
},
folderDeleted: {
title: 'Folder Deleted',
description: 'Triggered when a folder is deleted in Google Drive',
schema: folderDeletedEventSchema,
},
},
states: {
configuration: {
type: 'integration',
schema: sdk.z.object({
refreshToken: sdk.z
.string()
.title('Refresh token')
.describe('The refresh token to use to authenticate with Google. It gets exchanged for a bearer token'),
}),
},
filesCache: {
type: 'integration',
schema: sdk.z.object({
filesCache: sdk.z
.record(sdk.z.string(), baseDiscriminatedFileSchema)
.title('Files cache')
.describe('Map of known files'),
}),
},
filesChannelsCache: {
type: 'integration',
schema: sdk.z.object({
filesChannelsCache: sdk.z
.record(sdk.z.string(), fileChannelSchema)
.title('Files change subscription channels')
.describe('Serialized set of channels for file change subscriptions'),
}),
},
},
secrets: {
CLIENT_ID: {
description: 'The client ID in your Google Cloud Credentials',
},
CLIENT_SECRET: {
description: 'The client secret associated with your client ID',
},
WEBHOOK_SECRET: {
description: 'The secret used to sign webhook tokens. Should be a high-entropy string that only Botpress knows',
},
FILE_PICKER_API_KEY: {
description: 'The API key used to access the Google Picker API',
},
},
__advanced: { toJSONSchemaOptions },
}).extend(filesReadonly, ({}) => ({
entities: {},
actions: {
listItemsInFolder: {
name: 'filesReadonlyListItemsInFolder',
attributes: { ...sdk.WELL_KNOWN_ATTRIBUTES.HIDDEN_IN_STUDIO },
},
transferFileToBotpress: {
name: 'filesReadonlyTransferFileToBotpress',
attributes: { ...sdk.WELL_KNOWN_ATTRIBUTES.HIDDEN_IN_STUDIO },
},
},
events: {
fileCreated: { name: 'filesReadonlyFileCreated' },
fileUpdated: { name: 'filesReadonlyFileUpdated' },
fileDeleted: { name: 'filesReadonlyFileDeleted' },
folderDeletedRecursive: { name: 'filesReadonlyFolderDeletedRecursive' },
aggregateFileChanges: { name: 'filesReadonlyAggregateFileChanges' },
},
}))