172 lines
5.7 KiB
TypeScript
172 lines
5.7 KiB
TypeScript
import * as sdk from '@botpress/sdk'
|
|
|
|
const BASE_ITEM = (itemType: 'file' | 'folder' | 'item' = 'item') =>
|
|
sdk.z.object({
|
|
id: sdk.z
|
|
.string()
|
|
.describe(
|
|
`The ${itemType}'s ID. This could be a unique identifier from the external service, or a relative or absolute path, so long as it's unique.`
|
|
),
|
|
type: sdk.z.union([sdk.z.literal('file'), sdk.z.literal('folder')]).describe('The entity type'),
|
|
name: sdk.z
|
|
.string()
|
|
.describe(
|
|
`The ${itemType}'s name. This will be displayed in the Botpress UI and be used as the ${itemType}'s name on Files API."`
|
|
),
|
|
parentId: sdk.z
|
|
.string()
|
|
.optional()
|
|
.describe(`The parent folder ID. Leave empty if the ${itemType} is in the root folder.`),
|
|
absolutePath: sdk.z
|
|
.string()
|
|
.optional()
|
|
.describe(`The absolute path of the ${itemType}. Leave empty if not available.`),
|
|
})
|
|
|
|
const FOLDER = BASE_ITEM('folder').extend({
|
|
type: sdk.z.literal('folder'),
|
|
})
|
|
|
|
const FILE = BASE_ITEM('file').extend({
|
|
type: sdk.z.literal('file'),
|
|
sizeInBytes: sdk.z.number().optional().describe('The file size in bytes, if available'),
|
|
lastModifiedDate: sdk.z.string().datetime().optional().describe('The last modified date of the file, if available'),
|
|
contentHash: sdk.z
|
|
.string()
|
|
.optional()
|
|
.describe('The hash of the file content, or version/revision number, if available'),
|
|
})
|
|
|
|
const FILE_WITH_PATH = FILE.extend({
|
|
absolutePath: sdk.z.string().describe('The full path of the file'),
|
|
})
|
|
|
|
const FOLDER_WITH_PATH = FOLDER.extend({
|
|
absolutePath: sdk.z.string().describe('The full path of the folder'),
|
|
})
|
|
|
|
const NEXT_TOKEN = sdk.z.string().optional().describe('The token to get the next page of items.')
|
|
|
|
export default new sdk.InterfaceDefinition({
|
|
name: 'files-readonly',
|
|
version: '0.3.0',
|
|
actions: {
|
|
listItemsInFolder: {
|
|
attributes: {
|
|
...sdk.WELL_KNOWN_ATTRIBUTES.HIDDEN_IN_STUDIO,
|
|
},
|
|
title: 'List items in folder',
|
|
description: 'List the files and folders in a folder',
|
|
input: {
|
|
schema: () =>
|
|
sdk.z.object({
|
|
folderId: FOLDER.shape.id
|
|
.optional()
|
|
.title('Folder ID')
|
|
.describe('The folder ID to list the items from. Leave empty to list items from the root folder.'),
|
|
filters: sdk.z
|
|
.object({
|
|
itemType: BASE_ITEM().shape.type.optional().describe('Filter the items by type'),
|
|
maxSizeInBytes: FILE.shape.sizeInBytes
|
|
.optional()
|
|
.describe('Filter the items by maximum size (in bytes)'),
|
|
modifiedAfter: FILE.shape.lastModifiedDate
|
|
.optional()
|
|
.describe('Filter the items modified after the given date'),
|
|
})
|
|
.optional()
|
|
.title('Search Filters')
|
|
.describe('Optional search filters'),
|
|
nextToken: NEXT_TOKEN.title('Next Page Token').describe(
|
|
'The token to get the next page of items. Leave empty to get the first page.'
|
|
),
|
|
}),
|
|
},
|
|
output: {
|
|
schema: () =>
|
|
sdk.z.object({
|
|
items: sdk.z
|
|
.array(sdk.z.union([FILE, FOLDER]))
|
|
.title('Folder Items')
|
|
.describe('The files and folders in the folder'),
|
|
meta: sdk.z
|
|
.object({
|
|
nextToken: NEXT_TOKEN,
|
|
})
|
|
.title('Metadata')
|
|
.describe('List items in folder metadata'),
|
|
}),
|
|
},
|
|
},
|
|
transferFileToBotpress: {
|
|
attributes: {
|
|
...sdk.WELL_KNOWN_ATTRIBUTES.HIDDEN_IN_STUDIO,
|
|
},
|
|
title: 'Transfer file to Botpress',
|
|
description: 'Transfer a file from an external service to Botpress',
|
|
input: {
|
|
schema: () =>
|
|
sdk.z.object({
|
|
file: FILE.title('File to transfer').describe('The file to transfer'),
|
|
fileKey: sdk.z.string().title('File key').describe('The file key to use in Botpress'),
|
|
shouldIndex: sdk.z
|
|
.boolean()
|
|
.optional()
|
|
.title('Should index file?')
|
|
.describe('Whether to index the file in vector storage'),
|
|
}),
|
|
},
|
|
output: {
|
|
schema: () =>
|
|
sdk.z.object({
|
|
botpressFileId: sdk.z.string().title('File ID').describe('The file ID of the uploaded file on Botpress'),
|
|
}),
|
|
},
|
|
},
|
|
},
|
|
events: {
|
|
fileCreated: {
|
|
schema: () =>
|
|
sdk.z.object({
|
|
file: FILE_WITH_PATH.title('Created File').describe('The created file'),
|
|
}),
|
|
},
|
|
fileUpdated: {
|
|
schema: () =>
|
|
sdk.z.object({
|
|
file: FILE_WITH_PATH.title('Updated File').describe('The updated file'),
|
|
}),
|
|
},
|
|
fileDeleted: {
|
|
schema: () =>
|
|
sdk.z.object({
|
|
file: FILE_WITH_PATH.title('Deleted File').describe('The deleted file'),
|
|
}),
|
|
},
|
|
folderDeletedRecursive: {
|
|
schema: () =>
|
|
sdk.z.object({
|
|
folder: FOLDER_WITH_PATH.title('Deleted Folder').describe('The deleted folder'),
|
|
}),
|
|
},
|
|
aggregateFileChanges: {
|
|
schema: () =>
|
|
sdk.z.object({
|
|
modifiedItems: sdk.z
|
|
.object({
|
|
created: sdk.z.array(FILE_WITH_PATH).describe('The files created'),
|
|
updated: sdk.z.array(FILE_WITH_PATH).describe('The files updated'),
|
|
deleted: sdk.z
|
|
.array(sdk.z.union([FILE_WITH_PATH, FOLDER_WITH_PATH]))
|
|
.describe('The files and folders deleted'),
|
|
})
|
|
.title('Modified Items')
|
|
.describe('The modified items'),
|
|
}),
|
|
},
|
|
},
|
|
__advanced: {
|
|
useLegacyZuiTransformer: true,
|
|
},
|
|
})
|