Files
botpress--botpress/bots/bugbuster/bot.definition.ts
T
2026-07-13 13:34:48 +08:00

150 lines
4.3 KiB
TypeScript

import * as sdk from '@botpress/sdk'
import * as genenv from './.genenv'
import github from './bp_modules/github'
import linear from './bp_modules/linear'
import slack from './bp_modules/slack'
import telegram from './bp_modules/telegram'
// TODO: use default options
const toJSONSchemaOptions: Partial<sdk.z.transforms.JSONSchemaGenerationOptions> = {
discriminatedUnionStrategy: 'anyOf',
discriminator: false,
}
export default new sdk.BotDefinition({
states: {
watchedTeams: {
type: 'bot',
schema: sdk.z.object({
teamKeys: sdk.z
.array(sdk.z.string())
.title('Team Keys')
.describe('The keys of the teams for which BugBuster should lint issues'),
}),
},
lastLintedId: {
type: 'workflow',
schema: sdk.z.object({
id: sdk.z.string().optional().title('ID').describe('The ID of the last successfully linted issue'),
}),
},
lintResults: {
type: 'workflow',
schema: sdk.z.object({
issues: sdk.z.array(
sdk.z.discriminatedUnion('result', [
sdk.z.object({
identifier: sdk.z.string().title('Identifier').describe('The issue identifier'),
result: sdk.z.literal('failed').title('Result').describe('The lint result'),
messages: sdk.z.array(sdk.z.string()).title('Messages').describe('The lint error messages'),
}),
sdk.z.object({
identifier: sdk.z.string().title('Identifier').describe('The issue identifier'),
result: sdk.z.enum(['succeeded', 'ignored']).title('Result').describe('The lint result'),
}),
])
),
}),
},
notificationChannels: {
type: 'bot',
schema: sdk.z.object({
channels: sdk.z
.array(
sdk.z.object({
conversationId: sdk.z.string().title('Conversation ID').describe('The conversation ID'),
name: sdk.z.string().title('Name').describe('The channel name'),
teams: sdk.z
.array(sdk.z.string())
.title('Teams')
.describe('The teams for which notifications will be sent to the channel'),
})
)
.title('Channel')
.describe('The Slack channel where notifications will be sent'),
}),
},
},
workflows: {
lintAll: {
input: {
schema: sdk.z.object({
verbose: sdk.z
.boolean()
.optional()
.title('Verbose')
.describe('Post the detailed lint results (per issue) to the Slack channel'),
comment: sdk.z
.boolean()
.optional()
.title('Comment')
.describe('Whether to comment the lint results on the Linear issues themselves (defaults to true)'),
}),
},
output: { schema: sdk.z.object({}) },
},
},
events: {
timeToLintAll: {
schema: sdk.z.object({}),
},
timeToCheckIssuesState: {
schema: sdk.z.object({}),
},
},
recurringEvents: {
timeToLintAll: {
payload: sdk.z.object({}),
type: 'timeToLintAll',
schedule: {
cron: '0 13 * * 1', // runs every week on Monday at 8AM EST
},
},
timeToCheckIssuesState: {
payload: sdk.z.object({}),
type: 'timeToCheckIssuesState',
schedule: {
cron: '0 * * * *', // runs every hour on the hour
},
},
},
__advanced: {
toJSONSchemaOptions,
},
})
.addIntegration(github, {
enabled: true,
configurationType: 'manualPAT',
configuration: {
personalAccessToken: genenv.BUGBUSTER_GITHUB_TOKEN,
githubWebhookSecret: genenv.BUGBUSTER_GITHUB_WEBHOOK_SECRET,
},
})
.addIntegration(telegram, {
enabled: true,
configurationType: null,
configuration: {
botToken: genenv.BUGBUSTER_TELEGRAM_BOT_TOKEN,
typingIndicatorEmoji: true,
},
})
.addIntegration(linear, {
enabled: true,
configurationType: 'apiKey',
configuration: {
apiKey: genenv.BUGBUSTER_LINEAR_API_KEY,
webhookSigningSecret: genenv.BUGBUSTER_LINEAR_WEBHOOK_SIGNING_SECRET,
},
})
.addIntegration(slack, {
enabled: true,
configurationType: null,
configuration: {
typingIndicatorEmoji: false,
replyBehaviour: {
location: 'channel',
onlyOnBotMention: false,
},
},
})