@sabstravtech/obtservices 0.2.2607131100 → 0.2.2607161130

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.
@@ -18,7 +18,7 @@ export declare class ChatbotCarHireSearchService extends WithSubscriptionCompone
18
18
  private userService;
19
19
  readonly travelType: "car-hire";
20
20
  private pendingDepotChoice;
21
- private carHireSearchParams;
21
+ private get carHireSearchParams();
22
22
  constructor(chatbotService: ChatbotService, searchService: EnterpriseSearchServiceInterface, resultAwareService: ResultAwareService, userService: UserServiceInterface);
23
23
  handle(parameters: ChatSearchParameters, autoSearch: boolean): Promise<void>;
24
24
  private runSearch;
@@ -16,12 +16,17 @@ export declare class ChatbotEurostarSearchService extends WithSubscriptionCompon
16
16
  private searchService;
17
17
  private userService;
18
18
  readonly travelType: "eurostar";
19
- private eurostarSearchParams;
19
+ private get eurostarSearchParams();
20
20
  constructor(chatbotService: ChatbotService, searchService: EnterpriseSearchServiceInterface, userService: UserServiceInterface);
21
21
  handle(parameters: ChatSearchParameters, autoSearch: boolean): Promise<void>;
22
22
  private runSearch;
23
23
  private subscribeToResults;
24
24
  private extractItems;
25
+ /**
26
+ * Friendly fare-tier names, matching how the full Eurostar results list
27
+ * labels each fare column (see eurostar-list.component).
28
+ */
29
+ private static readonly FARE_TIER_NAMES;
25
30
  private buildCard;
26
31
  private populateEurostarParams;
27
32
  private mapCabinClass;
@@ -18,7 +18,7 @@ export declare class ChatbotFastTrackSearchService extends WithSubscriptionCompo
18
18
  private resultAwareService;
19
19
  private userService;
20
20
  readonly travelType: "fast-track";
21
- private fastTrackSearchParams;
21
+ private get fastTrackSearchParams();
22
22
  private resolvedAirport;
23
23
  constructor(chatbotService: ChatbotService, searchService: EnterpriseSearchServiceInterface, resultAwareService: ResultAwareService, userService: UserServiceInterface);
24
24
  handle(parameters: ChatSearchParameters, autoSearch: boolean): Promise<void>;
@@ -24,7 +24,7 @@ export declare class ChatbotFlightSearchService extends WithSubscriptionComponen
24
24
  * carries new ranking intent) can still render card headers/dates.
25
25
  */
26
26
  private lastSearchParameters;
27
- private flightSearchParams;
27
+ private get flightSearchParams();
28
28
  constructor(chatbotService: ChatbotService, searchService: EnterpriseSearchServiceInterface, resultAwareService: ResultAwareService, userService: UserServiceInterface);
29
29
  /** The flight search's current validation messages, empty-filtered. */
30
30
  private readValidationMessages;
@@ -21,7 +21,7 @@ export declare class ChatbotHotelSearchService extends WithSubscriptionComponent
21
21
  private userService;
22
22
  readonly travelType: "hotel";
23
23
  lastParameters: ChatSearchParameters | null;
24
- hotelSearchParams: HotelEnterpriseSearchInterface;
24
+ get hotelSearchParams(): HotelEnterpriseSearchInterface;
25
25
  markAsLoading(): void;
26
26
  get hasHotelResults(): boolean;
27
27
  constructor(chatbotService: ChatbotService, searchService: EnterpriseSearchServiceInterface, hotelAvalibilityService: HotelAvalibilityService, resultAwareService: ResultAwareService, userService: UserServiceInterface);
@@ -18,7 +18,7 @@ export declare class ChatbotLoungeSearchService extends WithSubscriptionComponen
18
18
  private resultAwareService;
19
19
  private userService;
20
20
  readonly travelType: "lounge";
21
- private loungeSearchParams;
21
+ private get loungeSearchParams();
22
22
  constructor(chatbotService: ChatbotService, searchService: EnterpriseSearchServiceInterface, resultAwareService: ResultAwareService, userService: UserServiceInterface);
23
23
  handle(parameters: ChatSearchParameters, autoSearch: boolean): Promise<void>;
24
24
  private subscribeToLoungeResults;
@@ -9,7 +9,7 @@ export declare class ChatbotParkingSearchService extends WithSubscriptionCompone
9
9
  private resultAwareService;
10
10
  private userService;
11
11
  readonly travelType: "parking";
12
- private parkingSearchParams;
12
+ private get parkingSearchParams();
13
13
  private resultsSubscription;
14
14
  constructor(chatbotService: ChatbotService, searchService: EnterpriseSearchServiceInterface, resultAwareService: ResultAwareService, userService: UserServiceInterface);
15
15
  handle(parameters: ChatSearchParameters, autoSearch: boolean): Promise<void>;
@@ -19,7 +19,7 @@ export declare class ChatbotRailSearchService extends WithSubscriptionComponent
19
19
  private resultAwareService;
20
20
  private userService;
21
21
  readonly travelType: "rail";
22
- private railSearchParams;
22
+ private get railSearchParams();
23
23
  constructor(chatbotService: ChatbotService, searchService: EnterpriseSearchServiceInterface, resultAwareService: ResultAwareService, userService: UserServiceInterface);
24
24
  handle(parameters: ChatSearchParameters, autoSearch: boolean): Promise<void>;
25
25
  /**
@@ -11,7 +11,7 @@ export declare class ChatbotTaxiSearchService extends WithSubscriptionComponent
11
11
  private resultAwareService;
12
12
  private userService;
13
13
  readonly travelType: "taxi";
14
- private taxiSearchParams;
14
+ private get taxiSearchParams();
15
15
  chatbotFilterId: string | null;
16
16
  lastParameters: ChatSearchParameters | null;
17
17
  get hasTaxiResults(): boolean;
@@ -1,4 +1,4 @@
1
- export type ChatConversationState = 'GREETING' | 'COLLECTING_PARAMS' | 'PARAMS_COMPLETE' | 'SEARCHING' | 'RESULTS_READY' | 'HANDED_OFF' | 'SELECTING_RESULT' | 'BLOCKED';
1
+ export type ChatConversationState = 'GREETING' | 'COLLECTING_PARAMS' | 'PARAMS_COMPLETE' | 'SEARCHING' | 'RESULTS_READY' | 'HANDED_OFF' | 'SELECTING_RESULT' | 'AWAITING_CONFIRMATION' | 'BLOCKED';
2
2
  /** Policy compliance state shown on a chatbot result card. */
3
3
  export type ChatPolicyStatus = 'IN_POLICY' | 'ALLOW_WITH_REASON' | 'UNAVAILABLE';
4
4
  /** A curated FAQ shown in the chat widget's browse-and-select view (no AI). */
@@ -18410,20 +18410,27 @@ class ChatbotService extends BaseChatbotService {
18410
18410
  this.notifyResort(env.parameters);
18411
18411
  return;
18412
18412
  }
18413
+ const hasSearchForm = travelType === 'rail' ||
18414
+ travelType === 'flight' ||
18415
+ travelType === 'hotel' ||
18416
+ travelType === 'car-hire' ||
18417
+ travelType === 'eurostar' ||
18418
+ travelType === 'lounge' ||
18419
+ travelType === 'fast-track' ||
18420
+ travelType === 'taxi' ||
18421
+ travelType === 'parking';
18413
18422
  // Auto-trigger a search as soon as the bot signals parameters are complete.
18414
18423
  // The dispatcher routes to the travel-type handler, which owns the search +
18415
18424
  // result-capture flow.
18416
- if (env.state === 'PARAMS_COMPLETE' &&
18417
- (travelType === 'rail' ||
18418
- travelType === 'flight' ||
18419
- travelType === 'hotel' ||
18420
- travelType === 'car-hire' ||
18421
- travelType === 'eurostar' ||
18422
- travelType === 'lounge' ||
18423
- travelType === 'fast-track' ||
18424
- travelType === 'taxi' ||
18425
- travelType === 'parking')) {
18425
+ if (env.state === 'PARAMS_COMPLETE' && hasSearchForm) {
18426
18426
  this.notifyFillForm(env.parameters, true);
18427
+ return;
18428
+ }
18429
+ // The user already has a booking of this type on the search date. Fill the
18430
+ // form but do NOT search: they read the warning first, and press Search
18431
+ // themselves if they still want it. Same call, autoSearch off.
18432
+ if (env.state === 'AWAITING_CONFIRMATION' && hasSearchForm) {
18433
+ this.notifyFillForm(env.parameters, false);
18427
18434
  }
18428
18435
  }
18429
18436
  // ── Public helpers for travel-type handlers ──────────────────────────────
@@ -18585,14 +18592,18 @@ class ChatbotRailSearchService extends WithSubscriptionComponent {
18585
18592
  resultAwareService;
18586
18593
  userService;
18587
18594
  travelType = 'rail';
18588
- railSearchParams;
18595
+ // Read the live rail-search object on every access. Caching it in the
18596
+ // constructor captured `null` on enterprise (the slot is populated later),
18597
+ // which made every chatbot rail search throw on `changeLocation`.
18598
+ get railSearchParams() {
18599
+ return this.searchService.searches[ServiceType.Rail];
18600
+ }
18589
18601
  constructor(chatbotService, searchService, resultAwareService, userService) {
18590
18602
  super();
18591
18603
  this.chatbotService = chatbotService;
18592
18604
  this.searchService = searchService;
18593
18605
  this.resultAwareService = resultAwareService;
18594
18606
  this.userService = userService;
18595
- this.railSearchParams = this.searchService.searches[ServiceType.Rail];
18596
18607
  }
18597
18608
  async handle(parameters, autoSearch) {
18598
18609
  selectSearchServiceType(this.searchService, ServiceType.Rail);
@@ -18982,14 +18993,17 @@ class ChatbotFlightSearchService extends WithSubscriptionComponent {
18982
18993
  * carries new ranking intent) can still render card headers/dates.
18983
18994
  */
18984
18995
  lastSearchParameters = null;
18985
- flightSearchParams;
18996
+ // Live getter — caching this in the constructor captured `null` on
18997
+ // enterprise (the slot is populated later), so the search threw on first use.
18998
+ get flightSearchParams() {
18999
+ return this.searchService.searches[ServiceType.Flight];
19000
+ }
18986
19001
  constructor(chatbotService, searchService, resultAwareService, userService) {
18987
19002
  super();
18988
19003
  this.chatbotService = chatbotService;
18989
19004
  this.searchService = searchService;
18990
19005
  this.resultAwareService = resultAwareService;
18991
19006
  this.userService = userService;
18992
- this.flightSearchParams = this.searchService.searches[ServiceType.Flight];
18993
19007
  }
18994
19008
  /** The flight search's current validation messages, empty-filtered. */
18995
19009
  readValidationMessages() {
@@ -20053,7 +20067,11 @@ class ChatbotHotelSearchService extends WithSubscriptionComponent {
20053
20067
  userService;
20054
20068
  travelType = 'hotel';
20055
20069
  lastParameters = null;
20056
- hotelSearchParams;
20070
+ // Live getter — caching this in the constructor captured `null` on
20071
+ // enterprise (the slot is populated later), so the search threw on first use.
20072
+ get hotelSearchParams() {
20073
+ return this.searchService.searches[ServiceType.Hotel];
20074
+ }
20057
20075
  markAsLoading() {
20058
20076
  this.hotelSearchParams.isLoading?.next(true);
20059
20077
  }
@@ -20067,7 +20085,6 @@ class ChatbotHotelSearchService extends WithSubscriptionComponent {
20067
20085
  this.hotelAvalibilityService = hotelAvalibilityService;
20068
20086
  this.resultAwareService = resultAwareService;
20069
20087
  this.userService = userService;
20070
- this.hotelSearchParams = this.searchService.searches[ServiceType.Hotel];
20071
20088
  }
20072
20089
  async handle(parameters, autoSearch) {
20073
20090
  this.lastParameters = parameters;
@@ -20418,14 +20435,17 @@ class ChatbotCarHireSearchService extends WithSubscriptionComponent {
20418
20435
  userService;
20419
20436
  travelType = 'car-hire';
20420
20437
  pendingDepotChoice = null;
20421
- carHireSearchParams;
20438
+ // Live getter — caching this in the constructor captured `null` on
20439
+ // enterprise (the slot is populated later), so the search threw on first use.
20440
+ get carHireSearchParams() {
20441
+ return this.searchService.searches[ServiceType.Car];
20442
+ }
20422
20443
  constructor(chatbotService, searchService, resultAwareService, userService) {
20423
20444
  super();
20424
20445
  this.chatbotService = chatbotService;
20425
20446
  this.searchService = searchService;
20426
20447
  this.resultAwareService = resultAwareService;
20427
20448
  this.userService = userService;
20428
- this.carHireSearchParams = this.searchService.searches[ServiceType.Car];
20429
20449
  }
20430
20450
  async handle(parameters, autoSearch) {
20431
20451
  // Clear any pending depot choice from a previous interaction.
@@ -21154,7 +21174,11 @@ class ChatbotTaxiSearchService extends WithSubscriptionComponent {
21154
21174
  resultAwareService;
21155
21175
  userService;
21156
21176
  travelType = 'taxi';
21157
- taxiSearchParams;
21177
+ // Live getter — caching this in the constructor captured `null` on
21178
+ // enterprise (the slot is populated later), so the search threw on first use.
21179
+ get taxiSearchParams() {
21180
+ return this.searchService.searches[ServiceType.Cab];
21181
+ }
21158
21182
  chatbotFilterId = null;
21159
21183
  lastParameters = null;
21160
21184
  get hasTaxiResults() {
@@ -21169,7 +21193,6 @@ class ChatbotTaxiSearchService extends WithSubscriptionComponent {
21169
21193
  this.searchService = searchService;
21170
21194
  this.resultAwareService = resultAwareService;
21171
21195
  this.userService = userService;
21172
- this.taxiSearchParams = this.searchService.searches[ServiceType.Cab];
21173
21196
  }
21174
21197
  async handle(parameters, autoSearch) {
21175
21198
  selectSearchServiceType(this.searchService, ServiceType.Cab);
@@ -21409,13 +21432,16 @@ class ChatbotEurostarSearchService extends WithSubscriptionComponent {
21409
21432
  searchService;
21410
21433
  userService;
21411
21434
  travelType = 'eurostar';
21412
- eurostarSearchParams;
21435
+ // Live getter — caching this in the constructor captured `null` on
21436
+ // enterprise (the slot is populated later), so the search threw on first use.
21437
+ get eurostarSearchParams() {
21438
+ return this.searchService.searches[ServiceType.Eurostar];
21439
+ }
21413
21440
  constructor(chatbotService, searchService, userService) {
21414
21441
  super();
21415
21442
  this.chatbotService = chatbotService;
21416
21443
  this.searchService = searchService;
21417
21444
  this.userService = userService;
21418
- this.eurostarSearchParams = this.searchService.searches[ServiceType.Eurostar];
21419
21445
  }
21420
21446
  async handle(parameters, autoSearch) {
21421
21447
  selectSearchServiceType(this.searchService, ServiceType.Eurostar);
@@ -21518,6 +21544,15 @@ class ChatbotEurostarSearchService extends WithSubscriptionComponent {
21518
21544
  }
21519
21545
  return [];
21520
21546
  }
21547
+ /**
21548
+ * Friendly fare-tier names, matching how the full Eurostar results list
21549
+ * labels each fare column (see eurostar-list.component).
21550
+ */
21551
+ static FARE_TIER_NAMES = {
21552
+ standardFare: 'Eurostar Standard',
21553
+ standardPremierFare: 'Eurostar Plus',
21554
+ businessPremierFare: 'Eurostar Premier'
21555
+ };
21521
21556
  buildCard(item, index) {
21522
21557
  const fares = [];
21523
21558
  for (const classType of [
@@ -21531,7 +21566,7 @@ class ChatbotEurostarSearchService extends WithSubscriptionComponent {
21531
21566
  }
21532
21567
  const isUnavailable = !!fare.unavailable;
21533
21568
  fares.push({
21534
- class: fare.class ?? classType,
21569
+ class: ChatbotEurostarSearchService.FARE_TIER_NAMES[classType] ?? fare.class ?? classType,
21535
21570
  price: fare.price ?? 0,
21536
21571
  currency: fare.currency ?? 'GBP',
21537
21572
  policyStatus: isUnavailable
@@ -21683,14 +21718,18 @@ class ChatbotLoungeSearchService extends WithSubscriptionComponent {
21683
21718
  resultAwareService;
21684
21719
  userService;
21685
21720
  travelType = 'lounge';
21686
- loungeSearchParams;
21721
+ // Read the live lounge-search object on every access. Caching it in the
21722
+ // constructor captured `null` on enterprise (the slot is populated later),
21723
+ // which made every chatbot lounge search throw on `results`.
21724
+ get loungeSearchParams() {
21725
+ return this.searchService.searches[ServiceType.Lounge];
21726
+ }
21687
21727
  constructor(chatbotService, searchService, resultAwareService, userService) {
21688
21728
  super();
21689
21729
  this.chatbotService = chatbotService;
21690
21730
  this.searchService = searchService;
21691
21731
  this.resultAwareService = resultAwareService;
21692
21732
  this.userService = userService;
21693
- this.loungeSearchParams = this.searchService.searches[ServiceType.Lounge];
21694
21733
  }
21695
21734
  async handle(parameters, autoSearch) {
21696
21735
  selectSearchServiceType(this.searchService, ServiceType.Lounge);
@@ -21871,7 +21910,11 @@ class ChatbotFastTrackSearchService extends WithSubscriptionComponent {
21871
21910
  resultAwareService;
21872
21911
  userService;
21873
21912
  travelType = 'fast-track';
21874
- fastTrackSearchParams;
21913
+ // Live getter — caching this in the constructor captured `null` on
21914
+ // enterprise (the slot is populated later), so the search threw on first use.
21915
+ get fastTrackSearchParams() {
21916
+ return this.searchService.searches[ServiceType.FastTrack];
21917
+ }
21875
21918
  resolvedAirport = null;
21876
21919
  constructor(chatbotService, searchService, resultAwareService, userService) {
21877
21920
  super();
@@ -21879,7 +21922,6 @@ class ChatbotFastTrackSearchService extends WithSubscriptionComponent {
21879
21922
  this.searchService = searchService;
21880
21923
  this.resultAwareService = resultAwareService;
21881
21924
  this.userService = userService;
21882
- this.fastTrackSearchParams = this.searchService.searches[ServiceType.FastTrack];
21883
21925
  }
21884
21926
  async handle(parameters, autoSearch) {
21885
21927
  selectSearchServiceType(this.searchService, ServiceType.FastTrack);
@@ -22042,7 +22084,11 @@ class ChatbotParkingSearchService extends WithSubscriptionComponent {
22042
22084
  resultAwareService;
22043
22085
  userService;
22044
22086
  travelType = 'parking';
22045
- parkingSearchParams;
22087
+ // Live getter — caching this in the constructor captured `null` on
22088
+ // enterprise (the slot is populated later), so the search threw on first use.
22089
+ get parkingSearchParams() {
22090
+ return this.searchService.searches[ServiceType.Parking];
22091
+ }
22046
22092
  resultsSubscription = null;
22047
22093
  constructor(chatbotService, searchService, resultAwareService, userService) {
22048
22094
  super();
@@ -22050,7 +22096,6 @@ class ChatbotParkingSearchService extends WithSubscriptionComponent {
22050
22096
  this.searchService = searchService;
22051
22097
  this.resultAwareService = resultAwareService;
22052
22098
  this.userService = userService;
22053
- this.parkingSearchParams = this.searchService.searches[ServiceType.Parking];
22054
22099
  }
22055
22100
  async handle(parameters, autoSearch) {
22056
22101
  selectSearchServiceType(this.searchService, ServiceType.Parking);