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

174 lines
6.2 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { default as sdk, z } from '@botpress/sdk'
import * as entities from './entities'
export const actions = {
listEvents: {
title: 'List Events',
description: 'Retrieves events from the calendar.',
input: {
schema: z.object({
count: z
.number()
.min(1)
.max(2500)
.default(100)
.title('Number of events to retrieve')
.describe('The maximum number of events to return. Defaults to 100.'),
pageToken: z.string().title('Page token').optional().describe('Token specifying which result page to return.'),
timeMin: z
.string()
.title('On or after')
.optional()
.describe(
'Only return events occurring on or after this date. Must be in RFC3339 format. Defaults to now if not specified.'
),
}),
},
output: {
schema: z.object({
events: z
.array(entities.Event.schema.title('Event').describe('The calendar event data.'))
.title('Events')
.describe('The list of calendar events.'),
nextPageToken: z
.string()
.title('Next page token')
.optional()
.describe('Token used to access the next page of this result. Omitted if no further results are available.'),
}),
},
},
createEvent: {
title: 'Create Event',
description: 'Creates a new event in the calendar.',
input: {
schema: entities.Event.schema
.omit({ eventType: true, htmlLink: true, id: true, conferenceLink: true })
.extend({
attendees: z
.array(
z.object({
email: z.string().email().title('Email').describe('The email address of the attendee.'),
displayName: z
.string()
.title('Display Name')
.optional()
.describe('The name of the attendee. Optional.'),
optional: z
.boolean()
.title('Optional Attendee')
.optional()
.default(false)
.describe('Whether this is an optional attendee. Optional. The default is False.'),
})
)
.title('Attendees')
.optional()
.describe('List of attendees for the event. Email invitations will be sent automatically.'),
})
.title('New Event')
.describe('The definition of the new event.'),
},
output: {
schema: entities.Event.schema.title('Created Event').describe('The data of the new event.'),
},
},
updateEvent: {
title: 'Update Event',
description: 'Updates an existing event in the calendar. Omitted properties are left unchanged.',
input: {
schema: entities.Event.schema.omit({ eventType: true, htmlLink: true, conferenceLink: true }).extend({
id: z.string().title('Event ID').describe('The ID of the calendar event to update.'),
attendees: z
.array(
z.object({
email: z.string().email().title('Email').describe('The email address of the attendee.'),
displayName: z.string().title('Display Name').optional().describe('The name of the attendee. Optional.'),
optional: z
.boolean()
.title('Optional Attendee')
.optional()
.default(false)
.describe('Whether this is an optional attendee. Optional. The default is False.'),
})
)
.title('Attendees')
.optional()
.describe('List of attendees for the event.'),
}),
},
output: {
schema: entities.Event.schema.title('Updated Event').describe('The data of the event.'),
},
},
deleteEvent: {
title: 'Delete Event',
description: 'Deletes an event from the calendar.',
input: {
schema: z.object({
eventId: z.string().title('Event ID').describe('The ID of the calendar event to delete.'),
}),
},
output: {
schema: z.object({}),
},
},
checkAvailability: {
title: 'Check Availability',
description: 'Checks calendar availability and returns free time slots for the specified date range.',
input: {
schema: z.object({
timeMin: z
.string()
.title('Start Time')
.describe('Start of the time range to check (ISO 8601 format, e.g., "2025-11-05T09:00:00-04:00").'),
timeMax: z
.string()
.title('End Time')
.describe('End of the time range to check (ISO 8601 format, e.g., "2025-11-05T17:00:00-04:00").'),
slotDurationMinutes: z
.number()
.min(15)
.max(480)
.default(45)
.title('Slot Duration (minutes)')
.describe('Duration of each time slot in minutes. Defaults to 45 minutes.'),
timezone: z
.string()
.default('America/Toronto')
.title('Timezone')
.describe('Timezone for formatting output (e.g., "America/Toronto"). Defaults to America/Toronto.'),
}),
},
output: {
schema: z.object({
freeSlots: z
.array(
z.object({
start: z.string().title('Start Time').describe('ISO 8601 formatted start time of the free slot.'),
end: z.string().title('End Time').describe('ISO 8601 formatted end time of the free slot.'),
})
)
.title('Free Slots')
.describe('Array of available time slots in ISO format.'),
formattedFreeSlots: z
.array(z.string())
.title('Formatted Free Slots')
.describe('Array of human-readable formatted free slots (e.g., "9:00 AM 9:45 AM").'),
busySlots: z
.array(
z.object({
start: z.string().title('Start Time').describe('ISO 8601 formatted start time of the busy slot.'),
end: z.string().title('End Time').describe('ISO 8601 formatted end time of the busy slot.'),
})
)
.title('Busy Slots')
.describe('Array of busy time slots in ISO format.'),
}),
},
},
} as const satisfies sdk.IntegrationDefinitionProps['actions']