@nextblock-cms/cortex 0.13.1 → 0.13.3

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.
@@ -7,10 +7,24 @@ type SupabaseLike = {
7
7
  type RevalidateFn = (path: string, type?: 'layout' | 'page') => void;
8
8
  type BlockContentValidator = (blockType: BlockType, content: Record<string, any>) => BlockValidationResult;
9
9
  type MenuKey = 'HEADER' | 'FOOTER';
10
+ /**
11
+ * Imports an external image URL into the NextBlock media library and returns the
12
+ * new media row id (a UUID). Injected by the app (which owns storage + sharp);
13
+ * the lib can't import the app-side importer directly. Absent in tests/CLI.
14
+ */
15
+ type ImportExternalImageFn = (input: {
16
+ url: string;
17
+ altText?: string;
18
+ }) => Promise<{
19
+ id: string;
20
+ } | {
21
+ error: string;
22
+ }>;
10
23
  type ToolExecutionContext = {
11
24
  actorUserId?: string | null;
12
25
  cortexAiApiKey?: string | null;
13
26
  cortexAiModelSelection?: unknown;
27
+ importExternalImage?: ImportExternalImageFn;
14
28
  latestUserMessage?: string | null;
15
29
  pageContext?: CortexAiPageContext | null;
16
30
  revalidatePath?: RevalidateFn;
@@ -1965,6 +1979,231 @@ export declare function executeCmsActionPlan(input: z.input<typeof executeCmsAct
1965
1979
  success: boolean;
1966
1980
  summary: string | null;
1967
1981
  }>;
1982
+ export declare const fetchUrlContentInputSchema: z.ZodObject<{
1983
+ maxChars: z.ZodDefault<z.ZodNumber>;
1984
+ url: z.ZodString;
1985
+ }, z.core.$strict>;
1986
+ export type FetchUrlContentInput = z.input<typeof fetchUrlContentInputSchema>;
1987
+ export declare function executeFetchUrlContent(input: FetchUrlContentInput): Promise<{
1988
+ message: string;
1989
+ success: boolean;
1990
+ url: string;
1991
+ status?: undefined;
1992
+ contentType?: undefined;
1993
+ description?: undefined;
1994
+ finalUrl?: undefined;
1995
+ headings?: undefined;
1996
+ text?: undefined;
1997
+ title?: undefined;
1998
+ truncated?: undefined;
1999
+ } | {
2000
+ message: string;
2001
+ status: number;
2002
+ success: boolean;
2003
+ url: string;
2004
+ contentType?: undefined;
2005
+ description?: undefined;
2006
+ finalUrl?: undefined;
2007
+ headings?: undefined;
2008
+ text?: undefined;
2009
+ title?: undefined;
2010
+ truncated?: undefined;
2011
+ } | {
2012
+ contentType: string;
2013
+ message: string;
2014
+ success: boolean;
2015
+ url: string;
2016
+ status?: undefined;
2017
+ description?: undefined;
2018
+ finalUrl?: undefined;
2019
+ headings?: undefined;
2020
+ text?: undefined;
2021
+ title?: undefined;
2022
+ truncated?: undefined;
2023
+ } | {
2024
+ description: string;
2025
+ finalUrl: string;
2026
+ headings: string[];
2027
+ success: boolean;
2028
+ text: string;
2029
+ title: string;
2030
+ truncated: boolean;
2031
+ url: string;
2032
+ message?: undefined;
2033
+ status?: undefined;
2034
+ contentType?: undefined;
2035
+ }>;
2036
+ export declare const searchStockPhotosInputSchema: z.ZodObject<{
2037
+ count: z.ZodDefault<z.ZodNumber>;
2038
+ orientation: z.ZodOptional<z.ZodEnum<{
2039
+ landscape: "landscape";
2040
+ portrait: "portrait";
2041
+ square: "square";
2042
+ }>>;
2043
+ query: z.ZodString;
2044
+ }, z.core.$strict>;
2045
+ export type SearchStockPhotosInput = z.input<typeof searchStockPhotosInputSchema>;
2046
+ type CortexAiStockPhotoProvider = {
2047
+ apiKey: string;
2048
+ provider: 'pexels' | 'unsplash';
2049
+ };
2050
+ /**
2051
+ * Resolve ALL configured stock-photo providers, ordered by preference: Pexels
2052
+ * first, then Unsplash. Each provider's key comes from an admin-stored, encrypted
2053
+ * site_settings row (read via the service-role client) if present, else the
2054
+ * PEXELS_API_KEY / UNSPLASH_ACCESS_KEY env var. The tool tries them in order,
2055
+ * falling back to the next provider when one is rate-limited or errors.
2056
+ *
2057
+ * ai-config (which pulls in server-only secret crypto) is imported lazily so this
2058
+ * module's static graph stays test-friendly; the DB branch only runs server-side.
2059
+ */
2060
+ export declare function resolveCortexAiStockPhotoProviders(supabase?: SupabaseLike): Promise<CortexAiStockPhotoProvider[]>;
2061
+ /** The primary (first-preference) stock-photo provider, or null when none configured. */
2062
+ export declare function resolveCortexAiStockPhotoProvider(supabase?: SupabaseLike): Promise<CortexAiStockPhotoProvider | null>;
2063
+ /**
2064
+ * Fire the Unsplash download-trigger endpoint for every Unsplash photo placed in
2065
+ * the given blocks. Required by the Unsplash API Guidelines when a photo is used.
2066
+ * Best-effort and fire-and-forget: it resolves the Unsplash key, dedupes, and
2067
+ * never blocks or fails the mutation.
2068
+ */
2069
+ export declare function maybeTriggerStockPhotoDownloads(blocks: Array<{
2070
+ content?: unknown;
2071
+ } | null | undefined>, supabase?: SupabaseLike): Promise<void>;
2072
+ export declare function executeSearchStockPhotos(input: SearchStockPhotosInput, context?: ToolExecutionContext): Promise<{
2073
+ message: string;
2074
+ photos: never[];
2075
+ success: boolean;
2076
+ attemptedProviders?: undefined;
2077
+ provider?: undefined;
2078
+ query?: undefined;
2079
+ usageGuidance?: undefined;
2080
+ } | {
2081
+ attemptedProviders: string[];
2082
+ photos: any;
2083
+ provider: "pexels" | "unsplash";
2084
+ query: string;
2085
+ success: boolean;
2086
+ usageGuidance: string;
2087
+ message?: undefined;
2088
+ } | {
2089
+ attemptedProviders: string[];
2090
+ message: string;
2091
+ photos: never[];
2092
+ success: boolean;
2093
+ provider?: undefined;
2094
+ query?: undefined;
2095
+ usageGuidance?: undefined;
2096
+ }>;
2097
+ export declare const rewritePageDraftInputSchema: z.ZodObject<{
2098
+ contentType: z.ZodOptional<z.ZodEnum<{
2099
+ product: "product";
2100
+ page: "page";
2101
+ post: "post";
2102
+ }>>;
2103
+ entityId: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>;
2104
+ slug: z.ZodOptional<z.ZodString>;
2105
+ title: z.ZodOptional<z.ZodString>;
2106
+ blocks: z.ZodArray<z.ZodObject<{
2107
+ blockType: z.ZodEnum<{
2108
+ text: "text";
2109
+ section: "section";
2110
+ heading: "heading";
2111
+ image: "image";
2112
+ button: "button";
2113
+ posts_grid: "posts_grid";
2114
+ video_embed: "video_embed";
2115
+ form: "form";
2116
+ testimonial: "testimonial";
2117
+ product_grid: "product_grid";
2118
+ featured_product: "featured_product";
2119
+ cart: "cart";
2120
+ checkout: "checkout";
2121
+ product_details: "product_details";
2122
+ }>;
2123
+ content: z.ZodRecord<z.ZodString, z.ZodUnknown>;
2124
+ order: z.ZodOptional<z.ZodNumber>;
2125
+ }, z.core.$strict>>;
2126
+ meta: z.ZodOptional<z.ZodObject<{
2127
+ meta_description: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
2128
+ meta_title: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
2129
+ slug: z.ZodOptional<z.ZodOptional<z.ZodString>>;
2130
+ status: z.ZodOptional<z.ZodOptional<z.ZodEnum<{
2131
+ draft: "draft";
2132
+ published: "published";
2133
+ archived: "archived";
2134
+ }>>>;
2135
+ title: z.ZodOptional<z.ZodOptional<z.ZodString>>;
2136
+ }, z.core.$strict>>;
2137
+ }, z.core.$strict>;
2138
+ export type RewritePageDraftInput = z.infer<typeof rewritePageDraftInputSchema>;
2139
+ export declare function executeRewritePageDraft(input: RewritePageDraftInput, context?: ToolExecutionContext): Promise<{
2140
+ confirmationPhrase: string;
2141
+ mutationExecuted: boolean;
2142
+ preview: Record<string, unknown>;
2143
+ requiresConfirmation: boolean;
2144
+ success: boolean;
2145
+ } | {
2146
+ blockCount: number;
2147
+ contentType: "page" | "post";
2148
+ draftPreviewPath: string | null;
2149
+ editPath: string;
2150
+ entityId: number;
2151
+ isDraft: boolean;
2152
+ mutationExecuted: boolean;
2153
+ slug: string;
2154
+ success: boolean;
2155
+ title: string;
2156
+ }>;
2157
+ export declare const translatePageInputSchema: z.ZodObject<{
2158
+ targetLanguageCode: z.ZodString;
2159
+ title: z.ZodOptional<z.ZodString>;
2160
+ translations: z.ZodRecord<z.ZodString, z.ZodString>;
2161
+ }, z.core.$strict>;
2162
+ export type TranslatePageInput = z.infer<typeof translatePageInputSchema>;
2163
+ export declare function executeTranslatePage(input: TranslatePageInput, context?: ToolExecutionContext): Promise<{
2164
+ confirmationPhrase: string;
2165
+ mutationExecuted: boolean;
2166
+ preview: Record<string, unknown>;
2167
+ requiresConfirmation: boolean;
2168
+ success: boolean;
2169
+ } | {
2170
+ isTranslation: boolean;
2171
+ languageCode: string;
2172
+ }>;
2173
+ declare const setContentImagesInputSchema: z.ZodObject<{
2174
+ images: z.ZodArray<z.ZodString>;
2175
+ }, z.core.$strict>;
2176
+ type SetContentImagesInput = z.infer<typeof setContentImagesInputSchema>;
2177
+ /**
2178
+ * Set the feature image (pages/posts) or the ordered image gallery (products)
2179
+ * for the CURRENT CMS item. Each entry may be an existing media library id or an
2180
+ * external image URL (imported automatically). The first entry is the feature /
2181
+ * main image. For pages/posts only the first entry is used (they have a single
2182
+ * feature image); for products every entry becomes a product_media row in order.
2183
+ */
2184
+ export declare function executeSetContentImages(input: SetContentImagesInput, context?: ToolExecutionContext): Promise<{
2185
+ confirmationPhrase: string;
2186
+ mutationExecuted: boolean;
2187
+ preview: Record<string, unknown>;
2188
+ requiresConfirmation: boolean;
2189
+ success: boolean;
2190
+ } | {
2191
+ contentType: string;
2192
+ entityId: string | number;
2193
+ imageCount: number;
2194
+ mutationExecuted: boolean;
2195
+ slug: any;
2196
+ success: boolean;
2197
+ extraImagesIgnored?: undefined;
2198
+ } | {
2199
+ contentType: "product" | "page" | "post";
2200
+ entityId: string | number;
2201
+ extraImagesIgnored: number;
2202
+ imageCount: number;
2203
+ mutationExecuted: boolean;
2204
+ slug: any;
2205
+ success: boolean;
2206
+ }>;
1968
2207
  export declare function createCortexGlobalAgentTools(context?: ToolExecutionContext): {
1969
2208
  fetch_ecommerce_stats: import('ai').Tool<{
1970
2209
  query: string;
@@ -2017,6 +2256,161 @@ export declare function createCortexGlobalAgentTools(context?: ToolExecutionCont
2017
2256
  }[];
2018
2257
  success: boolean;
2019
2258
  }>;
2259
+ fetch_url_content: import('ai').Tool<{
2260
+ maxChars: number;
2261
+ url: string;
2262
+ }, {
2263
+ message: string;
2264
+ success: boolean;
2265
+ url: string;
2266
+ status?: undefined;
2267
+ contentType?: undefined;
2268
+ description?: undefined;
2269
+ finalUrl?: undefined;
2270
+ headings?: undefined;
2271
+ text?: undefined;
2272
+ title?: undefined;
2273
+ truncated?: undefined;
2274
+ } | {
2275
+ message: string;
2276
+ status: number;
2277
+ success: boolean;
2278
+ url: string;
2279
+ contentType?: undefined;
2280
+ description?: undefined;
2281
+ finalUrl?: undefined;
2282
+ headings?: undefined;
2283
+ text?: undefined;
2284
+ title?: undefined;
2285
+ truncated?: undefined;
2286
+ } | {
2287
+ contentType: string;
2288
+ message: string;
2289
+ success: boolean;
2290
+ url: string;
2291
+ status?: undefined;
2292
+ description?: undefined;
2293
+ finalUrl?: undefined;
2294
+ headings?: undefined;
2295
+ text?: undefined;
2296
+ title?: undefined;
2297
+ truncated?: undefined;
2298
+ } | {
2299
+ description: string;
2300
+ finalUrl: string;
2301
+ headings: string[];
2302
+ success: boolean;
2303
+ text: string;
2304
+ title: string;
2305
+ truncated: boolean;
2306
+ url: string;
2307
+ message?: undefined;
2308
+ status?: undefined;
2309
+ contentType?: undefined;
2310
+ }>;
2311
+ search_stock_photos: import('ai').Tool<{
2312
+ count: number;
2313
+ query: string;
2314
+ orientation?: "landscape" | "portrait" | "square" | undefined;
2315
+ }, {
2316
+ message: string;
2317
+ photos: never[];
2318
+ success: boolean;
2319
+ attemptedProviders?: undefined;
2320
+ provider?: undefined;
2321
+ query?: undefined;
2322
+ usageGuidance?: undefined;
2323
+ } | {
2324
+ attemptedProviders: string[];
2325
+ photos: any;
2326
+ provider: "pexels" | "unsplash";
2327
+ query: string;
2328
+ success: boolean;
2329
+ usageGuidance: string;
2330
+ message?: undefined;
2331
+ } | {
2332
+ attemptedProviders: string[];
2333
+ message: string;
2334
+ photos: never[];
2335
+ success: boolean;
2336
+ provider?: undefined;
2337
+ query?: undefined;
2338
+ usageGuidance?: undefined;
2339
+ }>;
2340
+ rewrite_page_draft: import('ai').Tool<{
2341
+ blocks: {
2342
+ blockType: "text" | "section" | "heading" | "image" | "button" | "posts_grid" | "video_embed" | "form" | "testimonial" | "product_grid" | "featured_product" | "cart" | "checkout" | "product_details";
2343
+ content: Record<string, unknown>;
2344
+ order?: number | undefined;
2345
+ }[];
2346
+ contentType?: "product" | "page" | "post" | undefined;
2347
+ entityId?: string | number | undefined;
2348
+ slug?: string | undefined;
2349
+ title?: string | undefined;
2350
+ meta?: {
2351
+ meta_description?: string | null | undefined;
2352
+ meta_title?: string | null | undefined;
2353
+ slug?: string | undefined;
2354
+ status?: "draft" | "published" | "archived" | undefined;
2355
+ title?: string | undefined;
2356
+ } | undefined;
2357
+ }, {
2358
+ confirmationPhrase: string;
2359
+ mutationExecuted: boolean;
2360
+ preview: Record<string, unknown>;
2361
+ requiresConfirmation: boolean;
2362
+ success: boolean;
2363
+ } | {
2364
+ blockCount: number;
2365
+ contentType: "page" | "post";
2366
+ draftPreviewPath: string | null;
2367
+ editPath: string;
2368
+ entityId: number;
2369
+ isDraft: boolean;
2370
+ mutationExecuted: boolean;
2371
+ slug: string;
2372
+ success: boolean;
2373
+ title: string;
2374
+ }>;
2375
+ translate_page: import('ai').Tool<{
2376
+ targetLanguageCode: string;
2377
+ translations: Record<string, string>;
2378
+ title?: string | undefined;
2379
+ }, {
2380
+ confirmationPhrase: string;
2381
+ mutationExecuted: boolean;
2382
+ preview: Record<string, unknown>;
2383
+ requiresConfirmation: boolean;
2384
+ success: boolean;
2385
+ } | {
2386
+ isTranslation: boolean;
2387
+ languageCode: string;
2388
+ }>;
2389
+ set_content_images: import('ai').Tool<{
2390
+ images: string[];
2391
+ }, {
2392
+ confirmationPhrase: string;
2393
+ mutationExecuted: boolean;
2394
+ preview: Record<string, unknown>;
2395
+ requiresConfirmation: boolean;
2396
+ success: boolean;
2397
+ } | {
2398
+ contentType: string;
2399
+ entityId: string | number;
2400
+ imageCount: number;
2401
+ mutationExecuted: boolean;
2402
+ slug: any;
2403
+ success: boolean;
2404
+ extraImagesIgnored?: undefined;
2405
+ } | {
2406
+ contentType: "product" | "page" | "post";
2407
+ entityId: string | number;
2408
+ extraImagesIgnored: number;
2409
+ imageCount: number;
2410
+ mutationExecuted: boolean;
2411
+ slug: any;
2412
+ success: boolean;
2413
+ }>;
2020
2414
  create_cms_page: import('ai').Tool<{
2021
2415
  status: "draft" | "published" | "archived";
2022
2416
  title: string;
@@ -3006,7 +3400,7 @@ export declare function createCortexGlobalAgentTools(context?: ToolExecutionCont
3006
3400
  description: string;
3007
3401
  primaryKey: readonly string[];
3008
3402
  readOnly: boolean;
3009
- table: "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "site_settings" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping";
3403
+ table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping";
3010
3404
  }[];
3011
3405
  }>;
3012
3406
  execute_database_action_plan: import('ai').Tool<{
@@ -3070,7 +3464,7 @@ export declare function createCortexGlobalAgentTools(context?: ToolExecutionCont
3070
3464
  sampleTargetIds: string[];
3071
3465
  success: boolean;
3072
3466
  summary: string;
3073
- table: "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "site_settings" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping";
3467
+ table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping";
3074
3468
  auditError?: string | undefined;
3075
3469
  affectedCount: number;
3076
3470
  auditLogged: boolean;
@@ -3079,7 +3473,7 @@ export declare function createCortexGlobalAgentTools(context?: ToolExecutionCont
3079
3473
  mutationExecuted: boolean;
3080
3474
  operation: "delete" | "update" | "insert" | "upsert";
3081
3475
  success: boolean;
3082
- table: "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "site_settings" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping";
3476
+ table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping";
3083
3477
  auditError?: string | undefined;
3084
3478
  auditLogged: boolean;
3085
3479
  }>;
@@ -3103,7 +3497,7 @@ export declare function createCortexGlobalAgentTools(context?: ToolExecutionCont
3103
3497
  offset: number;
3104
3498
  rows: unknown[];
3105
3499
  success: boolean;
3106
- table: "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "site_settings" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping";
3500
+ table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping";
3107
3501
  }>;
3108
3502
  };
3109
3503
  export {};