@useinsider/guido 3.18.2-beta.3eec9b0 → 3.18.2-beta.4d2b065

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 (57) hide show
  1. package/README.md +21 -23
  2. package/dist/@types/config/schemas.js +59 -51
  3. package/dist/components/Guido.vue.js +4 -4
  4. package/dist/components/Guido.vue2.js +55 -53
  5. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.js +7 -7
  6. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue2.js +53 -49
  7. package/dist/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.js +18 -0
  8. package/dist/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue2.js +25 -0
  9. package/dist/components/organisms/extensions/recommendation/RemoveStrategyModal.vue2.js +24 -22
  10. package/dist/components/organisms/onboarding/OnboardingWrapper.vue2.js +28 -24
  11. package/dist/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue.js +21 -0
  12. package/dist/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue2.js +46 -0
  13. package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.js +21 -0
  14. package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue2.js +46 -0
  15. package/dist/composables/useCustomInterfaceAppearance.js +46 -42
  16. package/dist/composables/useGuidoStateBridge.js +24 -29
  17. package/dist/composables/useLegacyStrategyConversion.js +61 -0
  18. package/dist/composables/useStripo.js +7 -7
  19. package/dist/enums/extensions/recommendationBlock.js +40 -31
  20. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +77 -76
  21. package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +72 -28
  22. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +45 -44
  23. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +110 -46
  24. package/dist/extensions/Blocks/Recommendation/utils/legacyStrategyMigration.js +42 -0
  25. package/dist/extensions/Blocks/Recommendation/utils/nodeConfigWriter.js +7 -7
  26. package/dist/guido.css +1 -1
  27. package/dist/library.js +13 -15
  28. package/dist/services/recommendationApi.js +46 -37
  29. package/dist/src/@types/config/schemas.d.ts +16 -0
  30. package/dist/src/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.d.ts +2 -0
  31. package/dist/src/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue.d.ts +2 -0
  32. package/dist/src/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.d.ts +2 -0
  33. package/dist/src/composables/useConfig.d.ts +4 -0
  34. package/dist/src/composables/useGuidoStateBridge.d.ts +7 -11
  35. package/dist/src/composables/useLegacyStrategyConversion.d.ts +3 -0
  36. package/dist/src/enums/extensions/recommendationBlock.d.ts +5 -1
  37. package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +2 -0
  38. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +4 -0
  39. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +70 -1
  40. package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMigration.d.ts +32 -0
  41. package/dist/src/library.d.ts +0 -2
  42. package/dist/src/public/trackingIds.d.ts +2 -6
  43. package/dist/src/services/recommendationApi.d.ts +2 -1
  44. package/dist/src/stores/config.d.ts +322 -0
  45. package/dist/src/stores/editor.d.ts +0 -25
  46. package/dist/src/stores/guido-email-editor.d.ts +27 -27
  47. package/dist/src/stores/onboarding.d.ts +808 -10
  48. package/dist/static/assets/icons/filled-arrow-rising.svg.js +5 -0
  49. package/dist/static/assets/icons/line-info.svg.js +5 -0
  50. package/dist/static/styles/components/recommendation-strategy.css.js +70 -5
  51. package/dist/stores/config.js +74 -60
  52. package/dist/stores/editor.js +0 -4
  53. package/dist/stores/guido-email-editor.js +4 -0
  54. package/dist/stores/onboarding.js +46 -36
  55. package/package.json +1 -5
  56. package/dist/public/editorState.js +0 -4
  57. package/dist/src/public/editorState.d.ts +0 -14
@@ -50,6 +50,14 @@ export declare const IdentitySchema: v.ObjectSchema<{
50
50
  readonly userId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, "userId is required">]>;
51
51
  /** Optional variation ID for A/B testing */
52
52
  readonly variationId: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
53
+ /** Optional numeric campaign ID of the host campaign; absent for templates and modules */
54
+ readonly campaignId: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
55
+ /**
56
+ * Optional numeric template-library id of the host template; absent for campaigns and
57
+ * modules. Distinct from `templateId`, which is the editor's document identity (a uuid /
58
+ * Stripo doc id) and is never an endpoint id.
59
+ */
60
+ readonly templateLibraryId: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
53
61
  }, undefined>;
54
62
  /**
55
63
  * Partner configuration - organization and product context
@@ -625,6 +633,14 @@ export declare const GuidoConfigSchema: v.ObjectSchema<{
625
633
  readonly userId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, "userId is required">]>;
626
634
  /** Optional variation ID for A/B testing */
627
635
  readonly variationId: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
636
+ /** Optional numeric campaign ID of the host campaign; absent for templates and modules */
637
+ readonly campaignId: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
638
+ /**
639
+ * Optional numeric template-library id of the host template; absent for campaigns and
640
+ * modules. Distinct from `templateId`, which is the editor's document identity (a uuid /
641
+ * Stripo doc id) and is never an endpoint id.
642
+ */
643
+ readonly templateLibraryId: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
628
644
  }, undefined>;
629
645
  /** Partner configuration (required) */
630
646
  readonly partner: v.ObjectSchema<{
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
2
+ export default _default;
@@ -11,6 +11,8 @@ export declare const useConfig: () => {
11
11
  templateId: string;
12
12
  userId: string;
13
13
  variationId?: string | undefined;
14
+ campaignId?: string | undefined;
15
+ templateLibraryId?: string | undefined;
14
16
  };
15
17
  partner: {
16
18
  name: string;
@@ -146,6 +148,8 @@ export declare const useConfig: () => {
146
148
  templateId: string;
147
149
  userId: string;
148
150
  variationId?: string | undefined;
151
+ campaignId?: string | undefined;
152
+ templateLibraryId?: string | undefined;
149
153
  } | null>;
150
154
  partner: import("vue").ComputedRef<{
151
155
  name: string;
@@ -1,26 +1,22 @@
1
1
  /**
2
2
  * Outbound bridge — publishes the current editor's html/css to the shared
3
- * Pinia store `guidoEmailEditor`. cortex-fe reads it at chat-stream submit
4
- * time and forwards it as `clientState.editor`, which is what enables
3
+ * Pinia store `guidoEmailEditor` so cortex-fe can read it at chat-stream
4
+ * submit time and forward it as `clientState.editor`. This is what enables
5
5
  * sub-case 1.3 (refine an already-loaded template via the email-agent).
6
6
  *
7
7
  * The bridge writes on three triggers:
8
8
  *
9
9
  * 1. Stripo finishes initializing — first snapshot.
10
- * 2. Every document change, via the `changeSeq` counter — debounced 500 ms
11
- * so a streaming Stripo edit doesn't thrash the store.
10
+ * 2. Editor `hasChanges` flips to true — debounced 500 ms so a streaming
11
+ * Stripo edit doesn't thrash the store.
12
12
  * 3. Editor `hasChanges` flips back to false (post-save / autosave) —
13
13
  * immediate, since this is the canonical "saved" snapshot.
14
14
  *
15
15
  * `getTemplateData()` is a Stripo iframe call; it must not run before
16
16
  * `isStripoInitialized` is true. The bridge guards against that.
17
17
  *
18
- * The store is written even with no reader attached — it has zero overhead,
19
- * and a late reader still finds consistent state.
20
- *
21
- * Readers are not optional any more, so treat the publish timing as part of
22
- * the contract: the store ships as `@useinsider/guido/editor-state`, and
23
- * email-fe imports it to scan the live html for its Array of Objects lock.
24
- * Weakening a trigger here silently breaks that lock in the consumer.
18
+ * If cortex-fe isn't loaded the store still gets written — that's fine;
19
+ * the store has zero overhead and any future reader will find consistent
20
+ * state. The bridge is a one-way pipe with no consumer dependency.
25
21
  */
26
22
  export declare const useGuidoStateBridge: () => void;
@@ -0,0 +1,3 @@
1
+ export declare const useLegacyStrategyConversion: () => {
2
+ convertLegacyStrategy: () => Promise<string>;
3
+ };
@@ -1,11 +1,15 @@
1
1
  import type { TextValueObject } from '@@/Types/generic';
2
- import type { RecommendationFeedItem } from '@@/Types/recommendation';
2
+ import type { RecommendationFeedItem, RrsMigrationTarget } from '@@/Types/recommendation';
3
3
  export declare const URLS: {
4
4
  RECOMMENDATION_API_URL: string;
5
5
  PRODUCT_ATTRIBUTES_PATH: string;
6
6
  RECOMMENDATION_STRATEGIES_PATH: string;
7
7
  RECOMMENDATION_STRATEGIES_PANEL_PATH: string;
8
+ NEWSLETTER_RECOMMENDATIONS_PATH: string;
9
+ MIGRATE_STRATEGIES_PATH: string;
10
+ TEMPLATE_MIGRATE_STRATEGIES_PATH: string;
8
11
  };
12
+ export declare const MIGRATION_PATHS: Record<RrsMigrationTarget['scope'], string>;
9
13
  export declare const QUERY_PARAMS: {
10
14
  CLIENT_ID: string;
11
15
  };
@@ -2,6 +2,8 @@ import { CommonControl } from '../../../common-control';
2
2
  export declare const STRATEGY_CONTROL_ID = "recommendation-strategy-control";
3
3
  export declare class StrategyControl extends CommonControl {
4
4
  private store;
5
+ private onboardingStore;
6
+ private legacyConversion;
5
7
  private storeUnsubscription;
6
8
  private listeners;
7
9
  private lastPaintedState;
@@ -88,6 +88,8 @@ export interface RegenerateWithStylesOptions extends Omit<RegenerateProductRowsO
88
88
  products?: RecommendationProduct[];
89
89
  /** Optional: pass layout directly to avoid stale DOM reads after setAttribute */
90
90
  layout?: Orientation;
91
+ /** Applies the batch even when the rows are unchanged, for callers that staged their own edits. */
92
+ forceApply?: boolean;
91
93
  }
92
94
  /**
93
95
  * Regenerates product rows while preserving user-applied styles, in a SINGLE commit.
@@ -151,6 +153,8 @@ export interface UpdateProductContentInPlaceOptions {
151
153
  currentNode: ImmutableHtmlNode | null | undefined;
152
154
  documentModifier: DocumentModifier;
153
155
  products: RecommendationProduct[];
156
+ /** Applies the batch even when the cards are unchanged, for callers that staged their own edits. */
157
+ forceApply?: boolean;
154
158
  }
155
159
  /**
156
160
  * Updates product content in-place without regenerating HTML structure.
@@ -1,4 +1,4 @@
1
- import type { Orientation, Languages, Currency, NumericSeparator, FiltersResponse, Filter, RecommendationCampaignUrlValue, RecommendationProduct, RrsStrategy } from '@@/Types/recommendation';
1
+ import type { Orientation, Languages, Currency, NumericSeparator, FiltersResponse, Filter, RecommendationCampaignUrlValue, RecommendationProduct, RrsMigrationPayload, RrsMigrationTarget, RrsStrategy } from '@@/Types/recommendation';
2
2
  export interface PerBlockConfigs {
3
3
  cardsInRow: number;
4
4
  currencySettings: {
@@ -22,6 +22,7 @@ export interface PerBlockConfigs {
22
22
  shuffleProducts: boolean;
23
23
  strategy: string;
24
24
  strategyId: string;
25
+ nodeConfigVersion: number;
25
26
  textTrimming: boolean;
26
27
  unresponsive: boolean;
27
28
  size: string;
@@ -36,6 +37,7 @@ interface PerBlockState {
36
37
  filterSelectionDrawerStatus: boolean;
37
38
  assignStrategyDrawerStatus: boolean;
38
39
  removeStrategyModalStatus: boolean;
40
+ legacyStrategyUpdatedModalStatus: boolean;
39
41
  filterGroup: number;
40
42
  /** Whether initial API data (filters, algorithms, products) has been fetched for this block */
41
43
  isInitialized: boolean;
@@ -51,6 +53,7 @@ interface PerBlockState {
51
53
  * same id skipped the re-sync and kept the defaults (SD-150347).
52
54
  */
53
55
  syncedConfigFingerprint: string | null;
56
+ legacyConversionLoading: boolean;
54
57
  }
55
58
  /**
56
59
  * Persisted-config subset used by `seedBlockUrlConfig` to reconstruct
@@ -213,6 +216,53 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
213
216
  currentRecommendationId: number | null;
214
217
  configVersion: number;
215
218
  } & import("pinia").PiniaCustomStateProperties<StoreState>): boolean;
219
+ isLegacyStrategyBlock(): boolean;
220
+ legacyConversionLoading(state: {
221
+ recommendationCampaignUrls: Record<string, RecommendationCampaignUrlValue>;
222
+ activePredictiveAlgorithms: number[];
223
+ languages: Languages;
224
+ currencyList: {
225
+ text: string;
226
+ value: string;
227
+ }[];
228
+ filterList: FiltersResponse;
229
+ strategies: {
230
+ [x: string]: unknown;
231
+ strategy_id: number;
232
+ name: string;
233
+ status: string;
234
+ suitable_channels: string;
235
+ size?: (number | string) | undefined;
236
+ }[];
237
+ strategiesLoading: boolean;
238
+ strategyUrlTemplates: Record<string, string>;
239
+ blockStates: Record<number, PerBlockState>;
240
+ currentRecommendationId: number | null;
241
+ configVersion: number;
242
+ } & import("pinia").PiniaCustomStateProperties<StoreState>): boolean;
243
+ legacyStrategyUpdatedModalStatus(state: {
244
+ recommendationCampaignUrls: Record<string, RecommendationCampaignUrlValue>;
245
+ activePredictiveAlgorithms: number[];
246
+ languages: Languages;
247
+ currencyList: {
248
+ text: string;
249
+ value: string;
250
+ }[];
251
+ filterList: FiltersResponse;
252
+ strategies: {
253
+ [x: string]: unknown;
254
+ strategy_id: number;
255
+ name: string;
256
+ status: string;
257
+ suitable_channels: string;
258
+ size?: (number | string) | undefined;
259
+ }[];
260
+ strategiesLoading: boolean;
261
+ strategyUrlTemplates: Record<string, string>;
262
+ blockStates: Record<number, PerBlockState>;
263
+ currentRecommendationId: number | null;
264
+ configVersion: number;
265
+ } & import("pinia").PiniaCustomStateProperties<StoreState>): boolean;
216
266
  assignedStrategy(state: {
217
267
  recommendationCampaignUrls: Record<string, RecommendationCampaignUrlValue>;
218
268
  activePredictiveAlgorithms: number[];
@@ -442,11 +492,24 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
442
492
  cancelFilterDrawer(): void;
443
493
  openAssignStrategyDrawer(): void;
444
494
  closeAssignStrategyDrawer(): void;
495
+ openLegacyStrategyUpdatedModal(): void;
496
+ closeLegacyStrategyUpdatedModal(): void;
445
497
  openRemoveStrategyModal(): void;
446
498
  closeRemoveStrategyModal(): void;
447
499
  fetchStrategies(): Promise<void>;
448
500
  resolveStrategyUrlTemplate(strategy: RrsStrategy, currency: string): Promise<string>;
449
501
  assignStrategy(strategy: RrsStrategy): void;
502
+ convertLegacyStrategy(payload: RrsMigrationPayload, target?: RrsMigrationTarget): Promise<string>;
503
+ /**
504
+ * Undoes the config half of a conversion whose document write never landed, so the
505
+ * panel and the drawer fall back to "Legacy Strategy" instead of showing an assignment
506
+ * the document never received.
507
+ */
508
+ revertLegacyConversion(blockId: number, previous: {
509
+ strategyId: string;
510
+ size: string;
511
+ nodeConfigVersion: number;
512
+ }): void;
450
513
  removeStrategy(): void;
451
514
  fetchRecommendationCreateData(): Promise<void>;
452
515
  fetchRecommendationFilters(): Promise<void>;
@@ -464,6 +527,12 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
464
527
  hasInvalidBlock(): boolean;
465
528
  fetchRecommendationProducts(): Promise<void>;
466
529
  _doFetchProducts(): Promise<void>;
530
+ /**
531
+ * Block-scoped counterpart of `fetchRecommendationProducts`, which only ever serves the
532
+ * selected block. The legacy conversion must refresh the products of the block that
533
+ * started it even after the user selected another one.
534
+ */
535
+ fetchStrategyProductsForBlock(blockId: number): Promise<void>;
467
536
  _doFetchStrategyProducts(blockId: number): Promise<void>;
468
537
  _setBlockProducts(blockId: number, products: RecommendationProduct[], size: number): void;
469
538
  }>;
@@ -0,0 +1,32 @@
1
+ import type { RrsMigrationPayload, RrsMigrationTarget } from '@@/Types/recommendation';
2
+ /**
3
+ * A block authored before reusable strategies: it still carries a plain feed
4
+ * configuration (compiled into a feed URL string) instead of a strategy id.
5
+ * Blocks created under RRS stamp `CURRENT_CONFIG_VERSION`, so the version is
6
+ * what separates "never converted" from "not assigned yet".
7
+ */
8
+ export declare function isLegacyStrategyConfig({ strategyId, nodeConfigVersion }: {
9
+ strategyId: string;
10
+ nodeConfigVersion: number;
11
+ }): boolean;
12
+ export declare function resolveMigrationTarget({ campaignId, templateLibraryId }: {
13
+ campaignId?: string;
14
+ templateLibraryId?: string;
15
+ }): RrsMigrationTarget;
16
+ interface MigrationInputs {
17
+ blockId: number;
18
+ url: string;
19
+ campaignId: string;
20
+ variationId: string;
21
+ strategy: string;
22
+ productIds: string[];
23
+ target: RrsMigrationTarget;
24
+ }
25
+ /**
26
+ * The server names and de-duplicates the strategy, so nothing here derives a name, and the
27
+ * filters travel inside `url` — the endpoint parses the feed URL's filter DSL itself. The two
28
+ * routes take different identity fields — the campaign one names from `campaignId`/`variationId`
29
+ * (0 for modules, which carry no numeric campaign), the template one from `templateId`.
30
+ */
31
+ export declare function buildLegacyMigrationPayload({ blockId, url, campaignId, variationId, strategy, productIds, target, }: MigrationInputs): RrsMigrationPayload;
32
+ export {};
@@ -2,7 +2,5 @@ export { default as Guido } from './components/Guido.vue';
2
2
  export type { GuidoConfig, GuidoConfigInput, IdentityConfig, PartnerConfig, TemplateConfig, TemplateMigrationConfig, LegacyRecommendationConfig, EditorConfig, UIConfig, FeaturesConfig, BlocksConfig, CompilerConfig, DynamicContent, EmailHeader, DefaultBlockType, CustomBlockType, ValidationResult, ValidationError, } from './@types/config';
3
3
  export { validateConfig, parseConfig, parseConfigSafe, isValidConfig, getValidationErrors, MessageType, ProductType, } from './@types/config';
4
4
  export { assignTrackingIds, readTrackFloor, readTrackSeq } from './public/trackingIds';
5
- export { useGuidoEmailEditorStore } from './public/editorState';
6
- export type { GuidoEmailEditorState } from './public/editorState';
7
5
  export type { StripoEventType } from './@types/events';
8
6
  export type { PositionData, DynamicContentEvent, MergeTagClickEvent, MergeTag, BaseDynamicContent, DynamicContentNode, DynamicContentList, TooltipOptions, TextValueObject, L10n, } from './@types/generic';
@@ -4,10 +4,6 @@
4
4
  * Importing from here pulls in nothing else, so the editor never enters a
5
5
  * consumer's module graph. Re-export surface only: this is the contract,
6
6
  * `utils/linkTrackingIds` is the implementation and stays free to move.
7
- *
8
- * Relative, not the `@@/Utils/` alias: vue-tsc copies the specifier into the emitted
9
- * .d.ts verbatim, and a consumer's TypeScript cannot resolve our alias table. A relative
10
- * path resolves against dist/src/, so the published types actually load.
11
7
  */
12
- export { assignTrackingIds, readTrackFloor, readTrackSeq, TRACK_ID_ATTRIBUTE, TRACK_SEQ_ATTRIBUTE, } from '../utils/linkTrackingIds';
13
- export type { TrackingIdResult } from '../utils/linkTrackingIds';
8
+ export { assignTrackingIds, readTrackFloor, readTrackSeq, TRACK_ID_ATTRIBUTE, TRACK_SEQ_ATTRIBUTE, } from '@@/Utils/linkTrackingIds';
9
+ export type { TrackingIdResult } from '@@/Utils/linkTrackingIds';
@@ -1,4 +1,4 @@
1
- import type { InitialResponse, FiltersResponse, RecommendationProduct, RecommendationProductsParams, RrsEndpointGenerateResponse, RrsStrategy } from '@@/Types/recommendation';
1
+ import type { InitialResponse, FiltersResponse, RecommendationProduct, RecommendationProductsParams, RrsEndpointGenerateResponse, RrsMigrationPayload, RrsMigrationTarget, RrsStrategy } from '@@/Types/recommendation';
2
2
  export declare const useRecommendationApi: () => {
3
3
  fetchRecommendationCreateData: () => Promise<InitialResponse>;
4
4
  fetchRecommendationFilters: () => Promise<FiltersResponse>;
@@ -6,4 +6,5 @@ export declare const useRecommendationApi: () => {
6
6
  fetchRecommendationProductsByUrl: (url: string) => Promise<RecommendationProduct[]>;
7
7
  fetchRecommendationStrategies: () => Promise<RrsStrategy[]>;
8
8
  generateStrategyEndpoint: (strategy: RrsStrategy, currency: string) => Promise<RrsEndpointGenerateResponse | null>;
9
+ migrateLegacyStrategy: (payload: RrsMigrationPayload, target?: RrsMigrationTarget) => Promise<string>;
9
10
  };