@useinsider/guido 3.12.0-beta.0c5c36f → 3.12.0-beta.19da4fb

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.
Files changed (72) hide show
  1. package/dist/@types/config/schemas.js +9 -4
  2. package/dist/components/Guido.vue.js +8 -8
  3. package/dist/components/Guido.vue2.js +58 -56
  4. package/dist/components/organisms/extensions/recommendation/StrategyDetailDrawer.vue.js +38 -0
  5. package/dist/components/organisms/extensions/recommendation/StrategyDetailDrawer.vue2.js +271 -0
  6. package/dist/components/organisms/extensions/recommendation/StrategyInfoBox.vue.js +20 -0
  7. package/dist/components/organisms/extensions/recommendation/StrategyInfoBox.vue2.js +16 -0
  8. package/dist/components/organisms/extensions/recommendation/StrategyPicker.vue.js +20 -0
  9. package/dist/components/organisms/extensions/recommendation/StrategyPicker.vue2.js +80 -0
  10. package/dist/components/organisms/extensions/recommendation/strategy-detail/CampaignTable.vue.js +18 -0
  11. package/dist/components/organisms/extensions/recommendation/strategy-detail/CampaignTable.vue2.js +42 -0
  12. package/dist/components/organisms/extensions/recommendation/strategy-detail/FilterHumanizer.vue.js +20 -0
  13. package/dist/components/organisms/extensions/recommendation/strategy-detail/FilterHumanizer.vue2.js +18 -0
  14. package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerCondition.vue.js +20 -0
  15. package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerCondition.vue2.js +60 -0
  16. package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerGroup.vue.js +19 -0
  17. package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerGroup.vue2.js +19 -0
  18. package/dist/components/organisms/extensions/recommendation/strategy-detail/InfoDisplayValue.vue.js +22 -0
  19. package/dist/components/organisms/extensions/recommendation/strategy-detail/InfoDisplayValue.vue2.js +29 -0
  20. package/dist/composables/useRecommendation.js +82 -51
  21. package/dist/composables/useStrategyFilters.js +16 -0
  22. package/dist/config/migrator/recommendationMigrator.js +7 -4
  23. package/dist/enums/date.js +4 -3
  24. package/dist/enums/extensions/filteringV2.js +1024 -0
  25. package/dist/enums/extensions/recommendationBlock.js +43 -29
  26. package/dist/enums/extensions/strategyDetail.js +148 -0
  27. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +12 -11
  28. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +137 -119
  29. package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +57 -0
  30. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +392 -112
  31. package/dist/extensions/Blocks/Recommendation/utils/strategyHumanizer.js +97 -0
  32. package/dist/extensions/Blocks/Recommendation/utils/strategyInfoBox.js +24 -0
  33. package/dist/extensions/Blocks/Recommendation/utils/strategyNavigation.js +8 -0
  34. package/dist/extensions/Blocks/Recommendation/utils/strategySummary.js +95 -0
  35. package/dist/extensions/Blocks/Recommendation/validation/requiredFields.js +24 -10
  36. package/dist/guido.css +1 -1
  37. package/dist/node_modules/@vueuse/core/index.js +48 -0
  38. package/dist/node_modules/@vueuse/shared/index.js +57 -27
  39. package/dist/services/recommendationApi.js +86 -29
  40. package/dist/src/@types/config/schemas.d.ts +10 -0
  41. package/dist/src/components/organisms/extensions/recommendation/StrategyDetailDrawer.vue.d.ts +2 -0
  42. package/dist/src/components/organisms/extensions/recommendation/StrategyInfoBox.vue.d.ts +26 -0
  43. package/dist/src/components/organisms/extensions/recommendation/StrategyPicker.vue.d.ts +2 -0
  44. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/CampaignTable.vue.d.ts +43 -0
  45. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/FilterHumanizer.vue.d.ts +29 -0
  46. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/HumanizerCondition.vue.d.ts +40 -0
  47. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/HumanizerGroup.vue.d.ts +38 -0
  48. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/InfoDisplayValue.vue.d.ts +51 -0
  49. package/dist/src/composables/useConfig.d.ts +2 -0
  50. package/dist/src/composables/useRecommendation.d.ts +2 -0
  51. package/dist/src/composables/useStrategyFilters.d.ts +24 -0
  52. package/dist/src/enums/extensions/filteringV2.d.ts +72 -0
  53. package/dist/src/enums/extensions/recommendationBlock.d.ts +21 -0
  54. package/dist/src/enums/extensions/strategyDetail.d.ts +90 -0
  55. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +10 -4
  56. package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +16 -0
  57. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +894 -1
  58. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +7 -0
  59. package/dist/src/extensions/Blocks/Recommendation/utils/strategyHumanizer.d.ts +50 -0
  60. package/dist/src/extensions/Blocks/Recommendation/utils/strategyInfoBox.d.ts +33 -0
  61. package/dist/src/extensions/Blocks/Recommendation/utils/strategyNavigation.d.ts +10 -0
  62. package/dist/src/extensions/Blocks/Recommendation/utils/strategySummary.d.ts +34 -0
  63. package/dist/src/extensions/Blocks/Recommendation/validation/requiredFields.d.ts +8 -1
  64. package/dist/src/mock/api/recommendation-strategies.d.ts +2 -0
  65. package/dist/src/services/recommendationApi.d.ts +8 -1
  66. package/dist/src/stores/config.d.ts +18 -0
  67. package/dist/src/utils/genericUtil.d.ts +9 -0
  68. package/dist/static/styles/base.css.js +25 -0
  69. package/dist/utils/dateUtil.js +23 -10
  70. package/dist/utils/genericUtil.js +10 -1
  71. package/dist/utils/templatePreparation.js +70 -57
  72. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import type { Orientation, Languages, Currency, NumericSeparator, FiltersResponse, Filter, RecommendationProduct } from '@@/Types/recommendation';
1
+ import type { Orientation, Languages, Currency, NumericSeparator, FiltersResponse, Filter, RecommendationProduct, RrsCampaign, RrsStrategy } from '@@/Types/recommendation';
2
2
  export interface PerBlockConfigs {
3
3
  cardsInRow: number;
4
4
  currencySettings: {
@@ -21,6 +21,8 @@ export interface PerBlockConfigs {
21
21
  sendProductRequestFlag: boolean;
22
22
  shuffleProducts: boolean;
23
23
  strategy: string;
24
+ /** RRS strategy id; empty string when no strategy is assigned */
25
+ strategyId: string;
24
26
  textTrimming: boolean;
25
27
  unresponsive: boolean;
26
28
  size: string;
@@ -33,6 +35,8 @@ interface PerBlockState {
33
35
  recommendationProducts: RecommendationProduct[];
34
36
  filterStatus: boolean;
35
37
  filterSelectionDrawerStatus: boolean;
38
+ /** Whether the RRS detail drawer is open for this block */
39
+ strategyDetailDrawerStatus: boolean;
36
40
  filterGroup: number;
37
41
  /** Whether initial API data (filters, algorithms, products) has been fetched for this block */
38
42
  isInitialized: boolean;
@@ -47,6 +51,8 @@ interface PerBlockState {
47
51
  */
48
52
  export interface PerBlockUrlConfig {
49
53
  strategy: string;
54
+ /** RRS strategy id; empty string when the block still uses an algorithm. */
55
+ strategyId: string;
50
56
  language: string;
51
57
  size: string;
52
58
  productIds: string[];
@@ -64,6 +70,37 @@ interface StoreState {
64
70
  languages: Languages;
65
71
  currencyList: Currency[];
66
72
  filterList: FiltersResponse;
73
+ /** Reusable Recommendation Strategies available to the EMAIL channel */
74
+ strategies: RrsStrategy[];
75
+ /** True while the strategy listing is in flight, so the panel can show a loading state */
76
+ strategiesLoading: boolean;
77
+ /** Campaigns using the strategy currently shown in the detail drawer */
78
+ strategyCampaigns: RrsCampaign[];
79
+ /** True while the campaign list is in flight */
80
+ strategyCampaignsLoading: boolean;
81
+ /** Strategy id `strategyCampaigns` was loaded for; null when nothing is loaded */
82
+ strategyCampaignsFetchedFor: string | null;
83
+ /**
84
+ * Resolved recommendation-URL template per strategy id, with placeholders still
85
+ * unsubstituted. `buildCampaignUrl` is synchronous, so the template has to be
86
+ * cached here before it runs — an empty string records "asked, but the strategy
87
+ * has no usable URL", which stops a broken id being retried on every compile.
88
+ */
89
+ strategyUrlTemplates: Record<string, string>;
90
+ /**
91
+ * Whether a strategy control is currently on screen. The picker itself is a
92
+ * design-system `InSelect` rendered at app level and positioned over an anchor
93
+ * inside Stripo's panel, so it has to follow the panel's own mount/unmount.
94
+ */
95
+ strategyPickerVisible: boolean;
96
+ /**
97
+ * Bumped on every panel render. Stripo replaces the anchor element wholesale
98
+ * when the user selects another block, so the overlay re-queries on change
99
+ * rather than holding a stale node.
100
+ */
101
+ strategyPickerVersion: number;
102
+ /** True while a Duplicate-and-Assign round trip is in flight. */
103
+ strategyDuplicating: boolean;
67
104
  blockStates: Record<number, PerBlockState>;
68
105
  currentRecommendationId: number | null;
69
106
  configVersion: number;
@@ -82,6 +119,62 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
82
119
  value: string;
83
120
  }[];
84
121
  filterList: FiltersResponse;
122
+ strategies: {
123
+ strategy_id: number;
124
+ name: string;
125
+ algorithm: string;
126
+ status: string;
127
+ size: number;
128
+ suitable_channels: string;
129
+ updated_at: string;
130
+ algorithm_used?: string | undefined;
131
+ exclude_view?: (boolean | number) | undefined;
132
+ exclude_purchase?: (boolean | number) | undefined;
133
+ exclude_cart?: (boolean | number) | undefined;
134
+ filters?: string | undefined;
135
+ manual_merchandising_products?: string | undefined;
136
+ mixed_strategies?: string | undefined;
137
+ suitable_page_types?: (string | string[]) | undefined;
138
+ base_product?: string | undefined;
139
+ checkout_recommendation_cart_value?: (number | string) | undefined;
140
+ shuffle?: (boolean | number) | undefined;
141
+ attribute_affinity?: (boolean | number) | undefined;
142
+ is_user_context_filter_optional?: (boolean | number) | undefined;
143
+ last_updated_by?: string | undefined;
144
+ created_at?: string | undefined;
145
+ exclude_view_option?: string | undefined;
146
+ exclude_view_duration?: number | undefined;
147
+ exclude_view_duration_type?: string | undefined;
148
+ exclude_view_item_count?: number | undefined;
149
+ exclude_purchase_option?: string | undefined;
150
+ exclude_purchase_duration?: number | undefined;
151
+ exclude_purchase_duration_type?: string | undefined;
152
+ exclude_purchase_item_count?: number | undefined;
153
+ campaignCount?: {
154
+ active?: number | undefined;
155
+ passive?: number | undefined;
156
+ test?: number | undefined;
157
+ } | undefined;
158
+ }[];
159
+ strategiesLoading: boolean;
160
+ strategyCampaigns: {
161
+ id: string | number;
162
+ name: string;
163
+ status: string;
164
+ variants: {
165
+ id?: (number | string) | undefined;
166
+ name: string;
167
+ }[];
168
+ channel: string;
169
+ productAlias?: string | undefined;
170
+ isPreventing?: boolean | undefined;
171
+ }[];
172
+ strategyCampaignsLoading: boolean;
173
+ strategyCampaignsFetchedFor: string | null;
174
+ strategyUrlTemplates: Record<string, string>;
175
+ strategyPickerVisible: boolean;
176
+ strategyPickerVersion: number;
177
+ strategyDuplicating: boolean;
85
178
  blockStates: Record<number, PerBlockState>;
86
179
  currentRecommendationId: number | null;
87
180
  configVersion: number;
@@ -98,6 +191,62 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
98
191
  value: string;
99
192
  }[];
100
193
  filterList: FiltersResponse;
194
+ strategies: {
195
+ strategy_id: number;
196
+ name: string;
197
+ algorithm: string;
198
+ status: string;
199
+ size: number;
200
+ suitable_channels: string;
201
+ updated_at: string;
202
+ algorithm_used?: string | undefined;
203
+ exclude_view?: (boolean | number) | undefined;
204
+ exclude_purchase?: (boolean | number) | undefined;
205
+ exclude_cart?: (boolean | number) | undefined;
206
+ filters?: string | undefined;
207
+ manual_merchandising_products?: string | undefined;
208
+ mixed_strategies?: string | undefined;
209
+ suitable_page_types?: (string | string[]) | undefined;
210
+ base_product?: string | undefined;
211
+ checkout_recommendation_cart_value?: (number | string) | undefined;
212
+ shuffle?: (boolean | number) | undefined;
213
+ attribute_affinity?: (boolean | number) | undefined;
214
+ is_user_context_filter_optional?: (boolean | number) | undefined;
215
+ last_updated_by?: string | undefined;
216
+ created_at?: string | undefined;
217
+ exclude_view_option?: string | undefined;
218
+ exclude_view_duration?: number | undefined;
219
+ exclude_view_duration_type?: string | undefined;
220
+ exclude_view_item_count?: number | undefined;
221
+ exclude_purchase_option?: string | undefined;
222
+ exclude_purchase_duration?: number | undefined;
223
+ exclude_purchase_duration_type?: string | undefined;
224
+ exclude_purchase_item_count?: number | undefined;
225
+ campaignCount?: {
226
+ active?: number | undefined;
227
+ passive?: number | undefined;
228
+ test?: number | undefined;
229
+ } | undefined;
230
+ }[];
231
+ strategiesLoading: boolean;
232
+ strategyCampaigns: {
233
+ id: string | number;
234
+ name: string;
235
+ status: string;
236
+ variants: {
237
+ id?: (number | string) | undefined;
238
+ name: string;
239
+ }[];
240
+ channel: string;
241
+ productAlias?: string | undefined;
242
+ isPreventing?: boolean | undefined;
243
+ }[];
244
+ strategyCampaignsLoading: boolean;
245
+ strategyCampaignsFetchedFor: string | null;
246
+ strategyUrlTemplates: Record<string, string>;
247
+ strategyPickerVisible: boolean;
248
+ strategyPickerVersion: number;
249
+ strategyDuplicating: boolean;
101
250
  blockStates: Record<number, PerBlockState>;
102
251
  currentRecommendationId: number | null;
103
252
  configVersion: number;
@@ -114,6 +263,134 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
114
263
  value: string;
115
264
  }[];
116
265
  filterList: FiltersResponse;
266
+ strategies: {
267
+ strategy_id: number;
268
+ name: string;
269
+ algorithm: string;
270
+ status: string;
271
+ size: number;
272
+ suitable_channels: string;
273
+ updated_at: string;
274
+ algorithm_used?: string | undefined;
275
+ exclude_view?: (boolean | number) | undefined;
276
+ exclude_purchase?: (boolean | number) | undefined;
277
+ exclude_cart?: (boolean | number) | undefined;
278
+ filters?: string | undefined;
279
+ manual_merchandising_products?: string | undefined;
280
+ mixed_strategies?: string | undefined;
281
+ suitable_page_types?: (string | string[]) | undefined;
282
+ base_product?: string | undefined;
283
+ checkout_recommendation_cart_value?: (number | string) | undefined;
284
+ shuffle?: (boolean | number) | undefined;
285
+ attribute_affinity?: (boolean | number) | undefined;
286
+ is_user_context_filter_optional?: (boolean | number) | undefined;
287
+ last_updated_by?: string | undefined;
288
+ created_at?: string | undefined;
289
+ exclude_view_option?: string | undefined;
290
+ exclude_view_duration?: number | undefined;
291
+ exclude_view_duration_type?: string | undefined;
292
+ exclude_view_item_count?: number | undefined;
293
+ exclude_purchase_option?: string | undefined;
294
+ exclude_purchase_duration?: number | undefined;
295
+ exclude_purchase_duration_type?: string | undefined;
296
+ exclude_purchase_item_count?: number | undefined;
297
+ campaignCount?: {
298
+ active?: number | undefined;
299
+ passive?: number | undefined;
300
+ test?: number | undefined;
301
+ } | undefined;
302
+ }[];
303
+ strategiesLoading: boolean;
304
+ strategyCampaigns: {
305
+ id: string | number;
306
+ name: string;
307
+ status: string;
308
+ variants: {
309
+ id?: (number | string) | undefined;
310
+ name: string;
311
+ }[];
312
+ channel: string;
313
+ productAlias?: string | undefined;
314
+ isPreventing?: boolean | undefined;
315
+ }[];
316
+ strategyCampaignsLoading: boolean;
317
+ strategyCampaignsFetchedFor: string | null;
318
+ strategyUrlTemplates: Record<string, string>;
319
+ strategyPickerVisible: boolean;
320
+ strategyPickerVersion: number;
321
+ strategyDuplicating: boolean;
322
+ blockStates: Record<number, PerBlockState>;
323
+ currentRecommendationId: number | null;
324
+ configVersion: number;
325
+ } & import("pinia").PiniaCustomStateProperties<StoreState>): boolean;
326
+ /**
327
+ * Proxy getter: delegates to blockStates[currentRecommendationId].strategyDetailDrawerStatus
328
+ */
329
+ strategyDetailDrawerStatus(state: {
330
+ recommendationCampaignUrls: Record<string, string>;
331
+ activePredictiveAlgorithms: number[];
332
+ languages: Languages;
333
+ currencyList: {
334
+ text: string;
335
+ value: string;
336
+ }[];
337
+ filterList: FiltersResponse;
338
+ strategies: {
339
+ strategy_id: number;
340
+ name: string;
341
+ algorithm: string;
342
+ status: string;
343
+ size: number;
344
+ suitable_channels: string;
345
+ updated_at: string;
346
+ algorithm_used?: string | undefined;
347
+ exclude_view?: (boolean | number) | undefined;
348
+ exclude_purchase?: (boolean | number) | undefined;
349
+ exclude_cart?: (boolean | number) | undefined;
350
+ filters?: string | undefined;
351
+ manual_merchandising_products?: string | undefined;
352
+ mixed_strategies?: string | undefined;
353
+ suitable_page_types?: (string | string[]) | undefined;
354
+ base_product?: string | undefined;
355
+ checkout_recommendation_cart_value?: (number | string) | undefined;
356
+ shuffle?: (boolean | number) | undefined;
357
+ attribute_affinity?: (boolean | number) | undefined;
358
+ is_user_context_filter_optional?: (boolean | number) | undefined;
359
+ last_updated_by?: string | undefined;
360
+ created_at?: string | undefined;
361
+ exclude_view_option?: string | undefined;
362
+ exclude_view_duration?: number | undefined;
363
+ exclude_view_duration_type?: string | undefined;
364
+ exclude_view_item_count?: number | undefined;
365
+ exclude_purchase_option?: string | undefined;
366
+ exclude_purchase_duration?: number | undefined;
367
+ exclude_purchase_duration_type?: string | undefined;
368
+ exclude_purchase_item_count?: number | undefined;
369
+ campaignCount?: {
370
+ active?: number | undefined;
371
+ passive?: number | undefined;
372
+ test?: number | undefined;
373
+ } | undefined;
374
+ }[];
375
+ strategiesLoading: boolean;
376
+ strategyCampaigns: {
377
+ id: string | number;
378
+ name: string;
379
+ status: string;
380
+ variants: {
381
+ id?: (number | string) | undefined;
382
+ name: string;
383
+ }[];
384
+ channel: string;
385
+ productAlias?: string | undefined;
386
+ isPreventing?: boolean | undefined;
387
+ }[];
388
+ strategyCampaignsLoading: boolean;
389
+ strategyCampaignsFetchedFor: string | null;
390
+ strategyUrlTemplates: Record<string, string>;
391
+ strategyPickerVisible: boolean;
392
+ strategyPickerVersion: number;
393
+ strategyDuplicating: boolean;
117
394
  blockStates: Record<number, PerBlockState>;
118
395
  currentRecommendationId: number | null;
119
396
  configVersion: number;
@@ -130,6 +407,62 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
130
407
  value: string;
131
408
  }[];
132
409
  filterList: FiltersResponse;
410
+ strategies: {
411
+ strategy_id: number;
412
+ name: string;
413
+ algorithm: string;
414
+ status: string;
415
+ size: number;
416
+ suitable_channels: string;
417
+ updated_at: string;
418
+ algorithm_used?: string | undefined;
419
+ exclude_view?: (boolean | number) | undefined;
420
+ exclude_purchase?: (boolean | number) | undefined;
421
+ exclude_cart?: (boolean | number) | undefined;
422
+ filters?: string | undefined;
423
+ manual_merchandising_products?: string | undefined;
424
+ mixed_strategies?: string | undefined;
425
+ suitable_page_types?: (string | string[]) | undefined;
426
+ base_product?: string | undefined;
427
+ checkout_recommendation_cart_value?: (number | string) | undefined;
428
+ shuffle?: (boolean | number) | undefined;
429
+ attribute_affinity?: (boolean | number) | undefined;
430
+ is_user_context_filter_optional?: (boolean | number) | undefined;
431
+ last_updated_by?: string | undefined;
432
+ created_at?: string | undefined;
433
+ exclude_view_option?: string | undefined;
434
+ exclude_view_duration?: number | undefined;
435
+ exclude_view_duration_type?: string | undefined;
436
+ exclude_view_item_count?: number | undefined;
437
+ exclude_purchase_option?: string | undefined;
438
+ exclude_purchase_duration?: number | undefined;
439
+ exclude_purchase_duration_type?: string | undefined;
440
+ exclude_purchase_item_count?: number | undefined;
441
+ campaignCount?: {
442
+ active?: number | undefined;
443
+ passive?: number | undefined;
444
+ test?: number | undefined;
445
+ } | undefined;
446
+ }[];
447
+ strategiesLoading: boolean;
448
+ strategyCampaigns: {
449
+ id: string | number;
450
+ name: string;
451
+ status: string;
452
+ variants: {
453
+ id?: (number | string) | undefined;
454
+ name: string;
455
+ }[];
456
+ channel: string;
457
+ productAlias?: string | undefined;
458
+ isPreventing?: boolean | undefined;
459
+ }[];
460
+ strategyCampaignsLoading: boolean;
461
+ strategyCampaignsFetchedFor: string | null;
462
+ strategyUrlTemplates: Record<string, string>;
463
+ strategyPickerVisible: boolean;
464
+ strategyPickerVersion: number;
465
+ strategyDuplicating: boolean;
133
466
  blockStates: Record<number, PerBlockState>;
134
467
  currentRecommendationId: number | null;
135
468
  configVersion: number;
@@ -146,6 +479,62 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
146
479
  value: string;
147
480
  }[];
148
481
  filterList: FiltersResponse;
482
+ strategies: {
483
+ strategy_id: number;
484
+ name: string;
485
+ algorithm: string;
486
+ status: string;
487
+ size: number;
488
+ suitable_channels: string;
489
+ updated_at: string;
490
+ algorithm_used?: string | undefined;
491
+ exclude_view?: (boolean | number) | undefined;
492
+ exclude_purchase?: (boolean | number) | undefined;
493
+ exclude_cart?: (boolean | number) | undefined;
494
+ filters?: string | undefined;
495
+ manual_merchandising_products?: string | undefined;
496
+ mixed_strategies?: string | undefined;
497
+ suitable_page_types?: (string | string[]) | undefined;
498
+ base_product?: string | undefined;
499
+ checkout_recommendation_cart_value?: (number | string) | undefined;
500
+ shuffle?: (boolean | number) | undefined;
501
+ attribute_affinity?: (boolean | number) | undefined;
502
+ is_user_context_filter_optional?: (boolean | number) | undefined;
503
+ last_updated_by?: string | undefined;
504
+ created_at?: string | undefined;
505
+ exclude_view_option?: string | undefined;
506
+ exclude_view_duration?: number | undefined;
507
+ exclude_view_duration_type?: string | undefined;
508
+ exclude_view_item_count?: number | undefined;
509
+ exclude_purchase_option?: string | undefined;
510
+ exclude_purchase_duration?: number | undefined;
511
+ exclude_purchase_duration_type?: string | undefined;
512
+ exclude_purchase_item_count?: number | undefined;
513
+ campaignCount?: {
514
+ active?: number | undefined;
515
+ passive?: number | undefined;
516
+ test?: number | undefined;
517
+ } | undefined;
518
+ }[];
519
+ strategiesLoading: boolean;
520
+ strategyCampaigns: {
521
+ id: string | number;
522
+ name: string;
523
+ status: string;
524
+ variants: {
525
+ id?: (number | string) | undefined;
526
+ name: string;
527
+ }[];
528
+ channel: string;
529
+ productAlias?: string | undefined;
530
+ isPreventing?: boolean | undefined;
531
+ }[];
532
+ strategyCampaignsLoading: boolean;
533
+ strategyCampaignsFetchedFor: string | null;
534
+ strategyUrlTemplates: Record<string, string>;
535
+ strategyPickerVisible: boolean;
536
+ strategyPickerVersion: number;
537
+ strategyDuplicating: boolean;
149
538
  blockStates: Record<number, PerBlockState>;
150
539
  currentRecommendationId: number | null;
151
540
  configVersion: number;
@@ -163,6 +552,140 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
163
552
  value: string;
164
553
  }[];
165
554
  filterList: FiltersResponse;
555
+ strategies: {
556
+ strategy_id: number;
557
+ name: string;
558
+ algorithm: string;
559
+ status: string;
560
+ size: number;
561
+ suitable_channels: string;
562
+ updated_at: string;
563
+ algorithm_used?: string | undefined;
564
+ exclude_view?: (boolean | number) | undefined;
565
+ exclude_purchase?: (boolean | number) | undefined;
566
+ exclude_cart?: (boolean | number) | undefined;
567
+ filters?: string | undefined;
568
+ manual_merchandising_products?: string | undefined;
569
+ mixed_strategies?: string | undefined;
570
+ suitable_page_types?: (string | string[]) | undefined;
571
+ base_product?: string | undefined;
572
+ checkout_recommendation_cart_value?: (number | string) | undefined;
573
+ shuffle?: (boolean | number) | undefined;
574
+ attribute_affinity?: (boolean | number) | undefined;
575
+ is_user_context_filter_optional?: (boolean | number) | undefined;
576
+ last_updated_by?: string | undefined;
577
+ created_at?: string | undefined;
578
+ exclude_view_option?: string | undefined;
579
+ exclude_view_duration?: number | undefined;
580
+ exclude_view_duration_type?: string | undefined;
581
+ exclude_view_item_count?: number | undefined;
582
+ exclude_purchase_option?: string | undefined;
583
+ exclude_purchase_duration?: number | undefined;
584
+ exclude_purchase_duration_type?: string | undefined;
585
+ exclude_purchase_item_count?: number | undefined;
586
+ campaignCount?: {
587
+ active?: number | undefined;
588
+ passive?: number | undefined;
589
+ test?: number | undefined;
590
+ } | undefined;
591
+ }[];
592
+ strategiesLoading: boolean;
593
+ strategyCampaigns: {
594
+ id: string | number;
595
+ name: string;
596
+ status: string;
597
+ variants: {
598
+ id?: (number | string) | undefined;
599
+ name: string;
600
+ }[];
601
+ channel: string;
602
+ productAlias?: string | undefined;
603
+ isPreventing?: boolean | undefined;
604
+ }[];
605
+ strategyCampaignsLoading: boolean;
606
+ strategyCampaignsFetchedFor: string | null;
607
+ strategyUrlTemplates: Record<string, string>;
608
+ strategyPickerVisible: boolean;
609
+ strategyPickerVersion: number;
610
+ strategyDuplicating: boolean;
611
+ blockStates: Record<number, PerBlockState>;
612
+ currentRecommendationId: number | null;
613
+ configVersion: number;
614
+ } & import("pinia").PiniaCustomStateProperties<StoreState>) => {
615
+ text: string;
616
+ value: string;
617
+ }[];
618
+ /**
619
+ * Reusable Recommendation Strategies as dropdown options.
620
+ *
621
+ * Unlike algorithms, strategy ids come straight from Smart Recommender —
622
+ * there is no local id→key table to join against.
623
+ */
624
+ getStrategyOptions: (state: {
625
+ recommendationCampaignUrls: Record<string, string>;
626
+ activePredictiveAlgorithms: number[];
627
+ languages: Languages;
628
+ currencyList: {
629
+ text: string;
630
+ value: string;
631
+ }[];
632
+ filterList: FiltersResponse;
633
+ strategies: {
634
+ strategy_id: number;
635
+ name: string;
636
+ algorithm: string;
637
+ status: string;
638
+ size: number;
639
+ suitable_channels: string;
640
+ updated_at: string;
641
+ algorithm_used?: string | undefined;
642
+ exclude_view?: (boolean | number) | undefined;
643
+ exclude_purchase?: (boolean | number) | undefined;
644
+ exclude_cart?: (boolean | number) | undefined;
645
+ filters?: string | undefined;
646
+ manual_merchandising_products?: string | undefined;
647
+ mixed_strategies?: string | undefined;
648
+ suitable_page_types?: (string | string[]) | undefined;
649
+ base_product?: string | undefined;
650
+ checkout_recommendation_cart_value?: (number | string) | undefined;
651
+ shuffle?: (boolean | number) | undefined;
652
+ attribute_affinity?: (boolean | number) | undefined;
653
+ is_user_context_filter_optional?: (boolean | number) | undefined;
654
+ last_updated_by?: string | undefined;
655
+ created_at?: string | undefined;
656
+ exclude_view_option?: string | undefined;
657
+ exclude_view_duration?: number | undefined;
658
+ exclude_view_duration_type?: string | undefined;
659
+ exclude_view_item_count?: number | undefined;
660
+ exclude_purchase_option?: string | undefined;
661
+ exclude_purchase_duration?: number | undefined;
662
+ exclude_purchase_duration_type?: string | undefined;
663
+ exclude_purchase_item_count?: number | undefined;
664
+ campaignCount?: {
665
+ active?: number | undefined;
666
+ passive?: number | undefined;
667
+ test?: number | undefined;
668
+ } | undefined;
669
+ }[];
670
+ strategiesLoading: boolean;
671
+ strategyCampaigns: {
672
+ id: string | number;
673
+ name: string;
674
+ status: string;
675
+ variants: {
676
+ id?: (number | string) | undefined;
677
+ name: string;
678
+ }[];
679
+ channel: string;
680
+ productAlias?: string | undefined;
681
+ isPreventing?: boolean | undefined;
682
+ }[];
683
+ strategyCampaignsLoading: boolean;
684
+ strategyCampaignsFetchedFor: string | null;
685
+ strategyUrlTemplates: Record<string, string>;
686
+ strategyPickerVisible: boolean;
687
+ strategyPickerVersion: number;
688
+ strategyDuplicating: boolean;
166
689
  blockStates: Record<number, PerBlockState>;
167
690
  currentRecommendationId: number | null;
168
691
  configVersion: number;
@@ -170,6 +693,172 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
170
693
  text: string;
171
694
  value: string;
172
695
  }[];
696
+ /**
697
+ * The current block's selected strategy, or null when none is selected
698
+ * or the selected id is no longer in the listing.
699
+ *
700
+ * A null return with a non-empty `strategyId` means the strategy was
701
+ * deleted in Smart Recommender after this block was configured — the
702
+ * panel flags that rather than silently clearing the selection.
703
+ */
704
+ getSelectedStrategy(): RrsStrategy | null;
705
+ /**
706
+ * Whether the RRS feature is enabled for this editor.
707
+ *
708
+ * Read through a getter so `hasInvalidBlock` can pass the store straight to
709
+ * the required-field descriptors, which need the flag to decide whether a
710
+ * missing strategy blocks the save.
711
+ */
712
+ isRrsEnabled(): boolean;
713
+ /** Strategy ids currently offered for email, for the save-time deleted-strategy check. */
714
+ strategyIds: (state: {
715
+ recommendationCampaignUrls: Record<string, string>;
716
+ activePredictiveAlgorithms: number[];
717
+ languages: Languages;
718
+ currencyList: {
719
+ text: string;
720
+ value: string;
721
+ }[];
722
+ filterList: FiltersResponse;
723
+ strategies: {
724
+ strategy_id: number;
725
+ name: string;
726
+ algorithm: string;
727
+ status: string;
728
+ size: number;
729
+ suitable_channels: string;
730
+ updated_at: string;
731
+ algorithm_used?: string | undefined;
732
+ exclude_view?: (boolean | number) | undefined;
733
+ exclude_purchase?: (boolean | number) | undefined;
734
+ exclude_cart?: (boolean | number) | undefined;
735
+ filters?: string | undefined;
736
+ manual_merchandising_products?: string | undefined;
737
+ mixed_strategies?: string | undefined;
738
+ suitable_page_types?: (string | string[]) | undefined;
739
+ base_product?: string | undefined;
740
+ checkout_recommendation_cart_value?: (number | string) | undefined;
741
+ shuffle?: (boolean | number) | undefined;
742
+ attribute_affinity?: (boolean | number) | undefined;
743
+ is_user_context_filter_optional?: (boolean | number) | undefined;
744
+ last_updated_by?: string | undefined;
745
+ created_at?: string | undefined;
746
+ exclude_view_option?: string | undefined;
747
+ exclude_view_duration?: number | undefined;
748
+ exclude_view_duration_type?: string | undefined;
749
+ exclude_view_item_count?: number | undefined;
750
+ exclude_purchase_option?: string | undefined;
751
+ exclude_purchase_duration?: number | undefined;
752
+ exclude_purchase_duration_type?: string | undefined;
753
+ exclude_purchase_item_count?: number | undefined;
754
+ campaignCount?: {
755
+ active?: number | undefined;
756
+ passive?: number | undefined;
757
+ test?: number | undefined;
758
+ } | undefined;
759
+ }[];
760
+ strategiesLoading: boolean;
761
+ strategyCampaigns: {
762
+ id: string | number;
763
+ name: string;
764
+ status: string;
765
+ variants: {
766
+ id?: (number | string) | undefined;
767
+ name: string;
768
+ }[];
769
+ channel: string;
770
+ productAlias?: string | undefined;
771
+ isPreventing?: boolean | undefined;
772
+ }[];
773
+ strategyCampaignsLoading: boolean;
774
+ strategyCampaignsFetchedFor: string | null;
775
+ strategyUrlTemplates: Record<string, string>;
776
+ strategyPickerVisible: boolean;
777
+ strategyPickerVersion: number;
778
+ strategyDuplicating: boolean;
779
+ blockStates: Record<number, PerBlockState>;
780
+ currentRecommendationId: number | null;
781
+ configVersion: number;
782
+ } & import("pinia").PiniaCustomStateProperties<StoreState>) => string[];
783
+ /**
784
+ * Whether the listing is trustworthy enough to judge an assigned id against.
785
+ * Mid-fetch it is empty, and every assigned id would look deleted.
786
+ */
787
+ canValidateStrategy: (state: {
788
+ recommendationCampaignUrls: Record<string, string>;
789
+ activePredictiveAlgorithms: number[];
790
+ languages: Languages;
791
+ currencyList: {
792
+ text: string;
793
+ value: string;
794
+ }[];
795
+ filterList: FiltersResponse;
796
+ strategies: {
797
+ strategy_id: number;
798
+ name: string;
799
+ algorithm: string;
800
+ status: string;
801
+ size: number;
802
+ suitable_channels: string;
803
+ updated_at: string;
804
+ algorithm_used?: string | undefined;
805
+ exclude_view?: (boolean | number) | undefined;
806
+ exclude_purchase?: (boolean | number) | undefined;
807
+ exclude_cart?: (boolean | number) | undefined;
808
+ filters?: string | undefined;
809
+ manual_merchandising_products?: string | undefined;
810
+ mixed_strategies?: string | undefined;
811
+ suitable_page_types?: (string | string[]) | undefined;
812
+ base_product?: string | undefined;
813
+ checkout_recommendation_cart_value?: (number | string) | undefined;
814
+ shuffle?: (boolean | number) | undefined;
815
+ attribute_affinity?: (boolean | number) | undefined;
816
+ is_user_context_filter_optional?: (boolean | number) | undefined;
817
+ last_updated_by?: string | undefined;
818
+ created_at?: string | undefined;
819
+ exclude_view_option?: string | undefined;
820
+ exclude_view_duration?: number | undefined;
821
+ exclude_view_duration_type?: string | undefined;
822
+ exclude_view_item_count?: number | undefined;
823
+ exclude_purchase_option?: string | undefined;
824
+ exclude_purchase_duration?: number | undefined;
825
+ exclude_purchase_duration_type?: string | undefined;
826
+ exclude_purchase_item_count?: number | undefined;
827
+ campaignCount?: {
828
+ active?: number | undefined;
829
+ passive?: number | undefined;
830
+ test?: number | undefined;
831
+ } | undefined;
832
+ }[];
833
+ strategiesLoading: boolean;
834
+ strategyCampaigns: {
835
+ id: string | number;
836
+ name: string;
837
+ status: string;
838
+ variants: {
839
+ id?: (number | string) | undefined;
840
+ name: string;
841
+ }[];
842
+ channel: string;
843
+ productAlias?: string | undefined;
844
+ isPreventing?: boolean | undefined;
845
+ }[];
846
+ strategyCampaignsLoading: boolean;
847
+ strategyCampaignsFetchedFor: string | null;
848
+ strategyUrlTemplates: Record<string, string>;
849
+ strategyPickerVisible: boolean;
850
+ strategyPickerVersion: number;
851
+ strategyDuplicating: boolean;
852
+ blockStates: Record<number, PerBlockState>;
853
+ currentRecommendationId: number | null;
854
+ configVersion: number;
855
+ } & import("pinia").PiniaCustomStateProperties<StoreState>) => boolean;
856
+ /**
857
+ * True when a strategy id is set but absent from the fetched listing.
858
+ *
859
+ * Guarded on the listing having loaded — mid-fetch every id looks missing.
860
+ */
861
+ hasMissingStrategy(): boolean;
173
862
  getLanguages: (state: {
174
863
  recommendationCampaignUrls: Record<string, string>;
175
864
  activePredictiveAlgorithms: number[];
@@ -179,6 +868,62 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
179
868
  value: string;
180
869
  }[];
181
870
  filterList: FiltersResponse;
871
+ strategies: {
872
+ strategy_id: number;
873
+ name: string;
874
+ algorithm: string;
875
+ status: string;
876
+ size: number;
877
+ suitable_channels: string;
878
+ updated_at: string;
879
+ algorithm_used?: string | undefined;
880
+ exclude_view?: (boolean | number) | undefined;
881
+ exclude_purchase?: (boolean | number) | undefined;
882
+ exclude_cart?: (boolean | number) | undefined;
883
+ filters?: string | undefined;
884
+ manual_merchandising_products?: string | undefined;
885
+ mixed_strategies?: string | undefined;
886
+ suitable_page_types?: (string | string[]) | undefined;
887
+ base_product?: string | undefined;
888
+ checkout_recommendation_cart_value?: (number | string) | undefined;
889
+ shuffle?: (boolean | number) | undefined;
890
+ attribute_affinity?: (boolean | number) | undefined;
891
+ is_user_context_filter_optional?: (boolean | number) | undefined;
892
+ last_updated_by?: string | undefined;
893
+ created_at?: string | undefined;
894
+ exclude_view_option?: string | undefined;
895
+ exclude_view_duration?: number | undefined;
896
+ exclude_view_duration_type?: string | undefined;
897
+ exclude_view_item_count?: number | undefined;
898
+ exclude_purchase_option?: string | undefined;
899
+ exclude_purchase_duration?: number | undefined;
900
+ exclude_purchase_duration_type?: string | undefined;
901
+ exclude_purchase_item_count?: number | undefined;
902
+ campaignCount?: {
903
+ active?: number | undefined;
904
+ passive?: number | undefined;
905
+ test?: number | undefined;
906
+ } | undefined;
907
+ }[];
908
+ strategiesLoading: boolean;
909
+ strategyCampaigns: {
910
+ id: string | number;
911
+ name: string;
912
+ status: string;
913
+ variants: {
914
+ id?: (number | string) | undefined;
915
+ name: string;
916
+ }[];
917
+ channel: string;
918
+ productAlias?: string | undefined;
919
+ isPreventing?: boolean | undefined;
920
+ }[];
921
+ strategyCampaignsLoading: boolean;
922
+ strategyCampaignsFetchedFor: string | null;
923
+ strategyUrlTemplates: Record<string, string>;
924
+ strategyPickerVisible: boolean;
925
+ strategyPickerVersion: number;
926
+ strategyDuplicating: boolean;
182
927
  blockStates: Record<number, PerBlockState>;
183
928
  currentRecommendationId: number | null;
184
929
  configVersion: number;
@@ -195,6 +940,62 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
195
940
  value: string;
196
941
  }[];
197
942
  filterList: FiltersResponse;
943
+ strategies: {
944
+ strategy_id: number;
945
+ name: string;
946
+ algorithm: string;
947
+ status: string;
948
+ size: number;
949
+ suitable_channels: string;
950
+ updated_at: string;
951
+ algorithm_used?: string | undefined;
952
+ exclude_view?: (boolean | number) | undefined;
953
+ exclude_purchase?: (boolean | number) | undefined;
954
+ exclude_cart?: (boolean | number) | undefined;
955
+ filters?: string | undefined;
956
+ manual_merchandising_products?: string | undefined;
957
+ mixed_strategies?: string | undefined;
958
+ suitable_page_types?: (string | string[]) | undefined;
959
+ base_product?: string | undefined;
960
+ checkout_recommendation_cart_value?: (number | string) | undefined;
961
+ shuffle?: (boolean | number) | undefined;
962
+ attribute_affinity?: (boolean | number) | undefined;
963
+ is_user_context_filter_optional?: (boolean | number) | undefined;
964
+ last_updated_by?: string | undefined;
965
+ created_at?: string | undefined;
966
+ exclude_view_option?: string | undefined;
967
+ exclude_view_duration?: number | undefined;
968
+ exclude_view_duration_type?: string | undefined;
969
+ exclude_view_item_count?: number | undefined;
970
+ exclude_purchase_option?: string | undefined;
971
+ exclude_purchase_duration?: number | undefined;
972
+ exclude_purchase_duration_type?: string | undefined;
973
+ exclude_purchase_item_count?: number | undefined;
974
+ campaignCount?: {
975
+ active?: number | undefined;
976
+ passive?: number | undefined;
977
+ test?: number | undefined;
978
+ } | undefined;
979
+ }[];
980
+ strategiesLoading: boolean;
981
+ strategyCampaigns: {
982
+ id: string | number;
983
+ name: string;
984
+ status: string;
985
+ variants: {
986
+ id?: (number | string) | undefined;
987
+ name: string;
988
+ }[];
989
+ channel: string;
990
+ productAlias?: string | undefined;
991
+ isPreventing?: boolean | undefined;
992
+ }[];
993
+ strategyCampaignsLoading: boolean;
994
+ strategyCampaignsFetchedFor: string | null;
995
+ strategyUrlTemplates: Record<string, string>;
996
+ strategyPickerVisible: boolean;
997
+ strategyPickerVersion: number;
998
+ strategyDuplicating: boolean;
198
999
  blockStates: Record<number, PerBlockState>;
199
1000
  currentRecommendationId: number | null;
200
1001
  configVersion: number;
@@ -267,12 +1068,104 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
267
1068
  * Called after successful apply — discards the snapshot.
268
1069
  */
269
1070
  closeFilterDrawer(): void;
1071
+ /** The strategy control mounted (or re-rendered): let the overlay re-attach. */
1072
+ showStrategyPicker(): void;
1073
+ /** The strategy control went away — hide the overlay with it. */
1074
+ hideStrategyPicker(): void;
1075
+ /**
1076
+ * Assign a strategy to the current block.
1077
+ *
1078
+ * Only patches Pinia: the `configVersion` bump makes the main control persist
1079
+ * `strategyId` into the block's node config (see `_persistStoreConfigToNode`),
1080
+ * which is the same route filters take. Resolving the URL template here rather
1081
+ * than at compile time matters — `buildCampaignUrl` is synchronous and would
1082
+ * otherwise silently fall back to the algorithm URL.
1083
+ */
1084
+ selectStrategy(strategyId: string): Promise<void>;
1085
+ /**
1086
+ * Duplicate the selected strategy and assign the copy to this block.
1087
+ *
1088
+ * Runs inline — the marketer never leaves the editor. Two things the web flow
1089
+ * does that we deliberately skip: its follow-up `POST /{id}/assign` (that binds
1090
+ * a strategy to a campaign *variation*, a concept email blocks do not have —
1091
+ * here the assignment is the block's own config), and displaying the copy's
1092
+ * name from the response, which only carries the new id. Hence the refetch.
1093
+ */
1094
+ duplicateAndAssignStrategy(): Promise<void>;
1095
+ /**
1096
+ * Opens the RRS detail drawer for the current block.
1097
+ *
1098
+ * Unlike the filter drawer this takes no snapshot — the drawer is
1099
+ * read-only, so there is nothing to revert on close.
1100
+ */
1101
+ openStrategyDrawer(): void;
1102
+ /**
1103
+ * Closes the RRS detail drawer for the current block and drops the campaign
1104
+ * list, so reopening on a different strategy never flashes stale rows.
1105
+ */
1106
+ closeStrategyDrawer(): void;
1107
+ /** Drops the campaign list and lets the next open refetch. */
1108
+ clearStrategyCampaigns(): void;
1109
+ /**
1110
+ * Resolve and cache a strategy's recommendation-URL template.
1111
+ *
1112
+ * Must be awaited before `buildCampaignUrl` runs for a strategy-driven block,
1113
+ * because that builder is synchronous and can only read what is already
1114
+ * cached. Safe to call repeatedly: a resolved id short-circuits, and
1115
+ * concurrent callers for the same id share one request.
1116
+ *
1117
+ * Only a *settled* answer is cached. An id the server rejects caches as '',
1118
+ * so the block falls back instead of retrying on every compile. A request
1119
+ * that merely failed to complete leaves the key unset and resolves to false,
1120
+ * so the next selection or save tries again — caching a network blip as "no
1121
+ * URL" would strand the block on its old algorithm feed for the session while
1122
+ * the panel still showed the strategy as assigned.
1123
+ * @returns whether the strategy now has a USABLE url — not merely a cache
1124
+ * entry. A rejected id caches as '' to stop the retry storm, but reporting
1125
+ * that as success would let the caller confirm an assignment the compiled
1126
+ * email cannot honour.
1127
+ */
1128
+ fetchStrategyUrlTemplate(strategyId: string): Promise<boolean>;
1129
+ /**
1130
+ * Wait for every strategy-URL request still in flight.
1131
+ *
1132
+ * The compiler is synchronous: whatever is not cached by the time it runs
1133
+ * compiles as the block's old algorithm URL. Selection and template hydrate
1134
+ * both await their own request, but a save fired inside that round trip would
1135
+ * still race — so the save path drains the queue first.
1136
+ */
1137
+ awaitPendingStrategyUrls(): Promise<void>;
1138
+ /**
1139
+ * Fetch the campaigns a strategy is used in, for the drawer's second tab.
1140
+ *
1141
+ * Lazy and once-per-strategy: the caller invokes this only while the drawer is
1142
+ * open on that tab, and a repeat call for the same id is a no-op. A version
1143
+ * counter discards a response that arrives after the user switched strategies,
1144
+ * which would otherwise show one strategy's campaigns under another's name.
1145
+ */
1146
+ fetchStrategyCampaigns(strategyId: string): Promise<void>;
270
1147
  /**
271
1148
  * Cancels the filter selection drawer and reverts filters
272
1149
  * to the snapshot taken when the drawer was opened.
273
1150
  */
274
1151
  cancelFilterDrawer(): void;
275
1152
  fetchRecommendationCreateData(): Promise<void>;
1153
+ /**
1154
+ * Fetch the partner's Reusable Recommendation Strategies for the EMAIL channel.
1155
+ *
1156
+ * Same cache-guard + in-flight dedupe shape as fetchRecommendationCreateData.
1157
+ * A failure leaves `strategies` empty so the dropdown renders empty rather
1158
+ * than blocking the panel — the block keeps working on its algorithm.
1159
+ */
1160
+ fetchRecommendationStrategies(): Promise<void>;
1161
+ /**
1162
+ * Refetch the listing, ignoring the once-per-session cache.
1163
+ *
1164
+ * Needed after Duplicate and Assign: the copy exists server-side but not in
1165
+ * `strategies`, so without this the panel would read the freshly assigned id
1166
+ * back as a deleted strategy.
1167
+ */
1168
+ refreshRecommendationStrategies(): Promise<void>;
276
1169
  fetchRecommendationFilters(): Promise<void>;
277
1170
  addFilterGroup(filterGroup: number): void;
278
1171
  deleteFilterGroup(groupId: number): void;