@modainteract/moda-interact-shared 1.0.0 → 1.1.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 +18 -0
- package/dist/{chunk-B6Y3QQLI.js → chunk-4KSODB2R.js} +58 -1
- package/dist/chunk-4KSODB2R.js.map +1 -0
- package/dist/chunk-AUS3WQIW.js +51 -0
- package/dist/chunk-AUS3WQIW.js.map +1 -0
- package/dist/chunk-EJVXCNOL.js +79 -0
- package/dist/chunk-EJVXCNOL.js.map +1 -0
- package/dist/{chunk-77R2NUY3.js → chunk-I4WVQ6D7.js} +2 -2
- package/dist/{chunk-X7NKF3ZC.js → chunk-OU6ASX5V.js} +2 -2
- package/dist/chunk-QD73OF2Y.js +208 -0
- package/dist/chunk-QD73OF2Y.js.map +1 -0
- package/dist/{chunk-QP5QNAO7.js → chunk-R7R2C3QH.js} +8 -119
- package/dist/chunk-R7R2C3QH.js.map +1 -0
- package/dist/commerce/index.js +14 -10
- package/dist/commerce/index.js.map +1 -1
- package/dist/commerce/model/index.d.ts +132 -0
- package/dist/commerce/model/index.js +40 -0
- package/dist/commerce/model/index.js.map +1 -0
- package/dist/commerce/model/node.d.ts +21 -0
- package/dist/commerce/model/node.js +154 -0
- package/dist/commerce/model/node.js.map +1 -0
- package/dist/commerce/runner/index.d.ts +10 -71
- package/dist/commerce/runner/index.js +566 -245
- package/dist/commerce/runner/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +60 -54
- package/dist/internationalization.d.ts +26 -1
- package/dist/internationalization.js +7 -1
- package/dist/logging/index.d.ts +3 -29
- package/dist/merchant-communications.js +2 -2
- package/dist/merchant-knowledge/node.d.ts +6 -0
- package/dist/merchant-knowledge/node.js +22 -0
- package/dist/merchant-knowledge/node.js.map +1 -0
- package/dist/merchant-knowledge.d.ts +73 -0
- package/dist/merchant-knowledge.js +73 -0
- package/dist/merchant-knowledge.js.map +1 -0
- package/dist/shopify/index.js +2 -2
- package/dist/types-B32wDMLO.d.ts +30 -0
- package/dist/types-D2aaYKiY.d.ts +75 -0
- package/package.json +27 -3
- package/dist/chunk-B6Y3QQLI.js.map +0 -1
- package/dist/chunk-QP5QNAO7.js.map +0 -1
- /package/dist/{chunk-77R2NUY3.js.map → chunk-I4WVQ6D7.js.map} +0 -0
- /package/dist/{chunk-X7NKF3ZC.js.map → chunk-OU6ASX5V.js.map} +0 -0
package/README.md
CHANGED
|
@@ -44,6 +44,8 @@ necessarily a supported package subpath. Type-only exports require `import type`
|
|
|
44
44
|
| `/testing/node` | Node-only disposable PostgreSQL/Redis test infrastructure and command helpers; not application startup or production provisioning. |
|
|
45
45
|
| `/commerce` | Commerce schemas, definitions, selection helpers, response validation, canonical hashing inputs and synthetic examples. |
|
|
46
46
|
| `/commerce/runner` | Dependency-injected Commerce turn runner and model/tool adapter types. |
|
|
47
|
+
| `/commerce/model` | Runtime-safe model catalogue, selection, OpenRouter configuration and credential AAD contracts. |
|
|
48
|
+
| `/commerce/model/node` | Node-only OpenRouter chat-model adapter for the Commerce runner. |
|
|
47
49
|
|
|
48
50
|
The root entry does **not** re-export WhatsApp, Commerce, the runner, logging,
|
|
49
51
|
observability or Node helpers. Do not replace a documented subpath import with a
|
|
@@ -256,6 +258,22 @@ version. `PLATFORM_INSTRUCTIONS` is the runner's fixed grounding, authorization,
|
|
|
256
258
|
language and finalization guidance. Feature behaviour, response guidance and other
|
|
257
259
|
authored release text cannot expand permissions or override those rules.
|
|
258
260
|
|
|
261
|
+
### Model catalogue and OpenRouter adapter
|
|
262
|
+
|
|
263
|
+
Use `/commerce/model` for the environment, availability, catalogue, selection,
|
|
264
|
+
extensible OpenRouter configuration, resolved-model and credential AAD contracts.
|
|
265
|
+
The configuration schema bounds ordinary JSON and blocks runtime-owned fields;
|
|
266
|
+
unknown non-reserved OpenRouter options remain available for forward-compatible
|
|
267
|
+
provider features. `createCommerceOpenRouterCredentialAad` returns the canonical
|
|
268
|
+
string that each service UTF-8 encodes for its own encrypted-credential handling.
|
|
269
|
+
|
|
270
|
+
Server-side Commerce and Background adapters may use `/commerce/model/node` to
|
|
271
|
+
bridge a resolved model and runtime credential to the existing
|
|
272
|
+
`CommerceModelInvoker`. This adapter does not resolve model assignments, store or
|
|
273
|
+
decrypt credentials, execute remote Tools, or own the Commerce turn loop. The
|
|
274
|
+
runner remains the authority for Tool visibility, authorization, retries and
|
|
275
|
+
final-response validation.
|
|
276
|
+
|
|
259
277
|
### Response contracts and final responses
|
|
260
278
|
|
|
261
279
|
`CommerceResponseContractSchema` validates the release-owned
|
|
@@ -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-
|
|
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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","names":[]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// src/commerce/canonical-json.ts
|
|
2
|
+
function canonicalJson(value, order = "codepoint") {
|
|
3
|
+
const seen = /* @__PURE__ */ new Set();
|
|
4
|
+
const compare = (a, b) => {
|
|
5
|
+
const aa = Array.from(a, (c) => c.codePointAt(0));
|
|
6
|
+
const bb = Array.from(b, (c) => c.codePointAt(0));
|
|
7
|
+
for (let i = 0; i < Math.min(aa.length, bb.length); i++)
|
|
8
|
+
if (aa[i] !== bb[i]) return aa[i] - bb[i];
|
|
9
|
+
return aa.length - bb.length;
|
|
10
|
+
};
|
|
11
|
+
function visit(v, depth) {
|
|
12
|
+
if (depth > 32) throw new TypeError("JSON depth exceeded");
|
|
13
|
+
if (v === null) return "null";
|
|
14
|
+
if (typeof v === "string") {
|
|
15
|
+
if (/\p{Surrogate}/u.test(v)) throw new TypeError("Invalid Unicode");
|
|
16
|
+
return JSON.stringify(v);
|
|
17
|
+
}
|
|
18
|
+
if (typeof v === "boolean") return String(v);
|
|
19
|
+
if (typeof v === "number" && Number.isFinite(v)) return JSON.stringify(v);
|
|
20
|
+
if (typeof v !== "object" || !v || seen.has(v))
|
|
21
|
+
throw new TypeError("Invalid JSON");
|
|
22
|
+
if (!Array.isArray(v) && Object.getPrototypeOf(v) !== Object.prototype && Object.getPrototypeOf(v) !== null)
|
|
23
|
+
throw new TypeError("Invalid JSON object");
|
|
24
|
+
seen.add(v);
|
|
25
|
+
let result;
|
|
26
|
+
if (Array.isArray(v)) {
|
|
27
|
+
if (Object.keys(v).length !== v.length)
|
|
28
|
+
throw new TypeError("Sparse or extended array");
|
|
29
|
+
result = "[" + v.map((item) => visit(item, depth + 1)).join(",") + "]";
|
|
30
|
+
} else {
|
|
31
|
+
const keys = Object.keys(v).sort(
|
|
32
|
+
order === "codepoint" ? compare : void 0
|
|
33
|
+
);
|
|
34
|
+
result = "{" + keys.map(
|
|
35
|
+
(k) => visit(k, depth + 1) + ":" + visit(v[k], depth + 1)
|
|
36
|
+
).join(",") + "}";
|
|
37
|
+
}
|
|
38
|
+
seen.delete(v);
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
return visit(value, 0);
|
|
42
|
+
}
|
|
43
|
+
var jsonBytes = (value) => new TextEncoder().encode(canonicalJson(value)).length;
|
|
44
|
+
var responseContractCanonicalJson = (value) => canonicalJson(value, "utf16");
|
|
45
|
+
|
|
46
|
+
export {
|
|
47
|
+
canonicalJson,
|
|
48
|
+
jsonBytes,
|
|
49
|
+
responseContractCanonicalJson
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=chunk-AUS3WQIW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commerce/canonical-json.ts"],"sourcesContent":["/** Bounded canonical JSON. No credentials, hashing runtime or provider access. */\nexport function canonicalJson(\n value: unknown,\n order: \"codepoint\" | \"utf16\" = \"codepoint\",\n): string {\n const seen = new Set<object>();\n const compare = (a: string, b: string) => {\n const aa = Array.from(a, (c) => c.codePointAt(0)!);\n const bb = Array.from(b, (c) => c.codePointAt(0)!);\n for (let i = 0; i < Math.min(aa.length, bb.length); i++)\n if (aa[i] !== bb[i]) return aa[i] - bb[i];\n return aa.length - bb.length;\n };\n function visit(v: unknown, depth: number): string {\n if (depth > 32) throw new TypeError(\"JSON depth exceeded\");\n if (v === null) return \"null\";\n if (typeof v === \"string\") {\n if (/\\p{Surrogate}/u.test(v)) throw new TypeError(\"Invalid Unicode\");\n return JSON.stringify(v);\n }\n if (typeof v === \"boolean\") return String(v);\n if (typeof v === \"number\" && Number.isFinite(v)) return JSON.stringify(v);\n if (typeof v !== \"object\" || !v || seen.has(v))\n throw new TypeError(\"Invalid JSON\");\n if (\n !Array.isArray(v) &&\n Object.getPrototypeOf(v) !== Object.prototype &&\n Object.getPrototypeOf(v) !== null\n )\n throw new TypeError(\"Invalid JSON object\");\n seen.add(v);\n let result: string;\n if (Array.isArray(v)) {\n if (Object.keys(v).length !== v.length)\n throw new TypeError(\"Sparse or extended array\");\n result = \"[\" + v.map((item) => visit(item, depth + 1)).join(\",\") + \"]\";\n } else {\n const keys = Object.keys(v).sort(\n order === \"codepoint\" ? compare : undefined,\n );\n result =\n \"{\" +\n keys\n .map(\n (k) =>\n visit(k, depth + 1) +\n \":\" +\n visit((v as Record<string, unknown>)[k], depth + 1),\n )\n .join(\",\") +\n \"}\";\n }\n seen.delete(v);\n return result;\n }\n return visit(value, 0);\n}\nexport const jsonBytes = (value: unknown) =>\n new TextEncoder().encode(canonicalJson(value)).length;\n/** RFC8785 sorts UTF-16 code units; JSON.stringify supplies ECMAScript number serialization. */\nexport const responseContractCanonicalJson = (value: unknown) =>\n canonicalJson(value, \"utf16\");\nexport type Digest = (canonical: string) => string;\n"],"mappings":";AACO,SAAS,cACd,OACA,QAA+B,aACvB;AACR,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,UAAU,CAAC,GAAW,MAAc;AACxC,UAAM,KAAK,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAE;AACjD,UAAM,KAAK,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAE;AACjD,aAAS,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG;AAClD,UAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAG,QAAO,GAAG,CAAC,IAAI,GAAG,CAAC;AAC1C,WAAO,GAAG,SAAS,GAAG;AAAA,EACxB;AACA,WAAS,MAAM,GAAY,OAAuB;AAChD,QAAI,QAAQ,GAAI,OAAM,IAAI,UAAU,qBAAqB;AACzD,QAAI,MAAM,KAAM,QAAO;AACvB,QAAI,OAAO,MAAM,UAAU;AACzB,UAAI,iBAAiB,KAAK,CAAC,EAAG,OAAM,IAAI,UAAU,iBAAiB;AACnE,aAAO,KAAK,UAAU,CAAC;AAAA,IACzB;AACA,QAAI,OAAO,MAAM,UAAW,QAAO,OAAO,CAAC;AAC3C,QAAI,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,EAAG,QAAO,KAAK,UAAU,CAAC;AACxE,QAAI,OAAO,MAAM,YAAY,CAAC,KAAK,KAAK,IAAI,CAAC;AAC3C,YAAM,IAAI,UAAU,cAAc;AACpC,QACE,CAAC,MAAM,QAAQ,CAAC,KAChB,OAAO,eAAe,CAAC,MAAM,OAAO,aACpC,OAAO,eAAe,CAAC,MAAM;AAE7B,YAAM,IAAI,UAAU,qBAAqB;AAC3C,SAAK,IAAI,CAAC;AACV,QAAI;AACJ,QAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,UAAI,OAAO,KAAK,CAAC,EAAE,WAAW,EAAE;AAC9B,cAAM,IAAI,UAAU,0BAA0B;AAChD,eAAS,MAAM,EAAE,IAAI,CAAC,SAAS,MAAM,MAAM,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;AAAA,IACrE,OAAO;AACL,YAAM,OAAO,OAAO,KAAK,CAAC,EAAE;AAAA,QAC1B,UAAU,cAAc,UAAU;AAAA,MACpC;AACA,eACE,MACA,KACG;AAAA,QACC,CAAC,MACC,MAAM,GAAG,QAAQ,CAAC,IAClB,MACA,MAAO,EAA8B,CAAC,GAAG,QAAQ,CAAC;AAAA,MACtD,EACC,KAAK,GAAG,IACX;AAAA,IACJ;AACA,SAAK,OAAO,CAAC;AACb,WAAO;AAAA,EACT;AACA,SAAO,MAAM,OAAO,CAAC;AACvB;AACO,IAAM,YAAY,CAAC,UACxB,IAAI,YAAY,EAAE,OAAO,cAAc,KAAK,CAAC,EAAE;AAE1C,IAAM,gCAAgC,CAAC,UAC5C,cAAc,OAAO,OAAO;","names":[]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CommerceManifestSchema,
|
|
3
|
+
IdSchema
|
|
4
|
+
} from "./chunk-R7R2C3QH.js";
|
|
5
|
+
import {
|
|
6
|
+
canonicalJson
|
|
7
|
+
} from "./chunk-AUS3WQIW.js";
|
|
8
|
+
|
|
9
|
+
// src/commerce/selection.ts
|
|
10
|
+
function selectCapabilities(candidates, facts) {
|
|
11
|
+
for (const candidate of candidates) {
|
|
12
|
+
IdSchema.parse(candidate.key);
|
|
13
|
+
IdSchema.parse(candidate.featureId);
|
|
14
|
+
if (!Number.isSafeInteger(candidate.position) || candidate.position < 0)
|
|
15
|
+
throw new TypeError("Invalid capability position");
|
|
16
|
+
}
|
|
17
|
+
const selected = candidates.filter((c) => {
|
|
18
|
+
if (!c.enabled) return false;
|
|
19
|
+
const f = facts.features.find((f2) => f2.id === c.featureId);
|
|
20
|
+
return !!f && f.active && f.planMappingEnabled && (f.mode === "ALWAYS_ENABLED" || f.preferenceEnabled === true);
|
|
21
|
+
}).sort((a, b) => a.position - b.position);
|
|
22
|
+
if (new Set(selected.map((c) => c.key)).size !== selected.length || new Set(selected.map((c) => c.position)).size !== selected.length)
|
|
23
|
+
throw new TypeError("Duplicate release membership");
|
|
24
|
+
return selected.map((c) => c.key);
|
|
25
|
+
}
|
|
26
|
+
function deduplicateTools(capabilities) {
|
|
27
|
+
const byId = /* @__PURE__ */ new Map();
|
|
28
|
+
const names = /* @__PURE__ */ new Map();
|
|
29
|
+
for (const cap of capabilities) {
|
|
30
|
+
const d = cap.toolDescriptor;
|
|
31
|
+
const previous = byId.get(d.toolId);
|
|
32
|
+
const descriptor = canonicalJson(d);
|
|
33
|
+
if (previous && previous.descriptor !== descriptor || names.has(d.name) && names.get(d.name) !== d.toolId)
|
|
34
|
+
throw new TypeError("Conflicting tool association");
|
|
35
|
+
names.set(d.name, d.toolId);
|
|
36
|
+
if (previous)
|
|
37
|
+
previous.tool.capabilityKeys = [
|
|
38
|
+
.../* @__PURE__ */ new Set([...previous.tool.capabilityKeys, cap.key])
|
|
39
|
+
].sort();
|
|
40
|
+
else
|
|
41
|
+
byId.set(d.toolId, {
|
|
42
|
+
descriptor,
|
|
43
|
+
tool: {
|
|
44
|
+
toolId: d.toolId,
|
|
45
|
+
toolRevisionId: d.toolRevisionId,
|
|
46
|
+
toolName: d.name,
|
|
47
|
+
definitionVersion: d.definitionVersion,
|
|
48
|
+
capabilityKeys: [cap.key]
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return [...byId.values()].map((v) => v.tool).sort((a, b) => a.toolName.localeCompare(b.toolName, "en"));
|
|
53
|
+
}
|
|
54
|
+
function manifestMatchesGrant(manifest, grant) {
|
|
55
|
+
return manifest.releaseId === grant.releaseId && canonicalJson(manifest.selectedCapabilityKeys) === canonicalJson(grant.selectedCapabilityKeys) && canonicalJson(
|
|
56
|
+
[...manifest.grantedTools].sort(
|
|
57
|
+
(a, b) => a.toolId.localeCompare(b.toolId)
|
|
58
|
+
)
|
|
59
|
+
) === canonicalJson(
|
|
60
|
+
[...grant.grantedTools].sort(
|
|
61
|
+
(a, b) => a.toolId.localeCompare(b.toolId)
|
|
62
|
+
)
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
var parseCommerceManifest = (raw) => CommerceManifestSchema.parse(raw);
|
|
66
|
+
function currentlyGrantedTools(grant, eligibleCapabilityKeys, enabledToolIds) {
|
|
67
|
+
return grant.grantedTools.filter(
|
|
68
|
+
(t) => enabledToolIds.has(t.toolId) && t.capabilityKeys.some((k) => eligibleCapabilityKeys.has(k))
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export {
|
|
73
|
+
selectCapabilities,
|
|
74
|
+
deduplicateTools,
|
|
75
|
+
manifestMatchesGrant,
|
|
76
|
+
parseCommerceManifest,
|
|
77
|
+
currentlyGrantedTools
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=chunk-EJVXCNOL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commerce/selection.ts"],"sourcesContent":["import { IdSchema } from \"./primitives\";\nimport {\n type CommerceManifest,\n CommerceManifestSchema,\n type CommerceConversationGrant,\n} from \"./schemas\";\nimport { type GrantedTool, type ToolDescriptor } from \"./definitions\";\nimport { canonicalJson } from \"./canonical-json\";\nexport type FeatureFacts = {\n id: string;\n active: boolean;\n planMappingEnabled: boolean;\n mode: \"ALWAYS_ENABLED\" | \"MERCHANT_OPT_IN\";\n preferenceEnabled: boolean | null;\n};\nexport function selectCapabilities(\n candidates: Array<{\n key: string;\n featureId: string;\n enabled: boolean;\n position: number;\n }>,\n facts: {\n features: FeatureFacts[];\n },\n) {\n for (const candidate of candidates) {\n IdSchema.parse(candidate.key);\n IdSchema.parse(candidate.featureId);\n if (!Number.isSafeInteger(candidate.position) || candidate.position < 0)\n throw new TypeError(\"Invalid capability position\");\n }\n const selected = candidates\n .filter((c) => {\n if (!c.enabled) return false;\n const f = facts.features.find((f) => f.id === c.featureId);\n return (\n !!f &&\n f.active &&\n f.planMappingEnabled &&\n (f.mode === \"ALWAYS_ENABLED\" || f.preferenceEnabled === true)\n );\n })\n .sort((a, b) => a.position - b.position);\n if (\n new Set(selected.map((c) => c.key)).size !== selected.length ||\n new Set(selected.map((c) => c.position)).size !== selected.length\n )\n throw new TypeError(\"Duplicate release membership\");\n return selected.map((c) => c.key);\n}\nexport function deduplicateTools(\n capabilities: Array<{ key: string; toolDescriptor: ToolDescriptor }>,\n): GrantedTool[] {\n const byId = new Map<string, { tool: GrantedTool; descriptor: string }>();\n const names = new Map<string, string>();\n for (const cap of capabilities) {\n const d = cap.toolDescriptor;\n const previous = byId.get(d.toolId);\n const descriptor = canonicalJson(d);\n if (\n (previous && previous.descriptor !== descriptor) ||\n (names.has(d.name) && names.get(d.name) !== d.toolId)\n )\n throw new TypeError(\"Conflicting tool association\");\n names.set(d.name, d.toolId);\n if (previous)\n previous.tool.capabilityKeys = [\n ...new Set([...previous.tool.capabilityKeys, cap.key]),\n ].sort();\n else\n byId.set(d.toolId, {\n descriptor,\n tool: {\n toolId: d.toolId,\n toolRevisionId: d.toolRevisionId,\n toolName: d.name,\n definitionVersion: d.definitionVersion,\n capabilityKeys: [cap.key],\n },\n });\n }\n return [...byId.values()]\n .map((v) => v.tool)\n .sort((a, b) => a.toolName.localeCompare(b.toolName, \"en\"));\n}\nexport function manifestMatchesGrant(\n manifest: CommerceManifest,\n grant: CommerceConversationGrant,\n) {\n return (\n manifest.releaseId === grant.releaseId &&\n canonicalJson(manifest.selectedCapabilityKeys) ===\n canonicalJson(grant.selectedCapabilityKeys) &&\n canonicalJson(\n [...manifest.grantedTools].sort((a, b) =>\n a.toolId.localeCompare(b.toolId),\n ),\n ) ===\n canonicalJson(\n [...grant.grantedTools].sort((a, b) =>\n a.toolId.localeCompare(b.toolId),\n ),\n )\n );\n}\nexport const parseCommerceManifest = (raw: unknown) =>\n CommerceManifestSchema.parse(raw);\nexport function currentlyGrantedTools(\n grant: CommerceConversationGrant,\n eligibleCapabilityKeys: ReadonlySet<string>,\n enabledToolIds: ReadonlySet<string>,\n) {\n return grant.grantedTools.filter(\n (t) =>\n enabledToolIds.has(t.toolId) &&\n t.capabilityKeys.some((k) => eligibleCapabilityKeys.has(k)),\n );\n}\n"],"mappings":"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","names":["f"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
InternationalContextSchema
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-4KSODB2R.js";
|
|
4
4
|
|
|
5
5
|
// src/shopify/constants.ts
|
|
6
6
|
var SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V1 = 1;
|
|
@@ -410,4 +410,4 @@ export {
|
|
|
410
410
|
parseShopifyDiscountSyncJob,
|
|
411
411
|
safeParseShopifyDiscountSyncJob
|
|
412
412
|
};
|
|
413
|
-
//# sourceMappingURL=chunk-
|
|
413
|
+
//# sourceMappingURL=chunk-I4WVQ6D7.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
LanguageTagSchema,
|
|
3
3
|
canonicaliseLanguageTag
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-4KSODB2R.js";
|
|
5
5
|
|
|
6
6
|
// src/merchant-communications.ts
|
|
7
7
|
import { z } from "zod";
|
|
@@ -149,4 +149,4 @@ export {
|
|
|
149
149
|
TranslationReconcileJobSchema,
|
|
150
150
|
MERCHANT_COMMUNICATIONS_JOB_NAMES
|
|
151
151
|
};
|
|
152
|
-
//# sourceMappingURL=chunk-
|
|
152
|
+
//# sourceMappingURL=chunk-OU6ASX5V.js.map
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import {
|
|
2
|
+
canonicalJson
|
|
3
|
+
} from "./chunk-AUS3WQIW.js";
|
|
4
|
+
|
|
5
|
+
// src/commerce/model/index.ts
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
var COMMERCE_MODEL_CONFIGURATION_SCHEMA_VERSION = 1;
|
|
8
|
+
var COMMERCE_MODEL_CONFIGURATION_RESERVED_KEYS = [
|
|
9
|
+
"model",
|
|
10
|
+
"models",
|
|
11
|
+
"messages",
|
|
12
|
+
"tools",
|
|
13
|
+
"tool_choice",
|
|
14
|
+
"parallel_tool_calls",
|
|
15
|
+
"stream",
|
|
16
|
+
"stream_options",
|
|
17
|
+
"max_tokens",
|
|
18
|
+
"max_completion_tokens",
|
|
19
|
+
"response_format",
|
|
20
|
+
"api_key",
|
|
21
|
+
"apiKey",
|
|
22
|
+
"authorization",
|
|
23
|
+
"headers",
|
|
24
|
+
"base_url",
|
|
25
|
+
"baseURL",
|
|
26
|
+
"session_id",
|
|
27
|
+
"sessionId",
|
|
28
|
+
"trace",
|
|
29
|
+
"user",
|
|
30
|
+
"plugins",
|
|
31
|
+
"web_search_options",
|
|
32
|
+
"modalities"
|
|
33
|
+
];
|
|
34
|
+
var CommerceEnvironmentSchema = z.enum([
|
|
35
|
+
"LOCAL",
|
|
36
|
+
"TEST",
|
|
37
|
+
"DEVELOPMENT",
|
|
38
|
+
"STAGING",
|
|
39
|
+
"PRODUCTION"
|
|
40
|
+
]);
|
|
41
|
+
var CommerceModelAvailabilityScopeSchema = z.enum(["PLATFORM", "SHOP"]);
|
|
42
|
+
var CommerceModelAvailabilitySchema = z.discriminatedUnion("scope", [
|
|
43
|
+
z.strictObject({
|
|
44
|
+
id: z.string().min(1).max(128),
|
|
45
|
+
scope: z.literal("PLATFORM"),
|
|
46
|
+
shopId: z.null(),
|
|
47
|
+
enabled: z.boolean(),
|
|
48
|
+
editVersion: z.number().int().positive()
|
|
49
|
+
}),
|
|
50
|
+
z.strictObject({
|
|
51
|
+
id: z.string().min(1).max(128),
|
|
52
|
+
scope: z.literal("SHOP"),
|
|
53
|
+
shopId: z.string().min(1).max(128),
|
|
54
|
+
enabled: z.boolean(),
|
|
55
|
+
editVersion: z.number().int().positive()
|
|
56
|
+
})
|
|
57
|
+
]);
|
|
58
|
+
var CommerceModelProviderSchema = z.string().min(1).max(64).regex(/^[a-z0-9][a-z0-9._-]{0,63}$/);
|
|
59
|
+
var CommerceProviderModelIdSchema = z.string().min(1).max(255).regex(/^[^\s/]+$/);
|
|
60
|
+
function createOpenRouterModelId(input) {
|
|
61
|
+
return `${CommerceModelProviderSchema.parse(input.provider)}/${CommerceProviderModelIdSchema.parse(input.providerModelId)}`;
|
|
62
|
+
}
|
|
63
|
+
var prototypeKeys = /* @__PURE__ */ new Set(["__proto__", "prototype", "constructor"]);
|
|
64
|
+
var reservedKeys = new Set(COMMERCE_MODEL_CONFIGURATION_RESERVED_KEYS);
|
|
65
|
+
function validConfiguration(value) {
|
|
66
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) return false;
|
|
67
|
+
const rootPrototype = Object.getPrototypeOf(value);
|
|
68
|
+
if (rootPrototype !== Object.prototype && rootPrototype !== null) return false;
|
|
69
|
+
let nodes = 1;
|
|
70
|
+
let valid = true;
|
|
71
|
+
const visit = (entry, depth) => {
|
|
72
|
+
nodes += 1;
|
|
73
|
+
if (nodes > 2048 || depth > 8) {
|
|
74
|
+
valid = false;
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (entry === null || typeof entry === "boolean") return;
|
|
78
|
+
if (typeof entry === "number") {
|
|
79
|
+
if (!Number.isFinite(entry)) valid = false;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (typeof entry === "string") {
|
|
83
|
+
if (entry.length > 16384) valid = false;
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (Array.isArray(entry)) {
|
|
87
|
+
if (entry.length > 128 || Object.keys(entry).length !== entry.length) {
|
|
88
|
+
valid = false;
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
for (const item of entry) visit(item, depth + 1);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (typeof entry !== "object") {
|
|
95
|
+
valid = false;
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const prototype = Object.getPrototypeOf(entry);
|
|
99
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
100
|
+
valid = false;
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const keys2 = Object.keys(entry);
|
|
104
|
+
if (keys2.length > 128) {
|
|
105
|
+
valid = false;
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
for (const key of keys2) {
|
|
109
|
+
if (key.length > 128 || prototypeKeys.has(key)) valid = false;
|
|
110
|
+
visit(entry[key], depth + 1);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
const configuration = value;
|
|
114
|
+
const keys = Object.keys(configuration);
|
|
115
|
+
if (keys.length > 128) return false;
|
|
116
|
+
for (const key of keys) {
|
|
117
|
+
if (reservedKeys.has(key) || key.length > 128 || prototypeKeys.has(key)) valid = false;
|
|
118
|
+
visit(configuration[key], 1);
|
|
119
|
+
}
|
|
120
|
+
if (!valid) return false;
|
|
121
|
+
try {
|
|
122
|
+
return new TextEncoder().encode(canonicalJson(configuration)).length <= 32768;
|
|
123
|
+
} catch {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
var CommerceModelConfigurationSchema = z.custom(
|
|
128
|
+
validConfiguration,
|
|
129
|
+
{ message: "Invalid Commerce model configuration" }
|
|
130
|
+
);
|
|
131
|
+
var CommerceModelCatalogueEntrySchema = z.strictObject({
|
|
132
|
+
id: z.string().min(1).max(128),
|
|
133
|
+
availabilityId: z.string().min(1).max(128),
|
|
134
|
+
provider: CommerceModelProviderSchema,
|
|
135
|
+
providerModelId: CommerceProviderModelIdSchema,
|
|
136
|
+
displayName: z.string().min(1).max(160),
|
|
137
|
+
description: z.string().max(2e3),
|
|
138
|
+
configurationSchemaVersion: z.literal(COMMERCE_MODEL_CONFIGURATION_SCHEMA_VERSION),
|
|
139
|
+
configuration: CommerceModelConfigurationSchema,
|
|
140
|
+
enabled: z.boolean(),
|
|
141
|
+
editVersion: z.number().int().positive()
|
|
142
|
+
});
|
|
143
|
+
var CommerceAgentModelSelectionSchema = z.discriminatedUnion("scope", [
|
|
144
|
+
z.strictObject({
|
|
145
|
+
environment: CommerceEnvironmentSchema,
|
|
146
|
+
scope: z.literal("PLATFORM"),
|
|
147
|
+
shopId: z.null(),
|
|
148
|
+
modelId: z.string().min(1).max(128),
|
|
149
|
+
modelEditVersion: z.number().int().positive()
|
|
150
|
+
}),
|
|
151
|
+
z.strictObject({
|
|
152
|
+
environment: CommerceEnvironmentSchema,
|
|
153
|
+
scope: z.literal("SHOP"),
|
|
154
|
+
shopId: z.string().min(1).max(128),
|
|
155
|
+
modelId: z.string().min(1).max(128).nullable(),
|
|
156
|
+
modelEditVersion: z.number().int().positive()
|
|
157
|
+
})
|
|
158
|
+
]);
|
|
159
|
+
var CommerceModelSelectionSourceSchema = z.enum(["PLATFORM", "PRICING_PLAN", "SHOP"]);
|
|
160
|
+
var CommercePricingPlanModelAssignmentSchema = z.strictObject({
|
|
161
|
+
merchantPricingPlanId: z.string().min(1).max(128),
|
|
162
|
+
shopifyPlanHandle: z.string().trim().min(1).max(255),
|
|
163
|
+
modelId: z.string().min(1).max(128).nullable()
|
|
164
|
+
});
|
|
165
|
+
var ResolvedCommerceModelSchema = z.strictObject({
|
|
166
|
+
environment: CommerceEnvironmentSchema,
|
|
167
|
+
sourceScope: CommerceModelAvailabilityScopeSchema,
|
|
168
|
+
sourceShopId: z.string().min(1).max(128).nullable(),
|
|
169
|
+
catalogueEntryId: z.string().min(1).max(128),
|
|
170
|
+
provider: CommerceModelProviderSchema,
|
|
171
|
+
providerModelId: CommerceProviderModelIdSchema,
|
|
172
|
+
configurationSchemaVersion: z.literal(COMMERCE_MODEL_CONFIGURATION_SCHEMA_VERSION),
|
|
173
|
+
configuration: CommerceModelConfigurationSchema
|
|
174
|
+
});
|
|
175
|
+
var COMMERCE_OPENROUTER_CREDENTIAL_TYPE = "OPENROUTER";
|
|
176
|
+
var CommerceOpenRouterCredentialAadInputSchema = z.strictObject({
|
|
177
|
+
environment: CommerceEnvironmentSchema,
|
|
178
|
+
keyId: z.string().trim().min(1).max(64)
|
|
179
|
+
});
|
|
180
|
+
function createCommerceOpenRouterCredentialAad(input) {
|
|
181
|
+
const parsed = CommerceOpenRouterCredentialAadInputSchema.parse(input);
|
|
182
|
+
return canonicalJson({
|
|
183
|
+
credentialType: COMMERCE_OPENROUTER_CREDENTIAL_TYPE,
|
|
184
|
+
environment: parsed.environment,
|
|
185
|
+
keyId: parsed.keyId
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export {
|
|
190
|
+
COMMERCE_MODEL_CONFIGURATION_SCHEMA_VERSION,
|
|
191
|
+
COMMERCE_MODEL_CONFIGURATION_RESERVED_KEYS,
|
|
192
|
+
CommerceEnvironmentSchema,
|
|
193
|
+
CommerceModelAvailabilityScopeSchema,
|
|
194
|
+
CommerceModelAvailabilitySchema,
|
|
195
|
+
CommerceModelProviderSchema,
|
|
196
|
+
CommerceProviderModelIdSchema,
|
|
197
|
+
createOpenRouterModelId,
|
|
198
|
+
CommerceModelConfigurationSchema,
|
|
199
|
+
CommerceModelCatalogueEntrySchema,
|
|
200
|
+
CommerceAgentModelSelectionSchema,
|
|
201
|
+
CommerceModelSelectionSourceSchema,
|
|
202
|
+
CommercePricingPlanModelAssignmentSchema,
|
|
203
|
+
ResolvedCommerceModelSchema,
|
|
204
|
+
COMMERCE_OPENROUTER_CREDENTIAL_TYPE,
|
|
205
|
+
CommerceOpenRouterCredentialAadInputSchema,
|
|
206
|
+
createCommerceOpenRouterCredentialAad
|
|
207
|
+
};
|
|
208
|
+
//# sourceMappingURL=chunk-QD73OF2Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commerce/model/index.ts"],"sourcesContent":["import { z } from \"zod\";\n\nimport { canonicalJson } from \"../canonical-json.js\";\n\nexport const COMMERCE_MODEL_CONFIGURATION_SCHEMA_VERSION = 1 as const;\n\nexport const COMMERCE_MODEL_CONFIGURATION_RESERVED_KEYS = [\n \"model\", \"models\", \"messages\", \"tools\", \"tool_choice\", \"parallel_tool_calls\",\n \"stream\", \"stream_options\", \"max_tokens\", \"max_completion_tokens\", \"response_format\",\n \"api_key\", \"apiKey\", \"authorization\", \"headers\", \"base_url\", \"baseURL\",\n \"session_id\", \"sessionId\", \"trace\", \"user\", \"plugins\", \"web_search_options\", \"modalities\",\n] as const;\n\nexport const CommerceEnvironmentSchema = z.enum([\n \"LOCAL\", \"TEST\", \"DEVELOPMENT\", \"STAGING\", \"PRODUCTION\",\n]);\nexport type CommerceEnvironment = z.infer<typeof CommerceEnvironmentSchema>;\n\nexport const CommerceModelAvailabilityScopeSchema = z.enum([\"PLATFORM\", \"SHOP\"]);\nexport type CommerceModelAvailabilityScope = z.infer<typeof CommerceModelAvailabilityScopeSchema>;\n\nexport const CommerceModelAvailabilitySchema = z.discriminatedUnion(\"scope\", [\n z.strictObject({\n id: z.string().min(1).max(128), scope: z.literal(\"PLATFORM\"), shopId: z.null(),\n enabled: z.boolean(), editVersion: z.number().int().positive(),\n }),\n z.strictObject({\n id: z.string().min(1).max(128), scope: z.literal(\"SHOP\"),\n shopId: z.string().min(1).max(128), enabled: z.boolean(),\n editVersion: z.number().int().positive(),\n }),\n]);\nexport type CommerceModelAvailability = z.infer<typeof CommerceModelAvailabilitySchema>;\n\nexport const CommerceModelProviderSchema = z.string().min(1).max(64)\n .regex(/^[a-z0-9][a-z0-9._-]{0,63}$/);\nexport type CommerceModelProvider = z.infer<typeof CommerceModelProviderSchema>;\nexport const CommerceProviderModelIdSchema = z.string().min(1).max(255).regex(/^[^\\s/]+$/);\nexport type CommerceProviderModelId = z.infer<typeof CommerceProviderModelIdSchema>;\n\nexport function createOpenRouterModelId(input: {\n provider: CommerceModelProvider;\n providerModelId: CommerceProviderModelId;\n}): string {\n return `${CommerceModelProviderSchema.parse(input.provider)}/${CommerceProviderModelIdSchema.parse(input.providerModelId)}`;\n}\n\nexport type CommerceModelJsonValue = null | boolean | number | string |\n CommerceModelJsonValue[] | { [key: string]: CommerceModelJsonValue };\nexport type CommerceModelConfiguration = { [key: string]: CommerceModelJsonValue };\n\nconst prototypeKeys = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\nconst reservedKeys = new Set<string>(COMMERCE_MODEL_CONFIGURATION_RESERVED_KEYS);\n\nfunction validConfiguration(value: unknown): value is CommerceModelConfiguration {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const rootPrototype = Object.getPrototypeOf(value);\n if (rootPrototype !== Object.prototype && rootPrototype !== null) return false;\n let nodes = 1;\n let valid = true;\n const visit = (entry: unknown, depth: number): void => {\n nodes += 1;\n if (nodes > 2048 || depth > 8) { valid = false; return; }\n if (entry === null || typeof entry === \"boolean\") return;\n if (typeof entry === \"number\") { if (!Number.isFinite(entry)) valid = false; return; }\n if (typeof entry === \"string\") { if (entry.length > 16384) valid = false; return; }\n if (Array.isArray(entry)) {\n if (entry.length > 128 || Object.keys(entry).length !== entry.length) { valid = false; return; }\n for (const item of entry) visit(item, depth + 1);\n return;\n }\n if (typeof entry !== \"object\") { valid = false; return; }\n const prototype = Object.getPrototypeOf(entry);\n if (prototype !== Object.prototype && prototype !== null) { valid = false; return; }\n const keys = Object.keys(entry);\n if (keys.length > 128) { valid = false; return; }\n for (const key of keys) {\n if (key.length > 128 || prototypeKeys.has(key)) valid = false;\n visit((entry as Record<string, unknown>)[key], depth + 1);\n }\n };\n const configuration = value as Record<string, unknown>;\n const keys = Object.keys(configuration);\n if (keys.length > 128) return false;\n for (const key of keys) {\n if (reservedKeys.has(key) || key.length > 128 || prototypeKeys.has(key)) valid = false;\n visit(configuration[key], 1);\n }\n if (!valid) return false;\n try { return new TextEncoder().encode(canonicalJson(configuration)).length <= 32768; }\n catch { return false; }\n}\n\nexport const CommerceModelConfigurationSchema = z.custom<CommerceModelConfiguration>(\n validConfiguration, { message: \"Invalid Commerce model configuration\" },\n);\n\nexport const CommerceModelCatalogueEntrySchema = z.strictObject({\n id: z.string().min(1).max(128), availabilityId: z.string().min(1).max(128),\n provider: CommerceModelProviderSchema, providerModelId: CommerceProviderModelIdSchema,\n displayName: z.string().min(1).max(160), description: z.string().max(2000),\n configurationSchemaVersion: z.literal(COMMERCE_MODEL_CONFIGURATION_SCHEMA_VERSION),\n configuration: CommerceModelConfigurationSchema, enabled: z.boolean(),\n editVersion: z.number().int().positive(),\n});\nexport type CommerceModelCatalogueEntry = z.infer<typeof CommerceModelCatalogueEntrySchema>;\n\nexport const CommerceAgentModelSelectionSchema = z.discriminatedUnion(\"scope\", [\n z.strictObject({ environment: CommerceEnvironmentSchema, scope: z.literal(\"PLATFORM\"),\n shopId: z.null(), modelId: z.string().min(1).max(128), modelEditVersion: z.number().int().positive() }),\n z.strictObject({ environment: CommerceEnvironmentSchema, scope: z.literal(\"SHOP\"),\n shopId: z.string().min(1).max(128), modelId: z.string().min(1).max(128).nullable(),\n modelEditVersion: z.number().int().positive() }),\n]);\nexport type CommerceAgentModelSelection = z.infer<typeof CommerceAgentModelSelectionSchema>;\n\nexport const CommerceModelSelectionSourceSchema = z.enum([\"PLATFORM\", \"PRICING_PLAN\", \"SHOP\"]);\nexport type CommerceModelSelectionSource = z.infer<typeof CommerceModelSelectionSourceSchema>;\n\nexport const CommercePricingPlanModelAssignmentSchema = z.strictObject({\n merchantPricingPlanId: z.string().min(1).max(128),\n shopifyPlanHandle: z.string().trim().min(1).max(255),\n modelId: z.string().min(1).max(128).nullable(),\n});\nexport type CommercePricingPlanModelAssignment = z.infer<typeof CommercePricingPlanModelAssignmentSchema>;\n\nexport const ResolvedCommerceModelSchema = z.strictObject({\n environment: CommerceEnvironmentSchema, sourceScope: CommerceModelAvailabilityScopeSchema,\n sourceShopId: z.string().min(1).max(128).nullable(), catalogueEntryId: z.string().min(1).max(128),\n provider: CommerceModelProviderSchema, providerModelId: CommerceProviderModelIdSchema,\n configurationSchemaVersion: z.literal(COMMERCE_MODEL_CONFIGURATION_SCHEMA_VERSION),\n configuration: CommerceModelConfigurationSchema,\n});\nexport type ResolvedCommerceModel = z.infer<typeof ResolvedCommerceModelSchema>;\n\nexport const COMMERCE_OPENROUTER_CREDENTIAL_TYPE = \"OPENROUTER\" as const;\nexport const CommerceOpenRouterCredentialAadInputSchema = z.strictObject({\n environment: CommerceEnvironmentSchema, keyId: z.string().trim().min(1).max(64),\n});\nexport type CommerceOpenRouterCredentialAadInput = z.infer<typeof CommerceOpenRouterCredentialAadInputSchema>;\n\nexport function createCommerceOpenRouterCredentialAad(input: CommerceOpenRouterCredentialAadInput): string {\n const parsed = CommerceOpenRouterCredentialAadInputSchema.parse(input);\n return canonicalJson({\n credentialType: COMMERCE_OPENROUTER_CREDENTIAL_TYPE,\n environment: parsed.environment,\n keyId: parsed.keyId,\n });\n}"],"mappings":"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","names":["keys"]}
|