brainerce 1.44.1 → 1.45.0

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.
package/README.md CHANGED
@@ -32,28 +32,28 @@ yarn add brainerce
32
32
 
33
33
  Every Brainerce storefront must include **all mandatory features** below. Features auto-hide when the underlying capability is disabled, so build them all anyway — they'll appear the moment the store owner enables them.
34
34
 
35
- | Feature | SDK entry point | Mandatory |
36
- | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ----------- |
37
- | Product list with search, filter, pagination | `client.getProducts()`, `client.getSearchSuggestions(query)` | ✅ |
38
- | Product detail with variant picker, stock, price | `client.getProductBySlug()` + helpers | ✅ |
39
- | Buyer customization fields (engraving, uploads, select) | `product.customizationFields`, `client.uploadCustomizationFile()` | ✅ |
40
- | Cart (add, update, remove, coupon, totals) | `client.addToCart()`, `getCartTotals(cart)` | ✅ |
41
- | Inventory reservation countdown | Cart expiry timestamp from `client.getCart()` | ✅ |
42
- | Full checkout end-to-end with payment | `setShippingAddress → selectShippingMethod → getPaymentProviders → pay → handlePaymentSuccess → waitForOrder` | ✅ |
43
- | Order confirmation (clear cart + wait for real order) | `client.handlePaymentSuccess()`, `client.waitForOrder()` | ✅ |
44
- | Register + email verification flow | `client.registerCustomer()`, `client.verifyEmail()` | ✅ |
45
- | Login + verification branch | `client.loginCustomer()` | ✅ |
46
- | Forgot / reset password | `client.forgotPassword()`, `client.resetPassword()` | ✅ |
47
- | OAuth sign-in buttons + callback handler | `client.getAvailableOAuthProviders()` | ✅ |
48
- | Account area (profile + order history) | `client.getMyProfile()`, `client.getMyOrders()` | ✅ |
35
+ | Feature | SDK entry point | Mandatory |
36
+ | ------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | ----------- |
37
+ | Product list with search, filter, pagination | `client.getProducts()`, `client.getSearchSuggestions(query)` | ✅ |
38
+ | Product detail with variant picker, stock, price | `client.getProductBySlug()` + helpers | ✅ |
39
+ | Buyer customization fields (engraving, uploads, select) | `product.customizationFields`, `client.uploadCustomizationFile()` | ✅ |
40
+ | Cart (add, update, remove, coupon, totals) | `client.addToCart()`, `getCartTotals(cart)` | ✅ |
41
+ | Inventory reservation countdown | Cart expiry timestamp from `client.getCart()` | ✅ |
42
+ | Full checkout end-to-end with payment | `setShippingAddress → selectShippingMethod → getPaymentProviders → pay → handlePaymentSuccess → waitForOrder` | ✅ |
43
+ | Order confirmation (clear cart + wait for real order) | `client.handlePaymentSuccess()`, `client.waitForOrder()` | ✅ |
44
+ | Register + email verification flow | `client.registerCustomer()`, `client.verifyEmail()` | ✅ |
45
+ | Login + verification branch | `client.loginCustomer()` | ✅ |
46
+ | Forgot / reset password | `client.forgotPassword()`, `client.resetPassword()` | ✅ |
47
+ | OAuth sign-in buttons + callback handler | `client.getAvailableOAuthProviders()` | ✅ |
48
+ | Account area (profile + order history) | `client.getMyProfile()`, `client.getMyOrders()` | ✅ |
49
49
  | Loyalty & rewards (points balance + tiers + redeem) | `client.getLoyaltyStatus()`, `client.getAvailableRewards()`, `client.redeemLoyaltyReward(id)`, `client.reportSocialShare()` | conditional |
50
- | Global header: cart count + search autocomplete | `client.getCart()`, `client.getSearchSuggestions(query)` | ✅ |
51
- | Discount banners + product badges | `client.getDiscountBanners()`, `client.getProductDiscountBadge(productId)` | ✅ |
52
- | Product reviews on PDP + JSON-LD aggregateRating | `client.listProductReviews(id)`, `client.submitProductReview(id, …)` | ✅ |
53
- | Site chrome (header + footer + announcement bar) | `client.content.header.get()`, `client.content.footer.get()`, `client.content.announcement.list()` | ✅ |
54
- | FAQ page | `client.content.faq.get('main', locale)` | conditional |
55
- | Static pages catch-all (`/pages/[slug]`) | `client.content.page.getBySlug(slug, locale)` | conditional |
56
- | Multi-language + RTL (when i18n enabled) | `client.setLocale()`, `client.getStoreDirection(locale)` | conditional |
50
+ | Global header: cart count + search autocomplete | `client.getCart()`, `client.getSearchSuggestions(query)` | ✅ |
51
+ | Discount banners + product badges | `client.getDiscountBanners()`, `client.getProductDiscountBadge(productId)` | ✅ |
52
+ | Product reviews on PDP + JSON-LD aggregateRating | `client.listProductReviews(id)`, `client.submitProductReview(id, …)` | ✅ |
53
+ | Site chrome (header + footer + announcement bar) | `client.content.header.get()`, `client.content.footer.get()`, `client.content.announcement.list()` | ✅ |
54
+ | FAQ page | `client.content.faq.get('main', locale)` | conditional |
55
+ | Static pages catch-all (`/pages/[slug]`) | `client.content.page.getBySlug(slug, locale)` | conditional |
56
+ | Multi-language + RTL (when i18n enabled) | `client.setLocale()`, `client.getStoreDirection(locale)` | conditional |
57
57
 
58
58
  ---
59
59
 
@@ -1573,7 +1573,7 @@ await client.addToCart(cartId, {
1573
1573
  ```typescript
1574
1574
  // Works for CartItem, CheckoutLineItem, and OrderItem — same shape
1575
1575
  const summary = Object.values(item.customizations ?? {})
1576
- .map(c => `${c.label}: ${Array.isArray(c.value) ? c.value.join(', ') : c.value}`)
1576
+ .map((c) => `${c.label}: ${Array.isArray(c.value) ? c.value.join(', ') : c.value}`)
1577
1577
  .join(' | ');
1578
1578
  // e.g. "Frame color: Gold | Add-ons: Gift wrap, Engraving"
1579
1579
  ```
@@ -2262,11 +2262,11 @@ interface Checkout {
2262
2262
  subtotal: string;
2263
2263
  discountAmount: string;
2264
2264
  shippingAmount: string;
2265
- taxAmount: string; // "0" in inclusive (VAT) mode — see taxBreakdown.totalTax
2265
+ taxAmount: string; // "0" in inclusive (VAT) mode — see taxBreakdown.totalTax
2266
2266
  taxBreakdown?: TaxBreakdown | null; // { totalTax, pricesIncludeTax, breakdown[] }
2267
2267
  total: string;
2268
2268
  couponCode?: string | null;
2269
- notes?: string | null; // Order note from setCheckoutCustomer/setShippingAddress
2269
+ notes?: string | null; // Order note from setCheckoutCustomer/setShippingAddress
2270
2270
  items: CheckoutLineItem[];
2271
2271
  itemCount: number;
2272
2272
  availableShippingRates?: ShippingRate[];
@@ -2404,12 +2404,12 @@ const checkoutId = checkout.id;
2404
2404
  Use this method to get ALL enabled payment providers and build dynamic UI.
2405
2405
 
2406
2406
  **Primary vs. additive methods (Shopify-parity).** Each provider carries a
2407
- `methodType`. A `CREDIT_CARD` provider is the *primary* card processor — the
2407
+ `methodType`. A `CREDIT_CARD` provider is the _primary_ card processor — the
2408
2408
  single method that settles the order (`defaultProvider`, `isAdditive: false`,
2409
- `presentation: 'card_form'`). Everything else is *additive* (`isAdditive: true`),
2409
+ `presentation: 'card_form'`). Everything else is _additive_ (`isAdditive: true`),
2410
2410
  e.g. PayPal is a `'WALLET'` with `presentation: 'express_button'`. Render additive
2411
2411
  methods as accelerated-checkout **express buttons above the card form** — they sit
2412
- *alongside* the primary, never replace it. (Exception: a wallet-only store has no
2412
+ _alongside_ the primary, never replace it. (Exception: a wallet-only store has no
2413
2413
  card processor, so its wallet becomes the `defaultProvider` and stands alone.)
2414
2414
 
2415
2415
  ```typescript
@@ -2967,8 +2967,9 @@ const rewards = await client.getAvailableRewards();
2967
2967
  // Redeem → spends points, returns a one-time coupon code to apply to the cart.
2968
2968
  // `discountType` tells you how to interpret `discountValue` (currency amount
2969
2969
  // for FIXED_DISCOUNT, 0-100 percent for PERCENT_DISCOUNT).
2970
- const { couponCode, discountType, discountValue, pointsBalance } =
2971
- await client.redeemLoyaltyReward(rewards[0].id);
2970
+ const { couponCode, discountType, discountValue, pointsBalance } = await client.redeemLoyaltyReward(
2971
+ rewards[0].id
2972
+ );
2972
2973
  await client.applyCoupon(cartId, couponCode);
2973
2974
 
2974
2975
  // Self-reported social share — grants the SOCIAL_SHARE bonus if configured
@@ -3545,8 +3546,8 @@ client.trackEvent({ eventType: 'pageview', path: '/products/shoes' });
3545
3546
  const params = new URLSearchParams(window.location.search);
3546
3547
  client.trackEvent({
3547
3548
  path: window.location.pathname,
3548
- utmSource: params.get('utm_source') ?? undefined,
3549
- utmMedium: params.get('utm_medium') ?? undefined,
3549
+ utmSource: params.get('utm_source') ?? undefined,
3550
+ utmMedium: params.get('utm_medium') ?? undefined,
3550
3551
  utmCampaign: params.get('utm_campaign') ?? undefined,
3551
3552
  screenWidth: window.innerWidth,
3552
3553
  lang: navigator.language,
@@ -3577,6 +3578,94 @@ const admin = new BrainerceClient({
3577
3578
  });
3578
3579
  ```
3579
3580
 
3581
+ ### Product Management
3582
+
3583
+ ```typescript
3584
+ import type { Product, CreateProductDto, UpdateProductDto } from 'brainerce';
3585
+
3586
+ // Create a simple product
3587
+ const product: Product = await client.createProduct({
3588
+ name: 'Classic T-Shirt',
3589
+ slug: 'classic-t-shirt', // Optional — auto-generated from name if omitted
3590
+ sku: 'TSH-001',
3591
+ description: 'Soft cotton tee.',
3592
+ basePrice: 29.99,
3593
+ salePrice: 24.99, // Optional
3594
+ costPrice: 12.0, // Optional, internal — never synced to platforms
3595
+ status: 'active', // 'active' | 'draft' (default: 'active')
3596
+ type: 'SIMPLE', // 'SIMPLE' | 'VARIABLE' (default: 'SIMPLE')
3597
+ categories: ['cat_id'], // Existing category IDs
3598
+ categoryNames: ['Apparel'], // Or assign/auto-create by name — merged with `categories`
3599
+ brands: ['brand_id'],
3600
+ tags: ['sale', 'summer'],
3601
+ images: [
3602
+ {
3603
+ url: 'https://cdn.example.com/tshirt.jpg',
3604
+ position: 0,
3605
+ isMain: true,
3606
+ alt: 'Classic T-Shirt',
3607
+ },
3608
+ ],
3609
+
3610
+ // Cross-platform identifiers (Google Shopping / Facebook Catalog / TikTok).
3611
+ // Provide gtin when the product has one; otherwise mpn + brand.
3612
+ gtin: '012345678905', // EAN/UPC/ISBN — validated (GS1 mod-10 checksum)
3613
+ mpn: 'MFR-TSH-001', // Manufacturer Part Number — used only when gtin is absent
3614
+
3615
+ // Google Merchant Center sale_price_effective_date — bounds when `salePrice`
3616
+ // is actually active. Set both together, or omit both (sale always active).
3617
+ salePriceStartsAt: '2026-06-01T00:00:00Z',
3618
+ salePriceEndsAt: '2026-06-30T23:59:59Z',
3619
+
3620
+ // Shipping weight & dimensions — used for accurate shipping-cost
3621
+ // calculation and Google Shopping's shipping_weight/shipping_length/etc.
3622
+ shippingWeightValue: 0.3,
3623
+ shippingWeightUnit: 'kg', // 'kg' | 'lb' | 'g' | 'oz'
3624
+ shippingLengthValue: 30,
3625
+ shippingWidthValue: 20,
3626
+ shippingHeightValue: 2,
3627
+ shippingDimensionUnit: 'cm', // 'cm' | 'in' — shared by length/width/height
3628
+ });
3629
+
3630
+ // Update a product — every field is optional; only send what changed.
3631
+ // Pass `null` on gtin/mpn/salePriceStartsAt/salePriceEndsAt/shipping* to clear them.
3632
+ const updated: Product = await client.updateProduct('prod_123', {
3633
+ salePrice: null, // End the sale
3634
+ salePriceStartsAt: null,
3635
+ salePriceEndsAt: null,
3636
+ } satisfies UpdateProductDto);
3637
+
3638
+ // Delete a product (optionally also delete from synced platforms)
3639
+ await client.deleteProduct('prod_123', { platforms: ['SHOPIFY'] });
3640
+
3641
+ // VARIABLE products: create the product with type: 'VARIABLE', then add variants
3642
+ const variableProduct = await client.createProduct({
3643
+ name: 'Hoodie',
3644
+ basePrice: 0,
3645
+ type: 'VARIABLE',
3646
+ });
3647
+ await client.bulkSaveVariants(variableProduct.id, {
3648
+ variants: [
3649
+ {
3650
+ sku: 'HOOD-S-BLK',
3651
+ attributes: { Size: 'S', Color: 'Black' },
3652
+ price: 49.99,
3653
+ stock: 20,
3654
+ isEnabled: true,
3655
+ },
3656
+ {
3657
+ sku: 'HOOD-M-BLK',
3658
+ attributes: { Size: 'M', Color: 'Black' },
3659
+ price: 49.99,
3660
+ stock: 15,
3661
+ isEnabled: true,
3662
+ },
3663
+ ],
3664
+ });
3665
+ ```
3666
+
3667
+ **GTIN vs MPN:** these are two different identifiers, not interchangeable — GTIN (EAN/UPC/ISBN) is a universal barcode; MPN is manufacturer-specific and only meaningful paired with a brand. Provide GTIN when the product has one; otherwise brand + MPN. A product typically needs one or the other, not both.
3668
+
3580
3669
  ### Taxonomy Management
3581
3670
 
3582
3671
  ```typescript
@@ -3698,6 +3787,37 @@ const euZone = await client.createShippingZone({
3698
3787
  regionIds: ['reg_eu'],
3699
3788
  });
3700
3789
 
3790
+ // Polygon zone ("draw on map") — a hand-drawn delivery area. GeoJSON
3791
+ // Polygon/MultiPolygon, [lng, lat] ring coordinates. Independent of
3792
+ // `countries`/`regions`/`postalCodes`: a zone matches if the address
3793
+ // satisfies *either* coverage, so both may be set on the same zone (this
3794
+ // example omits `countries` since the polygon is its only coverage).
3795
+ const polygonZone = await client.createShippingZone({
3796
+ name: 'Tel Aviv Metro',
3797
+ countries: [],
3798
+ geometry: {
3799
+ type: 'Polygon',
3800
+ coordinates: [
3801
+ [
3802
+ [34.75, 32.05],
3803
+ [34.75, 32.1],
3804
+ [34.82, 32.1],
3805
+ [34.82, 32.05],
3806
+ [34.75, 32.05],
3807
+ ],
3808
+ ],
3809
+ },
3810
+ });
3811
+
3812
+ // Restrict a zone to specific sales channels — `SalesChannel.id` or the
3813
+ // public `vc_*` connectionId. Empty/omitted = every channel; a non-empty
3814
+ // list hides the zone unless the checkout came from one of them.
3815
+ const mobileOnlyZone = await client.createShippingZone({
3816
+ name: 'US Domestic (mobile app only)',
3817
+ countries: ['US'],
3818
+ salesChannelIds: ['vc_abc123'],
3819
+ });
3820
+
3701
3821
  // Shipping Rates
3702
3822
  const rates = await client.getZoneShippingRates('zone_id');
3703
3823
  await client.createZoneShippingRate('zone_id', {
@@ -3720,9 +3840,9 @@ const label = await admin.createShippingLabel(orderId, {
3720
3840
  shippoRateObjectId: 'rate_8f123456789abcdef', // Shippo rate.object_id from checkout rates
3721
3841
  });
3722
3842
 
3723
- console.log(label.labelUrl); // PDF label URL for printing
3843
+ console.log(label.labelUrl); // PDF label URL for printing
3724
3844
  console.log(label.trackingNumber); // Auto-populated on the order
3725
- console.log(label.carrier); // e.g. 'USPS', 'UPS', 'FedEx'
3845
+ console.log(label.carrier); // e.g. 'USPS', 'UPS', 'FedEx'
3726
3846
  ```
3727
3847
 
3728
3848
  The `trackingNumber` is stored on the `Order` automatically — customers see it in their
@@ -4047,6 +4167,43 @@ const preview = await client.previewEmailTemplate('template_id', {
4047
4167
  });
4048
4168
  ```
4049
4169
 
4170
+ ### Storefront Bot Settings
4171
+
4172
+ Requires an API key with the `bot-settings:read` / `bot-settings:write` scopes.
4173
+
4174
+ ```typescript
4175
+ // Every connection on the store + its current (or default) settings
4176
+ const { connections, settings } = await client.getBotSettings();
4177
+
4178
+ // PATCH semantics — only the fields you pass are changed
4179
+ await client.updateBotSettings({
4180
+ salesChannelId: connections[0].salesChannelId,
4181
+ enabled: true,
4182
+ displayName: 'Maya',
4183
+ personaJson: {
4184
+ greeting: 'Hi! Looking for something specific?',
4185
+ tone: 'friendly', // 'friendly' | 'formal' | 'playful' | 'concise'
4186
+ starterQuestions: ['What sizes do you carry?', "What's your return policy?"],
4187
+ avoidTopics: 'Do not discuss competitor pricing or make medical claims.',
4188
+ customInstructions: 'Always mention free shipping over $75.',
4189
+ capabilities: { productQa: true, recommendations: true, returns: false },
4190
+ },
4191
+ });
4192
+ ```
4193
+
4194
+ ### Storefront Bot Conversations
4195
+
4196
+ Studio inbox transcripts + on-demand summarization. Requires the `bot-conversations:read` / `bot-conversations:write` scopes.
4197
+
4198
+ ```typescript
4199
+ const { data: conversations } = await client.listBotConversations({ limit: 20 });
4200
+ const transcript = await client.getBotConversation(conversations[0].id);
4201
+
4202
+ // Persists a summary on the conversation; short threads (10 or fewer messages)
4203
+ // are a no-op — { summarized: false, summary: null } — no credits charged.
4204
+ const { summarized, summary } = await client.summarizeBotConversation(conversations[0].id);
4205
+ ```
4206
+
4050
4207
  ### Sync Conflict Resolution
4051
4208
 
4052
4209
  ```typescript
@@ -5129,7 +5286,7 @@ const forms = await brainerce.contactForms.list();
5129
5286
 
5130
5287
  ## Storefront Bot (AI chat widget)
5131
5288
 
5132
- Add the store's AI shopping assistant with one line. All configuration (name, avatar, colors, greeting, starter questions, guardrails) lives in the merchant dashboard — the widget renders nothing until the bot is switched Live there.
5289
+ Add the store's AI shopping assistant with one line. Configuration (name, avatar, colors, greeting, starter questions, guardrails) is normally set in the merchant dashboard — the widget renders nothing until the bot is switched Live there. Those same settings are also readable/writable via `client.getBotSettings()` / `client.updateBotSettings()`, and conversation transcripts + summarization via `client.listBotConversations()` / `client.summarizeBotConversation()` — see [Storefront Bot Settings](#storefront-bot-settings) and [Storefront Bot Conversations](#storefront-bot-conversations) in the Admin API Reference.
5133
5290
 
5134
5291
  ```html
5135
5292
  <!-- zero-code embed: keep the tag exactly this bare (no integrity/crossorigin) -->
package/dist/index.d.mts CHANGED
@@ -1202,6 +1202,10 @@ interface CreateProductDto {
1202
1202
  name: string;
1203
1203
  slug?: string;
1204
1204
  sku?: string;
1205
+ /** Global Trade Item Number (EAN/UPC/ISBN) — cross-platform identifier. */
1206
+ gtin?: string;
1207
+ /** Manufacturer Part Number — used by Google Shopping (with brand) when no GTIN exists. */
1208
+ mpn?: string;
1205
1209
  description?: string;
1206
1210
  basePrice: number;
1207
1211
  salePrice?: number;
@@ -1219,11 +1223,26 @@ interface CreateProductDto {
1219
1223
  brandNames?: string[];
1220
1224
  tags?: string[];
1221
1225
  images?: ProductImage[];
1226
+ /** Sale-price effective window (ISO 8601) — Google Merchant Center
1227
+ * sale_price_effective_date. Set both together, or neither applies. */
1228
+ salePriceStartsAt?: string;
1229
+ salePriceEndsAt?: string;
1230
+ shippingWeightValue?: number;
1231
+ shippingWeightUnit?: 'kg' | 'lb' | 'g' | 'oz';
1232
+ shippingLengthValue?: number;
1233
+ shippingWidthValue?: number;
1234
+ shippingHeightValue?: number;
1235
+ /** Unit shared by shippingLengthValue/shippingWidthValue/shippingHeightValue. */
1236
+ shippingDimensionUnit?: 'cm' | 'in';
1222
1237
  }
1223
1238
  interface UpdateProductDto {
1224
1239
  name?: string;
1225
1240
  slug?: string;
1226
1241
  sku?: string;
1242
+ /** Global Trade Item Number (EAN/UPC/ISBN). Pass `null` to clear. */
1243
+ gtin?: string | null;
1244
+ /** Manufacturer Part Number. Pass `null` to clear. */
1245
+ mpn?: string | null;
1227
1246
  description?: string;
1228
1247
  basePrice?: number;
1229
1248
  salePrice?: number | null;
@@ -1240,6 +1259,15 @@ interface UpdateProductDto {
1240
1259
  brandNames?: string[];
1241
1260
  tags?: string[];
1242
1261
  images?: ProductImage[];
1262
+ /** Sale-price effective window (ISO 8601). Pass `null` to clear either bound. */
1263
+ salePriceStartsAt?: string | null;
1264
+ salePriceEndsAt?: string | null;
1265
+ shippingWeightValue?: number | null;
1266
+ shippingWeightUnit?: 'kg' | 'lb' | 'g' | 'oz' | null;
1267
+ shippingLengthValue?: number | null;
1268
+ shippingWidthValue?: number | null;
1269
+ shippingHeightValue?: number | null;
1270
+ shippingDimensionUnit?: 'cm' | 'in' | null;
1243
1271
  }
1244
1272
  /**
1245
1273
  * Response from deleting a product
@@ -3643,6 +3671,10 @@ interface CreateCategoryDto {
3643
3671
  /** R2/S3 object key for `image`; powers asset-deletion cascade. */
3644
3672
  imageKey?: string;
3645
3673
  taxBehavior?: 'taxable' | 'exempt';
3674
+ /** Merchant override for Google's numeric product taxonomy id (Merchant
3675
+ * Center `google_product_category`). Omit to let the name-based
3676
+ * auto-resolver assign one. */
3677
+ googleTaxonomyId?: number;
3646
3678
  }
3647
3679
  interface UpdateCategoryDto {
3648
3680
  name?: string;
@@ -3652,6 +3684,10 @@ interface UpdateCategoryDto {
3652
3684
  /** R2/S3 object key for `image`; pass null to clear. */
3653
3685
  imageKey?: string | null;
3654
3686
  taxBehavior?: 'taxable' | 'exempt';
3687
+ /** Merchant override for Google's numeric product taxonomy id. Pass a
3688
+ * valid id to pin it (protects it from auto-resolution forever); pass
3689
+ * `null` to clear the override and re-resolve automatically. */
3690
+ googleTaxonomyId?: number | null;
3655
3691
  }
3656
3692
  /**
3657
3693
  * Brand entity for product organization
@@ -3888,6 +3924,14 @@ interface TaxonomyQueryParams {
3888
3924
  /**
3889
3925
  * Shipping zone with geographic restrictions
3890
3926
  */
3927
+ /** GeoJSON Polygon/MultiPolygon, [lng, lat] ring coordinates (RFC 7946). */
3928
+ type ShippingZoneGeometry = {
3929
+ type: 'Polygon';
3930
+ coordinates: number[][][];
3931
+ } | {
3932
+ type: 'MultiPolygon';
3933
+ coordinates: number[][][][];
3934
+ };
3891
3935
  interface ShippingZone {
3892
3936
  id: string;
3893
3937
  accountId: string;
@@ -3899,12 +3943,25 @@ interface ShippingZone {
3899
3943
  regions?: Record<string, string[]> | null;
3900
3944
  /** Postal code patterns */
3901
3945
  postalCodes?: Record<string, string[]> | null;
3946
+ /**
3947
+ * Polygon zone definition ("draw on map") — one or more hand-drawn shapes.
3948
+ * Independent of countries/regions/postalCodes: a zone matches if the
3949
+ * address satisfies *either* the country-list coverage *or* the polygon
3950
+ * coverage, so both may be set on the same zone.
3951
+ */
3952
+ geometry?: ShippingZoneGeometry | null;
3902
3953
  /**
3903
3954
  * Region restriction (PRD §25). Region IDs this zone is limited to. Empty =
3904
3955
  * available for any region (default). Non-empty = the zone is only offered to
3905
3956
  * checkouts whose region is in the list.
3906
3957
  */
3907
3958
  regionIds: string[];
3959
+ /**
3960
+ * Sales-channel restriction. `SalesChannel.id` values. Empty = available
3961
+ * on every channel (default). Non-empty = the zone is only offered to
3962
+ * checkouts from a channel in the list.
3963
+ */
3964
+ salesChannelIds: string[];
3908
3965
  /** Zone priority (lower = higher priority) */
3909
3966
  priority: number;
3910
3967
  isActive: boolean;
@@ -3943,8 +4000,16 @@ interface CreateShippingZoneDto {
3943
4000
  countries: string[];
3944
4001
  regions?: Record<string, string[]>;
3945
4002
  postalCodes?: Record<string, string[]>;
4003
+ /**
4004
+ * Polygon zone definition ("draw on map") — one or more hand-drawn shapes,
4005
+ * combined with countries/regions/postalCodes via OR (both may be set on
4006
+ * the same zone).
4007
+ */
4008
+ geometry?: ShippingZoneGeometry;
3946
4009
  /** Region restriction (PRD §25). Region IDs; empty/omitted = any region. */
3947
4010
  regionIds?: string[];
4011
+ /** Sales-channel restriction (SalesChannel.id, or vc_* connectionId). Empty/omitted = every channel. */
4012
+ salesChannelIds?: string[];
3948
4013
  priority?: number;
3949
4014
  isActive?: boolean;
3950
4015
  }
@@ -3953,8 +4018,12 @@ interface UpdateShippingZoneDto {
3953
4018
  countries?: string[];
3954
4019
  regions?: Record<string, string[]> | null;
3955
4020
  postalCodes?: Record<string, string[]> | null;
4021
+ /** Polygon zone definition ("draw on map"). Pass `null` to clear. Omit to leave unchanged. */
4022
+ geometry?: ShippingZoneGeometry | null;
3956
4023
  /** Region restriction (PRD §25). Empty array = clear; omit = leave unchanged. */
3957
4024
  regionIds?: string[];
4025
+ /** Sales-channel restriction. Empty array = clear (every channel); omit = leave unchanged. */
4026
+ salesChannelIds?: string[];
3958
4027
  priority?: number;
3959
4028
  isActive?: boolean;
3960
4029
  platformSettings?: Record<string, unknown>;
@@ -4666,6 +4735,122 @@ interface UpdateEmailSettingsDto {
4666
4735
  hourlyRateLimit?: number;
4667
4736
  customDomainId?: string;
4668
4737
  }
4738
+ /** One FAQ entry the bot can answer from directly. */
4739
+ interface BotFaq {
4740
+ q: string;
4741
+ a: string;
4742
+ }
4743
+ /** Per-capability on/off toggles. */
4744
+ interface BotCapabilities {
4745
+ productQa?: boolean;
4746
+ recommendations?: boolean;
4747
+ orderTracking?: boolean;
4748
+ returns?: boolean;
4749
+ cartRecovery?: boolean;
4750
+ bundleNudges?: boolean;
4751
+ }
4752
+ /** Persona/behavior config — greeting, tone, starter questions, guardrails, capabilities. */
4753
+ interface PersonaConfig {
4754
+ greeting?: string;
4755
+ tone?: 'friendly' | 'formal' | 'playful' | 'concise';
4756
+ accentColor?: string;
4757
+ responseLength?: 'concise' | 'balanced' | 'detailed';
4758
+ emoji?: boolean;
4759
+ bubbleShape?: 'rounded' | 'square';
4760
+ displayMode?: 'floating' | 'side_rail' | 'inline' | 'auto_open' | 'full_screen';
4761
+ position?: 'start' | 'end';
4762
+ allowExpand?: boolean;
4763
+ /** Freeform merchant instructions injected into the bot's system prompt. */
4764
+ customInstructions?: string;
4765
+ faqs?: BotFaq[];
4766
+ capabilities?: BotCapabilities;
4767
+ languages?: ('en' | 'he' | 'ar' | 'es' | 'fr')[];
4768
+ /** Starter questions shown as quick-reply chips before the shopper types. */
4769
+ starterQuestions?: string[];
4770
+ /** Freeform guardrail text — topics the bot should decline to discuss. */
4771
+ avoidTopics?: string;
4772
+ maxDiscountPct?: number | null;
4773
+ minRecommend?: number | null;
4774
+ }
4775
+ /** One connection (SalesChannel) + its current (or default) bot settings. */
4776
+ interface BotSettings {
4777
+ salesChannelId: string;
4778
+ connectionId: string;
4779
+ name: string;
4780
+ enabled: boolean;
4781
+ displayName: string;
4782
+ avatarUrl: string | null;
4783
+ personaJson: PersonaConfig;
4784
+ escalationJson: Record<string, unknown>;
4785
+ retentionJson: Record<string, unknown>;
4786
+ localeJson: Record<string, unknown> | null;
4787
+ dailySpendCeilingUsd: number | null;
4788
+ }
4789
+ interface BotSettingsConfigResponse {
4790
+ connections: {
4791
+ salesChannelId: string;
4792
+ connectionId: string;
4793
+ name: string;
4794
+ }[];
4795
+ settings: BotSettings[];
4796
+ }
4797
+ /** PATCH semantics — only fields present are changed. */
4798
+ interface UpdateBotSettingsDto {
4799
+ salesChannelId: string;
4800
+ enabled?: boolean;
4801
+ displayName?: string;
4802
+ avatarUrl?: string;
4803
+ personaJson?: PersonaConfig;
4804
+ }
4805
+ interface BotConversationMessage {
4806
+ id: string;
4807
+ role: string;
4808
+ content: string;
4809
+ createdAt: string;
4810
+ }
4811
+ interface BotConversationListItem {
4812
+ id: string;
4813
+ salesChannelId: string;
4814
+ title: string | null;
4815
+ locale: string;
4816
+ customerName: string | null;
4817
+ lastMessage: {
4818
+ role: string;
4819
+ content: string;
4820
+ createdAt: string;
4821
+ } | null;
4822
+ messageCount: number;
4823
+ unread: boolean;
4824
+ lastActivityAt: string;
4825
+ createdAt: string;
4826
+ }
4827
+ interface BotConversationDetail {
4828
+ id: string;
4829
+ salesChannelId: string;
4830
+ title: string | null;
4831
+ locale: string;
4832
+ customerName: string | null;
4833
+ customerEmail: string | null;
4834
+ merchantReadAt: string | null;
4835
+ lastActivityAt: string;
4836
+ createdAt: string;
4837
+ messages: BotConversationMessage[];
4838
+ /** Rolling summary from the most recent summarize() call, if any. */
4839
+ summarizedHistory: string | null;
4840
+ }
4841
+ interface BotConversationsPage {
4842
+ data: BotConversationListItem[];
4843
+ meta: {
4844
+ page: number;
4845
+ limit: number;
4846
+ total: number;
4847
+ totalPages: number;
4848
+ };
4849
+ }
4850
+ interface SummarizeBotConversationResult {
4851
+ summarized: boolean;
4852
+ summary: string | null;
4853
+ }
4669
4854
  /** Email template */
4670
4855
  interface EmailTemplate {
4671
4856
  id: string;
@@ -9891,6 +10076,38 @@ declare class BrainerceClient {
9891
10076
  * Requires Admin mode (apiKey)
9892
10077
  */
9893
10078
  updateEmailSettings(data: UpdateEmailSettingsDto): Promise<EmailSettings>;
10079
+ /**
10080
+ * Get Storefront Bot (AI Shopping Assistant) settings for every connection
10081
+ * on the store — name, avatar, persona, starter questions, guardrails,
10082
+ * capabilities. Requires Admin mode (apiKey).
10083
+ */
10084
+ getBotSettings(): Promise<BotSettingsConfigResponse>;
10085
+ /**
10086
+ * Create/update one connection's Storefront Bot settings. Only fields
10087
+ * present in `data` are changed (PATCH semantics). Requires Admin mode
10088
+ * (apiKey).
10089
+ */
10090
+ updateBotSettings(data: UpdateBotSettingsDto): Promise<BotSettings>;
10091
+ /**
10092
+ * Paginated Storefront Bot conversation inbox, optionally filtered to one
10093
+ * connection. Requires Admin mode (apiKey).
10094
+ */
10095
+ listBotConversations(opts?: {
10096
+ salesChannelId?: string;
10097
+ page?: number;
10098
+ limit?: number;
10099
+ }): Promise<BotConversationsPage>;
10100
+ /**
10101
+ * Full transcript for one Storefront Bot conversation, including its
10102
+ * summary if one was generated. Requires Admin mode (apiKey).
10103
+ */
10104
+ getBotConversation(conversationId: string): Promise<BotConversationDetail>;
10105
+ /**
10106
+ * Summarize a Storefront Bot conversation on demand and persist the
10107
+ * summary. Short threads (10 or fewer messages) are a graceful no-op — no
10108
+ * credits charged. Requires Admin mode (apiKey).
10109
+ */
10110
+ summarizeBotConversation(conversationId: string): Promise<SummarizeBotConversationResult>;
9894
10111
  /**
9895
10112
  * Get all email templates for the store, grouped by (eventType, language).
9896
10113
  * Response includes the store's primary language and supported languages so
@@ -10009,7 +10226,7 @@ declare class BrainerceError extends Error {
10009
10226
  constructor(message: string, statusCode: number, details?: unknown);
10010
10227
  }
10011
10228
 
10012
- declare const SDK_VERSION = "1.42.0";
10229
+ declare const SDK_VERSION = "1.45.0";
10013
10230
 
10014
10231
  /**
10015
10232
  * Verify a webhook signature from Brainerce
package/dist/index.d.ts CHANGED
@@ -1202,6 +1202,10 @@ interface CreateProductDto {
1202
1202
  name: string;
1203
1203
  slug?: string;
1204
1204
  sku?: string;
1205
+ /** Global Trade Item Number (EAN/UPC/ISBN) — cross-platform identifier. */
1206
+ gtin?: string;
1207
+ /** Manufacturer Part Number — used by Google Shopping (with brand) when no GTIN exists. */
1208
+ mpn?: string;
1205
1209
  description?: string;
1206
1210
  basePrice: number;
1207
1211
  salePrice?: number;
@@ -1219,11 +1223,26 @@ interface CreateProductDto {
1219
1223
  brandNames?: string[];
1220
1224
  tags?: string[];
1221
1225
  images?: ProductImage[];
1226
+ /** Sale-price effective window (ISO 8601) — Google Merchant Center
1227
+ * sale_price_effective_date. Set both together, or neither applies. */
1228
+ salePriceStartsAt?: string;
1229
+ salePriceEndsAt?: string;
1230
+ shippingWeightValue?: number;
1231
+ shippingWeightUnit?: 'kg' | 'lb' | 'g' | 'oz';
1232
+ shippingLengthValue?: number;
1233
+ shippingWidthValue?: number;
1234
+ shippingHeightValue?: number;
1235
+ /** Unit shared by shippingLengthValue/shippingWidthValue/shippingHeightValue. */
1236
+ shippingDimensionUnit?: 'cm' | 'in';
1222
1237
  }
1223
1238
  interface UpdateProductDto {
1224
1239
  name?: string;
1225
1240
  slug?: string;
1226
1241
  sku?: string;
1242
+ /** Global Trade Item Number (EAN/UPC/ISBN). Pass `null` to clear. */
1243
+ gtin?: string | null;
1244
+ /** Manufacturer Part Number. Pass `null` to clear. */
1245
+ mpn?: string | null;
1227
1246
  description?: string;
1228
1247
  basePrice?: number;
1229
1248
  salePrice?: number | null;
@@ -1240,6 +1259,15 @@ interface UpdateProductDto {
1240
1259
  brandNames?: string[];
1241
1260
  tags?: string[];
1242
1261
  images?: ProductImage[];
1262
+ /** Sale-price effective window (ISO 8601). Pass `null` to clear either bound. */
1263
+ salePriceStartsAt?: string | null;
1264
+ salePriceEndsAt?: string | null;
1265
+ shippingWeightValue?: number | null;
1266
+ shippingWeightUnit?: 'kg' | 'lb' | 'g' | 'oz' | null;
1267
+ shippingLengthValue?: number | null;
1268
+ shippingWidthValue?: number | null;
1269
+ shippingHeightValue?: number | null;
1270
+ shippingDimensionUnit?: 'cm' | 'in' | null;
1243
1271
  }
1244
1272
  /**
1245
1273
  * Response from deleting a product
@@ -3643,6 +3671,10 @@ interface CreateCategoryDto {
3643
3671
  /** R2/S3 object key for `image`; powers asset-deletion cascade. */
3644
3672
  imageKey?: string;
3645
3673
  taxBehavior?: 'taxable' | 'exempt';
3674
+ /** Merchant override for Google's numeric product taxonomy id (Merchant
3675
+ * Center `google_product_category`). Omit to let the name-based
3676
+ * auto-resolver assign one. */
3677
+ googleTaxonomyId?: number;
3646
3678
  }
3647
3679
  interface UpdateCategoryDto {
3648
3680
  name?: string;
@@ -3652,6 +3684,10 @@ interface UpdateCategoryDto {
3652
3684
  /** R2/S3 object key for `image`; pass null to clear. */
3653
3685
  imageKey?: string | null;
3654
3686
  taxBehavior?: 'taxable' | 'exempt';
3687
+ /** Merchant override for Google's numeric product taxonomy id. Pass a
3688
+ * valid id to pin it (protects it from auto-resolution forever); pass
3689
+ * `null` to clear the override and re-resolve automatically. */
3690
+ googleTaxonomyId?: number | null;
3655
3691
  }
3656
3692
  /**
3657
3693
  * Brand entity for product organization
@@ -3888,6 +3924,14 @@ interface TaxonomyQueryParams {
3888
3924
  /**
3889
3925
  * Shipping zone with geographic restrictions
3890
3926
  */
3927
+ /** GeoJSON Polygon/MultiPolygon, [lng, lat] ring coordinates (RFC 7946). */
3928
+ type ShippingZoneGeometry = {
3929
+ type: 'Polygon';
3930
+ coordinates: number[][][];
3931
+ } | {
3932
+ type: 'MultiPolygon';
3933
+ coordinates: number[][][][];
3934
+ };
3891
3935
  interface ShippingZone {
3892
3936
  id: string;
3893
3937
  accountId: string;
@@ -3899,12 +3943,25 @@ interface ShippingZone {
3899
3943
  regions?: Record<string, string[]> | null;
3900
3944
  /** Postal code patterns */
3901
3945
  postalCodes?: Record<string, string[]> | null;
3946
+ /**
3947
+ * Polygon zone definition ("draw on map") — one or more hand-drawn shapes.
3948
+ * Independent of countries/regions/postalCodes: a zone matches if the
3949
+ * address satisfies *either* the country-list coverage *or* the polygon
3950
+ * coverage, so both may be set on the same zone.
3951
+ */
3952
+ geometry?: ShippingZoneGeometry | null;
3902
3953
  /**
3903
3954
  * Region restriction (PRD §25). Region IDs this zone is limited to. Empty =
3904
3955
  * available for any region (default). Non-empty = the zone is only offered to
3905
3956
  * checkouts whose region is in the list.
3906
3957
  */
3907
3958
  regionIds: string[];
3959
+ /**
3960
+ * Sales-channel restriction. `SalesChannel.id` values. Empty = available
3961
+ * on every channel (default). Non-empty = the zone is only offered to
3962
+ * checkouts from a channel in the list.
3963
+ */
3964
+ salesChannelIds: string[];
3908
3965
  /** Zone priority (lower = higher priority) */
3909
3966
  priority: number;
3910
3967
  isActive: boolean;
@@ -3943,8 +4000,16 @@ interface CreateShippingZoneDto {
3943
4000
  countries: string[];
3944
4001
  regions?: Record<string, string[]>;
3945
4002
  postalCodes?: Record<string, string[]>;
4003
+ /**
4004
+ * Polygon zone definition ("draw on map") — one or more hand-drawn shapes,
4005
+ * combined with countries/regions/postalCodes via OR (both may be set on
4006
+ * the same zone).
4007
+ */
4008
+ geometry?: ShippingZoneGeometry;
3946
4009
  /** Region restriction (PRD §25). Region IDs; empty/omitted = any region. */
3947
4010
  regionIds?: string[];
4011
+ /** Sales-channel restriction (SalesChannel.id, or vc_* connectionId). Empty/omitted = every channel. */
4012
+ salesChannelIds?: string[];
3948
4013
  priority?: number;
3949
4014
  isActive?: boolean;
3950
4015
  }
@@ -3953,8 +4018,12 @@ interface UpdateShippingZoneDto {
3953
4018
  countries?: string[];
3954
4019
  regions?: Record<string, string[]> | null;
3955
4020
  postalCodes?: Record<string, string[]> | null;
4021
+ /** Polygon zone definition ("draw on map"). Pass `null` to clear. Omit to leave unchanged. */
4022
+ geometry?: ShippingZoneGeometry | null;
3956
4023
  /** Region restriction (PRD §25). Empty array = clear; omit = leave unchanged. */
3957
4024
  regionIds?: string[];
4025
+ /** Sales-channel restriction. Empty array = clear (every channel); omit = leave unchanged. */
4026
+ salesChannelIds?: string[];
3958
4027
  priority?: number;
3959
4028
  isActive?: boolean;
3960
4029
  platformSettings?: Record<string, unknown>;
@@ -4666,6 +4735,122 @@ interface UpdateEmailSettingsDto {
4666
4735
  hourlyRateLimit?: number;
4667
4736
  customDomainId?: string;
4668
4737
  }
4738
+ /** One FAQ entry the bot can answer from directly. */
4739
+ interface BotFaq {
4740
+ q: string;
4741
+ a: string;
4742
+ }
4743
+ /** Per-capability on/off toggles. */
4744
+ interface BotCapabilities {
4745
+ productQa?: boolean;
4746
+ recommendations?: boolean;
4747
+ orderTracking?: boolean;
4748
+ returns?: boolean;
4749
+ cartRecovery?: boolean;
4750
+ bundleNudges?: boolean;
4751
+ }
4752
+ /** Persona/behavior config — greeting, tone, starter questions, guardrails, capabilities. */
4753
+ interface PersonaConfig {
4754
+ greeting?: string;
4755
+ tone?: 'friendly' | 'formal' | 'playful' | 'concise';
4756
+ accentColor?: string;
4757
+ responseLength?: 'concise' | 'balanced' | 'detailed';
4758
+ emoji?: boolean;
4759
+ bubbleShape?: 'rounded' | 'square';
4760
+ displayMode?: 'floating' | 'side_rail' | 'inline' | 'auto_open' | 'full_screen';
4761
+ position?: 'start' | 'end';
4762
+ allowExpand?: boolean;
4763
+ /** Freeform merchant instructions injected into the bot's system prompt. */
4764
+ customInstructions?: string;
4765
+ faqs?: BotFaq[];
4766
+ capabilities?: BotCapabilities;
4767
+ languages?: ('en' | 'he' | 'ar' | 'es' | 'fr')[];
4768
+ /** Starter questions shown as quick-reply chips before the shopper types. */
4769
+ starterQuestions?: string[];
4770
+ /** Freeform guardrail text — topics the bot should decline to discuss. */
4771
+ avoidTopics?: string;
4772
+ maxDiscountPct?: number | null;
4773
+ minRecommend?: number | null;
4774
+ }
4775
+ /** One connection (SalesChannel) + its current (or default) bot settings. */
4776
+ interface BotSettings {
4777
+ salesChannelId: string;
4778
+ connectionId: string;
4779
+ name: string;
4780
+ enabled: boolean;
4781
+ displayName: string;
4782
+ avatarUrl: string | null;
4783
+ personaJson: PersonaConfig;
4784
+ escalationJson: Record<string, unknown>;
4785
+ retentionJson: Record<string, unknown>;
4786
+ localeJson: Record<string, unknown> | null;
4787
+ dailySpendCeilingUsd: number | null;
4788
+ }
4789
+ interface BotSettingsConfigResponse {
4790
+ connections: {
4791
+ salesChannelId: string;
4792
+ connectionId: string;
4793
+ name: string;
4794
+ }[];
4795
+ settings: BotSettings[];
4796
+ }
4797
+ /** PATCH semantics — only fields present are changed. */
4798
+ interface UpdateBotSettingsDto {
4799
+ salesChannelId: string;
4800
+ enabled?: boolean;
4801
+ displayName?: string;
4802
+ avatarUrl?: string;
4803
+ personaJson?: PersonaConfig;
4804
+ }
4805
+ interface BotConversationMessage {
4806
+ id: string;
4807
+ role: string;
4808
+ content: string;
4809
+ createdAt: string;
4810
+ }
4811
+ interface BotConversationListItem {
4812
+ id: string;
4813
+ salesChannelId: string;
4814
+ title: string | null;
4815
+ locale: string;
4816
+ customerName: string | null;
4817
+ lastMessage: {
4818
+ role: string;
4819
+ content: string;
4820
+ createdAt: string;
4821
+ } | null;
4822
+ messageCount: number;
4823
+ unread: boolean;
4824
+ lastActivityAt: string;
4825
+ createdAt: string;
4826
+ }
4827
+ interface BotConversationDetail {
4828
+ id: string;
4829
+ salesChannelId: string;
4830
+ title: string | null;
4831
+ locale: string;
4832
+ customerName: string | null;
4833
+ customerEmail: string | null;
4834
+ merchantReadAt: string | null;
4835
+ lastActivityAt: string;
4836
+ createdAt: string;
4837
+ messages: BotConversationMessage[];
4838
+ /** Rolling summary from the most recent summarize() call, if any. */
4839
+ summarizedHistory: string | null;
4840
+ }
4841
+ interface BotConversationsPage {
4842
+ data: BotConversationListItem[];
4843
+ meta: {
4844
+ page: number;
4845
+ limit: number;
4846
+ total: number;
4847
+ totalPages: number;
4848
+ };
4849
+ }
4850
+ interface SummarizeBotConversationResult {
4851
+ summarized: boolean;
4852
+ summary: string | null;
4853
+ }
4669
4854
  /** Email template */
4670
4855
  interface EmailTemplate {
4671
4856
  id: string;
@@ -9891,6 +10076,38 @@ declare class BrainerceClient {
9891
10076
  * Requires Admin mode (apiKey)
9892
10077
  */
9893
10078
  updateEmailSettings(data: UpdateEmailSettingsDto): Promise<EmailSettings>;
10079
+ /**
10080
+ * Get Storefront Bot (AI Shopping Assistant) settings for every connection
10081
+ * on the store — name, avatar, persona, starter questions, guardrails,
10082
+ * capabilities. Requires Admin mode (apiKey).
10083
+ */
10084
+ getBotSettings(): Promise<BotSettingsConfigResponse>;
10085
+ /**
10086
+ * Create/update one connection's Storefront Bot settings. Only fields
10087
+ * present in `data` are changed (PATCH semantics). Requires Admin mode
10088
+ * (apiKey).
10089
+ */
10090
+ updateBotSettings(data: UpdateBotSettingsDto): Promise<BotSettings>;
10091
+ /**
10092
+ * Paginated Storefront Bot conversation inbox, optionally filtered to one
10093
+ * connection. Requires Admin mode (apiKey).
10094
+ */
10095
+ listBotConversations(opts?: {
10096
+ salesChannelId?: string;
10097
+ page?: number;
10098
+ limit?: number;
10099
+ }): Promise<BotConversationsPage>;
10100
+ /**
10101
+ * Full transcript for one Storefront Bot conversation, including its
10102
+ * summary if one was generated. Requires Admin mode (apiKey).
10103
+ */
10104
+ getBotConversation(conversationId: string): Promise<BotConversationDetail>;
10105
+ /**
10106
+ * Summarize a Storefront Bot conversation on demand and persist the
10107
+ * summary. Short threads (10 or fewer messages) are a graceful no-op — no
10108
+ * credits charged. Requires Admin mode (apiKey).
10109
+ */
10110
+ summarizeBotConversation(conversationId: string): Promise<SummarizeBotConversationResult>;
9894
10111
  /**
9895
10112
  * Get all email templates for the store, grouped by (eventType, language).
9896
10113
  * Response includes the store's primary language and supported languages so
@@ -10009,7 +10226,7 @@ declare class BrainerceError extends Error {
10009
10226
  constructor(message: string, statusCode: number, details?: unknown);
10010
10227
  }
10011
10228
 
10012
- declare const SDK_VERSION = "1.42.0";
10229
+ declare const SDK_VERSION = "1.45.0";
10013
10230
 
10014
10231
  /**
10015
10232
  * Verify a webhook signature from Brainerce
package/dist/index.js CHANGED
@@ -185,7 +185,7 @@ function isDevGuardsEnabled() {
185
185
  }
186
186
 
187
187
  // src/version.ts
188
- var SDK_VERSION = "1.42.0";
188
+ var SDK_VERSION = "1.45.0";
189
189
 
190
190
  // src/client.ts
191
191
  var DEFAULT_BASE_URL = "https://api.brainerce.com";
@@ -5568,10 +5568,7 @@ var BrainerceClient = class {
5568
5568
  "order"
5569
5569
  );
5570
5570
  }
5571
- throw new BrainerceError(
5572
- "getOrderByCheckout() requires vibe-coded or storefront mode",
5573
- 400
5574
- );
5571
+ throw new BrainerceError("getOrderByCheckout() requires vibe-coded or storefront mode", 400);
5575
5572
  }
5576
5573
  /**
5577
5574
  * Check if localStorage is available (browser environment)
@@ -8392,6 +8389,55 @@ var BrainerceClient = class {
8392
8389
  async updateEmailSettings(data) {
8393
8390
  return this.adminRequest("PUT", "/api/v1/email/settings", data);
8394
8391
  }
8392
+ /**
8393
+ * Get Storefront Bot (AI Shopping Assistant) settings for every connection
8394
+ * on the store — name, avatar, persona, starter questions, guardrails,
8395
+ * capabilities. Requires Admin mode (apiKey).
8396
+ */
8397
+ async getBotSettings() {
8398
+ return this.adminRequest("GET", "/api/v1/storefront-bot/settings");
8399
+ }
8400
+ /**
8401
+ * Create/update one connection's Storefront Bot settings. Only fields
8402
+ * present in `data` are changed (PATCH semantics). Requires Admin mode
8403
+ * (apiKey).
8404
+ */
8405
+ async updateBotSettings(data) {
8406
+ return this.adminRequest("PUT", "/api/v1/storefront-bot/settings", data);
8407
+ }
8408
+ /**
8409
+ * Paginated Storefront Bot conversation inbox, optionally filtered to one
8410
+ * connection. Requires Admin mode (apiKey).
8411
+ */
8412
+ async listBotConversations(opts) {
8413
+ return this.adminRequest(
8414
+ "GET",
8415
+ "/api/v1/storefront-bot/conversations",
8416
+ void 0,
8417
+ opts
8418
+ );
8419
+ }
8420
+ /**
8421
+ * Full transcript for one Storefront Bot conversation, including its
8422
+ * summary if one was generated. Requires Admin mode (apiKey).
8423
+ */
8424
+ async getBotConversation(conversationId) {
8425
+ return this.adminRequest(
8426
+ "GET",
8427
+ `/api/v1/storefront-bot/conversations/${conversationId}`
8428
+ );
8429
+ }
8430
+ /**
8431
+ * Summarize a Storefront Bot conversation on demand and persist the
8432
+ * summary. Short threads (10 or fewer messages) are a graceful no-op — no
8433
+ * credits charged. Requires Admin mode (apiKey).
8434
+ */
8435
+ async summarizeBotConversation(conversationId) {
8436
+ return this.adminRequest(
8437
+ "POST",
8438
+ `/api/v1/storefront-bot/conversations/${conversationId}/summarize`
8439
+ );
8440
+ }
8395
8441
  /**
8396
8442
  * Get all email templates for the store, grouped by (eventType, language).
8397
8443
  * Response includes the store's primary language and supported languages so
package/dist/index.mjs CHANGED
@@ -115,7 +115,7 @@ function isDevGuardsEnabled() {
115
115
  }
116
116
 
117
117
  // src/version.ts
118
- var SDK_VERSION = "1.42.0";
118
+ var SDK_VERSION = "1.45.0";
119
119
 
120
120
  // src/client.ts
121
121
  var DEFAULT_BASE_URL = "https://api.brainerce.com";
@@ -5498,10 +5498,7 @@ var BrainerceClient = class {
5498
5498
  "order"
5499
5499
  );
5500
5500
  }
5501
- throw new BrainerceError(
5502
- "getOrderByCheckout() requires vibe-coded or storefront mode",
5503
- 400
5504
- );
5501
+ throw new BrainerceError("getOrderByCheckout() requires vibe-coded or storefront mode", 400);
5505
5502
  }
5506
5503
  /**
5507
5504
  * Check if localStorage is available (browser environment)
@@ -8322,6 +8319,55 @@ var BrainerceClient = class {
8322
8319
  async updateEmailSettings(data) {
8323
8320
  return this.adminRequest("PUT", "/api/v1/email/settings", data);
8324
8321
  }
8322
+ /**
8323
+ * Get Storefront Bot (AI Shopping Assistant) settings for every connection
8324
+ * on the store — name, avatar, persona, starter questions, guardrails,
8325
+ * capabilities. Requires Admin mode (apiKey).
8326
+ */
8327
+ async getBotSettings() {
8328
+ return this.adminRequest("GET", "/api/v1/storefront-bot/settings");
8329
+ }
8330
+ /**
8331
+ * Create/update one connection's Storefront Bot settings. Only fields
8332
+ * present in `data` are changed (PATCH semantics). Requires Admin mode
8333
+ * (apiKey).
8334
+ */
8335
+ async updateBotSettings(data) {
8336
+ return this.adminRequest("PUT", "/api/v1/storefront-bot/settings", data);
8337
+ }
8338
+ /**
8339
+ * Paginated Storefront Bot conversation inbox, optionally filtered to one
8340
+ * connection. Requires Admin mode (apiKey).
8341
+ */
8342
+ async listBotConversations(opts) {
8343
+ return this.adminRequest(
8344
+ "GET",
8345
+ "/api/v1/storefront-bot/conversations",
8346
+ void 0,
8347
+ opts
8348
+ );
8349
+ }
8350
+ /**
8351
+ * Full transcript for one Storefront Bot conversation, including its
8352
+ * summary if one was generated. Requires Admin mode (apiKey).
8353
+ */
8354
+ async getBotConversation(conversationId) {
8355
+ return this.adminRequest(
8356
+ "GET",
8357
+ `/api/v1/storefront-bot/conversations/${conversationId}`
8358
+ );
8359
+ }
8360
+ /**
8361
+ * Summarize a Storefront Bot conversation on demand and persist the
8362
+ * summary. Short threads (10 or fewer messages) are a graceful no-op — no
8363
+ * credits charged. Requires Admin mode (apiKey).
8364
+ */
8365
+ async summarizeBotConversation(conversationId) {
8366
+ return this.adminRequest(
8367
+ "POST",
8368
+ `/api/v1/storefront-bot/conversations/${conversationId}/summarize`
8369
+ );
8370
+ }
8325
8371
  /**
8326
8372
  * Get all email templates for the store, grouped by (eventType, language).
8327
8373
  * Response includes the store's primary language and supported languages so
package/package.json CHANGED
@@ -1,81 +1,81 @@
1
- {
2
- "name": "brainerce",
3
- "version": "1.44.1",
4
- "description": "Official SDK for building e-commerce storefronts with Brainerce Platform. Perfect for vibe-coded sites, AI-built stores (Cursor, Lovable, v0), and custom storefronts.",
5
- "main": "dist/index.js",
6
- "module": "dist/index.mjs",
7
- "types": "dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./dist/index.d.ts",
11
- "require": "./dist/index.js",
12
- "import": "./dist/index.mjs"
13
- },
14
- "./bot": {
15
- "types": "./dist/bot/index.d.ts",
16
- "require": "./dist/bot/index.js",
17
- "import": "./dist/bot/index.mjs"
18
- }
19
- },
20
- "files": [
21
- "dist",
22
- "README.md"
23
- ],
24
- "scripts": {
25
- "build": "tsup src/index.ts --format cjs,esm --dts && tsup src/bot/index.ts --format cjs,esm --dts --out-dir dist/bot && tsup src/bot/bootstrap.ts --format iife --minify --out-dir dist/bot",
26
- "dev": "tsup src/index.ts --format cjs,esm --dts --watch",
27
- "lint": "eslint \"src/**/*.ts\"",
28
- "test": "vitest run",
29
- "test:watch": "vitest",
30
- "prepublishOnly": "pnpm build"
31
- },
32
- "keywords": [
33
- "brainerce",
34
- "e-commerce",
35
- "ecommerce",
36
- "sdk",
37
- "vibe-coding",
38
- "vibe-coded",
39
- "ai-commerce",
40
- "storefront",
41
- "headless-commerce",
42
- "multi-platform",
43
- "shopify",
44
- "tiktok",
45
- "cursor",
46
- "lovable",
47
- "v0",
48
- "cart",
49
- "checkout",
50
- "products",
51
- "sync"
52
- ],
53
- "author": "Brainerce",
54
- "license": "MIT",
55
- "repository": {
56
- "type": "git",
57
- "url": "https://github.com/brainerce/brainerce.git",
58
- "directory": "packages/sdk"
59
- },
60
- "homepage": "https://brainerce.com",
61
- "bugs": {
62
- "url": "https://github.com/brainerce/brainerce/issues"
63
- },
64
- "devDependencies": {
65
- "@types/node": "^25.0.3",
66
- "@typescript-eslint/eslint-plugin": "^8.50.1",
67
- "@typescript-eslint/parser": "^8.50.1",
68
- "eslint": "^9.39.2",
69
- "tsup": "^8.0.0",
70
- "typescript": "^5.3.0",
71
- "vitest": "^1.0.0"
72
- },
73
- "peerDependencies": {
74
- "typescript": ">=4.7.0"
75
- },
76
- "peerDependenciesMeta": {
77
- "typescript": {
78
- "optional": true
79
- }
80
- }
81
- }
1
+ {
2
+ "name": "brainerce",
3
+ "version": "1.45.0",
4
+ "description": "Official SDK for building e-commerce storefronts with Brainerce Platform. Perfect for vibe-coded sites, AI-built stores (Cursor, Lovable, v0), and custom storefronts.",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "require": "./dist/index.js",
12
+ "import": "./dist/index.mjs"
13
+ },
14
+ "./bot": {
15
+ "types": "./dist/bot/index.d.ts",
16
+ "require": "./dist/bot/index.js",
17
+ "import": "./dist/bot/index.mjs"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "README.md"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsup src/index.ts --format cjs,esm --dts && tsup src/bot/index.ts --format cjs,esm --dts --out-dir dist/bot && tsup src/bot/bootstrap.ts --format iife --minify --out-dir dist/bot",
26
+ "dev": "tsup src/index.ts --format cjs,esm --dts --watch",
27
+ "lint": "eslint \"src/**/*.ts\"",
28
+ "test": "vitest run",
29
+ "test:watch": "vitest",
30
+ "prepublishOnly": "pnpm build"
31
+ },
32
+ "keywords": [
33
+ "brainerce",
34
+ "e-commerce",
35
+ "ecommerce",
36
+ "sdk",
37
+ "vibe-coding",
38
+ "vibe-coded",
39
+ "ai-commerce",
40
+ "storefront",
41
+ "headless-commerce",
42
+ "multi-platform",
43
+ "shopify",
44
+ "tiktok",
45
+ "cursor",
46
+ "lovable",
47
+ "v0",
48
+ "cart",
49
+ "checkout",
50
+ "products",
51
+ "sync"
52
+ ],
53
+ "author": "Brainerce",
54
+ "license": "MIT",
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "https://github.com/brainerce/brainerce.git",
58
+ "directory": "packages/sdk"
59
+ },
60
+ "homepage": "https://brainerce.com",
61
+ "bugs": {
62
+ "url": "https://github.com/brainerce/brainerce/issues"
63
+ },
64
+ "devDependencies": {
65
+ "@types/node": "^25.0.3",
66
+ "@typescript-eslint/eslint-plugin": "^8.50.1",
67
+ "@typescript-eslint/parser": "^8.50.1",
68
+ "eslint": "^9.39.2",
69
+ "tsup": "^8.0.0",
70
+ "typescript": "^5.3.0",
71
+ "vitest": "^1.0.0"
72
+ },
73
+ "peerDependencies": {
74
+ "typescript": ">=4.7.0"
75
+ },
76
+ "peerDependenciesMeta": {
77
+ "typescript": {
78
+ "optional": true
79
+ }
80
+ }
81
+ }