chore: import upstream snapshot with attribution

This commit is contained in:
wehub-resource-sync
2026-07-13 13:34:48 +08:00
commit 77bb5bf71f
3762 changed files with 353249 additions and 0 deletions
@@ -0,0 +1,91 @@
import { z, type ActionDefinition } from '@botpress/sdk'
import {
bambooHrCompanyInfo,
bambooHrEmployeeBasicInfoResponse,
bambooHrEmployeeCustomInfoResponse,
bambooHrFields,
} from './bamboohr-schemas'
import { employeeId, employeeIdObject } from './common'
const getEmployeeBasicInfo: ActionDefinition = {
title: 'Get Basic Info',
description: 'Retrieve basic information about an employee by their ID.',
input: {
schema: employeeIdObject,
},
output: {
schema: bambooHrEmployeeBasicInfoResponse,
},
}
const getEmployeeCustomInfo: ActionDefinition = {
title: 'Get Custom Info',
description: 'Retrieve custom information about an employee by their ID and specified fields.',
input: {
schema: z.object({
id: employeeId,
fields: z
.array(z.string().min(1))
.min(1)
.title('Custom Fields')
.describe('List of custom field names to retrieve for the employee.'),
}),
},
output: {
schema: bambooHrEmployeeCustomInfoResponse,
},
}
const listEmployees: ActionDefinition = {
title: 'List Employees',
description:
'Retrieve a list of all employees with IDs and names. Warning: this endpoint may not be enabled in your workspace.',
input: {
schema: z.object({}),
},
output: {
schema: z.object({
employees: z
.array(
z.object({
id: employeeId,
displayName: z.string().title('Display Name').describe("Employee's display name."),
})
)
.title('Employees')
.describe('List of employees in the directory. Includes only ID and display name.'),
}),
},
}
const getCompanyInfo: ActionDefinition = {
title: 'Get Company Info',
description: 'Retrieve information about the company.',
input: {
schema: z.object({}),
},
output: {
schema: bambooHrCompanyInfo,
},
}
const getFields: ActionDefinition = {
title: 'Get Employee Fields',
description: 'Retrieve the list of available employee fields.',
input: {
schema: z.object({}),
},
output: {
schema: z.object({
fields: bambooHrFields,
}),
},
}
export const actions = {
getEmployeeBasicInfo,
getEmployeeCustomInfo,
listEmployees,
getCompanyInfo,
getFields,
} as const
@@ -0,0 +1,227 @@
import { z } from '@botpress/sdk'
import mapValues from 'lodash/mapValues'
import { employeeId, timestamp } from './common'
export const bambooHrOauthTokenResponse = z.object({
access_token: z.string().title('Access Token').describe('The temporary access token issued by BambooHR.'),
refresh_token: z.string().title('Refresh Token').describe('The refresh token issued by BambooHR.'),
expires_in: z.number().title('Expires In').describe('The number of seconds until the access token expires.'),
token_type: z.literal('Bearer').title('Token Type').describe('The type of token issued.'),
scope: z.string().title('Scopes').describe('The scopes granted to the access token (space-separated).'),
id_token: z.string().title('ID Token').describe('A unique identifier for the user.'),
companyDomain: z.string().title('Company Domain').describe('The company subdomain on BambooHR.'),
})
export const bambooHrWebhookCreateResponse = z.object({
id: z.string().title('Webhook ID').describe('The unique identifier for the created webhook.'),
privateKey: z.string().title('Private Key').describe('The private key to validate incoming webhooks.'),
})
/** Fields that can be monitored for updates as a webhook event */
export const bambooHrEmployeeWebhookFields = z
.object({
customBenefitIDNumber: z
.string()
.nullable()
.optional()
.title('Custom Benefit ID Number')
.describe('Custom benefit ID number.'),
customCitizenshipCertificate: z
.string()
.nullable()
.optional()
.title('Custom Citizenship Certificate')
.describe('Custom citizenship certificate.'),
payChangeReason: z.string().nullable().optional().title('Pay Change Reason').describe('Pay change reason.'),
payRateEffectiveDate: z
.string()
.nullable()
.optional()
.title('Pay Rate Effective Date')
.describe('Pay rate effective date.'),
department: z.string().nullable().optional().title('Department').describe('Department.'),
division: z.string().nullable().optional().title('Division').describe('Division.'),
employeeNumber: z.string().nullable().optional().title('Employee Number').describe('Employee number.'),
employeeTaxType: z.string().nullable().optional().title('Employee Tax Type').describe('Employee tax type.'),
employmentHistoryStatus: z
.string()
.nullable()
.optional()
.title('Employment History Status')
.describe('Employment history status.'),
employeeStatusDate: z
.string()
.nullable()
.optional()
.title('Employee Status Date')
.describe('Employee status date.'),
ethnicity: z.string().nullable().optional().title('Ethnicity').describe('Ethnicity.'),
facebook: z.string().nullable().optional().title('Facebook').describe('Facebook.'),
firstName: z.string().nullable().optional().title('First Name').describe('First name.'),
gender: z.string().nullable().optional().title('Gender').describe('Gender.'),
hireDate: z.string().nullable().optional().title('Hire Date').describe('Hire date.'),
homeEmail: z.string().nullable().optional().title('Home Email').describe('Home email.'),
homePhone: z.string().nullable().optional().title('Home Phone').describe('Home phone.'),
jobTitle: z.string().nullable().optional().title('Job Title').describe('Job title.'),
lastName: z.string().nullable().optional().title('Last Name').describe('Last name.'),
linkedIn: z.string().nullable().optional().title('LinkedIn').describe('LinkedIn.'),
location: z.string().nullable().optional().title('Location').describe('Location.'),
maritalStatus: z.string().nullable().optional().title('Marital Status').describe('Marital status.'),
middleName: z.string().nullable().optional().title('Middle Name').describe('Middle name.'),
mobilePhone: z.string().nullable().optional().title('Mobile Phone').describe('Mobile phone.'),
customNIN1: z.string().nullable().optional().title('Custom NIN1').describe('Custom NIN1.'),
nationality: z.string().nullable().optional().title('Nationality').describe('Nationality.'),
originalHireDate: z.string().nullable().optional().title('Original Hire Date').describe('Original hire date.'),
overtimeRate: z.string().nullable().optional().title('Overtime Rate').describe('Overtime rate.'),
exempt: z.string().nullable().optional().title('Exempt').describe('Exempt.'),
payPer: z.string().nullable().optional().title('Pay Per').describe('Pay per.'),
paySchedule: z.string().nullable().optional().title('Pay Schedule').describe('Pay schedule.'),
payRate: z.string().nullable().optional().title('Pay Rate').describe('Pay rate.'),
payType: z.string().nullable().optional().title('Pay Type').describe('Pay type.'),
preferredName: z.string().nullable().optional().title('Preferred Name').describe('Preferred name.'),
customProbationaryPeriodEndDate: z
.string()
.nullable()
.optional()
.title('Custom Probationary Period End Date')
.describe('Custom probationary period end date.'),
customProbationaryPeriodStartDate: z
.string()
.nullable()
.optional()
.title('Custom Probationary Period Start Date')
.describe('Custom probationary period start date.'),
customProjectedTerminationDate: z
.string()
.nullable()
.optional()
.title('Custom Projected Termination Date')
.describe('Custom projected termination date.'),
customROESATCompleted: z
.string()
.nullable()
.optional()
.title('Custom ROESAT Completed')
.describe('Custom ROESAT completed.'),
reportsTo: z.string().nullable().optional().title('Reports To').describe('Reports to.'),
customShirtsize: z.string().nullable().optional().title('Custom Shirt Size').describe('Custom shirt size.'),
status: z.string().nullable().optional().title('Status').describe('Status.'),
teams: z.string().nullable().optional().title('Teams').describe('Teams.'),
customTerminationCode: z
.string()
.nullable()
.optional()
.title('Custom Termination Code')
.describe('Custom termination code.'),
customTerminationNoticeGiven: z
.string()
.nullable()
.optional()
.title('Custom Termination Notice Given')
.describe('Custom termination notice given.'),
twitterFeed: z.string().nullable().optional().title('Twitter Feed').describe('Twitter feed.'),
workEmail: z.string().nullable().optional().title('Work Email').describe('Work email.'),
workPhoneExtension: z
.string()
.nullable()
.optional()
.title('Work Phone Extension')
.describe('Work phone extension.'),
workPhone: z.string().nullable().optional().title('Work Phone').describe('Work phone.'),
})
.passthrough()
const bambooHrEmployeeBaseEvent = z.object({
id: employeeId,
timestamp,
})
export const bambooHrEmployeeCreatedEvent = bambooHrEmployeeBaseEvent.extend({
action: z.literal('Created').title('Action').describe('Creation action.'),
})
export const bambooHrEmployeeDeletedEvent = bambooHrEmployeeBaseEvent.extend({
action: z.literal('Deleted').title('Action').describe('Deletion action.'),
})
export const bambooHrEmployeeUpdatedEvent = bambooHrEmployeeBaseEvent.extend({
action: z.literal('Updated').title('Action').describe('Update action.'),
fields: z
.object(mapValues(bambooHrEmployeeWebhookFields.shape, (schema) => z.object({ value: schema })))
.title('Fields')
.describe(
'All fields subscribed to for the employee, including unchanged fields. Value is nested as `fieldName: { value }`.'
),
changedFields: z
.array(z.string())
.title('Changed Fields')
.describe('List of fields that were changed in this event.'),
})
/**Employee events by BambooHR webhook */
export const bambooHrEmployeeWebhookEvent = z.object({
employees: z
.array(z.union([bambooHrEmployeeCreatedEvent, bambooHrEmployeeDeletedEvent, bambooHrEmployeeUpdatedEvent]))
.title('Employees')
.describe('List of employees included in the event.'),
})
/** All fields that can be queried on an employee as an action */
export const bambooHrEmployeeBasicInfoResponse = bambooHrEmployeeWebhookFields.extend({
id: employeeId,
supervisorEid: z.string().nullable().optional().title('Supervisor ID').describe("Employee's supervisor's ID."),
lastChanged: z.string().title('Last Changed').describe('Full timestamp of the last change to the employee record.'),
displayName: z.string().title('Display Name').describe("Employee's display name."),
})
export const bambooHrEmployeeCustomInfoResponse = z.object({ id: employeeId }).passthrough()
export const bambooHrEmployeeDirectoryResponse = z.object({
fields: z
.array(
z.object({
id: z.string().title('Field ID').describe('Unique identifier for the field.'),
name: z.string().title('Field Name').describe('Name of the field.'),
type: z.string().title('Field Type').describe('Type of the field. See BambooHR API documentation for details.'),
})
)
.title('Fields')
.describe('List of fields included in the directory. Does not include all workspace fields.'),
employees: z
.array(
z.object({
id: employeeId,
displayName: z.string().title('Display Name').describe("Employee's display name."),
})
)
.title('Employees')
.describe('List of employees in the directory. Includes more fields.'),
})
export const bambooHrCompanyInfo = z.object({
legalName: z.string().title('Legal Name').describe('Legal name of the company.'),
displayName: z.string().title('Display Name').describe('Display name of the company.'),
address: z
.object({
line1: z.string().nullable().optional().title('Address Line 1').describe('First line of the street.'),
line2: z.string().nullable().optional().title('Address Line 2').describe('Second line of the street.'),
city: z.string().nullable().optional().title('City').describe('City.'),
state: z.string().nullable().optional().title('State').describe('State or province.'),
country: z.string().nullable().optional().title('Country').describe('Country.'),
zip: z.string().nullable().optional().title('ZIP Code').describe('ZIP code.'),
})
.title('Address')
.describe('Address of the company.'),
phone: z.string().nullable().optional().title('Phone Number').describe('Phone number of the company.'),
})
export const bambooHrFields = z
.array(
z
.object({
id: z.union([z.string(), z.number()]).title('ID').describe('Unique identifier for the field.'),
name: z.string().title('Name').describe('Name of the field.'),
type: z.string().title('Type').describe('Data type of the field.'),
alias: z.string().optional().title('Alias').describe('Alias used for the field in API requests.'),
})
.passthrough()
)
.title('Fields')
.describe('List of available employee fields.')
@@ -0,0 +1,13 @@
import { z } from '@botpress/sdk'
/** User-friendly pastable url, to be extracted to subdomain for use in handler */
export const subdomain = z
.string()
.min(1)
.title('BambooHR Subdomain')
.describe("Your company's BambooHR subdomain (https://[subdomain].bamboohr.com)")
export const employeeId = z.string().min(1).title('Employee ID').describe('Unique identifier for the employee.')
export const employeeIdObject = z.object({ id: employeeId })
export const timestamp = z.string().title('Timestamp').describe('Timestamp in ISO 8601 format.')
@@ -0,0 +1,41 @@
import { z, type EventDefinition } from '@botpress/sdk'
import { bambooHrEmployeeWebhookFields } from './bamboohr-schemas'
import { employeeId, timestamp } from './common'
const sharedEventFields = z.object({
id: employeeId,
timestamp,
})
const employeeCreated: EventDefinition = {
title: 'Employee Created',
description: 'Triggers when a new employee is created in BambooHR.',
schema: sharedEventFields,
}
const employeeDeleted: EventDefinition = {
title: 'Employee Deleted',
description:
'Triggers when an employee is deleted from BambooHR. Terminating employees will trigger the "Employee Updated" event instead.',
schema: sharedEventFields,
}
const employeeUpdated: EventDefinition = {
title: 'Employee Updated',
description: 'Triggers when an existing employee is updated in BambooHR.',
schema: sharedEventFields.extend({
fields: bambooHrEmployeeWebhookFields
.title('Fields')
.describe('All fields subscribed to for the employee, including unchanged fields.'),
changedFields: z
.array(z.string())
.title('Changed Fields')
.describe('List of fields that were changed in this event.'),
}),
}
export const events = {
employeeCreated,
employeeDeleted,
employeeUpdated,
} as const
@@ -0,0 +1,4 @@
export * from './bamboohr-schemas'
export * from './common'
export { actions } from './actions'
export { events } from './events'