@modainteract/moda-interact-shared 0.14.2 → 1.0.1

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.
@@ -275,6 +275,60 @@ function canonicaliseLanguageTag(value) {
275
275
  throw invalidValue("BCP-47 language tag", value);
276
276
  }
277
277
  }
278
+ var MODA_SUPPORTED_LANGUAGE_TAGS = [
279
+ "zh-Hans",
280
+ "zh-Hant",
281
+ "cs",
282
+ "da",
283
+ "nl",
284
+ "en",
285
+ "fi",
286
+ "fr",
287
+ "de",
288
+ "it",
289
+ "ja",
290
+ "ko",
291
+ "nb",
292
+ "pl",
293
+ "pt-BR",
294
+ "pt-PT",
295
+ "es",
296
+ "sv",
297
+ "th",
298
+ "tr"
299
+ ];
300
+ var ModaSupportedLanguageTagSchema = z.enum(
301
+ MODA_SUPPORTED_LANGUAGE_TAGS
302
+ );
303
+ function resolveModaConfigurationLocale(input) {
304
+ if (input == null || !input.trim()) return "en";
305
+ let canonicalTag;
306
+ try {
307
+ canonicalTag = canonicaliseLanguageTag(input);
308
+ } catch {
309
+ return "en";
310
+ }
311
+ if (ModaSupportedLanguageTagSchema.safeParse(canonicalTag).success) {
312
+ return canonicalTag;
313
+ }
314
+ const locale = new Intl.Locale(canonicalTag);
315
+ if (locale.language === "pt") {
316
+ if (locale.region === "BR") return "pt-BR";
317
+ if (locale.region === "PT") return "pt-PT";
318
+ return "en";
319
+ }
320
+ if (locale.language === "zh") {
321
+ if (locale.script === "Hans") return "zh-Hans";
322
+ if (locale.script === "Hant") return "zh-Hant";
323
+ if (locale.region === "CN" || locale.region === "SG") return "zh-Hans";
324
+ if (["TW", "HK", "MO"].includes(locale.region ?? "")) return "zh-Hant";
325
+ return "en";
326
+ }
327
+ const primaryLanguageMatches = MODA_SUPPORTED_LANGUAGE_TAGS.filter(
328
+ (tag) => tag.split("-")[0] === locale.language
329
+ );
330
+ return primaryLanguageMatches.length === 1 ? primaryLanguageMatches[0] : "en";
331
+ }
278
332
  function normalizeCountryCode(value) {
279
333
  if (typeof value !== "string") throw invalidValue("ISO 3166-1 alpha-2 country code", value);
280
334
  const code = value.trim().toUpperCase();
@@ -445,6 +499,9 @@ function createInternationalizationRuntime({
445
499
  export {
446
500
  LanguageSourceSchema,
447
501
  canonicaliseLanguageTag,
502
+ MODA_SUPPORTED_LANGUAGE_TAGS,
503
+ ModaSupportedLanguageTagSchema,
504
+ resolveModaConfigurationLocale,
448
505
  normalizeCountryCode,
449
506
  normalizeCurrencyCode,
450
507
  normalizeTimeZone,
@@ -458,4 +515,4 @@ export {
458
515
  validateIcuCatalogue,
459
516
  createInternationalizationRuntime
460
517
  };
461
- //# sourceMappingURL=chunk-B6Y3QQLI.js.map
518
+ //# sourceMappingURL=chunk-4KSODB2R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internationalization.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { IntlMessageFormat, type PrimitiveType } from \"intl-messageformat\";\n\nconst ISO_COUNTRY_CODE_PATTERN = /^[A-Z]{2}$/;\nconst ISO_CURRENCY_CODE_PATTERN = /^[A-Z]{3}$/;\nconst ISO_3166_ALPHA_2_CODES = new Set([\n \"AF\", \"AL\", \"DZ\", \"AS\", \"AD\", \"AO\", \"AI\", \"AQ\", \"AG\", \"AR\", \"AM\", \"AW\", \"AU\", \"AX\", \"AT\", \"AZ\",\n \"BS\", \"BH\", \"BD\", \"BB\", \"BY\", \"BE\", \"BZ\", \"BJ\", \"BM\", \"BT\", \"BO\", \"BQ\", \"BA\", \"BW\", \"BV\", \"BR\", \"IO\", \"BN\", \"BG\", \"BF\", \"BI\", \"CV\", \"KH\", \"CM\", \"CA\", \"KY\", \"CF\", \"TD\", \"CL\", \"CN\", \"CX\", \"CC\", \"CO\", \"KM\", \"CG\", \"CD\", \"CK\", \"CR\", \"CI\", \"HR\", \"CU\", \"CW\", \"CY\", \"CZ\", \"DK\", \"DJ\", \"DM\", \"DO\", \"EC\", \"EG\", \"SV\", \"GQ\", \"ER\", \"EE\", \"SZ\", \"ET\", \"FK\", \"FO\", \"FJ\", \"FI\", \"FR\", \"GF\", \"PF\", \"TF\", \"GA\", \"GM\", \"GE\", \"DE\", \"GH\", \"GI\", \"GR\", \"GL\", \"GD\", \"GP\", \"GU\", \"GT\", \"GG\", \"GN\", \"GW\", \"GY\", \"HT\", \"HM\", \"VA\", \"HN\", \"HK\", \"HU\", \"IS\", \"IN\", \"ID\", \"IR\", \"IQ\", \"IE\", \"IM\", \"IL\", \"IT\", \"JM\", \"JP\", \"JE\", \"JO\", \"KZ\", \"KE\", \"KI\", \"KP\", \"KR\", \"KW\", \"KG\", \"LA\", \"LV\", \"LB\", \"LS\", \"LR\", \"LY\", \"LI\", \"LT\", \"LU\", \"MO\", \"MG\", \"MW\", \"MY\", \"MV\", \"ML\", \"MT\", \"MH\", \"MQ\", \"MR\", \"MU\", \"YT\", \"MX\", \"FM\", \"MD\", \"MC\", \"MN\", \"ME\", \"MS\", \"MA\", \"MZ\", \"MM\", \"NA\", \"NR\", \"NP\", \"NL\", \"NC\", \"NZ\", \"NI\", \"NE\", \"NG\", \"NU\", \"NF\", \"MK\", \"MP\", \"NO\", \"OM\", \"PK\", \"PW\", \"PS\", \"PA\", \"PG\", \"PY\", \"PE\", \"PH\", \"PN\", \"PL\", \"PT\", \"PR\", \"QA\", \"RE\", \"RO\", \"RU\", \"RW\", \"BL\", \"SH\", \"KN\", \"LC\", \"MF\", \"PM\", \"VC\", \"WS\", \"SM\", \"ST\", \"SA\", \"SN\", \"RS\", \"SC\", \"SL\", \"SG\", \"SX\", \"SK\", \"SI\", \"SB\", \"SO\", \"ZA\", \"GS\", \"SS\", \"ES\", \"LK\", \"SD\", \"SR\", \"SJ\", \"SE\", \"CH\", \"SY\", \"TW\", \"TJ\", \"TZ\", \"TH\", \"TL\", \"TG\", \"TK\", \"TO\", \"TT\", \"TN\", \"TR\", \"TM\", \"TC\", \"TV\", \"UG\", \"UA\", \"AE\", \"GB\", \"US\", \"UM\", \"UY\", \"UZ\", \"VU\", \"VE\", \"VN\", \"VG\", \"VI\", \"WF\", \"EH\", \"YE\", \"ZM\", \"ZW\",\n]);\nconst supportedCurrencies = new Set(Intl.supportedValuesOf(\"currency\"));\n\nexport const LanguageSourceSchema = z.enum([\n \"customer-explicit\",\n \"detected\",\n \"shopify\",\n \"merchant-default\",\n \"platform-default\",\n]);\n\nexport type LanguageSource = z.infer<typeof LanguageSourceSchema>;\n\nfunction invalidValue(kind: string, value: string): TypeError {\n return new TypeError(`Invalid ${kind}: ${value}`);\n}\n\nexport function canonicaliseLanguageTag(value: string): string {\n if (typeof value !== \"string\" || !value.trim()) {\n throw invalidValue(\"BCP-47 language tag\", value);\n }\n\n try {\n return new Intl.Locale(value.trim()).toString();\n } catch {\n throw invalidValue(\"BCP-47 language tag\", value);\n }\n}\n\nexport const MODA_SUPPORTED_LANGUAGE_TAGS = [\n \"zh-Hans\",\n \"zh-Hant\",\n \"cs\",\n \"da\",\n \"nl\",\n \"en\",\n \"fi\",\n \"fr\",\n \"de\",\n \"it\",\n \"ja\",\n \"ko\",\n \"nb\",\n \"pl\",\n \"pt-BR\",\n \"pt-PT\",\n \"es\",\n \"sv\",\n \"th\",\n \"tr\",\n] as const;\n\nexport const ModaSupportedLanguageTagSchema = z.enum(\n MODA_SUPPORTED_LANGUAGE_TAGS,\n);\n\nexport type ModaSupportedLanguageTag =\n z.infer<typeof ModaSupportedLanguageTagSchema>;\n\nexport function resolveModaConfigurationLocale(\n input: string | null | undefined,\n): ModaSupportedLanguageTag {\n if (input == null || !input.trim()) return \"en\";\n\n let canonicalTag: string;\n try {\n canonicalTag = canonicaliseLanguageTag(input);\n } catch {\n return \"en\";\n }\n\n if (ModaSupportedLanguageTagSchema.safeParse(canonicalTag).success) {\n return canonicalTag as ModaSupportedLanguageTag;\n }\n\n const locale = new Intl.Locale(canonicalTag);\n if (locale.language === \"pt\") {\n if (locale.region === \"BR\") return \"pt-BR\";\n if (locale.region === \"PT\") return \"pt-PT\";\n return \"en\";\n }\n\n if (locale.language === \"zh\") {\n if (locale.script === \"Hans\") return \"zh-Hans\";\n if (locale.script === \"Hant\") return \"zh-Hant\";\n if (locale.region === \"CN\" || locale.region === \"SG\") return \"zh-Hans\";\n if ([\"TW\", \"HK\", \"MO\"].includes(locale.region ?? \"\")) return \"zh-Hant\";\n return \"en\";\n }\n\n const primaryLanguageMatches = MODA_SUPPORTED_LANGUAGE_TAGS.filter(\n (tag) => tag.split(\"-\")[0] === locale.language,\n );\n return primaryLanguageMatches.length === 1\n ? primaryLanguageMatches[0]\n : \"en\";\n}\n\nexport function normalizeCountryCode(value: string): string {\n if (typeof value !== \"string\") throw invalidValue(\"ISO 3166-1 alpha-2 country code\", value);\n const code = value.trim().toUpperCase();\n if (!ISO_COUNTRY_CODE_PATTERN.test(code)) {\n throw invalidValue(\"ISO 3166-1 alpha-2 country code\", value);\n }\n\n if (!ISO_3166_ALPHA_2_CODES.has(code)) {\n throw invalidValue(\"ISO 3166-1 alpha-2 country code\", value);\n }\n\n return code;\n}\n\nexport function normalizeCurrencyCode(value: string): string {\n if (typeof value !== \"string\") throw invalidValue(\"ISO 4217 currency code\", value);\n const code = value.trim().toUpperCase();\n if (!ISO_CURRENCY_CODE_PATTERN.test(code) || !supportedCurrencies.has(code)) {\n throw invalidValue(\"ISO 4217 currency code\", value);\n }\n return code;\n}\n\nexport function normalizeTimeZone(value: string): string {\n if (typeof value !== \"string\" || !value.trim()) {\n throw invalidValue(\"IANA time-zone identifier\", value);\n }\n\n try {\n return new Intl.DateTimeFormat(\"en\", { timeZone: value.trim() }).resolvedOptions().timeZone;\n } catch {\n throw invalidValue(\"IANA time-zone identifier\", value);\n }\n}\n\nexport const LanguageTagSchema = z.string().trim().transform(canonicaliseLanguageTag);\nexport const CountryCodeSchema = z.string().trim().transform(normalizeCountryCode);\nexport const CurrencyCodeSchema = z.string().trim().transform(normalizeCurrencyCode);\nexport const TimeZoneIdSchema = z.string().trim().transform(normalizeTimeZone);\n\nexport const InternationalContextSchema = z\n .object({\n languageTag: LanguageTagSchema.nullable(),\n languageSource: LanguageSourceSchema.nullable(),\n countryCode: CountryCodeSchema.nullable(),\n currencyCode: CurrencyCodeSchema.nullable(),\n timeZone: TimeZoneIdSchema.nullable(),\n })\n .strict();\n\nexport type LanguageTag = z.infer<typeof LanguageTagSchema>;\nexport type CountryCode = z.infer<typeof CountryCodeSchema>;\nexport type CurrencyCode = z.infer<typeof CurrencyCodeSchema>;\nexport type TimeZoneId = z.infer<typeof TimeZoneIdSchema>;\nexport type InternationalContext = z.infer<typeof InternationalContextSchema>;\n\nexport function mergeInternationalContext(\n base: InternationalContext,\n override: InternationalContext,\n): InternationalContext {\n return {\n languageTag: override.languageTag ?? base.languageTag,\n languageSource: override.languageSource ?? base.languageSource,\n countryCode: override.countryCode ?? base.countryCode,\n currencyCode: override.currencyCode ?? base.currencyCode,\n timeZone: override.timeZone ?? base.timeZone,\n };\n}\n\nexport type IcuMessageCatalogue = Readonly<Record<string, string>>;\nexport type IcuMessageValues = Record<string, PrimitiveType | Date | null | undefined>;\n\nexport interface CatalogueValidationOptions {\n locale?: string;\n}\n\nexport interface InternationalizationRuntimeOptions {\n locale: string;\n catalogue: IcuMessageCatalogue;\n fallbackCatalogue?: IcuMessageCatalogue;\n timeZone?: string;\n cacheSize?: number;\n}\n\nexport interface InternationalizationRuntime {\n locale: string;\n timeZone?: string;\n direction: \"ltr\" | \"rtl\";\n formatMessage(message: string, values?: IcuMessageValues): string;\n t(key: string, values?: IcuMessageValues): string;\n formatNumber(value: number, options?: Intl.NumberFormatOptions): string;\n formatPercent(value: number, options?: Intl.NumberFormatOptions): string;\n formatDateTime(value: Date | string | number, options?: Intl.DateTimeFormatOptions): string;\n formatMoney(value: number, currencyCode: string, options?: Intl.NumberFormatOptions): string;\n}\n\nconst DEFAULT_ICU_CACHE_SIZE = 256;\n\nfunction assertPositiveInteger(value: number, name: string): number {\n if (!Number.isInteger(value) || value < 1) {\n throw new RangeError(`${name} must be a positive integer`);\n }\n return value;\n}\n\nclass BoundedMessageCache extends Map<string, IntlMessageFormat> {\n constructor(private readonly maxSize: number) {\n super();\n }\n\n override get(key: string): IntlMessageFormat | undefined {\n const value = super.get(key);\n if (value) {\n super.delete(key);\n super.set(key, value);\n }\n return value;\n }\n\n override set(key: string, value: IntlMessageFormat): this {\n super.delete(key);\n super.set(key, value);\n while (this.size > this.maxSize) this.delete(this.keys().next().value as string);\n return this;\n }\n}\n\nfunction createMessageCache(maxSize: number): BoundedMessageCache {\n return new BoundedMessageCache(maxSize);\n}\n\nexport function resolveLocaleDirection(locale: string): \"ltr\" | \"rtl\" {\n const canonicalLocale = canonicaliseLanguageTag(locale);\n const localeWithTextInfo = new Intl.Locale(canonicalLocale) as Intl.Locale & {\n getTextInfo?: () => { direction?: \"ltr\" | \"rtl\" };\n textInfo?: { direction?: \"ltr\" | \"rtl\" };\n };\n const direction = localeWithTextInfo.getTextInfo?.()?.direction ?? localeWithTextInfo.textInfo?.direction;\n if (direction === \"rtl\") return \"rtl\";\n if (direction === \"ltr\") return \"ltr\";\n\n const rtlLanguageOrScript = /^(ar|fa|he|ur)(?:-|$)|-(?:Arab|Hebr|Nkoo|Adlm)(?:-|$)/i;\n return rtlLanguageOrScript.test(canonicalLocale) ? \"rtl\" : \"ltr\";\n}\n\nexport function validateIcuCatalogue(\n catalogue: IcuMessageCatalogue,\n requiredKeys: readonly string[],\n options: CatalogueValidationOptions = {},\n): void {\n const locale = options.locale ? canonicaliseLanguageTag(options.locale) : \"en\";\n const missingKeys = requiredKeys.filter((key) => typeof catalogue[key] !== \"string\");\n if (missingKeys.length > 0) {\n throw new Error(`Catalogue is missing required keys: ${missingKeys.join(\", \")}`);\n }\n\n for (const key of requiredKeys) {\n try {\n new IntlMessageFormat(catalogue[key], locale);\n } catch (error) {\n throw new Error(`Invalid ICU message for key ${key}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n\nexport function createInternationalizationRuntime({\n locale,\n catalogue,\n fallbackCatalogue,\n timeZone,\n cacheSize = DEFAULT_ICU_CACHE_SIZE,\n}: InternationalizationRuntimeOptions): InternationalizationRuntime {\n const resolvedLocale = canonicaliseLanguageTag(locale);\n const resolvedTimeZone = timeZone === undefined ? undefined : normalizeTimeZone(timeZone);\n const maxCacheSize = assertPositiveInteger(cacheSize, \"cacheSize\");\n const messageCache = createMessageCache(maxCacheSize);\n\n const compile = (message: string): IntlMessageFormat => {\n const cached = messageCache.get(message);\n if (cached) {\n messageCache.delete(message);\n messageCache.set(message, cached);\n return cached;\n }\n const compiled = new IntlMessageFormat(message, resolvedLocale);\n messageCache.set(message, compiled);\n return compiled;\n };\n\n const formatMessage = (message: string, values: IcuMessageValues = {}): string => {\n const formatted = compile(message).format(values);\n return Array.isArray(formatted) ? formatted.join(\"\") : String(formatted);\n };\n\n const t = (key: string, values: IcuMessageValues = {}): string => {\n const message = catalogue[key] ?? fallbackCatalogue?.[key];\n if (message === undefined) throw new Error(`Missing ICU catalogue key: ${key}`);\n return formatMessage(message, values);\n };\n\n const formatNumber = (value: number, options: Intl.NumberFormatOptions = {}): string =>\n new Intl.NumberFormat(resolvedLocale, options).format(value);\n\n const formatPercent = (value: number, options: Intl.NumberFormatOptions = {}): string => {\n const { style: _style, ...presentationOptions } = options;\n return formatNumber(value, { ...presentationOptions, style: \"percent\" });\n };\n\n const formatDateTime = (value: Date | string | number, options: Intl.DateTimeFormatOptions = {}): string => {\n const { timeZone: optionTimeZone, ...presentationOptions } = options;\n return new Intl.DateTimeFormat(resolvedLocale, {\n ...presentationOptions,\n timeZone: resolvedTimeZone ?? optionTimeZone,\n }).format(new Date(value));\n };\n\n const formatMoney = (value: number, currencyCode: string, options: Intl.NumberFormatOptions = {}): string => {\n const { style: _style, currency: _currency, ...presentationOptions } = options;\n return formatNumber(value, {\n ...presentationOptions,\n style: \"currency\",\n currency: normalizeCurrencyCode(currencyCode),\n });\n };\n\n return {\n locale: resolvedLocale,\n timeZone: resolvedTimeZone,\n direction: resolveLocaleDirection(resolvedLocale),\n formatMessage,\n t,\n formatNumber,\n formatPercent,\n formatDateTime,\n formatMoney,\n };\n}"],"mappings":";AAAA,SAAS,SAAS;AAClB,SAAS,yBAA6C;AAEtD,IAAM,2BAA2B;AACjC,IAAM,4BAA4B;AAClC,IAAM,yBAAyB,oBAAI,IAAI;AAAA,EACrC;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AACl3C,CAAC;AACD,IAAM,sBAAsB,IAAI,IAAI,KAAK,kBAAkB,UAAU,CAAC;AAE/D,IAAM,uBAAuB,EAAE,KAAK;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAID,SAAS,aAAa,MAAc,OAA0B;AAC5D,SAAO,IAAI,UAAU,WAAW,IAAI,KAAK,KAAK,EAAE;AAClD;AAEO,SAAS,wBAAwB,OAAuB;AAC7D,MAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,GAAG;AAC9C,UAAM,aAAa,uBAAuB,KAAK;AAAA,EACjD;AAEA,MAAI;AACF,WAAO,IAAI,KAAK,OAAO,MAAM,KAAK,CAAC,EAAE,SAAS;AAAA,EAChD,QAAQ;AACN,UAAM,aAAa,uBAAuB,KAAK;AAAA,EACjD;AACF;AAEO,IAAM,+BAA+B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,iCAAiC,EAAE;AAAA,EAC9C;AACF;AAKO,SAAS,+BACd,OAC0B;AAC1B,MAAI,SAAS,QAAQ,CAAC,MAAM,KAAK,EAAG,QAAO;AAE3C,MAAI;AACJ,MAAI;AACF,mBAAe,wBAAwB,KAAK;AAAA,EAC9C,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,MAAI,+BAA+B,UAAU,YAAY,EAAE,SAAS;AAClE,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,IAAI,KAAK,OAAO,YAAY;AAC3C,MAAI,OAAO,aAAa,MAAM;AAC5B,QAAI,OAAO,WAAW,KAAM,QAAO;AACnC,QAAI,OAAO,WAAW,KAAM,QAAO;AACnC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,aAAa,MAAM;AAC5B,QAAI,OAAO,WAAW,OAAQ,QAAO;AACrC,QAAI,OAAO,WAAW,OAAQ,QAAO;AACrC,QAAI,OAAO,WAAW,QAAQ,OAAO,WAAW,KAAM,QAAO;AAC7D,QAAI,CAAC,MAAM,MAAM,IAAI,EAAE,SAAS,OAAO,UAAU,EAAE,EAAG,QAAO;AAC7D,WAAO;AAAA,EACT;AAEA,QAAM,yBAAyB,6BAA6B;AAAA,IAC1D,CAAC,QAAQ,IAAI,MAAM,GAAG,EAAE,CAAC,MAAM,OAAO;AAAA,EACxC;AACA,SAAO,uBAAuB,WAAW,IACrC,uBAAuB,CAAC,IACxB;AACN;AAEO,SAAS,qBAAqB,OAAuB;AAC1D,MAAI,OAAO,UAAU,SAAU,OAAM,aAAa,mCAAmC,KAAK;AAC1F,QAAM,OAAO,MAAM,KAAK,EAAE,YAAY;AACtC,MAAI,CAAC,yBAAyB,KAAK,IAAI,GAAG;AACxC,UAAM,aAAa,mCAAmC,KAAK;AAAA,EAC7D;AAEA,MAAI,CAAC,uBAAuB,IAAI,IAAI,GAAG;AACrC,UAAM,aAAa,mCAAmC,KAAK;AAAA,EAC7D;AAEA,SAAO;AACT;AAEO,SAAS,sBAAsB,OAAuB;AAC3D,MAAI,OAAO,UAAU,SAAU,OAAM,aAAa,0BAA0B,KAAK;AACjF,QAAM,OAAO,MAAM,KAAK,EAAE,YAAY;AACtC,MAAI,CAAC,0BAA0B,KAAK,IAAI,KAAK,CAAC,oBAAoB,IAAI,IAAI,GAAG;AAC3E,UAAM,aAAa,0BAA0B,KAAK;AAAA,EACpD;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,OAAuB;AACvD,MAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,GAAG;AAC9C,UAAM,aAAa,6BAA6B,KAAK;AAAA,EACvD;AAEA,MAAI;AACF,WAAO,IAAI,KAAK,eAAe,MAAM,EAAE,UAAU,MAAM,KAAK,EAAE,CAAC,EAAE,gBAAgB,EAAE;AAAA,EACrF,QAAQ;AACN,UAAM,aAAa,6BAA6B,KAAK;AAAA,EACvD;AACF;AAEO,IAAM,oBAAoB,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,uBAAuB;AAC7E,IAAM,oBAAoB,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,oBAAoB;AAC1E,IAAM,qBAAqB,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,qBAAqB;AAC5E,IAAM,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,iBAAiB;AAEtE,IAAM,6BAA6B,EACvC,OAAO;AAAA,EACN,aAAa,kBAAkB,SAAS;AAAA,EACxC,gBAAgB,qBAAqB,SAAS;AAAA,EAC9C,aAAa,kBAAkB,SAAS;AAAA,EACxC,cAAc,mBAAmB,SAAS;AAAA,EAC1C,UAAU,iBAAiB,SAAS;AACtC,CAAC,EACA,OAAO;AAQH,SAAS,0BACd,MACA,UACsB;AACtB,SAAO;AAAA,IACL,aAAa,SAAS,eAAe,KAAK;AAAA,IAC1C,gBAAgB,SAAS,kBAAkB,KAAK;AAAA,IAChD,aAAa,SAAS,eAAe,KAAK;AAAA,IAC1C,cAAc,SAAS,gBAAgB,KAAK;AAAA,IAC5C,UAAU,SAAS,YAAY,KAAK;AAAA,EACtC;AACF;AA6BA,IAAM,yBAAyB;AAE/B,SAAS,sBAAsB,OAAe,MAAsB;AAClE,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AACzC,UAAM,IAAI,WAAW,GAAG,IAAI,6BAA6B;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,IAAM,sBAAN,cAAkC,IAA+B;AAAA,EAC/D,YAA6B,SAAiB;AAC5C,UAAM;AADqB;AAAA,EAE7B;AAAA,EAF6B;AAAA,EAIpB,IAAI,KAA4C;AACvD,UAAM,QAAQ,MAAM,IAAI,GAAG;AAC3B,QAAI,OAAO;AACT,YAAM,OAAO,GAAG;AAChB,YAAM,IAAI,KAAK,KAAK;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AAAA,EAES,IAAI,KAAa,OAAgC;AACxD,UAAM,OAAO,GAAG;AAChB,UAAM,IAAI,KAAK,KAAK;AACpB,WAAO,KAAK,OAAO,KAAK,QAAS,MAAK,OAAO,KAAK,KAAK,EAAE,KAAK,EAAE,KAAe;AAC/E,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,SAAsC;AAChE,SAAO,IAAI,oBAAoB,OAAO;AACxC;AAEO,SAAS,uBAAuB,QAA+B;AACpE,QAAM,kBAAkB,wBAAwB,MAAM;AACtD,QAAM,qBAAqB,IAAI,KAAK,OAAO,eAAe;AAI1D,QAAM,YAAY,mBAAmB,cAAc,GAAG,aAAa,mBAAmB,UAAU;AAChG,MAAI,cAAc,MAAO,QAAO;AAChC,MAAI,cAAc,MAAO,QAAO;AAEhC,QAAM,sBAAsB;AAC5B,SAAO,oBAAoB,KAAK,eAAe,IAAI,QAAQ;AAC7D;AAEO,SAAS,qBACd,WACA,cACA,UAAsC,CAAC,GACjC;AACN,QAAM,SAAS,QAAQ,SAAS,wBAAwB,QAAQ,MAAM,IAAI;AAC1E,QAAM,cAAc,aAAa,OAAO,CAAC,QAAQ,OAAO,UAAU,GAAG,MAAM,QAAQ;AACnF,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,IAAI,MAAM,uCAAuC,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,EACjF;AAEA,aAAW,OAAO,cAAc;AAC9B,QAAI;AACF,UAAI,kBAAkB,UAAU,GAAG,GAAG,MAAM;AAAA,IAC9C,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,+BAA+B,GAAG,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,IACjH;AAAA,EACF;AACF;AAEO,SAAS,kCAAkC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAAoE;AAClE,QAAM,iBAAiB,wBAAwB,MAAM;AACrD,QAAM,mBAAmB,aAAa,SAAY,SAAY,kBAAkB,QAAQ;AACxF,QAAM,eAAe,sBAAsB,WAAW,WAAW;AACjE,QAAM,eAAe,mBAAmB,YAAY;AAEpD,QAAM,UAAU,CAAC,YAAuC;AACtD,UAAM,SAAS,aAAa,IAAI,OAAO;AACvC,QAAI,QAAQ;AACV,mBAAa,OAAO,OAAO;AAC3B,mBAAa,IAAI,SAAS,MAAM;AAChC,aAAO;AAAA,IACT;AACA,UAAM,WAAW,IAAI,kBAAkB,SAAS,cAAc;AAC9D,iBAAa,IAAI,SAAS,QAAQ;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,CAAC,SAAiB,SAA2B,CAAC,MAAc;AAChF,UAAM,YAAY,QAAQ,OAAO,EAAE,OAAO,MAAM;AAChD,WAAO,MAAM,QAAQ,SAAS,IAAI,UAAU,KAAK,EAAE,IAAI,OAAO,SAAS;AAAA,EACzE;AAEA,QAAM,IAAI,CAAC,KAAa,SAA2B,CAAC,MAAc;AAChE,UAAM,UAAU,UAAU,GAAG,KAAK,oBAAoB,GAAG;AACzD,QAAI,YAAY,OAAW,OAAM,IAAI,MAAM,8BAA8B,GAAG,EAAE;AAC9E,WAAO,cAAc,SAAS,MAAM;AAAA,EACtC;AAEA,QAAM,eAAe,CAAC,OAAe,UAAoC,CAAC,MACxE,IAAI,KAAK,aAAa,gBAAgB,OAAO,EAAE,OAAO,KAAK;AAE7D,QAAM,gBAAgB,CAAC,OAAe,UAAoC,CAAC,MAAc;AACvF,UAAM,EAAE,OAAO,QAAQ,GAAG,oBAAoB,IAAI;AAClD,WAAO,aAAa,OAAO,EAAE,GAAG,qBAAqB,OAAO,UAAU,CAAC;AAAA,EACzE;AAEA,QAAM,iBAAiB,CAAC,OAA+B,UAAsC,CAAC,MAAc;AAC1G,UAAM,EAAE,UAAU,gBAAgB,GAAG,oBAAoB,IAAI;AAC7D,WAAO,IAAI,KAAK,eAAe,gBAAgB;AAAA,MAC7C,GAAG;AAAA,MACH,UAAU,oBAAoB;AAAA,IAChC,CAAC,EAAE,OAAO,IAAI,KAAK,KAAK,CAAC;AAAA,EAC3B;AAEA,QAAM,cAAc,CAAC,OAAe,cAAsB,UAAoC,CAAC,MAAc;AAC3G,UAAM,EAAE,OAAO,QAAQ,UAAU,WAAW,GAAG,oBAAoB,IAAI;AACvE,WAAO,aAAa,OAAO;AAAA,MACzB,GAAG;AAAA,MACH,OAAO;AAAA,MACP,UAAU,sBAAsB,YAAY;AAAA,IAC9C,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW,uBAAuB,cAAc;AAAA,IAChD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  canonicaliseLanguageTag,
3
3
  normalizeCurrencyCode
4
- } from "./chunk-B6Y3QQLI.js";
4
+ } from "./chunk-4KSODB2R.js";
5
5
 
6
6
  // src/commerce/canonical-json.ts
7
7
  function canonicalJson(value, order = "codepoint") {
@@ -318,11 +318,6 @@ var DEFINITION_SIZE_MESSAGE = "Definition exceeds the 65536-byte jsonb text limi
318
318
 
319
319
  // src/commerce/definitions.ts
320
320
  var ToolNameSchema = z4.string().regex(/^[a-z][a-z0-9_]{0,127}$/).refine((n) => n !== "finalResponse");
321
- var ToolBindingSchema = z4.strictObject({
322
- toolId: IdSchema,
323
- toolRevisionId: IdSchema
324
- });
325
- var ToolBindingsSchema = z4.array(ToolBindingSchema).max(32).refine((v) => distinct(v.map((x) => x.toolId)));
326
321
  var GrantedToolSchema = z4.strictObject({
327
322
  toolId: IdSchema,
328
323
  toolRevisionId: IdSchema,
@@ -546,18 +541,6 @@ var toolHashInput = (definition) => ({
546
541
  contractVersion: ContractVersionSchema.value,
547
542
  definition: CommerceToolDefinitionSchema.parse(definition)
548
543
  });
549
- function capabilityHashInput(promptTemplate, configuration, toolBindings) {
550
- if (!promptTemplate.trim() || promptTemplate.length > 32e3)
551
- throw new TypeError("Invalid capability prompt");
552
- return {
553
- contractVersion: ContractVersionSchema.value,
554
- promptTemplate,
555
- configuration,
556
- toolBindings: ToolBindingsSchema.parse(toolBindings).sort(
557
- (a, b) => a.toolId < b.toolId ? -1 : 1
558
- )
559
- };
560
- }
561
544
  function validateDefinitionVersion(proposed, highestPublished) {
562
545
  SemverSchema.parse(proposed);
563
546
  if (highestPublished === null) return proposed === "1.0.0";
@@ -735,7 +718,7 @@ var CommerceConversationGrantSchema = z6.strictObject({
735
718
  conversationId: IdSchema,
736
719
  initialInboundVersion: z6.number().int().positive(),
737
720
  releaseId: IdSchema,
738
- selectedCapabilityKeys: z6.array(IdSchema).min(1).max(32).refine((v) => distinct(v) && v.includes("conversation_core")),
721
+ selectedCapabilityKeys: z6.array(IdSchema).max(32).refine(distinct),
739
722
  grantedTools: GrantedToolsSchema,
740
723
  runnerVersion: SemverSchema,
741
724
  createdAt: DateSchema,
@@ -748,25 +731,26 @@ var CommerceConversationGrantSchema = z6.strictObject({
748
731
  ))
749
732
  c.addIssue({ code: "custom", message: "Unselected grant provenance" });
750
733
  });
751
- var CommerceConfigurationSchema = z6.strictObject({
752
- maxRecommendations: z6.number().int().min(1).max(3).optional(),
753
- maxSearchResults: z6.number().int().min(1).max(20).optional()
754
- });
755
734
  var CommerceManifestSchema = z6.strictObject({
756
735
  contractVersion: ContractVersionSchema,
757
736
  releaseId: IdSchema,
758
737
  runnerCompatibility: z6.string().min(1).max(128).refine((v) => !!validRange(v)),
759
738
  capabilities: z6.array(
760
739
  z6.strictObject({
740
+ capabilityId: IdSchema,
761
741
  key: IdSchema,
762
- revisionId: IdSchema,
742
+ featureId: IdSchema,
763
743
  position: z6.number().int().nonnegative(),
764
- promptName: z6.string().min(1).max(512),
765
- configuration: CommerceConfigurationSchema,
766
- toolDescriptors: z6.array(ToolDescriptorSchema).max(32)
744
+ toolDescriptor: ToolDescriptorSchema
745
+ })
746
+ ).max(32),
747
+ featureBehaviours: z6.array(
748
+ z6.strictObject({
749
+ featureId: IdSchema,
750
+ behaviourPrompt: z6.string().max(32e3)
767
751
  })
768
- ).min(1).max(32),
769
- selectedCapabilityKeys: z6.array(IdSchema).min(1).max(32).refine(distinct),
752
+ ).max(32),
753
+ selectedCapabilityKeys: z6.array(IdSchema).max(32).refine(distinct),
770
754
  grantedTools: GrantedToolsSchema,
771
755
  responseContract: CommerceResponseContractSchema,
772
756
  responseContractHash: HashSchema
@@ -774,39 +758,39 @@ var CommerceManifestSchema = z6.strictObject({
774
758
  if (jsonBytes(v) > 262144)
775
759
  c.addIssue({ code: "custom", message: "Manifest exceeds output limit" });
776
760
  const keys = v.capabilities.map((x) => x.key);
777
- if (!distinct(keys) || !keys.includes("conversation_core") || JSON.stringify(keys) !== JSON.stringify(v.selectedCapabilityKeys) || v.capabilities.some(
761
+ const capabilityIds = v.capabilities.map((x) => x.capabilityId);
762
+ const representedFeatures = [...new Set(v.capabilities.map((x) => x.featureId))];
763
+ const behaviourFeatureIds = v.featureBehaviours.map((x) => x.featureId);
764
+ if (!distinct(keys) || !distinct(capabilityIds) || JSON.stringify(keys) !== JSON.stringify(v.selectedCapabilityKeys) || v.capabilities.some(
778
765
  (x, i) => i > 0 && x.position <= v.capabilities[i - 1].position
779
- ))
766
+ ) || !distinct(behaviourFeatureIds) || JSON.stringify(representedFeatures) !== JSON.stringify(behaviourFeatureIds))
780
767
  c.addIssue({
781
768
  code: "custom",
782
769
  message: "Invalid capability ordering/selection"
783
770
  });
784
771
  const union = /* @__PURE__ */ new Map();
785
772
  for (const cap of v.capabilities) {
786
- if (cap.promptName !== `commerce/${v.releaseId}/${cap.key}/${cap.revisionId}`)
787
- c.addIssue({ code: "custom", message: "Prompt identity mismatch" });
788
- for (const d of cap.toolDescriptors) {
789
- const old = union.get(d.toolId);
790
- const descriptor = canonicalJson(d);
791
- if (old) {
792
- if (old.descriptor !== descriptor)
793
- c.addIssue({
794
- code: "custom",
795
- message: "Conflicting tool revisions/descriptors"
796
- });
797
- old.tool.capabilityKeys.push(cap.key);
798
- } else
799
- union.set(d.toolId, {
800
- descriptor,
801
- tool: {
802
- toolId: d.toolId,
803
- toolRevisionId: d.toolRevisionId,
804
- toolName: d.name,
805
- definitionVersion: d.definitionVersion,
806
- capabilityKeys: [cap.key]
807
- }
773
+ const d = cap.toolDescriptor;
774
+ const old = union.get(d.toolId);
775
+ const descriptor = canonicalJson(d);
776
+ if (old) {
777
+ if (old.descriptor !== descriptor)
778
+ c.addIssue({
779
+ code: "custom",
780
+ message: "Conflicting tool revisions/descriptors"
808
781
  });
809
- }
782
+ old.tool.capabilityKeys.push(cap.key);
783
+ } else
784
+ union.set(d.toolId, {
785
+ descriptor,
786
+ tool: {
787
+ toolId: d.toolId,
788
+ toolRevisionId: d.toolRevisionId,
789
+ toolName: d.name,
790
+ definitionVersion: d.definitionVersion,
791
+ capabilityKeys: [cap.key]
792
+ }
793
+ });
810
794
  }
811
795
  if (union.size !== v.grantedTools.length || v.grantedTools.some((t) => {
812
796
  const expected = union.get(t.toolId)?.tool;
@@ -814,7 +798,7 @@ var CommerceManifestSchema = z6.strictObject({
814
798
  }))
815
799
  c.addIssue({
816
800
  code: "custom",
817
- message: "Grant must equal selected binding union"
801
+ message: "Grant must equal selected capability set"
818
802
  });
819
803
  });
820
804
  var CommerceReleaseIdentitySchema = z6.strictObject({
@@ -1027,64 +1011,48 @@ function productBelongsToDomain(product, verifiedDomain) {
1027
1011
  }
1028
1012
 
1029
1013
  // src/commerce/selection.ts
1030
- import { z as z7 } from "zod";
1031
- var CommerceCapabilityBindingSchema = z7.discriminatedUnion("kind", [
1032
- z7.strictObject({
1033
- kind: z7.literal("BASE"),
1034
- key: z7.literal("conversation_core")
1035
- }),
1036
- z7.strictObject({
1037
- kind: z7.literal("FEATURE"),
1038
- key: IdSchema,
1039
- featureId: IdSchema
1040
- }),
1041
- z7.strictObject({
1042
- kind: z7.literal("RECOVERY_POLICY"),
1043
- key: z7.literal("discount_assistance")
1044
- })
1045
- ]);
1046
1014
  function selectCapabilities(candidates, facts) {
1015
+ for (const candidate of candidates) {
1016
+ IdSchema.parse(candidate.key);
1017
+ IdSchema.parse(candidate.featureId);
1018
+ if (!Number.isSafeInteger(candidate.position) || candidate.position < 0)
1019
+ throw new TypeError("Invalid capability position");
1020
+ }
1047
1021
  const selected = candidates.filter((c) => {
1048
- const b = CommerceCapabilityBindingSchema.parse(c.binding);
1049
1022
  if (!c.enabled) return false;
1050
- if (b.kind === "BASE") return true;
1051
- if (b.kind === "RECOVERY_POLICY")
1052
- return facts.offerMode === "FIXED" || facts.offerMode === "AI_BEST_APPLICABLE";
1053
- const f = facts.features.find((f2) => f2.id === b.featureId);
1023
+ const f = facts.features.find((f2) => f2.id === c.featureId);
1054
1024
  return !!f && f.active && f.planMappingEnabled && (f.mode === "ALWAYS_ENABLED" || f.preferenceEnabled === true);
1055
1025
  }).sort((a, b) => a.position - b.position);
1056
- if (!selected.some((c) => c.binding.kind === "BASE"))
1057
- throw new TypeError("Base capability unavailable");
1058
- if (new Set(selected.map((c) => c.binding.key)).size !== selected.length || new Set(selected.map((c) => c.position)).size !== selected.length)
1026
+ if (new Set(selected.map((c) => c.key)).size !== selected.length || new Set(selected.map((c) => c.position)).size !== selected.length)
1059
1027
  throw new TypeError("Duplicate release membership");
1060
- return selected.map((c) => c.binding.key);
1028
+ return selected.map((c) => c.key);
1061
1029
  }
1062
1030
  function deduplicateTools(capabilities) {
1063
1031
  const byId = /* @__PURE__ */ new Map();
1064
1032
  const names = /* @__PURE__ */ new Map();
1065
- for (const cap of capabilities)
1066
- for (const d of cap.toolDescriptors) {
1067
- const previous = byId.get(d.toolId);
1068
- const descriptor = canonicalJson(d);
1069
- if (previous && previous.descriptor !== descriptor || names.has(d.name) && names.get(d.name) !== d.toolId)
1070
- throw new TypeError("Conflicting tool association");
1071
- names.set(d.name, d.toolId);
1072
- if (previous)
1073
- previous.tool.capabilityKeys = [
1074
- .../* @__PURE__ */ new Set([...previous.tool.capabilityKeys, cap.key])
1075
- ].sort();
1076
- else
1077
- byId.set(d.toolId, {
1078
- descriptor,
1079
- tool: {
1080
- toolId: d.toolId,
1081
- toolRevisionId: d.toolRevisionId,
1082
- toolName: d.name,
1083
- definitionVersion: d.definitionVersion,
1084
- capabilityKeys: [cap.key]
1085
- }
1086
- });
1087
- }
1033
+ for (const cap of capabilities) {
1034
+ const d = cap.toolDescriptor;
1035
+ const previous = byId.get(d.toolId);
1036
+ const descriptor = canonicalJson(d);
1037
+ if (previous && previous.descriptor !== descriptor || names.has(d.name) && names.get(d.name) !== d.toolId)
1038
+ throw new TypeError("Conflicting tool association");
1039
+ names.set(d.name, d.toolId);
1040
+ if (previous)
1041
+ previous.tool.capabilityKeys = [
1042
+ .../* @__PURE__ */ new Set([...previous.tool.capabilityKeys, cap.key])
1043
+ ].sort();
1044
+ else
1045
+ byId.set(d.toolId, {
1046
+ descriptor,
1047
+ tool: {
1048
+ toolId: d.toolId,
1049
+ toolRevisionId: d.toolRevisionId,
1050
+ toolName: d.name,
1051
+ definitionVersion: d.definitionVersion,
1052
+ capabilityKeys: [cap.key]
1053
+ }
1054
+ });
1055
+ }
1088
1056
  return [...byId.values()].map((v) => v.tool).sort((a, b) => a.toolName.localeCompare(b.toolName, "en"));
1089
1057
  }
1090
1058
  function manifestMatchesGrant(manifest, grant) {
@@ -1147,8 +1115,6 @@ export {
1147
1115
  ConnectionIssueSchema,
1148
1116
  ConnectionResultSchema,
1149
1117
  ToolNameSchema,
1150
- ToolBindingSchema,
1151
- ToolBindingsSchema,
1152
1118
  GrantedToolSchema,
1153
1119
  GrantedToolsSchema,
1154
1120
  ToolDescriptorSchema,
@@ -1162,7 +1128,6 @@ export {
1162
1128
  definitionToMcpDescriptor,
1163
1129
  mapToolArguments,
1164
1130
  toolHashInput,
1165
- capabilityHashInput,
1166
1131
  validateDefinitionVersion,
1167
1132
  CommerceToolIdentitySchema,
1168
1133
  CommerceToolRevisionIdentitySchema,
@@ -1176,7 +1141,6 @@ export {
1176
1141
  finalResponseToolSchema,
1177
1142
  CommerceTurnIdentitySchema,
1178
1143
  CommerceConversationGrantSchema,
1179
- CommerceConfigurationSchema,
1180
1144
  CommerceManifestSchema,
1181
1145
  CommerceReleaseIdentitySchema,
1182
1146
  CommerceResolveAssertionSchema,
@@ -1194,11 +1158,10 @@ export {
1194
1158
  CommerceToolInputs,
1195
1159
  CommerceToolOutputs,
1196
1160
  productBelongsToDomain,
1197
- CommerceCapabilityBindingSchema,
1198
1161
  selectCapabilities,
1199
1162
  deduplicateTools,
1200
1163
  manifestMatchesGrant,
1201
1164
  parseCommerceManifest,
1202
1165
  currentlyGrantedTools
1203
1166
  };
1204
- //# sourceMappingURL=chunk-NCDOIVAC.js.map
1167
+ //# sourceMappingURL=chunk-B5NIYRWH.js.map