@escapenavigator/types 1.10.166 → 1.10.168

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.
@@ -1,4 +1,5 @@
1
1
  import { WidgetChatConversationStatusEnum } from './enum/widget-chat-conversation-status.enum';
2
+ import { WidgetChatMessageAuthorEnum } from './enum/widget-chat-message-author.enum';
2
3
  import { WidgetChatOutcomeEnum } from './enum/widget-chat-outcome.enum';
3
4
  import { WidgetChatResolutionReasonEnum } from './enum/widget-chat-resolution-reason.enum';
4
5
  import { WidgetChatResolvedByEnum } from './enum/widget-chat-resolved-by.enum';
@@ -16,6 +17,7 @@ export type WidgetChatConversationRO = {
16
17
  visitorLastSeenAt?: Date;
17
18
  lastMessageText?: string;
18
19
  lastMessageAt?: Date;
20
+ lastMessageAuthor?: WidgetChatMessageAuthorEnum | null;
19
21
  unreadCount: number;
20
22
  aiEnabled: boolean;
21
23
  aiPaused: boolean;
@@ -0,0 +1,30 @@
1
+ import { WidgetFunnelKindEnum } from './widget-funnel-kind.enum';
2
+ import { WidgetFunnelStepEnum } from './widget-funnel-step.enum';
3
+ /**
4
+ * Одно событие воронки. `profileId` НЕ принимаем из тела — он берётся
5
+ * из widget-токена на бэке (см. WidgetBeaconGuard), чтобы embed не мог
6
+ * подделать чужую компанию.
7
+ *
8
+ * `eventId` генерит фронт (uuid v4) — нужен для идемпотентности: beacon
9
+ * может ретраиться (sendBeacon + fetch fallback), бэк дедупит по
10
+ * (sessionId, eventId).
11
+ */
12
+ export declare class WidgetFunnelEventDto {
13
+ eventId: string;
14
+ sessionId: string;
15
+ widgetUid: string;
16
+ widgetType?: string;
17
+ kind: WidgetFunnelKindEnum;
18
+ step: WidgetFunnelStepEnum;
19
+ /** ISO-строка момента события на клиенте. */
20
+ occurredAt: string;
21
+ /** Произвольный контекст шага: questroomId, slotId, amount, language... */
22
+ meta?: Record<string, unknown>;
23
+ }
24
+ /**
25
+ * Батч событий за один flush. Лимит 50 — обычная сессия порождает 5-10
26
+ * шагов; запас на случай агрегированного flush'а при unload.
27
+ */
28
+ export declare class WidgetFunnelEventBatchDto {
29
+ events: WidgetFunnelEventDto[];
30
+ }
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.WidgetFunnelEventBatchDto = exports.WidgetFunnelEventDto = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const widget_funnel_kind_enum_1 = require("./widget-funnel-kind.enum");
16
+ const widget_funnel_step_enum_1 = require("./widget-funnel-step.enum");
17
+ /**
18
+ * Одно событие воронки. `profileId` НЕ принимаем из тела — он берётся
19
+ * из widget-токена на бэке (см. WidgetBeaconGuard), чтобы embed не мог
20
+ * подделать чужую компанию.
21
+ *
22
+ * `eventId` генерит фронт (uuid v4) — нужен для идемпотентности: beacon
23
+ * может ретраиться (sendBeacon + fetch fallback), бэк дедупит по
24
+ * (sessionId, eventId).
25
+ */
26
+ class WidgetFunnelEventDto {
27
+ }
28
+ exports.WidgetFunnelEventDto = WidgetFunnelEventDto;
29
+ __decorate([
30
+ (0, class_validator_1.IsUUID)(),
31
+ (0, class_transformer_1.Expose)(),
32
+ __metadata("design:type", String)
33
+ ], WidgetFunnelEventDto.prototype, "eventId", void 0);
34
+ __decorate([
35
+ (0, class_validator_1.IsUUID)(),
36
+ (0, class_transformer_1.Expose)(),
37
+ __metadata("design:type", String)
38
+ ], WidgetFunnelEventDto.prototype, "sessionId", void 0);
39
+ __decorate([
40
+ (0, class_validator_1.IsString)(),
41
+ (0, class_validator_1.MaxLength)(64),
42
+ (0, class_transformer_1.Expose)(),
43
+ __metadata("design:type", String)
44
+ ], WidgetFunnelEventDto.prototype, "widgetUid", void 0);
45
+ __decorate([
46
+ (0, class_validator_1.IsOptional)(),
47
+ (0, class_validator_1.IsString)(),
48
+ (0, class_validator_1.MaxLength)(32),
49
+ (0, class_transformer_1.Expose)(),
50
+ __metadata("design:type", String)
51
+ ], WidgetFunnelEventDto.prototype, "widgetType", void 0);
52
+ __decorate([
53
+ (0, class_validator_1.IsEnum)(widget_funnel_kind_enum_1.WidgetFunnelKindEnum),
54
+ (0, class_transformer_1.Expose)(),
55
+ __metadata("design:type", String)
56
+ ], WidgetFunnelEventDto.prototype, "kind", void 0);
57
+ __decorate([
58
+ (0, class_validator_1.IsEnum)(widget_funnel_step_enum_1.WidgetFunnelStepEnum),
59
+ (0, class_transformer_1.Expose)(),
60
+ __metadata("design:type", String)
61
+ ], WidgetFunnelEventDto.prototype, "step", void 0);
62
+ __decorate([
63
+ (0, class_validator_1.IsISO8601)(),
64
+ (0, class_transformer_1.Expose)(),
65
+ __metadata("design:type", String)
66
+ ], WidgetFunnelEventDto.prototype, "occurredAt", void 0);
67
+ __decorate([
68
+ (0, class_validator_1.IsOptional)(),
69
+ (0, class_validator_1.IsObject)(),
70
+ (0, class_transformer_1.Expose)(),
71
+ __metadata("design:type", Object)
72
+ ], WidgetFunnelEventDto.prototype, "meta", void 0);
73
+ /**
74
+ * Батч событий за один flush. Лимит 50 — обычная сессия порождает 5-10
75
+ * шагов; запас на случай агрегированного flush'а при unload.
76
+ */
77
+ class WidgetFunnelEventBatchDto {
78
+ }
79
+ exports.WidgetFunnelEventBatchDto = WidgetFunnelEventBatchDto;
80
+ __decorate([
81
+ (0, class_validator_1.IsArray)(),
82
+ (0, class_validator_1.ArrayMinSize)(1),
83
+ (0, class_validator_1.ArrayMaxSize)(50),
84
+ (0, class_validator_1.ValidateNested)({ each: true }),
85
+ (0, class_transformer_1.Type)(() => WidgetFunnelEventDto),
86
+ (0, class_transformer_1.Expose)(),
87
+ __metadata("design:type", Array)
88
+ ], WidgetFunnelEventBatchDto.prototype, "events", void 0);
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Тип воронки виджета. Один embeddable-виджет может обслуживать обе
3
+ * воронки (например WIDGET_BUTTON показывает и бронирование, и покупку
4
+ * сертификата), поэтому `kind` — это про funnel, а не про widget.type.
5
+ */
6
+ export declare enum WidgetFunnelKindEnum {
7
+ BOOKING = "booking",
8
+ CERTIFICATE = "certificate"
9
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WidgetFunnelKindEnum = void 0;
4
+ /**
5
+ * Тип воронки виджета. Один embeddable-виджет может обслуживать обе
6
+ * воронки (например WIDGET_BUTTON показывает и бронирование, и покупку
7
+ * сертификата), поэтому `kind` — это про funnel, а не про widget.type.
8
+ */
9
+ var WidgetFunnelKindEnum;
10
+ (function (WidgetFunnelKindEnum) {
11
+ WidgetFunnelKindEnum["BOOKING"] = "booking";
12
+ WidgetFunnelKindEnum["CERTIFICATE"] = "certificate";
13
+ })(WidgetFunnelKindEnum || (exports.WidgetFunnelKindEnum = WidgetFunnelKindEnum = {}));
@@ -0,0 +1,45 @@
1
+ import { WidgetFunnelKindEnum } from './widget-funnel-kind.enum';
2
+ /**
3
+ * Канонические шаги воронок виджета. Один общий enum на обе воронки —
4
+ * проще для PG enum-колонки и для агрегации; `kind` всё равно отделяет
5
+ * booking от certificate, но значения шагов не пересекаются намеренно
6
+ * (cert_-префикс), чтобы случайная путаница в коде была невозможна.
7
+ *
8
+ * Порядок шагов внутри каждой воронки задаётся `WIDGET_FUNNEL_STEP_ORDER`.
9
+ */
10
+ export declare enum WidgetFunnelStepEnum {
11
+ /** Показ расписания (срез date|view|questroom). Дедупится per-session. */
12
+ SCHEDULE_VIEW = "schedule_view",
13
+ /** Клик по слоту, hold успешно создан. */
14
+ SLOT_CLICK = "slot_click",
15
+ /** Экран выбора игроков / параметров брони. */
16
+ PLAYERS_STEP = "players_step",
17
+ /** Экран контактных данных. */
18
+ CLIENT_STEP = "client_step",
19
+ /** Preorder создан (зарезервированный слот + client data). */
20
+ PREORDER_CREATED = "preorder_created",
21
+ /** Экран выбора способа оплаты. */
22
+ PAYMENT_STEP = "payment_step",
23
+ /** Нажата кнопка «Оплатить» / «Записаться». */
24
+ PAYMENT_SUBMIT = "payment_submit",
25
+ /** Успех: окно подтверждения / вейвера. */
26
+ PURCHASE = "purchase",
27
+ /** Каталог: выбор доставки / номинала / дизайна. */
28
+ CERT_CATALOG_VIEW = "cert_catalog_view",
29
+ /** Форма клиента / доставки сертификата. */
30
+ CERT_CLIENT_STEP = "cert_client_step",
31
+ /** Черновик продажи создан (получен certificateToken). */
32
+ CERT_SALE_CREATED = "cert_sale_created",
33
+ /** Экран выбора способа оплаты сертификата. */
34
+ CERT_PAYMENT_STEP = "cert_payment_step",
35
+ /** Сертификат оплачен. */
36
+ CERT_PURCHASE = "cert_purchase"
37
+ }
38
+ /**
39
+ * Упорядоченные шаги по воронкам. Используется и на бэке (rollup:
40
+ * «дошёл ли до следующего шага»), и на фронте админки (отрисовка
41
+ * воронки сверху вниз). ЕДИНЫЙ источник правды о порядке.
42
+ */
43
+ export declare const WIDGET_FUNNEL_STEP_ORDER: Record<WidgetFunnelKindEnum, WidgetFunnelStepEnum[]>;
44
+ /** Человекочитаемые подписи шагов для админ-UI. */
45
+ export declare const WIDGET_FUNNEL_STEP_LABELS: Record<WidgetFunnelStepEnum, string>;
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WIDGET_FUNNEL_STEP_LABELS = exports.WIDGET_FUNNEL_STEP_ORDER = exports.WidgetFunnelStepEnum = void 0;
4
+ const widget_funnel_kind_enum_1 = require("./widget-funnel-kind.enum");
5
+ /**
6
+ * Канонические шаги воронок виджета. Один общий enum на обе воронки —
7
+ * проще для PG enum-колонки и для агрегации; `kind` всё равно отделяет
8
+ * booking от certificate, но значения шагов не пересекаются намеренно
9
+ * (cert_-префикс), чтобы случайная путаница в коде была невозможна.
10
+ *
11
+ * Порядок шагов внутри каждой воронки задаётся `WIDGET_FUNNEL_STEP_ORDER`.
12
+ */
13
+ var WidgetFunnelStepEnum;
14
+ (function (WidgetFunnelStepEnum) {
15
+ // --- booking ---
16
+ /** Показ расписания (срез date|view|questroom). Дедупится per-session. */
17
+ WidgetFunnelStepEnum["SCHEDULE_VIEW"] = "schedule_view";
18
+ /** Клик по слоту, hold успешно создан. */
19
+ WidgetFunnelStepEnum["SLOT_CLICK"] = "slot_click";
20
+ /** Экран выбора игроков / параметров брони. */
21
+ WidgetFunnelStepEnum["PLAYERS_STEP"] = "players_step";
22
+ /** Экран контактных данных. */
23
+ WidgetFunnelStepEnum["CLIENT_STEP"] = "client_step";
24
+ /** Preorder создан (зарезервированный слот + client data). */
25
+ WidgetFunnelStepEnum["PREORDER_CREATED"] = "preorder_created";
26
+ /** Экран выбора способа оплаты. */
27
+ WidgetFunnelStepEnum["PAYMENT_STEP"] = "payment_step";
28
+ /** Нажата кнопка «Оплатить» / «Записаться». */
29
+ WidgetFunnelStepEnum["PAYMENT_SUBMIT"] = "payment_submit";
30
+ /** Успех: окно подтверждения / вейвера. */
31
+ WidgetFunnelStepEnum["PURCHASE"] = "purchase";
32
+ // --- certificate ---
33
+ /** Каталог: выбор доставки / номинала / дизайна. */
34
+ WidgetFunnelStepEnum["CERT_CATALOG_VIEW"] = "cert_catalog_view";
35
+ /** Форма клиента / доставки сертификата. */
36
+ WidgetFunnelStepEnum["CERT_CLIENT_STEP"] = "cert_client_step";
37
+ /** Черновик продажи создан (получен certificateToken). */
38
+ WidgetFunnelStepEnum["CERT_SALE_CREATED"] = "cert_sale_created";
39
+ /** Экран выбора способа оплаты сертификата. */
40
+ WidgetFunnelStepEnum["CERT_PAYMENT_STEP"] = "cert_payment_step";
41
+ /** Сертификат оплачен. */
42
+ WidgetFunnelStepEnum["CERT_PURCHASE"] = "cert_purchase";
43
+ })(WidgetFunnelStepEnum || (exports.WidgetFunnelStepEnum = WidgetFunnelStepEnum = {}));
44
+ /**
45
+ * Упорядоченные шаги по воронкам. Используется и на бэке (rollup:
46
+ * «дошёл ли до следующего шага»), и на фронте админки (отрисовка
47
+ * воронки сверху вниз). ЕДИНЫЙ источник правды о порядке.
48
+ */
49
+ exports.WIDGET_FUNNEL_STEP_ORDER = {
50
+ [widget_funnel_kind_enum_1.WidgetFunnelKindEnum.BOOKING]: [
51
+ WidgetFunnelStepEnum.SCHEDULE_VIEW,
52
+ WidgetFunnelStepEnum.SLOT_CLICK,
53
+ WidgetFunnelStepEnum.PLAYERS_STEP,
54
+ WidgetFunnelStepEnum.CLIENT_STEP,
55
+ WidgetFunnelStepEnum.PREORDER_CREATED,
56
+ WidgetFunnelStepEnum.PAYMENT_STEP,
57
+ WidgetFunnelStepEnum.PAYMENT_SUBMIT,
58
+ WidgetFunnelStepEnum.PURCHASE,
59
+ ],
60
+ [widget_funnel_kind_enum_1.WidgetFunnelKindEnum.CERTIFICATE]: [
61
+ WidgetFunnelStepEnum.CERT_CATALOG_VIEW,
62
+ WidgetFunnelStepEnum.CERT_CLIENT_STEP,
63
+ WidgetFunnelStepEnum.CERT_SALE_CREATED,
64
+ WidgetFunnelStepEnum.CERT_PAYMENT_STEP,
65
+ WidgetFunnelStepEnum.CERT_PURCHASE,
66
+ ],
67
+ };
68
+ /** Человекочитаемые подписи шагов для админ-UI. */
69
+ exports.WIDGET_FUNNEL_STEP_LABELS = {
70
+ [WidgetFunnelStepEnum.SCHEDULE_VIEW]: 'Показ расписания',
71
+ [WidgetFunnelStepEnum.SLOT_CLICK]: 'Клик по слоту',
72
+ [WidgetFunnelStepEnum.PLAYERS_STEP]: 'Экран игроков',
73
+ [WidgetFunnelStepEnum.CLIENT_STEP]: 'Контактные данные',
74
+ [WidgetFunnelStepEnum.PREORDER_CREATED]: 'Preorder создан',
75
+ [WidgetFunnelStepEnum.PAYMENT_STEP]: 'Экран оплаты',
76
+ [WidgetFunnelStepEnum.PAYMENT_SUBMIT]: 'Нажал «Оплатить»',
77
+ [WidgetFunnelStepEnum.PURCHASE]: 'Покупка',
78
+ [WidgetFunnelStepEnum.CERT_CATALOG_VIEW]: 'Каталог сертификатов',
79
+ [WidgetFunnelStepEnum.CERT_CLIENT_STEP]: 'Данные / доставка',
80
+ [WidgetFunnelStepEnum.CERT_SALE_CREATED]: 'Черновик продажи',
81
+ [WidgetFunnelStepEnum.CERT_PAYMENT_STEP]: 'Экран оплаты',
82
+ [WidgetFunnelStepEnum.CERT_PURCHASE]: 'Покупка сертификата',
83
+ };
@@ -0,0 +1,52 @@
1
+ import { WidgetFunnelKindEnum } from './widget-funnel-kind.enum';
2
+ import { WidgetFunnelStepEnum } from './widget-funnel-step.enum';
3
+ /** Одна ступень воронки с абсолютными числами и конверсией в следующий шаг. */
4
+ export type WidgetFunnelStepRO = {
5
+ step: WidgetFunnelStepEnum;
6
+ /** Сколько сессий дошло до этого шага за период. */
7
+ sessions: number;
8
+ /** Сколько из них дошло до следующего шага воронки. */
9
+ nextStepSessions: number;
10
+ /** nextStepSessions / sessions (0..1). Для последнего шага = null. */
11
+ stepConversion: number | null;
12
+ /** Медиана stepConversion по компаниям (P50) — только в cross-company. */
13
+ benchmarkP50?: number | null;
14
+ /** P90 stepConversion по компаниям — только в cross-company. */
15
+ benchmarkP90?: number | null;
16
+ };
17
+ /** Воронка одной компании (или платформы) за период. */
18
+ export type WidgetFunnelRO = {
19
+ profileId: number;
20
+ profileTitle?: string;
21
+ kind: WidgetFunnelKindEnum;
22
+ /** '' = агрегат по всем виджетам профиля. */
23
+ widgetUid: string;
24
+ steps: WidgetFunnelStepRO[];
25
+ /** Сессий на первом шаге воронки. */
26
+ entries: number;
27
+ /** Сессий на последнем шаге (покупка). */
28
+ conversions: number;
29
+ /** conversions / entries (0..1). */
30
+ overallConversion: number | null;
31
+ };
32
+ /** Строка кросс-компанийной таблицы: одна компания + где она «течёт». */
33
+ export type WidgetFunnelCompanyRO = {
34
+ profileId: number;
35
+ profileTitle: string;
36
+ entries: number;
37
+ conversions: number;
38
+ overallConversion: number | null;
39
+ /** Шаг с наибольшим относительным оттоком (drop-off) у этой компании. */
40
+ worstStep: WidgetFunnelStepEnum | null;
41
+ worstStepConversion: number | null;
42
+ };
43
+ /** Ответ кросс-компанийного эндпоинта для продуктовой админки. */
44
+ export type WidgetFunnelCrossCompanyRO = {
45
+ kind: WidgetFunnelKindEnum;
46
+ from: string;
47
+ to: string;
48
+ /** Воронка-агрегат по всей платформе + benchmark percentiles на шагах. */
49
+ platform: WidgetFunnelRO;
50
+ /** Список компаний, отсортированный по overallConversion. */
51
+ companies: WidgetFunnelCompanyRO[];
52
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@escapenavigator/types",
3
- "version": "1.10.166",
3
+ "version": "1.10.168",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -23,7 +23,7 @@
23
23
  "reflect-metadata": "^0.1.13",
24
24
  "rxjs": "^7.5.5"
25
25
  },
26
- "gitHead": "db7397183541de1381b854f014288ca16182a43c",
26
+ "gitHead": "5302a068ed1d8bbc5508278412432af4c3accf33",
27
27
  "devDependencies": {
28
28
  "@types/validator": "13.0.0",
29
29
  "typescript": "^5.6"