@botonic/core 0.47.0 → 0.48.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,91 @@
1
+ import { type BotContext, type BotRequest, type BotSecrets, type BotSettings, type ContactInfo, type Input, type ProviderType, type ResolvedPlugins, type Session, type SessionUser } from '../models';
2
+ export declare const TEST_DEFAULTS: {
3
+ HUBTYPE_API_URL: string;
4
+ STATIC_URL: string;
5
+ LITELLM_API_URL: string;
6
+ AZURE_OPENAI_API_BASE: string;
7
+ AZURE_OPENAI_API_VERSION: string;
8
+ LANGUAGE_DETECTION_ENABLED: boolean;
9
+ HUBTYPE_ACCESS_TOKEN: string;
10
+ LITELLM_API_KEY: string;
11
+ AZURE_OPENAI_API_KEY: string;
12
+ ACCESS_TOKEN: string;
13
+ HUBTYPE_API_HOST: string;
14
+ FLOW_THREAD_ID: string;
15
+ BOT_ID: string;
16
+ USER_ID: string;
17
+ ORG_ID: string;
18
+ ORG_NAME: string;
19
+ PROVIDER: ProviderType;
20
+ LOCALE: string;
21
+ COUNTRY: string;
22
+ BOT_INTERACTION_ID: string;
23
+ MESSAGE_ID: string;
24
+ LAST_ROUTE_PATH: string;
25
+ };
26
+ export declare function createTestSettings(overrides?: Partial<BotSettings>): BotSettings;
27
+ export declare function createTestSecrets(overrides?: Partial<BotSecrets>): BotSecrets;
28
+ export interface TestUserOptions {
29
+ id?: string;
30
+ provider?: ProviderType;
31
+ locale?: string;
32
+ country?: string;
33
+ systemLocale?: string;
34
+ contactInfo?: ContactInfo[];
35
+ extraData?: Record<string, any>;
36
+ }
37
+ export declare function createTestSessionUser(options?: TestUserOptions): SessionUser<Record<string, any>>;
38
+ export interface TestSessionOptions {
39
+ user?: TestUserOptions;
40
+ botId?: string;
41
+ organization?: string;
42
+ organizationId?: string;
43
+ isFirstInteraction?: boolean;
44
+ isTestIntegration?: boolean;
45
+ accessToken?: string;
46
+ hubtypeApi?: string;
47
+ flowThreadId?: string;
48
+ retries?: number;
49
+ shadowing?: boolean;
50
+ hubtypeCaseId?: string;
51
+ captureUserInputNodeId?: string;
52
+ }
53
+ export declare function createTestSession(options?: TestSessionOptions): Session<Record<string, any>>;
54
+ export interface TestInputOptions {
55
+ type?: Input['type'];
56
+ data?: string;
57
+ text?: string;
58
+ payload?: string;
59
+ src?: string;
60
+ botInteractionId?: string;
61
+ messageId?: string;
62
+ context?: Input['context'];
63
+ transcript?: string;
64
+ }
65
+ export declare function createTestInput(options?: TestInputOptions): Input;
66
+ export interface TestBotRequestOptions {
67
+ input?: TestInputOptions | Input;
68
+ session?: TestSessionOptions | Session;
69
+ lastRoutePath?: string;
70
+ settings?: Partial<BotSettings> | BotSettings;
71
+ secrets?: Partial<BotSecrets> | BotSecrets;
72
+ }
73
+ export declare function createTestBotRequest(options?: TestBotRequestOptions): BotRequest;
74
+ export interface TestBotContextOptions<TPlugins extends ResolvedPlugins = ResolvedPlugins> extends TestBotRequestOptions {
75
+ plugins?: TPlugins;
76
+ params?: Record<string, string>;
77
+ defaultDelay?: number;
78
+ defaultTyping?: number;
79
+ }
80
+ export declare function createTestBotContext<TPlugins extends ResolvedPlugins = ResolvedPlugins>(options?: TestBotContextOptions<TPlugins>): BotContext<TPlugins>;
81
+ /**
82
+ * Alias for `createTestBotContext` typed as `PluginPreRequest`.
83
+ * PluginPreRequest === BotContext in @botonic/core.
84
+ */
85
+ export declare const createTestPluginPreRequest: typeof createTestBotContext;
86
+ export interface TestPluginPostRequestOptions<TPlugins extends ResolvedPlugins = ResolvedPlugins> extends TestBotContextOptions<TPlugins> {
87
+ response?: string | null;
88
+ }
89
+ export declare function createTestPluginPostRequest<TPlugins extends ResolvedPlugins = ResolvedPlugins>(options?: TestPluginPostRequestOptions<TPlugins>): BotContext<TPlugins> & {
90
+ response: string | null;
91
+ };
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTestPluginPreRequest = exports.TEST_DEFAULTS = void 0;
4
+ exports.createTestSettings = createTestSettings;
5
+ exports.createTestSecrets = createTestSecrets;
6
+ exports.createTestSessionUser = createTestSessionUser;
7
+ exports.createTestSession = createTestSession;
8
+ exports.createTestInput = createTestInput;
9
+ exports.createTestBotRequest = createTestBotRequest;
10
+ exports.createTestBotContext = createTestBotContext;
11
+ exports.createTestPluginPostRequest = createTestPluginPostRequest;
12
+ const models_1 = require("../models");
13
+ // ---------------------------------------------------------------------------
14
+ // Default values
15
+ // ---------------------------------------------------------------------------
16
+ exports.TEST_DEFAULTS = {
17
+ HUBTYPE_API_URL: 'https://api.hubtype.com',
18
+ STATIC_URL: 'https://static.hubtype.com',
19
+ LITELLM_API_URL: 'https://api.litellm.com',
20
+ AZURE_OPENAI_API_BASE: 'https://api.openai.com',
21
+ AZURE_OPENAI_API_VERSION: '2026-02-01',
22
+ LANGUAGE_DETECTION_ENABLED: true,
23
+ HUBTYPE_ACCESS_TOKEN: 'testAccessToken', // pragma: allowlist secret
24
+ LITELLM_API_KEY: 'testLiteLLMAPIKey', // pragma: allowlist secret
25
+ AZURE_OPENAI_API_KEY: 'testAzureOpenAIAPIKey', // pragma: allowlist secret
26
+ ACCESS_TOKEN: 'fake_access_token',
27
+ HUBTYPE_API_HOST: 'https://api.hubtype.com',
28
+ FLOW_THREAD_ID: 'testFlowThreadId',
29
+ BOT_ID: 'testBotId',
30
+ USER_ID: 'testUserId',
31
+ ORG_ID: 'testOrgId',
32
+ ORG_NAME: 'testOrg',
33
+ PROVIDER: models_1.PROVIDER.WEBCHAT,
34
+ LOCALE: 'en',
35
+ COUNTRY: 'US',
36
+ BOT_INTERACTION_ID: 'testInteractionId',
37
+ MESSAGE_ID: 'testMessageId',
38
+ LAST_ROUTE_PATH: '',
39
+ };
40
+ // ---------------------------------------------------------------------------
41
+ // Leaf factories
42
+ // ---------------------------------------------------------------------------
43
+ function createTestSettings(overrides) {
44
+ return {
45
+ HUBTYPE_API_URL: exports.TEST_DEFAULTS.HUBTYPE_API_URL,
46
+ STATIC_URL: exports.TEST_DEFAULTS.STATIC_URL,
47
+ LITELLM_API_URL: exports.TEST_DEFAULTS.LITELLM_API_URL,
48
+ AZURE_OPENAI_API_BASE: exports.TEST_DEFAULTS.AZURE_OPENAI_API_BASE,
49
+ AZURE_OPENAI_API_VERSION: exports.TEST_DEFAULTS.AZURE_OPENAI_API_VERSION,
50
+ LANGUAGE_DETECTION_ENABLED: exports.TEST_DEFAULTS.LANGUAGE_DETECTION_ENABLED,
51
+ CUSTOM_SHORT_URL_HOST: null,
52
+ custom: {},
53
+ ...overrides,
54
+ };
55
+ }
56
+ function createTestSecrets(overrides) {
57
+ return {
58
+ HUBTYPE_ACCESS_TOKEN: exports.TEST_DEFAULTS.HUBTYPE_ACCESS_TOKEN,
59
+ LITELLM_API_KEY: exports.TEST_DEFAULTS.LITELLM_API_KEY,
60
+ AZURE_OPENAI_API_KEY: exports.TEST_DEFAULTS.AZURE_OPENAI_API_KEY,
61
+ custom: {},
62
+ ...overrides,
63
+ };
64
+ }
65
+ function createTestSessionUser(options) {
66
+ const locale = options?.locale ?? exports.TEST_DEFAULTS.LOCALE;
67
+ const country = options?.country ?? exports.TEST_DEFAULTS.COUNTRY;
68
+ return {
69
+ id: options?.id ?? exports.TEST_DEFAULTS.USER_ID,
70
+ provider: options?.provider ?? exports.TEST_DEFAULTS.PROVIDER,
71
+ locale,
72
+ country,
73
+ system_locale: options?.systemLocale ?? locale,
74
+ contact_info: options?.contactInfo ?? [],
75
+ extra_data: options?.extraData ?? {},
76
+ };
77
+ }
78
+ function createTestSession(options) {
79
+ return {
80
+ bot: { id: options?.botId ?? exports.TEST_DEFAULTS.BOT_ID },
81
+ user: createTestSessionUser(options?.user),
82
+ organization: options?.organization ?? exports.TEST_DEFAULTS.ORG_NAME,
83
+ organization_id: options?.organizationId ?? exports.TEST_DEFAULTS.ORG_ID,
84
+ is_first_interaction: options?.isFirstInteraction ?? false,
85
+ is_test_integration: options?.isTestIntegration ?? false,
86
+ _access_token: options?.accessToken ?? exports.TEST_DEFAULTS.ACCESS_TOKEN,
87
+ _hubtype_api: options?.hubtypeApi ?? exports.TEST_DEFAULTS.HUBTYPE_API_HOST,
88
+ flow_thread_id: options?.flowThreadId ?? exports.TEST_DEFAULTS.FLOW_THREAD_ID,
89
+ __retries: options?.retries ?? 0,
90
+ _shadowing: options?.shadowing,
91
+ _hubtype_case_id: options?.hubtypeCaseId,
92
+ capture_user_input: options?.captureUserInputNodeId
93
+ ? { node_id: options.captureUserInputNodeId }
94
+ : undefined,
95
+ };
96
+ }
97
+ function createTestInput(options) {
98
+ return {
99
+ type: options?.type ?? models_1.INPUT.TEXT,
100
+ data: options?.data,
101
+ text: options?.text,
102
+ payload: options?.payload,
103
+ src: options?.src,
104
+ transcript: options?.transcript,
105
+ context: options?.context,
106
+ bot_interaction_id: options?.botInteractionId ?? exports.TEST_DEFAULTS.BOT_INTERACTION_ID,
107
+ message_id: options?.messageId ?? exports.TEST_DEFAULTS.MESSAGE_ID,
108
+ };
109
+ }
110
+ function isFullInput(v) {
111
+ return 'bot_interaction_id' in v && 'message_id' in v;
112
+ }
113
+ function isFullSession(v) {
114
+ return 'bot' in v && '__retries' in v;
115
+ }
116
+ function isFullSettings(v) {
117
+ return ('HUBTYPE_API_URL' in v &&
118
+ 'STATIC_URL' in v &&
119
+ 'LITELLM_API_URL' in v &&
120
+ 'AZURE_OPENAI_API_BASE' in v &&
121
+ 'AZURE_OPENAI_API_VERSION' in v &&
122
+ 'LANGUAGE_DETECTION_ENABLED' in v &&
123
+ 'CUSTOM_SHORT_URL_HOST' in v &&
124
+ 'custom' in v);
125
+ }
126
+ function isFullSecrets(v) {
127
+ return ('HUBTYPE_ACCESS_TOKEN' in v &&
128
+ 'LITELLM_API_KEY' in v &&
129
+ 'AZURE_OPENAI_API_KEY' in v &&
130
+ 'custom' in v);
131
+ }
132
+ function createTestBotRequest(options) {
133
+ const input = options?.input == null
134
+ ? createTestInput()
135
+ : isFullInput(options.input)
136
+ ? options.input
137
+ : createTestInput(options.input);
138
+ const session = options?.session == null
139
+ ? createTestSession()
140
+ : isFullSession(options.session)
141
+ ? options.session
142
+ : createTestSession(options.session);
143
+ const settings = options?.settings == null
144
+ ? createTestSettings()
145
+ : isFullSettings(options.settings)
146
+ ? options.settings
147
+ : createTestSettings(options.settings);
148
+ const secrets = options?.secrets == null
149
+ ? createTestSecrets()
150
+ : isFullSecrets(options.secrets)
151
+ ? options.secrets
152
+ : createTestSecrets(options.secrets);
153
+ return {
154
+ input,
155
+ session,
156
+ lastRoutePath: options?.lastRoutePath ?? exports.TEST_DEFAULTS.LAST_ROUTE_PATH,
157
+ settings,
158
+ secrets,
159
+ };
160
+ }
161
+ function createTestBotContext(options) {
162
+ const request = createTestBotRequest(options);
163
+ const sessionForLocale = options?.session == null
164
+ ? createTestSession()
165
+ : isFullSession(options.session)
166
+ ? options.session
167
+ : createTestSession(options.session);
168
+ const locale = sessionForLocale.user.locale;
169
+ const country = sessionForLocale.user.country;
170
+ const systemLocale = sessionForLocale.user.system_locale;
171
+ return {
172
+ ...request,
173
+ plugins: options?.plugins ?? {},
174
+ params: options?.params ?? {},
175
+ defaultDelay: options?.defaultDelay ?? 0,
176
+ defaultTyping: options?.defaultTyping ?? 0,
177
+ getUserLocale: () => locale,
178
+ getUserCountry: () => country,
179
+ getSystemLocale: () => systemLocale,
180
+ setUserLocale: () => undefined,
181
+ setUserCountry: () => undefined,
182
+ setSystemLocale: () => undefined,
183
+ };
184
+ }
185
+ /**
186
+ * Alias for `createTestBotContext` typed as `PluginPreRequest`.
187
+ * PluginPreRequest === BotContext in @botonic/core.
188
+ */
189
+ exports.createTestPluginPreRequest = createTestBotContext;
190
+ function createTestPluginPostRequest(options) {
191
+ return {
192
+ ...createTestBotContext(options),
193
+ response: options?.response ?? null,
194
+ };
195
+ }
196
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,20 @@
1
1
  {
2
2
  "name": "@botonic/core",
3
- "version": "0.47.0",
3
+ "version": "0.48.1",
4
4
  "license": "MIT",
5
5
  "description": "Build Chatbots using React",
6
6
  "main": "./lib/cjs/index.js",
7
7
  "module": "./lib/esm/index.js",
8
+ "exports": {
9
+ ".": {
10
+ "require": "./lib/cjs/index.js",
11
+ "import": "./lib/esm/index.js"
12
+ },
13
+ "./testing": {
14
+ "require": "./lib/cjs/testing/index.js",
15
+ "import": "./lib/esm/testing/index.js"
16
+ }
17
+ },
8
18
  "scripts": {
9
19
  "test": "../../node_modules/.bin/jest --coverage",
10
20
  "prepublishOnly": "rm -rf lib && npm i && npm run build",
@@ -29,9 +39,16 @@
29
39
  "index.d.ts",
30
40
  "README.md"
31
41
  ],
42
+ "typesVersions": {
43
+ "*": {
44
+ "testing": [
45
+ "./lib/cjs/testing/index.d.ts"
46
+ ]
47
+ }
48
+ },
32
49
  "dependencies": {
33
50
  "@babel/plugin-transform-runtime": "^7.25.9",
34
- "axios": "^1.13.6",
51
+ "axios": "^1.15.2",
35
52
  "pako": "^2.1.0",
36
53
  "process": "^0.11.10",
37
54
  "pusher-js": "^5.1.1"
package/src/core-bot.ts CHANGED
@@ -4,6 +4,8 @@ import {
4
4
  BotonicAction,
5
5
  type BotRequest,
6
6
  type BotResponse,
7
+ type BotSecrets,
8
+ type BotSettings,
7
9
  INPUT,
8
10
  type Input,
9
11
  type ProcessInputResult,
@@ -98,6 +100,9 @@ export class CoreBot {
98
100
 
99
101
  private getBotContext(request: BotRequest): BotContext {
100
102
  const { input, session, lastRoutePath } = request
103
+ const settings = this.getSettings(request)
104
+ const secrets = this.getSecrets(request)
105
+
101
106
  return {
102
107
  input,
103
108
  session,
@@ -114,7 +119,41 @@ export class CoreBot {
114
119
  setUserLocale: (locale: string) => this.setUserLocale(locale, session),
115
120
  setSystemLocale: (locale: string) =>
116
121
  this.setSystemLocale(locale, session),
122
+ settings,
123
+ secrets,
124
+ }
125
+ }
126
+
127
+ private getSettings(request: BotRequest): BotSettings {
128
+ if (!request.settings) {
129
+ // This only happens in local development
130
+ return {
131
+ HUBTYPE_API_URL: '',
132
+ STATIC_URL: '',
133
+ LITELLM_API_URL: '',
134
+ AZURE_OPENAI_API_BASE: '',
135
+ AZURE_OPENAI_API_VERSION: '',
136
+ CUSTOM_SHORT_URL_HOST: '',
137
+ LANGUAGE_DETECTION_ENABLED: false,
138
+ custom: {},
139
+ }
117
140
  }
141
+
142
+ return request.settings
143
+ }
144
+
145
+ private getSecrets(request: BotRequest): BotSecrets {
146
+ if (!request.secrets) {
147
+ // This only happens in local development
148
+ return {
149
+ HUBTYPE_ACCESS_TOKEN: '',
150
+ LITELLM_API_KEY: '',
151
+ AZURE_OPENAI_API_KEY: '',
152
+ custom: {},
153
+ }
154
+ }
155
+
156
+ return request.secrets
118
157
  }
119
158
 
120
159
  private async runInput(botContext: BotContext): Promise<BotResponse> {
@@ -126,6 +165,8 @@ export class CoreBot {
126
165
  input: botContext.input,
127
166
  session: botContext.session,
128
167
  lastRoutePath: botContext.lastRoutePath,
168
+ settings: botContext.settings,
169
+ secrets: botContext.secrets,
129
170
  response: [],
130
171
  }
131
172
  }
@@ -145,9 +186,11 @@ export class CoreBot {
145
186
 
146
187
  return {
147
188
  input: botContext.input,
148
- response,
149
189
  session: botContext.session,
150
190
  lastRoutePath: botContext.lastRoutePath,
191
+ settings: botContext.settings,
192
+ secrets: botContext.secrets,
193
+ response,
151
194
  }
152
195
  }
153
196
 
@@ -247,11 +290,13 @@ export class CoreBot {
247
290
 
248
291
  const followUp = await this.runInput(botContext)
249
292
 
250
- const response = {
293
+ const response: BotResponse = {
251
294
  input: followUp.input,
252
295
  response: previousResponse.response.concat(followUp.response),
253
296
  session: botContext.session,
254
297
  lastRoutePath: followUp.lastRoutePath,
298
+ settings: followUp.settings,
299
+ secrets: followUp.secrets,
255
300
  }
256
301
 
257
302
  // Recursive call to handle multiple bot actions in a row
@@ -241,6 +241,7 @@ export interface SessionUser<TExtraData = any> {
241
241
  locale: string
242
242
  country: string
243
243
  system_locale: string
244
+ system_locale_updated?: boolean
244
245
  }
245
246
 
246
247
  export interface HubtypeCaseContactReason {
@@ -334,6 +335,26 @@ export interface BotRequest<TExtraData = any> {
334
335
  input: Input
335
336
  lastRoutePath: RoutePath
336
337
  session: Session<TExtraData>
338
+ settings: BotSettings
339
+ secrets: BotSecrets
340
+ }
341
+
342
+ export interface BotSettings {
343
+ HUBTYPE_API_URL: string
344
+ STATIC_URL: string
345
+ LITELLM_API_URL: string
346
+ AZURE_OPENAI_API_BASE: string
347
+ AZURE_OPENAI_API_VERSION: string
348
+ LANGUAGE_DETECTION_ENABLED?: boolean
349
+ CUSTOM_SHORT_URL_HOST: string | null
350
+ custom: Record<string, any>
351
+ }
352
+
353
+ export interface BotSecrets {
354
+ HUBTYPE_ACCESS_TOKEN: string
355
+ LITELLM_API_KEY: string
356
+ AZURE_OPENAI_API_KEY: string
357
+ custom: Record<string, any>
337
358
  }
338
359
 
339
360
  export interface BotContext<