From e820f0be739d79ad32489cf7cedc366211f0ad7b Mon Sep 17 00:00:00 2001 From: Eric Huang Date: Thu, 22 Jan 2026 15:56:26 -0500 Subject: [PATCH 01/13] fix(zoho-sales-iq-hitl): migrate to HITL plugin and upgrade dependencies - Migrate from deprecated HITL agent to HITL plugin architecture - Upgrade @botpress/sdk to 5.2.0 and @botpress/client to 1.28.0 - Update hitl interface to 2.0.0 - Add comprehensive error handling for failed conversation creation - Add debug response logging for API calls - Improve input validation for startHitl action - Refactor entity definitions to use ticket schema for hitlSession --- .../definition/actions/createUser/index.ts | 14 - .../definition/actions/createUser/input.ts | 12 - .../definition/actions/createUser/output.ts | 10 - .../hitl/definition/actions/index.ts | 15 - .../definition/actions/startHitl/index.ts | 14 - .../definition/actions/startHitl/input.ts | 286 - .../definition/actions/startHitl/output.ts | 10 - .../hitl/definition/actions/stopHitl/index.ts | 14 - .../hitl/definition/actions/stopHitl/input.ts | 11 - .../definition/actions/stopHitl/output.ts | 8 - .../hitl/definition/channels/hitl/index.ts | 10 - .../channels/hitl/messages/index.ts | 9 - .../definition/channels/hitl/messages/text.ts | 14 - .../hitl/definition/channels/index.ts | 9 - .../hitl/definition/entities/index.ts | 6 - .../hitl/definition/events/hitlAssigned.ts | 11 - .../hitl/definition/events/hitlStopped.ts | 10 - .../hitl/definition/events/index.ts | 12 - .../bp_modules/hitl/definition/index.ts | 23 - .../bp_modules/hitl/index.ts | 16 - .../integration.definition.ts | 19 +- .../zoho-sales-iq-hitl/package-lock.json | 5331 +++++++++++++++++ integrations/zoho-sales-iq-hitl/package.json | 8 +- .../zoho-sales-iq-hitl/src/actions/hitl.ts | 15 +- integrations/zoho-sales-iq-hitl/src/client.ts | 11 +- integrations/zoho-sales-iq-hitl/src/debug.ts | 19 + 26 files changed, 5388 insertions(+), 529 deletions(-) delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/input.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/output.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/input.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/output.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/input.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/output.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/text.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlAssigned.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlStopped.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/index.ts create mode 100644 integrations/zoho-sales-iq-hitl/package-lock.json create mode 100644 integrations/zoho-sales-iq-hitl/src/debug.ts diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/index.ts deleted file mode 100644 index 1ae78034..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. -import * as input from "./input"; -export * as input from "./input"; -import * as output from "./output"; -export * as output from "./output"; - -export const createUser = { - "input": input.input, - "output": output.output, - "billable": false, - "cacheable": false, -} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/input.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/input.ts deleted file mode 100644 index 5d471073..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/input.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const input = { - schema: z.object({ - name: z.optional(z.string()), - pictureUrl: z.optional(z.string()), - email: z.optional(z.string()), - }), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/output.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/output.ts deleted file mode 100644 index 60c67fd6..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/output.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const output = { - schema: z.object({ - userId: z.string(), - }), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/index.ts deleted file mode 100644 index ac93a788..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. -import * as createUser from "./createUser/index"; -export * as createUser from "./createUser/index"; -import * as startHitl from "./startHitl/index"; -export * as startHitl from "./startHitl/index"; -import * as stopHitl from "./stopHitl/index"; -export * as stopHitl from "./stopHitl/index"; - -export const actions = { - "createUser": createUser.createUser, - "startHitl": startHitl.startHitl, - "stopHitl": stopHitl.stopHitl, -} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/index.ts deleted file mode 100644 index e4366764..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. -import * as input from "./input"; -export * as input from "./input"; -import * as output from "./output"; -export * as output from "./output"; - -export const startHitl = { - "input": input.input, - "output": output.output, - "billable": false, - "cacheable": false, -} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/input.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/input.ts deleted file mode 100644 index e91821f8..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/input.ts +++ /dev/null @@ -1,286 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const input = { - schema: z.object({ - userId: z.string(), - title: z.string(), - description: z.optional(z.string()), - messageHistory: - /** Message history to display in the HITL session */ z.optional( - z.array( - z.union([ - z.object({ - source: z.union([ - z.object({ - type: z.literal("user"), - userId: z.string(), - }), - z.object({ - type: z.literal("bot"), - }), - ]), - type: z.literal("text"), - payload: z.object({ - text: z.string(), - }), - }), - z.object({ - source: z.union([ - z.object({ - type: z.literal("user"), - userId: z.string(), - }), - z.object({ - type: z.literal("bot"), - }), - ]), - type: z.literal("image"), - payload: z.object({ - imageUrl: z.string(), - }), - }), - z.object({ - source: z.union([ - z.object({ - type: z.literal("user"), - userId: z.string(), - }), - z.object({ - type: z.literal("bot"), - }), - ]), - type: z.literal("audio"), - payload: z.object({ - audioUrl: z.string(), - }), - }), - z.object({ - source: z.union([ - z.object({ - type: z.literal("user"), - userId: z.string(), - }), - z.object({ - type: z.literal("bot"), - }), - ]), - type: z.literal("video"), - payload: z.object({ - videoUrl: z.string(), - }), - }), - z.object({ - source: z.union([ - z.object({ - type: z.literal("user"), - userId: z.string(), - }), - z.object({ - type: z.literal("bot"), - }), - ]), - type: z.literal("file"), - payload: z.object({ - fileUrl: z.string(), - title: z.optional(z.string()), - }), - }), - z.object({ - source: z.union([ - z.object({ - type: z.literal("user"), - userId: z.string(), - }), - z.object({ - type: z.literal("bot"), - }), - ]), - type: z.literal("location"), - payload: z.object({ - latitude: z.number(), - longitude: z.number(), - address: z.optional(z.string()), - title: z.optional(z.string()), - }), - }), - z.object({ - source: z.union([ - z.object({ - type: z.literal("user"), - userId: z.string(), - }), - z.object({ - type: z.literal("bot"), - }), - ]), - type: z.literal("carousel"), - payload: z.object({ - items: z.array( - z.object({ - title: z.string(), - subtitle: z.optional(z.string()), - imageUrl: z.optional(z.string()), - actions: z.array( - z.object({ - action: z.enum(["postback", "url", "say"]), - label: z.string(), - value: z.string(), - }), - ), - }), - ), - }), - }), - z.object({ - source: z.union([ - z.object({ - type: z.literal("user"), - userId: z.string(), - }), - z.object({ - type: z.literal("bot"), - }), - ]), - type: z.literal("card"), - payload: z.object({ - title: z.string(), - subtitle: z.optional(z.string()), - imageUrl: z.optional(z.string()), - actions: z.array( - z.object({ - action: z.enum(["postback", "url", "say"]), - label: z.string(), - value: z.string(), - }), - ), - }), - }), - z.object({ - source: z.union([ - z.object({ - type: z.literal("user"), - userId: z.string(), - }), - z.object({ - type: z.literal("bot"), - }), - ]), - type: z.literal("dropdown"), - payload: z.object({ - text: z.string(), - options: z.array( - z.object({ - label: z.string(), - value: z.string(), - }), - ), - }), - }), - z.object({ - source: z.union([ - z.object({ - type: z.literal("user"), - userId: z.string(), - }), - z.object({ - type: z.literal("bot"), - }), - ]), - type: z.literal("choice"), - payload: z.object({ - text: z.string(), - options: z.array( - z.object({ - label: z.string(), - value: z.string(), - }), - ), - }), - }), - z.object({ - source: z.union([ - z.object({ - type: z.literal("user"), - userId: z.string(), - }), - z.object({ - type: z.literal("bot"), - }), - ]), - type: z.literal("bloc"), - payload: z.object({ - items: z.array( - z.union([ - z.object({ - type: z.literal("text"), - payload: z.object({ - text: z.string(), - }), - }), - z.object({ - type: z.literal("markdown"), - payload: z.object({ - markdown: z.string(), - }), - }), - z.object({ - type: z.literal("image"), - payload: z.object({ - imageUrl: z.string(), - }), - }), - z.object({ - type: z.literal("audio"), - payload: z.object({ - audioUrl: z.string(), - }), - }), - z.object({ - type: z.literal("video"), - payload: z.object({ - videoUrl: z.string(), - }), - }), - z.object({ - type: z.literal("file"), - payload: z.object({ - fileUrl: z.string(), - title: z.optional(z.string()), - }), - }), - z.object({ - type: z.literal("location"), - payload: z.object({ - latitude: z.number(), - longitude: z.number(), - address: z.optional(z.string()), - title: z.optional(z.string()), - }), - }), - ]), - ), - }), - }), - z.object({ - source: z.union([ - z.object({ - type: z.literal("user"), - userId: z.string(), - }), - z.object({ - type: z.literal("bot"), - }), - ]), - type: z.literal("markdown"), - payload: z.object({ - markdown: z.string(), - }), - }), - ]), - ), - ), - }), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/output.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/output.ts deleted file mode 100644 index 7e994bfb..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/output.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const output = { - schema: z.object({ - conversationId: z.string(), - }), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/index.ts deleted file mode 100644 index d501c3aa..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. -import * as input from "./input"; -export * as input from "./input"; -import * as output from "./output"; -export * as output from "./output"; - -export const stopHitl = { - "input": input.input, - "output": output.output, - "billable": false, - "cacheable": false, -} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/input.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/input.ts deleted file mode 100644 index e35c1c42..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/input.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const input = { - schema: z.object({ - conversationId: z.string(), - reason: z.optional(z.enum(["timeout", "cancel"])), - }), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/output.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/output.ts deleted file mode 100644 index f4275d5c..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/output.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const output = { - schema: z.object({}), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/index.ts deleted file mode 100644 index d469cae8..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { messages } from './messages/index' -export * from './messages/index' - -export const hitl = { - messages: messages, -} \ No newline at end of file diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/index.ts deleted file mode 100644 index 89cd8af6..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. -import * as text from "./text"; -export * as text from "./text"; - -export const messages = { - "text": text.text, -} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/text.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/text.ts deleted file mode 100644 index af68fcec..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/text.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const text = { - schema: z.object({ - text: z.string(), - userId: - /** Allows sending a message pretending to be a certain user */ z.optional( - /** Allows sending a message pretending to be a certain user */ z.string(), - ), - }), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/index.ts deleted file mode 100644 index 1f1b9785..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. -import * as hitl from "./hitl/index"; -export * as hitl from "./hitl/index"; - -export const channels = { - "hitl": hitl.hitl, -} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/index.ts deleted file mode 100644 index 400f75d1..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -export const entities = { -} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlAssigned.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlAssigned.ts deleted file mode 100644 index 4eddda42..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlAssigned.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const hitlAssigned = { - schema: z.object({ - conversationId: z.string(), - userId: z.string(), - }), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlStopped.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlStopped.ts deleted file mode 100644 index 27012fce..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlStopped.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const hitlStopped = { - schema: z.object({ - conversationId: z.string(), - }), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/index.ts deleted file mode 100644 index c46ec10c..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. -import * as hitlAssigned from "./hitlAssigned"; -export * as hitlAssigned from "./hitlAssigned"; -import * as hitlStopped from "./hitlStopped"; -export * as hitlStopped from "./hitlStopped"; - -export const events = { - "hitlAssigned": hitlAssigned.hitlAssigned, - "hitlStopped": hitlStopped.hitlStopped, -} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/index.ts deleted file mode 100644 index 9ec9d6a7..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import * as sdk from "@botpress/sdk" - -import * as actions from "./actions/index" -import * as channels from "./channels/index" -import * as events from "./events/index" -import * as entities from "./entities/index" -export * as actions from "./actions/index" -export * as channels from "./channels/index" -export * as events from "./events/index" -export * as entities from "./entities/index" - -export default { - name: "hitl", - version: "0.4.0", - actions: actions.actions, - channels: channels.channels, - events: events.events, - entities: entities.entities, -} satisfies sdk.InterfacePackage["definition"] \ No newline at end of file diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/index.ts deleted file mode 100644 index 56ccbe18..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import * as sdk from "@botpress/sdk" - -import definition from "./definition" - -export default { - type: "interface", - id: "a6c8d5c8-b02f-4894-b3a8-2cedad35e53e", - uri: undefined, - name: "hitl", - version: "0.4.0", - definition, -} satisfies sdk.InterfacePackage \ No newline at end of file diff --git a/integrations/zoho-sales-iq-hitl/integration.definition.ts b/integrations/zoho-sales-iq-hitl/integration.definition.ts index 55848cd9..6ef665ff 100644 --- a/integrations/zoho-sales-iq-hitl/integration.definition.ts +++ b/integrations/zoho-sales-iq-hitl/integration.definition.ts @@ -1,10 +1,10 @@ -import { IntegrationDefinition } from '@botpress/sdk' +import { IntegrationDefinition, z } from '@botpress/sdk' import hitl from './bp_modules/hitl' import { events, configuration, channels, states, user } from './src/definitions' export default new IntegrationDefinition({ - name: 'plus/zoho-sales-iq-hitl', - title: 'Zoho Sales IQ HITL', - version: '2.0.2', + name: 'erichuang/zoho-sales-iq-hitl', + title: 'Zoho Sales IQ HITL (DEV)', + version: '0.1.3', icon: 'icon.svg', description: 'This integration allows your bot to use Zoho Sales IQ as a HITL Provider', readme: 'hub.md', @@ -13,8 +13,15 @@ export default new IntegrationDefinition({ channels, events, user, -}).extend(hitl, () => ({ - entities: {}, + entities: { + ticket: { + schema: z.object({}), + }, + }, +}).extend(hitl, (self) => ({ + entities: { + hitlSession: self.entities.ticket, + }, channels: { hitl: { title: 'Zoho Sales IQ', diff --git a/integrations/zoho-sales-iq-hitl/package-lock.json b/integrations/zoho-sales-iq-hitl/package-lock.json new file mode 100644 index 00000000..7051afb2 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/package-lock.json @@ -0,0 +1,5331 @@ +{ + "name": "@bp-templates/empty-integration", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@bp-templates/empty-integration", + "dependencies": { + "@botpress/client": "1.28.0", + "@botpress/sdk": "5.2.0", + "axios": "^1.8.1", + "form-data": "^4.0.0", + "zod": "^3.24.2" + }, + "devDependencies": { + "@botpress/cli": "^5.2.0", + "@types/node": "^18.19.76", + "ts-node": "^10.9.2", + "typescript": "^5.8.2" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.9.3", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz", + "integrity": "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@botpress/chat": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@botpress/chat/-/chat-0.5.4.tgz", + "integrity": "sha512-VS8CiX/NyyfFWa6bS8EbsbZxrrXKjHG12mx6Mm6i1XhJCaMo7r5tC6Nw6GNGkBJ0zMmrzcGuEFtLNIo3hefFbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "1.2.5", + "browser-or-node": "^2.1.1", + "event-source-polyfill": "^1.0.31", + "eventsource": "^2.0.2", + "jsonwebtoken": "^9.0.2", + "qs": "^6.11.0", + "verror": "^1.10.1", + "zod": "^3.21.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@botpress/chat/node_modules/axios": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.5.tgz", + "integrity": "sha512-9pU/8mmjSSOb4CXVsvGIevN+MlO/t9OWtKadTaLuN85Gge3HGorUckgp8A/2FH4V4hJ7JuQ3LIeI7KAV9ITZrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@botpress/cli": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@botpress/cli/-/cli-5.4.1.tgz", + "integrity": "sha512-3rsQuYKDfOW/w4lE3Tha37z3es0X+l/3w6bKtGxv5DkTXZFSzKteP1lnFETbTsPJhELO+b2iU7GFc8u8hQJSWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^11.7.0", + "@botpress/chat": "0.5.4", + "@botpress/client": "1.29.0", + "@botpress/sdk": "5.3.0", + "@bpinternal/const": "^0.1.0", + "@bpinternal/tunnel": "^0.1.1", + "@bpinternal/verel": "^0.2.0", + "@bpinternal/yargs-extra": "^0.0.3", + "@parcel/watcher": "^2.1.0", + "@stoplight/spectral-core": "^1.19.1", + "@stoplight/spectral-functions": "^1.9.0", + "@stoplight/spectral-parsers": "^1.0.4", + "@types/lodash": "^4.14.191", + "@types/verror": "^1.10.6", + "axios": "^1.4.0", + "bluebird": "^3.7.2", + "boxen": "5.1.2", + "chalk": "^4.1.2", + "dotenv": "^16.4.4", + "esbuild": "^0.25.10", + "handlebars": "^4.7.8", + "jsonpath-plus": "^10.3.0", + "latest-version": "5.1.0", + "lodash": "^4.17.21", + "prettier": "^3.4.2", + "prompts": "^2.4.2", + "semver": "^7.3.8", + "uuid": "^9.0.0", + "verror": "^1.10.1", + "yn": "^4.0.0" + }, + "bin": { + "bp": "bin.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@botpress/cli/node_modules/@botpress/client": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@botpress/client/-/client-1.29.0.tgz", + "integrity": "sha512-gvmSddgYnpqxt697kEqb6/1d/b6m/LwuvmAPgsnzKy1q1PPqukkFjWRSTpvUw6xztAsrORBX0ulNPQ6uhVGEew==", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "^1.6.1", + "axios-retry": "^4.5.0", + "browser-or-node": "^2.1.1", + "qs": "^6.11.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@botpress/cli/node_modules/@botpress/sdk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@botpress/sdk/-/sdk-5.3.0.tgz", + "integrity": "sha512-2ZK5geb+iM+MyF321V2S6VntP36gLlh+xhIb3ndfaJfdnzs89r1WhzNqNsGweez6yCaeU5P65c9lP9rgw/tqwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@botpress/client": "1.29.0", + "browser-or-node": "^2.1.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@bpinternal/zui": "^1.3.2", + "esbuild": "^0.16.12" + }, + "peerDependenciesMeta": { + "esbuild": { + "optional": true + } + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@botpress/cli/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/@botpress/client": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@botpress/client/-/client-1.28.0.tgz", + "integrity": "sha512-gU7j04Efv15qHf9zE1zOcnSBNvM/5+9BhyRZudt9WgJBN4YH0QZpc3GmGy+lOxQU563YKHf166xRrFhkicqiug==", + "license": "MIT", + "dependencies": { + "axios": "^1.6.1", + "axios-retry": "^4.5.0", + "browser-or-node": "^2.1.1", + "qs": "^6.11.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@botpress/sdk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@botpress/sdk/-/sdk-5.2.0.tgz", + "integrity": "sha512-wKGBRdmVheLvgL3rLAMdsdF0CIXtSNZ00O+UHF6Hr5EnAL6N8WmfyJON60RcHUsnWkXuWW5d1oeLCi4I3VpaBw==", + "license": "MIT", + "dependencies": { + "@botpress/client": "1.29.0", + "browser-or-node": "^2.1.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@bpinternal/zui": "^1.3.2", + "esbuild": "^0.16.12" + }, + "peerDependenciesMeta": { + "esbuild": { + "optional": true + } + } + }, + "node_modules/@botpress/sdk/node_modules/@botpress/client": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@botpress/client/-/client-1.29.0.tgz", + "integrity": "sha512-gvmSddgYnpqxt697kEqb6/1d/b6m/LwuvmAPgsnzKy1q1PPqukkFjWRSTpvUw6xztAsrORBX0ulNPQ6uhVGEew==", + "license": "MIT", + "dependencies": { + "axios": "^1.6.1", + "axios-retry": "^4.5.0", + "browser-or-node": "^2.1.1", + "qs": "^6.11.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@bpinternal/const": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@bpinternal/const/-/const-0.1.2.tgz", + "integrity": "sha512-Eb56IQ2IWsygpdq1QymdoTFU8swWN5W4UQ1zY3cVOmuA2qRmYTC4U4RYtByiiXdQcw4OuqbRNZ1Oyx+WjOxX/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0", + "pnpm": "8.6.2" + } + }, + "node_modules/@bpinternal/tunnel": { + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@bpinternal/tunnel/-/tunnel-0.1.25.tgz", + "integrity": "sha512-ICJeZC3QdEMjmGO4KjOfIgsVJDC4LLIQ+qemhOpo9XcI4E7S6vEG3XXSVvkFxijiErUTBXFrkbXMqvEdzP0jFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ws": "^8.5.5", + "browser-or-node": "^2.1.1", + "isomorphic-ws": "^5.0.0", + "ws": "^8.13.0", + "zod": "^3.20.6" + }, + "engines": { + "node": ">=16.0.0", + "pnpm": "8.6.2" + } + }, + "node_modules/@bpinternal/verel": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@bpinternal/verel/-/verel-0.2.0.tgz", + "integrity": "sha512-Qwr/NAdDzAsUqG4/ywir2lCUG/GzCWFCfm2BYtYdA2QiEtUXTnh2jnlrXDFonfA8Qzno3xeQqAHA6CsfPSAxgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-or-node": "^2.1.1" + }, + "engines": { + "node": ">=16.0.0", + "pnpm": "8.6.2" + } + }, + "node_modules/@bpinternal/yargs-extra": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@bpinternal/yargs-extra/-/yargs-extra-0.0.3.tgz", + "integrity": "sha512-e/unlq0LX4CJUv1jGOv1UgwB/h2M0NCXnwD4lEw496GpkQikO668RS+BBlRhkqdGfZmvKDkXZZ96xJCn+i6Ymg==", + "dev": true, + "license": "AGPL-3.0", + "dependencies": { + "@types/yargs": "^17.0.24", + "decamelize": "5.0.1", + "json-schema": "^0.4.0", + "lodash": "^4.17.21", + "yargs": "^17.7.2", + "yn": "^4.0.0" + } + }, + "node_modules/@bpinternal/zui": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@bpinternal/zui/-/zui-1.3.2.tgz", + "integrity": "sha512-lzjvRsuSjglAWbbS4B+o5xyNbrGujhWTOX3iX3hsqLQFvo9gtaM/EETBhlPM4tJJJWi/THhCmDJFoWjSPX+CXg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jsep-plugin/assignment": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", + "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@jsep-plugin/regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", + "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@jsep-plugin/ternary": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@jsep-plugin/ternary/-/ternary-1.1.4.tgz", + "integrity": "sha512-ck5wiqIbqdMX6WRQztBL7ASDty9YLgJ3sSAK5ZpBzXeySvFGCzIvM6UiAI4hTZ22fEcYQVV/zhUbNscggW+Ukg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.4.tgz", + "integrity": "sha512-WYa2tUVV5HiArWPB3ydlOc4R2ivq0IDrlqhMi3l7mVsFEXNcTfxYFPIHXHXIh/ca/y/V5N4E1zecyxdIBjYnkQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.4", + "@parcel/watcher-darwin-arm64": "2.5.4", + "@parcel/watcher-darwin-x64": "2.5.4", + "@parcel/watcher-freebsd-x64": "2.5.4", + "@parcel/watcher-linux-arm-glibc": "2.5.4", + "@parcel/watcher-linux-arm-musl": "2.5.4", + "@parcel/watcher-linux-arm64-glibc": "2.5.4", + "@parcel/watcher-linux-arm64-musl": "2.5.4", + "@parcel/watcher-linux-x64-glibc": "2.5.4", + "@parcel/watcher-linux-x64-musl": "2.5.4", + "@parcel/watcher-win32-arm64": "2.5.4", + "@parcel/watcher-win32-ia32": "2.5.4", + "@parcel/watcher-win32-x64": "2.5.4" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.4.tgz", + "integrity": "sha512-hoh0vx4v+b3BNI7Cjoy2/B0ARqcwVNrzN/n7DLq9ZB4I3lrsvhrkCViJyfTj/Qi5xM9YFiH4AmHGK6pgH1ss7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.4.tgz", + "integrity": "sha512-kphKy377pZiWpAOyTgQYPE5/XEKVMaj6VUjKT5VkNyUJlr2qZAn8gIc7CPzx+kbhvqHDT9d7EqdOqRXT6vk0zw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.4.tgz", + "integrity": "sha512-UKaQFhCtNJW1A9YyVz3Ju7ydf6QgrpNQfRZ35wNKUhTQ3dxJ/3MULXN5JN/0Z80V/KUBDGa3RZaKq1EQT2a2gg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.4.tgz", + "integrity": "sha512-Dib0Wv3Ow/m2/ttvLdeI2DBXloO7t3Z0oCp4bAb2aqyqOjKPPGrg10pMJJAQ7tt8P4V2rwYwywkDhUia/FgS+Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.4.tgz", + "integrity": "sha512-I5Vb769pdf7Q7Sf4KNy8Pogl/URRCKu9ImMmnVKYayhynuyGYMzuI4UOWnegQNa2sGpsPSbzDsqbHNMyeyPCgw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.4.tgz", + "integrity": "sha512-kGO8RPvVrcAotV4QcWh8kZuHr9bXi9a3bSZw7kFarYR0+fGliU7hd/zevhjw8fnvIKG3J9EO5G6sXNGCSNMYPQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.4.tgz", + "integrity": "sha512-KU75aooXhqGFY2W5/p8DYYHt4hrjHZod8AhcGAmhzPn/etTa+lYCDB2b1sJy3sWJ8ahFVTdy+EbqSBvMx3iFlw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.4.tgz", + "integrity": "sha512-Qx8uNiIekVutnzbVdrgSanM+cbpDD3boB1f8vMtnuG5Zau4/bdDbXyKwIn0ToqFhIuob73bcxV9NwRm04/hzHQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.4.tgz", + "integrity": "sha512-UYBQvhYmgAv61LNUn24qGQdjtycFBKSK3EXr72DbJqX9aaLbtCOO8+1SkKhD/GNiJ97ExgcHBrukcYhVjrnogA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.4.tgz", + "integrity": "sha512-YoRWCVgxv8akZrMhdyVi6/TyoeeMkQ0PGGOf2E4omODrvd1wxniXP+DBynKoHryStks7l+fDAMUBRzqNHrVOpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.4.tgz", + "integrity": "sha512-iby+D/YNXWkiQNYcIhg8P5hSjzXEHaQrk2SLrWOUD7VeC4Ohu0WQvmV+HDJokZVJ2UjJ4AGXW3bx7Lls9Ln4TQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.4.tgz", + "integrity": "sha512-vQN+KIReG0a2ZDpVv8cgddlf67J8hk1WfZMMP7sMeZmJRSmEax5xNDNWKdgqSe2brOKTQQAs3aCCUal2qBHAyg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.4.tgz", + "integrity": "sha512-3A6efb6BOKwyw7yk9ro2vus2YTt2nvcd56AuzxdMiVOxL9umDyN5PKkKfZ/gZ9row41SjVmTVQNWQhaRRGpOKw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@stoplight/better-ajv-errors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz", + "integrity": "sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": "^12.20 || >= 14.13" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/@stoplight/json": { + "version": "3.21.7", + "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.21.7.tgz", + "integrity": "sha512-xcJXgKFqv/uCEgtGlPxy3tPA+4I+ZI4vAuMJ885+ThkTHFVkC+0Fm58lA9NlsyjnkpxFh4YiQWpH+KefHdbA0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/ordered-object-literal": "^1.0.3", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^13.6.0", + "jsonc-parser": "~2.2.1", + "lodash": "^4.17.21", + "safe-stable-stringify": "^1.1" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/@stoplight/json-ref-readers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@stoplight/json-ref-readers/-/json-ref-readers-1.2.2.tgz", + "integrity": "sha512-nty0tHUq2f1IKuFYsLM4CXLZGHdMn+X/IwEUIpeSOXt0QjMUbL0Em57iJUDzz+2MkWG83smIigNZ3fauGjqgdQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-fetch": "^2.6.0", + "tslib": "^1.14.1" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/@stoplight/json-ref-readers/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@stoplight/json-ref-resolver": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.6.tgz", + "integrity": "sha512-YNcWv3R3n3U6iQYBsFOiWSuRGE5su1tJSiX6pAPRVk7dP0L7lqCteXGzuVRQ0gMZqUl8v1P0+fAKxF6PLo9B5A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/json": "^3.21.0", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^12.3.0 || ^13.0.0", + "@types/urijs": "^1.19.19", + "dependency-graph": "~0.11.0", + "fast-memoize": "^2.5.2", + "immer": "^9.0.6", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "urijs": "^1.19.11" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/@stoplight/ordered-object-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.5.tgz", + "integrity": "sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/@stoplight/path": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@stoplight/path/-/path-1.3.2.tgz", + "integrity": "sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/@stoplight/spectral-core": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.20.0.tgz", + "integrity": "sha512-5hBP81nCC1zn1hJXL/uxPNRKNcB+/pEIHgCjPRpl/w/qy9yC9ver04tw1W0l/PMiv0UeB5dYgozXVQ4j5a6QQQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "~3.21.0", + "@stoplight/path": "1.3.2", + "@stoplight/spectral-parsers": "^1.0.0", + "@stoplight/spectral-ref-resolver": "^1.0.4", + "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/types": "~13.6.0", + "@types/es-aggregate-error": "^1.0.2", + "@types/json-schema": "^7.0.11", + "ajv": "^8.17.1", + "ajv-errors": "~3.0.0", + "ajv-formats": "~2.1.1", + "es-aggregate-error": "^1.0.7", + "jsonpath-plus": "^10.3.0", + "lodash": "~4.17.21", + "lodash.topath": "^4.5.2", + "minimatch": "3.1.2", + "nimma": "0.2.3", + "pony-cause": "^1.1.1", + "simple-eval": "1.0.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-formats": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-formats/-/spectral-formats-1.8.2.tgz", + "integrity": "sha512-c06HB+rOKfe7tuxg0IdKDEA5XnjL2vrn/m/OVIIxtINtBzphZrOgtRn7epQ5bQF5SWp84Ue7UJWaGgDwVngMFw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/json": "^3.17.0", + "@stoplight/spectral-core": "^1.19.2", + "@types/json-schema": "^7.0.7", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-functions": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-functions/-/spectral-functions-1.10.1.tgz", + "integrity": "sha512-obu8ZfoHxELOapfGsCJixKZXZcffjg+lSoNuttpmUFuDzVLT3VmH8QkPXfOGOL5Pz80BR35ClNAToDkdnYIURg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "^3.17.1", + "@stoplight/spectral-core": "^1.19.4", + "@stoplight/spectral-formats": "^1.8.1", + "@stoplight/spectral-runtime": "^1.1.2", + "ajv": "^8.17.1", + "ajv-draft-04": "~1.0.0", + "ajv-errors": "~3.0.0", + "ajv-formats": "~2.1.1", + "lodash": "~4.17.21", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-parsers": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-parsers/-/spectral-parsers-1.0.5.tgz", + "integrity": "sha512-ANDTp2IHWGvsQDAY85/jQi9ZrF4mRrA5bciNHX+PUxPr4DwS6iv4h+FVWJMVwcEYdpyoIdyL+SRmHdJfQEPmwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/json": "~3.21.0", + "@stoplight/types": "^14.1.1", + "@stoplight/yaml": "~4.3.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-parsers/node_modules/@stoplight/types": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-14.1.1.tgz", + "integrity": "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + } + }, + "node_modules/@stoplight/spectral-ref-resolver": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ref-resolver/-/spectral-ref-resolver-1.0.5.tgz", + "integrity": "sha512-gj3TieX5a9zMW29z3mBlAtDOCgN3GEc1VgZnCVlr5irmR4Qi5LuECuFItAq4pTn5Zu+sW5bqutsCH7D4PkpyAA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/json-ref-readers": "1.2.2", + "@stoplight/json-ref-resolver": "~3.1.6", + "@stoplight/spectral-runtime": "^1.1.2", + "dependency-graph": "0.11.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-runtime/-/spectral-runtime-1.1.4.tgz", + "integrity": "sha512-YHbhX3dqW0do6DhiPSgSGQzr6yQLlWybhKwWx0cqxjMwxej3TqLv3BXMfIUYFKKUqIwH4Q2mV8rrMM8qD2N0rQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/json": "^3.20.1", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^13.6.0", + "abort-controller": "^3.0.0", + "lodash": "^4.17.21", + "node-fetch": "^2.7.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/types": { + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.6.0.tgz", + "integrity": "sha512-dzyuzvUjv3m1wmhPfq82lCVYGcXG0xUYgqnWfCq3PCVR4BKFhjdkHrnJ+jIDoMKvXb05AZP/ObQF6+NpDo29IQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + } + }, + "node_modules/@stoplight/yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.3.0.tgz", + "integrity": "sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/ordered-object-literal": "^1.0.5", + "@stoplight/types": "^14.1.1", + "@stoplight/yaml-ast-parser": "0.0.50", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=10.8" + } + }, + "node_modules/@stoplight/yaml-ast-parser": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.50.tgz", + "integrity": "sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@stoplight/yaml/node_modules/@stoplight/types": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-14.1.1.tgz", + "integrity": "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/es-aggregate-error": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/es-aggregate-error/-/es-aggregate-error-1.0.6.tgz", + "integrity": "sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/urijs": { + "version": "1.19.26", + "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.26.tgz", + "integrity": "sha512-wkXrVzX5yoqLnndOwFsieJA7oKM8cNkOKJtf/3vVGSUFkWDKZvFHpIl9Pvqb/T9UsawBBFMTTD8xu7sK5MWuvg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/verror": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", + "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", + "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.0.1" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "dev": true, + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "peer": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios-retry": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-4.5.0.tgz", + "integrity": "sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==", + "license": "Apache-2.0", + "dependencies": { + "is-retry-allowed": "^2.2.0" + }, + "peerDependencies": { + "axios": "0.x || 1.x" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browser-or-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz", + "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==", + "license": "MIT" + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/decamelize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-aggregate-error": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.14.tgz", + "integrity": "sha512-3YxX6rVb07B5TV11AV5wsL7nQCHXNwoHPsQC8S4AmBiqYhyNCJ5BRKXkXyDJvs8QzXN20NgRtxe3dEEQD9NLHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "globalthis": "^1.0.4", + "has-property-descriptors": "^1.0.2", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/event-source-polyfill": { + "version": "1.0.31", + "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.31.tgz", + "integrity": "sha512-4IJSItgS/41IxN5UVAVuAyczwZF7ZIEsM1XAoUzIHA6A+xzusEZUutdXz2Nr+MQPLxfTiCvqE79/C8HT8fKFvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-retry-allowed": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", + "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsep": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", + "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10.16.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonc-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", + "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonpath-plus": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz", + "integrity": "sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jsep-plugin/assignment": "^1.3.0", + "@jsep-plugin/regex": "^1.0.4", + "jsep": "^1.4.0" + }, + "bin": { + "jsonpath": "bin/jsonpath-cli.js", + "jsonpath-plus": "bin/jsonpath-cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "license": "MIT", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.topath": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", + "integrity": "sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nimma": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/nimma/-/nimma-0.2.3.tgz", + "integrity": "sha512-1ZOI8J+1PKKGceo/5CT5GfQOG6H8I2BencSK06YarZ2wXwH37BSSUWldqJmMJYA5JfqDqffxDXynt6f11AyKcA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsep-plugin/regex": "^1.0.1", + "@jsep-plugin/ternary": "^1.0.2", + "astring": "^1.8.1", + "jsep": "^1.2.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + }, + "optionalDependencies": { + "jsonpath-plus": "^6.0.1 || ^10.1.0", + "lodash.topath": "^4.5.2" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pony-cause": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-1.1.1.tgz", + "integrity": "sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g==", + "dev": true, + "license": "0BSD", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", + "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-eval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-eval/-/simple-eval-1.0.1.tgz", + "integrity": "sha512-LH7FpTAkeD+y5xQC4fzS+tFtaNlvt3Ib1zKzvhjv/Y+cioV4zIuw4IZr2yhRLu67CWL7FR9/6KXKnjRoZTvGGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsep": "^1.3.6" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, + "node_modules/urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-4.0.0.tgz", + "integrity": "sha512-huWiiCS4TxKc4SfgmTwW1K7JmXPPAmuXWYy4j9qjQo4+27Kni8mGhAAi1cloRWmBe2EqcLgt3IGqQoRL/MtPgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/integrations/zoho-sales-iq-hitl/package.json b/integrations/zoho-sales-iq-hitl/package.json index a8748a3e..d63c572d 100644 --- a/integrations/zoho-sales-iq-hitl/package.json +++ b/integrations/zoho-sales-iq-hitl/package.json @@ -9,19 +9,19 @@ }, "private": true, "dependencies": { - "@botpress/client": "0.45.0", - "@botpress/sdk": "3.3.0", + "@botpress/client": "1.28.0", + "@botpress/sdk": "5.2.0", "axios": "^1.8.1", "form-data": "^4.0.0", "zod": "^3.24.2" }, "devDependencies": { - "@botpress/cli": "^3.3.0", + "@botpress/cli": "^5.2.0", "@types/node": "^18.19.76", "ts-node": "^10.9.2", "typescript": "^5.8.2" }, "bpDependencies": { - "hitl": "interface:hitl@0.4.0" + "hitl": "interface:hitl@2.0.0" } } diff --git a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts index 1a2a69f9..a5bb1af6 100644 --- a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts +++ b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts @@ -19,9 +19,18 @@ export const startHitl: bp.IntegrationProps['actions']['startHitl'] = async ({ c type: 'integration', }) - const { title, description = 'No description available' } = input + const { title = '', description = 'No description available' } = input - const result = await zohoClient.createConversation(state.payload.name, state.payload.email, title, description) + const result : any | null = await zohoClient.createConversation(state.payload.name, state.payload.email, title, description) + + if ( + result === null || + result.data.conversation_id === null || + result.data.conversation_id === undefined || + result.data.conversation_id === '' + ) { + throw new RuntimeError('Failed to a conversation with Zoho SalesIQ. Result: ' + JSON.stringify(result, null, 2)) + } const { conversation } = await client.getOrCreateConversation({ channel: 'hitl', @@ -70,7 +79,7 @@ export const stopHitl: bp.IntegrationProps['actions']['stopHitl'] = async ({ ctx client ) - void zohoClient.sendMessage(salesIqConversationId, 'Botpress HITL terminated with reason: ' + input.reason) + zohoClient.sendMessage(salesIqConversationId, 'Botpress HITL terminated.') return {} } diff --git a/integrations/zoho-sales-iq-hitl/src/client.ts b/integrations/zoho-sales-iq-hitl/src/client.ts index 72757fc2..fd8366e1 100644 --- a/integrations/zoho-sales-iq-hitl/src/client.ts +++ b/integrations/zoho-sales-iq-hitl/src/client.ts @@ -3,6 +3,7 @@ import * as bp from '.botpress' import * as bpclient from '@botpress/client' import { IntegrationLogger } from '@botpress/sdk' +import { debugResponse } from './debug' const logger = new IntegrationLogger() @@ -158,6 +159,8 @@ export class ZohoApi { ) logger.forBot().info(response) + debugResponse('Refresh Access Token', response, logger) + await this.bpClient.setState({ id: this.ctx.integrationId, type: 'integration', @@ -176,7 +179,7 @@ export class ZohoApi { } public async createConversation(name: string, email: string, title: string, description: string): Promise { - const { data } = await this.makeHitlRequest( + const { data }: { data: any | null } = await this.makeHitlRequest( `${this.zohoSalesIqServerURI}/api/visitor/v1/${this.ctx.configuration.screenName}/conversations`, 'POST', { @@ -190,7 +193,7 @@ export class ZohoApi { question: `Botpress - ${title} - ${description}`, } ) - + debugResponse('Create Conversation', data, logger) return data } @@ -202,6 +205,8 @@ export class ZohoApi { try { const response = await this.makeHitlRequest(endpoint, 'POST', payload) + debugResponse('Send Message', response, logger) + if (response.success) { logger.forBot().info('Message sent successfully:', response.data) } else { @@ -219,6 +224,7 @@ export class ZohoApi { const { data } = await this.makeHitlRequest( `${this.zohoSalesIqServerURI}/api/v2/${this.ctx.configuration.screenName}/apps/${this.ctx.configuration.appId}` ) + debugResponse('Get App', data, logger) return data } @@ -226,6 +232,7 @@ export class ZohoApi { const { data } = await this.makeHitlRequest( `${this.zohoSalesIqServerURI}/api/v2/${this.ctx.configuration.screenName}/departments/${this.ctx.configuration.departmentId}` ) + debugResponse('Get Department', data, logger) return data } } diff --git a/integrations/zoho-sales-iq-hitl/src/debug.ts b/integrations/zoho-sales-iq-hitl/src/debug.ts new file mode 100644 index 00000000..9b7580f9 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/src/debug.ts @@ -0,0 +1,19 @@ +import * as bp from '.botpress' + +export function debugResponse(title:string, response: any, logger: bp.Logger) { + const print = (title: string, message: string | object) => { + if (typeof message === 'object') { + message = JSON.stringify(message, null, 2) + } + logger.forBot().debug(`${title}: ${message}`) + } + print( + `${title} Debug Info`, + { + data: response.data, + success: response.success, + message: response.message, + status: response.status, + } + ) +} \ No newline at end of file From edecb74f93566dbd9af21966aa1e922da29ed124 Mon Sep 17 00:00:00 2001 From: Eric Huang Date: Thu, 22 Jan 2026 16:55:16 -0500 Subject: [PATCH 02/13] refactor(zoho-sales-iq): add Zod schemas for API response validation Introduce comprehensive Zod-based type definitions for all Zoho Sales IQ API responses and webhook events. Replaces `any`/`unknown` types with properly validated schemas, adding runtime validation throughout the client, event handlers, and setup workflows. Includes new webhook-events.ts with structured event definitions and enhanced schemas.ts with API response wrappers. --- .../integration.definition.ts | 2 +- integrations/zoho-sales-iq-hitl/package.json | 2 +- .../zoho-sales-iq-hitl/pnpm-lock.yaml | 368 +++++---- .../zoho-sales-iq-hitl/sample-logs.txt | 772 ++++++++++++++++++ .../zoho-sales-iq-hitl/src/actions/hitl.ts | 21 +- .../zoho-sales-iq-hitl/src/channels.ts | 26 +- integrations/zoho-sales-iq-hitl/src/client.ts | 123 ++- integrations/zoho-sales-iq-hitl/src/debug.ts | 29 +- .../src/definitions/salesIqEvents.ts | 34 - .../src/definitions/schemas.ts | 79 ++ .../src/definitions/webhook-events.ts | 103 +++ .../src/events/operatorAssignedUpdate.ts | 4 +- .../events/operatorConversationCompleted.ts | 4 +- .../src/events/operatorConversationMissed.ts | 4 +- .../src/events/operatorSendMessage.ts | 4 +- .../zoho-sales-iq-hitl/src/setup/handler.ts | 59 +- .../src/setup/unregister.ts | 2 +- 17 files changed, 1360 insertions(+), 276 deletions(-) create mode 100644 integrations/zoho-sales-iq-hitl/sample-logs.txt delete mode 100644 integrations/zoho-sales-iq-hitl/src/definitions/salesIqEvents.ts create mode 100644 integrations/zoho-sales-iq-hitl/src/definitions/webhook-events.ts diff --git a/integrations/zoho-sales-iq-hitl/integration.definition.ts b/integrations/zoho-sales-iq-hitl/integration.definition.ts index 6ef665ff..17258535 100644 --- a/integrations/zoho-sales-iq-hitl/integration.definition.ts +++ b/integrations/zoho-sales-iq-hitl/integration.definition.ts @@ -4,7 +4,7 @@ import { events, configuration, channels, states, user } from './src/definitions export default new IntegrationDefinition({ name: 'erichuang/zoho-sales-iq-hitl', title: 'Zoho Sales IQ HITL (DEV)', - version: '0.1.3', + version: '0.1.6', icon: 'icon.svg', description: 'This integration allows your bot to use Zoho Sales IQ as a HITL Provider', readme: 'hub.md', diff --git a/integrations/zoho-sales-iq-hitl/package.json b/integrations/zoho-sales-iq-hitl/package.json index d63c572d..79da7292 100644 --- a/integrations/zoho-sales-iq-hitl/package.json +++ b/integrations/zoho-sales-iq-hitl/package.json @@ -9,7 +9,7 @@ }, "private": true, "dependencies": { - "@botpress/client": "1.28.0", + "@botpress/client": "1.28.0", "@botpress/sdk": "5.2.0", "axios": "^1.8.1", "form-data": "^4.0.0", diff --git a/integrations/zoho-sales-iq-hitl/pnpm-lock.yaml b/integrations/zoho-sales-iq-hitl/pnpm-lock.yaml index 0a33dde8..1aac6190 100644 --- a/integrations/zoho-sales-iq-hitl/pnpm-lock.yaml +++ b/integrations/zoho-sales-iq-hitl/pnpm-lock.yaml @@ -9,11 +9,11 @@ importers: .: dependencies: '@botpress/client': - specifier: 0.45.0 - version: 0.45.0 + specifier: 1.28.0 + version: 1.28.0 '@botpress/sdk': - specifier: 3.3.0 - version: 3.3.0(@bpinternal/zui@0.13.6)(esbuild@0.16.17) + specifier: 5.2.0 + version: 5.2.0(@bpinternal/zui@0.13.6)(esbuild@0.25.12) axios: specifier: ^1.8.1 version: 1.13.2 @@ -25,8 +25,8 @@ importers: version: 3.25.76 devDependencies: '@botpress/cli': - specifier: ^3.3.0 - version: 3.6.5(@bpinternal/zui@0.13.6) + specifier: ^5.2.0 + version: 5.4.2(@bpinternal/zui@0.13.6) '@types/node': specifier: ^18.19.76 version: 18.19.130 @@ -43,39 +43,42 @@ packages: resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} engines: {node: '>= 16'} - '@botpress/chat@0.5.1': - resolution: {integrity: sha512-zmxWo1/i1E7yL1rS0smkE1cnrJ0yO4FvPnX/YFD0ICYS2hxbtPZDbz7VOMHN/EynSchqTN9qtJ5aVf/V1tTVOQ==} + '@botpress/chat@0.5.4': + resolution: {integrity: sha512-VS8CiX/NyyfFWa6bS8EbsbZxrrXKjHG12mx6Mm6i1XhJCaMo7r5tC6Nw6GNGkBJ0zMmrzcGuEFtLNIo3hefFbg==} + engines: {node: '>=18.0.0'} - '@botpress/cli@3.6.5': - resolution: {integrity: sha512-i6wtkVgupd4hx9tYMd7K6UCS+Gi1E5ks5QlFm0cZ8KkHyHUFvBozk50NcwvSY6j0U/VHE1ciFmZ8eCNyWKnmwQ==} + '@botpress/cli@5.4.2': + resolution: {integrity: sha512-Npll8klzoJFDweBtlHeZrVBvjM/N1RLoKsvPKfIr14NDI99hLL/2y9Ism9KZdmaDy84OzVu+f4TABlIyP+F4kA==} engines: {node: '>=18.0.0'} hasBin: true - '@botpress/client@0.45.0': - resolution: {integrity: sha512-PJ1zRtUFJ/bO6sO9ScRawqDvz1q0MnR8uOqIt9gK6+nRxWFTgrwqKTkBknu7RAEuOHH9y8F97dqTsRP6mX2IbQ==} + '@botpress/client@1.28.0': + resolution: {integrity: sha512-gU7j04Efv15qHf9zE1zOcnSBNvM/5+9BhyRZudt9WgJBN4YH0QZpc3GmGy+lOxQU563YKHf166xRrFhkicqiug==} + engines: {node: '>=18.0.0'} - '@botpress/client@0.47.0': - resolution: {integrity: sha512-k37fLlHzxo30MuyCePE5Vc92OM3OQTzu7OeY296jNCvOw9UZ7wkng2uaXmnCnqh52qgPHPfi5cWRLpLV/Jyo9w==} + '@botpress/client@1.29.0': + resolution: {integrity: sha512-gvmSddgYnpqxt697kEqb6/1d/b6m/LwuvmAPgsnzKy1q1PPqukkFjWRSTpvUw6xztAsrORBX0ulNPQ6uhVGEew==} + engines: {node: '>=18.0.0'} - '@botpress/client@0.48.3': - resolution: {integrity: sha512-h5c1ck51rjl8aaHw1a7Fzd6zYzMMWW4AIkYMHhuz0B1it+4NecMhtb9R4QPvV+YZuIZ2AnBOls6r2b5JgRLzGA==} + '@botpress/client@1.30.0': + resolution: {integrity: sha512-2Sfj7dbBqkLS/Rn8oHOD0+ERkYXqDLpnuqZ3KVZSK2Fs6cl7ptlxagQqPZQNrl63OMj3XBY0wifq8dspYEmf5w==} engines: {node: '>=18.0.0'} - '@botpress/sdk@3.3.0': - resolution: {integrity: sha512-K/n1ioPAiN50j4EOszSUyQ2VQiVaTqqFAIiweODJ6B3EYcGxv0uHq86sX/FOsg0iOopsX+jtq4WIDjgyf+e6fA==} + '@botpress/sdk@5.2.0': + resolution: {integrity: sha512-wKGBRdmVheLvgL3rLAMdsdF0CIXtSNZ00O+UHF6Hr5EnAL6N8WmfyJON60RcHUsnWkXuWW5d1oeLCi4I3VpaBw==} engines: {node: '>=18.0.0'} peerDependencies: - '@bpinternal/zui': ^0.13.5 + '@bpinternal/zui': ^1.3.2 esbuild: ^0.16.12 peerDependenciesMeta: esbuild: optional: true - '@botpress/sdk@3.6.3': - resolution: {integrity: sha512-8p9rLg3NMxdGPgducjh/OujqoOfs6Lf913/gNRBuCe36U0EFZY0KEz5+0o0KFdp5DtS9yxtUujcY3UOnG+KJMg==} + '@botpress/sdk@5.3.1': + resolution: {integrity: sha512-q6vJ1HO/qN/C7hYB5XZv71MCE8TrvTTSf99xOWjbpm79BbqbTvENvmKFZkFde/rw8iw2PHyiqnhgPZNCJvnUJg==} engines: {node: '>=18.0.0'} peerDependencies: - '@bpinternal/zui': ^0.13.5 + '@bpinternal/zui': ^1.3.2 esbuild: ^0.16.12 peerDependenciesMeta: esbuild: @@ -89,6 +92,10 @@ packages: resolution: {integrity: sha512-ICJeZC3QdEMjmGO4KjOfIgsVJDC4LLIQ+qemhOpo9XcI4E7S6vEG3XXSVvkFxijiErUTBXFrkbXMqvEdzP0jFA==} engines: {node: '>=16.0.0', pnpm: 8.6.2} + '@bpinternal/verel@0.2.0': + resolution: {integrity: sha512-Qwr/NAdDzAsUqG4/ywir2lCUG/GzCWFCfm2BYtYdA2QiEtUXTnh2jnlrXDFonfA8Qzno3xeQqAHA6CsfPSAxgg==} + engines: {node: '>=16.0.0', pnpm: 8.6.2} + '@bpinternal/yargs-extra@0.0.3': resolution: {integrity: sha512-e/unlq0LX4CJUv1jGOv1UgwB/h2M0NCXnwD4lEw496GpkQikO668RS+BBlRhkqdGfZmvKDkXZZ96xJCn+i6Ymg==} @@ -105,135 +112,159 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@esbuild/android-arm64@0.16.17': - resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.16.17': - resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.16.17': - resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.16.17': - resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.16.17': - resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.16.17': - resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.16.17': - resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.16.17': - resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.16.17': - resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.16.17': - resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.16.17': - resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.16.17': - resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.16.17': - resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.16.17': - resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.16.17': - resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.16.17': - resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.16.17': - resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} - engines: {node: '>=12'} + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.16.17': - resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.16.17': - resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} - engines: {node: '>=12'} + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.16.17': - resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.16.17': - resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.16.17': - resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -742,9 +773,9 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.16.17: - resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} - engines: {node: '>=12'} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: @@ -1373,10 +1404,6 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -1511,7 +1538,7 @@ snapshots: '@types/json-schema': 7.0.15 js-yaml: 4.1.0 - '@botpress/chat@0.5.1': + '@botpress/chat@0.5.4': dependencies: axios: 1.2.5 browser-or-node: 2.1.1 @@ -1519,20 +1546,20 @@ snapshots: eventsource: 2.0.2 jsonwebtoken: 9.0.2 qs: 6.14.0 - type-fest: 3.13.1 verror: 1.10.1 zod: 3.25.76 transitivePeerDependencies: - debug - '@botpress/cli@3.6.5(@bpinternal/zui@0.13.6)': + '@botpress/cli@5.4.2(@bpinternal/zui@0.13.6)': dependencies: '@apidevtools/json-schema-ref-parser': 11.9.3 - '@botpress/chat': 0.5.1 - '@botpress/client': 0.48.3 - '@botpress/sdk': 3.6.3(@bpinternal/zui@0.13.6)(esbuild@0.16.17) + '@botpress/chat': 0.5.4 + '@botpress/client': 1.30.0 + '@botpress/sdk': 5.3.1(@bpinternal/zui@0.13.6)(esbuild@0.25.12) '@bpinternal/const': 0.1.2 '@bpinternal/tunnel': 0.1.25 + '@bpinternal/verel': 0.2.0 '@bpinternal/yargs-extra': 0.0.3 '@parcel/watcher': 2.5.1 '@stoplight/spectral-core': 1.20.0 @@ -1545,8 +1572,9 @@ snapshots: boxen: 5.1.2 chalk: 4.1.2 dotenv: 16.6.1 - esbuild: 0.16.17 + esbuild: 0.25.12 handlebars: 4.7.8 + jsonpath-plus: 10.3.0 latest-version: 5.1.0 lodash: 4.17.21 prettier: 3.6.2 @@ -1562,27 +1590,25 @@ snapshots: - encoding - utf-8-validate - '@botpress/client@0.45.0': + '@botpress/client@1.28.0': dependencies: axios: 1.13.2 axios-retry: 4.5.0(axios@1.13.2) browser-or-node: 2.1.1 qs: 6.14.0 - type-fest: 3.13.1 transitivePeerDependencies: - debug - '@botpress/client@0.47.0': + '@botpress/client@1.29.0': dependencies: axios: 1.13.2 axios-retry: 4.5.0(axios@1.13.2) browser-or-node: 2.1.1 qs: 6.14.0 - type-fest: 3.13.1 transitivePeerDependencies: - debug - '@botpress/client@0.48.3': + '@botpress/client@1.30.0': dependencies: axios: 1.13.2 axios-retry: 4.5.0(axios@1.13.2) @@ -1591,23 +1617,25 @@ snapshots: transitivePeerDependencies: - debug - '@botpress/sdk@3.3.0(@bpinternal/zui@0.13.6)(esbuild@0.16.17)': + '@botpress/sdk@5.2.0(@bpinternal/zui@0.13.6)(esbuild@0.25.12)': dependencies: - '@botpress/client': 0.47.0 + '@botpress/client': 1.29.0 '@bpinternal/zui': 0.13.6 browser-or-node: 2.1.1 + semver: 7.7.3 optionalDependencies: - esbuild: 0.16.17 + esbuild: 0.25.12 transitivePeerDependencies: - debug - '@botpress/sdk@3.6.3(@bpinternal/zui@0.13.6)(esbuild@0.16.17)': + '@botpress/sdk@5.3.1(@bpinternal/zui@0.13.6)(esbuild@0.25.12)': dependencies: - '@botpress/client': 0.48.3 + '@botpress/client': 1.30.0 '@bpinternal/zui': 0.13.6 browser-or-node: 2.1.1 + semver: 7.7.3 optionalDependencies: - esbuild: 0.16.17 + esbuild: 0.25.12 transitivePeerDependencies: - debug @@ -1624,6 +1652,10 @@ snapshots: - bufferutil - utf-8-validate + '@bpinternal/verel@0.2.0': + dependencies: + browser-or-node: 2.1.1 + '@bpinternal/yargs-extra@0.0.3': dependencies: '@types/yargs': 17.0.34 @@ -1639,70 +1671,82 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@esbuild/android-arm64@0.16.17': + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-arm@0.16.17': + '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/android-x64@0.16.17': + '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.16.17': + '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/darwin-x64@0.16.17': + '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.16.17': + '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.16.17': + '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm64@0.16.17': + '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-arm@0.16.17': + '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-ia32@0.16.17': + '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-loong64@0.16.17': + '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-mips64el@0.16.17': + '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-ppc64@0.16.17': + '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.16.17': + '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-s390x@0.16.17': + '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/linux-x64@0.16.17': + '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.16.17': + '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.16.17': + '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/sunos-x64@0.16.17': + '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/win32-arm64@0.16.17': + '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/win32-ia32@0.16.17': + '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/win32-x64@0.16.17': + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-x64@0.25.12': optional: true '@jridgewell/resolve-uri@3.1.2': {} @@ -1807,7 +1851,7 @@ snapshots: dependencies: '@stoplight/json': 3.21.7 '@stoplight/path': 1.3.2 - '@stoplight/types': 13.6.0 + '@stoplight/types': 13.20.0 '@types/urijs': 1.19.26 dependency-graph: 0.11.0 fast-memoize: 2.5.2 @@ -2317,30 +2361,34 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.16.17: + esbuild@0.25.12: optionalDependencies: - '@esbuild/android-arm': 0.16.17 - '@esbuild/android-arm64': 0.16.17 - '@esbuild/android-x64': 0.16.17 - '@esbuild/darwin-arm64': 0.16.17 - '@esbuild/darwin-x64': 0.16.17 - '@esbuild/freebsd-arm64': 0.16.17 - '@esbuild/freebsd-x64': 0.16.17 - '@esbuild/linux-arm': 0.16.17 - '@esbuild/linux-arm64': 0.16.17 - '@esbuild/linux-ia32': 0.16.17 - '@esbuild/linux-loong64': 0.16.17 - '@esbuild/linux-mips64el': 0.16.17 - '@esbuild/linux-ppc64': 0.16.17 - '@esbuild/linux-riscv64': 0.16.17 - '@esbuild/linux-s390x': 0.16.17 - '@esbuild/linux-x64': 0.16.17 - '@esbuild/netbsd-x64': 0.16.17 - '@esbuild/openbsd-x64': 0.16.17 - '@esbuild/sunos-x64': 0.16.17 - '@esbuild/win32-arm64': 0.16.17 - '@esbuild/win32-ia32': 0.16.17 - '@esbuild/win32-x64': 0.16.17 + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 escalade@3.2.0: {} @@ -2992,8 +3040,6 @@ snapshots: type-fest@0.20.2: {} - type-fest@3.13.1: {} - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 diff --git a/integrations/zoho-sales-iq-hitl/sample-logs.txt b/integrations/zoho-sales-iq-hitl/sample-logs.txt new file mode 100644 index 00000000..5600c13b --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/sample-logs.txt @@ -0,0 +1,772 @@ +Jan 22, 2026, 3:12:17 PM +{ + status: 200, + statusText: '', + headers: Object [AxiosHeaders] { + server: 'ZGS', + date: 'Thu, 22 Jan 2026 20:12:17 GMT', + 'content-type': 'application/json;charset=UTF-8', + 'content-length': '193', + connection: 'keep-alive', + 'set-cookie': [ + 'zalb_2464eb5b1f=5311b21d84a608e1aa3018e2f63d9954; Path=/; Secure; HttpOnly', + 'iamcsr=1872cf60-a55f-4bfe-851f-d32faad664e2;path=/;SameSite=Strict;Secure;priority=high' + ], + 'cache-control': 'no-store', + 'x-content-type-options': 'nosniff', + pragma: 'no-cache', + 'x-frame-options': 'SAMEORIGIN', + 'content-language': 'en-US', + 'strict-transport-security': 'max-age=64072000; includeSubDomains; preload' + }, + config: { + transitional: { + silentJSONParsing: true, + forcedJSONParsing: true, + clarifyTimeoutError: false + }, + adapter: [ 'xhr', 'http', 'fetch' ], + transformRequest: [ [Function: transformRequest] ], + transformResponse: [ [Function: transformResponse] ], + timeout: 0, + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + maxContentLength: -1, + maxBodyLength: -1, + env: { FormData: [Function], Blob: [class Blob] }, + validateStatus: [Function: validateStatus], + headers: Object [AxiosHeaders] { + Accept: 'application/json, text/plain, */*', + 'Content-Type': 'application/x-www-form-urlencoded', + 'User-Agent': 'axios/1.13.2', + 'Content-Length': '212', + 'Accept-Encoding': 'gzip, compress, deflate, br' + }, + method: 'post', + url: 'https://accounts.zohocloud.ca/oauth/v2/token', + data: 'client_id=1005.VJRYW5IPIFWT2YL3LOHYE418IPW4TJ&client_secret=baabe0b94643d3d693c0b08a8bc745054020e68493&refresh_token=1005.4aabce7748693f51e51a9dbfdf59035a.1cecb1d49990c60608ee35f6aab80f49&grant_type=refresh_token', + allowAbsoluteUrls: true + }, + request: ClientRequest { + _events: [Object: null prototype] { + abort: [Function (anonymous)], + aborted: [Function (anonymous)], + connect: [Function (anonymous)], + error: [Function (anonymous)], + socket: [Function (anonymous)], + timeout: [Function (anonymous)], + finish: [Function: requestOnFinish] + }, + _eventsCount: 7, + _maxListeners: undefined, + outputData: [], + outputSize: 0, + writable: true, + destroyed: true, + _last: false, + chunkedEncoding: false, + shouldKeepAlive: true, + maxRequestsOnConnectionReached: false, + _defaultKeepAlive: true, + useChunkedEncodingByDefault: true, + sendDate: false, + _removedConnection: false, + _removedContLen: false, + _removedTE: false, + strictContentLength: false, + _contentLength: 212, + _hasBody: true, + _trailer: '', + finished: true, + _headerSent: true, + _closed: true, + socket: TLSSocket { + _tlsOptions: [Object], + _secureEstablished: true, + _securePending: false, + _newSessionPending: false, + _controlReleased: true, + secureConnecting: false, + _SNICallback: null, + servername: 'accounts.zohocloud.ca', + alpnProtocol: false, + authorized: true, + authorizationError: null, + encrypted: true, + _events: [Object: null prototype], + _eventsCount: 9, + connecting: false, + _hadError: false, + _parent: null, + _host: 'accounts.zohocloud.ca', + _closeAfterHandlingError: false, + _readableState: [ReadableState], + _writableState: [WritableState], + allowHalfOpen: false, + _maxListeners: undefined, + _sockname: null, + _pendingData: null, + _pendingEncoding: '', + server: undefined, + _server: null, + ssl: [TLSWrap], + _requestCert: true, + _rejectUnauthorized: true, + timeout: 5000, + parser: null, + _httpMessage: null, + [Symbol(alpncallback)]: null, + [Symbol(res)]: [TLSWrap], + [Symbol(verified)]: true, + [Symbol(pendingSession)]: null, + [Symbol(async_id_symbol)]: -1, + [Symbol(kHandle)]: [TLSWrap], + [Symbol(lastWriteQueueSize)]: 0, + [Symbol(timeout)]: Timeout { + _idleTimeout: 5000, + _idlePrev: [TimersList], + _idleNext: [TimersList], + _idleStart: 591, + _onTimeout: [Function: bound ], + _timerArgs: undefined, + _repeat: null, + _destroyed: false, + [Symbol(refed)]: false, + [Symbol(kHasPrimitive)]: false, + [Symbol(asyncId)]: 58, + [Symbol(triggerId)]: 56, + [Symbol(kResourceStore)]: [Object] + }, + [Symbol(kBuffer)]: null, + [Symbol(kBufferCb)]: null, + [Symbol(kBufferGen)]: null, + [Symbol(shapeMode)]: true, + [Symbol(kCapture)]: false, + [Symbol(kSetNoDelay)]: false, + [Symbol(kSetKeepAlive)]: true, + [Symbol(kSetKeepAliveInitialDelay)]: 1, + [Symbol(kBytesRead)]: 0, + [Symbol(kBytesWritten)]: 0, + [Symbol(connect-options)]: [Object] + }, + _header: 'POST /oauth/v2/token HTTP/1.1\r\n' + + 'Accept: application/json, text/plain, */*\r\n' + + 'Content-Type: application/x-www-form-urlencoded\r\n' + + 'User-Agent: axios/1.13.2\r\n' + + 'Content-Length: 212\r\n' + + 'Accept-Encoding: gzip, compress, deflate, br\r\n' + + 'Host: accounts.zohocloud.ca\r\n' + + 'Connection: keep-alive\r\n' + + '\r\n', + _keepAliveTimeout: 0, + _onPendingData: [Function: nop], + agent: Agent { + _events: [Object: null prototype], + _eventsCount: 2, + _maxListeners: undefined, + defaultPort: 443, + protocol: 'https:', + options: [Object: null prototype], + requests: [Object: null prototype] {}, + sockets: [Object: null prototype] {}, + freeSockets: [Object: null prototype], + keepAliveMsecs: 1000, + keepAlive: true, + maxSockets: Infinity, + maxFreeSockets: 256, + scheduling: 'lifo', + maxTotalSockets: Infinity, + totalSocketCount: 1, + maxCachedSessions: 100, + _sessionCache: [Object], + [Symbol(shapeMode)]: false, + [Symbol(kCapture)]: false + }, + socketPath: undefined, + method: 'POST', + maxHeaderSize: undefined, + insecureHTTPParser: undefined, + joinDuplicateHeaders: undefined, + path: '/oauth/v2/token', + _ended: true, + res: IncomingMessage { + _events: [Object], + _readableState: [ReadableState], + _maxListeners: undefined, + socket: null, + httpVersionMajor: 1, + httpVersionMinor: 1, + httpVersion: '1.1', + complete: true, + rawHeaders: [Array], + rawTrailers: [], + joinDuplicateHeaders: undefined, + aborted: false, + upgrade: false, + url: '', + method: null, + statusCode: 200, + statusMessage: '', + client: [TLSSocket], + _consuming: false, + _dumped: false, + req: [Circular *1], + _eventsCount: 4, + responseUrl: 'https://accounts.zohocloud.ca/oauth/v2/token', + redirects: [], + [Symbol(shapeMode)]: true, + [Symbol(kCapture)]: false, + [Symbol(kHeaders)]: [Object], + [Symbol(kHeadersCount)]: 26, + [Symbol(kTrailers)]: null, + [Symbol(kTrailersCount)]: 0 + }, + aborted: false, + timeoutCb: null, + upgradeOrConnect: false, + parser: null, + maxHeadersCount: null, + reusedSocket: false, + host: 'accounts.zohocloud.ca', + protocol: 'https:', + _redirectable: Writable { + _events: [Object], + _writableState: [WritableState], + _maxListeners: undefined, + _options: [Object], + _ended: true, + _ending: true, + _redirectCount: 0, + _redirects: [], + _requestBodyLength: 212, + _requestBodyBuffers: [], + _eventsCount: 3, + _onNativeResponse: [Function (anonymous)], + _currentRequest: [Circular *1], + _currentUrl: 'https://accounts.zohocloud.ca/oauth/v2/token', + _timeout: null, + [Symbol(shapeMode)]: true, + [Symbol(kCapture)]: false + }, + [Symbol(shapeMode)]: false, + [Symbol(kCapture)]: false, + [Symbol(kBytesWritten)]: 0, + [Symbol(kNeedDrain)]: false, + [Symbol(corked)]: 0, + [Symbol(kOutHeaders)]: [Object: null prototype] { + accept: [Array], + 'content-type': [Array], + 'user-agent': [Array], + 'content-length': [Array], + 'accept-encoding': [Array], + host: [Array] + }, + [Symbol(errored)]: null, + [Symbol(kHighWaterMark)]: 16384, + [Symbol(kRejectNonStandardBodyWrites)]: false, + [Symbol(kUniqueHeaders)]: null + }, + data: { + access_token: '1005.386b9addaa973844064419a2608ae37f.522ab3bde9e6ea7bfdedec41f8ccbd3f', + expires_in_sec: 3600, + api_domain: 'https://www.zohoapis.ca', + token_type: 'Bearer', + expires_in: 3600000 + } +} +Jan 22, 2026, 3:12:17 PM +Refresh Access Token Debug Info: { + "data": { + "access_token": "1005.386b9addaa973844064419a2608ae37f.522ab3bde9e6ea7bfdedec41f8ccbd3f", + "expires_in_sec": 3600, + "api_domain": "https://www.zohoapis.ca", + "token_type": "Bearer", + "expires_in": 3600000 + }, + "status": 200 +} +Jan 22, 2026, 3:12:17 PM +Access token refreshed successfully. +Jan 22, 2026, 3:12:17 PM +Params: {} +Jan 22, 2026, 3:12:17 PM +Making request to GET https://salesiq.zohocloud.ca/api/v2/botpress/apps/11209000000002238 +Jan 22, 2026, 3:12:17 PM +accessToken 1005.386b9addaa973844064419a2608ae37f.522ab3bde9e6ea7bfdedec41f8ccbd3f +Jan 22, 2026, 3:12:17 PM +Registering configuration... +Jan 22, 2026, 3:12:17 PM +Get App Debug Info: { + "data": { + "reply_time": "0", + "homepage_configs": { + "offline_content": "", + "conversation_mode": [ + "chat", + "call" + ], + "online_content": "", + "show_brand_logo": false + }, + "allow_chat_reopen": false, + "call_recording": true, + "modified_time": "1769036166768", + "abusive_content_moderation": { + "close_chat_message": "Sorry! But, I'm forced to end the conversation right away due to usage of profanity", + "message_action": "pass", + "action": "close_chat", + "limit": 1, + "warning_message": "I'm sorry but I will have to end this chat/block you if there is another abusive message", + "content_library": "0", + "enabled": false, + "type": "operator_and_bots", + "block_user_message": "Sorry, you are blocked from sending anymore messages because you have used abusive language!" + }, + "chat_inactivity_rules": { + "remainder_enabled": false, + "rules": [ + { + "delay_mins": 240, + "message": { + "default": [ + { + "text": "" + } + ] + }, + "action": "end" + } + ] + }, + "view_conversation": false, + "visitor_question": { + "default_text": "", + "mandatory": true, + "place_holder": "" + }, + "allow_multiple_live_chat": false, + "consent_banner_content": "", + "waiting_time": 60, + "created_time": "1769036166750", + "enabled": true, + "chat_waiting_queue": { + "enabled": false, + "size": 0 + }, + "modifier": { + "name": "Eric Huang", + "id": "11209000000002002" + }, + "unique_name": "botpress", + "credit_card_masking": { + "consent_banner_content": "", + "enabled": true, + "allow_operator_to_unmask": true, + "supported_roles": [ + "Supervisor", + "Administrator" + ] + }, + "name": "Botpress", + "contact": { + "address": "", + "email": "", + "name": "", + "enabled": true, + "phonenumber": "" + }, + "description": {}, + "jwt_authentication": { + "enabled": false, + "secret_key": "2b93ca534eb64b2d9c91becec1b53e37" + }, + "notify_cookies": { + "link_content": "", + "link_url": "", + "banner_content": "", + "button_text": { + "text2": "", + "text1": "" + }, + "code": 2 + }, + "form_fields_auto_pick_enabled": true, + "hide_when_offline": false, + "mail_transcript": true, + "offline_content": { + "sub_header": "", + "action": "", + "header": "" + }, + "language": "default", + "creator": { + "name": "Eric Huang", + "id": "11209000000002002" + }, + "cookie_preference": "default", + "seasonaltheme_enabled": false, + "share_screen": false, + "mask_visitor_ip": true, + "read_receipt": false, + "color": "#0066cc", + "widget_type": "float", + "seasonal_theme": { + "themes": [ + { + "expiry_time": "1735583400000", + "enabled": false, + "type": "christmas", + "start_time": "1734460200000" + }, + { + "expiry_time": "1730831340000", + "enabled": false, + "type": "diwali", + "start_time": "1729405800000" + }, + { + "expiry_time": "1735842599000", + "enabled": false, + "type": "newyear", + "start_time": "1735497001000" + } + ], + "enabled": false + }, + "notify_terms": { + "url": "", + "banner_content": "", + "negative_button_content": "", + "code": 1, + "positive_button_content": "" + }, + "resource": { + "use_chat_departments": true, + "departments": [ + { + "11209000000002024": "Botpress" + } + ] + }, + "share_file": true, + "logo_url": "", + "online_content": { + "sub_header": "", + "action": "", + "header": "" + }, + "business_hours": true, + "notify_googletranslator_usage": { + "url": "", + "code": 1 + }, + "all_dept_association": "7", + "id": "11209000000002238", + "show_brand_logo": false, + "track_dnt_websites": false, + "recording": { + "call_consent_message": "", + "type": "audio_call_and_screen_share", + "screenshare_consent_message": "" + }, + "idle_chat_end": { + "enabled": true + }, + "chat_assignment": "auto_assign", + "show_emojis": false, + "white_labelled": true, + "message_actions": { + "operator": { + "edit": true, + "delete": true + }, + "enabled": true, + "visitor": { + "edit": false, + "delete": false + } + }, + "voice_notes_enabled": true, + "missed_chat_end": { + "enabled": false, + "duration": "3_months" + }, + "font": "Lato", + "departments": [ + { + "11209000000002024": "Botpress" + } + ], + "channels": { + "website": { + "screen_share": 1, + "faq": 1, + "chat": 1, + "enabled": true, + "proactive": 0, + "call": 1 + }, + "emailsignature": { + "screen_share": 1, + "faq": 0, + "chat": 1, + "enabled": true, + "proactive": 0, + "call": 1 + } + }, + "waiting_time_config": { + "website": 60, + "emailsignature": 60 + }, + "widgetcode": "1c1dfdd05232ea65e6e0ea186b4b1a2758565185b6675d1919c31e3cd63ae036", + "privacy": false + } +} +Jan 22, 2026, 3:12:17 PM +Zoho configuration validated successfully. +Jan 22, 2026, 3:12:17 PM +{ + url: '/api/v2/botpress/apps/11209000000002238', + object: 'app', + data: { + reply_time: '0', + homepage_configs: { + offline_content: '', + conversation_mode: [Array], + online_content: '', + show_brand_logo: false + }, + allow_chat_reopen: false, + call_recording: true, + modified_time: '1769036166768', + abusive_content_moderation: { + close_chat_message: "Sorry! But, I'm forced to end the conversation right away due to usage of profanity", + message_action: 'pass', + action: 'close_chat', + limit: 1, + warning_message: "I'm sorry but I will have to end this chat/block you if there is another abusive message", + content_library: '0', + enabled: false, + type: 'operator_and_bots', + block_user_message: 'Sorry, you are blocked from sending anymore messages because you have used abusive language!' + }, + chat_inactivity_rules: { remainder_enabled: false, rules: [Array] }, + view_conversation: false, + visitor_question: { default_text: '', mandatory: true, place_holder: '' }, + allow_multiple_live_chat: false, + consent_banner_content: '', + waiting_time: 60, + created_time: '1769036166750', + enabled: true, + chat_waiting_queue: { enabled: false, size: 0 }, + modifier: { name: 'Eric Huang', id: '11209000000002002' }, + unique_name: 'botpress', + credit_card_masking: { + consent_banner_content: '', + enabled: true, + allow_operator_to_unmask: true, + supported_roles: [Array] + }, + name: 'Botpress', + contact: { + address: '', + email: '', + name: '', + enabled: true, + phonenumber: '' + }, + description: {}, + jwt_authentication: { enabled: false, secret_key: '2b93ca534eb64b2d9c91becec1b53e37' }, + notify_cookies: { + link_content: '', + link_url: '', + banner_content: '', + button_text: [Object], + code: 2 + }, + form_fields_auto_pick_enabled: true, + hide_when_offline: false, + mail_transcript: true, + offline_content: { sub_header: '', action: '', header: '' }, + language: 'default', + creator: { name: 'Eric Huang', id: '11209000000002002' }, + cookie_preference: 'default', + seasonaltheme_enabled: false, + share_screen: false, + mask_visitor_ip: true, + read_receipt: false, + color: '#0066cc', + widget_type: 'float', + seasonal_theme: { themes: [Array], enabled: false }, + notify_terms: { + url: '', + banner_content: '', + negative_button_content: '', + code: 1, + positive_button_content: '' + }, + resource: { use_chat_departments: true, departments: [Array] }, + share_file: true, + logo_url: '', + online_content: { sub_header: '', action: '', header: '' }, + business_hours: true, + notify_googletranslator_usage: { url: '', code: 1 }, + all_dept_association: '7', + id: '11209000000002238', + show_brand_logo: false, + track_dnt_websites: false, + recording: { + call_consent_message: '', + type: 'audio_call_and_screen_share', + screenshare_consent_message: '' + }, + idle_chat_end: { enabled: true }, + chat_assignment: 'auto_assign', + show_emojis: false, + white_labelled: true, + message_actions: { operator: [Object], enabled: true, visitor: [Object] }, + voice_notes_enabled: true, + missed_chat_end: { enabled: false, duration: '3_months' }, + font: 'Lato', + departments: [ [Object] ], + channels: { website: [Object], emailsignature: [Object] }, + waiting_time_config: { website: 60, emailsignature: 60 }, + widgetcode: '1c1dfdd05232ea65e6e0ea186b4b1a2758565185b6675d1919c31e3cd63ae036', + privacy: false + } +} +Jan 22, 2026, 3:15:12 PM +Params: {} +Jan 22, 2026, 3:15:12 PM +Making request to POST https://salesiq.zohocloud.ca/api/visitor/v1/botpress/conversations +Jan 22, 2026, 3:15:12 PM +accessToken 1005.386b9addaa973844064419a2608ae37f.522ab3bde9e6ea7bfdedec41f8ccbd3f +Jan 22, 2026, 3:15:12 PM +Create Conversation Debug Info: { + "data": { + "id": "64be824cad60f719d1dd8d3e39a23919afd16da2fe2e750c138d2deeb3aa4ba1", + "wms_chat_id": "LD_1582336420051416516_1110002332534", + "unread_chats": false, + "question": "Botpress - Test Tickets - No description available", + "department": { + "name": "Botpress", + "id": "11209000000002024" + }, + "auto_assign": true, + "last_modified_time": "1769112912596", + "start_time": "1769112912596", + "visitor": { + "name": "Unknown User", + "id": "11209000000002318", + "country_code": "US", + "supported_operations": [ + "bot_chat", + "file_share", + "audio_call", + "video_call", + "remote_share", + "edit_message", + "delete_message", + "reply_message", + "block_ip", + "article_share", + "read_recipients", + "remote_session", + "bookings" + ], + "first_name": "", + "ip": "13.220.247.125", + "salutation": "None", + "email": "user_01KFKN59TFFFV1J53EQ6PJ9WW7@no-reply.6887d3ea-c675-42b9-a39f-b44aca03932c.botpress.com", + "user_id": "user_01KFKN59TFFFV1J53EQ6PJ9WW7@no-reply.6887d3ea-c675-42b9-a39f-b44aca03932c.botpress.com", + "last_name": "" + }, + "type": "chat", + "chat_id": "cde7ae090e9c2eb4a1528e017ce2e381a8fbcb5f77094678db21958d39924df91bc18812738350ab445761b88f88b7dc", + "chat_status": { + "state_key": "waiting", + "status_code": 0, + "state": 1, + "status_key": "open" + }, + "conversation_id": "11209000000003001", + "reference_id": "2" + } +} +Jan 22, 2026, 3:15:12 PM +Conversation ID - 11209000000003001 +Jan 22, 2026, 3:15:12 PM +Result Data - { + "url": "/api/visitor/v1/botpress/conversations", + "object": "conversations", + "data": { + "id": "64be824cad60f719d1dd8d3e39a23919afd16da2fe2e750c138d2deeb3aa4ba1", + "wms_chat_id": "LD_1582336420051416516_1110002332534", + "unread_chats": false, + "question": "Botpress - Test Tickets - No description available", + "department": { + "name": "Botpress", + "id": "11209000000002024" + }, + "auto_assign": true, + "last_modified_time": "1769112912596", + "start_time": "1769112912596", + "visitor": { + "name": "Unknown User", + "id": "11209000000002318", + "country_code": "US", + "supported_operations": [ + "bot_chat", + "file_share", + "audio_call", + "video_call", + "remote_share", + "edit_message", + "delete_message", + "reply_message", + "block_ip", + "article_share", + "read_recipients", + "remote_session", + "bookings" + ], + "first_name": "", + "ip": "13.220.247.125", + "salutation": "None", + "email": "user_01KFKN59TFFFV1J53EQ6PJ9WW7@no-reply.6887d3ea-c675-42b9-a39f-b44aca03932c.botpress.com", + "user_id": "user_01KFKN59TFFFV1J53EQ6PJ9WW7@no-reply.6887d3ea-c675-42b9-a39f-b44aca03932c.botpress.com", + "last_name": "" + }, + "type": "chat", + "chat_id": "cde7ae090e9c2eb4a1528e017ce2e381a8fbcb5f77094678db21958d39924df91bc18812738350ab445761b88f88b7dc", + "chat_status": { + "state_key": "waiting", + "status_code": 0, + "state": 1, + "status_key": "open" + }, + "conversation_id": "11209000000003001", + "reference_id": "2" + } +} +Jan 22, 2026, 3:15:13 PM +Handler received request from Zoho SalesIQ with payload: {"handler":"execution","entity_type":"conversation","webhook":{"id":"11209000000002314"},"org_id":"110002332534","event":"conversation.attender.updated","entity_id":"11209000000003001","attempt":1,"version":1,"app_id":"11209000000002238","entity":{"owner":{"email_id":"eric.huang@botpress.com","name":"Eric Huang","id":"11209000000002002","type":"operator","email":"eric.huang@botpress.com"},"chat_status":{"state_key":"connected","status_code":0,"state":2,"status_key":"open"},"question":"Botpress - Test Tickets - No description available","reference_id":"2","department_id":"11209000000002024","visitor_conversation_id":"64be824cad60f719d1dd8d3e39a23919afd16da2fe2e750c138d2deeb3aa4ba1","opened_time":"1769112912596","attended_time":"1769112912709","id":"11209000000003001","visitor":{"email_id":"user_01kfkn59tfffv1j53eq6pj9ww7@no-reply.6887d3ea-c675-42b9-a39f-b44aca03932c.botpress.com","name":"Unknown User","channel":"website","last_name":"User","salutation":"None","id":"11209000000002318","type":"contact","first_name":"Unknown"},"app_id":"11209000000002238","status":"Connected","participants":["11209000000002002"]},"event_time":"1769112912709"} +Jan 22, 2026, 3:15:31 PM +Handler received request from Zoho SalesIQ with payload: {"handler":"execution","entity_type":"conversation","webhook":{"id":"11209000000002314"},"org_id":"110002332534","event":"conversation.operator.replied","entity_id":"11209000000003001","attempt":1,"version":1,"app_id":"11209000000002238","entity":{"id":"11209000000003001","visitor_conversation_id":"64be824cad60f719d1dd8d3e39a23919afd16da2fe2e750c138d2deeb3aa4ba1","message":{"sender":{"name":"Eric Huang","id":"11209000000002002","type":"operator"},"meta":{},"msgid":"1769112930346","text":"hi"},"visitor":{"email_id":"user_01kfkn59tfffv1j53eq6pj9ww7@no-reply.6887d3ea-c675-42b9-a39f-b44aca03932c.botpress.com","name":"Unknown User","channel":"website","last_name":"User","salutation":"None","id":"11209000000002318","type":"contact","first_name":"Unknown"}},"event_time":"1769112930452"} +Jan 22, 2026, 3:15:40 PM +Making request to POST https://salesiq.zohocloud.ca/api/visitor/v1/botpress/conversations/11209000000003001/messages +Jan 22, 2026, 3:15:40 PM +accessToken 1005.386b9addaa973844064419a2608ae37f.522ab3bde9e6ea7bfdedec41f8ccbd3f +Jan 22, 2026, 3:15:40 PM +Params: {} +Jan 22, 2026, 3:15:40 PM +Send Message Debug Info: { + "data": "", + "success": true, + "message": "Request successful" +} +Jan 22, 2026, 3:15:40 PM +Message sent successfully: +Jan 22, 2026, 3:15:45 PM +Handler received request from Zoho SalesIQ with payload: {"handler":"execution","entity_type":"conversation","webhook":{"id":"11209000000002314"},"org_id":"110002332534","event":"conversation.completed","entity_id":"11209000000002320","attempt":1,"version":1,"app_id":"11209000000002238","entity":{"owner":{"email_id":"eric.huang@botpress.com","name":"Eric Huang","id":"11209000000002002","type":"operator","email":"eric.huang@botpress.com"},"chat_status":{"state_key":"end","status_code":2,"label":"Attended Online","state":4,"id":"22","status_key":"closed"},"question":"Botpress - Test Tickets - No description available","reference_id":"1","department_id":"11209000000002024","end_time":"1769112944861","visitor_conversation_id":"23d26098feba9aeb47732623330f7b9c0fd534f9259ea605ad952785337eadbd","opened_time":"1769112520888","ended_by":"agent","id":"11209000000002320","visitor":{"email_id":"user_01kfkn59tfffv1j53eq6pj9ww7@no-reply.6887d3ea-c675-42b9-a39f-b44aca03932c.botpress.com","name":"Unknown User","channel":"website","last_name":"User","salutation":"None","id":"11209000000002318","type":"contact","first_name":"Unknown"},"app_id":"11209000000002238","status":"Attended Online","participants":["11209000000002002"]},"event_time":"1769112944861"} \ No newline at end of file diff --git a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts index a5bb1af6..9d799d2e 100644 --- a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts +++ b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts @@ -21,15 +21,17 @@ export const startHitl: bp.IntegrationProps['actions']['startHitl'] = async ({ c const { title = '', description = 'No description available' } = input - const result : any | null = await zohoClient.createConversation(state.payload.name, state.payload.email, title, description) + const result = await zohoClient.createConversation(state.payload.name, state.payload.email, title, description) if ( - result === null || - result.data.conversation_id === null || + !result.success || + result.data === null || result.data.conversation_id === undefined || result.data.conversation_id === '' ) { - throw new RuntimeError('Failed to a conversation with Zoho SalesIQ. Result: ' + JSON.stringify(result, null, 2)) + throw new RuntimeError( + 'Failed to create a conversation with Zoho SalesIQ. Result: ' + JSON.stringify(result, null, 2) + ) } const { conversation } = await client.getOrCreateConversation({ @@ -66,7 +68,7 @@ export const stopHitl: bp.IntegrationProps['actions']['stopHitl'] = async ({ ctx const salesIqConversationId: string | undefined = conversation.tags.id - if (!salesIqConversationId) { + if (salesIqConversationId === undefined || salesIqConversationId === '') { return {} } @@ -81,6 +83,8 @@ export const stopHitl: bp.IntegrationProps['actions']['stopHitl'] = async ({ ctx zohoClient.sendMessage(salesIqConversationId, 'Botpress HITL terminated.') + logger.forBot().info('Botpress HITL terminated.') + return {} } @@ -88,7 +92,7 @@ export const createUser: bp.IntegrationProps['actions']['createUser'] = async ({ try { const { name = 'None', email = 'None', pictureUrl = 'None' } = input - if (!email) { + if (email === null || email === undefined || email === '' || email === 'None') { logger.forBot().error('Email necessary for HITL') throw new RuntimeError('Email necessary for HITL') } @@ -116,7 +120,8 @@ export const createUser: bp.IntegrationProps['actions']['createUser'] = async ({ return { userId: botpressUser.id, } - } catch (error: any) { - throw new RuntimeError(error.message) + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred' + throw new RuntimeError(errorMessage) } } diff --git a/integrations/zoho-sales-iq-hitl/src/channels.ts b/integrations/zoho-sales-iq-hitl/src/channels.ts index ebd0f322..4c2d077e 100644 --- a/integrations/zoho-sales-iq-hitl/src/channels.ts +++ b/integrations/zoho-sales-iq-hitl/src/channels.ts @@ -4,7 +4,7 @@ import { getClient } from './client' export const channels = { hitl: { messages: { - text: async ({ client, ctx, conversation, logger, ...props }: bp.AnyMessageProps) => { + text: async ({ client, ctx, conversation, logger, payload }) => { const zohoClient = getClient( ctx.configuration.refreshToken, ctx.configuration.clientId, @@ -14,16 +14,30 @@ export const channels = { client ) - const { text: userMessage, userId } = props.payload - + const userMessage = payload.text const zohoConversationId = conversation.tags.id - if (!zohoConversationId?.length) { - logger.forBot().error('No Freshchat Conversation Id') + if (zohoConversationId === undefined || zohoConversationId === '') { + logger.forBot().error('No Zoho Conversation Id') return } - return await zohoClient.sendMessage(zohoConversationId as string, userMessage) + await zohoClient.sendMessage(zohoConversationId, userMessage) + }, + bloc: async ({ logger }) => { + logger.forBot().warn('Unsupported message type: bloc') + }, + file: async ({ logger }) => { + logger.forBot().warn('Unsupported message type: file') + }, + video: async ({ logger }) => { + logger.forBot().warn('Unsupported message type: video') + }, + audio: async ({ logger }) => { + logger.forBot().warn('Unsupported message type: audio') + }, + image: async ({ logger }) => { + logger.forBot().warn('Unsupported message type: image') }, }, }, diff --git a/integrations/zoho-sales-iq-hitl/src/client.ts b/integrations/zoho-sales-iq-hitl/src/client.ts index fd8366e1..efec6349 100644 --- a/integrations/zoho-sales-iq-hitl/src/client.ts +++ b/integrations/zoho-sales-iq-hitl/src/client.ts @@ -4,6 +4,23 @@ import * as bpclient from '@botpress/client' import { IntegrationLogger } from '@botpress/sdk' import { debugResponse } from './debug' +import { + OAuthTokenResponseSchema, + ZohoAppConfigResponseSchema, + ZohoCreateConversationResponseSchema, + type CreateConversationData, + type AppConfigData, +} from './definitions/schemas' + +type JsonValue = string | number | boolean | null | JsonObject | JsonArray +type JsonObject = { [key: string]: JsonValue } +type JsonArray = JsonValue[] + +type ZohoApiResponse = { + success: boolean + message: string + data: JsonValue +} const logger = new IntegrationLogger() @@ -86,9 +103,9 @@ export class ZohoApi { private async makeHitlRequest( endpoint: string, method: string = 'GET', - data: any = null, - params: any = {} - ): Promise { + data: JsonObject | null = null, + params: JsonObject = {} + ): Promise { try { const creds = await this.getStoredCredentials() if (!creds) { @@ -120,21 +137,34 @@ export class ZohoApi { message: 'Request successful', data: response.data, } - } catch (error: any) { - logger.forBot().error(error.response) + } catch (error) { + if (axios.isAxiosError(error)) { + const axiosError = error as AxiosError<{ message?: string }> + logger.forBot().error(axiosError.response) + + if (axiosError.response?.status === 401 || axiosError.response?.status === 400) { + logger.forBot().warn('Access token expired. Refreshing...', error) - if (error.response?.status === 401 || error.response?.status === 400) { - logger.forBot().warn('Access token expired. Refreshing...', error) + await this.refreshAccessToken() + return this.makeHitlRequest(endpoint, method, data, params) + } + + const errorMessage = axiosError.response?.data?.message ?? axiosError.message + logger.forBot().error(`Error in ${method} ${endpoint}:`, axiosError.response?.data ?? axiosError.message) - await this.refreshAccessToken() - return this.makeHitlRequest(endpoint, method, data, params) + return { + success: false, + message: errorMessage, + data: null, + } } - logger.forBot().error(`Error in ${method} ${endpoint}:`, error.response?.data || error.message) + const errorMessage = error instanceof Error ? error.message : 'Unknown error' + logger.forBot().error(`Error in ${method} ${endpoint}:`, errorMessage) return { success: false, - message: error.response?.data?.message || error.message, + message: errorMessage, data: null, } } @@ -161,25 +191,41 @@ export class ZohoApi { debugResponse('Refresh Access Token', response, logger) + const parsed = OAuthTokenResponseSchema.safeParse(response.data) + if (!parsed.success) { + logger.forBot().error('Invalid OAuth token response:', parsed.error) + throw new bpclient.RuntimeError('Invalid OAuth token response from Zoho') + } + await this.bpClient.setState({ id: this.ctx.integrationId, type: 'integration', name: 'credentials', payload: { - accessToken: response.data.access_token, + accessToken: parsed.data.access_token, }, }) logger.forBot().info('Access token refreshed successfully.') - } catch (error: unknown) { - const err = error as AxiosError - logger.forBot().error('Error refreshing access token:', err.response?.data || err.message) + } catch (error) { + if (axios.isAxiosError(error)) { + logger.forBot().error('Error refreshing access token:', error.response?.data ?? error.message) + } else { + logger + .forBot() + .error('Error refreshing access token:', error instanceof Error ? error.message : 'Unknown error') + } throw new bpclient.RuntimeError('Authentication error. Please reauthorize the integration.') } } - public async createConversation(name: string, email: string, title: string, description: string): Promise { - const { data }: { data: any | null } = await this.makeHitlRequest( + public async createConversation( + name: string, + email: string, + title: string, + description: string + ): Promise<{ success: boolean; data: CreateConversationData | null; message: string }> { + const response = await this.makeHitlRequest( `${this.zohoSalesIqServerURI}/api/visitor/v1/${this.ctx.configuration.screenName}/conversations`, 'POST', { @@ -193,8 +239,19 @@ export class ZohoApi { question: `Botpress - ${title} - ${description}`, } ) - debugResponse('Create Conversation', data, logger) - return data + debugResponse('Create Conversation', response, logger) + + if (!response.success) { + return { success: false, data: null, message: response.message } + } + + const parsed = ZohoCreateConversationResponseSchema.safeParse(response.data) + if (!parsed.success) { + logger.forBot().error('Invalid create conversation response:', parsed.error) + return { success: false, data: null, message: 'Invalid response from Zoho SalesIQ' } + } + + return { success: true, data: parsed.data.data, message: 'Conversation created successfully' } } public async sendMessage(conversationId: string, message: string) { @@ -220,20 +277,32 @@ export class ZohoApi { } } - public async getApp(): Promise { - const { data } = await this.makeHitlRequest( + public async getApp(): Promise { + const response = await this.makeHitlRequest( `${this.zohoSalesIqServerURI}/api/v2/${this.ctx.configuration.screenName}/apps/${this.ctx.configuration.appId}` ) - debugResponse('Get App', data, logger) - return data + debugResponse('Get App', response, logger) + + const parsed = ZohoAppConfigResponseSchema.safeParse(response.data) + if (!parsed.success) { + logger.forBot().error('Invalid app config response:', parsed.error) + return null + } + return parsed.data.data } - public async getDepartment(): Promise { - const { data } = await this.makeHitlRequest( + public async getDepartment(): Promise { + const response = await this.makeHitlRequest( `${this.zohoSalesIqServerURI}/api/v2/${this.ctx.configuration.screenName}/departments/${this.ctx.configuration.departmentId}` ) - debugResponse('Get Department', data, logger) - return data + debugResponse('Get Department', response, logger) + + const parsed = ZohoAppConfigResponseSchema.safeParse(response.data) + if (!parsed.success) { + logger.forBot().error('Invalid department config response:', parsed.error) + return null + } + return parsed.data.data } } diff --git a/integrations/zoho-sales-iq-hitl/src/debug.ts b/integrations/zoho-sales-iq-hitl/src/debug.ts index 9b7580f9..291088de 100644 --- a/integrations/zoho-sales-iq-hitl/src/debug.ts +++ b/integrations/zoho-sales-iq-hitl/src/debug.ts @@ -1,19 +1,26 @@ import * as bp from '.botpress' -export function debugResponse(title:string, response: any, logger: bp.Logger) { +type JsonValue = string | number | boolean | null | { [key: string]: JsonValue } | JsonValue[] + +type DebugResponse = { + data?: JsonValue + success?: boolean + message?: string + status?: number +} + +export function debugResponse(title: string, response: DebugResponse, logger: bp.Logger) { const print = (title: string, message: string | object) => { if (typeof message === 'object') { message = JSON.stringify(message, null, 2) } logger.forBot().debug(`${title}: ${message}`) } - print( - `${title} Debug Info`, - { - data: response.data, - success: response.success, - message: response.message, - status: response.status, - } - ) -} \ No newline at end of file + + print(`${title} Debug Info`, { + data: response.data, + success: response.success, + message: response.message, + status: response.status, + }) +} diff --git a/integrations/zoho-sales-iq-hitl/src/definitions/salesIqEvents.ts b/integrations/zoho-sales-iq-hitl/src/definitions/salesIqEvents.ts deleted file mode 100644 index 826de9c8..00000000 --- a/integrations/zoho-sales-iq-hitl/src/definitions/salesIqEvents.ts +++ /dev/null @@ -1,34 +0,0 @@ -export type ConversationWebhookPayload = { - entity_type: 'conversation' - webhook: { - id: string - } - org_id: string - event: 'conversation.operator.replied' - entity_id: string - attempt: number - version: string - app_id: string - entity: { - id: string - visitor_conversation_id: string - message: { - sender: { - name: string - id: string - type: 'operator' - } - meta: Record // Empty object, but allows for extensibility - msgid: string - text: string - } - visitor: { - name: string - channel: 'website' // Assuming this is always "website" - id: string - type: 'lead' - email_id: string - } - } - event_time: string -} diff --git a/integrations/zoho-sales-iq-hitl/src/definitions/schemas.ts b/integrations/zoho-sales-iq-hitl/src/definitions/schemas.ts index fca82ceb..adb4a5dd 100644 --- a/integrations/zoho-sales-iq-hitl/src/definitions/schemas.ts +++ b/integrations/zoho-sales-iq-hitl/src/definitions/schemas.ts @@ -7,6 +7,85 @@ export const CreateConversationResponseSchema = z.object({ export type CreateConversationResponse = z.output +// OAuth Token Response +export const OAuthTokenResponseSchema = z.object({ + access_token: z.string(), + expires_in_sec: z.number(), + api_domain: z.string(), + token_type: z.string(), + expires_in: z.number(), +}) +export type OAuthTokenResponse = z.infer + +// Create Conversation Data (nested schemas) +const DepartmentSchema = z.object({ + name: z.string(), + id: z.string(), +}) + +const ChatStatusSchema = z.object({ + state_key: z.string(), + status_code: z.number(), + state: z.number(), + status_key: z.string(), +}) + +const VisitorSchema = z.object({ + name: z.string(), + id: z.string(), + country_code: z.string().optional(), + supported_operations: z.array(z.string()).optional(), + first_name: z.string(), + ip: z.string().optional(), + salutation: z.string(), + email: z.string(), + user_id: z.string(), + last_name: z.string(), +}) + +export const CreateConversationDataSchema = z.object({ + id: z.string(), + wms_chat_id: z.string(), + unread_chats: z.boolean(), + question: z.string(), + department: DepartmentSchema, + auto_assign: z.boolean(), + last_modified_time: z.string(), + start_time: z.string(), + visitor: VisitorSchema, + type: z.string(), + chat_id: z.string(), + chat_status: ChatStatusSchema, + conversation_id: z.string(), + reference_id: z.string(), +}) +export type CreateConversationData = z.infer + +// App Config (partial - only fields we validate) +export const AppConfigDataSchema = z + .object({ + id: z.string(), + name: z.string(), + enabled: z.boolean(), + }) + .passthrough() +export type AppConfigData = z.infer + +// Zoho API wraps responses in { url, object, data: {...} } +export const ZohoAppConfigResponseSchema = z.object({ + url: z.string(), + object: z.string(), + data: AppConfigDataSchema, +}) +export type ZohoAppConfigResponse = z.infer + +export const ZohoCreateConversationResponseSchema = z.object({ + url: z.string(), + object: z.string(), + data: CreateConversationDataSchema, +}) +export type ZohoCreateConversationResponse = z.infer + export type ZohoConfiguration = z.infer export const ZohoConfigurationSchema = z.object({ diff --git a/integrations/zoho-sales-iq-hitl/src/definitions/webhook-events.ts b/integrations/zoho-sales-iq-hitl/src/definitions/webhook-events.ts new file mode 100644 index 00000000..c23e601c --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/src/definitions/webhook-events.ts @@ -0,0 +1,103 @@ +import { z } from '@botpress/sdk' + +// JSON value type for flexible metadata +const JsonLiteralSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]) +type JsonLiteral = z.infer +type JsonValue = JsonLiteral | { [key: string]: JsonValue } | JsonValue[] +const JsonValueSchema: z.ZodType = z.lazy(() => + z.union([JsonLiteralSchema, z.array(JsonValueSchema), z.record(JsonValueSchema)]) +) + +// Base webhook structure +const WebhookBaseSchema = z.object({ + entity_type: z.literal('conversation'), + webhook: z.object({ id: z.string() }), + org_id: z.string(), + entity_id: z.string(), + attempt: z.number(), + version: z.number(), + app_id: z.string(), + event_time: z.string(), +}) + +// Shared visitor schema for webhooks +const WebhookVisitorSchema = z + .object({ + email_id: z.string(), + name: z.string(), + channel: z.string(), + last_name: z.string(), + salutation: z.string(), + id: z.string(), + type: z.string(), + first_name: z.string(), + }) + .passthrough() + +// conversation.operator.replied +export const OperatorRepliedEventSchema = WebhookBaseSchema.extend({ + event: z.literal('conversation.operator.replied'), + entity: z + .object({ + id: z.string(), + visitor_conversation_id: z.string(), + message: z.object({ + sender: z.object({ + name: z.string(), + id: z.string(), + type: z.literal('operator'), + }), + meta: z.record(JsonValueSchema), + msgid: z.string(), + text: z.string(), + }), + visitor: WebhookVisitorSchema, + }) + .passthrough(), +}).passthrough() +export type OperatorRepliedEvent = z.infer + +// conversation.attender.updated +export const AttenderUpdatedEventSchema = WebhookBaseSchema.extend({ + event: z.literal('conversation.attender.updated'), + entity: z + .object({ + owner: z.object({ + email_id: z.string(), + name: z.string(), + id: z.string(), + type: z.literal('operator'), + email: z.string(), + }), + id: z.string(), + visitor: WebhookVisitorSchema, + }) + .passthrough(), +}).passthrough() +export type AttenderUpdatedEvent = z.infer + +// conversation.completed +export const ConversationCompletedEventSchema = WebhookBaseSchema.extend({ + event: z.literal('conversation.completed'), + entity: z + .object({ + id: z.string(), + visitor: WebhookVisitorSchema, + ended_by: z.string(), + end_time: z.string(), + }) + .passthrough(), +}).passthrough() +export type ConversationCompletedEvent = z.infer + +// conversation.missed +export const ConversationMissedEventSchema = WebhookBaseSchema.extend({ + event: z.literal('conversation.missed'), + entity: z + .object({ + id: z.string(), + visitor: WebhookVisitorSchema, + }) + .passthrough(), +}).passthrough() +export type ConversationMissedEvent = z.infer diff --git a/integrations/zoho-sales-iq-hitl/src/events/operatorAssignedUpdate.ts b/integrations/zoho-sales-iq-hitl/src/events/operatorAssignedUpdate.ts index 0d205d47..874d552c 100644 --- a/integrations/zoho-sales-iq-hitl/src/events/operatorAssignedUpdate.ts +++ b/integrations/zoho-sales-iq-hitl/src/events/operatorAssignedUpdate.ts @@ -1,11 +1,11 @@ -import { ConversationWebhookPayload } from '../definitions/salesIqEvents' +import type { AttenderUpdatedEvent } from '../definitions/webhook-events' import * as bp from '.botpress' export const handleOperatorAssignedUpdate = async ({ salesIqEvent, client, }: { - salesIqEvent: ConversationWebhookPayload + salesIqEvent: AttenderUpdatedEvent client: bp.Client }) => { const { conversation } = await client.getOrCreateConversation({ diff --git a/integrations/zoho-sales-iq-hitl/src/events/operatorConversationCompleted.ts b/integrations/zoho-sales-iq-hitl/src/events/operatorConversationCompleted.ts index 96c7a4c5..e6e274fd 100644 --- a/integrations/zoho-sales-iq-hitl/src/events/operatorConversationCompleted.ts +++ b/integrations/zoho-sales-iq-hitl/src/events/operatorConversationCompleted.ts @@ -1,11 +1,11 @@ -import { ConversationWebhookPayload } from '../definitions/salesIqEvents' +import type { ConversationCompletedEvent } from '../definitions/webhook-events' import * as bp from '.botpress' export const handleConversationCompleted = async ({ salesIqEvent, client, }: { - salesIqEvent: ConversationWebhookPayload + salesIqEvent: ConversationCompletedEvent client: bp.Client }) => { const { conversation } = await client.getOrCreateConversation({ diff --git a/integrations/zoho-sales-iq-hitl/src/events/operatorConversationMissed.ts b/integrations/zoho-sales-iq-hitl/src/events/operatorConversationMissed.ts index 1b3ff8c7..0892bb53 100644 --- a/integrations/zoho-sales-iq-hitl/src/events/operatorConversationMissed.ts +++ b/integrations/zoho-sales-iq-hitl/src/events/operatorConversationMissed.ts @@ -1,11 +1,11 @@ -import { ConversationWebhookPayload } from '../definitions/salesIqEvents' +import type { ConversationMissedEvent } from '../definitions/webhook-events' import * as bp from '.botpress' export const handleConversationMissed = async ({ salesIqEvent, client, }: { - salesIqEvent: ConversationWebhookPayload + salesIqEvent: ConversationMissedEvent client: bp.Client }) => { const { conversation } = await client.getOrCreateConversation({ diff --git a/integrations/zoho-sales-iq-hitl/src/events/operatorSendMessage.ts b/integrations/zoho-sales-iq-hitl/src/events/operatorSendMessage.ts index fdf6d5de..6364ab85 100644 --- a/integrations/zoho-sales-iq-hitl/src/events/operatorSendMessage.ts +++ b/integrations/zoho-sales-iq-hitl/src/events/operatorSendMessage.ts @@ -1,11 +1,11 @@ -import { ConversationWebhookPayload } from '../definitions/salesIqEvents' +import type { OperatorRepliedEvent } from '../definitions/webhook-events' import * as bp from '.botpress' export const handleOperatorReplied = async ({ salesIqEvent, client, }: { - salesIqEvent: ConversationWebhookPayload + salesIqEvent: OperatorRepliedEvent client: bp.Client }) => { const { conversation } = await client.getOrCreateConversation({ diff --git a/integrations/zoho-sales-iq-hitl/src/setup/handler.ts b/integrations/zoho-sales-iq-hitl/src/setup/handler.ts index cd59f0ed..a7ebf162 100644 --- a/integrations/zoho-sales-iq-hitl/src/setup/handler.ts +++ b/integrations/zoho-sales-iq-hitl/src/setup/handler.ts @@ -3,8 +3,16 @@ import { handleConversationCompleted } from 'src/events/operatorConversationComp import { handleOperatorAssignedUpdate } from 'src/events/operatorAssignedUpdate' import { handleConversationMissed } from 'src/events/operatorConversationMissed' import { handleOperatorReplied } from 'src/events/operatorSendMessage' +import { + OperatorRepliedEventSchema, + AttenderUpdatedEventSchema, + ConversationCompletedEventSchema, + ConversationMissedEventSchema, +} from 'src/definitions/webhook-events' -export const handler: bp.IntegrationProps['handler'] = async ({ ctx, req, logger, client }) => { +type JsonValue = string | number | boolean | null | { [key: string]: JsonValue } | JsonValue[] + +export const handler: bp.IntegrationProps['handler'] = async ({ req, logger, client }) => { if (!req.body) { logger.forBot().warn('Handler received an empty body') return @@ -12,22 +20,37 @@ export const handler: bp.IntegrationProps['handler'] = async ({ ctx, req, logger logger.forBot().debug('Handler received request from Zoho SalesIQ with payload:', req.body) - const salesIqEvent = JSON.parse(req.body) - - switch (salesIqEvent.event) { - case 'conversation.missed': - await handleConversationMissed({ salesIqEvent, client }) - break - case 'conversation.attender.updated': - await handleOperatorAssignedUpdate({ salesIqEvent, client }) - break - case 'conversation.operator.replied': - await handleOperatorReplied({ salesIqEvent, client }) - break - case 'conversation.completed': - await handleConversationCompleted({ salesIqEvent, client }) - break - default: - logger.forBot().warn('Unhandled Zoho SalesIQ event type: ' + salesIqEvent.event) + let rawPayload: JsonValue + try { + rawPayload = typeof req.body === 'string' ? JSON.parse(req.body) : req.body + } catch { + logger.forBot().error('Failed to parse request body') + return + } + + const operatorReplied = OperatorRepliedEventSchema.safeParse(rawPayload) + if (operatorReplied.success) { + await handleOperatorReplied({ salesIqEvent: operatorReplied.data, client }) + return + } + + const attenderUpdated = AttenderUpdatedEventSchema.safeParse(rawPayload) + if (attenderUpdated.success) { + await handleOperatorAssignedUpdate({ salesIqEvent: attenderUpdated.data, client }) + return } + + const conversationCompleted = ConversationCompletedEventSchema.safeParse(rawPayload) + if (conversationCompleted.success) { + await handleConversationCompleted({ salesIqEvent: conversationCompleted.data, client }) + return + } + + const conversationMissed = ConversationMissedEventSchema.safeParse(rawPayload) + if (conversationMissed.success) { + await handleConversationMissed({ salesIqEvent: conversationMissed.data, client }) + return + } + + logger.forBot().warn('Unrecognized event payload', { rawPayload }) } diff --git a/integrations/zoho-sales-iq-hitl/src/setup/unregister.ts b/integrations/zoho-sales-iq-hitl/src/setup/unregister.ts index f06b617f..1982b71d 100644 --- a/integrations/zoho-sales-iq-hitl/src/setup/unregister.ts +++ b/integrations/zoho-sales-iq-hitl/src/setup/unregister.ts @@ -1,5 +1,5 @@ import type { UnregisterFunction } from '../misc/types' -export const unregister: UnregisterFunction = async ({ ctx, client, logger }) => { +export const unregister: UnregisterFunction = async ({ logger }) => { logger.forBot().info('Unregister process for Zoho Sales IQ HITL integration invoked. No resources to clean up.') } From 1181c31d4f995180ee8bafc906f483527f3e3b91 Mon Sep 17 00:00:00 2001 From: Eric Huang Date: Thu, 22 Jan 2026 17:08:09 -0500 Subject: [PATCH 03/13] refactor(zoho-sales-iq-hitl): remove debug logging from production code --- .gitignore | 3 ++- .../integration.definition.ts | 6 ++--- .../zoho-sales-iq-hitl/src/actions/hitl.ts | 5 ---- integrations/zoho-sales-iq-hitl/src/client.ts | 17 +----------- integrations/zoho-sales-iq-hitl/src/debug.ts | 26 ------------------- .../zoho-sales-iq-hitl/src/setup/handler.ts | 2 -- 6 files changed, 6 insertions(+), 53 deletions(-) delete mode 100644 integrations/zoho-sales-iq-hitl/src/debug.ts diff --git a/.gitignore b/.gitignore index 0ae9ed95..dbf9b73a 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ __snapshots__ .genenv.* tilt_config.json /.idea -hubspot.config.yml \ No newline at end of file +hubspot.config.yml +.claude \ No newline at end of file diff --git a/integrations/zoho-sales-iq-hitl/integration.definition.ts b/integrations/zoho-sales-iq-hitl/integration.definition.ts index 17258535..6e7f1663 100644 --- a/integrations/zoho-sales-iq-hitl/integration.definition.ts +++ b/integrations/zoho-sales-iq-hitl/integration.definition.ts @@ -2,9 +2,9 @@ import { IntegrationDefinition, z } from '@botpress/sdk' import hitl from './bp_modules/hitl' import { events, configuration, channels, states, user } from './src/definitions' export default new IntegrationDefinition({ - name: 'erichuang/zoho-sales-iq-hitl', - title: 'Zoho Sales IQ HITL (DEV)', - version: '0.1.6', + name: 'plus/zoho-sales-iq-hitl', + title: 'Zoho Sales IQ HITL', + version: '3.0.1', icon: 'icon.svg', description: 'This integration allows your bot to use Zoho Sales IQ as a HITL Provider', readme: 'hub.md', diff --git a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts index 9d799d2e..32a4f023 100644 --- a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts +++ b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts @@ -41,9 +41,6 @@ export const startHitl: bp.IntegrationProps['actions']['startHitl'] = async ({ c }, }) - logger.forBot().debug(`Result Data - ${JSON.stringify(result, null, 2)}`) - logger.forBot().debug(`Conversation ID - ${result.data.conversation_id}`) - return { conversationId: conversation.id, } @@ -115,8 +112,6 @@ export const createUser: bp.IntegrationProps['actions']['createUser'] = async ({ }, }) - logger.forBot().error(botpressUser) - return { userId: botpressUser.id, } diff --git a/integrations/zoho-sales-iq-hitl/src/client.ts b/integrations/zoho-sales-iq-hitl/src/client.ts index efec6349..937d6c93 100644 --- a/integrations/zoho-sales-iq-hitl/src/client.ts +++ b/integrations/zoho-sales-iq-hitl/src/client.ts @@ -3,7 +3,6 @@ import * as bp from '.botpress' import * as bpclient from '@botpress/client' import { IntegrationLogger } from '@botpress/sdk' -import { debugResponse } from './debug' import { OAuthTokenResponseSchema, ZohoAppConfigResponseSchema, @@ -117,12 +116,9 @@ export class ZohoApi { Authorization: `Bearer ${creds.accessToken}`, Accept: 'application/json', } - logger.forBot().info('accessToken', creds.accessToken) if (method !== 'GET' && method !== 'DELETE') { headers['Content-Type'] = 'application/json' } - logger.forBot().info(`Making request to ${method} ${endpoint}`) - logger.forBot().info('Params:', params) const response = await axios({ method, @@ -187,9 +183,6 @@ export class ZohoApi { }, } ) - logger.forBot().info(response) - - debugResponse('Refresh Access Token', response, logger) const parsed = OAuthTokenResponseSchema.safeParse(response.data) if (!parsed.success) { @@ -206,7 +199,6 @@ export class ZohoApi { }, }) - logger.forBot().info('Access token refreshed successfully.') } catch (error) { if (axios.isAxiosError(error)) { logger.forBot().error('Error refreshing access token:', error.response?.data ?? error.message) @@ -239,7 +231,6 @@ export class ZohoApi { question: `Botpress - ${title} - ${description}`, } ) - debugResponse('Create Conversation', response, logger) if (!response.success) { return { success: false, data: null, message: response.message } @@ -262,11 +253,7 @@ export class ZohoApi { try { const response = await this.makeHitlRequest(endpoint, 'POST', payload) - debugResponse('Send Message', response, logger) - - if (response.success) { - logger.forBot().info('Message sent successfully:', response.data) - } else { + if (!response.success) { logger.forBot().error('Failed to send message:', response.message) } @@ -281,7 +268,6 @@ export class ZohoApi { const response = await this.makeHitlRequest( `${this.zohoSalesIqServerURI}/api/v2/${this.ctx.configuration.screenName}/apps/${this.ctx.configuration.appId}` ) - debugResponse('Get App', response, logger) const parsed = ZohoAppConfigResponseSchema.safeParse(response.data) if (!parsed.success) { @@ -295,7 +281,6 @@ export class ZohoApi { const response = await this.makeHitlRequest( `${this.zohoSalesIqServerURI}/api/v2/${this.ctx.configuration.screenName}/departments/${this.ctx.configuration.departmentId}` ) - debugResponse('Get Department', response, logger) const parsed = ZohoAppConfigResponseSchema.safeParse(response.data) if (!parsed.success) { diff --git a/integrations/zoho-sales-iq-hitl/src/debug.ts b/integrations/zoho-sales-iq-hitl/src/debug.ts deleted file mode 100644 index 291088de..00000000 --- a/integrations/zoho-sales-iq-hitl/src/debug.ts +++ /dev/null @@ -1,26 +0,0 @@ -import * as bp from '.botpress' - -type JsonValue = string | number | boolean | null | { [key: string]: JsonValue } | JsonValue[] - -type DebugResponse = { - data?: JsonValue - success?: boolean - message?: string - status?: number -} - -export function debugResponse(title: string, response: DebugResponse, logger: bp.Logger) { - const print = (title: string, message: string | object) => { - if (typeof message === 'object') { - message = JSON.stringify(message, null, 2) - } - logger.forBot().debug(`${title}: ${message}`) - } - - print(`${title} Debug Info`, { - data: response.data, - success: response.success, - message: response.message, - status: response.status, - }) -} diff --git a/integrations/zoho-sales-iq-hitl/src/setup/handler.ts b/integrations/zoho-sales-iq-hitl/src/setup/handler.ts index a7ebf162..94a27c45 100644 --- a/integrations/zoho-sales-iq-hitl/src/setup/handler.ts +++ b/integrations/zoho-sales-iq-hitl/src/setup/handler.ts @@ -18,8 +18,6 @@ export const handler: bp.IntegrationProps['handler'] = async ({ req, logger, cli return } - logger.forBot().debug('Handler received request from Zoho SalesIQ with payload:', req.body) - let rawPayload: JsonValue try { rawPayload = typeof req.body === 'string' ? JSON.parse(req.body) : req.body From 1aceafc4c371d4e8660c0d89e926056839ca9cb2 Mon Sep 17 00:00:00 2001 From: Eric Huang Date: Fri, 23 Jan 2026 09:49:46 -0500 Subject: [PATCH 04/13] feat(zoho-sales-iq-hitl): add tag validation before client function calls Created validation utility to ensure conversation IDs and user email IDs are non-empty before passing to client.getOrCreateConversation and client.getOrCreateUser functions. Updated all event handlers to use the new validation functions. --- .../src/events/operatorAssignedUpdate.ts | 8 +++++-- .../events/operatorConversationCompleted.ts | 5 +++- .../src/events/operatorConversationMissed.ts | 5 +++- .../src/events/operatorSendMessage.ts | 8 +++++-- .../src/utils/validation.ts | 23 +++++++++++++++++++ 5 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 integrations/zoho-sales-iq-hitl/src/utils/validation.ts diff --git a/integrations/zoho-sales-iq-hitl/src/events/operatorAssignedUpdate.ts b/integrations/zoho-sales-iq-hitl/src/events/operatorAssignedUpdate.ts index 874d552c..3bd91484 100644 --- a/integrations/zoho-sales-iq-hitl/src/events/operatorAssignedUpdate.ts +++ b/integrations/zoho-sales-iq-hitl/src/events/operatorAssignedUpdate.ts @@ -1,4 +1,5 @@ import type { AttenderUpdatedEvent } from '../definitions/webhook-events' +import { validateConversationTag, validateUserTag } from '../utils/validation' import * as bp from '.botpress' export const handleOperatorAssignedUpdate = async ({ @@ -8,16 +9,19 @@ export const handleOperatorAssignedUpdate = async ({ salesIqEvent: AttenderUpdatedEvent client: bp.Client }) => { + const conversationTagId = validateConversationTag(salesIqEvent.entity_id) + const userTagId = validateUserTag(salesIqEvent.entity.visitor.email_id) + const { conversation } = await client.getOrCreateConversation({ channel: 'hitl', tags: { - id: salesIqEvent.entity_id, + id: conversationTagId, }, }) const { user } = await client.getOrCreateUser({ tags: { - id: salesIqEvent.entity.visitor.email_id, + id: userTagId, }, }) diff --git a/integrations/zoho-sales-iq-hitl/src/events/operatorConversationCompleted.ts b/integrations/zoho-sales-iq-hitl/src/events/operatorConversationCompleted.ts index e6e274fd..30192ef6 100644 --- a/integrations/zoho-sales-iq-hitl/src/events/operatorConversationCompleted.ts +++ b/integrations/zoho-sales-iq-hitl/src/events/operatorConversationCompleted.ts @@ -1,4 +1,5 @@ import type { ConversationCompletedEvent } from '../definitions/webhook-events' +import { validateConversationTag } from '../utils/validation' import * as bp from '.botpress' export const handleConversationCompleted = async ({ @@ -8,10 +9,12 @@ export const handleConversationCompleted = async ({ salesIqEvent: ConversationCompletedEvent client: bp.Client }) => { + const conversationTagId = validateConversationTag(salesIqEvent.entity_id) + const { conversation } = await client.getOrCreateConversation({ channel: 'hitl', tags: { - id: salesIqEvent.entity_id, + id: conversationTagId, }, }) diff --git a/integrations/zoho-sales-iq-hitl/src/events/operatorConversationMissed.ts b/integrations/zoho-sales-iq-hitl/src/events/operatorConversationMissed.ts index 0892bb53..a3327c96 100644 --- a/integrations/zoho-sales-iq-hitl/src/events/operatorConversationMissed.ts +++ b/integrations/zoho-sales-iq-hitl/src/events/operatorConversationMissed.ts @@ -1,4 +1,5 @@ import type { ConversationMissedEvent } from '../definitions/webhook-events' +import { validateConversationTag } from '../utils/validation' import * as bp from '.botpress' export const handleConversationMissed = async ({ @@ -8,10 +9,12 @@ export const handleConversationMissed = async ({ salesIqEvent: ConversationMissedEvent client: bp.Client }) => { + const conversationTagId = validateConversationTag(salesIqEvent.entity_id) + const { conversation } = await client.getOrCreateConversation({ channel: 'hitl', tags: { - id: salesIqEvent.entity_id, + id: conversationTagId, }, }) diff --git a/integrations/zoho-sales-iq-hitl/src/events/operatorSendMessage.ts b/integrations/zoho-sales-iq-hitl/src/events/operatorSendMessage.ts index 6364ab85..19ef663f 100644 --- a/integrations/zoho-sales-iq-hitl/src/events/operatorSendMessage.ts +++ b/integrations/zoho-sales-iq-hitl/src/events/operatorSendMessage.ts @@ -1,4 +1,5 @@ import type { OperatorRepliedEvent } from '../definitions/webhook-events' +import { validateConversationTag, validateUserTag } from '../utils/validation' import * as bp from '.botpress' export const handleOperatorReplied = async ({ @@ -8,16 +9,19 @@ export const handleOperatorReplied = async ({ salesIqEvent: OperatorRepliedEvent client: bp.Client }) => { + const conversationTagId = validateConversationTag(salesIqEvent.entity_id) + const userTagId = validateUserTag(salesIqEvent.entity.visitor.email_id) + const { conversation } = await client.getOrCreateConversation({ channel: 'hitl', tags: { - id: salesIqEvent.entity_id, + id: conversationTagId, }, }) const { user } = await client.getOrCreateUser({ tags: { - id: salesIqEvent.entity.visitor.email_id, + id: userTagId, }, }) diff --git a/integrations/zoho-sales-iq-hitl/src/utils/validation.ts b/integrations/zoho-sales-iq-hitl/src/utils/validation.ts new file mode 100644 index 00000000..5a81e8ae --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/src/utils/validation.ts @@ -0,0 +1,23 @@ +import { RuntimeError } from '@botpress/client' + +export const validateConversationTag = (tagValue: string | number | undefined): string => { + if (tagValue === undefined || tagValue === null) { + throw new RuntimeError('Invalid conversation tag: entity_id is required') + } + const stringValue = String(tagValue).trim() + if (stringValue === '') { + throw new RuntimeError('Invalid conversation tag: entity_id cannot be empty') + } + return stringValue +} + +export const validateUserTag = (emailId: string | undefined): string => { + if (emailId === undefined || emailId === null) { + throw new RuntimeError('Invalid user tag: email_id is required') + } + const stringValue = String(emailId).trim() + if (stringValue === '') { + throw new RuntimeError('Invalid user tag: email_id is required and cannot be empty') + } + return emailId +} From cba08b9b5dcf53f31bcb36709cb2bf08ce7573c2 Mon Sep 17 00:00:00 2001 From: Eric Huang Date: Fri, 23 Jan 2026 09:52:15 -0500 Subject: [PATCH 05/13] fix: prettier formated --- integrations/zoho-sales-iq-hitl/src/client.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/integrations/zoho-sales-iq-hitl/src/client.ts b/integrations/zoho-sales-iq-hitl/src/client.ts index 937d6c93..8707ebcc 100644 --- a/integrations/zoho-sales-iq-hitl/src/client.ts +++ b/integrations/zoho-sales-iq-hitl/src/client.ts @@ -198,7 +198,6 @@ export class ZohoApi { accessToken: parsed.data.access_token, }, }) - } catch (error) { if (axios.isAxiosError(error)) { logger.forBot().error('Error refreshing access token:', error.response?.data ?? error.message) From dcbff581bc901f5b61991af297e05ea039195c1c Mon Sep 17 00:00:00 2001 From: Eric Huang Date: Mon, 26 Jan 2026 10:52:06 -0500 Subject: [PATCH 06/13] feat(zoho-sales-iq-hitl): refactor type definitions and enhance error handling Extract shared JSON schema definitions into dedicated literals file, improve validation error messages with detailed webhook event information, and strengthen input validation in action handlers. --- .../zoho-sales-iq-hitl/sample-logs.txt | 772 ------------------ .../zoho-sales-iq-hitl/src/actions/hitl.ts | 16 +- integrations/zoho-sales-iq-hitl/src/client.ts | 28 +- .../src/definitions/literals.ts | 8 + .../src/definitions/webhook-events.ts | 11 +- .../zoho-sales-iq-hitl/src/setup/handler.ts | 39 +- .../zoho-sales-iq-hitl/src/setup/register.ts | 4 - .../src/utils/validation.ts | 21 +- 8 files changed, 74 insertions(+), 825 deletions(-) delete mode 100644 integrations/zoho-sales-iq-hitl/sample-logs.txt create mode 100644 integrations/zoho-sales-iq-hitl/src/definitions/literals.ts diff --git a/integrations/zoho-sales-iq-hitl/sample-logs.txt b/integrations/zoho-sales-iq-hitl/sample-logs.txt deleted file mode 100644 index 5600c13b..00000000 --- a/integrations/zoho-sales-iq-hitl/sample-logs.txt +++ /dev/null @@ -1,772 +0,0 @@ -Jan 22, 2026, 3:12:17 PM -{ - status: 200, - statusText: '', - headers: Object [AxiosHeaders] { - server: 'ZGS', - date: 'Thu, 22 Jan 2026 20:12:17 GMT', - 'content-type': 'application/json;charset=UTF-8', - 'content-length': '193', - connection: 'keep-alive', - 'set-cookie': [ - 'zalb_2464eb5b1f=5311b21d84a608e1aa3018e2f63d9954; Path=/; Secure; HttpOnly', - 'iamcsr=1872cf60-a55f-4bfe-851f-d32faad664e2;path=/;SameSite=Strict;Secure;priority=high' - ], - 'cache-control': 'no-store', - 'x-content-type-options': 'nosniff', - pragma: 'no-cache', - 'x-frame-options': 'SAMEORIGIN', - 'content-language': 'en-US', - 'strict-transport-security': 'max-age=64072000; includeSubDomains; preload' - }, - config: { - transitional: { - silentJSONParsing: true, - forcedJSONParsing: true, - clarifyTimeoutError: false - }, - adapter: [ 'xhr', 'http', 'fetch' ], - transformRequest: [ [Function: transformRequest] ], - transformResponse: [ [Function: transformResponse] ], - timeout: 0, - xsrfCookieName: 'XSRF-TOKEN', - xsrfHeaderName: 'X-XSRF-TOKEN', - maxContentLength: -1, - maxBodyLength: -1, - env: { FormData: [Function], Blob: [class Blob] }, - validateStatus: [Function: validateStatus], - headers: Object [AxiosHeaders] { - Accept: 'application/json, text/plain, */*', - 'Content-Type': 'application/x-www-form-urlencoded', - 'User-Agent': 'axios/1.13.2', - 'Content-Length': '212', - 'Accept-Encoding': 'gzip, compress, deflate, br' - }, - method: 'post', - url: 'https://accounts.zohocloud.ca/oauth/v2/token', - data: 'client_id=1005.VJRYW5IPIFWT2YL3LOHYE418IPW4TJ&client_secret=baabe0b94643d3d693c0b08a8bc745054020e68493&refresh_token=1005.4aabce7748693f51e51a9dbfdf59035a.1cecb1d49990c60608ee35f6aab80f49&grant_type=refresh_token', - allowAbsoluteUrls: true - }, - request: ClientRequest { - _events: [Object: null prototype] { - abort: [Function (anonymous)], - aborted: [Function (anonymous)], - connect: [Function (anonymous)], - error: [Function (anonymous)], - socket: [Function (anonymous)], - timeout: [Function (anonymous)], - finish: [Function: requestOnFinish] - }, - _eventsCount: 7, - _maxListeners: undefined, - outputData: [], - outputSize: 0, - writable: true, - destroyed: true, - _last: false, - chunkedEncoding: false, - shouldKeepAlive: true, - maxRequestsOnConnectionReached: false, - _defaultKeepAlive: true, - useChunkedEncodingByDefault: true, - sendDate: false, - _removedConnection: false, - _removedContLen: false, - _removedTE: false, - strictContentLength: false, - _contentLength: 212, - _hasBody: true, - _trailer: '', - finished: true, - _headerSent: true, - _closed: true, - socket: TLSSocket { - _tlsOptions: [Object], - _secureEstablished: true, - _securePending: false, - _newSessionPending: false, - _controlReleased: true, - secureConnecting: false, - _SNICallback: null, - servername: 'accounts.zohocloud.ca', - alpnProtocol: false, - authorized: true, - authorizationError: null, - encrypted: true, - _events: [Object: null prototype], - _eventsCount: 9, - connecting: false, - _hadError: false, - _parent: null, - _host: 'accounts.zohocloud.ca', - _closeAfterHandlingError: false, - _readableState: [ReadableState], - _writableState: [WritableState], - allowHalfOpen: false, - _maxListeners: undefined, - _sockname: null, - _pendingData: null, - _pendingEncoding: '', - server: undefined, - _server: null, - ssl: [TLSWrap], - _requestCert: true, - _rejectUnauthorized: true, - timeout: 5000, - parser: null, - _httpMessage: null, - [Symbol(alpncallback)]: null, - [Symbol(res)]: [TLSWrap], - [Symbol(verified)]: true, - [Symbol(pendingSession)]: null, - [Symbol(async_id_symbol)]: -1, - [Symbol(kHandle)]: [TLSWrap], - [Symbol(lastWriteQueueSize)]: 0, - [Symbol(timeout)]: Timeout { - _idleTimeout: 5000, - _idlePrev: [TimersList], - _idleNext: [TimersList], - _idleStart: 591, - _onTimeout: [Function: bound ], - _timerArgs: undefined, - _repeat: null, - _destroyed: false, - [Symbol(refed)]: false, - [Symbol(kHasPrimitive)]: false, - [Symbol(asyncId)]: 58, - [Symbol(triggerId)]: 56, - [Symbol(kResourceStore)]: [Object] - }, - [Symbol(kBuffer)]: null, - [Symbol(kBufferCb)]: null, - [Symbol(kBufferGen)]: null, - [Symbol(shapeMode)]: true, - [Symbol(kCapture)]: false, - [Symbol(kSetNoDelay)]: false, - [Symbol(kSetKeepAlive)]: true, - [Symbol(kSetKeepAliveInitialDelay)]: 1, - [Symbol(kBytesRead)]: 0, - [Symbol(kBytesWritten)]: 0, - [Symbol(connect-options)]: [Object] - }, - _header: 'POST /oauth/v2/token HTTP/1.1\r\n' + - 'Accept: application/json, text/plain, */*\r\n' + - 'Content-Type: application/x-www-form-urlencoded\r\n' + - 'User-Agent: axios/1.13.2\r\n' + - 'Content-Length: 212\r\n' + - 'Accept-Encoding: gzip, compress, deflate, br\r\n' + - 'Host: accounts.zohocloud.ca\r\n' + - 'Connection: keep-alive\r\n' + - '\r\n', - _keepAliveTimeout: 0, - _onPendingData: [Function: nop], - agent: Agent { - _events: [Object: null prototype], - _eventsCount: 2, - _maxListeners: undefined, - defaultPort: 443, - protocol: 'https:', - options: [Object: null prototype], - requests: [Object: null prototype] {}, - sockets: [Object: null prototype] {}, - freeSockets: [Object: null prototype], - keepAliveMsecs: 1000, - keepAlive: true, - maxSockets: Infinity, - maxFreeSockets: 256, - scheduling: 'lifo', - maxTotalSockets: Infinity, - totalSocketCount: 1, - maxCachedSessions: 100, - _sessionCache: [Object], - [Symbol(shapeMode)]: false, - [Symbol(kCapture)]: false - }, - socketPath: undefined, - method: 'POST', - maxHeaderSize: undefined, - insecureHTTPParser: undefined, - joinDuplicateHeaders: undefined, - path: '/oauth/v2/token', - _ended: true, - res: IncomingMessage { - _events: [Object], - _readableState: [ReadableState], - _maxListeners: undefined, - socket: null, - httpVersionMajor: 1, - httpVersionMinor: 1, - httpVersion: '1.1', - complete: true, - rawHeaders: [Array], - rawTrailers: [], - joinDuplicateHeaders: undefined, - aborted: false, - upgrade: false, - url: '', - method: null, - statusCode: 200, - statusMessage: '', - client: [TLSSocket], - _consuming: false, - _dumped: false, - req: [Circular *1], - _eventsCount: 4, - responseUrl: 'https://accounts.zohocloud.ca/oauth/v2/token', - redirects: [], - [Symbol(shapeMode)]: true, - [Symbol(kCapture)]: false, - [Symbol(kHeaders)]: [Object], - [Symbol(kHeadersCount)]: 26, - [Symbol(kTrailers)]: null, - [Symbol(kTrailersCount)]: 0 - }, - aborted: false, - timeoutCb: null, - upgradeOrConnect: false, - parser: null, - maxHeadersCount: null, - reusedSocket: false, - host: 'accounts.zohocloud.ca', - protocol: 'https:', - _redirectable: Writable { - _events: [Object], - _writableState: [WritableState], - _maxListeners: undefined, - _options: [Object], - _ended: true, - _ending: true, - _redirectCount: 0, - _redirects: [], - _requestBodyLength: 212, - _requestBodyBuffers: [], - _eventsCount: 3, - _onNativeResponse: [Function (anonymous)], - _currentRequest: [Circular *1], - _currentUrl: 'https://accounts.zohocloud.ca/oauth/v2/token', - _timeout: null, - [Symbol(shapeMode)]: true, - [Symbol(kCapture)]: false - }, - [Symbol(shapeMode)]: false, - [Symbol(kCapture)]: false, - [Symbol(kBytesWritten)]: 0, - [Symbol(kNeedDrain)]: false, - [Symbol(corked)]: 0, - [Symbol(kOutHeaders)]: [Object: null prototype] { - accept: [Array], - 'content-type': [Array], - 'user-agent': [Array], - 'content-length': [Array], - 'accept-encoding': [Array], - host: [Array] - }, - [Symbol(errored)]: null, - [Symbol(kHighWaterMark)]: 16384, - [Symbol(kRejectNonStandardBodyWrites)]: false, - [Symbol(kUniqueHeaders)]: null - }, - data: { - access_token: '1005.386b9addaa973844064419a2608ae37f.522ab3bde9e6ea7bfdedec41f8ccbd3f', - expires_in_sec: 3600, - api_domain: 'https://www.zohoapis.ca', - token_type: 'Bearer', - expires_in: 3600000 - } -} -Jan 22, 2026, 3:12:17 PM -Refresh Access Token Debug Info: { - "data": { - "access_token": "1005.386b9addaa973844064419a2608ae37f.522ab3bde9e6ea7bfdedec41f8ccbd3f", - "expires_in_sec": 3600, - "api_domain": "https://www.zohoapis.ca", - "token_type": "Bearer", - "expires_in": 3600000 - }, - "status": 200 -} -Jan 22, 2026, 3:12:17 PM -Access token refreshed successfully. -Jan 22, 2026, 3:12:17 PM -Params: {} -Jan 22, 2026, 3:12:17 PM -Making request to GET https://salesiq.zohocloud.ca/api/v2/botpress/apps/11209000000002238 -Jan 22, 2026, 3:12:17 PM -accessToken 1005.386b9addaa973844064419a2608ae37f.522ab3bde9e6ea7bfdedec41f8ccbd3f -Jan 22, 2026, 3:12:17 PM -Registering configuration... -Jan 22, 2026, 3:12:17 PM -Get App Debug Info: { - "data": { - "reply_time": "0", - "homepage_configs": { - "offline_content": "", - "conversation_mode": [ - "chat", - "call" - ], - "online_content": "", - "show_brand_logo": false - }, - "allow_chat_reopen": false, - "call_recording": true, - "modified_time": "1769036166768", - "abusive_content_moderation": { - "close_chat_message": "Sorry! But, I'm forced to end the conversation right away due to usage of profanity", - "message_action": "pass", - "action": "close_chat", - "limit": 1, - "warning_message": "I'm sorry but I will have to end this chat/block you if there is another abusive message", - "content_library": "0", - "enabled": false, - "type": "operator_and_bots", - "block_user_message": "Sorry, you are blocked from sending anymore messages because you have used abusive language!" - }, - "chat_inactivity_rules": { - "remainder_enabled": false, - "rules": [ - { - "delay_mins": 240, - "message": { - "default": [ - { - "text": "" - } - ] - }, - "action": "end" - } - ] - }, - "view_conversation": false, - "visitor_question": { - "default_text": "", - "mandatory": true, - "place_holder": "" - }, - "allow_multiple_live_chat": false, - "consent_banner_content": "", - "waiting_time": 60, - "created_time": "1769036166750", - "enabled": true, - "chat_waiting_queue": { - "enabled": false, - "size": 0 - }, - "modifier": { - "name": "Eric Huang", - "id": "11209000000002002" - }, - "unique_name": "botpress", - "credit_card_masking": { - "consent_banner_content": "", - "enabled": true, - "allow_operator_to_unmask": true, - "supported_roles": [ - "Supervisor", - "Administrator" - ] - }, - "name": "Botpress", - "contact": { - "address": "", - "email": "", - "name": "", - "enabled": true, - "phonenumber": "" - }, - "description": {}, - "jwt_authentication": { - "enabled": false, - "secret_key": "2b93ca534eb64b2d9c91becec1b53e37" - }, - "notify_cookies": { - "link_content": "", - "link_url": "", - "banner_content": "", - "button_text": { - "text2": "", - "text1": "" - }, - "code": 2 - }, - "form_fields_auto_pick_enabled": true, - "hide_when_offline": false, - "mail_transcript": true, - "offline_content": { - "sub_header": "", - "action": "", - "header": "" - }, - "language": "default", - "creator": { - "name": "Eric Huang", - "id": "11209000000002002" - }, - "cookie_preference": "default", - "seasonaltheme_enabled": false, - "share_screen": false, - "mask_visitor_ip": true, - "read_receipt": false, - "color": "#0066cc", - "widget_type": "float", - "seasonal_theme": { - "themes": [ - { - "expiry_time": "1735583400000", - "enabled": false, - "type": "christmas", - "start_time": "1734460200000" - }, - { - "expiry_time": "1730831340000", - "enabled": false, - "type": "diwali", - "start_time": "1729405800000" - }, - { - "expiry_time": "1735842599000", - "enabled": false, - "type": "newyear", - "start_time": "1735497001000" - } - ], - "enabled": false - }, - "notify_terms": { - "url": "", - "banner_content": "", - "negative_button_content": "", - "code": 1, - "positive_button_content": "" - }, - "resource": { - "use_chat_departments": true, - "departments": [ - { - "11209000000002024": "Botpress" - } - ] - }, - "share_file": true, - "logo_url": "", - "online_content": { - "sub_header": "", - "action": "", - "header": "" - }, - "business_hours": true, - "notify_googletranslator_usage": { - "url": "", - "code": 1 - }, - "all_dept_association": "7", - "id": "11209000000002238", - "show_brand_logo": false, - "track_dnt_websites": false, - "recording": { - "call_consent_message": "", - "type": "audio_call_and_screen_share", - "screenshare_consent_message": "" - }, - "idle_chat_end": { - "enabled": true - }, - "chat_assignment": "auto_assign", - "show_emojis": false, - "white_labelled": true, - "message_actions": { - "operator": { - "edit": true, - "delete": true - }, - "enabled": true, - "visitor": { - "edit": false, - "delete": false - } - }, - "voice_notes_enabled": true, - "missed_chat_end": { - "enabled": false, - "duration": "3_months" - }, - "font": "Lato", - "departments": [ - { - "11209000000002024": "Botpress" - } - ], - "channels": { - "website": { - "screen_share": 1, - "faq": 1, - "chat": 1, - "enabled": true, - "proactive": 0, - "call": 1 - }, - "emailsignature": { - "screen_share": 1, - "faq": 0, - "chat": 1, - "enabled": true, - "proactive": 0, - "call": 1 - } - }, - "waiting_time_config": { - "website": 60, - "emailsignature": 60 - }, - "widgetcode": "1c1dfdd05232ea65e6e0ea186b4b1a2758565185b6675d1919c31e3cd63ae036", - "privacy": false - } -} -Jan 22, 2026, 3:12:17 PM -Zoho configuration validated successfully. -Jan 22, 2026, 3:12:17 PM -{ - url: '/api/v2/botpress/apps/11209000000002238', - object: 'app', - data: { - reply_time: '0', - homepage_configs: { - offline_content: '', - conversation_mode: [Array], - online_content: '', - show_brand_logo: false - }, - allow_chat_reopen: false, - call_recording: true, - modified_time: '1769036166768', - abusive_content_moderation: { - close_chat_message: "Sorry! But, I'm forced to end the conversation right away due to usage of profanity", - message_action: 'pass', - action: 'close_chat', - limit: 1, - warning_message: "I'm sorry but I will have to end this chat/block you if there is another abusive message", - content_library: '0', - enabled: false, - type: 'operator_and_bots', - block_user_message: 'Sorry, you are blocked from sending anymore messages because you have used abusive language!' - }, - chat_inactivity_rules: { remainder_enabled: false, rules: [Array] }, - view_conversation: false, - visitor_question: { default_text: '', mandatory: true, place_holder: '' }, - allow_multiple_live_chat: false, - consent_banner_content: '', - waiting_time: 60, - created_time: '1769036166750', - enabled: true, - chat_waiting_queue: { enabled: false, size: 0 }, - modifier: { name: 'Eric Huang', id: '11209000000002002' }, - unique_name: 'botpress', - credit_card_masking: { - consent_banner_content: '', - enabled: true, - allow_operator_to_unmask: true, - supported_roles: [Array] - }, - name: 'Botpress', - contact: { - address: '', - email: '', - name: '', - enabled: true, - phonenumber: '' - }, - description: {}, - jwt_authentication: { enabled: false, secret_key: '2b93ca534eb64b2d9c91becec1b53e37' }, - notify_cookies: { - link_content: '', - link_url: '', - banner_content: '', - button_text: [Object], - code: 2 - }, - form_fields_auto_pick_enabled: true, - hide_when_offline: false, - mail_transcript: true, - offline_content: { sub_header: '', action: '', header: '' }, - language: 'default', - creator: { name: 'Eric Huang', id: '11209000000002002' }, - cookie_preference: 'default', - seasonaltheme_enabled: false, - share_screen: false, - mask_visitor_ip: true, - read_receipt: false, - color: '#0066cc', - widget_type: 'float', - seasonal_theme: { themes: [Array], enabled: false }, - notify_terms: { - url: '', - banner_content: '', - negative_button_content: '', - code: 1, - positive_button_content: '' - }, - resource: { use_chat_departments: true, departments: [Array] }, - share_file: true, - logo_url: '', - online_content: { sub_header: '', action: '', header: '' }, - business_hours: true, - notify_googletranslator_usage: { url: '', code: 1 }, - all_dept_association: '7', - id: '11209000000002238', - show_brand_logo: false, - track_dnt_websites: false, - recording: { - call_consent_message: '', - type: 'audio_call_and_screen_share', - screenshare_consent_message: '' - }, - idle_chat_end: { enabled: true }, - chat_assignment: 'auto_assign', - show_emojis: false, - white_labelled: true, - message_actions: { operator: [Object], enabled: true, visitor: [Object] }, - voice_notes_enabled: true, - missed_chat_end: { enabled: false, duration: '3_months' }, - font: 'Lato', - departments: [ [Object] ], - channels: { website: [Object], emailsignature: [Object] }, - waiting_time_config: { website: 60, emailsignature: 60 }, - widgetcode: '1c1dfdd05232ea65e6e0ea186b4b1a2758565185b6675d1919c31e3cd63ae036', - privacy: false - } -} -Jan 22, 2026, 3:15:12 PM -Params: {} -Jan 22, 2026, 3:15:12 PM -Making request to POST https://salesiq.zohocloud.ca/api/visitor/v1/botpress/conversations -Jan 22, 2026, 3:15:12 PM -accessToken 1005.386b9addaa973844064419a2608ae37f.522ab3bde9e6ea7bfdedec41f8ccbd3f -Jan 22, 2026, 3:15:12 PM -Create Conversation Debug Info: { - "data": { - "id": "64be824cad60f719d1dd8d3e39a23919afd16da2fe2e750c138d2deeb3aa4ba1", - "wms_chat_id": "LD_1582336420051416516_1110002332534", - "unread_chats": false, - "question": "Botpress - Test Tickets - No description available", - "department": { - "name": "Botpress", - "id": "11209000000002024" - }, - "auto_assign": true, - "last_modified_time": "1769112912596", - "start_time": "1769112912596", - "visitor": { - "name": "Unknown User", - "id": "11209000000002318", - "country_code": "US", - "supported_operations": [ - "bot_chat", - "file_share", - "audio_call", - "video_call", - "remote_share", - "edit_message", - "delete_message", - "reply_message", - "block_ip", - "article_share", - "read_recipients", - "remote_session", - "bookings" - ], - "first_name": "", - "ip": "13.220.247.125", - "salutation": "None", - "email": "user_01KFKN59TFFFV1J53EQ6PJ9WW7@no-reply.6887d3ea-c675-42b9-a39f-b44aca03932c.botpress.com", - "user_id": "user_01KFKN59TFFFV1J53EQ6PJ9WW7@no-reply.6887d3ea-c675-42b9-a39f-b44aca03932c.botpress.com", - "last_name": "" - }, - "type": "chat", - "chat_id": "cde7ae090e9c2eb4a1528e017ce2e381a8fbcb5f77094678db21958d39924df91bc18812738350ab445761b88f88b7dc", - "chat_status": { - "state_key": "waiting", - "status_code": 0, - "state": 1, - "status_key": "open" - }, - "conversation_id": "11209000000003001", - "reference_id": "2" - } -} -Jan 22, 2026, 3:15:12 PM -Conversation ID - 11209000000003001 -Jan 22, 2026, 3:15:12 PM -Result Data - { - "url": "/api/visitor/v1/botpress/conversations", - "object": "conversations", - "data": { - "id": "64be824cad60f719d1dd8d3e39a23919afd16da2fe2e750c138d2deeb3aa4ba1", - "wms_chat_id": "LD_1582336420051416516_1110002332534", - "unread_chats": false, - "question": "Botpress - Test Tickets - No description available", - "department": { - "name": "Botpress", - "id": "11209000000002024" - }, - "auto_assign": true, - "last_modified_time": "1769112912596", - "start_time": "1769112912596", - "visitor": { - "name": "Unknown User", - "id": "11209000000002318", - "country_code": "US", - "supported_operations": [ - "bot_chat", - "file_share", - "audio_call", - "video_call", - "remote_share", - "edit_message", - "delete_message", - "reply_message", - "block_ip", - "article_share", - "read_recipients", - "remote_session", - "bookings" - ], - "first_name": "", - "ip": "13.220.247.125", - "salutation": "None", - "email": "user_01KFKN59TFFFV1J53EQ6PJ9WW7@no-reply.6887d3ea-c675-42b9-a39f-b44aca03932c.botpress.com", - "user_id": "user_01KFKN59TFFFV1J53EQ6PJ9WW7@no-reply.6887d3ea-c675-42b9-a39f-b44aca03932c.botpress.com", - "last_name": "" - }, - "type": "chat", - "chat_id": "cde7ae090e9c2eb4a1528e017ce2e381a8fbcb5f77094678db21958d39924df91bc18812738350ab445761b88f88b7dc", - "chat_status": { - "state_key": "waiting", - "status_code": 0, - "state": 1, - "status_key": "open" - }, - "conversation_id": "11209000000003001", - "reference_id": "2" - } -} -Jan 22, 2026, 3:15:13 PM -Handler received request from Zoho SalesIQ with payload: {"handler":"execution","entity_type":"conversation","webhook":{"id":"11209000000002314"},"org_id":"110002332534","event":"conversation.attender.updated","entity_id":"11209000000003001","attempt":1,"version":1,"app_id":"11209000000002238","entity":{"owner":{"email_id":"eric.huang@botpress.com","name":"Eric Huang","id":"11209000000002002","type":"operator","email":"eric.huang@botpress.com"},"chat_status":{"state_key":"connected","status_code":0,"state":2,"status_key":"open"},"question":"Botpress - Test Tickets - No description available","reference_id":"2","department_id":"11209000000002024","visitor_conversation_id":"64be824cad60f719d1dd8d3e39a23919afd16da2fe2e750c138d2deeb3aa4ba1","opened_time":"1769112912596","attended_time":"1769112912709","id":"11209000000003001","visitor":{"email_id":"user_01kfkn59tfffv1j53eq6pj9ww7@no-reply.6887d3ea-c675-42b9-a39f-b44aca03932c.botpress.com","name":"Unknown User","channel":"website","last_name":"User","salutation":"None","id":"11209000000002318","type":"contact","first_name":"Unknown"},"app_id":"11209000000002238","status":"Connected","participants":["11209000000002002"]},"event_time":"1769112912709"} -Jan 22, 2026, 3:15:31 PM -Handler received request from Zoho SalesIQ with payload: {"handler":"execution","entity_type":"conversation","webhook":{"id":"11209000000002314"},"org_id":"110002332534","event":"conversation.operator.replied","entity_id":"11209000000003001","attempt":1,"version":1,"app_id":"11209000000002238","entity":{"id":"11209000000003001","visitor_conversation_id":"64be824cad60f719d1dd8d3e39a23919afd16da2fe2e750c138d2deeb3aa4ba1","message":{"sender":{"name":"Eric Huang","id":"11209000000002002","type":"operator"},"meta":{},"msgid":"1769112930346","text":"hi"},"visitor":{"email_id":"user_01kfkn59tfffv1j53eq6pj9ww7@no-reply.6887d3ea-c675-42b9-a39f-b44aca03932c.botpress.com","name":"Unknown User","channel":"website","last_name":"User","salutation":"None","id":"11209000000002318","type":"contact","first_name":"Unknown"}},"event_time":"1769112930452"} -Jan 22, 2026, 3:15:40 PM -Making request to POST https://salesiq.zohocloud.ca/api/visitor/v1/botpress/conversations/11209000000003001/messages -Jan 22, 2026, 3:15:40 PM -accessToken 1005.386b9addaa973844064419a2608ae37f.522ab3bde9e6ea7bfdedec41f8ccbd3f -Jan 22, 2026, 3:15:40 PM -Params: {} -Jan 22, 2026, 3:15:40 PM -Send Message Debug Info: { - "data": "", - "success": true, - "message": "Request successful" -} -Jan 22, 2026, 3:15:40 PM -Message sent successfully: -Jan 22, 2026, 3:15:45 PM -Handler received request from Zoho SalesIQ with payload: {"handler":"execution","entity_type":"conversation","webhook":{"id":"11209000000002314"},"org_id":"110002332534","event":"conversation.completed","entity_id":"11209000000002320","attempt":1,"version":1,"app_id":"11209000000002238","entity":{"owner":{"email_id":"eric.huang@botpress.com","name":"Eric Huang","id":"11209000000002002","type":"operator","email":"eric.huang@botpress.com"},"chat_status":{"state_key":"end","status_code":2,"label":"Attended Online","state":4,"id":"22","status_key":"closed"},"question":"Botpress - Test Tickets - No description available","reference_id":"1","department_id":"11209000000002024","end_time":"1769112944861","visitor_conversation_id":"23d26098feba9aeb47732623330f7b9c0fd534f9259ea605ad952785337eadbd","opened_time":"1769112520888","ended_by":"agent","id":"11209000000002320","visitor":{"email_id":"user_01kfkn59tfffv1j53eq6pj9ww7@no-reply.6887d3ea-c675-42b9-a39f-b44aca03932c.botpress.com","name":"Unknown User","channel":"website","last_name":"User","salutation":"None","id":"11209000000002318","type":"contact","first_name":"Unknown"},"app_id":"11209000000002238","status":"Attended Online","participants":["11209000000002002"]},"event_time":"1769112944861"} \ No newline at end of file diff --git a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts index 32a4f023..cdf53991 100644 --- a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts +++ b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts @@ -19,18 +19,28 @@ export const startHitl: bp.IntegrationProps['actions']['startHitl'] = async ({ c type: 'integration', }) - const { title = '', description = 'No description available' } = input + const { title, description = 'No description available' } = input + + if (title === undefined || title === null || title.trim() === '') { + throw new RuntimeError('Title is required to create a Zoho SalesIQ conversation') + } const result = await zohoClient.createConversation(state.payload.name, state.payload.email, title, description) if ( - !result.success || + result.success === false || + result.success === undefined || + result.data === undefined || result.data === null || result.data.conversation_id === undefined || result.data.conversation_id === '' ) { + const safeResultInfo = { + success: result.success, + conversationId: result.data?.conversation_id, + } throw new RuntimeError( - 'Failed to create a conversation with Zoho SalesIQ. Result: ' + JSON.stringify(result, null, 2) + 'Failed to create a conversation with Zoho SalesIQ. Result: ' + JSON.stringify(safeResultInfo, null, 2) ) } diff --git a/integrations/zoho-sales-iq-hitl/src/client.ts b/integrations/zoho-sales-iq-hitl/src/client.ts index 8707ebcc..96cc630a 100644 --- a/integrations/zoho-sales-iq-hitl/src/client.ts +++ b/integrations/zoho-sales-iq-hitl/src/client.ts @@ -10,10 +10,7 @@ import { type CreateConversationData, type AppConfigData, } from './definitions/schemas' - -type JsonValue = string | number | boolean | null | JsonObject | JsonArray -type JsonObject = { [key: string]: JsonValue } -type JsonArray = JsonValue[] +import { JsonValue, JsonValueSchema } from './definitions/literals' type ZohoApiResponse = { success: boolean @@ -102,8 +99,8 @@ export class ZohoApi { private async makeHitlRequest( endpoint: string, method: string = 'GET', - data: JsonObject | null = null, - params: JsonObject = {} + data: JsonValue | null = null, + params: JsonValue = {} ): Promise { try { const creds = await this.getStoredCredentials() @@ -254,6 +251,8 @@ export class ZohoApi { if (!response.success) { logger.forBot().error('Failed to send message:', response.message) + } else { + logger.forBot().info('Message sent successfully:', response.data) } return response @@ -263,7 +262,7 @@ export class ZohoApi { } } - public async getApp(): Promise { + public async getApp(): Promise { const response = await this.makeHitlRequest( `${this.zohoSalesIqServerURI}/api/v2/${this.ctx.configuration.screenName}/apps/${this.ctx.configuration.appId}` ) @@ -271,20 +270,7 @@ export class ZohoApi { const parsed = ZohoAppConfigResponseSchema.safeParse(response.data) if (!parsed.success) { logger.forBot().error('Invalid app config response:', parsed.error) - return null - } - return parsed.data.data - } - - public async getDepartment(): Promise { - const response = await this.makeHitlRequest( - `${this.zohoSalesIqServerURI}/api/v2/${this.ctx.configuration.screenName}/departments/${this.ctx.configuration.departmentId}` - ) - - const parsed = ZohoAppConfigResponseSchema.safeParse(response.data) - if (!parsed.success) { - logger.forBot().error('Invalid department config response:', parsed.error) - return null + throw new bpclient.RuntimeError('Invalid app config response from Zoho SalesIQ') } return parsed.data.data } diff --git a/integrations/zoho-sales-iq-hitl/src/definitions/literals.ts b/integrations/zoho-sales-iq-hitl/src/definitions/literals.ts new file mode 100644 index 00000000..129c18d2 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/src/definitions/literals.ts @@ -0,0 +1,8 @@ +import { z } from "@botpress/sdk" + +export const JsonLiteralSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]) +export type JsonLiteral = z.infer +export type JsonValue = JsonLiteral | { [key: string]: JsonValue } | JsonValue[] +export const JsonValueSchema: z.ZodType = z.lazy(() => + z.union([JsonLiteralSchema, z.array(JsonValueSchema), z.record(JsonValueSchema)]) +) diff --git a/integrations/zoho-sales-iq-hitl/src/definitions/webhook-events.ts b/integrations/zoho-sales-iq-hitl/src/definitions/webhook-events.ts index c23e601c..1f8e98eb 100644 --- a/integrations/zoho-sales-iq-hitl/src/definitions/webhook-events.ts +++ b/integrations/zoho-sales-iq-hitl/src/definitions/webhook-events.ts @@ -1,14 +1,6 @@ import { z } from '@botpress/sdk' +import { JsonValueSchema } from './literals' -// JSON value type for flexible metadata -const JsonLiteralSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]) -type JsonLiteral = z.infer -type JsonValue = JsonLiteral | { [key: string]: JsonValue } | JsonValue[] -const JsonValueSchema: z.ZodType = z.lazy(() => - z.union([JsonLiteralSchema, z.array(JsonValueSchema), z.record(JsonValueSchema)]) -) - -// Base webhook structure const WebhookBaseSchema = z.object({ entity_type: z.literal('conversation'), webhook: z.object({ id: z.string() }), @@ -20,7 +12,6 @@ const WebhookBaseSchema = z.object({ event_time: z.string(), }) -// Shared visitor schema for webhooks const WebhookVisitorSchema = z .object({ email_id: z.string(), diff --git a/integrations/zoho-sales-iq-hitl/src/setup/handler.ts b/integrations/zoho-sales-iq-hitl/src/setup/handler.ts index 94a27c45..15016d90 100644 --- a/integrations/zoho-sales-iq-hitl/src/setup/handler.ts +++ b/integrations/zoho-sales-iq-hitl/src/setup/handler.ts @@ -9,8 +9,7 @@ import { ConversationCompletedEventSchema, ConversationMissedEventSchema, } from 'src/definitions/webhook-events' - -type JsonValue = string | number | boolean | null | { [key: string]: JsonValue } | JsonValue[] +import {JsonValue} from 'src/definitions/literals' export const handler: bp.IntegrationProps['handler'] = async ({ req, logger, client }) => { if (!req.body) { @@ -26,29 +25,63 @@ export const handler: bp.IntegrationProps['handler'] = async ({ req, logger, cli return } + const payloadEvent = typeof rawPayload === 'object' && rawPayload !== null && 'event' in rawPayload + ? String(rawPayload.event) + : null + + const validationErrors: Array<{ eventType: string; issues: unknown[] }> = [] + const operatorReplied = OperatorRepliedEventSchema.safeParse(rawPayload) if (operatorReplied.success) { await handleOperatorReplied({ salesIqEvent: operatorReplied.data, client }) return + } else if (payloadEvent === 'conversation.operator.replied') { + validationErrors.push({ + eventType: 'conversation.operator.replied', + issues: operatorReplied.error.issues, + }) } const attenderUpdated = AttenderUpdatedEventSchema.safeParse(rawPayload) if (attenderUpdated.success) { await handleOperatorAssignedUpdate({ salesIqEvent: attenderUpdated.data, client }) return + } else if (payloadEvent === 'conversation.attender.updated') { + validationErrors.push({ + eventType: 'conversation.attender.updated', + issues: attenderUpdated.error.issues, + }) } const conversationCompleted = ConversationCompletedEventSchema.safeParse(rawPayload) if (conversationCompleted.success) { await handleConversationCompleted({ salesIqEvent: conversationCompleted.data, client }) return + } else if (payloadEvent === 'conversation.completed') { + validationErrors.push({ + eventType: 'conversation.completed', + issues: conversationCompleted.error.issues, + }) } const conversationMissed = ConversationMissedEventSchema.safeParse(rawPayload) if (conversationMissed.success) { await handleConversationMissed({ salesIqEvent: conversationMissed.data, client }) return + } else if (payloadEvent === 'conversation.missed') { + validationErrors.push({ + eventType: 'conversation.missed', + issues: conversationMissed.error.issues, + }) } - logger.forBot().warn('Unrecognized event payload', { rawPayload }) + // Only log if all validations failed + if (validationErrors.length > 0) { + logger.forBot().warn('Event payload matched a known event type but failed validation', { + validationErrors, + rawPayload, + }) + } else { + logger.forBot().warn('Unrecognized event payload', { rawPayload }) + } } diff --git a/integrations/zoho-sales-iq-hitl/src/setup/register.ts b/integrations/zoho-sales-iq-hitl/src/setup/register.ts index 9f3b34ce..bfe70883 100644 --- a/integrations/zoho-sales-iq-hitl/src/setup/register.ts +++ b/integrations/zoho-sales-iq-hitl/src/setup/register.ts @@ -21,10 +21,6 @@ export const register: RegisterFunction = async ({ ctx, client, logger }) => { console.log('Registering configuration...') console.log(appResponse) - if (!appResponse) { - throw new bpclient.RuntimeError('Invalid Zoho configuration! Unable to get App ID.') - } - logger.info('Zoho configuration validated successfully.') } catch (error) { logger.error('Error during integration registration:', error) diff --git a/integrations/zoho-sales-iq-hitl/src/utils/validation.ts b/integrations/zoho-sales-iq-hitl/src/utils/validation.ts index 5a81e8ae..470e59ec 100644 --- a/integrations/zoho-sales-iq-hitl/src/utils/validation.ts +++ b/integrations/zoho-sales-iq-hitl/src/utils/validation.ts @@ -1,23 +1,20 @@ import { RuntimeError } from '@botpress/client' -export const validateConversationTag = (tagValue: string | number | undefined): string => { +const validateTag = (errorPrefix: string, tagValue: string | number | undefined): string => { if (tagValue === undefined || tagValue === null) { - throw new RuntimeError('Invalid conversation tag: entity_id is required') + throw new RuntimeError(`${errorPrefix}: tagValue is required`) } const stringValue = String(tagValue).trim() if (stringValue === '') { - throw new RuntimeError('Invalid conversation tag: entity_id cannot be empty') + throw new RuntimeError(`${errorPrefix}: tagValue cannot be empty`) } return stringValue } -export const validateUserTag = (emailId: string | undefined): string => { - if (emailId === undefined || emailId === null) { - throw new RuntimeError('Invalid user tag: email_id is required') - } - const stringValue = String(emailId).trim() - if (stringValue === '') { - throw new RuntimeError('Invalid user tag: email_id is required and cannot be empty') - } - return emailId +export const validateConversationTag = (tagValue: string | number | undefined): string => { + return validateTag('Invalid conversation tag', tagValue) +} + +export const validateUserTag = (tagValue: string | undefined): string => { + return validateTag('Invalid user tag', tagValue) } From e8ce25da9449b3450d19b93f356e28a5bd39b9df Mon Sep 17 00:00:00 2001 From: Eric Huang Date: Mon, 26 Jan 2026 11:08:52 -0500 Subject: [PATCH 07/13] refactor: clean up imports, types, and comments Organize imports alphabetically, remove redundant comments, fix type assertions, and improve error handling across the codebase. --- .../zoho-sales-iq-hitl/src/actions/hitl.ts | 3 ++- integrations/zoho-sales-iq-hitl/src/client.ts | 18 +++++++----------- .../src/definitions/literals.ts | 2 +- .../src/events/operatorAssignedUpdate.ts | 2 +- .../src/events/operatorSendMessage.ts | 2 +- .../zoho-sales-iq-hitl/src/setup/handler.ts | 17 ++++++++--------- .../zoho-sales-iq-hitl/src/setup/register.ts | 12 ++++++------ 7 files changed, 26 insertions(+), 30 deletions(-) diff --git a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts index cdf53991..561aaeab 100644 --- a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts +++ b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts @@ -1,5 +1,6 @@ -import { getClient } from '../client' import { RuntimeError } from '@botpress/client' + +import { getClient } from '../client' import * as bp from '.botpress' export const startHitl: bp.IntegrationProps['actions']['startHitl'] = async ({ ctx, client, logger, input }) => { diff --git a/integrations/zoho-sales-iq-hitl/src/client.ts b/integrations/zoho-sales-iq-hitl/src/client.ts index 96cc630a..98b15ca4 100644 --- a/integrations/zoho-sales-iq-hitl/src/client.ts +++ b/integrations/zoho-sales-iq-hitl/src/client.ts @@ -1,16 +1,16 @@ -import axios, { AxiosError } from 'axios' -import * as bp from '.botpress' import * as bpclient from '@botpress/client' - import { IntegrationLogger } from '@botpress/sdk' +import axios, { AxiosError } from 'axios' + +import * as bp from '.botpress' +import { JsonValue } from './definitions/literals' import { + type AppConfigData, + type CreateConversationData, OAuthTokenResponseSchema, ZohoAppConfigResponseSchema, ZohoCreateConversationResponseSchema, - type CreateConversationData, - type AppConfigData, } from './definitions/schemas' -import { JsonValue, JsonValueSchema } from './definitions/literals' type ZohoApiResponse = { success: boolean @@ -20,7 +20,6 @@ type ZohoApiResponse = { const logger = new IntegrationLogger() -// Zoho Data Centers const zohoAuthUrls = new Map([ ['us', 'https://accounts.zoho.com'], ['eu', 'https://accounts.zoho.eu'], @@ -31,7 +30,6 @@ const zohoAuthUrls = new Map([ ['ca', 'https://accounts.zohocloud.ca'], ]) -// Define a Map for Zoho SalesIQ Server URIs const zohoSalesIQUrls = new Map([ ['us', 'https://salesiq.zoho.com'], ['ca', 'https://salesiq.zohocloud.ca'], @@ -42,11 +40,9 @@ const zohoSalesIQUrls = new Map([ ['jp', 'https://salesiq.zoho.jp'], ]) -// Function to get the Zoho Auth URL const getZohoAuthUrl = (region: string): string => zohoAuthUrls.get(region) ?? 'https://accounts.zoho.ca' -// Function to get the Zoho SalesIQ Server URL -const getZohoSalesIQUrl = (region: string): string => zohoSalesIQUrls.get(region) ?? 'https://salesiq.zoho.com' // Default to US if region not found +const getZohoSalesIQUrl = (region: string): string => zohoSalesIQUrls.get(region) ?? 'https://salesiq.zoho.com' export class ZohoApi { private refreshToken: string diff --git a/integrations/zoho-sales-iq-hitl/src/definitions/literals.ts b/integrations/zoho-sales-iq-hitl/src/definitions/literals.ts index 129c18d2..7592fa02 100644 --- a/integrations/zoho-sales-iq-hitl/src/definitions/literals.ts +++ b/integrations/zoho-sales-iq-hitl/src/definitions/literals.ts @@ -1,4 +1,4 @@ -import { z } from "@botpress/sdk" +import { z } from '@botpress/sdk' export const JsonLiteralSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]) export type JsonLiteral = z.infer diff --git a/integrations/zoho-sales-iq-hitl/src/events/operatorAssignedUpdate.ts b/integrations/zoho-sales-iq-hitl/src/events/operatorAssignedUpdate.ts index 3bd91484..add79bda 100644 --- a/integrations/zoho-sales-iq-hitl/src/events/operatorAssignedUpdate.ts +++ b/integrations/zoho-sales-iq-hitl/src/events/operatorAssignedUpdate.ts @@ -29,7 +29,7 @@ export const handleOperatorAssignedUpdate = async ({ type: 'hitlAssigned', payload: { conversationId: conversation.id, - userId: user.id as string, + userId: user.id, }, }) } diff --git a/integrations/zoho-sales-iq-hitl/src/events/operatorSendMessage.ts b/integrations/zoho-sales-iq-hitl/src/events/operatorSendMessage.ts index 19ef663f..a9246e09 100644 --- a/integrations/zoho-sales-iq-hitl/src/events/operatorSendMessage.ts +++ b/integrations/zoho-sales-iq-hitl/src/events/operatorSendMessage.ts @@ -28,7 +28,7 @@ export const handleOperatorReplied = async ({ await client.createMessage({ tags: {}, type: 'text', - userId: user?.id as string, + userId: user.id, conversationId: conversation.id, payload: { text: salesIqEvent.entity.message.text }, }) diff --git a/integrations/zoho-sales-iq-hitl/src/setup/handler.ts b/integrations/zoho-sales-iq-hitl/src/setup/handler.ts index 15016d90..88179f84 100644 --- a/integrations/zoho-sales-iq-hitl/src/setup/handler.ts +++ b/integrations/zoho-sales-iq-hitl/src/setup/handler.ts @@ -1,15 +1,15 @@ import * as bp from '.botpress' -import { handleConversationCompleted } from 'src/events/operatorConversationCompleted' -import { handleOperatorAssignedUpdate } from 'src/events/operatorAssignedUpdate' -import { handleConversationMissed } from 'src/events/operatorConversationMissed' -import { handleOperatorReplied } from 'src/events/operatorSendMessage' +import { JsonValue } from 'src/definitions/literals' import { - OperatorRepliedEventSchema, AttenderUpdatedEventSchema, ConversationCompletedEventSchema, ConversationMissedEventSchema, + OperatorRepliedEventSchema, } from 'src/definitions/webhook-events' -import {JsonValue} from 'src/definitions/literals' +import { handleOperatorAssignedUpdate } from 'src/events/operatorAssignedUpdate' +import { handleConversationCompleted } from 'src/events/operatorConversationCompleted' +import { handleConversationMissed } from 'src/events/operatorConversationMissed' +import { handleOperatorReplied } from 'src/events/operatorSendMessage' export const handler: bp.IntegrationProps['handler'] = async ({ req, logger, client }) => { if (!req.body) { @@ -25,9 +25,8 @@ export const handler: bp.IntegrationProps['handler'] = async ({ req, logger, cli return } - const payloadEvent = typeof rawPayload === 'object' && rawPayload !== null && 'event' in rawPayload - ? String(rawPayload.event) - : null + const payloadEvent = + typeof rawPayload === 'object' && rawPayload !== null && 'event' in rawPayload ? String(rawPayload.event) : null const validationErrors: Array<{ eventType: string; issues: unknown[] }> = [] diff --git a/integrations/zoho-sales-iq-hitl/src/setup/register.ts b/integrations/zoho-sales-iq-hitl/src/setup/register.ts index bfe70883..e1e84de6 100644 --- a/integrations/zoho-sales-iq-hitl/src/setup/register.ts +++ b/integrations/zoho-sales-iq-hitl/src/setup/register.ts @@ -1,6 +1,7 @@ -import { getClient } from 'src/client' import * as bpclient from '@botpress/client' + import type { RegisterFunction } from '../misc/types' +import { getClient } from 'src/client' export const register: RegisterFunction = async ({ ctx, client, logger }) => { try { @@ -18,12 +19,11 @@ export const register: RegisterFunction = async ({ ctx, client, logger }) => { // Validate Zoho Configuration const appResponse = await zohoClient.getApp() - console.log('Registering configuration...') - console.log(appResponse) - + logger.info('Registering configuration...', appResponse) logger.info('Zoho configuration validated successfully.') - } catch (error) { - logger.error('Error during integration registration:', error) + } catch (error: unknown) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error' + logger.error('Error during integration registration:', errorMessage) throw new bpclient.RuntimeError('Configuration Error! Unable to retrieve app details.') } } From 0d26738de9ff9cc5dad0cd115cebb90f8d0d123b Mon Sep 17 00:00:00 2001 From: Eric Huang Date: Mon, 26 Jan 2026 11:18:41 -0500 Subject: [PATCH 08/13] fix: Force commited bp modules --- .../definition/actions/createUser/index.ts | 17 + .../definition/actions/createUser/input.ts | 31 ++ .../definition/actions/createUser/output.ts | 15 + .../hitl/definition/actions/index.ts | 15 + .../definition/actions/startHitl/index.ts | 17 + .../definition/actions/startHitl/input.ts | 457 ++++++++++++++++++ .../definition/actions/startHitl/output.ts | 17 + .../hitl/definition/actions/stopHitl/index.ts | 17 + .../hitl/definition/actions/stopHitl/input.ts | 17 + .../definition/actions/stopHitl/output.ts | 8 + .../hitl/definition/channels/hitl/index.ts | 10 + .../channels/hitl/messages/audio.ts | 21 + .../definition/channels/hitl/messages/bloc.ts | 98 ++++ .../definition/channels/hitl/messages/file.ts | 22 + .../channels/hitl/messages/image.ts | 21 + .../channels/hitl/messages/index.ts | 24 + .../definition/channels/hitl/messages/text.ts | 21 + .../channels/hitl/messages/video.ts | 21 + .../hitl/definition/channels/index.ts | 9 + .../hitl/definition/entities/hitlSession.ts | 11 + .../hitl/definition/entities/index.ts | 9 + .../hitl/definition/events/hitlAssigned.ts | 24 + .../hitl/definition/events/hitlStopped.ts | 18 + .../hitl/definition/events/index.ts | 12 + .../bp_modules/hitl/definition/index.ts | 24 + .../bp_modules/hitl/index.ts | 16 + 26 files changed, 972 insertions(+) create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/index.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/input.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/output.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/index.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/index.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/input.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/output.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/index.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/input.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/output.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/index.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/audio.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/bloc.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/file.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/image.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/index.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/text.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/video.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/index.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/hitlSession.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/index.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlAssigned.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlStopped.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/index.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/index.ts create mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/index.ts diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/index.ts new file mode 100644 index 00000000..f5f4eaa1 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/index.ts @@ -0,0 +1,17 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. +import * as input from "./input"; +export * as input from "./input"; +import * as output from "./output"; +export * as output from "./output"; + +export const createUser = { + "input": input.input, + "output": output.output, + "title": "Create external user", + "description": "Create an end user in the external service and in Botpress", + "billable": false, + "cacheable": false, + "attributes": { "bpActionHiddenInStudio": "true" }, +} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/input.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/input.ts new file mode 100644 index 00000000..8220a789 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/input.ts @@ -0,0 +1,31 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import { z } from "@botpress/sdk"; +export const input = { + schema: z + .object({ + name: z + .string() + .title("Display name") + .describe("Display name of the end user"), + pictureUrl: z + .optional( + z + .string() + .title("Picture URL") + .describe("URL of the end user\'s avatar"), + ) + .describe("URL of the end user\'s avatar"), + email: z + .optional( + z + .string() + .title("Email address") + .describe("Email address of the end user"), + ) + .describe("Email address of the end user"), + }) + .catchall(z.never()), +}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/output.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/output.ts new file mode 100644 index 00000000..6a62321f --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/output.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import { z } from "@botpress/sdk"; +export const output = { + schema: z + .object({ + userId: z + .string() + .title("Botpress user ID") + .describe("ID of the Botpress user representing the end user"), + }) + .catchall(z.never()), +}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/index.ts new file mode 100644 index 00000000..ac93a788 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/index.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. +import * as createUser from "./createUser/index"; +export * as createUser from "./createUser/index"; +import * as startHitl from "./startHitl/index"; +export * as startHitl from "./startHitl/index"; +import * as stopHitl from "./stopHitl/index"; +export * as stopHitl from "./stopHitl/index"; + +export const actions = { + "createUser": createUser.createUser, + "startHitl": startHitl.startHitl, + "stopHitl": stopHitl.stopHitl, +} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/index.ts new file mode 100644 index 00000000..44ad701e --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/index.ts @@ -0,0 +1,17 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. +import * as input from "./input"; +export * as input from "./input"; +import * as output from "./output"; +export * as output from "./output"; + +export const startHitl = { + "input": input.input, + "output": output.output, + "title": "Start new HITL session", + "description": "Create a new HITL session in the external service and in Botpress", + "billable": false, + "cacheable": false, + "attributes": { "bpActionHiddenInStudio": "true" }, +} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/input.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/input.ts new file mode 100644 index 00000000..5794ed04 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/input.ts @@ -0,0 +1,457 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import { z } from "@botpress/sdk"; +export const input = { + schema: z + .object({ + userId: z + .string() + .title("User ID") + .describe("ID of the Botpress user representing the end user"), + title: z + .optional( + z + .string() + .title("Title") + .describe( + "Title of the HITL session. This corresponds to a ticket title in systems that use tickets.", + ), + ) + .describe( + "Title of the HITL session. This corresponds to a ticket title in systems that use tickets.", + ), + description: z + .optional( + z + .string() + .title("Description") + .describe( + "Description of the HITL session. This corresponds to a ticket description in systems that use tickets.", + ), + ) + .describe( + "Description of the HITL session. This corresponds to a ticket description in systems that use tickets.", + ), + hitlSession: z + .optional( + z + .ref("hitlSession") + .title("Extra configuration") + .describe("Configuration of the HITL session"), + ) + .describe("Configuration of the HITL session"), + messageHistory: z + .array( + z.union([ + z + .object({ + source: z.union([ + z + .object({ + type: z.literal("user"), + userId: z.string(), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("bot"), + }) + .catchall(z.never()), + ]), + type: z.literal("text"), + payload: z + .object({ + text: z.string().min(1, undefined), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + source: z.union([ + z + .object({ + type: z.literal("user"), + userId: z.string(), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("bot"), + }) + .catchall(z.never()), + ]), + type: z.literal("image"), + payload: z + .object({ + imageUrl: z.string().min(1, undefined), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + source: z.union([ + z + .object({ + type: z.literal("user"), + userId: z.string(), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("bot"), + }) + .catchall(z.never()), + ]), + type: z.literal("audio"), + payload: z + .object({ + audioUrl: z.string().min(1, undefined), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + source: z.union([ + z + .object({ + type: z.literal("user"), + userId: z.string(), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("bot"), + }) + .catchall(z.never()), + ]), + type: z.literal("video"), + payload: z + .object({ + videoUrl: z.string().min(1, undefined), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + source: z.union([ + z + .object({ + type: z.literal("user"), + userId: z.string(), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("bot"), + }) + .catchall(z.never()), + ]), + type: z.literal("file"), + payload: z + .object({ + fileUrl: z.string().min(1, undefined), + title: z.optional(z.string().min(1, undefined)), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + source: z.union([ + z + .object({ + type: z.literal("user"), + userId: z.string(), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("bot"), + }) + .catchall(z.never()), + ]), + type: z.literal("location"), + payload: z + .object({ + latitude: z.number(), + longitude: z.number(), + address: z.optional(z.string()), + title: z.optional(z.string()), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + source: z.union([ + z + .object({ + type: z.literal("user"), + userId: z.string(), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("bot"), + }) + .catchall(z.never()), + ]), + type: z.literal("carousel"), + payload: z + .object({ + items: z.array( + z + .object({ + title: z.string().min(1, undefined), + subtitle: z.optional(z.string().min(1, undefined)), + imageUrl: z.optional(z.string().min(1, undefined)), + actions: z.array( + z + .object({ + action: z.enum(["postback", "url", "say"]), + label: z.string().min(1, undefined), + value: z.string().min(1, undefined), + }) + .catchall(z.never()), + ), + }) + .catchall(z.never()), + ), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + source: z.union([ + z + .object({ + type: z.literal("user"), + userId: z.string(), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("bot"), + }) + .catchall(z.never()), + ]), + type: z.literal("card"), + payload: z + .object({ + title: z.string().min(1, undefined), + subtitle: z.optional(z.string().min(1, undefined)), + imageUrl: z.optional(z.string().min(1, undefined)), + actions: z.array( + z + .object({ + action: z.enum(["postback", "url", "say"]), + label: z.string().min(1, undefined), + value: z.string().min(1, undefined), + }) + .catchall(z.never()), + ), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + source: z.union([ + z + .object({ + type: z.literal("user"), + userId: z.string(), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("bot"), + }) + .catchall(z.never()), + ]), + type: z.literal("dropdown"), + payload: z + .object({ + text: z.string().min(1, undefined), + options: z.array( + z + .object({ + label: z.string().min(1, undefined), + value: z.string().min(1, undefined), + }) + .catchall(z.never()), + ), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + source: z.union([ + z + .object({ + type: z.literal("user"), + userId: z.string(), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("bot"), + }) + .catchall(z.never()), + ]), + type: z.literal("choice"), + payload: z + .object({ + text: z.string().min(1, undefined), + options: z.array( + z + .object({ + label: z.string().min(1, undefined), + value: z.string().min(1, undefined), + }) + .catchall(z.never()), + ), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + source: z.union([ + z + .object({ + type: z.literal("user"), + userId: z.string(), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("bot"), + }) + .catchall(z.never()), + ]), + type: z.literal("bloc"), + payload: z + .object({ + items: z.array( + z.union([ + z + .object({ + type: z.literal("text"), + payload: z + .object({ + text: z.string().min(1, undefined), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("image"), + payload: z + .object({ + imageUrl: z.string().min(1, undefined), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("audio"), + payload: z + .object({ + audioUrl: z.string().min(1, undefined), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("video"), + payload: z + .object({ + videoUrl: z.string().min(1, undefined), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("file"), + payload: z + .object({ + fileUrl: z.string().min(1, undefined), + title: z.optional(z.string().min(1, undefined)), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("location"), + payload: z + .object({ + latitude: z.number(), + longitude: z.number(), + address: z.optional(z.string()), + title: z.optional(z.string()), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("markdown"), + payload: z + .object({ + markdown: z.string().min(1, undefined), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + ]), + ), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + source: z.union([ + z + .object({ + type: z.literal("user"), + userId: z.string(), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("bot"), + }) + .catchall(z.never()), + ]), + type: z.literal("markdown"), + payload: z + .object({ + markdown: z.string().min(1, undefined), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + ]), + ) + .title("Conversation history") + .describe( + "History of all messages in the conversation up to this point. Should be displayed to the human agent in the external service.", + ), + }) + .catchall(z.never()), +}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/output.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/output.ts new file mode 100644 index 00000000..4a5cecca --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/output.ts @@ -0,0 +1,17 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import { z } from "@botpress/sdk"; +export const output = { + schema: z + .object({ + conversationId: z + .string() + .title("HITL session ID") + .describe( + "ID of the Botpress conversation representing the HITL session", + ), + }) + .catchall(z.never()), +}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/index.ts new file mode 100644 index 00000000..1a66be9b --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/index.ts @@ -0,0 +1,17 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. +import * as input from "./input"; +export * as input from "./input"; +import * as output from "./output"; +export * as output from "./output"; + +export const stopHitl = { + "input": input.input, + "output": output.output, + "title": "Stop HITL session", + "description": "Stop an existing HITL session in the external service", + "billable": false, + "cacheable": false, + "attributes": { "bpActionHiddenInStudio": "true" }, +} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/input.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/input.ts new file mode 100644 index 00000000..a29d6d2d --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/input.ts @@ -0,0 +1,17 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import { z } from "@botpress/sdk"; +export const input = { + schema: z + .object({ + conversationId: z + .string() + .title("HITL session ID") + .describe( + "ID of the Botpress conversation representing the HITL session", + ), + }) + .catchall(z.never()), +}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/output.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/output.ts new file mode 100644 index 00000000..40360d7e --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/output.ts @@ -0,0 +1,8 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import { z } from "@botpress/sdk"; +export const output = { + schema: z.object({}).catchall(z.never()), +}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/index.ts new file mode 100644 index 00000000..d469cae8 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/index.ts @@ -0,0 +1,10 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import { messages } from './messages/index' +export * from './messages/index' + +export const hitl = { + messages: messages, +} \ No newline at end of file diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/audio.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/audio.ts new file mode 100644 index 00000000..d36cc029 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/audio.ts @@ -0,0 +1,21 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import { z } from "@botpress/sdk"; +export const audio = { + schema: z + .object({ + audioUrl: z.string().min(1, undefined), + userId: z + .optional( + z + .string() + .describe( + "Allows sending a message pretending to be a certain user", + ), + ) + .describe("Allows sending a message pretending to be a certain user"), + }) + .catchall(z.never()), +}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/bloc.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/bloc.ts new file mode 100644 index 00000000..02f4c3a3 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/bloc.ts @@ -0,0 +1,98 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import { z } from "@botpress/sdk"; +export const bloc = { + schema: z + .object({ + items: z.array( + z.union([ + z + .object({ + type: z.literal("text"), + payload: z + .object({ + text: z.string().min(1, undefined), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("image"), + payload: z + .object({ + imageUrl: z.string().min(1, undefined), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("audio"), + payload: z + .object({ + audioUrl: z.string().min(1, undefined), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("video"), + payload: z + .object({ + videoUrl: z.string().min(1, undefined), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("file"), + payload: z + .object({ + fileUrl: z.string().min(1, undefined), + title: z.optional(z.string().min(1, undefined)), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("location"), + payload: z + .object({ + latitude: z.number(), + longitude: z.number(), + address: z.optional(z.string()), + title: z.optional(z.string()), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + z + .object({ + type: z.literal("markdown"), + payload: z + .object({ + markdown: z.string().min(1, undefined), + }) + .catchall(z.never()), + }) + .catchall(z.never()), + ]), + ), + userId: z + .optional( + z + .string() + .describe( + "Allows sending a message pretending to be a certain user", + ), + ) + .describe("Allows sending a message pretending to be a certain user"), + }) + .catchall(z.never()), +}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/file.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/file.ts new file mode 100644 index 00000000..8785faa0 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/file.ts @@ -0,0 +1,22 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import { z } from "@botpress/sdk"; +export const file = { + schema: z + .object({ + fileUrl: z.string().min(1, undefined), + title: z.optional(z.string().min(1, undefined)), + userId: z + .optional( + z + .string() + .describe( + "Allows sending a message pretending to be a certain user", + ), + ) + .describe("Allows sending a message pretending to be a certain user"), + }) + .catchall(z.never()), +}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/image.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/image.ts new file mode 100644 index 00000000..0c1b41ca --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/image.ts @@ -0,0 +1,21 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import { z } from "@botpress/sdk"; +export const image = { + schema: z + .object({ + imageUrl: z.string().min(1, undefined), + userId: z + .optional( + z + .string() + .describe( + "Allows sending a message pretending to be a certain user", + ), + ) + .describe("Allows sending a message pretending to be a certain user"), + }) + .catchall(z.never()), +}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/index.ts new file mode 100644 index 00000000..8e66ead8 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/index.ts @@ -0,0 +1,24 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. +import * as bloc from "./bloc"; +export * as bloc from "./bloc"; +import * as file from "./file"; +export * as file from "./file"; +import * as video from "./video"; +export * as video from "./video"; +import * as audio from "./audio"; +export * as audio from "./audio"; +import * as image from "./image"; +export * as image from "./image"; +import * as text from "./text"; +export * as text from "./text"; + +export const messages = { + "bloc": bloc.bloc, + "file": file.file, + "video": video.video, + "audio": audio.audio, + "image": image.image, + "text": text.text, +} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/text.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/text.ts new file mode 100644 index 00000000..9a72f99b --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/text.ts @@ -0,0 +1,21 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import { z } from "@botpress/sdk"; +export const text = { + schema: z + .object({ + text: z.string().min(1, undefined), + userId: z + .optional( + z + .string() + .describe( + "Allows sending a message pretending to be a certain user", + ), + ) + .describe("Allows sending a message pretending to be a certain user"), + }) + .catchall(z.never()), +}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/video.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/video.ts new file mode 100644 index 00000000..38a06be1 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/video.ts @@ -0,0 +1,21 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import { z } from "@botpress/sdk"; +export const video = { + schema: z + .object({ + videoUrl: z.string().min(1, undefined), + userId: z + .optional( + z + .string() + .describe( + "Allows sending a message pretending to be a certain user", + ), + ) + .describe("Allows sending a message pretending to be a certain user"), + }) + .catchall(z.never()), +}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/index.ts new file mode 100644 index 00000000..1f1b9785 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/index.ts @@ -0,0 +1,9 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. +import * as hitl from "./hitl/index"; +export * as hitl from "./hitl/index"; + +export const channels = { + "hitl": hitl.hitl, +} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/hitlSession.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/hitlSession.ts new file mode 100644 index 00000000..17219959 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/hitlSession.ts @@ -0,0 +1,11 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import { z } from "@botpress/sdk"; +export const hitlSession = { + title: "HITL session", + description: + "A HITL session, often referred to as a ticket or conversation in external systems", + schema: z.object({}).catchall(z.never()), +}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/index.ts new file mode 100644 index 00000000..ae3ca013 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/index.ts @@ -0,0 +1,9 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. +import * as hitlSession from "./hitlSession"; +export * as hitlSession from "./hitlSession"; + +export const entities = { + "hitlSession": hitlSession.hitlSession, +} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlAssigned.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlAssigned.ts new file mode 100644 index 00000000..5b537e34 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlAssigned.ts @@ -0,0 +1,24 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import { z } from "@botpress/sdk"; +export const hitlAssigned = { + attributes: { bpActionHiddenInStudio: "true" }, + schema: z + .object({ + conversationId: z + .string() + .title("HITL session ID") + .describe( + "ID of the Botpress conversation representing the HITL session", + ), + userId: z + .string() + .title("Human agent user ID") + .describe( + "ID of the Botpress user representing the human agent assigned to the HITL session", + ), + }) + .catchall(z.never()), +}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlStopped.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlStopped.ts new file mode 100644 index 00000000..89dbd737 --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlStopped.ts @@ -0,0 +1,18 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import { z } from "@botpress/sdk"; +export const hitlStopped = { + attributes: { bpActionHiddenInStudio: "true" }, + schema: z + .object({ + conversationId: z + .string() + .title("HITL session ID") + .describe( + "ID of the Botpress conversation representing the HITL session", + ), + }) + .catchall(z.never()), +}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/index.ts new file mode 100644 index 00000000..c46ec10c --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/index.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. +import * as hitlAssigned from "./hitlAssigned"; +export * as hitlAssigned from "./hitlAssigned"; +import * as hitlStopped from "./hitlStopped"; +export * as hitlStopped from "./hitlStopped"; + +export const events = { + "hitlAssigned": hitlAssigned.hitlAssigned, + "hitlStopped": hitlStopped.hitlStopped, +} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/index.ts new file mode 100644 index 00000000..19a22b2a --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/index.ts @@ -0,0 +1,24 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import * as sdk from "@botpress/sdk" + +import * as actions from "./actions/index" +import * as channels from "./channels/index" +import * as events from "./events/index" +import * as entities from "./entities/index" +export * as actions from "./actions/index" +export * as channels from "./channels/index" +export * as events from "./events/index" +export * as entities from "./entities/index" + +export default { + name: "hitl", + version: "2.0.0", + attributes: {}, + actions: actions.actions, + channels: channels.channels, + events: events.events, + entities: entities.entities, +} satisfies sdk.InterfacePackage["definition"] \ No newline at end of file diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/index.ts new file mode 100644 index 00000000..92e4f78e --- /dev/null +++ b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/index.ts @@ -0,0 +1,16 @@ +/* eslint-disable */ +/* tslint:disable */ +// This file is generated. Do not edit it manually. + +import * as sdk from "@botpress/sdk" + +import definition from "./definition" + +export default { + type: "interface", + id: "ifver_01K0STHY79Y0GFGFGDXXGQKDVE", + uri: undefined, + name: "hitl", + version: "2.0.0", + definition, +} satisfies sdk.InterfacePackage \ No newline at end of file From fd8e8014b79321994ec6eb2e7492a82d87b212b3 Mon Sep 17 00:00:00 2001 From: Eric Huang <110847840+erichugy@users.noreply.github.com> Date: Wed, 28 Jan 2026 11:42:31 -0500 Subject: [PATCH 09/13] chore: Stringify error if not of type Error Co-authored-by: Houssam Eddine Righi <94550978+Horisofine@users.noreply.github.com> --- integrations/zoho-sales-iq-hitl/src/setup/register.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/zoho-sales-iq-hitl/src/setup/register.ts b/integrations/zoho-sales-iq-hitl/src/setup/register.ts index e1e84de6..67f1a562 100644 --- a/integrations/zoho-sales-iq-hitl/src/setup/register.ts +++ b/integrations/zoho-sales-iq-hitl/src/setup/register.ts @@ -22,7 +22,7 @@ export const register: RegisterFunction = async ({ ctx, client, logger }) => { logger.info('Registering configuration...', appResponse) logger.info('Zoho configuration validated successfully.') } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : 'Unknown error' + const errorMessage = error instanceof Error ? error.message : String(error) logger.error('Error during integration registration:', errorMessage) throw new bpclient.RuntimeError('Configuration Error! Unable to retrieve app details.') } From 49cea387f77927d36fd39afbdf675cb9fb35d90b Mon Sep 17 00:00:00 2001 From: Eric Huang <110847840+erichugy@users.noreply.github.com> Date: Wed, 28 Jan 2026 11:43:48 -0500 Subject: [PATCH 10/13] chore: stringify error not of type Error Co-authored-by: Houssam Eddine Righi <94550978+Horisofine@users.noreply.github.com> --- integrations/zoho-sales-iq-hitl/src/actions/hitl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts index 561aaeab..6917d881 100644 --- a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts +++ b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts @@ -127,7 +127,7 @@ export const createUser: bp.IntegrationProps['actions']['createUser'] = async ({ userId: botpressUser.id, } } catch (error) { - const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred' + const errorMessage = error instanceof Error ? error.message : String(error) throw new RuntimeError(errorMessage) } } From 4ff48b1d360871bd7cd3f8acbc04d90ce427b1a9 Mon Sep 17 00:00:00 2001 From: Eric Huang Date: Thu, 29 Jan 2026 11:17:58 -0500 Subject: [PATCH 11/13] refactor(client): replace RuntimeError throws with result-based error handling Remove RuntimeError throws in favor of returning result objects. Auto-refresh credentials when missing and set access token expiry to 1 hour. Simplify sendMessage and getApp methods to return structured result objects. Add note that Zoho refresh tokens never expire. --- .../definition/actions/createUser/index.ts | 17 - .../definition/actions/createUser/input.ts | 31 -- .../definition/actions/createUser/output.ts | 15 - .../hitl/definition/actions/index.ts | 15 - .../definition/actions/startHitl/index.ts | 17 - .../definition/actions/startHitl/input.ts | 457 ------------------ .../definition/actions/startHitl/output.ts | 17 - .../hitl/definition/actions/stopHitl/index.ts | 17 - .../hitl/definition/actions/stopHitl/input.ts | 17 - .../definition/actions/stopHitl/output.ts | 8 - .../hitl/definition/channels/hitl/index.ts | 10 - .../channels/hitl/messages/audio.ts | 21 - .../definition/channels/hitl/messages/bloc.ts | 98 ---- .../definition/channels/hitl/messages/file.ts | 22 - .../channels/hitl/messages/image.ts | 21 - .../channels/hitl/messages/index.ts | 24 - .../definition/channels/hitl/messages/text.ts | 21 - .../channels/hitl/messages/video.ts | 21 - .../hitl/definition/channels/index.ts | 9 - .../hitl/definition/entities/hitlSession.ts | 11 - .../hitl/definition/entities/index.ts | 9 - .../hitl/definition/events/hitlAssigned.ts | 24 - .../hitl/definition/events/hitlStopped.ts | 18 - .../hitl/definition/events/index.ts | 12 - .../bp_modules/hitl/definition/index.ts | 24 - .../bp_modules/hitl/index.ts | 16 - .../zoho-sales-iq-hitl/src/actions/hitl.ts | 38 +- integrations/zoho-sales-iq-hitl/src/client.ts | 65 +-- .../src/definitions/index.ts | 1 + .../zoho-sales-iq-hitl/src/setup/register.ts | 40 +- .../src/utils/validation.ts | 2 +- 31 files changed, 74 insertions(+), 1044 deletions(-) delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/input.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/output.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/input.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/output.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/input.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/output.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/audio.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/bloc.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/file.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/image.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/text.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/video.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/hitlSession.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlAssigned.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlStopped.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/index.ts delete mode 100644 integrations/zoho-sales-iq-hitl/bp_modules/hitl/index.ts diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/index.ts deleted file mode 100644 index f5f4eaa1..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. -import * as input from "./input"; -export * as input from "./input"; -import * as output from "./output"; -export * as output from "./output"; - -export const createUser = { - "input": input.input, - "output": output.output, - "title": "Create external user", - "description": "Create an end user in the external service and in Botpress", - "billable": false, - "cacheable": false, - "attributes": { "bpActionHiddenInStudio": "true" }, -} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/input.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/input.ts deleted file mode 100644 index 8220a789..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/input.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const input = { - schema: z - .object({ - name: z - .string() - .title("Display name") - .describe("Display name of the end user"), - pictureUrl: z - .optional( - z - .string() - .title("Picture URL") - .describe("URL of the end user\'s avatar"), - ) - .describe("URL of the end user\'s avatar"), - email: z - .optional( - z - .string() - .title("Email address") - .describe("Email address of the end user"), - ) - .describe("Email address of the end user"), - }) - .catchall(z.never()), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/output.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/output.ts deleted file mode 100644 index 6a62321f..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/createUser/output.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const output = { - schema: z - .object({ - userId: z - .string() - .title("Botpress user ID") - .describe("ID of the Botpress user representing the end user"), - }) - .catchall(z.never()), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/index.ts deleted file mode 100644 index ac93a788..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. -import * as createUser from "./createUser/index"; -export * as createUser from "./createUser/index"; -import * as startHitl from "./startHitl/index"; -export * as startHitl from "./startHitl/index"; -import * as stopHitl from "./stopHitl/index"; -export * as stopHitl from "./stopHitl/index"; - -export const actions = { - "createUser": createUser.createUser, - "startHitl": startHitl.startHitl, - "stopHitl": stopHitl.stopHitl, -} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/index.ts deleted file mode 100644 index 44ad701e..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. -import * as input from "./input"; -export * as input from "./input"; -import * as output from "./output"; -export * as output from "./output"; - -export const startHitl = { - "input": input.input, - "output": output.output, - "title": "Start new HITL session", - "description": "Create a new HITL session in the external service and in Botpress", - "billable": false, - "cacheable": false, - "attributes": { "bpActionHiddenInStudio": "true" }, -} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/input.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/input.ts deleted file mode 100644 index 5794ed04..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/input.ts +++ /dev/null @@ -1,457 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const input = { - schema: z - .object({ - userId: z - .string() - .title("User ID") - .describe("ID of the Botpress user representing the end user"), - title: z - .optional( - z - .string() - .title("Title") - .describe( - "Title of the HITL session. This corresponds to a ticket title in systems that use tickets.", - ), - ) - .describe( - "Title of the HITL session. This corresponds to a ticket title in systems that use tickets.", - ), - description: z - .optional( - z - .string() - .title("Description") - .describe( - "Description of the HITL session. This corresponds to a ticket description in systems that use tickets.", - ), - ) - .describe( - "Description of the HITL session. This corresponds to a ticket description in systems that use tickets.", - ), - hitlSession: z - .optional( - z - .ref("hitlSession") - .title("Extra configuration") - .describe("Configuration of the HITL session"), - ) - .describe("Configuration of the HITL session"), - messageHistory: z - .array( - z.union([ - z - .object({ - source: z.union([ - z - .object({ - type: z.literal("user"), - userId: z.string(), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("bot"), - }) - .catchall(z.never()), - ]), - type: z.literal("text"), - payload: z - .object({ - text: z.string().min(1, undefined), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - source: z.union([ - z - .object({ - type: z.literal("user"), - userId: z.string(), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("bot"), - }) - .catchall(z.never()), - ]), - type: z.literal("image"), - payload: z - .object({ - imageUrl: z.string().min(1, undefined), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - source: z.union([ - z - .object({ - type: z.literal("user"), - userId: z.string(), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("bot"), - }) - .catchall(z.never()), - ]), - type: z.literal("audio"), - payload: z - .object({ - audioUrl: z.string().min(1, undefined), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - source: z.union([ - z - .object({ - type: z.literal("user"), - userId: z.string(), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("bot"), - }) - .catchall(z.never()), - ]), - type: z.literal("video"), - payload: z - .object({ - videoUrl: z.string().min(1, undefined), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - source: z.union([ - z - .object({ - type: z.literal("user"), - userId: z.string(), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("bot"), - }) - .catchall(z.never()), - ]), - type: z.literal("file"), - payload: z - .object({ - fileUrl: z.string().min(1, undefined), - title: z.optional(z.string().min(1, undefined)), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - source: z.union([ - z - .object({ - type: z.literal("user"), - userId: z.string(), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("bot"), - }) - .catchall(z.never()), - ]), - type: z.literal("location"), - payload: z - .object({ - latitude: z.number(), - longitude: z.number(), - address: z.optional(z.string()), - title: z.optional(z.string()), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - source: z.union([ - z - .object({ - type: z.literal("user"), - userId: z.string(), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("bot"), - }) - .catchall(z.never()), - ]), - type: z.literal("carousel"), - payload: z - .object({ - items: z.array( - z - .object({ - title: z.string().min(1, undefined), - subtitle: z.optional(z.string().min(1, undefined)), - imageUrl: z.optional(z.string().min(1, undefined)), - actions: z.array( - z - .object({ - action: z.enum(["postback", "url", "say"]), - label: z.string().min(1, undefined), - value: z.string().min(1, undefined), - }) - .catchall(z.never()), - ), - }) - .catchall(z.never()), - ), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - source: z.union([ - z - .object({ - type: z.literal("user"), - userId: z.string(), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("bot"), - }) - .catchall(z.never()), - ]), - type: z.literal("card"), - payload: z - .object({ - title: z.string().min(1, undefined), - subtitle: z.optional(z.string().min(1, undefined)), - imageUrl: z.optional(z.string().min(1, undefined)), - actions: z.array( - z - .object({ - action: z.enum(["postback", "url", "say"]), - label: z.string().min(1, undefined), - value: z.string().min(1, undefined), - }) - .catchall(z.never()), - ), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - source: z.union([ - z - .object({ - type: z.literal("user"), - userId: z.string(), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("bot"), - }) - .catchall(z.never()), - ]), - type: z.literal("dropdown"), - payload: z - .object({ - text: z.string().min(1, undefined), - options: z.array( - z - .object({ - label: z.string().min(1, undefined), - value: z.string().min(1, undefined), - }) - .catchall(z.never()), - ), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - source: z.union([ - z - .object({ - type: z.literal("user"), - userId: z.string(), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("bot"), - }) - .catchall(z.never()), - ]), - type: z.literal("choice"), - payload: z - .object({ - text: z.string().min(1, undefined), - options: z.array( - z - .object({ - label: z.string().min(1, undefined), - value: z.string().min(1, undefined), - }) - .catchall(z.never()), - ), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - source: z.union([ - z - .object({ - type: z.literal("user"), - userId: z.string(), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("bot"), - }) - .catchall(z.never()), - ]), - type: z.literal("bloc"), - payload: z - .object({ - items: z.array( - z.union([ - z - .object({ - type: z.literal("text"), - payload: z - .object({ - text: z.string().min(1, undefined), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("image"), - payload: z - .object({ - imageUrl: z.string().min(1, undefined), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("audio"), - payload: z - .object({ - audioUrl: z.string().min(1, undefined), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("video"), - payload: z - .object({ - videoUrl: z.string().min(1, undefined), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("file"), - payload: z - .object({ - fileUrl: z.string().min(1, undefined), - title: z.optional(z.string().min(1, undefined)), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("location"), - payload: z - .object({ - latitude: z.number(), - longitude: z.number(), - address: z.optional(z.string()), - title: z.optional(z.string()), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("markdown"), - payload: z - .object({ - markdown: z.string().min(1, undefined), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - ]), - ), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - source: z.union([ - z - .object({ - type: z.literal("user"), - userId: z.string(), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("bot"), - }) - .catchall(z.never()), - ]), - type: z.literal("markdown"), - payload: z - .object({ - markdown: z.string().min(1, undefined), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - ]), - ) - .title("Conversation history") - .describe( - "History of all messages in the conversation up to this point. Should be displayed to the human agent in the external service.", - ), - }) - .catchall(z.never()), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/output.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/output.ts deleted file mode 100644 index 4a5cecca..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/startHitl/output.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const output = { - schema: z - .object({ - conversationId: z - .string() - .title("HITL session ID") - .describe( - "ID of the Botpress conversation representing the HITL session", - ), - }) - .catchall(z.never()), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/index.ts deleted file mode 100644 index 1a66be9b..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. -import * as input from "./input"; -export * as input from "./input"; -import * as output from "./output"; -export * as output from "./output"; - -export const stopHitl = { - "input": input.input, - "output": output.output, - "title": "Stop HITL session", - "description": "Stop an existing HITL session in the external service", - "billable": false, - "cacheable": false, - "attributes": { "bpActionHiddenInStudio": "true" }, -} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/input.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/input.ts deleted file mode 100644 index a29d6d2d..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/input.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const input = { - schema: z - .object({ - conversationId: z - .string() - .title("HITL session ID") - .describe( - "ID of the Botpress conversation representing the HITL session", - ), - }) - .catchall(z.never()), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/output.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/output.ts deleted file mode 100644 index 40360d7e..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/actions/stopHitl/output.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const output = { - schema: z.object({}).catchall(z.never()), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/index.ts deleted file mode 100644 index d469cae8..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { messages } from './messages/index' -export * from './messages/index' - -export const hitl = { - messages: messages, -} \ No newline at end of file diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/audio.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/audio.ts deleted file mode 100644 index d36cc029..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/audio.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const audio = { - schema: z - .object({ - audioUrl: z.string().min(1, undefined), - userId: z - .optional( - z - .string() - .describe( - "Allows sending a message pretending to be a certain user", - ), - ) - .describe("Allows sending a message pretending to be a certain user"), - }) - .catchall(z.never()), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/bloc.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/bloc.ts deleted file mode 100644 index 02f4c3a3..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/bloc.ts +++ /dev/null @@ -1,98 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const bloc = { - schema: z - .object({ - items: z.array( - z.union([ - z - .object({ - type: z.literal("text"), - payload: z - .object({ - text: z.string().min(1, undefined), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("image"), - payload: z - .object({ - imageUrl: z.string().min(1, undefined), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("audio"), - payload: z - .object({ - audioUrl: z.string().min(1, undefined), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("video"), - payload: z - .object({ - videoUrl: z.string().min(1, undefined), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("file"), - payload: z - .object({ - fileUrl: z.string().min(1, undefined), - title: z.optional(z.string().min(1, undefined)), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("location"), - payload: z - .object({ - latitude: z.number(), - longitude: z.number(), - address: z.optional(z.string()), - title: z.optional(z.string()), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - z - .object({ - type: z.literal("markdown"), - payload: z - .object({ - markdown: z.string().min(1, undefined), - }) - .catchall(z.never()), - }) - .catchall(z.never()), - ]), - ), - userId: z - .optional( - z - .string() - .describe( - "Allows sending a message pretending to be a certain user", - ), - ) - .describe("Allows sending a message pretending to be a certain user"), - }) - .catchall(z.never()), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/file.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/file.ts deleted file mode 100644 index 8785faa0..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/file.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const file = { - schema: z - .object({ - fileUrl: z.string().min(1, undefined), - title: z.optional(z.string().min(1, undefined)), - userId: z - .optional( - z - .string() - .describe( - "Allows sending a message pretending to be a certain user", - ), - ) - .describe("Allows sending a message pretending to be a certain user"), - }) - .catchall(z.never()), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/image.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/image.ts deleted file mode 100644 index 0c1b41ca..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/image.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const image = { - schema: z - .object({ - imageUrl: z.string().min(1, undefined), - userId: z - .optional( - z - .string() - .describe( - "Allows sending a message pretending to be a certain user", - ), - ) - .describe("Allows sending a message pretending to be a certain user"), - }) - .catchall(z.never()), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/index.ts deleted file mode 100644 index 8e66ead8..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. -import * as bloc from "./bloc"; -export * as bloc from "./bloc"; -import * as file from "./file"; -export * as file from "./file"; -import * as video from "./video"; -export * as video from "./video"; -import * as audio from "./audio"; -export * as audio from "./audio"; -import * as image from "./image"; -export * as image from "./image"; -import * as text from "./text"; -export * as text from "./text"; - -export const messages = { - "bloc": bloc.bloc, - "file": file.file, - "video": video.video, - "audio": audio.audio, - "image": image.image, - "text": text.text, -} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/text.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/text.ts deleted file mode 100644 index 9a72f99b..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/text.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const text = { - schema: z - .object({ - text: z.string().min(1, undefined), - userId: z - .optional( - z - .string() - .describe( - "Allows sending a message pretending to be a certain user", - ), - ) - .describe("Allows sending a message pretending to be a certain user"), - }) - .catchall(z.never()), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/video.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/video.ts deleted file mode 100644 index 38a06be1..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/hitl/messages/video.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const video = { - schema: z - .object({ - videoUrl: z.string().min(1, undefined), - userId: z - .optional( - z - .string() - .describe( - "Allows sending a message pretending to be a certain user", - ), - ) - .describe("Allows sending a message pretending to be a certain user"), - }) - .catchall(z.never()), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/index.ts deleted file mode 100644 index 1f1b9785..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/channels/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. -import * as hitl from "./hitl/index"; -export * as hitl from "./hitl/index"; - -export const channels = { - "hitl": hitl.hitl, -} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/hitlSession.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/hitlSession.ts deleted file mode 100644 index 17219959..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/hitlSession.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const hitlSession = { - title: "HITL session", - description: - "A HITL session, often referred to as a ticket or conversation in external systems", - schema: z.object({}).catchall(z.never()), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/index.ts deleted file mode 100644 index ae3ca013..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/entities/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. -import * as hitlSession from "./hitlSession"; -export * as hitlSession from "./hitlSession"; - -export const entities = { - "hitlSession": hitlSession.hitlSession, -} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlAssigned.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlAssigned.ts deleted file mode 100644 index 5b537e34..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlAssigned.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const hitlAssigned = { - attributes: { bpActionHiddenInStudio: "true" }, - schema: z - .object({ - conversationId: z - .string() - .title("HITL session ID") - .describe( - "ID of the Botpress conversation representing the HITL session", - ), - userId: z - .string() - .title("Human agent user ID") - .describe( - "ID of the Botpress user representing the human agent assigned to the HITL session", - ), - }) - .catchall(z.never()), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlStopped.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlStopped.ts deleted file mode 100644 index 89dbd737..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/hitlStopped.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import { z } from "@botpress/sdk"; -export const hitlStopped = { - attributes: { bpActionHiddenInStudio: "true" }, - schema: z - .object({ - conversationId: z - .string() - .title("HITL session ID") - .describe( - "ID of the Botpress conversation representing the HITL session", - ), - }) - .catchall(z.never()), -}; diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/index.ts deleted file mode 100644 index c46ec10c..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/events/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. -import * as hitlAssigned from "./hitlAssigned"; -export * as hitlAssigned from "./hitlAssigned"; -import * as hitlStopped from "./hitlStopped"; -export * as hitlStopped from "./hitlStopped"; - -export const events = { - "hitlAssigned": hitlAssigned.hitlAssigned, - "hitlStopped": hitlStopped.hitlStopped, -} diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/index.ts deleted file mode 100644 index 19a22b2a..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/definition/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import * as sdk from "@botpress/sdk" - -import * as actions from "./actions/index" -import * as channels from "./channels/index" -import * as events from "./events/index" -import * as entities from "./entities/index" -export * as actions from "./actions/index" -export * as channels from "./channels/index" -export * as events from "./events/index" -export * as entities from "./entities/index" - -export default { - name: "hitl", - version: "2.0.0", - attributes: {}, - actions: actions.actions, - channels: channels.channels, - events: events.events, - entities: entities.entities, -} satisfies sdk.InterfacePackage["definition"] \ No newline at end of file diff --git a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/index.ts b/integrations/zoho-sales-iq-hitl/bp_modules/hitl/index.ts deleted file mode 100644 index 92e4f78e..00000000 --- a/integrations/zoho-sales-iq-hitl/bp_modules/hitl/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -// This file is generated. Do not edit it manually. - -import * as sdk from "@botpress/sdk" - -import definition from "./definition" - -export default { - type: "interface", - id: "ifver_01K0STHY79Y0GFGFGDXXGQKDVE", - uri: undefined, - name: "hitl", - version: "2.0.0", - definition, -} satisfies sdk.InterfacePackage \ No newline at end of file diff --git a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts index 6917d881..34bbce2a 100644 --- a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts +++ b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts @@ -20,22 +20,19 @@ export const startHitl: bp.IntegrationProps['actions']['startHitl'] = async ({ c type: 'integration', }) - const { title, description = 'No description available' } = input + const { title, description} = input - if (title === undefined || title === null || title.trim() === '') { - throw new RuntimeError('Title is required to create a Zoho SalesIQ conversation') - } + const normalizedTitle = title?.trim() || 'Untitled Ticket' + const normalizedDescription = description?.trim() || 'No description available' - const result = await zohoClient.createConversation(state.payload.name, state.payload.email, title, description) + const result = await zohoClient.createConversation( + state.payload.name, + state.payload.email, + normalizedTitle, + normalizedDescription + ) - if ( - result.success === false || - result.success === undefined || - result.data === undefined || - result.data === null || - result.data.conversation_id === undefined || - result.data.conversation_id === '' - ) { + if ( result.success === false || result.data === null ) { const safeResultInfo = { success: result.success, conversationId: result.data?.conversation_id, @@ -47,16 +44,14 @@ export const startHitl: bp.IntegrationProps['actions']['startHitl'] = async ({ c const { conversation } = await client.getOrCreateConversation({ channel: 'hitl', - tags: { - id: `${result.data.conversation_id}`, - }, + tags: { id: `${result.data.conversation_id}` }, }) return { conversationId: conversation.id, } } catch (error) { - const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred' + const errorMessage = error instanceof Error ? error.message : String(error) logger.forBot().error(`'Create Conversation' exception: ${errorMessage}`) @@ -76,7 +71,7 @@ export const stopHitl: bp.IntegrationProps['actions']['stopHitl'] = async ({ ctx const salesIqConversationId: string | undefined = conversation.tags.id - if (salesIqConversationId === undefined || salesIqConversationId === '') { + if (!salesIqConversationId) { return {} } @@ -96,12 +91,11 @@ export const stopHitl: bp.IntegrationProps['actions']['stopHitl'] = async ({ ctx return {} } -export const createUser: bp.IntegrationProps['actions']['createUser'] = async ({ client, input, ctx, logger }) => { +export const createUser: bp.IntegrationProps['actions']['createUser'] = async ({ client, input, ctx }) => { try { - const { name = 'None', email = 'None', pictureUrl = 'None' } = input + const { name, email, pictureUrl } = input - if (email === null || email === undefined || email === '' || email === 'None') { - logger.forBot().error('Email necessary for HITL') + if (!email) { throw new RuntimeError('Email necessary for HITL') } diff --git a/integrations/zoho-sales-iq-hitl/src/client.ts b/integrations/zoho-sales-iq-hitl/src/client.ts index 98b15ca4..676af787 100644 --- a/integrations/zoho-sales-iq-hitl/src/client.ts +++ b/integrations/zoho-sales-iq-hitl/src/client.ts @@ -1,4 +1,3 @@ -import * as bpclient from '@botpress/client' import { IntegrationLogger } from '@botpress/sdk' import axios, { AxiosError } from 'axios' @@ -70,7 +69,7 @@ export class ZohoApi { this.zohoSalesIqServerURI = getZohoSalesIQUrl(this.dataCenter) } - async getStoredCredentials(): Promise<{ accessToken: string } | null> { + async getStoredCredentials(): Promise<{ accessToken: string; accessTokenExpiresAt: number } | null> { try { const { state } = await this.bpClient.getState({ id: this.ctx.integrationId, @@ -78,13 +77,14 @@ export class ZohoApi { type: 'integration', }) - if (!state?.payload?.accessToken) { + if (!state?.payload?.accessToken || typeof state?.payload?.accessTokenExpiresAt !== 'number') { logger.forBot().error('No credentials found in state') return null } return { accessToken: state.payload.accessToken, + accessTokenExpiresAt: state.payload.accessTokenExpiresAt, } } catch (error) { logger.forBot().error('Error retrieving credentials from state:', error) @@ -98,13 +98,21 @@ export class ZohoApi { data: JsonValue | null = null, params: JsonValue = {} ): Promise { - try { - const creds = await this.getStoredCredentials() + let creds = await this.getStoredCredentials() + + if (!creds) { + logger.forBot().info('Credentials missing, attempting refresh...') + const refreshResult = await this.refreshAccessToken() + if (!refreshResult.success) { + return { success: false, message: refreshResult.error ?? 'Authentication failed', data: null } + } + creds = await this.getStoredCredentials() if (!creds) { - logger.forBot().error('Error retrieving credentials.') - throw new bpclient.RuntimeError('Error grabbing credentials.') + return { success: false, message: 'Failed to retrieve credentials after refresh', data: null } } + } + try { const headers: Record = { Authorization: `Bearer ${creds.accessToken}`, Accept: 'application/json', @@ -134,7 +142,10 @@ export class ZohoApi { if (axiosError.response?.status === 401 || axiosError.response?.status === 400) { logger.forBot().warn('Access token expired. Refreshing...', error) - await this.refreshAccessToken() + const refreshResult = await this.refreshAccessToken() + if (!refreshResult.success) { + return { success: false, message: refreshResult.error ?? 'Authentication failed', data: null } + } return this.makeHitlRequest(endpoint, method, data, params) } @@ -159,7 +170,7 @@ export class ZohoApi { } } - async refreshAccessToken() { + async refreshAccessToken(): Promise<{ success: boolean; error?: string }> { try { const requestData = new URLSearchParams() requestData.append('client_id', this.clientId) @@ -180,17 +191,20 @@ export class ZohoApi { const parsed = OAuthTokenResponseSchema.safeParse(response.data) if (!parsed.success) { logger.forBot().error('Invalid OAuth token response:', parsed.error) - throw new bpclient.RuntimeError('Invalid OAuth token response from Zoho') + return { success: false, error: 'Invalid OAuth token response from Zoho' } } + // NOTE: Zoho refresh tokens never expire, only access tokens do await this.bpClient.setState({ id: this.ctx.integrationId, type: 'integration', name: 'credentials', payload: { accessToken: parsed.data.access_token, + accessTokenExpiresAt: Date.now() + 60 * 60 * 1000, // 1 hour }, }) + return { success: true } } catch (error) { if (axios.isAxiosError(error)) { logger.forBot().error('Error refreshing access token:', error.response?.data ?? error.message) @@ -199,7 +213,7 @@ export class ZohoApi { .forBot() .error('Error refreshing access token:', error instanceof Error ? error.message : 'Unknown error') } - throw new bpclient.RuntimeError('Authentication error. Please reauthorize the integration.') + return { success: false, error: 'Authentication error. Please reauthorize the integration.' } } } @@ -239,36 +253,29 @@ export class ZohoApi { public async sendMessage(conversationId: string, message: string) { const endpoint = `${this.zohoSalesIqServerURI}/api/visitor/v1/${this.ctx.configuration.screenName}/conversations/${conversationId}/messages` + const response = await this.makeHitlRequest(endpoint, 'POST', { text: message }) - const payload = { text: message } - - try { - const response = await this.makeHitlRequest(endpoint, 'POST', payload) - - if (!response.success) { - logger.forBot().error('Failed to send message:', response.message) - } else { - logger.forBot().info('Message sent successfully:', response.data) - } - - return response - } catch (error) { - logger.forBot().error('Error sending message to Zoho SalesIQ:', error) - throw error + if (!response.success) { + logger.forBot().error('Failed to send message:', response.message) } + return response } - public async getApp(): Promise { + public async getApp(): Promise<{ success: boolean; data: AppConfigData | null; message: string }> { const response = await this.makeHitlRequest( `${this.zohoSalesIqServerURI}/api/v2/${this.ctx.configuration.screenName}/apps/${this.ctx.configuration.appId}` ) + if (!response.success) { + return { success: false, data: null, message: response.message } + } + const parsed = ZohoAppConfigResponseSchema.safeParse(response.data) if (!parsed.success) { logger.forBot().error('Invalid app config response:', parsed.error) - throw new bpclient.RuntimeError('Invalid app config response from Zoho SalesIQ') + return { success: false, data: null, message: 'Invalid app config response from Zoho SalesIQ' } } - return parsed.data.data + return { success: true, data: parsed.data.data, message: 'App config retrieved' } } } diff --git a/integrations/zoho-sales-iq-hitl/src/definitions/index.ts b/integrations/zoho-sales-iq-hitl/src/definitions/index.ts index 379ac04f..06e72b73 100644 --- a/integrations/zoho-sales-iq-hitl/src/definitions/index.ts +++ b/integrations/zoho-sales-iq-hitl/src/definitions/index.ts @@ -14,6 +14,7 @@ export const states = { type: 'integration', schema: z.object({ accessToken: z.string(), + accessTokenExpiresAt: z.number(), }), }, userInfo: { diff --git a/integrations/zoho-sales-iq-hitl/src/setup/register.ts b/integrations/zoho-sales-iq-hitl/src/setup/register.ts index 67f1a562..d34affc9 100644 --- a/integrations/zoho-sales-iq-hitl/src/setup/register.ts +++ b/integrations/zoho-sales-iq-hitl/src/setup/register.ts @@ -1,29 +1,29 @@ -import * as bpclient from '@botpress/client' +import {RuntimeError} from '@botpress/sdk' import type { RegisterFunction } from '../misc/types' import { getClient } from 'src/client' export const register: RegisterFunction = async ({ ctx, client, logger }) => { - try { - const zohoClient = getClient( - ctx.configuration.refreshToken, - ctx.configuration.clientId, - ctx.configuration.clientSecret, - ctx.configuration.dataCenter, - ctx, - client - ) + const zohoClient = getClient( + ctx.configuration.refreshToken, + ctx.configuration.clientId, + ctx.configuration.clientSecret, + ctx.configuration.dataCenter, + ctx, + client + ) - await zohoClient.refreshAccessToken() - - // Validate Zoho Configuration - const appResponse = await zohoClient.getApp() + const refreshResult = await zohoClient.refreshAccessToken() + if (!refreshResult.success) { + throw new RuntimeError(refreshResult.error ?? 'Authentication error. Please reauthorize the integration.') + } - logger.info('Registering configuration...', appResponse) - logger.info('Zoho configuration validated successfully.') - } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : String(error) - logger.error('Error during integration registration:', errorMessage) - throw new bpclient.RuntimeError('Configuration Error! Unable to retrieve app details.') + // Validate Zoho Configuration + const appResponse = await zohoClient.getApp() + if (!appResponse.success) { + throw new RuntimeError('Configuration Error! Unable to retrieve app details.') } + + logger.info('Registering configuration...', appResponse.data) + logger.info('Zoho configuration validated successfully.') } diff --git a/integrations/zoho-sales-iq-hitl/src/utils/validation.ts b/integrations/zoho-sales-iq-hitl/src/utils/validation.ts index 470e59ec..1a0e8840 100644 --- a/integrations/zoho-sales-iq-hitl/src/utils/validation.ts +++ b/integrations/zoho-sales-iq-hitl/src/utils/validation.ts @@ -1,7 +1,7 @@ import { RuntimeError } from '@botpress/client' const validateTag = (errorPrefix: string, tagValue: string | number | undefined): string => { - if (tagValue === undefined || tagValue === null) { + if (tagValue === undefined) { throw new RuntimeError(`${errorPrefix}: tagValue is required`) } const stringValue = String(tagValue).trim() From 4b9a4aa5f1713a185331e8f255e7ab2dd2be0639 Mon Sep 17 00:00:00 2001 From: Eric Huang Date: Thu, 29 Jan 2026 11:21:39 -0500 Subject: [PATCH 12/13] style(hitl): format code for consistency --- integrations/zoho-sales-iq-hitl/src/actions/hitl.ts | 4 ++-- integrations/zoho-sales-iq-hitl/src/setup/register.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts index 34bbce2a..905fb1de 100644 --- a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts +++ b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts @@ -20,7 +20,7 @@ export const startHitl: bp.IntegrationProps['actions']['startHitl'] = async ({ c type: 'integration', }) - const { title, description} = input + const { title, description } = input const normalizedTitle = title?.trim() || 'Untitled Ticket' const normalizedDescription = description?.trim() || 'No description available' @@ -32,7 +32,7 @@ export const startHitl: bp.IntegrationProps['actions']['startHitl'] = async ({ c normalizedDescription ) - if ( result.success === false || result.data === null ) { + if (result.success === false || result.data === null) { const safeResultInfo = { success: result.success, conversationId: result.data?.conversation_id, diff --git a/integrations/zoho-sales-iq-hitl/src/setup/register.ts b/integrations/zoho-sales-iq-hitl/src/setup/register.ts index d34affc9..8e3da746 100644 --- a/integrations/zoho-sales-iq-hitl/src/setup/register.ts +++ b/integrations/zoho-sales-iq-hitl/src/setup/register.ts @@ -1,4 +1,4 @@ -import {RuntimeError} from '@botpress/sdk' +import { RuntimeError } from '@botpress/sdk' import type { RegisterFunction } from '../misc/types' import { getClient } from 'src/client' From 1492658a365a58abaae00bb44a5bf73cfc7014be Mon Sep 17 00:00:00 2001 From: Eric Huang Date: Thu, 29 Jan 2026 13:39:00 -0500 Subject: [PATCH 13/13] fix(zoho-sales-iq-hitl): improve token refresh, error handling, and code structure --- .../zoho-sales-iq-hitl/src/actions/hitl.ts | 15 +-- integrations/zoho-sales-iq-hitl/src/client.ts | 32 ++++-- .../zoho-sales-iq-hitl/src/setup/handler.ts | 99 ++++++++++--------- 3 files changed, 88 insertions(+), 58 deletions(-) diff --git a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts index 905fb1de..a18cd687 100644 --- a/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts +++ b/integrations/zoho-sales-iq-hitl/src/actions/hitl.ts @@ -1,5 +1,4 @@ -import { RuntimeError } from '@botpress/client' - +import { RuntimeError } from '@botpress/sdk' import { getClient } from '../client' import * as bp from '.botpress' @@ -37,9 +36,13 @@ export const startHitl: bp.IntegrationProps['actions']['startHitl'] = async ({ c success: result.success, conversationId: result.data?.conversation_id, } - throw new RuntimeError( - 'Failed to create a conversation with Zoho SalesIQ. Result: ' + JSON.stringify(safeResultInfo, null, 2) - ) + return { + success: false, + message: + 'Failed to create a conversation with Zoho SalesIQ. Result: ' + JSON.stringify(safeResultInfo, null, 2), + data: null, + conversationId: 'error_conversation_id', + } } const { conversation } = await client.getOrCreateConversation({ @@ -84,7 +87,7 @@ export const stopHitl: bp.IntegrationProps['actions']['stopHitl'] = async ({ ctx client ) - zohoClient.sendMessage(salesIqConversationId, 'Botpress HITL terminated.') + await zohoClient.sendMessage(salesIqConversationId, 'Botpress HITL terminated.') logger.forBot().info('Botpress HITL terminated.') diff --git a/integrations/zoho-sales-iq-hitl/src/client.ts b/integrations/zoho-sales-iq-hitl/src/client.ts index 676af787..4053866b 100644 --- a/integrations/zoho-sales-iq-hitl/src/client.ts +++ b/integrations/zoho-sales-iq-hitl/src/client.ts @@ -96,22 +96,36 @@ export class ZohoApi { endpoint: string, method: string = 'GET', data: JsonValue | null = null, - params: JsonValue = {} + params: JsonValue = {}, + retryCount: number = 0 ): Promise { let creds = await this.getStoredCredentials() - if (!creds) { - logger.forBot().info('Credentials missing, attempting refresh...') + // Refresh token if credentials are missing or expired + const needsRefresh = !creds || (creds.accessTokenExpiresAt && Date.now() >= creds.accessTokenExpiresAt) + if (needsRefresh) { + logger + .forBot() + .info( + creds + ? 'Stored access token appears expired, attempting refresh before request...' + : 'Credentials missing, attempting refresh...' + ) const refreshResult = await this.refreshAccessToken() if (!refreshResult.success) { return { success: false, message: refreshResult.error ?? 'Authentication failed', data: null } } creds = await this.getStoredCredentials() if (!creds) { - return { success: false, message: 'Failed to retrieve credentials after refresh', data: null } + return { success: false, message: 'Failed to retrieve credentials after token refresh', data: null } } } + // At this point, creds is guaranteed to be non-null (either from initial fetch or after refresh) + if (!creds) { + return { success: false, message: 'No credentials available', data: null } + } + try { const headers: Record = { Authorization: `Bearer ${creds.accessToken}`, @@ -140,13 +154,19 @@ export class ZohoApi { logger.forBot().error(axiosError.response) if (axiosError.response?.status === 401 || axiosError.response?.status === 400) { + // Prevent infinite retry loops - only retry once + if (retryCount >= 1) { + logger.forBot().error('Token refresh failed after retry. Authentication error persists.') + return { success: false, message: 'Authentication failed after token refresh retry', data: null } + } + logger.forBot().warn('Access token expired. Refreshing...', error) const refreshResult = await this.refreshAccessToken() if (!refreshResult.success) { return { success: false, message: refreshResult.error ?? 'Authentication failed', data: null } } - return this.makeHitlRequest(endpoint, method, data, params) + return this.makeHitlRequest(endpoint, method, data, params, retryCount + 1) } const errorMessage = axiosError.response?.data?.message ?? axiosError.message @@ -201,7 +221,7 @@ export class ZohoApi { name: 'credentials', payload: { accessToken: parsed.data.access_token, - accessTokenExpiresAt: Date.now() + 60 * 60 * 1000, // 1 hour + accessTokenExpiresAt: Date.now() + parsed.data.expires_in_sec * 1000, }, }) return { success: true } diff --git a/integrations/zoho-sales-iq-hitl/src/setup/handler.ts b/integrations/zoho-sales-iq-hitl/src/setup/handler.ts index 88179f84..5cb31846 100644 --- a/integrations/zoho-sales-iq-hitl/src/setup/handler.ts +++ b/integrations/zoho-sales-iq-hitl/src/setup/handler.ts @@ -30,57 +30,64 @@ export const handler: bp.IntegrationProps['handler'] = async ({ req, logger, cli const validationErrors: Array<{ eventType: string; issues: unknown[] }> = [] - const operatorReplied = OperatorRepliedEventSchema.safeParse(rawPayload) - if (operatorReplied.success) { - await handleOperatorReplied({ salesIqEvent: operatorReplied.data, client }) - return - } else if (payloadEvent === 'conversation.operator.replied') { - validationErrors.push({ - eventType: 'conversation.operator.replied', - issues: operatorReplied.error.issues, - }) - } - - const attenderUpdated = AttenderUpdatedEventSchema.safeParse(rawPayload) - if (attenderUpdated.success) { - await handleOperatorAssignedUpdate({ salesIqEvent: attenderUpdated.data, client }) - return - } else if (payloadEvent === 'conversation.attender.updated') { - validationErrors.push({ - eventType: 'conversation.attender.updated', - issues: attenderUpdated.error.issues, - }) - } - - const conversationCompleted = ConversationCompletedEventSchema.safeParse(rawPayload) - if (conversationCompleted.success) { - await handleConversationCompleted({ salesIqEvent: conversationCompleted.data, client }) - return - } else if (payloadEvent === 'conversation.completed') { - validationErrors.push({ - eventType: 'conversation.completed', - issues: conversationCompleted.error.issues, - }) - } - - const conversationMissed = ConversationMissedEventSchema.safeParse(rawPayload) - if (conversationMissed.success) { - await handleConversationMissed({ salesIqEvent: conversationMissed.data, client }) - return - } else if (payloadEvent === 'conversation.missed') { - validationErrors.push({ - eventType: 'conversation.missed', - issues: conversationMissed.error.issues, - }) + switch (payloadEvent) { + case 'conversation.operator.replied': { + const operatorReplied = OperatorRepliedEventSchema.safeParse(rawPayload) + if (operatorReplied.success) { + await handleOperatorReplied({ salesIqEvent: operatorReplied.data, client }) + } else { + validationErrors.push({ + eventType: payloadEvent, + issues: operatorReplied.error.issues, + }) + } + break + } + case 'conversation.attender.updated': { + const attenderUpdated = AttenderUpdatedEventSchema.safeParse(rawPayload) + if (attenderUpdated.success) { + await handleOperatorAssignedUpdate({ salesIqEvent: attenderUpdated.data, client }) + } else { + validationErrors.push({ + eventType: payloadEvent, + issues: attenderUpdated.error.issues, + }) + } + break + } + case 'conversation.completed': { + const conversationCompleted = ConversationCompletedEventSchema.safeParse(rawPayload) + if (conversationCompleted.success) { + await handleConversationCompleted({ salesIqEvent: conversationCompleted.data, client }) + } else { + validationErrors.push({ + eventType: payloadEvent, + issues: conversationCompleted.error.issues, + }) + } + break + } + case 'conversation.missed': { + const conversationMissed = ConversationMissedEventSchema.safeParse(rawPayload) + if (conversationMissed.success) { + await handleConversationMissed({ salesIqEvent: conversationMissed.data, client }) + } else { + validationErrors.push({ + eventType: payloadEvent, + issues: conversationMissed.error.issues, + }) + } + break + } + default: + logger.forBot().error('No handler found for event type', { payloadEvent }) + break } - // Only log if all validations failed if (validationErrors.length > 0) { - logger.forBot().warn('Event payload matched a known event type but failed validation', { + logger.forBot().error('Event payload matched a known event type but failed validation', { validationErrors, rawPayload, }) - } else { - logger.forBot().warn('Unrecognized event payload', { rawPayload }) } }