@sapia-ai/chatbot-v3 1.3.1-beta.9.g966ae1e → 1.4.0
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.
- package/dist/{EmbeddedVideoPlayer-D_wOzAAv.js → EmbeddedVideoPlayer-G554aRrZ.js} +14 -14
- package/dist/{Preview-BJXCAMet.js → Preview-CSE0hI6e.js} +3 -3
- package/dist/api/client.d.ts +33 -4
- package/dist/api/config.d.ts +1 -1
- package/dist/api/errors.d.ts +25 -0
- package/dist/api/fiToken.d.ts +23 -0
- package/dist/api/index.d.ts +1 -0
- package/dist/api/types/branding.d.ts +3 -1
- package/dist/api/types/messages.d.ts +57 -3
- package/dist/api/types/responses.d.ts +154 -5
- package/dist/api.js +2 -2
- package/dist/{messages-DhmdgtVq.js → client-DG-5x86F.js} +706 -575
- package/dist/core/bubbles/cards.d.ts +7 -1
- package/dist/core/bubbles/convert.d.ts +3 -2
- package/dist/core/bubbles/counters.d.ts +18 -7
- package/dist/core/bubbles/customerSatisfactionRun.d.ts +62 -0
- package/dist/core/bubbles/mutations.d.ts +29 -0
- package/dist/core/bubbles/piiRun.d.ts +63 -0
- package/dist/core/bubbles/selection.d.ts +40 -0
- package/dist/core/bubbles/types.d.ts +39 -0
- package/dist/core/constants.d.ts +27 -10
- package/dist/core/{interview.d.ts → interview/engine.d.ts} +99 -56
- package/dist/core/interview/errors.d.ts +14 -0
- package/dist/core/interview/liveBubble.d.ts +26 -0
- package/dist/core/interview/reveal.d.ts +78 -0
- package/dist/core/persistence.d.ts +6 -7
- package/dist/core/store.d.ts +35 -6
- package/dist/core/theme/cssVariables.d.ts +0 -1
- package/dist/core/validation/pii.d.ts +1 -0
- package/dist/core/validation/piiAnswer.d.ts +38 -0
- package/dist/core/validation/piiForm.d.ts +76 -0
- package/dist/{dist-BcVYIqYW.js → dist-DsGdVwdi.js} +3 -3
- package/dist/embed/createChatbot.d.ts +2 -0
- package/dist/{fix-webm-duration-C_2_s-pb.js → fix-webm-duration-Bie2OG-n.js} +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +7493 -5963
- package/dist/{jsx-runtime-n3Sufh_D.js → jsx-runtime-B5vw3nIj.js} +2 -2
- package/dist/react/AnswerInput.d.ts +1 -1
- package/dist/react/SapiaChatbot.d.ts +3 -1
- package/dist/react/bubbleViewModel.d.ts +56 -24
- package/dist/react/strings.d.ts +59 -11
- package/dist/react/useCustomerSatisfactionForm.d.ts +14 -0
- package/dist/react/usePiiForm.d.ts +52 -0
- package/dist/react/useSessionExpiryCheck.d.ts +3 -0
- package/dist/{react-xf6AdbdB.js → react-B46N_vb_.js} +3 -3
- package/dist/{react-B0vf2MBf.js → react-CN-F_7qV.js} +3 -3
- package/dist/{react-DVuMKYmt.js → react-CpnhkRge.js} +3 -3
- package/dist/{react-n_76t7t4.js → react-DHdgNnK2.js} +2 -2
- package/dist/{react-7TPcBgC1.js → react-Dd6J2Pyv.js} +3 -3
- package/dist/{react-BjMTT8OK.js → react-SKFkpgRr.js} +3 -3
- package/dist/{react-Cxd6prOd.js → react-T5LsuM9r.js} +3 -3
- package/dist/{react-_3Fe4HUu.js → react-_TUsDaHa.js} +3 -3
- package/dist/{react-BQay9cEy.js → react-abEVBgXB.js} +3 -3
- package/dist/ui/chat/ActionDock/ActionDock.d.ts +15 -3
- package/dist/ui/chat/AgcGuidanceCard/AgcGuidanceCard.d.ts +15 -0
- package/dist/ui/chat/AnswerDisclosure/AnswerDisclosure.d.ts +18 -0
- package/dist/ui/chat/ChatBubble/ChatBubble.d.ts +11 -1
- package/dist/ui/chat/ChatLog/ChatLog.d.ts +10 -2
- package/dist/ui/chat/PiiDetailsCard/PiiDetailsCard.d.ts +23 -0
- package/dist/ui/chat/ScrollToLatestButton/ScrollToLatestButton.d.ts +11 -0
- package/dist/ui/chat/SummaryCard/SummaryCard.d.ts +1 -3
- package/dist/ui/chat/TypingIndicator/TiaMark.d.ts +14 -0
- package/dist/ui/chat/TypingIndicator/TypingIndicator.d.ts +21 -7
- package/dist/ui/chat/types.d.ts +32 -1
- package/dist/ui/inputs/CustomerSatisfactionForm/CustomerSatisfactionForm.d.ts +30 -0
- package/dist/ui/inputs/LocationAnswerInput/LocationAnswerInput.d.ts +6 -13
- package/dist/ui/inputs/LocationAnswerInput/LocationCombobox.d.ts +52 -0
- package/dist/ui/inputs/OptionList/OptionList.d.ts +16 -4
- package/dist/ui/inputs/PhoneAnswerInput/PhoneAnswerInput.d.ts +4 -8
- package/dist/ui/inputs/PhoneAnswerInput/PhoneCountrySelect.d.ts +19 -0
- package/dist/ui/inputs/PiiForm/PiiForm.d.ts +59 -0
- package/dist/ui/inputs/PiiForm/PiiFormField.d.ts +19 -0
- package/dist/ui/inputs/RatingScale/RatingScale.d.ts +20 -0
- package/dist/ui/inputs/TextAnswerInput/TextAnswerInput.d.ts +1 -3
- package/dist/ui/inputs/formCard.d.ts +2 -0
- package/dist/ui/primitives/Button/Button.d.ts +6 -0
- package/dist/ui/primitives/Dialog/Dialog.d.ts +0 -2
- package/dist/ui/richText.d.ts +2 -2
- package/dist/ui/shell/AccessVerificationForm/AccessVerificationForm.d.ts +0 -1
- package/dist/ui/shell/Header/Header.d.ts +8 -12
- package/dist-umd/sapia-chatbot.umd.js +311 -308
- package/package.json +1 -1
- package/dist/ui/shell/AgcGuidanceDialog/AgcGuidanceDialog.d.ts +0 -14
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t } from "./react-
|
|
3
|
-
import { t as n } from "./jsx-runtime-
|
|
1
|
+
import { z as e } from "./client-DG-5x86F.js";
|
|
2
|
+
import { t } from "./react-DHdgNnK2.js";
|
|
3
|
+
import { t as n } from "./jsx-runtime-B5vw3nIj.js";
|
|
4
4
|
import { t as r } from "./defineProperty-DiFpLzd2.js";
|
|
5
5
|
//#region ../../node_modules/.pnpm/react-player@3.4.0_@svta+cml-cta@1.0.6_@svta+cml-structured-field-values@1.1.3_@svta+cm_a4f64f295cc2a316f39ce360b0a6e480/node_modules/react-player/dist/patterns.js
|
|
6
6
|
var i = /* @__PURE__ */ e(t(), 1), a = /\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3a|wav|weba|aac|oga|spx)($|\?)/i, o = /\.(mp4|og[gv]|webm|mov|m4v)(#t=[,\d+]+)?($|\?)/i, s = /\.(m3u8)($|\?)/i, c = /\.(mpd)($|\?)/i, l = /stream\.mux\.com\/(?!\w+\.m3u8)(\w+)/, u = /(?:youtu\.be\/|youtube(?:-nocookie|education)?\.com\/(?:embed\/|v\/|watch\/|watch\?v=|watch\?.+&v=|shorts\/|live\/))((\w|-){11})|youtube\.com\/playlist\?list=|youtube\.com\/user\//, d = /vimeo\.com\/(?!progressive_redirect).+/, f = /(?:wistia\.(?:com|net)|wi\.st)\/(?:medias|embed)\/(?:iframe\/)?([^?]+)/, p = /open\.spotify\.com\/(\w+)\/(\w+)/i, m = /(?:www\.|go\.)?twitch\.tv\/([a-zA-Z0-9_]+|(videos?\/|\?video=)\d+)($|\?)/, h = /tiktok\.com\/(?:player\/v1\/|share\/video\/|@[^/]+\/video\/)([0-9]+)/, g = (e, t) => {
|
|
@@ -34,7 +34,7 @@ var i = /* @__PURE__ */ e(t(), 1), a = /\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3
|
|
|
34
34
|
canEnablePIP: () => !0,
|
|
35
35
|
player: (0, i.lazy)(() => import(
|
|
36
36
|
/* webpackChunkName: 'reactPlayerHls' */
|
|
37
|
-
"./react-
|
|
37
|
+
"./react-T5LsuM9r.js"
|
|
38
38
|
))
|
|
39
39
|
},
|
|
40
40
|
{
|
|
@@ -44,7 +44,7 @@ var i = /* @__PURE__ */ e(t(), 1), a = /\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3
|
|
|
44
44
|
canEnablePIP: () => !0,
|
|
45
45
|
player: (0, i.lazy)(() => import(
|
|
46
46
|
/* webpackChunkName: 'reactPlayerDash' */
|
|
47
|
-
"./react-
|
|
47
|
+
"./react-_TUsDaHa.js"
|
|
48
48
|
))
|
|
49
49
|
},
|
|
50
50
|
{
|
|
@@ -54,7 +54,7 @@ var i = /* @__PURE__ */ e(t(), 1), a = /\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3
|
|
|
54
54
|
canEnablePIP: () => !0,
|
|
55
55
|
player: (0, i.lazy)(() => import(
|
|
56
56
|
/* webpackChunkName: 'reactPlayerMux' */
|
|
57
|
-
"./dist-
|
|
57
|
+
"./dist-DsGdVwdi.js"
|
|
58
58
|
))
|
|
59
59
|
},
|
|
60
60
|
{
|
|
@@ -63,7 +63,7 @@ var i = /* @__PURE__ */ e(t(), 1), a = /\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3
|
|
|
63
63
|
canPlay: _.youtube,
|
|
64
64
|
player: (0, i.lazy)(() => import(
|
|
65
65
|
/* webpackChunkName: 'reactPlayerYouTube' */
|
|
66
|
-
"./react-
|
|
66
|
+
"./react-B46N_vb_.js"
|
|
67
67
|
))
|
|
68
68
|
},
|
|
69
69
|
{
|
|
@@ -72,7 +72,7 @@ var i = /* @__PURE__ */ e(t(), 1), a = /\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3
|
|
|
72
72
|
canPlay: _.vimeo,
|
|
73
73
|
player: (0, i.lazy)(() => import(
|
|
74
74
|
/* webpackChunkName: 'reactPlayerVimeo' */
|
|
75
|
-
"./react-
|
|
75
|
+
"./react-SKFkpgRr.js"
|
|
76
76
|
))
|
|
77
77
|
},
|
|
78
78
|
{
|
|
@@ -82,7 +82,7 @@ var i = /* @__PURE__ */ e(t(), 1), a = /\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3
|
|
|
82
82
|
canEnablePIP: () => !0,
|
|
83
83
|
player: (0, i.lazy)(() => import(
|
|
84
84
|
/* webpackChunkName: 'reactPlayerWistia' */
|
|
85
|
-
"./react-
|
|
85
|
+
"./react-Dd6J2Pyv.js"
|
|
86
86
|
))
|
|
87
87
|
},
|
|
88
88
|
{
|
|
@@ -92,7 +92,7 @@ var i = /* @__PURE__ */ e(t(), 1), a = /\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3
|
|
|
92
92
|
canEnablePIP: () => !1,
|
|
93
93
|
player: (0, i.lazy)(() => import(
|
|
94
94
|
/* webpackChunkName: 'reactPlayerSpotify' */
|
|
95
|
-
"./react-
|
|
95
|
+
"./react-CN-F_7qV.js"
|
|
96
96
|
))
|
|
97
97
|
},
|
|
98
98
|
{
|
|
@@ -102,7 +102,7 @@ var i = /* @__PURE__ */ e(t(), 1), a = /\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3
|
|
|
102
102
|
canEnablePIP: () => !1,
|
|
103
103
|
player: (0, i.lazy)(() => import(
|
|
104
104
|
/* webpackChunkName: 'reactPlayerTwitch' */
|
|
105
|
-
"./react-
|
|
105
|
+
"./react-CpnhkRge.js"
|
|
106
106
|
))
|
|
107
107
|
},
|
|
108
108
|
{
|
|
@@ -112,7 +112,7 @@ var i = /* @__PURE__ */ e(t(), 1), a = /\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3
|
|
|
112
112
|
canEnablePIP: () => !1,
|
|
113
113
|
player: (0, i.lazy)(() => import(
|
|
114
114
|
/* webpackChunkName: 'reactPlayerTiktok' */
|
|
115
|
-
"./react-
|
|
115
|
+
"./react-abEVBgXB.js"
|
|
116
116
|
))
|
|
117
117
|
},
|
|
118
118
|
{
|
|
@@ -181,7 +181,7 @@ var i = /* @__PURE__ */ e(t(), 1), a = /\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3
|
|
|
181
181
|
x.displayName = "Player";
|
|
182
182
|
var ee = x, te = (0, i.lazy)(() => import(
|
|
183
183
|
/* webpackChunkName: 'reactPlayerPreview' */
|
|
184
|
-
"./Preview-
|
|
184
|
+
"./Preview-CSE0hI6e.js"
|
|
185
185
|
)), S = [], ne = (e, t) => {
|
|
186
186
|
let n = (n) => {
|
|
187
187
|
for (let t of [...S, ...e]) if (n && t.canPlay(n)) return t;
|
|
@@ -1297,4 +1297,4 @@ var $ = n(), xe = (e) => {
|
|
|
1297
1297
|
//#endregion
|
|
1298
1298
|
export { Me as EmbeddedVideoPlayer };
|
|
1299
1299
|
|
|
1300
|
-
//# sourceMappingURL=EmbeddedVideoPlayer-
|
|
1300
|
+
//# sourceMappingURL=EmbeddedVideoPlayer-G554aRrZ.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t } from "./react-
|
|
1
|
+
import { z as e } from "./client-DG-5x86F.js";
|
|
2
|
+
import { t } from "./react-DHdgNnK2.js";
|
|
3
3
|
//#region ../../node_modules/.pnpm/react-player@3.4.0_@svta+cml-cta@1.0.6_@svta+cml-structured-field-values@1.1.3_@svta+cm_a4f64f295cc2a316f39ce360b0a6e480/node_modules/react-player/dist/Preview.js
|
|
4
4
|
var n = /* @__PURE__ */ e(t(), 1), r = "64px", i = {}, a = ({ src: e, light: t, oEmbedUrl: a, onClickPreview: o, playIcon: s, previewTabIndex: c, previewAriaLabel: l }) => {
|
|
5
5
|
let [u, d] = (0, n.useState)(null);
|
|
@@ -81,4 +81,4 @@ var n = /* @__PURE__ */ e(t(), 1), r = "64px", i = {}, a = ({ src: e, light: t,
|
|
|
81
81
|
//#endregion
|
|
82
82
|
export { a as default };
|
|
83
83
|
|
|
84
|
-
//# sourceMappingURL=Preview-
|
|
84
|
+
//# sourceMappingURL=Preview-CSE0hI6e.js.map
|
package/dist/api/client.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { default as axios, AxiosInstance } from 'axios';
|
|
2
2
|
import { ChatbotClientConfig } from './config';
|
|
3
|
+
import { UnauthorizedError } from './errors';
|
|
4
|
+
import { HeldFiToken } from './fiToken';
|
|
3
5
|
import { CandidateResponseInput, EditCandidateResponseInput, Question } from './types/messages';
|
|
4
|
-
import { AccessManagementResponse, AssessmentSummary, DetectAgcResponse, EditAnswerResponse, ExtractHumanNameResponse, ExtractHumanNameType,
|
|
6
|
+
import { AccessManagementResponse, AssessmentSummary, CustomerSatisfactionFormField, DetectAgcResponse, EditAnswerResponse, ExtractHumanNameResponse, ExtractHumanNameType, NextResponse, PiiFormField, StartAtsResponse, TranslationResponse, VerifyAccessResponse, VideoSignedUrlResponse } from './types/responses';
|
|
5
7
|
export type ChatbotApiClientOptions = ChatbotClientConfig & {
|
|
6
8
|
/** Injectable for tests / instrumented hosts. */
|
|
7
9
|
httpClient?: AxiosInstance;
|
|
@@ -28,6 +30,10 @@ export type NextStreamHandlers = {
|
|
|
28
30
|
onSummary?: (summary: AssessmentSummary) => void;
|
|
29
31
|
/** The assessment's resume link, emitted at the position of the copy-link bubble. */
|
|
30
32
|
onLink?: (url: string) => void;
|
|
33
|
+
/** Every field of a PII run, emitted in place of the run's prompts. */
|
|
34
|
+
onPiiForm?: (fields: PiiFormField[]) => void;
|
|
35
|
+
/** The rating and comment asked after the interview, emitted in place of their prompts. */
|
|
36
|
+
onCustomerSatisfactionForm?: (fields: CustomerSatisfactionFormField[]) => void;
|
|
31
37
|
/** Aborts the in-flight stream (new request / unmount). */
|
|
32
38
|
signal?: AbortSignal;
|
|
33
39
|
};
|
|
@@ -39,10 +45,29 @@ export declare class ChatbotApiClient {
|
|
|
39
45
|
/** API/client headers reused by both the Axios instance and the fetch streaming path. */
|
|
40
46
|
private readonly baseHeaders;
|
|
41
47
|
private fiToken?;
|
|
48
|
+
private onUnauthorized?;
|
|
49
|
+
private onLapsedFiToken?;
|
|
42
50
|
constructor(options: ChatbotApiClientOptions);
|
|
43
|
-
/** Dynamic session-token header
|
|
51
|
+
/** Dynamic session-token header (the token's name varies per region and stage). */
|
|
44
52
|
private fiTokenHeaders;
|
|
45
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Runs before every guarded call. An expired token is either refused here, without spending a
|
|
55
|
+
* request, or dropped so the call goes out bare — which one is the engine's decision, because
|
|
56
|
+
* only access-management knows whether the backend would forgive this candidate.
|
|
57
|
+
*/
|
|
58
|
+
private guardLapsedFiToken;
|
|
59
|
+
/** A token is held that core-fi would no longer honour — not the same as holding none. */
|
|
60
|
+
hasLapsedFiToken(): boolean;
|
|
61
|
+
getFiToken(): HeldFiToken | undefined;
|
|
62
|
+
/** Seeds a token cached from an earlier load, or drops the one held once it is rejected. */
|
|
63
|
+
setFiToken(fiToken: HeldFiToken | undefined): void;
|
|
64
|
+
/**
|
|
65
|
+
* Notified once per rejected call, from either transport. Registered rather than passed in
|
|
66
|
+
* options because the engine that handles the expiry is built after the client.
|
|
67
|
+
*/
|
|
68
|
+
setOnUnauthorized(handler: (error: UnauthorizedError) => void): void;
|
|
69
|
+
/** Asked whether an expired token must refuse the call (true) or be dropped (false). */
|
|
70
|
+
setOnLapsedFiToken(handler: () => Promise<boolean>): void;
|
|
46
71
|
startAts(assessmentId: string): Promise<StartAtsResponse>;
|
|
47
72
|
/**
|
|
48
73
|
* Loads the next question over /next/stream and consumes the
|
|
@@ -50,8 +75,12 @@ export declare class ChatbotApiClient {
|
|
|
50
75
|
* Each frame is data-only (`data: <json>`); the discriminator is the JSON
|
|
51
76
|
* `type`. Fires onMeta from STATE_SNAPSHOT and onDelta per TEXT_MESSAGE_CONTENT,
|
|
52
77
|
* then resolves with the authoritative NextResponse carried by RUN_FINISHED.
|
|
78
|
+
*
|
|
79
|
+
* A whole PII form is posted as an array, which the backend reads as `candidateResponses`;
|
|
80
|
+
* the array is what marks the turn as a form submission, so the two body keys are never sent
|
|
81
|
+
* together.
|
|
53
82
|
*/
|
|
54
|
-
nextStream(assessmentId: string,
|
|
83
|
+
nextStream(assessmentId: string, input: CandidateResponseInput | CandidateResponseInput[] | undefined, handlers: NextStreamHandlers): Promise<NextResponse | undefined>;
|
|
55
84
|
editAnswer(assessmentId: string, editCandidateResponse: EditCandidateResponseInput): Promise<EditAnswerResponse>;
|
|
56
85
|
extractHumanName(assessmentId: string, input: {
|
|
57
86
|
userText: string;
|
package/dist/api/config.d.ts
CHANGED
|
@@ -13,6 +13,6 @@ export type ChatbotClientConfig = {
|
|
|
13
13
|
/** Overrides the env-derived origin (required for env "local" if not on the default port). */
|
|
14
14
|
apiOrigin?: string;
|
|
15
15
|
};
|
|
16
|
-
export declare const resolveApiOrigin: ({ env, apiOrigin }: Pick<ChatbotClientConfig, "env" | "apiOrigin">) => string;
|
|
16
|
+
export declare const resolveApiOrigin: ({ env, apiOrigin, }: Pick<ChatbotClientConfig, "env" | "apiOrigin">) => string;
|
|
17
17
|
/** e.g. https://fi-api.dev.predictivehire.com/api/us-east-1/chatbot */
|
|
18
18
|
export declare const buildChatbotBaseUrl: (config: ChatbotClientConfig) => string;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Statuses the widget branches on; a malformed body gets its own and stays a plain failure. */
|
|
2
|
+
declare enum HttpStatus {
|
|
3
|
+
UNAUTHORIZED = 401,
|
|
4
|
+
NOT_FOUND = 404
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* The session token was missing, expired, or minted for another assessment. Distinct from a
|
|
8
|
+
* transport failure: the candidate recovers by verifying their email again, not by retrying.
|
|
9
|
+
*/
|
|
10
|
+
export declare class UnauthorizedError extends Error {
|
|
11
|
+
/** `endpoint` names the call core-fi refused, so a host report says where it happened. */
|
|
12
|
+
constructor(endpoint?: string);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The held token had expired and this candidate must authenticate, so the call was refused before
|
|
16
|
+
* it was sent. An UnauthorizedError so every caller handles it exactly as a 401.
|
|
17
|
+
*/
|
|
18
|
+
export declare class SessionLapsedError extends UnauthorizedError {
|
|
19
|
+
constructor();
|
|
20
|
+
}
|
|
21
|
+
/** True for a 401 from either transport — Axios on the REST calls, fetch on the stream. */
|
|
22
|
+
export declare const isUnauthorized: (error: unknown) => boolean;
|
|
23
|
+
/** True when the backend has no assessment with this id — a dead link, not a transient failure. */
|
|
24
|
+
export declare const isNotFound: (error: unknown) => boolean;
|
|
25
|
+
export { HttpStatus };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { FiToken } from './types/responses';
|
|
2
|
+
/**
|
|
3
|
+
* What the client and the cache hold. `expiresAt` is derived here and never travels in either
|
|
4
|
+
* direction, so `FiToken` keeps describing the wire.
|
|
5
|
+
*/
|
|
6
|
+
export type HeldFiToken = FiToken & {
|
|
7
|
+
expiresAt?: number;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Stamps a freshly received token with a local expiry. Candidate devices run with wrong clocks
|
|
11
|
+
* often enough that comparing `exp` to `Date.now()` would expire live tokens and keep dead ones;
|
|
12
|
+
* `exp - iat` is a duration measured on core-fi's clock, so counting it forward from arrival reads
|
|
13
|
+
* the local clock for elapsed time only.
|
|
14
|
+
*
|
|
15
|
+
* Must be called as the response arrives — the lifetime is anchored to that moment. A clock that
|
|
16
|
+
* jumps later (NTP correction) shifts `expiresAt` and can cost one re-verification.
|
|
17
|
+
*/
|
|
18
|
+
export declare const holdFiToken: (fiToken: FiToken) => HeldFiToken;
|
|
19
|
+
/**
|
|
20
|
+
* A token with no readable lifetime counts as live: an unparseable payload, or an entry cached
|
|
21
|
+
* before `expiresAt` existed, must not lock out a candidate the backend would still accept.
|
|
22
|
+
*/
|
|
23
|
+
export declare const isFiTokenLive: (fiToken: HeldFiToken) => boolean;
|
package/dist/api/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { ChatbotApiClient, type ChatbotApiClientOptions } from './client';
|
|
2
|
+
export { SessionLapsedError, UnauthorizedError, isNotFound, isUnauthorized } from './errors';
|
|
2
3
|
export { ENVIRONMENTS, REGIONS, CHATBOT_API_PATH, API_ORIGIN_BY_ENV, DEFAULT_LOCAL_API_ORIGIN, buildChatbotBaseUrl, resolveApiOrigin, type Env, type Region, type ChatbotClientConfig, } from './config';
|
|
3
4
|
export * from './types/messages';
|
|
4
5
|
export * from './types/branding';
|
|
@@ -9,7 +9,9 @@ export type ThemeProperty = {
|
|
|
9
9
|
value: ThemeElement;
|
|
10
10
|
};
|
|
11
11
|
export type Branding = {
|
|
12
|
-
|
|
12
|
+
/** Dropped by the BE's chatbot-scoped branding view; older BEs still send it. */
|
|
13
|
+
customerId?: string;
|
|
14
|
+
customerName?: string;
|
|
13
15
|
title?: string;
|
|
14
16
|
theme?: ThemeProperty[];
|
|
15
17
|
logoUrl?: string;
|
|
@@ -4,7 +4,11 @@ export declare enum RuleName {
|
|
|
4
4
|
RECOMMENDED_TEXT_LENGTH = "recommendedTextLength",
|
|
5
5
|
MAX_VOICE_SECONDS = "maxVoiceSeconds",
|
|
6
6
|
MIN_VOICE_SECONDS = "minVoiceSeconds",
|
|
7
|
-
RECOMMENDED_VOICE_SECONDS = "recommendedVoiceSeconds"
|
|
7
|
+
RECOMMENDED_VOICE_SECONDS = "recommendedVoiceSeconds",
|
|
8
|
+
/** Fewest options a multi-select question accepts. One is the floor whether or not it is set. */
|
|
9
|
+
MIN_SELECTIONS = "minSelections",
|
|
10
|
+
/** Most options a multi-select question accepts. Absent means any number. */
|
|
11
|
+
MAX_SELECTIONS = "maxSelections"
|
|
8
12
|
}
|
|
9
13
|
export declare enum MessageSender {
|
|
10
14
|
AGENT = "AGENT",
|
|
@@ -14,6 +18,13 @@ export declare enum QuestionType {
|
|
|
14
18
|
HINT = "HINT",
|
|
15
19
|
FTQ = "FTQ",
|
|
16
20
|
MCQ = "MCQ",
|
|
21
|
+
/**
|
|
22
|
+
* The same option list as an MCQ, answered with a set rather than one choice. A type of its own
|
|
23
|
+
* because MCQ also carries the submit button, the consent gates and the personality items, none
|
|
24
|
+
* of which may ever take more than one answer. Every additional question is now this type — a
|
|
25
|
+
* single-pick one is an MSQ capped at one.
|
|
26
|
+
*/
|
|
27
|
+
MSQ = "MSQ",
|
|
17
28
|
VOICE = "VOICE",
|
|
18
29
|
VIDEO = "VIDEO",
|
|
19
30
|
SLIDER = "SLIDER",
|
|
@@ -99,10 +110,22 @@ export type ButtonGroupContent = Content & {
|
|
|
99
110
|
triggers: Trigger[];
|
|
100
111
|
style: Style;
|
|
101
112
|
};
|
|
113
|
+
/** One option a candidate confirmed on a multi-select question, echoed back verbatim. */
|
|
114
|
+
export type AnswerSelection = {
|
|
115
|
+
id: string;
|
|
116
|
+
value: string;
|
|
117
|
+
text: string;
|
|
118
|
+
};
|
|
102
119
|
export type AnswerContent = {
|
|
103
120
|
/** Free-text answers written in the rich composer carry markdown here — see `ui/markdown.ts`. */
|
|
104
121
|
text: string;
|
|
105
122
|
value: string;
|
|
123
|
+
/**
|
|
124
|
+
* Options confirmed on a multi-select question, in the order the option list defines them. The
|
|
125
|
+
* source of truth for the answer: the backend derives `text` and `value` from it by joining with
|
|
126
|
+
* `MULTI_SELECT_ANSWER_SEPARATOR`, and refuses a selection the question never offered.
|
|
127
|
+
*/
|
|
128
|
+
selections?: AnswerSelection[];
|
|
106
129
|
triggers?: Trigger[];
|
|
107
130
|
style?: Style;
|
|
108
131
|
};
|
|
@@ -124,7 +147,35 @@ export declare enum ContentComponent {
|
|
|
124
147
|
/** The bubble is a placeholder for the "what to expect" card, not text. */
|
|
125
148
|
ASSESSMENT_SUMMARY = "AssessmentSummary",
|
|
126
149
|
/** The bubble is a placeholder for the resume-link control, not text. */
|
|
127
|
-
COPY_LINK = "CopyLink"
|
|
150
|
+
COPY_LINK = "CopyLink",
|
|
151
|
+
/**
|
|
152
|
+
* The bubble is a placeholder for the AI-use guidance block. The backend marks the position
|
|
153
|
+
* only — the copy, the tick box and the tip are the client's, which is why the event that
|
|
154
|
+
* replaces this bubble on the stream carries no payload.
|
|
155
|
+
*/
|
|
156
|
+
AGC_GUIDANCE = "AgcGuidance",
|
|
157
|
+
/**
|
|
158
|
+
* The bubble is a placeholder for the whole PII form, not for this prompt's text. Synthesised by
|
|
159
|
+
* the widget: the backend describes the run in a PII_FORM event and annotates no bubble for it.
|
|
160
|
+
*/
|
|
161
|
+
PII_FORM = "PiiForm",
|
|
162
|
+
/**
|
|
163
|
+
* The bubble is the one line the interviewer says before the form. The run's own prompts are
|
|
164
|
+
* questions, not labels, so none of them can stand in for it.
|
|
165
|
+
*/
|
|
166
|
+
PII_FORM_INTRO = "PiiFormIntro",
|
|
167
|
+
/** The bubble is a placeholder for the answered details, standing in for the whole run. */
|
|
168
|
+
PII_DETAILS = "PiiDetails",
|
|
169
|
+
/**
|
|
170
|
+
* The bubble is a placeholder for the feedback card (rating plus comment). Synthesised by the
|
|
171
|
+
* widget: the backend describes the run in a CUSTOMER_SATISFACTION_FORM event.
|
|
172
|
+
*/
|
|
173
|
+
CUSTOMER_SATISFACTION_FORM = "CustomerSatisfactionForm",
|
|
174
|
+
/**
|
|
175
|
+
* The interviewer's one line above the feedback card. The run may open on either prompt, so
|
|
176
|
+
* neither prompt's own text can stand in for it.
|
|
177
|
+
*/
|
|
178
|
+
CUSTOMER_SATISFACTION_INTRO = "CustomerSatisfactionIntro"
|
|
128
179
|
}
|
|
129
180
|
/**
|
|
130
181
|
* Whole-bubble values the backend uses to mark a content bubble as a card placeholder. The stream
|
|
@@ -133,7 +184,8 @@ export declare enum ContentComponent {
|
|
|
133
184
|
*/
|
|
134
185
|
export declare enum ContentMarker {
|
|
135
186
|
ASSESSMENT_SUMMARY = "{assessment.summary}",
|
|
136
|
-
ASSESSMENT_LINK = "{assessment.link}"
|
|
187
|
+
ASSESSMENT_LINK = "{assessment.link}",
|
|
188
|
+
AGC_GUIDANCE = "{assessment.agcGuidance}"
|
|
137
189
|
}
|
|
138
190
|
/** BE message kind: an unanswerable agent aside vs a real question. */
|
|
139
191
|
export declare enum MessageKind {
|
|
@@ -173,6 +225,8 @@ export type Answer = {
|
|
|
173
225
|
question: Question;
|
|
174
226
|
text: string;
|
|
175
227
|
value: string;
|
|
228
|
+
/** Present on a multi-select answer; `text` holds the same options joined for scalar readers. */
|
|
229
|
+
selections?: AnswerSelection[];
|
|
176
230
|
};
|
|
177
231
|
export interface Message<T> {
|
|
178
232
|
id: string;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { Branding } from './branding';
|
|
2
|
-
import { AgentResponse, AssessmentStatus, BGQButton, CandidateResponse, ContentComponent, ContentType, MCQQuestionOption, MessageKind, PHService, QuestionRule, QuestionType, Tag } from './messages';
|
|
3
|
-
/**
|
|
2
|
+
import { AgentResponse, AssessmentStatus, BGQButton, CandidateResponse, ContentComponent, ContentType, MCQQuestionOption, Message, MessageKind, PHService, PiiQuestionType, QuestionRule, QuestionType, Tag } from './messages';
|
|
3
|
+
/** Candidate session token, minted by /verify-access and re-minted by /start/ats and /next. */
|
|
4
4
|
export type FiToken = {
|
|
5
5
|
name: string;
|
|
6
6
|
value: string;
|
|
7
7
|
};
|
|
8
8
|
export type StartAtsResponse = {
|
|
9
9
|
assessmentId: string;
|
|
10
|
-
chatLogs:
|
|
10
|
+
chatLogs: ChatLog[];
|
|
11
11
|
branding?: Branding;
|
|
12
12
|
hasVideoQuestion?: boolean;
|
|
13
13
|
assessmentStatus: AssessmentStatus;
|
|
@@ -24,8 +24,14 @@ export type StartAtsResponse = {
|
|
|
24
24
|
assessmentIsReusedMessage?: AgentResponse;
|
|
25
25
|
/** Candidate display name for the pre-interview welcome (optional; absent → generic greeting). */
|
|
26
26
|
candidateName?: string;
|
|
27
|
-
/**
|
|
28
|
-
|
|
27
|
+
/**
|
|
28
|
+
* The cohort title, shown as the role in the header and welcome. Read this rather than
|
|
29
|
+
* `branding.title`, which the BE has already interpolated into customer-authored copy.
|
|
30
|
+
* Optional until every environment runs a BE that sends it.
|
|
31
|
+
*/
|
|
32
|
+
jobTitle?: string;
|
|
33
|
+
/** Company name for the header, welcome and done screens. Optional for the same reason. */
|
|
34
|
+
customerName?: string;
|
|
29
35
|
/**
|
|
30
36
|
* "What to expect" counts. Returned here too (not just on the stream) so they survive reload —
|
|
31
37
|
* re-hydration goes through /start, which never replays the stream. The store captures whichever
|
|
@@ -76,6 +82,11 @@ export type AccessManagementResponse = {
|
|
|
76
82
|
/** POST verify-access — whether the candidate email matches. */
|
|
77
83
|
export type VerifyAccessResponse = {
|
|
78
84
|
allowToAccess: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Minted only on a match. For an assessment that already holds a candidate email this is the
|
|
87
|
+
* only place a token comes from, so /start/ats is unreachable without passing the email check.
|
|
88
|
+
*/
|
|
89
|
+
fiToken?: FiToken;
|
|
79
90
|
};
|
|
80
91
|
/** POST detect-agc — automated-content detection on submit. */
|
|
81
92
|
export type DetectAgcResponse = {
|
|
@@ -88,6 +99,9 @@ export declare enum AgUiEventType {
|
|
|
88
99
|
STATE_SNAPSHOT = "STATE_SNAPSHOT",
|
|
89
100
|
ASSESSMENT_SUMMARY = "ASSESSMENT_SUMMARY",
|
|
90
101
|
ASSESSMENT_LINK = "ASSESSMENT_LINK",
|
|
102
|
+
AGC_GUIDANCE = "AGC_GUIDANCE",
|
|
103
|
+
PII_FORM = "PII_FORM",
|
|
104
|
+
CUSTOMER_SATISFACTION_FORM = "CUSTOMER_SATISFACTION_FORM",
|
|
91
105
|
TEXT_MESSAGE_START = "TEXT_MESSAGE_START",
|
|
92
106
|
TEXT_MESSAGE_CONTENT = "TEXT_MESSAGE_CONTENT",
|
|
93
107
|
TEXT_MESSAGE_END = "TEXT_MESSAGE_END",
|
|
@@ -123,6 +137,135 @@ export type AssessmentSummary = {
|
|
|
123
137
|
count: number;
|
|
124
138
|
}[];
|
|
125
139
|
};
|
|
140
|
+
/** Whether a form field collects a personal detail or the SMS-updates consent that sits among them. */
|
|
141
|
+
export declare enum PiiFormFieldKind {
|
|
142
|
+
PII = "PII",
|
|
143
|
+
SMS_CONSENT = "SMS_CONSENT"
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* The backend's own spelling of a PII subtype, which is NOT the `PII_TYPE` tag value the rest of
|
|
147
|
+
* the widget keys off (`PiiQuestionType`): the two vocabularies are `FULL_NAME` and `fullName`.
|
|
148
|
+
* Confined to this layer — `toPiiFormField` adapts it before a field reaches the engine.
|
|
149
|
+
*/
|
|
150
|
+
export declare enum PiiFormWireType {
|
|
151
|
+
FULL_NAME = "FULL_NAME",
|
|
152
|
+
FIRST_NAME = "FIRST_NAME",
|
|
153
|
+
LAST_NAME = "LAST_NAME",
|
|
154
|
+
EMAIL = "EMAIL",
|
|
155
|
+
PHONE_NUMBER = "PHONE_NUMBER",
|
|
156
|
+
LOCATION = "LOCATION"
|
|
157
|
+
}
|
|
158
|
+
/** A PII_FORM field exactly as it arrives, before its `piiType` is adapted. */
|
|
159
|
+
export type PiiFormFieldWire = Omit<PiiFormField, 'piiType'> & {
|
|
160
|
+
/** Absent or unrecognised means "not a personal detail" — the SMS consent field carries none. */
|
|
161
|
+
piiType?: PiiFormWireType | string | null;
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* One prompt of a PII run, described so the client can draw it as a form field (AG-UI PII_FORM).
|
|
165
|
+
* The backend sends the fields in dialogue order; `questionId` is what an answer posts against.
|
|
166
|
+
* `prompt` is the authored wording — the widget names its own fields, so it is only shown where
|
|
167
|
+
* the dialogue owns the copy, as the consent question does.
|
|
168
|
+
*/
|
|
169
|
+
export type PiiFormField = {
|
|
170
|
+
questionId: string;
|
|
171
|
+
masterId?: string;
|
|
172
|
+
kind: PiiFormFieldKind;
|
|
173
|
+
/** Null for the SMS consent field, which is not a personal detail. */
|
|
174
|
+
piiType: PiiQuestionType | null;
|
|
175
|
+
/** Answer-input component (ignored — the field is drawn from `piiType` and `questionTypes`). */
|
|
176
|
+
component?: string | null;
|
|
177
|
+
questionTypes: QuestionType[];
|
|
178
|
+
prompt: string;
|
|
179
|
+
options?: MCQQuestionOption[] | BGQButton[];
|
|
180
|
+
rules?: QuestionRule[];
|
|
181
|
+
/** Set only on a reloaded run's responses: what the candidate gave, ready to display. */
|
|
182
|
+
answer?: string;
|
|
183
|
+
/**
|
|
184
|
+
* That answer's underlying value. Carried because consent is a state rather than text, and
|
|
185
|
+
* reading it back off the button's label would break the moment the label is reworded.
|
|
186
|
+
*/
|
|
187
|
+
value?: string;
|
|
188
|
+
};
|
|
189
|
+
/**
|
|
190
|
+
* A PII run as a reloaded transcript carries it: one agent message describing the whole form, and
|
|
191
|
+
* — once submitted — one candidate message carrying the details it collected. The backend folds
|
|
192
|
+
* the run's stored prompt/answer pairs into these while building the response and never stores
|
|
193
|
+
* them, so a reload reads the way the interview looked. `_id` is the run's opening question id,
|
|
194
|
+
* shared by both halves so they can be paired without relying on their order.
|
|
195
|
+
*
|
|
196
|
+
* The fields arrive in the backend's own `piiType` spelling, as the stream's do; the client adapts
|
|
197
|
+
* them before the engine sees either.
|
|
198
|
+
*/
|
|
199
|
+
export type PiiFormMessage = Message<{
|
|
200
|
+
_id: string;
|
|
201
|
+
fields: PiiFormField[];
|
|
202
|
+
}>;
|
|
203
|
+
/** @see PiiFormMessage — the candidate half, whose fields carry `answer` and `value`. */
|
|
204
|
+
export type PiiResponsesMessage = Message<{
|
|
205
|
+
_id: string;
|
|
206
|
+
responses: PiiFormField[];
|
|
207
|
+
}>;
|
|
208
|
+
/**
|
|
209
|
+
* Which family a folded form belongs to. Only the feedback payload carries it: the PII payload
|
|
210
|
+
* shipped first with the same shape and no marker, so an absent formType means PII.
|
|
211
|
+
*/
|
|
212
|
+
export declare enum FormType {
|
|
213
|
+
PII = "PII",
|
|
214
|
+
CUSTOMER_SATISFACTION = "CUSTOMER_SATISFACTION"
|
|
215
|
+
}
|
|
216
|
+
/** Whether a feedback field collects the rating or the free-text comment. */
|
|
217
|
+
export declare enum CustomerSatisfactionFieldType {
|
|
218
|
+
RATING = "RATING",
|
|
219
|
+
COMMENT = "COMMENT"
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* One prompt of the feedback run (AG-UI CUSTOMER_SATISFACTION_FORM). The backend sends the fields in
|
|
223
|
+
* dialogue order, which is the order answers must be posted in — the rating is not always first.
|
|
224
|
+
*/
|
|
225
|
+
export type CustomerSatisfactionFormField = {
|
|
226
|
+
questionId: string;
|
|
227
|
+
masterId?: string;
|
|
228
|
+
fieldType: CustomerSatisfactionFieldType;
|
|
229
|
+
component?: string | null;
|
|
230
|
+
questionTypes: QuestionType[];
|
|
231
|
+
/** The authored wording. The card names its own fields, so this is not drawn. */
|
|
232
|
+
prompt: string;
|
|
233
|
+
rules?: QuestionRule[];
|
|
234
|
+
/** Set only on a reloaded run's responses: what the candidate gave, ready to display. */
|
|
235
|
+
answer?: string;
|
|
236
|
+
/** That answer's underlying value — the rating as a number string. */
|
|
237
|
+
value?: string;
|
|
238
|
+
};
|
|
239
|
+
type CustomerSatisfactionPayload = {
|
|
240
|
+
_id: string;
|
|
241
|
+
formType: FormType.CUSTOMER_SATISFACTION;
|
|
242
|
+
};
|
|
243
|
+
/**
|
|
244
|
+
* A feedback run as a reloaded transcript carries it, folded by the backend exactly as a PII run
|
|
245
|
+
* is: the form, and — once posted — the responses, which leave out any field the candidate skipped.
|
|
246
|
+
*/
|
|
247
|
+
export type CustomerSatisfactionFormMessage = Message<CustomerSatisfactionPayload & {
|
|
248
|
+
fields: CustomerSatisfactionFormField[];
|
|
249
|
+
}>;
|
|
250
|
+
/** @see CustomerSatisfactionFormMessage */
|
|
251
|
+
export type CustomerSatisfactionResponsesMessage = Message<CustomerSatisfactionPayload & {
|
|
252
|
+
responses: CustomerSatisfactionFormField[];
|
|
253
|
+
}>;
|
|
254
|
+
/** Anything /start can put in `chatLogs`: a stored turn, or a form run folded into two messages. */
|
|
255
|
+
export type ChatLog = CandidateResponse | AgentResponse | PiiFormMessage | PiiResponsesMessage | CustomerSatisfactionFormMessage | CustomerSatisfactionResponsesMessage;
|
|
256
|
+
/**
|
|
257
|
+
* The folded halves of a PII run are told apart by their payload key alone: neither carries the
|
|
258
|
+
* `question` an answer has or the `types`/`contents` a prompt has, so a reader that goes by those
|
|
259
|
+
* would take them for an empty question and draw nothing. A feedback run folds into the same keys,
|
|
260
|
+
* so its marker is what turns it away here.
|
|
261
|
+
*/
|
|
262
|
+
export declare const isPiiFormMessage: (chatLog: ChatLog) => chatLog is PiiFormMessage;
|
|
263
|
+
/** @see isPiiFormMessage */
|
|
264
|
+
export declare const isPiiResponsesMessage: (chatLog: ChatLog) => chatLog is PiiResponsesMessage;
|
|
265
|
+
/** @see CustomerSatisfactionFormMessage */
|
|
266
|
+
export declare const isCustomerSatisfactionFormMessage: (chatLog: ChatLog) => chatLog is CustomerSatisfactionFormMessage;
|
|
267
|
+
/** @see CustomerSatisfactionFormMessage */
|
|
268
|
+
export declare const isCustomerSatisfactionResponsesMessage: (chatLog: ChatLog) => chatLog is CustomerSatisfactionResponsesMessage;
|
|
126
269
|
/** STATE_SNAPSHOT.snapshot.question — same data as our Question, but `types` is `questionTypes`. */
|
|
127
270
|
export type SnapshotQuestion = {
|
|
128
271
|
_id: string;
|
|
@@ -156,9 +299,15 @@ export type AgUiFrame = {
|
|
|
156
299
|
summary?: AssessmentSummary;
|
|
157
300
|
/** ASSESSMENT_LINK payload — the assessment's resume link (present only on that frame). */
|
|
158
301
|
url?: string;
|
|
302
|
+
/**
|
|
303
|
+
* PII_FORM / CUSTOMER_SATISFACTION_FORM payload — every field of the run, in dialogue order, in
|
|
304
|
+
* the backend's spelling. Which of the two it is follows from `type`.
|
|
305
|
+
*/
|
|
306
|
+
fields?: PiiFormFieldWire[] | CustomerSatisfactionFormField[];
|
|
159
307
|
/** TEXT_MESSAGE_* message id, shape "<baseId>:<contentIndex>"; segments bundled messages. */
|
|
160
308
|
messageId?: string;
|
|
161
309
|
delta?: string;
|
|
162
310
|
result?: NextResponse;
|
|
163
311
|
message?: string;
|
|
164
312
|
};
|
|
313
|
+
export {};
|
package/dist/api.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
1
|
+
import { A as e, C as t, D as n, E as r, F as i, I as a, M as o, N as s, O as c, P as l, S as u, _ as d, a as f, b as p, c as m, d as h, f as g, g as _, h as v, i as y, j as b, k as x, l as S, m as C, n as w, o as T, p as E, r as D, s as O, t as k, u as A, v as j, w as M, x as N, y as P } from "./client-DG-5x86F.js";
|
|
2
|
+
export { e as API_ORIGIN_BY_ENV, w as AgUiEventType, g as AssessmentStatus, D as AssessmentSummaryCategory, E as ButtonType, b as CHATBOT_API_PATH, k as ChatbotApiClient, C as ContentComponent, v as ContentMarker, _ as ContentType, y as CustomerSatisfactionFieldType, o as DEFAULT_LOCAL_API_ORIGIN, s as ENVIRONMENTS, f as FormType, d as MessageIdentifier, j as MessageKind, P as MessageSender, p as PHService, T as PiiFormFieldKind, O as PiiFormWireType, N as PiiQuestionType, u as QuestionType, l as REGIONS, t as RuleName, r as SessionLapsedError, n as UnauthorizedError, M as VideoQuestionType, i as buildChatbotBaseUrl, m as isCustomerSatisfactionFormMessage, S as isCustomerSatisfactionResponsesMessage, c as isNotFound, A as isPiiFormMessage, h as isPiiResponsesMessage, x as isUnauthorized, a as resolveApiOrigin };
|