@brainerce/mcp-server 3.2.0 → 3.4.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/dist/bin/http.js CHANGED
@@ -1864,6 +1864,265 @@ const admin = new BrainerceClient({ apiKey: 'brainerce_...' });
1864
1864
  // OAuth: getOAuthProviders(), configureOAuthProvider()
1865
1865
  \`\`\``;
1866
1866
  }
1867
+ function getContactInquiriesSection() {
1868
+ return `## Contact Inquiries & Forms (optional)
1869
+
1870
+ Accept messages from one or more contact forms on your storefront. The merchant
1871
+ configures everything in the Brainerce dashboard under **Customers \u2192 Contact
1872
+ Forms**; submissions land in **Customers \u2192 Inquiries** and both sides receive
1873
+ email notifications.
1874
+
1875
+ **IMPORTANT for AI code generators:** the merchant OWNS the form shape. Do not
1876
+ hardcode labels, placeholders, help text, the submit button, or the success
1877
+ message. Render from the schema returned by \`contactForms.get()\` so the
1878
+ storefront reflects whatever the merchant configures \u2014 including new fields
1879
+ they add later, translations they add later, and the success message they
1880
+ write. This is the difference between "a contact form" and "THE merchant's
1881
+ contact form."
1882
+
1883
+ ### Two integration paths
1884
+
1885
+ 1. **Simple (legacy)** \u2014 pass \`{ name, email, subject, message }\` and submit.
1886
+ Works out of the box, no dashboard setup needed. Backed by a lazily-seeded
1887
+ default form keyed \`"main"\` with five built-in fields (\`name\`, \`email\`,
1888
+ \`phone\`, \`subject\`, \`message\`). Choose this only for throwaway demos.
1889
+ 2. **Flexible (recommended, default in \`npx create-brainerce-store\`)** \u2014
1890
+ merchants can configure multiple forms per store (e.g. \`main\`,
1891
+ \`newsletter\`, \`whatsapp_prechat\`), add custom fields (TEXT, TEXTAREA,
1892
+ EMAIL, PHONE, NUMBER, SELECT, MULTI_SELECT, CHECKBOX, URL, DATE), translate
1893
+ everything per locale, hide any non-essential built-in. Fetch the schema
1894
+ with \`contactForms.get(formKey, locale)\` and render dynamically.
1895
+
1896
+ ### Simple path (legacy shape)
1897
+
1898
+ \`\`\`typescript
1899
+ import type { CreateInquiryInput, CreateInquiryResponse } from 'brainerce';
1900
+
1901
+ const result = await brainerce.createInquiry({
1902
+ name: 'Jane Doe',
1903
+ email: 'jane@example.com',
1904
+ subject: 'Question about shipping',
1905
+ message: 'Hi, do you ship internationally?',
1906
+ phone: '+1-555-0100', // optional
1907
+ customerId: customer?.id, // optional \u2014 link to logged-in customer
1908
+ metadata: { page: '/contact' }, // optional
1909
+ });
1910
+ // \u2192 { id, status: 'NEW', createdAt }
1911
+ \`\`\`
1912
+
1913
+ ### Flexible path \u2014 end-to-end contract
1914
+
1915
+ **Endpoints:**
1916
+
1917
+ | Method | Path | Returns |
1918
+ | ------ | ----------------------------------------------------------------- | ------------------------------ |
1919
+ | GET | \`/stores/:storeId/contact-forms\` | \`ContactFormSummary[]\` |
1920
+ | GET | \`/stores/:storeId/contact-forms/:formKey?locale=xx\` | \`ContactFormPublic\` |
1921
+ | POST | \`/stores/:storeId/inquiries\` | \`CreateInquiryResponse\` |
1922
+
1923
+ All three are public (no API key). The SDK wraps them so you never call them
1924
+ directly \u2014 use \`brainerce.contactForms.list()\`, \`brainerce.contactForms.get()\`,
1925
+ and \`brainerce.createInquiry()\`.
1926
+
1927
+ \`\`\`typescript
1928
+ import type { ContactFormPublic } from 'brainerce';
1929
+
1930
+ // List active forms (optional \u2014 if you want a form picker or route-per-form setup)
1931
+ const forms = await brainerce.contactForms.list();
1932
+ // \u2192 [{ key: 'main', name: 'Contact us', isDefault: true }, ...]
1933
+
1934
+ // Fetch one form's schema \u2014 server pre-resolves translations for the locale
1935
+ // and strips every field the merchant marked isVisible=false.
1936
+ const form = await brainerce.contactForms.get('main', 'en');
1937
+ // \u2192 {
1938
+ // id, key, name, description?, submitButton, successMessage,
1939
+ // fields: [{ key, type, label, placeholder?, helpText?, isRequired,
1940
+ // enumValues?, validation?, defaultValue? }, ...]
1941
+ // }
1942
+
1943
+ // Submit a keyed payload. Unknown keys are stripped, required fields are
1944
+ // enforced, and every value is validated against \`validation\` server-side.
1945
+ await brainerce.createInquiry({
1946
+ formKey: 'main',
1947
+ fields: {
1948
+ email: 'jane@example.com', // built-in keys
1949
+ message: 'Hi...',
1950
+ // ...any custom keys the merchant added via the dashboard
1951
+ },
1952
+ locale: 'en', // stored on the inquiry \u2014 lets staff filter by language
1953
+ sourceMetadata: { page: '/contact' }, // arbitrary provenance (UTM, referrer, etc.)
1954
+ });
1955
+ \`\`\`
1956
+
1957
+ Both shapes go to the same POST endpoint and may be mixed; \`fields\` wins when
1958
+ both provide the same key. Unknown keys (not defined on the form schema) are
1959
+ stripped server-side.
1960
+
1961
+ ### Dynamic rendering \u2014 reference implementation
1962
+
1963
+ Render every field type the merchant can pick. Keep this as a \`<DynamicField>\`
1964
+ component so the form is fully driven by \`schema.fields\`.
1965
+
1966
+ \`\`\`tsx
1967
+ import type { ContactFormPublic, ContactFormPublicField } from 'brainerce';
1968
+
1969
+ type FieldValue = string | string[] | boolean;
1970
+
1971
+ function defaultValueFor(f: ContactFormPublicField): FieldValue {
1972
+ if (f.type === 'CHECKBOX') return false;
1973
+ if (f.type === 'MULTI_SELECT') return [];
1974
+ return f.defaultValue ?? '';
1975
+ }
1976
+
1977
+ function isEmpty(v: FieldValue): boolean {
1978
+ if (typeof v === 'string') return v.trim().length === 0;
1979
+ if (Array.isArray(v)) return v.length === 0;
1980
+ return v === false;
1981
+ }
1982
+
1983
+ function DynamicField({
1984
+ field,
1985
+ value,
1986
+ onChange,
1987
+ }: {
1988
+ field: ContactFormPublicField;
1989
+ value: FieldValue;
1990
+ onChange: (v: FieldValue) => void;
1991
+ }) {
1992
+ const id = \`contact-\${field.key}\`;
1993
+ const { minLength, maxLength, min, max, pattern } = field.validation ?? {};
1994
+ const strVal = typeof value === 'string' ? value : '';
1995
+
1996
+ // Label \u2014 USE \`field.label\`, NEVER hardcode. Falls back to the key.
1997
+ const label = (
1998
+ <label htmlFor={id} className="mb-1.5 block text-sm font-medium">
1999
+ {field.label}
2000
+ {field.isRequired && <span aria-hidden className="text-red-500"> *</span>}
2001
+ </label>
2002
+ );
2003
+ const help = field.helpText ? <p className="mt-1 text-xs opacity-70">{field.helpText}</p> : null;
2004
+
2005
+ switch (field.type) {
2006
+ case 'TEXTAREA':
2007
+ return (<div>{label}<textarea id={id} required={field.isRequired} maxLength={maxLength} minLength={minLength} rows={6} placeholder={field.placeholder} value={strVal} onChange={(e) => onChange(e.target.value)} />{help}</div>);
2008
+ case 'EMAIL':
2009
+ return (<div>{label}<input id={id} type="email" required={field.isRequired} autoComplete="email" placeholder={field.placeholder} value={strVal} onChange={(e) => onChange(e.target.value)} />{help}</div>);
2010
+ case 'PHONE':
2011
+ return (<div>{label}<input id={id} type="tel" required={field.isRequired} autoComplete="tel" placeholder={field.placeholder} value={strVal} onChange={(e) => onChange(e.target.value)} />{help}</div>);
2012
+ case 'URL':
2013
+ return (<div>{label}<input id={id} type="url" required={field.isRequired} placeholder={field.placeholder} value={strVal} onChange={(e) => onChange(e.target.value)} />{help}</div>);
2014
+ case 'NUMBER':
2015
+ return (<div>{label}<input id={id} type="number" required={field.isRequired} min={min} max={max} placeholder={field.placeholder} value={strVal} onChange={(e) => onChange(e.target.value)} />{help}</div>);
2016
+ case 'DATE':
2017
+ return (<div>{label}<input id={id} type="date" required={field.isRequired} value={strVal} onChange={(e) => onChange(e.target.value)} />{help}</div>);
2018
+ case 'SELECT':
2019
+ return (<div>{label}<select id={id} required={field.isRequired} value={strVal} onChange={(e) => onChange(e.target.value)}><option value="">\u2014</option>{field.enumValues?.map((o) => (<option key={o.value} value={o.value}>{o.label}</option>))}</select>{help}</div>);
2020
+ case 'MULTI_SELECT': {
2021
+ const arr = Array.isArray(value) ? value : [];
2022
+ return (<div>{label}<div>{field.enumValues?.map((o) => { const checked = arr.includes(o.value); return (<label key={o.value}><input type="checkbox" checked={checked} onChange={(e) => onChange(e.target.checked ? [...arr, o.value] : arr.filter((v) => v !== o.value))} /><span>{o.label}</span></label>); })}</div>{help}</div>);
2023
+ }
2024
+ case 'CHECKBOX':
2025
+ return (<div><label htmlFor={id}><input id={id} type="checkbox" required={field.isRequired} checked={value === true} onChange={(e) => onChange(e.target.checked)} /><span>{field.label}</span></label>{help}</div>);
2026
+ case 'TEXT':
2027
+ default:
2028
+ return (<div>{label}<input id={id} type="text" required={field.isRequired} maxLength={maxLength} minLength={minLength} pattern={pattern} placeholder={field.placeholder} value={strVal} onChange={(e) => onChange(e.target.value)} />{help}</div>);
2029
+ }
2030
+ }
2031
+
2032
+ export function ContactPage() {
2033
+ const [schema, setSchema] = useState<ContactFormPublic | null>(null);
2034
+ const [values, setValues] = useState<Record<string, FieldValue>>({});
2035
+ const [honeypot, setHoneypot] = useState('');
2036
+ const [sent, setSent] = useState(false);
2037
+ const [loading, setLoading] = useState(false);
2038
+
2039
+ // Read the current locale from the <html lang> attribute (or your own i18n context).
2040
+ const locale = typeof document !== 'undefined' ? document.documentElement.lang || undefined : undefined;
2041
+
2042
+ useEffect(() => {
2043
+ brainerce.contactForms.get('main', locale).then((form) => {
2044
+ setSchema(form);
2045
+ const initial: Record<string, FieldValue> = {};
2046
+ for (const f of form.fields) initial[f.key] = defaultValueFor(f);
2047
+ setValues(initial);
2048
+ });
2049
+ }, [locale]);
2050
+
2051
+ if (!schema) return null;
2052
+
2053
+ const onSubmit = async (e: React.FormEvent) => {
2054
+ e.preventDefault();
2055
+ if (loading) return;
2056
+ if (honeypot.trim().length > 0) { setSent(true); return; } // bot \u2192 silent success
2057
+
2058
+ setLoading(true);
2059
+ try {
2060
+ const payload: Record<string, unknown> = {};
2061
+ for (const f of schema.fields) {
2062
+ const raw = values[f.key];
2063
+ if (isEmpty(raw)) continue;
2064
+ payload[f.key] = typeof raw === 'string' ? raw.trim() : raw;
2065
+ }
2066
+ await brainerce.createInquiry({ formKey: schema.key, fields: payload, locale });
2067
+ setSent(true);
2068
+ } finally {
2069
+ setLoading(false);
2070
+ }
2071
+ };
2072
+
2073
+ if (sent) {
2074
+ // RENDER THE MERCHANT'S success message \u2014 do not hardcode.
2075
+ return <div>{schema.successMessage}</div>;
2076
+ }
2077
+
2078
+ return (
2079
+ <form onSubmit={onSubmit} noValidate>
2080
+ <h1>{schema.name}</h1>
2081
+ {schema.description && <p>{schema.description}</p>}
2082
+
2083
+ {/* Honeypot \u2014 must be visually hidden from humans, not from bots */}
2084
+ <div aria-hidden style={{ position: 'absolute', left: '-10000px', width: 0, height: 0, overflow: 'hidden' }}>
2085
+ <label htmlFor="contact-honeypot">Leave this field empty</label>
2086
+ <input id="contact-honeypot" type="text" tabIndex={-1} autoComplete="off"
2087
+ value={honeypot} onChange={(e) => setHoneypot(e.target.value)} />
2088
+ </div>
2089
+
2090
+ {schema.fields.map((field) => (
2091
+ <DynamicField key={field.key} field={field}
2092
+ value={values[field.key] ?? defaultValueFor(field)}
2093
+ onChange={(v) => setValues((p) => ({ ...p, [field.key]: v }))} />
2094
+ ))}
2095
+
2096
+ <button type="submit" disabled={loading}>
2097
+ {loading ? '\u2026' : schema.submitButton}
2098
+ </button>
2099
+ </form>
2100
+ );
2101
+ }
2102
+ \`\`\`
2103
+
2104
+ ### Rules
2105
+
2106
+ - **Rate limit:** 3 submissions / 60s per IP \u2014 show a friendly "try again later" message on HTTP 429.
2107
+ - **Honeypot:** always render a hidden field named \`honeypot\` and **never send** it. Bots fill every input; the server rejects submissions carrying a non-empty \`honeypot\`.
2108
+ - **Built-in keys:** \`name\`, \`email\`, \`phone\`, \`subject\`, \`message\` always exist on the default form; the legacy \`createInquiry\` shape keeps working forever.
2109
+ - **Max values:** each field value is capped at 10 000 chars server-side. Validate client-side before submitting using \`field.validation.maxLength\`.
2110
+ - **Required fields:** respect \`field.isRequired\`. The server validates too, but show \`required\` on the input for browser-level UX.
2111
+ - **Validation:** when \`field.validation.pattern\` is present, pass it as the input's \`pattern\` attribute; the server also enforces it. Likewise \`minLength\`/\`maxLength\`/\`min\`/\`max\`.
2112
+ - **Enum values:** SELECT and MULTI_SELECT always return \`enumValues\` (non-empty array). Render from \`enumValues\`, never a hardcoded list.
2113
+ - **Visibility:** the server strips fields with \`isVisible=false\`, so \`schema.fields\` only contains things to render.
2114
+ - **Origin check:** the endpoint validates \`Origin\` against the store's allowed origins. Test from your real storefront URL, not \`file://\` or localhost unless the merchant added it to allowed origins.
2115
+ - **Locale handling:** always pass \`locale\` to \`contactForms.get()\` and to \`createInquiry()\`. The staff inbox filters inquiries by language. Omit to fall back to the store's default language.
2116
+ - **Success message:** render \`schema.successMessage\` as-is. (Variable interpolation like \`{{customerName}}\` is not yet wired; any such placeholders currently render literally. Safe to use plain text.)
2117
+ - **Caching:** the schema GET is safe to cache per \`{storeId, formKey, locale}\`. 60 s feels live without hammering the API.
2118
+
2119
+ ### Multiple forms
2120
+
2121
+ If the merchant set up more than one form (e.g. a \`main\` form on \`/contact\`
2122
+ and a \`newsletter\` form embedded in the footer), render each form from its
2123
+ own \`contactForms.get(key, locale)\` call. The \`formKey\` you pass to
2124
+ \`createInquiry\` must match.`;
2125
+ }
1867
2126
  function getSectionByTopic(topic, connectionId, currency) {
1868
2127
  const cid = connectionId || "vc_YOUR_CONNECTION_ID";
1869
2128
  const cur = currency || "USD";
@@ -1902,6 +2161,8 @@ function getSectionByTopic(topic, connectionId, currency) {
1902
2161
  return getTypeQuickReference();
1903
2162
  case "admin":
1904
2163
  return getAdminApiSection();
2164
+ case "inquiries":
2165
+ return getContactInquiriesSection();
1905
2166
  case "all":
1906
2167
  return [
1907
2168
  "# Brainerce SDK \u2014 full topic dump",
@@ -1978,10 +2239,14 @@ function getSectionByTopic(topic, connectionId, currency) {
1978
2239
  "",
1979
2240
  "---",
1980
2241
  "",
1981
- getAdminApiSection()
2242
+ getAdminApiSection(),
2243
+ "",
2244
+ "---",
2245
+ "",
2246
+ getContactInquiriesSection()
1982
2247
  ].join("\n");
1983
2248
  default:
1984
- return `Unknown topic: "${topic}". Available topics: setup, products, cart, checkout, checkout-custom-fields, payment, auth, order-confirmation, inventory, discounts, recommendations, product-customization-fields, tax, i18n, critical-rules, type-reference, admin, all`;
2249
+ return `Unknown topic: "${topic}". Available topics: setup, products, cart, checkout, checkout-custom-fields, payment, auth, order-confirmation, inventory, discounts, recommendations, product-customization-fields, tax, i18n, critical-rules, type-reference, admin, inquiries, all`;
1985
2250
  }
1986
2251
  }
1987
2252
 
@@ -2007,6 +2272,7 @@ var GET_SDK_DOCS_SCHEMA = {
2007
2272
  "type-reference",
2008
2273
  "i18n",
2009
2274
  "admin",
2275
+ "inquiries",
2010
2276
  "all"
2011
2277
  ]).describe("The SDK documentation topic to retrieve"),
2012
2278
  connectionId: import_zod.z.string().optional().describe("Vibe-coded connection ID (starts with vc_). Used to personalize setup code."),
@@ -2667,6 +2933,102 @@ interface CartBundleOffer {
2667
2933
  requiresVariantSelection: boolean;
2668
2934
  lockedVariant?: { id: string; name?: string };
2669
2935
  }`;
2936
+ var INQUIRIES_TYPES = `// ---- Contact Inquiries & Forms ----
2937
+
2938
+ // Two shapes \u2014 legacy and flexible. The two may be mixed; \`fields\` wins on key collision.
2939
+ interface CreateInquiryInput {
2940
+ // Legacy shape (still supported forever, backed by default "main" form)
2941
+ name?: string; // max 120 chars (if provided)
2942
+ email?: string; // must be valid email if provided
2943
+ subject?: string; // max 200 chars
2944
+ message?: string; // max 10000 chars
2945
+ phone?: string;
2946
+
2947
+ // Flexible shape
2948
+ formKey?: string; // defaults to "main"; merchant-defined keys e.g. "newsletter"
2949
+ fields?: Record<string, unknown>; // bag of values keyed by field key (built-in or custom)
2950
+ locale?: string; // e.g. "en", "he" \u2014 stored on the inquiry
2951
+ sourceMetadata?: Record<string, unknown>; // arbitrary context (e.g. { page: '/contact', campaign: 'fall-2026' })
2952
+
2953
+ // Shared
2954
+ customerId?: string; // link to logged-in customer
2955
+ metadata?: Record<string, unknown>; // deprecated alias of sourceMetadata
2956
+ }
2957
+
2958
+ interface CreateInquiryResponse {
2959
+ id: string;
2960
+ status: 'NEW';
2961
+ createdAt: string; // ISO datetime
2962
+ }
2963
+
2964
+ // ---- Form schema (for dynamic rendering) ----
2965
+
2966
+ type ContactFormFieldType =
2967
+ | 'TEXT' | 'TEXTAREA' | 'EMAIL' | 'PHONE' | 'NUMBER'
2968
+ | 'SELECT' | 'MULTI_SELECT' | 'CHECKBOX' | 'URL' | 'DATE';
2969
+
2970
+ interface ContactFormFieldValidation {
2971
+ minLength?: number;
2972
+ maxLength?: number;
2973
+ min?: number;
2974
+ max?: number;
2975
+ pattern?: string; // regex string
2976
+ patternMessage?: string;
2977
+ }
2978
+
2979
+ interface ContactFormPublicField {
2980
+ key: string; // stable identifier, e.g. "email", "company"
2981
+ type: ContactFormFieldType;
2982
+ label: string; // already localized for the requested locale
2983
+ placeholder?: string; // already localized
2984
+ helpText?: string; // already localized
2985
+ isRequired: boolean;
2986
+ enumValues?: { value: string; label: string }[]; // present (non-empty) for SELECT / MULTI_SELECT
2987
+ validation?: ContactFormFieldValidation;
2988
+ defaultValue?: string;
2989
+ }
2990
+
2991
+ interface ContactFormPublic {
2992
+ id: string;
2993
+ key: string; // e.g. "main", "newsletter"
2994
+ name: string; // already localized \u2014 use as form heading
2995
+ description?: string; // already localized \u2014 use as subtitle
2996
+ submitButton: string; // already localized \u2014 use as submit label
2997
+ successMessage: string; // already localized \u2014 render after submit succeeds
2998
+ fields: ContactFormPublicField[]; // in display order; hidden fields already filtered out
2999
+ }
3000
+
3001
+ interface ContactFormSummary {
3002
+ key: string;
3003
+ name: string;
3004
+ isDefault: boolean;
3005
+ }
3006
+
3007
+ // Field-type \u2192 HTML mapping for dynamic rendering
3008
+ // ------------------------------------------------------------------
3009
+ // TEXT \u2192 <input type="text" ... pattern?={validation.pattern}>
3010
+ // TEXTAREA \u2192 <textarea rows={6} ...>
3011
+ // EMAIL \u2192 <input type="email" autoComplete="email" ...>
3012
+ // PHONE \u2192 <input type="tel" autoComplete="tel" ...>
3013
+ // NUMBER \u2192 <input type="number" min={validation.min} max={validation.max}>
3014
+ // URL \u2192 <input type="url" ...>
3015
+ // DATE \u2192 <input type="date" ...> (value is ISO yyyy-MM-dd)
3016
+ // SELECT \u2192 <select>{enumValues.map(...)}</select> \u2014 always rendered from enumValues
3017
+ // MULTI_SELECT \u2192 multiple <input type="checkbox">, value is string[]
3018
+ // CHECKBOX \u2192 single <input type="checkbox">, value is boolean
3019
+ // ------------------------------------------------------------------
3020
+
3021
+ // SDK methods
3022
+ // await brainerce.createInquiry(input) \u2192 POST /stores/{storeId}/inquiries
3023
+ // await brainerce.contactForms.list() \u2192 GET /stores/{storeId}/contact-forms
3024
+ // await brainerce.contactForms.get(key?, locale?) \u2192 GET /stores/{storeId}/contact-forms/{key}?locale={locale}
3025
+ //
3026
+ // Rules
3027
+ // - Rate limit: 3 submissions / 60s per IP \u2014 handle 429 responses gracefully
3028
+ // - Honeypot: always render an invisible field named \`honeypot\` and never send it
3029
+ // - Always pass \`locale\` \u2014 inbox filters inquiries by language, and schema labels come back translated
3030
+ // - Render \`schema.name\` / \`description\` / \`submitButton\` / \`successMessage\` directly \u2014 do NOT hardcode copy
3031
+ // - Unknown field keys are stripped server-side \u2014 safe to send extras during dev`;
2670
3032
  var TYPES_BY_DOMAIN = {
2671
3033
  products: PRODUCTS_TYPES,
2672
3034
  cart: CART_TYPES,
@@ -2674,7 +3036,8 @@ var TYPES_BY_DOMAIN = {
2674
3036
  orders: ORDERS_TYPES,
2675
3037
  customers: CUSTOMERS_TYPES,
2676
3038
  payments: PAYMENTS_TYPES,
2677
- helpers: HELPERS_TYPES
3039
+ helpers: HELPERS_TYPES,
3040
+ inquiries: INQUIRIES_TYPES
2678
3041
  };
2679
3042
  function getTypesByDomain(domain) {
2680
3043
  if (domain === "all") {
@@ -2695,7 +3058,17 @@ var AVAILABLE_DOMAINS = Object.keys(TYPES_BY_DOMAIN);
2695
3058
  var GET_TYPE_DEFINITIONS_NAME = "get-type-definitions";
2696
3059
  var GET_TYPE_DEFINITIONS_DESCRIPTION = "Get TypeScript type definitions from the Brainerce SDK, segmented by domain. Use this when you need to understand the exact shape of objects like Product, Cart, Checkout, Order, etc.";
2697
3060
  var GET_TYPE_DEFINITIONS_SCHEMA = {
2698
- domain: import_zod2.z.enum(["products", "cart", "checkout", "orders", "customers", "payments", "helpers", "all"]).describe(
3061
+ domain: import_zod2.z.enum([
3062
+ "products",
3063
+ "cart",
3064
+ "checkout",
3065
+ "orders",
3066
+ "customers",
3067
+ "payments",
3068
+ "helpers",
3069
+ "inquiries",
3070
+ "all"
3071
+ ]).describe(
2699
3072
  'The domain of types to retrieve. Use "helpers" for helper function signatures and common types like StoreInfo, PaginatedResponse.'
2700
3073
  )
2701
3074
  };