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

224 lines
7.9 KiB
TypeScript

import * as sdk from '@botpress/sdk'
import proactiveConversation from 'bp_modules/proactive-conversation'
import proactiveUser from 'bp_modules/proactive-user'
const emailProps = {
cc: sdk.z
.array(sdk.z.object({ email: sdk.z.string().email(), name: sdk.z.string().optional() }))
.optional()
.describe('The CC recipients of the initial email')
.title('CC Recipients'),
bcc: sdk.z
.array(sdk.z.object({ email: sdk.z.string().email(), name: sdk.z.string().optional() }))
.optional()
.describe('The BCC recipients of the initial email')
.title('BCC Recipients'),
subject: sdk.z.string().optional().describe('The subject of the email').title('Email Subject'),
}
export default new sdk.IntegrationDefinition({
name: 'postmark',
title: 'Postmark',
description: 'Send and receive emails through Postmark',
version: '0.1.1',
readme: 'hub.md',
icon: 'icon.svg',
configuration: {
schema: sdk.z.object({
serverToken: sdk.z.string().secret().min(1).title('Server Token').describe('Your Postmark Server API Token'),
fromEmail: sdk.z.string().email().min(1).title('From Email').describe('Default sender email address'),
webhookSecret: sdk.z
.string()
.secret()
.optional()
.title('Webhook Secret')
.describe(
'Optional secret to verify inbound webhooks. Append ?secret=YOUR_SECRET to your Postmark webhook URL.'
),
}),
},
actions: {
sendEmail: {
title: 'Send Email',
description: 'Send an email through Postmark',
input: {
schema: sdk.z
.object({
conversationInformation: sdk.z
.object({
rootEmailId: sdk.z
.string()
.optional()
.describe('The ID of the root email in the thread')
.title('Root Email ID'),
lastEmailId: sdk.z
.string()
.optional()
.describe('The ID of the last email in the thread')
.title('Last Email ID'),
})
.optional()
.describe('Information about the conversation thread, used to group emails into threads')
.title('Conversation Information'),
userEmailAddress: sdk.z.string().describe('The recipient email address').title('Recipient Email Address'),
userName: sdk.z.string().optional().describe('The recipient name').title('Recipient Name'),
cc: sdk.z
.array(sdk.z.object({ email: sdk.z.string().email(), name: sdk.z.string().optional() }))
.optional()
.describe('The CC recipients of the initial email')
.title('CC Recipients'),
bcc: sdk.z
.array(sdk.z.object({ email: sdk.z.string().email(), name: sdk.z.string().optional() }))
.optional()
.describe('The BCC recipients of the initial email')
.title('BCC Recipients'),
subject: sdk.z
.string()
.optional()
.describe('The subject of the initial email')
.title('Initial Email Subject'),
text: sdk.z
.string()
.min(1)
.describe('The body of the initial email that opens the thread')
.title('Initial Email Body'),
})
.title('Conversation')
.describe('The conversation object fields'),
},
output: {
schema: sdk.z.object({
conversationId: sdk.z
.string()
.describe('The ID of the conversation associated with the email')
.title('Conversation ID'),
}),
},
},
},
user: {
tags: {
emailAddress: {
title: 'Email Address',
description: 'Email address of the user',
},
},
},
channels: {
mail: {
title: 'Mail',
description: 'Send and receive emails through Postmark',
conversation: {
tags: {
threadRootMessageId: {
title: 'Thread Root Message ID',
description: 'The Message-ID of the first email in the thread, used to group replies into one conversation',
},
postmarkEmailAddress: {
title: 'Postmark Email Address',
description: 'The email address used in Postmark',
},
userEmailAddress: {
title: 'User Email Address',
description: 'The email address of the user',
},
},
},
message: {
tags: {
id: {
title: 'Message ID',
description: 'The ID of the email message',
},
emailMessageId: {
title: 'Email Message-ID',
description:
'RFC 5322 Message-ID of the email. Absent on attachment sub-messages so they are excluded from thread reconstruction.',
},
subject: {
title: 'Subject',
description: 'The subject of the email',
},
cc: {
title: 'CC',
description: 'The CC recipients of the email',
},
bcc: {
title: 'BCC',
description: 'The BCC recipients of the email',
},
spamScore: {
title: 'Spam Score',
description: 'The spam score of the email as calculated by Postmark',
},
},
},
messages: {
text: { schema: sdk.messages.defaults.text.schema.extend(emailProps) },
image: { schema: sdk.messages.defaults.image.schema.extend(emailProps) },
audio: { schema: sdk.messages.defaults.audio.schema.extend(emailProps) },
video: { schema: sdk.messages.defaults.video.schema.extend(emailProps) },
file: { schema: sdk.messages.defaults.file.schema.extend(emailProps) },
location: { schema: sdk.messages.defaults.location.schema.extend(emailProps) },
carousel: { schema: sdk.messages.defaults.carousel.schema.extend(emailProps) },
card: { schema: sdk.messages.defaults.card.schema.extend(emailProps) },
dropdown: { schema: sdk.messages.defaults.dropdown.schema.extend(emailProps) },
choice: { schema: sdk.messages.defaults.choice.schema.extend(emailProps) },
bloc: { schema: sdk.messages.defaults.bloc.schema.extend(emailProps) },
},
},
},
entities: {
conversation: {
title: 'Conversation',
description: 'A postmark replyThread',
schema: sdk.z.object({
conversationInformation: sdk.z
.object({
rootEmailId: sdk.z
.string()
.optional()
.describe('The ID of the root email in the thread')
.title('Root Email ID'),
lastEmailId: sdk.z
.string()
.optional()
.describe('The ID of the last email in the thread')
.title('Last Email ID'),
})
.describe('Information about the conversation thread, used to group emails into threads')
.title('Conversation Information'),
}),
},
user: {
title: 'User',
description: 'A user in the Postmark channel',
schema: sdk.z.object({}),
},
},
attributes: {
category: 'Communication & Channels',
repo: 'botpress',
},
})
.extend(proactiveConversation, ({ entities }) => ({
entities: { conversation: entities.conversation },
actions: {
getOrCreateConversation: {
name: 'getOrCreateReplyThreadConversation',
title: 'Get or Create Reply Thread Conversation',
description: 'Get or create a conversation for a reply thread',
},
},
}))
.extend(proactiveUser, ({ entities }) => ({
entities: { user: entities.user },
actions: {
getOrCreateUser: {
name: 'getOrCreateUser',
title: 'Get or Create User',
description: 'Get or create a user in the Postmark channel',
},
},
}))