@modainteract/moda-interact-shared 5.2.0 → 5.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/{chunk-6OBYUIQ3.js → chunk-232YZOKK.js} +43 -1
- package/dist/chunk-232YZOKK.js.map +1 -0
- package/dist/{chunk-C2PCRWOW.js → chunk-XE2YVPQV.js} +3 -3
- package/dist/{chunk-C2PCRWOW.js.map → chunk-XE2YVPQV.js.map} +1 -1
- package/dist/commerce/index.d.ts +17 -2
- package/dist/commerce/index.js +8 -2
- package/dist/commerce/index.js.map +1 -1
- package/dist/commerce/model/node.d.ts +2 -2
- package/dist/commerce/model/node.js +1 -1
- package/dist/commerce/runner/index.d.ts +3 -3
- package/dist/commerce/runner/index.js +15 -4
- package/dist/commerce/runner/index.js.map +1 -1
- package/dist/internationalization.d.ts +2 -2
- package/dist/{response-k0hO3yus.d.ts → response-Bh-KzXOQ.d.ts} +149 -1
- package/dist/shopify/index.d.ts +23 -23
- package/dist/shopify/node.d.ts +12 -1
- package/dist/shopify/node.js +38 -4
- package/dist/shopify/node.js.map +1 -1
- package/dist/{types-BaLq_Wz6.d.ts → types-Bcrs9622.d.ts} +3 -1
- package/package.json +1 -1
- package/dist/chunk-6OBYUIQ3.js.map +0 -1
package/dist/shopify/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/shopify/node.ts","../../src/shopify/offline-token-provider.ts","../../src/shopify/oauth-configuration.ts"],"sourcesContent":["import { ShopifyWhatsAppConsentSyncJobV1Schema, type ShopifyWhatsAppConsentSyncJobV1 } from \"./whatsapp-consent-sync.schema.js\";\nimport { createHash } from \"node:crypto\";\n\nexport {\n ShopifyOfflineTokenError,\n createShopifyOfflineTokenProvider,\n type ShopifyOfflineTokenErrorCode,\n type ShopifyOfflineDatabase,\n type ShopifyOfflineTransaction,\n type ShopifyOfflineSessionDelegate,\n type ShopifyOfflineSessionRecord,\n type ShopifyOfflineSessionWhere,\n type ShopifyOfflineSessionScalarWhere,\n type ShopifyOfflineSessionUniqueWhere,\n type ShopifyOfflineSessionSelect,\n type ShopifyOfflineSessionData,\n type ShopifyOfflineSessionCreateData,\n type ShopifyOfflineStringFilter,\n type ShopifyOfflineBooleanFilter,\n type ShopifyOfflineNullableStringFilter,\n type ShopifyOfflineNullableBooleanFilter,\n type ShopifyOfflineDateFilter,\n type ShopifyOfflineBigIntFilter,\n type ShopifyOfflineShopRecord,\n type OfflineCredentialSnapshot,\n type LockedSessionContext,\n type SdkInstallationSessionContext,\n type ShopifyOfflineTokenProvider,\n} from \"./offline-token-provider.js\";\nexport {\n ShopifyOAuthConfigurationError,\n readShopifyOAuthConfiguration,\n type ShopifyOAuthConfigurationErrorCode,\n type ShopifyOAuthConfigurationPrisma,\n type ShopifyOAuthConfigurationRow,\n type ShopifyOAuthCredentials,\n} from \"./oauth-configuration.js\";\n\nfunction createShopifyWebhookJobDigest(prefix: string, first: string, second: string): string {\n if (typeof first !== \"string\" || first.length === 0) {\n throw new Error(`${prefix}: first input must be a non-empty string`);\n }\n\n if (typeof second !== \"string\" || second.length === 0) {\n throw new Error(`${prefix}: second input must be a non-empty string`);\n }\n\n const digest = createHash(\"sha256\").update(`${first}:${second}`).digest(\"hex\");\n return `${prefix}-${digest}`;\n}\n\n/**\n * Legacy webhook delivery job id used by earlier receipt/outbox flows.\n * Prefer the resource-scoped helpers below for current queue publication.\n */\nexport function createShopifyWebhookJobId(appKey: string, deliveryId: string): string {\n return createShopifyWebhookJobDigest(\"shopify\", appKey, deliveryId);\n}\n\nexport function createShopifyCheckoutJobId(shopId: string, checkoutToken: string): string {\n return createShopifyWebhookJobDigest(\"checkout\", shopId, checkoutToken);\n}\n\nexport function createShopifyOrderJobId(shopId: string, orderGid: string): string {\n return createShopifyWebhookJobDigest(\"order-created\", shopId, orderGid);\n}\n\nexport function createPendingRecoveryCandidateJobId(\n shopId: string,\n checkoutToken: string,\n): string {\n return createShopifyWebhookJobDigest(\"pending-recovery\", shopId, checkoutToken);\n}\n\nexport function createShopifyDiscountSyncJobId(event: {\n shopId: string;\n reason: \"SUBSCRIPTION_ACTIVATED\" | \"REINSTALL_RECONCILED\" | \"SCOPES_UPDATED\" | \"ADMIN_REQUESTED\" | \"DISCOUNT_WEBHOOK\";\n requestedAt: string;\n deliveryId?: string | null;\n}): string {\n if (typeof event.shopId !== \"string\" || event.shopId.trim().length === 0) {\n throw new Error(\"createShopifyDiscountSyncJobId: shopId must be a non-empty string\");\n }\n\n if (event.reason === \"DISCOUNT_WEBHOOK\") {\n if (typeof event.deliveryId !== \"string\" || event.deliveryId.trim().length === 0) {\n throw new Error(\"createShopifyDiscountSyncJobId: deliveryId is required for DISCOUNT_WEBHOOK\");\n }\n return createShopifyWebhookJobDigest(\"discount-sync\", event.shopId, event.deliveryId);\n }\n\n if (typeof event.requestedAt !== \"string\" || event.requestedAt.trim().length === 0) {\n throw new Error(\"createShopifyDiscountSyncJobId: requestedAt must be a non-empty ISO datetime string\");\n }\n\n return createShopifyWebhookJobDigest(\"discount-sync\", `${event.shopId}:${event.reason}`, event.requestedAt);\n}\n\n/**\n * One deduplication identity per authenticated shop + webhook delivery.\n * Length-safe JSON tuple serialization avoids `a:b` vs `a`/`b:c` collisions;\n * the job ID never reveals the customer ID, delivery ID or phone.\n */\nexport function createShopifyWhatsAppConsentSyncJobId(\n input: ShopifyWhatsAppConsentSyncJobV1,\n): string {\n const job = ShopifyWhatsAppConsentSyncJobV1Schema.parse(input);\n const digest = createHash(\"sha256\")\n .update(JSON.stringify([job.shopId, job.deliveryId]))\n .digest(\"hex\");\n return `shopify-whatsapp-consent-sync-${digest}`;\n}\n","import { Buffer } from \"node:buffer\";\n\nexport type ShopifyOfflineTokenErrorCode =\n | \"SESSION_MISSING\" | \"SESSION_IDENTITY_CONFLICT\" | \"INVALID_SESSION\"\n | \"REFRESH_TOKEN_EXPIRED\" | \"OAUTH_CONFIG_UNAVAILABLE\" | \"LOCK_TIMEOUT\"\n | \"CANCELLED\" | \"DEADLINE\" | \"REFRESH_REJECTED\"\n | \"REFRESH_RESPONSE_INVALID\" | \"REFRESH_OUTCOME_UNKNOWN\" | \"PERSISTENCE_UNAVAILABLE\";\n\nconst ERROR_MESSAGES: Record<ShopifyOfflineTokenErrorCode, string> = {\n SESSION_MISSING: \"Shopify offline session is unavailable.\",\n SESSION_IDENTITY_CONFLICT: \"Shopify offline session identity is inconsistent.\",\n INVALID_SESSION: \"Shopify offline session is invalid.\",\n REFRESH_TOKEN_EXPIRED: \"Shopify offline refresh token has expired.\",\n OAUTH_CONFIG_UNAVAILABLE: \"Shopify OAuth configuration is unavailable.\",\n LOCK_TIMEOUT: \"Shopify offline session is busy; retry the request.\",\n CANCELLED: \"Shopify offline session request was cancelled.\",\n DEADLINE: \"Shopify offline session operation exceeded its time limit.\",\n REFRESH_REJECTED: \"Shopify rejected the offline refresh request.\",\n REFRESH_RESPONSE_INVALID: \"Shopify returned an invalid offline refresh response.\",\n REFRESH_OUTCOME_UNKNOWN: \"Shopify refresh outcome is unknown; retry in a later request.\",\n PERSISTENCE_UNAVAILABLE: \"Shopify offline session could not be persisted.\",\n};\n\nconst RETRYABLE = new Set<ShopifyOfflineTokenErrorCode>([\n \"LOCK_TIMEOUT\", \"DEADLINE\", \"PERSISTENCE_UNAVAILABLE\", \"REFRESH_OUTCOME_UNKNOWN\",\n]);\n\nexport class ShopifyOfflineTokenError extends Error {\n readonly code: ShopifyOfflineTokenErrorCode;\n readonly retryable: boolean;\n\n constructor(code: ShopifyOfflineTokenErrorCode) {\n super(ERROR_MESSAGES[code]);\n this.name = \"ShopifyOfflineTokenError\";\n this.code = code;\n this.retryable = RETRYABLE.has(code);\n }\n}\n\nclass CallbackFailure extends Error {\n constructor(readonly value: unknown) { super(\"Shopify offline callback failed.\"); }\n}\n\nexport type ShopifyOfflineSessionRecord = Readonly<{\n id: string; shop: string; isOnline: boolean; accessToken: string | null; refreshToken: string | null;\n scope: string | null; expires: Date | null; refreshTokenExpires: Date | null;\n}>;\nexport type ShopifyOfflineShopRecord = Readonly<{\n id: string; domain: string; platform: string; status: string;\n}>;\n\nexport type ShopifyOfflineStringFilter = string | Readonly<{\n equals?: string; in?: string[]; notIn?: string[]; lt?: string; lte?: string; gt?: string; gte?: string;\n contains?: string; startsWith?: string; endsWith?: string; mode?: \"default\" | \"insensitive\";\n not?: string | ShopifyOfflineStringFilter;\n}>;\nexport type ShopifyOfflineBooleanFilter = boolean | Readonly<{ equals?: boolean; not?: boolean | ShopifyOfflineBooleanFilter }>;\nexport type ShopifyOfflineNullableStringFilter = string | null | Readonly<{\n equals?: string | null; in?: string[] | null; notIn?: string[] | null; lt?: string; lte?: string; gt?: string; gte?: string;\n contains?: string; startsWith?: string; endsWith?: string; mode?: \"default\" | \"insensitive\";\n not?: string | null | ShopifyOfflineNullableStringFilter;\n}>;\nexport type ShopifyOfflineNullableBooleanFilter = boolean | null | Readonly<{\n equals?: boolean | null; not?: boolean | null | ShopifyOfflineNullableBooleanFilter;\n}>;\nexport type ShopifyOfflineDateFilter = Date | string | null | Readonly<{\n equals?: Date | string | null; in?: Date[] | string[] | null; notIn?: Date[] | string[] | null;\n lt?: Date | string; lte?: Date | string; gt?: Date | string; gte?: Date | string;\n not?: Date | string | null | ShopifyOfflineDateFilter;\n}>;\nexport type ShopifyOfflineBigIntFilter = bigint | number | null | Readonly<{\n equals?: bigint | number | null; in?: bigint[] | number[] | null; notIn?: bigint[] | number[] | null;\n lt?: bigint | number; lte?: bigint | number; gt?: bigint | number; gte?: bigint | number;\n not?: bigint | number | null | ShopifyOfflineBigIntFilter;\n}>;\nexport type ShopifyOfflineSessionScalarWhere = {\n id?: ShopifyOfflineStringFilter;\n shop?: ShopifyOfflineStringFilter;\n state?: ShopifyOfflineStringFilter;\n isOnline?: ShopifyOfflineBooleanFilter;\n scope?: ShopifyOfflineNullableStringFilter;\n expires?: ShopifyOfflineDateFilter;\n accessToken?: ShopifyOfflineStringFilter;\n userId?: ShopifyOfflineBigIntFilter;\n firstName?: ShopifyOfflineNullableStringFilter;\n lastName?: ShopifyOfflineNullableStringFilter;\n email?: ShopifyOfflineNullableStringFilter;\n accountOwner?: ShopifyOfflineBooleanFilter;\n locale?: ShopifyOfflineNullableStringFilter;\n collaborator?: ShopifyOfflineNullableBooleanFilter;\n emailVerified?: ShopifyOfflineNullableBooleanFilter;\n refreshToken?: ShopifyOfflineNullableStringFilter;\n refreshTokenExpires?: ShopifyOfflineDateFilter;\n};\nexport type ShopifyOfflineSessionWhere = ShopifyOfflineSessionScalarWhere & {\n AND?: ShopifyOfflineSessionScalarWhere | ShopifyOfflineSessionScalarWhere[];\n OR?: ShopifyOfflineSessionScalarWhere[];\n NOT?: ShopifyOfflineSessionScalarWhere | ShopifyOfflineSessionScalarWhere[];\n};\nexport type ShopifyOfflineSessionUniqueWhere = Readonly<{ id: string }>;\nexport type ShopifyOfflineSessionSelect = Readonly<Partial<Record<\n \"id\" | \"shop\" | \"state\" | \"isOnline\" | \"scope\" | \"expires\" | \"accessToken\" | \"userId\"\n | \"firstName\" | \"lastName\" | \"email\" | \"accountOwner\" | \"locale\" | \"collaborator\"\n | \"emailVerified\" | \"refreshToken\" | \"refreshTokenExpires\",\n true\n>>>;\nexport type ShopifyOfflineSessionData = Readonly<{\n id?: string;\n shop?: string;\n state?: string;\n isOnline?: boolean;\n scope?: string | null;\n expires?: Date | null;\n accessToken?: string;\n userId?: bigint | null;\n firstName?: string | null;\n lastName?: string | null;\n email?: string | null;\n accountOwner?: boolean;\n locale?: string | null;\n collaborator?: boolean | null;\n emailVerified?: boolean | null;\n refreshToken?: string | null;\n refreshTokenExpires?: Date | null;\n}>;\nexport type ShopifyOfflineSessionCreateData = ShopifyOfflineSessionData & Readonly<{\n id: string;\n shop: string;\n state: string;\n accessToken: string;\n}>;\nexport type ShopifyOfflineSessionDelegate = Readonly<{\n findUnique(args: Readonly<{ where: ShopifyOfflineSessionUniqueWhere; select?: ShopifyOfflineSessionSelect }>): Promise<ShopifyOfflineSessionRecord | null>;\n findMany(args: Readonly<{ where: ShopifyOfflineSessionWhere; select?: ShopifyOfflineSessionSelect; take?: number }>): Promise<ShopifyOfflineSessionRecord[]>;\n create(args: Readonly<{ data: ShopifyOfflineSessionCreateData; select?: ShopifyOfflineSessionSelect }>): Promise<ShopifyOfflineSessionRecord>;\n update(args: Readonly<{ where: ShopifyOfflineSessionUniqueWhere; data: ShopifyOfflineSessionData; select?: ShopifyOfflineSessionSelect }>): Promise<ShopifyOfflineSessionRecord>;\n upsert(args: Readonly<{ where: ShopifyOfflineSessionUniqueWhere; create: ShopifyOfflineSessionCreateData; update: ShopifyOfflineSessionData; select?: ShopifyOfflineSessionSelect }>): Promise<ShopifyOfflineSessionRecord>;\n delete(args: Readonly<{ where: ShopifyOfflineSessionUniqueWhere; select?: ShopifyOfflineSessionSelect }>): Promise<ShopifyOfflineSessionRecord>;\n deleteMany(args: Readonly<{ where?: ShopifyOfflineSessionWhere }>): Promise<{ count: number }>;\n updateMany(args: Readonly<{ where?: ShopifyOfflineSessionWhere; data: ShopifyOfflineSessionData }>): Promise<{ count: number }>;\n}>;\n\nexport type ShopifyOfflineTransaction = Readonly<{\n $queryRawUnsafe<T = unknown>(sql: string, ...values: unknown[]): Promise<T>;\n $executeRawUnsafe(sql: string, ...values: unknown[]): Promise<number>;\n session: ShopifyOfflineSessionDelegate;\n shop: Readonly<{\n findUnique(args: Readonly<{ where: Readonly<{ id: string }>; select: Readonly<{ id: true; domain: true; platform: true; status: true }> }>): Promise<ShopifyOfflineShopRecord | null>;\n }>;\n}>;\n\nexport type ShopifyOfflineDatabase = Readonly<{\n $transaction<T>(\n work: (transaction: ShopifyOfflineTransaction) => Promise<T>,\n options: Readonly<{ maxWait: 5000; timeout: 20000; isolationLevel: \"ReadCommitted\" }>,\n ): Promise<T>;\n shop: ShopifyOfflineTransaction[\"shop\"];\n}>;\n\nexport type OfflineCredentialSnapshot = Readonly<{\n id: string; shopId: string; shop: string; accessToken: string; scope: string | null;\n expires: Date | null; refreshTokenExpires: Date | null;\n}>;\nexport type LockedSessionContext = Readonly<{\n transaction: ShopifyOfflineTransaction; shopId: string; shop: string; sessionId: string; signal: AbortSignal;\n}>;\nexport type SdkInstallationSessionContext = Readonly<{\n transaction: ShopifyOfflineTransaction; shopId: null; shop: string; sessionId: string | null; signal: AbortSignal;\n}>;\nexport type ShopifyOfflineTokenProvider = Readonly<{\n withSdkInstallationSessionLock<T>(integrationDomain: string, work: (context: SdkInstallationSessionContext) => Promise<T>): Promise<T>;\n getAccessToken(shopId: string, options?: Readonly<{ signal?: AbortSignal }>): Promise<string>;\n getSession(shopId: string, options?: Readonly<{ signal?: AbortSignal }>): Promise<OfflineCredentialSnapshot>;\n withSessionLock<T>(shopId: string, work: (context: LockedSessionContext) => Promise<T>, options?: Readonly<{ signal?: AbortSignal }>): Promise<T>;\n}>;\n\ntype PersistedShop = ShopifyOfflineShopRecord;\nconst TX_OPTIONS = { maxWait: 5000, timeout: 20000, isolationLevel: \"ReadCommitted\" } as const;\nconst ACCESS_REFRESH_SKEW_MS = 320_000;\nconst REFRESH_NETWORK_BUDGET_MS = 8_000;\nconst OPERATION_BUDGET_MS = 15_000;\nconst RESPONSE_LIMIT = 16_384;\nconst CONTROL = /[\\u0000-\\u001f\\u007f]/;\nconst SESSION_SELECT = { id: true, shop: true, isOnline: true, accessToken: true, refreshToken: true, scope: true, expires: true, refreshTokenExpires: true } as const;\n\nfunction fail(code: ShopifyOfflineTokenErrorCode): never { throw new ShopifyOfflineTokenError(code); }\nfunction isRecord(value: unknown): value is Record<string, unknown> { return typeof value === \"object\" && value !== null && !Array.isArray(value); }\nfunction validToken(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0 && value.length <= 4096 && value.trim() === value && !/[\\r\\n\\u0000]/.test(value);\n}\nfunction validScope(value: unknown): value is string { return typeof value === \"string\" && value.length <= 4096 && !CONTROL.test(value); }\nfunction validDate(value: unknown): value is Date | null { return value === null || (value instanceof Date && Number.isFinite(value.getTime())); }\nfunction mapDatabaseError(error: unknown): ShopifyOfflineTokenError {\n const code = isRecord(error) && typeof error.code === \"string\" ? error.code : \"\";\n const message = error instanceof Error ? error.message : \"\";\n if (code === \"55P03\" || /lock timeout/i.test(message)) return new ShopifyOfflineTokenError(\"LOCK_TIMEOUT\");\n if (code === \"57014\" || /statement timeout|statement timed out/i.test(message)) return new ShopifyOfflineTokenError(\"DEADLINE\");\n return new ShopifyOfflineTokenError(\"PERSISTENCE_UNAVAILABLE\");\n}\n\nfunction createDeadline(signal?: AbortSignal): Readonly<{ signal: AbortSignal; dispose(): void; check(): void; wait<T>(work: Promise<T>): Promise<T> }> {\n const controller = new AbortController();\n let expired = false;\n const timer = setTimeout(() => { expired = true; controller.abort(); }, OPERATION_BUDGET_MS);\n const onAbort = () => controller.abort(signal?.reason);\n if (signal?.aborted) onAbort();\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n return {\n signal: controller.signal,\n dispose() { clearTimeout(timer); signal?.removeEventListener(\"abort\", onAbort); },\n wait<T>(work: Promise<T>): Promise<T> {\n if (controller.signal.aborted) this.check();\n let onDeadline: (() => void) | undefined;\n const aborted = new Promise<never>((_resolve, reject) => {\n onDeadline = () => reject(new Error(\"operation aborted\"));\n controller.signal.addEventListener(\"abort\", onDeadline, { once: true });\n });\n return Promise.race([work, aborted]).finally(() => {\n if (onDeadline) controller.signal.removeEventListener(\"abort\", onDeadline);\n });\n },\n check() {\n if (signal?.aborted) fail(\"CANCELLED\");\n if (expired) fail(\"DEADLINE\");\n if (controller.signal.aborted) fail(\"DEADLINE\");\n },\n };\n}\n\nasync function readBoundedBody(response: Response, signal: AbortSignal): Promise<string> {\n if (!response.body) return \"\";\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n try {\n while (true) {\n if (signal.aborted) throw new Error(\"refresh stream aborted\");\n const { done, value } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (size > RESPONSE_LIMIT) {\n await reader.cancel().catch(() => undefined);\n fail(\"REFRESH_OUTCOME_UNKNOWN\");\n }\n chunks.push(value);\n }\n } finally { reader.releaseLock(); }\n return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk))).toString(\"utf8\");\n}\n\nfunction snapshot(row: ShopifyOfflineSessionRecord, shopId: string, shop: string): OfflineCredentialSnapshot {\n if (!validToken(row.accessToken) || !validScope(row.scope) && row.scope !== null\n || !validDate(row.expires) || !validDate(row.refreshTokenExpires)) fail(\"INVALID_SESSION\");\n return Object.freeze({ id: row.id, shopId, shop, accessToken: row.accessToken, scope: row.scope, expires: row.expires, refreshTokenExpires: row.refreshTokenExpires });\n}\n\nexport function createShopifyOfflineTokenProvider(input: Readonly<{\n prisma: ShopifyOfflineDatabase;\n readOAuth: () => Promise<Readonly<{ apiKey: string; apiSecret: string }>>;\n fetch: typeof fetch;\n now?: () => number;\n}>): ShopifyOfflineTokenProvider {\n const now = input.now ?? Date.now;\n\n async function resolveShop(shopId: string, deadline: ReturnType<typeof createDeadline>): Promise<PersistedShop> {\n deadline.check();\n if (typeof shopId !== \"string\" || !shopId.trim()) fail(\"SESSION_MISSING\");\n let shop: PersistedShop | null;\n try {\n shop = await deadline.wait(input.prisma.shop.findUnique({ where: { id: shopId }, select: { id: true, domain: true, platform: true, status: true } }));\n } catch (error) {\n deadline.check();\n throw mapDatabaseError(error);\n }\n deadline.check();\n if (!shop) fail(\"SESSION_MISSING\");\n if (shop.platform !== \"SHOPIFY\" || shop.status !== \"ACTIVE\") fail(\"INVALID_SESSION\");\n if (!shop.domain) fail(\"SESSION_IDENTITY_CONFLICT\");\n return shop;\n }\n\n async function runLocked<T>(shop: PersistedShop, shopId: string, deadline: ReturnType<typeof createDeadline>, work: (context: LockedSessionContext) => Promise<T>, outcome: { remoteSucceeded: boolean } = { remoteSucceeded: false }): Promise<T> {\n try {\n deadline.check();\n const result = await deadline.wait(input.prisma.$transaction(async (tx) => {\n await tx.$executeRawUnsafe(\"SET LOCAL lock_timeout = '5s'\");\n await tx.$executeRawUnsafe(\"SET LOCAL statement_timeout = '18s'\");\n await tx.$queryRawUnsafe(\"SELECT pg_advisory_xact_lock(hashtextextended($1, 0)) IS NULL\", `moda:shopify-offline:v1:${shop.domain}`);\n deadline.check();\n\n const currentShop = await tx.shop.findUnique({ where: { id: shopId }, select: { id: true, domain: true, platform: true, status: true } });\n if (!currentShop) fail(\"SESSION_MISSING\");\n if (currentShop.platform !== \"SHOPIFY\" || currentShop.status !== \"ACTIVE\") fail(\"INVALID_SESSION\");\n if (currentShop.domain !== shop.domain) fail(\"SESSION_IDENTITY_CONFLICT\");\n\n const sessions = await tx.session.findMany({ where: { shop: currentShop.domain, isOnline: false }, select: SESSION_SELECT, take: 2 });\n if (sessions.length === 0) fail(\"SESSION_MISSING\");\n if (sessions.length !== 1) fail(\"SESSION_IDENTITY_CONFLICT\");\n const row = sessions[0]!;\n if (!row.id || row.shop !== currentShop.domain || row.isOnline !== false) fail(\"SESSION_IDENTITY_CONFLICT\");\n await tx.$queryRawUnsafe('SELECT \"id\" FROM \"shopify\".\"Session\" WHERE \"id\" = $1 FOR UPDATE', row.id);\n const reread = await tx.session.findUnique({ where: { id: row.id }, select: SESSION_SELECT });\n if (!reread || reread.id !== row.id || reread.shop !== currentShop.domain || reread.isOnline !== false) fail(\"SESSION_IDENTITY_CONFLICT\");\n\n const context: LockedSessionContext = Object.freeze({ transaction: tx, shopId, shop: currentShop.domain, sessionId: reread.id, signal: deadline.signal });\n deadline.check();\n let value: T;\n try { value = await deadline.wait(work(context)); }\n catch (error) { deadline.check(); throw new CallbackFailure(error); }\n deadline.check();\n return value;\n }, TX_OPTIONS));\n return result;\n } catch (error) {\n if (error instanceof CallbackFailure) throw error.value;\n if (deadline.signal.aborted) deadline.check();\n if (outcome.remoteSucceeded && (error instanceof ShopifyOfflineTokenError\n ? error.code === \"LOCK_TIMEOUT\" || error.code === \"DEADLINE\" || error.code === \"PERSISTENCE_UNAVAILABLE\"\n : true)) fail(\"REFRESH_OUTCOME_UNKNOWN\");\n if (error instanceof ShopifyOfflineTokenError) throw error;\n deadline.check();\n throw mapDatabaseError(error);\n }\n }\n\n async function getSession(shopId: string, options?: Readonly<{ signal?: AbortSignal }>): Promise<OfflineCredentialSnapshot> {\n const deadline = createDeadline(options?.signal);\n try {\n deadline.check();\n const shop = await resolveShop(shopId, deadline);\n deadline.check();\n const outcome = { remoteSucceeded: false };\n return await runLocked(shop, shopId, deadline, async (context) => {\n let row = await context.transaction.session.findUnique({ where: { id: context.sessionId }, select: SESSION_SELECT });\n if (!row) fail(\"SESSION_IDENTITY_CONFLICT\");\n const currentTime = now();\n if (!Number.isFinite(currentTime)) fail(\"INVALID_SESSION\");\n if (row.expires === null && row.refreshToken === null) return snapshot(row, shopId, context.shop);\n if (row.expires === null) fail(\"INVALID_SESSION\");\n const expiresAt = row.expires?.getTime() ?? 0;\n if (expiresAt - currentTime > ACCESS_REFRESH_SKEW_MS) return snapshot(row, shopId, context.shop);\n if (!validToken(row.refreshToken)) fail(\"INVALID_SESSION\");\n if (!validDate(row.refreshTokenExpires) || row.refreshTokenExpires === null) fail(\"INVALID_SESSION\");\n if (row.refreshTokenExpires.getTime() <= currentTime) fail(\"REFRESH_TOKEN_EXPIRED\");\n\n let credentials: Readonly<{ apiKey: string; apiSecret: string }>;\n try { credentials = await input.readOAuth(); }\n catch { fail(\"OAUTH_CONFIG_UNAVAILABLE\"); }\n if (options?.signal?.aborted) fail(\"CANCELLED\");\n if (context.signal.aborted) fail(\"DEADLINE\");\n if (!validToken(credentials.apiKey) || !validToken(credentials.apiSecret)) fail(\"OAUTH_CONFIG_UNAVAILABLE\");\n const requestStartedAt = now();\n const refreshController = new AbortController();\n const refreshTimeout = setTimeout(() => refreshController.abort(), REFRESH_NETWORK_BUDGET_MS);\n const onAbort = () => refreshController.abort();\n context.signal.addEventListener(\"abort\", onAbort, { once: true });\n let response: Response;\n try {\n const form = new URLSearchParams({ client_id: credentials.apiKey, client_secret: credentials.apiSecret, grant_type: \"refresh_token\", refresh_token: row.refreshToken });\n response = await input.fetch(`https://${context.shop}/admin/oauth/access_token`, {\n method: \"POST\", redirect: \"error\", headers: { \"content-type\": \"application/x-www-form-urlencoded\" }, body: form, signal: refreshController.signal,\n });\n } catch {\n clearTimeout(refreshTimeout);\n context.signal.removeEventListener(\"abort\", onAbort);\n if (options?.signal?.aborted) fail(\"CANCELLED\");\n if (context.signal.aborted) fail(\"REFRESH_OUTCOME_UNKNOWN\");\n fail(\"REFRESH_OUTCOME_UNKNOWN\");\n }\n if (response.status >= 400 && response.status < 500) fail(\"REFRESH_REJECTED\");\n if (!response.ok) { outcome.remoteSucceeded = true; fail(\"REFRESH_OUTCOME_UNKNOWN\"); }\n outcome.remoteSucceeded = true;\n let raw: string;\n try { raw = await readBoundedBody(response, refreshController.signal); }\n catch (error) {\n clearTimeout(refreshTimeout);\n context.signal.removeEventListener(\"abort\", onAbort);\n if (options?.signal?.aborted) fail(\"CANCELLED\");\n if (context.signal.aborted) fail(\"REFRESH_OUTCOME_UNKNOWN\");\n fail(\"REFRESH_OUTCOME_UNKNOWN\");\n } finally {\n clearTimeout(refreshTimeout);\n context.signal.removeEventListener(\"abort\", onAbort);\n }\n let payload: unknown;\n try { payload = JSON.parse(raw) as unknown; } catch { fail(\"REFRESH_OUTCOME_UNKNOWN\"); }\n if (!isRecord(payload) || !validToken(payload.access_token) || !validToken(payload.refresh_token)\n || !Number.isSafeInteger(payload.expires_in) || (payload.expires_in as number) <= 0 || (payload.expires_in as number) > 86_400\n || !Number.isSafeInteger(payload.refresh_token_expires_in) || (payload.refresh_token_expires_in as number) <= 0 || (payload.refresh_token_expires_in as number) > 7_776_000\n || (payload.expires_in as number) <= 320\n || (payload.scope !== undefined && !validScope(payload.scope))) fail(\"REFRESH_OUTCOME_UNKNOWN\");\n const expires = requestStartedAt + (payload.expires_in as number) * 1000;\n const refreshTokenExpires = requestStartedAt + (payload.refresh_token_expires_in as number) * 1000;\n if (!Number.isFinite(expires) || !Number.isFinite(refreshTokenExpires) || Number.isNaN(new Date(expires).getTime()) || Number.isNaN(new Date(refreshTokenExpires).getTime())) fail(\"REFRESH_OUTCOME_UNKNOWN\");\n const scope = payload.scope === undefined ? row.scope : payload.scope as string;\n try {\n row = await context.transaction.session.update({ where: { id: row.id }, data: {\n accessToken: payload.access_token, expires: new Date(expires), refreshToken: payload.refresh_token,\n refreshTokenExpires: new Date(refreshTokenExpires), scope,\n }, select: SESSION_SELECT });\n } catch { outcome.remoteSucceeded = true; throw new ShopifyOfflineTokenError(\"REFRESH_OUTCOME_UNKNOWN\"); }\n outcome.remoteSucceeded = true;\n return snapshot(row, shopId, context.shop);\n }, outcome);\n } catch (error) {\n deadline.check();\n throw error;\n } finally { deadline.dispose(); }\n }\n\n async function withSessionLock<T>(shopId: string, work: (context: LockedSessionContext) => Promise<T>, options?: Readonly<{ signal?: AbortSignal }>): Promise<T> {\n const deadline = createDeadline(options?.signal);\n try {\n deadline.check();\n const shop = await resolveShop(shopId, deadline);\n deadline.check();\n return await runLocked(shop, shopId, deadline, work);\n } catch (error) {\n deadline.check();\n throw error;\n } finally { deadline.dispose(); }\n }\n\n async function withSdkInstallationSessionLock<T>(integrationDomain: string, work: (context: SdkInstallationSessionContext) => Promise<T>): Promise<T> {\n if (typeof integrationDomain !== \"string\" || !integrationDomain.trim()) fail(\"INVALID_SESSION\");\n const deadline = createDeadline();\n try {\n return await input.prisma.$transaction(async (tx) => {\n await tx.$executeRawUnsafe(\"SET LOCAL lock_timeout = '5s'\");\n await tx.$executeRawUnsafe(\"SET LOCAL statement_timeout = '18s'\");\n await tx.$queryRawUnsafe(\"SELECT pg_advisory_xact_lock(hashtextextended($1, 0)) IS NULL\", `moda:shopify-offline:v1:${integrationDomain}`);\n let value: T;\n try { value = await deadline.wait(work(Object.freeze({ transaction: tx, shopId: null, shop: integrationDomain, sessionId: null, signal: deadline.signal }))); }\n catch (error) { deadline.check(); throw new CallbackFailure(error); }\n deadline.check();\n return value;\n }, TX_OPTIONS);\n } catch (error) {\n if (error instanceof CallbackFailure) throw error.value;\n if (error instanceof ShopifyOfflineTokenError) throw error;\n if (deadline.signal.aborted) deadline.check();\n throw mapDatabaseError(error);\n } finally { deadline.dispose(); }\n }\n\n return Object.freeze({\n withSdkInstallationSessionLock,\n getAccessToken: async (shopId: string, options?: Readonly<{ signal?: AbortSignal }>) => (await getSession(shopId, options)).accessToken,\n getSession,\n withSessionLock,\n });\n}\n","import { Buffer } from \"node:buffer\";\nimport {\n decryptCredential,\n type CredentialEnvelope,\n type CredentialKeyring,\n} from \"../security/credentials/node.js\";\n\nconst CONFIGURATION_KEY = \"shopify.oauth\" as const;\nconst CONFIGURATION_ENVIRONMENTS = new Set([\"local\", \"test\", \"development\", \"staging\", \"production\"]);\nconst ENVELOPE_KEYS = [\"kind\", \"schemaVersion\", \"algorithm\", \"wrappingKeyId\", \"nonce\", \"ciphertext\", \"authTag\"] as const;\nconst RESERVED_KEY_IDS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\nconst KEY_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;\nconst BASE64_PATTERN = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;\nconst CONTROL_CHARACTERS = /[\\u0000-\\u001f\\u007f]/;\n\nexport type ShopifyOAuthConfigurationErrorCode =\n | \"INVALID_ENVIRONMENT\"\n | \"CONFIGURATION_UNAVAILABLE\"\n | \"CONFIGURATION_INVALID\";\n\nconst ERROR_MESSAGES: Record<ShopifyOAuthConfigurationErrorCode, string> = {\n INVALID_ENVIRONMENT: \"Shopify OAuth configuration is unavailable.\",\n CONFIGURATION_UNAVAILABLE: \"Shopify OAuth configuration is unavailable.\",\n CONFIGURATION_INVALID: \"Shopify OAuth configuration is invalid.\",\n};\n\n/** Safe configuration boundary error; never contains a row, key, or decrypt cause. */\nexport class ShopifyOAuthConfigurationError extends Error {\n readonly code: ShopifyOAuthConfigurationErrorCode;\n\n constructor(code: ShopifyOAuthConfigurationErrorCode) {\n super(ERROR_MESSAGES[code]);\n this.name = \"ShopifyOAuthConfigurationError\";\n this.code = code;\n }\n}\n\nexport type ShopifyOAuthConfigurationRow = Readonly<{\n environment: string;\n key: string;\n version: number;\n value: unknown;\n}>;\n\nexport type ShopifyOAuthConfigurationPrisma = Readonly<{\n platformConfiguration: Readonly<{\n findUnique(args: Readonly<{\n where: Readonly<{ environment_key: Readonly<{ environment: string; key: typeof CONFIGURATION_KEY }> }>;\n select: Readonly<{ environment: true; key: true; version: true; value: true }>;\n }>): Promise<ShopifyOAuthConfigurationRow | null>;\n }>;\n}>;\n\nexport type ShopifyOAuthCredentials = Readonly<{\n apiKey: string;\n apiSecret: string;\n}>;\n\nfunction configurationFailure(code: ShopifyOAuthConfigurationErrorCode): never {\n throw new ShopifyOAuthConfigurationError(code);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const actual = Object.keys(value);\n return actual.length === expected.length && actual.every((key) => expected.includes(key));\n}\n\nfunction canonicalBase64(value: unknown, exactLength: number | null): Uint8Array | null {\n if (typeof value !== \"string\" || value.length === 0 || !BASE64_PATTERN.test(value)) return null;\n const decoded = Buffer.from(value, \"base64\");\n if (decoded.length < 1 || decoded.length > 8192 || decoded.toString(\"base64\") !== value) return null;\n if (exactLength !== null && decoded.length !== exactLength) return null;\n return Uint8Array.from(decoded);\n}\n\nfunction parseSealedEnvelope(value: unknown): CredentialEnvelope {\n if (!isRecord(value) || !hasExactKeys(value, ENVELOPE_KEYS)\n || value.kind !== \"sealed\"\n || value.schemaVersion !== 1\n || value.algorithm !== \"AES-256-GCM\"\n || typeof value.wrappingKeyId !== \"string\"\n || !KEY_ID_PATTERN.test(value.wrappingKeyId)\n || RESERVED_KEY_IDS.has(value.wrappingKeyId)) {\n return configurationFailure(\"CONFIGURATION_INVALID\");\n }\n\n const nonce = canonicalBase64(value.nonce, 12);\n const ciphertext = canonicalBase64(value.ciphertext, null);\n const authTag = canonicalBase64(value.authTag, 16);\n if (!nonce || !ciphertext || !authTag) return configurationFailure(\"CONFIGURATION_INVALID\");\n return { keyId: value.wrappingKeyId, nonce, ciphertext, authTag };\n}\n\nfunction validCredential(value: unknown): value is string {\n return typeof value === \"string\" && value.length >= 1 && value.length <= 4096\n && value.trim() === value && !CONTROL_CHARACTERS.test(value);\n}\n\nfunction parseCredentials(value: unknown): ShopifyOAuthCredentials {\n if (!isRecord(value) || !hasExactKeys(value, [\"apiKey\", \"apiSecret\"])\n || !validCredential(value.apiKey) || !validCredential(value.apiSecret)) {\n return configurationFailure(\"CONFIGURATION_INVALID\");\n }\n return Object.freeze({ apiKey: value.apiKey, apiSecret: value.apiSecret });\n}\n\n/**\n * Read and unseal the existing platform `shopify.oauth` row. Environment identity\n * is deployment configuration supplied by the caller, never request data.\n */\nexport async function readShopifyOAuthConfiguration(input: Readonly<{\n prisma: ShopifyOAuthConfigurationPrisma;\n environment: string;\n unsealKeyring: CredentialKeyring;\n}>): Promise<ShopifyOAuthCredentials> {\n if (!input || typeof input !== \"object\" || Array.isArray(input)\n || typeof input.environment !== \"string\" || !CONFIGURATION_ENVIRONMENTS.has(input.environment)) {\n return configurationFailure(\"INVALID_ENVIRONMENT\");\n }\n\n let row: ShopifyOAuthConfigurationRow | null;\n try {\n row = await input.prisma.platformConfiguration.findUnique({\n where: { environment_key: { environment: input.environment, key: CONFIGURATION_KEY } },\n select: { environment: true, key: true, version: true, value: true },\n });\n } catch {\n return configurationFailure(\"CONFIGURATION_UNAVAILABLE\");\n }\n\n if (!row) return configurationFailure(\"CONFIGURATION_UNAVAILABLE\");\n if (row.environment !== input.environment || row.key !== CONFIGURATION_KEY\n || !Number.isSafeInteger(row.version) || row.version < 1 || row.version > 2_147_483_647) {\n return configurationFailure(\"CONFIGURATION_INVALID\");\n }\n if (isRecord(row.value) && hasExactKeys(row.value, [\"kind\", \"schemaVersion\"])\n && row.value.kind === \"disabled\" && row.value.schemaVersion === 1) {\n return configurationFailure(\"CONFIGURATION_UNAVAILABLE\");\n }\n\n let plaintext: string;\n try {\n const envelope = parseSealedEnvelope(row.value);\n const aad = JSON.stringify([\"moda-platform-config-v1\", input.environment, CONFIGURATION_KEY, row.version, 1]);\n plaintext = decryptCredential({ keyring: input.unsealKeyring, envelope, aad });\n } catch (error) {\n if (error instanceof ShopifyOAuthConfigurationError) throw error;\n return configurationFailure(\"CONFIGURATION_INVALID\");\n }\n\n try {\n return parseCredentials(JSON.parse(plaintext) as unknown);\n } catch (error) {\n if (error instanceof ShopifyOAuthConfigurationError) throw error;\n return configurationFailure(\"CONFIGURATION_INVALID\");\n }\n}\n"],"mappings":"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","names":["Buffer","ERROR_MESSAGES","isRecord","Buffer"]}
|
|
1
|
+
{"version":3,"sources":["../../src/shopify/node.ts","../../src/shopify/offline-token-provider.ts","../../src/shopify/oauth-configuration.ts"],"sourcesContent":["import { ShopifyWhatsAppConsentSyncJobV1Schema, type ShopifyWhatsAppConsentSyncJobV1 } from \"./whatsapp-consent-sync.schema.js\";\nimport { createHash } from \"node:crypto\";\n\nexport {\n ShopifyOfflineTokenError,\n createShopifyOfflineTokenProvider,\n type ShopifyOfflineTokenErrorCode,\n type ShopifyOfflineRefreshEvent,\n type ShopifyOfflineDatabase,\n type ShopifyOfflineTransaction,\n type ShopifyOfflineSessionDelegate,\n type ShopifyOfflineSessionRecord,\n type ShopifyOfflineSessionWhere,\n type ShopifyOfflineSessionScalarWhere,\n type ShopifyOfflineSessionUniqueWhere,\n type ShopifyOfflineSessionSelect,\n type ShopifyOfflineSessionData,\n type ShopifyOfflineSessionCreateData,\n type ShopifyOfflineStringFilter,\n type ShopifyOfflineBooleanFilter,\n type ShopifyOfflineNullableStringFilter,\n type ShopifyOfflineNullableBooleanFilter,\n type ShopifyOfflineDateFilter,\n type ShopifyOfflineBigIntFilter,\n type ShopifyOfflineShopRecord,\n type OfflineCredentialSnapshot,\n type LockedSessionContext,\n type SdkInstallationSessionContext,\n type ShopifyOfflineTokenProvider,\n} from \"./offline-token-provider.js\";\nexport {\n ShopifyOAuthConfigurationError,\n readShopifyOAuthConfiguration,\n type ShopifyOAuthConfigurationErrorCode,\n type ShopifyOAuthConfigurationPrisma,\n type ShopifyOAuthConfigurationRow,\n type ShopifyOAuthCredentials,\n} from \"./oauth-configuration.js\";\n\nfunction createShopifyWebhookJobDigest(prefix: string, first: string, second: string): string {\n if (typeof first !== \"string\" || first.length === 0) {\n throw new Error(`${prefix}: first input must be a non-empty string`);\n }\n\n if (typeof second !== \"string\" || second.length === 0) {\n throw new Error(`${prefix}: second input must be a non-empty string`);\n }\n\n const digest = createHash(\"sha256\").update(`${first}:${second}`).digest(\"hex\");\n return `${prefix}-${digest}`;\n}\n\n/**\n * Legacy webhook delivery job id used by earlier receipt/outbox flows.\n * Prefer the resource-scoped helpers below for current queue publication.\n */\nexport function createShopifyWebhookJobId(appKey: string, deliveryId: string): string {\n return createShopifyWebhookJobDigest(\"shopify\", appKey, deliveryId);\n}\n\nexport function createShopifyCheckoutJobId(shopId: string, checkoutToken: string): string {\n return createShopifyWebhookJobDigest(\"checkout\", shopId, checkoutToken);\n}\n\nexport function createShopifyOrderJobId(shopId: string, orderGid: string): string {\n return createShopifyWebhookJobDigest(\"order-created\", shopId, orderGid);\n}\n\nexport function createPendingRecoveryCandidateJobId(\n shopId: string,\n checkoutToken: string,\n): string {\n return createShopifyWebhookJobDigest(\"pending-recovery\", shopId, checkoutToken);\n}\n\nexport function createShopifyDiscountSyncJobId(event: {\n shopId: string;\n reason: \"SUBSCRIPTION_ACTIVATED\" | \"REINSTALL_RECONCILED\" | \"SCOPES_UPDATED\" | \"ADMIN_REQUESTED\" | \"DISCOUNT_WEBHOOK\";\n requestedAt: string;\n deliveryId?: string | null;\n}): string {\n if (typeof event.shopId !== \"string\" || event.shopId.trim().length === 0) {\n throw new Error(\"createShopifyDiscountSyncJobId: shopId must be a non-empty string\");\n }\n\n if (event.reason === \"DISCOUNT_WEBHOOK\") {\n if (typeof event.deliveryId !== \"string\" || event.deliveryId.trim().length === 0) {\n throw new Error(\"createShopifyDiscountSyncJobId: deliveryId is required for DISCOUNT_WEBHOOK\");\n }\n return createShopifyWebhookJobDigest(\"discount-sync\", event.shopId, event.deliveryId);\n }\n\n if (typeof event.requestedAt !== \"string\" || event.requestedAt.trim().length === 0) {\n throw new Error(\"createShopifyDiscountSyncJobId: requestedAt must be a non-empty ISO datetime string\");\n }\n\n return createShopifyWebhookJobDigest(\"discount-sync\", `${event.shopId}:${event.reason}`, event.requestedAt);\n}\n\n/**\n * One deduplication identity per authenticated shop + webhook delivery.\n * Length-safe JSON tuple serialization avoids `a:b` vs `a`/`b:c` collisions;\n * the job ID never reveals the customer ID, delivery ID or phone.\n */\nexport function createShopifyWhatsAppConsentSyncJobId(\n input: ShopifyWhatsAppConsentSyncJobV1,\n): string {\n const job = ShopifyWhatsAppConsentSyncJobV1Schema.parse(input);\n const digest = createHash(\"sha256\")\n .update(JSON.stringify([job.shopId, job.deliveryId]))\n .digest(\"hex\");\n return `shopify-whatsapp-consent-sync-${digest}`;\n}\n","import { Buffer } from \"node:buffer\";\nimport { randomUUID } from \"node:crypto\";\nimport { performance } from \"node:perf_hooks\";\n\nexport type ShopifyOfflineTokenErrorCode =\n | \"SESSION_MISSING\" | \"SESSION_IDENTITY_CONFLICT\" | \"INVALID_SESSION\"\n | \"REFRESH_TOKEN_EXPIRED\" | \"OAUTH_CONFIG_UNAVAILABLE\" | \"LOCK_TIMEOUT\"\n | \"CANCELLED\" | \"DEADLINE\" | \"REFRESH_REJECTED\"\n | \"REFRESH_RESPONSE_INVALID\" | \"REFRESH_OUTCOME_UNKNOWN\" | \"PERSISTENCE_UNAVAILABLE\";\n\n/** Bounded refresh lifecycle metadata. Never includes provider credentials or errors. */\nexport type ShopifyOfflineRefreshEvent = Readonly<{\n event: \"shopify.offline_refresh.started\" | \"shopify.offline_refresh.committed\" | \"shopify.offline_refresh.failed\";\n operationId: string;\n shopId: string | null;\n source: \"SHARED\" | \"SDK\";\n durationMs: number;\n outcome: \"STARTED\" | \"COMMITTED\" | \"REJECTED\" | \"UNKNOWN\" | \"CANCELLED\" | \"UNAVAILABLE\";\n reasonCode: ShopifyOfflineTokenErrorCode | null;\n}>;\n\nconst ERROR_MESSAGES: Record<ShopifyOfflineTokenErrorCode, string> = {\n SESSION_MISSING: \"Shopify offline session is unavailable.\",\n SESSION_IDENTITY_CONFLICT: \"Shopify offline session identity is inconsistent.\",\n INVALID_SESSION: \"Shopify offline session is invalid.\",\n REFRESH_TOKEN_EXPIRED: \"Shopify offline refresh token has expired.\",\n OAUTH_CONFIG_UNAVAILABLE: \"Shopify OAuth configuration is unavailable.\",\n LOCK_TIMEOUT: \"Shopify offline session is busy; retry the request.\",\n CANCELLED: \"Shopify offline session request was cancelled.\",\n DEADLINE: \"Shopify offline session operation exceeded its time limit.\",\n REFRESH_REJECTED: \"Shopify rejected the offline refresh request.\",\n REFRESH_RESPONSE_INVALID: \"Shopify returned an invalid offline refresh response.\",\n REFRESH_OUTCOME_UNKNOWN: \"Shopify refresh outcome is unknown; retry in a later request.\",\n PERSISTENCE_UNAVAILABLE: \"Shopify offline session could not be persisted.\",\n};\n\nconst RETRYABLE = new Set<ShopifyOfflineTokenErrorCode>([\n \"LOCK_TIMEOUT\", \"DEADLINE\", \"PERSISTENCE_UNAVAILABLE\", \"REFRESH_OUTCOME_UNKNOWN\",\n]);\n\nexport class ShopifyOfflineTokenError extends Error {\n readonly code: ShopifyOfflineTokenErrorCode;\n readonly retryable: boolean;\n\n constructor(code: ShopifyOfflineTokenErrorCode) {\n super(ERROR_MESSAGES[code]);\n this.name = \"ShopifyOfflineTokenError\";\n this.code = code;\n this.retryable = RETRYABLE.has(code);\n }\n}\n\nclass CallbackFailure extends Error {\n constructor(readonly value: unknown) { super(\"Shopify offline callback failed.\"); }\n}\n\nexport type ShopifyOfflineSessionRecord = Readonly<{\n id: string; shop: string; isOnline: boolean; accessToken: string | null; refreshToken: string | null;\n scope: string | null; expires: Date | null; refreshTokenExpires: Date | null;\n}>;\nexport type ShopifyOfflineShopRecord = Readonly<{\n id: string; domain: string; platform: string; status: string;\n}>;\n\nexport type ShopifyOfflineStringFilter = string | Readonly<{\n equals?: string; in?: string[]; notIn?: string[]; lt?: string; lte?: string; gt?: string; gte?: string;\n contains?: string; startsWith?: string; endsWith?: string; mode?: \"default\" | \"insensitive\";\n not?: string | ShopifyOfflineStringFilter;\n}>;\nexport type ShopifyOfflineBooleanFilter = boolean | Readonly<{ equals?: boolean; not?: boolean | ShopifyOfflineBooleanFilter }>;\nexport type ShopifyOfflineNullableStringFilter = string | null | Readonly<{\n equals?: string | null; in?: string[] | null; notIn?: string[] | null; lt?: string; lte?: string; gt?: string; gte?: string;\n contains?: string; startsWith?: string; endsWith?: string; mode?: \"default\" | \"insensitive\";\n not?: string | null | ShopifyOfflineNullableStringFilter;\n}>;\nexport type ShopifyOfflineNullableBooleanFilter = boolean | null | Readonly<{\n equals?: boolean | null; not?: boolean | null | ShopifyOfflineNullableBooleanFilter;\n}>;\nexport type ShopifyOfflineDateFilter = Date | string | null | Readonly<{\n equals?: Date | string | null; in?: Date[] | string[] | null; notIn?: Date[] | string[] | null;\n lt?: Date | string; lte?: Date | string; gt?: Date | string; gte?: Date | string;\n not?: Date | string | null | ShopifyOfflineDateFilter;\n}>;\nexport type ShopifyOfflineBigIntFilter = bigint | number | null | Readonly<{\n equals?: bigint | number | null; in?: bigint[] | number[] | null; notIn?: bigint[] | number[] | null;\n lt?: bigint | number; lte?: bigint | number; gt?: bigint | number; gte?: bigint | number;\n not?: bigint | number | null | ShopifyOfflineBigIntFilter;\n}>;\nexport type ShopifyOfflineSessionScalarWhere = {\n id?: ShopifyOfflineStringFilter;\n shop?: ShopifyOfflineStringFilter;\n state?: ShopifyOfflineStringFilter;\n isOnline?: ShopifyOfflineBooleanFilter;\n scope?: ShopifyOfflineNullableStringFilter;\n expires?: ShopifyOfflineDateFilter;\n accessToken?: ShopifyOfflineStringFilter;\n userId?: ShopifyOfflineBigIntFilter;\n firstName?: ShopifyOfflineNullableStringFilter;\n lastName?: ShopifyOfflineNullableStringFilter;\n email?: ShopifyOfflineNullableStringFilter;\n accountOwner?: ShopifyOfflineBooleanFilter;\n locale?: ShopifyOfflineNullableStringFilter;\n collaborator?: ShopifyOfflineNullableBooleanFilter;\n emailVerified?: ShopifyOfflineNullableBooleanFilter;\n refreshToken?: ShopifyOfflineNullableStringFilter;\n refreshTokenExpires?: ShopifyOfflineDateFilter;\n};\nexport type ShopifyOfflineSessionWhere = ShopifyOfflineSessionScalarWhere & {\n AND?: ShopifyOfflineSessionScalarWhere | ShopifyOfflineSessionScalarWhere[];\n OR?: ShopifyOfflineSessionScalarWhere[];\n NOT?: ShopifyOfflineSessionScalarWhere | ShopifyOfflineSessionScalarWhere[];\n};\nexport type ShopifyOfflineSessionUniqueWhere = Readonly<{ id: string }>;\nexport type ShopifyOfflineSessionSelect = Readonly<Partial<Record<\n \"id\" | \"shop\" | \"state\" | \"isOnline\" | \"scope\" | \"expires\" | \"accessToken\" | \"userId\"\n | \"firstName\" | \"lastName\" | \"email\" | \"accountOwner\" | \"locale\" | \"collaborator\"\n | \"emailVerified\" | \"refreshToken\" | \"refreshTokenExpires\",\n true\n>>>;\nexport type ShopifyOfflineSessionData = Readonly<{\n id?: string;\n shop?: string;\n state?: string;\n isOnline?: boolean;\n scope?: string | null;\n expires?: Date | null;\n accessToken?: string;\n userId?: bigint | null;\n firstName?: string | null;\n lastName?: string | null;\n email?: string | null;\n accountOwner?: boolean;\n locale?: string | null;\n collaborator?: boolean | null;\n emailVerified?: boolean | null;\n refreshToken?: string | null;\n refreshTokenExpires?: Date | null;\n}>;\nexport type ShopifyOfflineSessionCreateData = ShopifyOfflineSessionData & Readonly<{\n id: string;\n shop: string;\n state: string;\n accessToken: string;\n}>;\nexport type ShopifyOfflineSessionDelegate = Readonly<{\n findUnique(args: Readonly<{ where: ShopifyOfflineSessionUniqueWhere; select?: ShopifyOfflineSessionSelect }>): Promise<ShopifyOfflineSessionRecord | null>;\n findMany(args: Readonly<{ where: ShopifyOfflineSessionWhere; select?: ShopifyOfflineSessionSelect; take?: number }>): Promise<ShopifyOfflineSessionRecord[]>;\n create(args: Readonly<{ data: ShopifyOfflineSessionCreateData; select?: ShopifyOfflineSessionSelect }>): Promise<ShopifyOfflineSessionRecord>;\n update(args: Readonly<{ where: ShopifyOfflineSessionUniqueWhere; data: ShopifyOfflineSessionData; select?: ShopifyOfflineSessionSelect }>): Promise<ShopifyOfflineSessionRecord>;\n upsert(args: Readonly<{ where: ShopifyOfflineSessionUniqueWhere; create: ShopifyOfflineSessionCreateData; update: ShopifyOfflineSessionData; select?: ShopifyOfflineSessionSelect }>): Promise<ShopifyOfflineSessionRecord>;\n delete(args: Readonly<{ where: ShopifyOfflineSessionUniqueWhere; select?: ShopifyOfflineSessionSelect }>): Promise<ShopifyOfflineSessionRecord>;\n deleteMany(args: Readonly<{ where?: ShopifyOfflineSessionWhere }>): Promise<{ count: number }>;\n updateMany(args: Readonly<{ where?: ShopifyOfflineSessionWhere; data: ShopifyOfflineSessionData }>): Promise<{ count: number }>;\n}>;\n\nexport type ShopifyOfflineTransaction = Readonly<{\n $queryRawUnsafe<T = unknown>(sql: string, ...values: unknown[]): Promise<T>;\n $executeRawUnsafe(sql: string, ...values: unknown[]): Promise<number>;\n session: ShopifyOfflineSessionDelegate;\n shop: Readonly<{\n findUnique(args: Readonly<{ where: Readonly<{ id: string }>; select: Readonly<{ id: true; domain: true; platform: true; status: true }> }>): Promise<ShopifyOfflineShopRecord | null>;\n }>;\n}>;\n\nexport type ShopifyOfflineDatabase = Readonly<{\n $transaction<T>(\n work: (transaction: ShopifyOfflineTransaction) => Promise<T>,\n options: Readonly<{ maxWait: 5000; timeout: 20000; isolationLevel: \"ReadCommitted\" }>,\n ): Promise<T>;\n shop: ShopifyOfflineTransaction[\"shop\"];\n}>;\n\nexport type OfflineCredentialSnapshot = Readonly<{\n id: string; shopId: string; shop: string; accessToken: string; scope: string | null;\n expires: Date | null; refreshTokenExpires: Date | null;\n}>;\nexport type LockedSessionContext = Readonly<{\n transaction: ShopifyOfflineTransaction; shopId: string; shop: string; sessionId: string; signal: AbortSignal;\n}>;\nexport type SdkInstallationSessionContext = Readonly<{\n transaction: ShopifyOfflineTransaction; shopId: null; shop: string; sessionId: string | null; signal: AbortSignal;\n}>;\nexport type ShopifyOfflineTokenProvider = Readonly<{\n withSdkInstallationSessionLock<T>(integrationDomain: string, work: (context: SdkInstallationSessionContext) => Promise<T>): Promise<T>;\n getAccessToken(shopId: string, options?: Readonly<{ signal?: AbortSignal }>): Promise<string>;\n getSession(shopId: string, options?: Readonly<{ signal?: AbortSignal }>): Promise<OfflineCredentialSnapshot>;\n withSessionLock<T>(shopId: string, work: (context: LockedSessionContext) => Promise<T>, options?: Readonly<{ signal?: AbortSignal }>): Promise<T>;\n}>;\n\ntype PersistedShop = ShopifyOfflineShopRecord;\nconst TX_OPTIONS = { maxWait: 5000, timeout: 20000, isolationLevel: \"ReadCommitted\" } as const;\nconst ACCESS_REFRESH_SKEW_MS = 320_000;\nconst REFRESH_NETWORK_BUDGET_MS = 8_000;\nconst OPERATION_BUDGET_MS = 15_000;\nconst RESPONSE_LIMIT = 16_384;\nconst CONTROL = /[\\u0000-\\u001f\\u007f]/;\nconst SESSION_SELECT = { id: true, shop: true, isOnline: true, accessToken: true, refreshToken: true, scope: true, expires: true, refreshTokenExpires: true } as const;\n\nfunction fail(code: ShopifyOfflineTokenErrorCode): never { throw new ShopifyOfflineTokenError(code); }\nfunction isRecord(value: unknown): value is Record<string, unknown> { return typeof value === \"object\" && value !== null && !Array.isArray(value); }\nfunction validToken(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0 && value.length <= 4096 && value.trim() === value && !/[\\r\\n\\u0000]/.test(value);\n}\nfunction validScope(value: unknown): value is string { return typeof value === \"string\" && value.length <= 4096 && !CONTROL.test(value); }\nfunction validDate(value: unknown): value is Date | null { return value === null || (value instanceof Date && Number.isFinite(value.getTime())); }\nfunction mapDatabaseError(error: unknown): ShopifyOfflineTokenError {\n const code = isRecord(error) && typeof error.code === \"string\" ? error.code : \"\";\n const message = error instanceof Error ? error.message : \"\";\n if (code === \"55P03\" || /lock timeout/i.test(message)) return new ShopifyOfflineTokenError(\"LOCK_TIMEOUT\");\n if (code === \"57014\" || /statement timeout|statement timed out/i.test(message)) return new ShopifyOfflineTokenError(\"DEADLINE\");\n return new ShopifyOfflineTokenError(\"PERSISTENCE_UNAVAILABLE\");\n}\n\nfunction createDeadline(signal?: AbortSignal): Readonly<{ signal: AbortSignal; dispose(): void; check(): void; wait<T>(work: Promise<T>): Promise<T> }> {\n const controller = new AbortController();\n let expired = false;\n const timer = setTimeout(() => { expired = true; controller.abort(); }, OPERATION_BUDGET_MS);\n const onAbort = () => controller.abort(signal?.reason);\n if (signal?.aborted) onAbort();\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n return {\n signal: controller.signal,\n dispose() { clearTimeout(timer); signal?.removeEventListener(\"abort\", onAbort); },\n wait<T>(work: Promise<T>): Promise<T> {\n if (controller.signal.aborted) this.check();\n let onDeadline: (() => void) | undefined;\n const aborted = new Promise<never>((_resolve, reject) => {\n onDeadline = () => reject(new Error(\"operation aborted\"));\n controller.signal.addEventListener(\"abort\", onDeadline, { once: true });\n });\n return Promise.race([work, aborted]).finally(() => {\n if (onDeadline) controller.signal.removeEventListener(\"abort\", onDeadline);\n });\n },\n check() {\n if (signal?.aborted) fail(\"CANCELLED\");\n if (expired) fail(\"DEADLINE\");\n if (controller.signal.aborted) fail(\"DEADLINE\");\n },\n };\n}\n\nasync function readBoundedBody(response: Response, signal: AbortSignal): Promise<string> {\n if (!response.body) return \"\";\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n try {\n while (true) {\n if (signal.aborted) throw new Error(\"refresh stream aborted\");\n const { done, value } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (size > RESPONSE_LIMIT) {\n await reader.cancel().catch(() => undefined);\n fail(\"REFRESH_OUTCOME_UNKNOWN\");\n }\n chunks.push(value);\n }\n } finally { reader.releaseLock(); }\n return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk))).toString(\"utf8\");\n}\n\nfunction snapshot(row: ShopifyOfflineSessionRecord, shopId: string, shop: string): OfflineCredentialSnapshot {\n if (!validToken(row.accessToken) || !validScope(row.scope) && row.scope !== null\n || !validDate(row.expires) || !validDate(row.refreshTokenExpires)) fail(\"INVALID_SESSION\");\n return Object.freeze({ id: row.id, shopId, shop, accessToken: row.accessToken, scope: row.scope, expires: row.expires, refreshTokenExpires: row.refreshTokenExpires });\n}\n\nexport function createShopifyOfflineTokenProvider(input: Readonly<{\n prisma: ShopifyOfflineDatabase;\n readOAuth: () => Promise<Readonly<{ apiKey: string; apiSecret: string }>>;\n fetch: typeof fetch;\n now?: () => number;\n onEvent?: (event: ShopifyOfflineRefreshEvent) => void;\n}>): ShopifyOfflineTokenProvider {\n const now = input.now ?? Date.now;\n function notify(event: ShopifyOfflineRefreshEvent): void {\n try {\n // Promise resolution also isolates rejected promises/thenables from adapters.\n void Promise.resolve(input.onEvent?.(Object.freeze(event))).catch(() => undefined);\n } catch { /* Observers never affect credential or transaction outcomes. */ }\n }\n\n async function resolveShop(shopId: string, deadline: ReturnType<typeof createDeadline>): Promise<PersistedShop> {\n deadline.check();\n if (typeof shopId !== \"string\" || !shopId.trim()) fail(\"SESSION_MISSING\");\n let shop: PersistedShop | null;\n try {\n shop = await deadline.wait(input.prisma.shop.findUnique({ where: { id: shopId }, select: { id: true, domain: true, platform: true, status: true } }));\n } catch (error) {\n deadline.check();\n throw mapDatabaseError(error);\n }\n deadline.check();\n if (!shop) fail(\"SESSION_MISSING\");\n if (shop.platform !== \"SHOPIFY\" || shop.status !== \"ACTIVE\") fail(\"INVALID_SESSION\");\n if (!shop.domain) fail(\"SESSION_IDENTITY_CONFLICT\");\n return shop;\n }\n\n async function runLocked<T>(shop: PersistedShop, shopId: string, deadline: ReturnType<typeof createDeadline>, work: (context: LockedSessionContext) => Promise<T>, outcome: { remoteSucceeded: boolean } = { remoteSucceeded: false }): Promise<T> {\n try {\n deadline.check();\n const result = await deadline.wait(input.prisma.$transaction(async (tx) => {\n await tx.$executeRawUnsafe(\"SET LOCAL lock_timeout = '5s'\");\n await tx.$executeRawUnsafe(\"SET LOCAL statement_timeout = '18s'\");\n await tx.$queryRawUnsafe(\"SELECT pg_advisory_xact_lock(hashtextextended($1, 0)) IS NULL\", `moda:shopify-offline:v1:${shop.domain}`);\n deadline.check();\n\n const currentShop = await tx.shop.findUnique({ where: { id: shopId }, select: { id: true, domain: true, platform: true, status: true } });\n if (!currentShop) fail(\"SESSION_MISSING\");\n if (currentShop.platform !== \"SHOPIFY\" || currentShop.status !== \"ACTIVE\") fail(\"INVALID_SESSION\");\n if (currentShop.domain !== shop.domain) fail(\"SESSION_IDENTITY_CONFLICT\");\n\n const sessions = await tx.session.findMany({ where: { shop: currentShop.domain, isOnline: false }, select: SESSION_SELECT, take: 2 });\n if (sessions.length === 0) fail(\"SESSION_MISSING\");\n if (sessions.length !== 1) fail(\"SESSION_IDENTITY_CONFLICT\");\n const row = sessions[0]!;\n if (!row.id || row.shop !== currentShop.domain || row.isOnline !== false) fail(\"SESSION_IDENTITY_CONFLICT\");\n await tx.$queryRawUnsafe('SELECT \"id\" FROM \"shopify\".\"Session\" WHERE \"id\" = $1 FOR UPDATE', row.id);\n const reread = await tx.session.findUnique({ where: { id: row.id }, select: SESSION_SELECT });\n if (!reread || reread.id !== row.id || reread.shop !== currentShop.domain || reread.isOnline !== false) fail(\"SESSION_IDENTITY_CONFLICT\");\n\n const context: LockedSessionContext = Object.freeze({ transaction: tx, shopId, shop: currentShop.domain, sessionId: reread.id, signal: deadline.signal });\n deadline.check();\n let value: T;\n try { value = await deadline.wait(work(context)); }\n catch (error) { deadline.check(); throw new CallbackFailure(error); }\n deadline.check();\n return value;\n }, TX_OPTIONS));\n return result;\n } catch (error) {\n if (error instanceof CallbackFailure) throw error.value;\n if (deadline.signal.aborted) deadline.check();\n if (outcome.remoteSucceeded && (error instanceof ShopifyOfflineTokenError\n ? error.code === \"LOCK_TIMEOUT\" || error.code === \"DEADLINE\" || error.code === \"PERSISTENCE_UNAVAILABLE\"\n : true)) fail(\"REFRESH_OUTCOME_UNKNOWN\");\n if (error instanceof ShopifyOfflineTokenError) throw error;\n deadline.check();\n throw mapDatabaseError(error);\n }\n }\n\n async function getSession(shopId: string, options?: Readonly<{ signal?: AbortSignal }>): Promise<OfflineCredentialSnapshot> {\n const deadline = createDeadline(options?.signal);\n let attempt: { operationId: string; shopId: string; startedAt: number } | undefined;\n const outcome = { remoteSucceeded: false };\n function emit(event: ShopifyOfflineRefreshEvent[\"event\"], result: ShopifyOfflineRefreshEvent[\"outcome\"], reasonCode: ShopifyOfflineTokenErrorCode | null): void {\n if (!attempt) return;\n notify({ event, operationId: attempt.operationId, shopId: attempt.shopId, source: \"SHARED\",\n durationMs: Math.min(60_000, Math.max(0, Math.round(performance.now() - attempt.startedAt))), outcome: result, reasonCode });\n }\n try {\n deadline.check();\n const shop = await resolveShop(shopId, deadline);\n deadline.check();\n const result = await runLocked(shop, shopId, deadline, async (context) => {\n let row = await context.transaction.session.findUnique({ where: { id: context.sessionId }, select: SESSION_SELECT });\n if (!row) fail(\"SESSION_IDENTITY_CONFLICT\");\n const currentTime = now();\n if (!Number.isFinite(currentTime)) fail(\"INVALID_SESSION\");\n if (row.expires === null && row.refreshToken === null) return snapshot(row, shopId, context.shop);\n if (row.expires === null) fail(\"INVALID_SESSION\");\n const expiresAt = row.expires?.getTime() ?? 0;\n if (expiresAt - currentTime > ACCESS_REFRESH_SKEW_MS) return snapshot(row, shopId, context.shop);\n if (!validToken(row.refreshToken)) fail(\"INVALID_SESSION\");\n if (!validDate(row.refreshTokenExpires) || row.refreshTokenExpires === null) fail(\"INVALID_SESSION\");\n if (row.refreshTokenExpires.getTime() <= currentTime) fail(\"REFRESH_TOKEN_EXPIRED\");\n\n let credentials: Readonly<{ apiKey: string; apiSecret: string }>;\n try { credentials = await input.readOAuth(); }\n catch { fail(\"OAUTH_CONFIG_UNAVAILABLE\"); }\n if (options?.signal?.aborted) fail(\"CANCELLED\");\n if (context.signal.aborted) fail(\"DEADLINE\");\n if (!validToken(credentials.apiKey) || !validToken(credentials.apiSecret)) fail(\"OAUTH_CONFIG_UNAVAILABLE\");\n const requestStartedAt = now();\n const refreshController = new AbortController();\n const refreshTimeout = setTimeout(() => refreshController.abort(), REFRESH_NETWORK_BUDGET_MS);\n const onAbort = () => refreshController.abort();\n context.signal.addEventListener(\"abort\", onAbort, { once: true });\n let response: Response;\n try {\n const form = new URLSearchParams({ client_id: credentials.apiKey, client_secret: credentials.apiSecret, grant_type: \"refresh_token\", refresh_token: row.refreshToken });\n attempt = { operationId: randomUUID(), shopId: context.shopId, startedAt: performance.now() };\n emit(\"shopify.offline_refresh.started\", \"STARTED\", null);\n response = await input.fetch(`https://${context.shop}/admin/oauth/access_token`, {\n method: \"POST\", redirect: \"error\", headers: { \"content-type\": \"application/x-www-form-urlencoded\" }, body: form, signal: refreshController.signal,\n });\n } catch {\n clearTimeout(refreshTimeout);\n context.signal.removeEventListener(\"abort\", onAbort);\n if (options?.signal?.aborted) fail(\"CANCELLED\");\n if (context.signal.aborted) fail(\"REFRESH_OUTCOME_UNKNOWN\");\n fail(\"REFRESH_OUTCOME_UNKNOWN\");\n }\n if (response.status >= 400 && response.status < 500) fail(\"REFRESH_REJECTED\");\n if (!response.ok) { outcome.remoteSucceeded = true; fail(\"REFRESH_OUTCOME_UNKNOWN\"); }\n outcome.remoteSucceeded = true;\n let raw: string;\n try { raw = await readBoundedBody(response, refreshController.signal); }\n catch (error) {\n clearTimeout(refreshTimeout);\n context.signal.removeEventListener(\"abort\", onAbort);\n if (options?.signal?.aborted) fail(\"CANCELLED\");\n if (context.signal.aborted) fail(\"REFRESH_OUTCOME_UNKNOWN\");\n fail(\"REFRESH_OUTCOME_UNKNOWN\");\n } finally {\n clearTimeout(refreshTimeout);\n context.signal.removeEventListener(\"abort\", onAbort);\n }\n let payload: unknown;\n try { payload = JSON.parse(raw) as unknown; } catch { fail(\"REFRESH_OUTCOME_UNKNOWN\"); }\n if (!isRecord(payload) || !validToken(payload.access_token) || !validToken(payload.refresh_token)\n || !Number.isSafeInteger(payload.expires_in) || (payload.expires_in as number) <= 0 || (payload.expires_in as number) > 86_400\n || !Number.isSafeInteger(payload.refresh_token_expires_in) || (payload.refresh_token_expires_in as number) <= 0 || (payload.refresh_token_expires_in as number) > 7_776_000\n || (payload.expires_in as number) <= 320\n || (payload.scope !== undefined && !validScope(payload.scope))) fail(\"REFRESH_OUTCOME_UNKNOWN\");\n const expires = requestStartedAt + (payload.expires_in as number) * 1000;\n const refreshTokenExpires = requestStartedAt + (payload.refresh_token_expires_in as number) * 1000;\n if (!Number.isFinite(expires) || !Number.isFinite(refreshTokenExpires) || Number.isNaN(new Date(expires).getTime()) || Number.isNaN(new Date(refreshTokenExpires).getTime())) fail(\"REFRESH_OUTCOME_UNKNOWN\");\n const scope = payload.scope === undefined ? row.scope : payload.scope as string;\n try {\n row = await context.transaction.session.update({ where: { id: row.id }, data: {\n accessToken: payload.access_token, expires: new Date(expires), refreshToken: payload.refresh_token,\n refreshTokenExpires: new Date(refreshTokenExpires), scope,\n }, select: SESSION_SELECT });\n } catch { outcome.remoteSucceeded = true; throw new ShopifyOfflineTokenError(\"REFRESH_OUTCOME_UNKNOWN\"); }\n outcome.remoteSucceeded = true;\n return snapshot(row, shopId, context.shop);\n }, outcome);\n emit(\"shopify.offline_refresh.committed\", \"COMMITTED\", null);\n return result;\n } catch (error) {\n let failure = error;\n try { deadline.check(); } catch (deadlineError) { failure = deadlineError; }\n const code = failure instanceof ShopifyOfflineTokenError ? failure.code : \"PERSISTENCE_UNAVAILABLE\";\n const ambiguous = outcome.remoteSucceeded && code !== \"REFRESH_REJECTED\" && code !== \"CANCELLED\";\n const reason = ambiguous ? \"REFRESH_OUTCOME_UNKNOWN\" : code;\n emit(\"shopify.offline_refresh.failed\", reason === \"REFRESH_REJECTED\" ? \"REJECTED\"\n : reason === \"CANCELLED\" ? \"CANCELLED\" : reason === \"REFRESH_OUTCOME_UNKNOWN\" ? \"UNKNOWN\" : \"UNAVAILABLE\", reason);\n throw failure;\n } finally { deadline.dispose(); }\n }\n\n async function withSessionLock<T>(shopId: string, work: (context: LockedSessionContext) => Promise<T>, options?: Readonly<{ signal?: AbortSignal }>): Promise<T> {\n const deadline = createDeadline(options?.signal);\n try {\n deadline.check();\n const shop = await resolveShop(shopId, deadline);\n deadline.check();\n return await runLocked(shop, shopId, deadline, work);\n } catch (error) {\n deadline.check();\n throw error;\n } finally { deadline.dispose(); }\n }\n\n async function withSdkInstallationSessionLock<T>(integrationDomain: string, work: (context: SdkInstallationSessionContext) => Promise<T>): Promise<T> {\n if (typeof integrationDomain !== \"string\" || !integrationDomain.trim()) fail(\"INVALID_SESSION\");\n const deadline = createDeadline();\n try {\n return await input.prisma.$transaction(async (tx) => {\n await tx.$executeRawUnsafe(\"SET LOCAL lock_timeout = '5s'\");\n await tx.$executeRawUnsafe(\"SET LOCAL statement_timeout = '18s'\");\n await tx.$queryRawUnsafe(\"SELECT pg_advisory_xact_lock(hashtextextended($1, 0)) IS NULL\", `moda:shopify-offline:v1:${integrationDomain}`);\n let value: T;\n try { value = await deadline.wait(work(Object.freeze({ transaction: tx, shopId: null, shop: integrationDomain, sessionId: null, signal: deadline.signal }))); }\n catch (error) { deadline.check(); throw new CallbackFailure(error); }\n deadline.check();\n return value;\n }, TX_OPTIONS);\n } catch (error) {\n if (error instanceof CallbackFailure) throw error.value;\n if (error instanceof ShopifyOfflineTokenError) throw error;\n if (deadline.signal.aborted) deadline.check();\n throw mapDatabaseError(error);\n } finally { deadline.dispose(); }\n }\n\n return Object.freeze({\n withSdkInstallationSessionLock,\n getAccessToken: async (shopId: string, options?: Readonly<{ signal?: AbortSignal }>) => (await getSession(shopId, options)).accessToken,\n getSession,\n withSessionLock,\n });\n}\n","import { Buffer } from \"node:buffer\";\nimport {\n decryptCredential,\n type CredentialEnvelope,\n type CredentialKeyring,\n} from \"../security/credentials/node.js\";\n\nconst CONFIGURATION_KEY = \"shopify.oauth\" as const;\nconst CONFIGURATION_ENVIRONMENTS = new Set([\"local\", \"test\", \"development\", \"staging\", \"production\"]);\nconst ENVELOPE_KEYS = [\"kind\", \"schemaVersion\", \"algorithm\", \"wrappingKeyId\", \"nonce\", \"ciphertext\", \"authTag\"] as const;\nconst RESERVED_KEY_IDS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\nconst KEY_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;\nconst BASE64_PATTERN = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;\nconst CONTROL_CHARACTERS = /[\\u0000-\\u001f\\u007f]/;\n\nexport type ShopifyOAuthConfigurationErrorCode =\n | \"INVALID_ENVIRONMENT\"\n | \"CONFIGURATION_UNAVAILABLE\"\n | \"CONFIGURATION_INVALID\";\n\nconst ERROR_MESSAGES: Record<ShopifyOAuthConfigurationErrorCode, string> = {\n INVALID_ENVIRONMENT: \"Shopify OAuth configuration is unavailable.\",\n CONFIGURATION_UNAVAILABLE: \"Shopify OAuth configuration is unavailable.\",\n CONFIGURATION_INVALID: \"Shopify OAuth configuration is invalid.\",\n};\n\n/** Safe configuration boundary error; never contains a row, key, or decrypt cause. */\nexport class ShopifyOAuthConfigurationError extends Error {\n readonly code: ShopifyOAuthConfigurationErrorCode;\n\n constructor(code: ShopifyOAuthConfigurationErrorCode) {\n super(ERROR_MESSAGES[code]);\n this.name = \"ShopifyOAuthConfigurationError\";\n this.code = code;\n }\n}\n\nexport type ShopifyOAuthConfigurationRow = Readonly<{\n environment: string;\n key: string;\n version: number;\n value: unknown;\n}>;\n\nexport type ShopifyOAuthConfigurationPrisma = Readonly<{\n platformConfiguration: Readonly<{\n findUnique(args: Readonly<{\n where: Readonly<{ environment_key: Readonly<{ environment: string; key: typeof CONFIGURATION_KEY }> }>;\n select: Readonly<{ environment: true; key: true; version: true; value: true }>;\n }>): Promise<ShopifyOAuthConfigurationRow | null>;\n }>;\n}>;\n\nexport type ShopifyOAuthCredentials = Readonly<{\n apiKey: string;\n apiSecret: string;\n}>;\n\nfunction configurationFailure(code: ShopifyOAuthConfigurationErrorCode): never {\n throw new ShopifyOAuthConfigurationError(code);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const actual = Object.keys(value);\n return actual.length === expected.length && actual.every((key) => expected.includes(key));\n}\n\nfunction canonicalBase64(value: unknown, exactLength: number | null): Uint8Array | null {\n if (typeof value !== \"string\" || value.length === 0 || !BASE64_PATTERN.test(value)) return null;\n const decoded = Buffer.from(value, \"base64\");\n if (decoded.length < 1 || decoded.length > 8192 || decoded.toString(\"base64\") !== value) return null;\n if (exactLength !== null && decoded.length !== exactLength) return null;\n return Uint8Array.from(decoded);\n}\n\nfunction parseSealedEnvelope(value: unknown): CredentialEnvelope {\n if (!isRecord(value) || !hasExactKeys(value, ENVELOPE_KEYS)\n || value.kind !== \"sealed\"\n || value.schemaVersion !== 1\n || value.algorithm !== \"AES-256-GCM\"\n || typeof value.wrappingKeyId !== \"string\"\n || !KEY_ID_PATTERN.test(value.wrappingKeyId)\n || RESERVED_KEY_IDS.has(value.wrappingKeyId)) {\n return configurationFailure(\"CONFIGURATION_INVALID\");\n }\n\n const nonce = canonicalBase64(value.nonce, 12);\n const ciphertext = canonicalBase64(value.ciphertext, null);\n const authTag = canonicalBase64(value.authTag, 16);\n if (!nonce || !ciphertext || !authTag) return configurationFailure(\"CONFIGURATION_INVALID\");\n return { keyId: value.wrappingKeyId, nonce, ciphertext, authTag };\n}\n\nfunction validCredential(value: unknown): value is string {\n return typeof value === \"string\" && value.length >= 1 && value.length <= 4096\n && value.trim() === value && !CONTROL_CHARACTERS.test(value);\n}\n\nfunction parseCredentials(value: unknown): ShopifyOAuthCredentials {\n if (!isRecord(value) || !hasExactKeys(value, [\"apiKey\", \"apiSecret\"])\n || !validCredential(value.apiKey) || !validCredential(value.apiSecret)) {\n return configurationFailure(\"CONFIGURATION_INVALID\");\n }\n return Object.freeze({ apiKey: value.apiKey, apiSecret: value.apiSecret });\n}\n\n/**\n * Read and unseal the existing platform `shopify.oauth` row. Environment identity\n * is deployment configuration supplied by the caller, never request data.\n */\nexport async function readShopifyOAuthConfiguration(input: Readonly<{\n prisma: ShopifyOAuthConfigurationPrisma;\n environment: string;\n unsealKeyring: CredentialKeyring;\n}>): Promise<ShopifyOAuthCredentials> {\n if (!input || typeof input !== \"object\" || Array.isArray(input)\n || typeof input.environment !== \"string\" || !CONFIGURATION_ENVIRONMENTS.has(input.environment)) {\n return configurationFailure(\"INVALID_ENVIRONMENT\");\n }\n\n let row: ShopifyOAuthConfigurationRow | null;\n try {\n row = await input.prisma.platformConfiguration.findUnique({\n where: { environment_key: { environment: input.environment, key: CONFIGURATION_KEY } },\n select: { environment: true, key: true, version: true, value: true },\n });\n } catch {\n return configurationFailure(\"CONFIGURATION_UNAVAILABLE\");\n }\n\n if (!row) return configurationFailure(\"CONFIGURATION_UNAVAILABLE\");\n if (row.environment !== input.environment || row.key !== CONFIGURATION_KEY\n || !Number.isSafeInteger(row.version) || row.version < 1 || row.version > 2_147_483_647) {\n return configurationFailure(\"CONFIGURATION_INVALID\");\n }\n if (isRecord(row.value) && hasExactKeys(row.value, [\"kind\", \"schemaVersion\"])\n && row.value.kind === \"disabled\" && row.value.schemaVersion === 1) {\n return configurationFailure(\"CONFIGURATION_UNAVAILABLE\");\n }\n\n let plaintext: string;\n try {\n const envelope = parseSealedEnvelope(row.value);\n const aad = JSON.stringify([\"moda-platform-config-v1\", input.environment, CONFIGURATION_KEY, row.version, 1]);\n plaintext = decryptCredential({ keyring: input.unsealKeyring, envelope, aad });\n } catch (error) {\n if (error instanceof ShopifyOAuthConfigurationError) throw error;\n return configurationFailure(\"CONFIGURATION_INVALID\");\n }\n\n try {\n return parseCredentials(JSON.parse(plaintext) as unknown);\n } catch (error) {\n if (error instanceof ShopifyOAuthConfigurationError) throw error;\n return configurationFailure(\"CONFIGURATION_INVALID\");\n }\n}\n"],"mappings":"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","names":["Buffer","ERROR_MESSAGES","isRecord","Buffer"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as
|
|
1
|
+
import { C as CommerceExecutionPurpose, a as CommerceTurnIdentity, b as CommerceConversationGrant, c as CommerceManifest, T as ToolDescriptor, G as GrantedTool, d as CommerceToolResult, D as Digest, e as CommerceFinalResponse } from './response-Bh-KzXOQ.js';
|
|
2
2
|
import { S as StructuredLogger } from './types-B32wDMLO.js';
|
|
3
3
|
|
|
4
4
|
/** Finite, non-customer-facing failure taxonomy for Commerce hosts and logs. */
|
|
@@ -75,6 +75,8 @@ type RunnerTool = {
|
|
|
75
75
|
extractEvidence?: (result: CommerceToolResult) => unknown[];
|
|
76
76
|
};
|
|
77
77
|
type RunCommerceTurnInput = {
|
|
78
|
+
/** Trusted service context only; never copied from model or tool arguments. */
|
|
79
|
+
executionPurpose?: CommerceExecutionPurpose;
|
|
78
80
|
turn: CommerceTurnIdentity;
|
|
79
81
|
grant: CommerceConversationGrant;
|
|
80
82
|
manifest: CommerceManifest;
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commerce/subset.ts","../src/commerce/external.ts","../src/commerce/definitions.ts","../src/commerce/definition-size.ts","../src/commerce/built-in-tools.ts","../src/commerce/response.ts","../src/commerce/schemas.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { canonicalJson, jsonBytes } from \"./canonical-json\";\nexport type Json =\n null | boolean | number | string | Json[] | { [key: string]: Json };\nexport type SubsetSchema = {\n type: string | [string, \"null\"];\n description?: string;\n properties?: Record<string, SubsetSchema>;\n required?: string[];\n additionalProperties?: false;\n items?: SubsetSchema;\n enum?: Array<string | number | boolean | null>;\n minLength?: number;\n maxLength?: number;\n minimum?: number;\n maximum?: number;\n minItems?: number;\n maxItems?: number;\n pattern?: string;\n};\nexport const MONEY_PATTERN = \"^[0-9]{1,18}(\\\\.[0-9]{1,6})?$\";\nexport const safeName = (name: string) =>\n /^[A-Za-z][A-Za-z0-9_]{0,63}$/.test(name) &&\n ![\"__proto__\", \"prototype\", \"constructor\"].includes(name);\nexport const safePath = (path: string) =>\n path.length <= 256 && path.split(\".\").every(safeName);\nconst keywords = [\n \"type\",\n \"description\",\n \"properties\",\n \"required\",\n \"additionalProperties\",\n \"items\",\n \"enum\",\n \"minLength\",\n \"maxLength\",\n \"minimum\",\n \"maximum\",\n \"minItems\",\n \"maxItems\",\n];\nexport function validateSubset(\n value: unknown,\n mode: \"input\" | \"details\",\n): value is SubsetSchema {\n let propertyCount = 0;\n const maxDepth = mode === \"input\" ? 3 : 5;\n function walk(raw: unknown, depth: number): boolean {\n if (\n depth > maxDepth ||\n !raw ||\n typeof raw !== \"object\" ||\n Array.isArray(raw)\n )\n return false;\n const s = raw as SubsetSchema;\n if (\n Object.keys(s).some(\n (k) => !keywords.includes(k) && !(mode === \"input\" && k === \"pattern\"),\n )\n )\n return false;\n const nullable = Array.isArray(s.type);\n if (\n nullable &&\n (s.type.length !== 2 || s.type[1] !== \"null\" ||\n (mode === \"details\" && [\"object\", \"array\"].includes(s.type[0])))\n )\n return false;\n const type = typeof s.type === \"string\" ? s.type : s.type[0];\n if (\n ![\n \"object\",\n \"string\",\n \"integer\",\n \"boolean\",\n \"array\",\n ...(mode === \"details\" ? [\"number\"] : []),\n ].includes(type)\n )\n return false;\n if (\n s.description !== undefined &&\n (typeof s.description !== \"string\" || s.description.length > 1000)\n )\n return false;\n const specific: Record<string, string[]> = {\n object: [\"properties\", \"required\", \"additionalProperties\"],\n array: [\"items\", \"minItems\", \"maxItems\"],\n string: [\"minLength\", \"maxLength\", \"pattern\"],\n integer: [\"minimum\", \"maximum\"],\n number: [\"minimum\", \"maximum\"],\n boolean: [],\n };\n if (\n Object.keys(s).some(\n (k) =>\n ![\"type\", \"description\", \"enum\"].includes(k) &&\n !specific[type].includes(k),\n )\n )\n return false;\n if (\n s.enum !== undefined &&\n (!Array.isArray(s.enum) ||\n s.enum.length < 1 ||\n s.enum.length > (mode === \"input\" ? 32 : 20) ||\n new Set(s.enum.map((v) => canonicalJson(v))).size !== s.enum.length ||\n s.enum.some((v) =>\n v === null\n ? !nullable\n : typeof v !== (type === \"integer\" ? \"number\" : type) ||\n (type === \"integer\" && !Number.isSafeInteger(v)) ||\n typeof v === \"object\",\n ))\n )\n return false;\n for (const [lo, hi] of [\n [\"minLength\", \"maxLength\"],\n [\"minItems\", \"maxItems\"],\n [\"minimum\", \"maximum\"],\n ] as const) {\n if (\n s[lo] !== undefined &&\n (typeof s[lo] !== \"number\" || !Number.isFinite(s[lo]))\n )\n return false;\n if (\n s[hi] !== undefined &&\n (typeof s[hi] !== \"number\" || !Number.isFinite(s[hi]))\n )\n return false;\n if (\n lo !== \"minimum\" &&\n [s[lo], s[hi]].some(\n (v) => v !== undefined && (!Number.isSafeInteger(v) || v < 0),\n )\n )\n return false;\n if (s[lo] !== undefined && s[hi] !== undefined && s[lo]! > s[hi]!)\n return false;\n }\n if (type === \"string\")\n return (\n s.maxLength !== undefined &&\n s.maxLength <= 4096 &&\n (s.pattern === undefined || s.pattern === MONEY_PATTERN)\n );\n if (type === \"array\")\n return (\n s.maxItems !== undefined &&\n s.maxItems <= (mode === \"input\" ? 100 : 20) &&\n walk(s.items, depth + 1)\n );\n if (type === \"object\") {\n if (\n s.additionalProperties !== false ||\n !s.properties ||\n typeof s.properties !== \"object\" ||\n Array.isArray(s.properties)\n )\n return false;\n const names = Object.keys(s.properties);\n propertyCount += names.length;\n if (\n propertyCount > 32 ||\n names.some((n) => !safeName(n)) ||\n (s.required !== undefined &&\n (!Array.isArray(s.required) ||\n new Set(s.required).size !== s.required.length ||\n s.required.some((n) => !names.includes(n))))\n )\n return false;\n return Object.values(s.properties).every((child) =>\n walk(child, depth + 1),\n );\n }\n return true;\n }\n try {\n return (\n jsonBytes(value) <= 32768 &&\n walk(value, 1) &&\n (value as SubsetSchema).type === \"object\"\n );\n } catch {\n return false;\n }\n}\nexport const InputSchemaSchema = z.custom<SubsetSchema>((v) =>\n validateSubset(v, \"input\"),\n);\nexport const DetailsSchemaSchema = z.custom<SubsetSchema>((v) =>\n validateSubset(v, \"details\"),\n);\nexport function matchesSubset(schema: SubsetSchema, value: unknown): boolean {\n const nullable = Array.isArray(schema.type);\n const type = typeof schema.type === \"string\" ? schema.type : schema.type[0];\n if (value === null)\n return nullable && (!schema.enum || schema.enum.includes(null));\n if (schema.enum && !schema.enum.includes(value as never)) return false;\n if (type === \"string\")\n return (\n typeof value === \"string\" &&\n value.length >= (schema.minLength ?? 0) &&\n value.length <= schema.maxLength! &&\n (!schema.pattern || new RegExp(schema.pattern).test(value))\n );\n if (type === \"boolean\") return typeof value === \"boolean\";\n if (type === \"integer\" || type === \"number\")\n return (\n typeof value === \"number\" &&\n Number.isFinite(value) &&\n (type !== \"integer\" || Number.isSafeInteger(value)) &&\n value >= (schema.minimum ?? -Infinity) &&\n value <= (schema.maximum ?? Infinity)\n );\n if (type === \"array\")\n return (\n Array.isArray(value) &&\n value.length >= (schema.minItems ?? 0) &&\n value.length <= schema.maxItems! &&\n value.every((v) => matchesSubset(schema.items!, v))\n );\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const obj = value as Record<string, unknown>;\n return (\n Object.keys(obj).every((k) => Object.hasOwn(schema.properties!, k)) &&\n (schema.required ?? []).every((k) => Object.hasOwn(obj, k)) &&\n Object.entries(obj).every(([k, v]) =>\n matchesSubset(schema.properties![k], v),\n )\n );\n}\nexport function compileSubset(schema: SubsetSchema, mode: \"input\" | \"details\") {\n if (!validateSubset(schema, mode)) throw new TypeError(\"Unsupported schema\");\n return z.custom<Record<string, Json>>((value) => {\n try {\n return (\n jsonBytes(value) <= (mode === \"details\" ? 16384 : 131072) &&\n matchesSubset(schema, value)\n );\n } catch {\n return false;\n }\n });\n}\n","import { z } from \"zod\";\nimport { DateSchema, IdSchema } from \"./primitives\";\nimport { safeName, safePath } from \"./subset\";\nimport { jsonBytes } from \"./canonical-json\";\n\nconst utf8 = (value: string, maximum: number) => new TextEncoder().encode(value).length <= maximum;\nconst scalar = z.union([z.string().refine((value) => utf8(value, 2048)), z.number().finite(), z.boolean()]);\nexport const ExternalQueryValueSchema = scalar;\nconst scalarOrNull = z.union([scalar, z.null()]);\nconst record = <T extends z.ZodTypeAny>(item: T, max: number) => z.record(z.string().refine(safeName), item).refine((value) => Object.keys(value).length <= max);\n\nexport const ExternalQueryMappingSchema = z.union([\n z.strictObject({ input: z.string().refine(safeName), omitIfMissing: z.literal(true).optional() }),\n z.strictObject({ literal: scalar }),\n]);\nexport const ExternalQueryMappingsSchema = record(ExternalQueryMappingSchema, 32).superRefine((value, ctx) => {\n const reserved = /^(authorization|cookie|set-cookie|host|x-api-key|api_key|apikey|access_token|token|secret|password)$/i;\n for (const key of Object.keys(value)) if (reserved.test(key)) ctx.addIssue({ code: \"custom\", path: [key], message: \"Reserved query key\" });\n});\nexport const ExternalPathSchema = z.string().max(1024).refine((value) =>\n utf8(value, 1024) && /^\\/(?:[A-Za-z0-9._~-]+\\/)*[A-Za-z0-9._~-]*\\/?$/.test(value) &&\n !value.includes(\"//\") && !value.includes(\"%\") && !value.includes(\"\\\\\") &&\n !value.includes(\"?\") && !value.includes(\"#\") && !value.includes(\"{\") && !value.includes(\"}\") &&\n value.split(\"/\").every((segment) => segment !== \".\" && segment !== \"..\"),\n);\nconst mediaType = z.string().min(1).max(128).refine((value) => value === value.toLowerCase() && /^[a-z0-9!#$&^_.+-]+\\/[a-z0-9!#$&^_.+-]+$/.test(value));\nconst jsonMime = (value: string) => value === \"application/json\" || /^application\\/[a-z0-9!#$&^_.+-]+\\+json$/.test(value);\nconst textMime = (value: string) => /^text\\/[a-z0-9!#$&^_.+-]+$/.test(value) || value === \"application/xml\" || /^application\\/[a-z0-9!#$&^_.+-]+\\+xml$/.test(value) || jsonMime(value);\nexport const ExternalResponseFormatSchema = z.strictObject({ mode: z.enum([\"JSON\", \"TEXT\"]), mediaTypes: z.array(mediaType).min(1).max(8).refine((values) => new Set(values).size === values.length) }).refine((value) => value.mediaTypes.every(value.mode === \"JSON\" ? jsonMime : textMime));\nexport const FieldProjectionSchema = record(z.strictObject({ path: z.string().refine(safePath), omitIfMissing: z.literal(true).optional() }), 32).refine((value) => Object.keys(value).length >= 1);\nexport const ResponseFilterSchema = z.discriminatedUnion(\"op\", [\n z.strictObject({ path: z.string().refine(safePath), op: z.enum([\"EQ\", \"NE\", \"GT\", \"GTE\", \"LT\", \"LTE\", \"CONTAINS\", \"STARTS_WITH\"]), value: scalarOrNull }),\n z.strictObject({ path: z.string().refine(safePath), op: z.literal(\"IN\"), values: z.array(scalarOrNull).min(1).max(20) }),\n]);\nconst visualObject = z.strictObject({ kind: z.literal(\"OBJECT\"), fields: FieldProjectionSchema });\nconst visualList = z.strictObject({ kind: z.literal(\"LIST\"), fields: FieldProjectionSchema, filters: z.array(ResponseFilterSchema).max(8), sort: z.union([z.null(), z.strictObject({ path: z.string().refine(safePath), direction: z.enum([\"ASC\", \"DESC\"]) })]), limit: z.int().min(1).max(20) });\nexport const VisualResponseProcessingSchema = z.union([visualObject, visualList]);\nexport const ResponseProcessingSchema = z.union([VisualResponseProcessingSchema, z.strictObject({ kind: z.literal(\"JAVASCRIPT\"), runtimeVersion: z.literal(\"quickjs-sync.v1\"), source: z.string().min(1).refine((value) => utf8(value, 16384)) })]);\nexport const TransformResponseSchema = z.strictObject({ status: z.int().min(200).max(299), contentType: z.string().min(1).max(128), bodyText: z.string().refine((value) => utf8(value, 262144)), json: z.union([z.null(), z.json()]) });\nexport const TransformSampleSchema = z.strictObject({ status: z.int().min(200).max(299), contentType: z.string().min(1).max(128), bodyText: z.string().refine((value) => utf8(value, 262144)) }).refine((value) => jsonBytes(value) <= 524288);\nconst boundedValues = z.custom<Record<string, unknown>>((value) => {\n const visit = (node: unknown, depth: number): boolean =>\n depth <= 20 && (node === null || typeof node === \"string\" || typeof node === \"boolean\" || (typeof node === \"number\" && Number.isFinite(node)) ||\n (Array.isArray(node) && node.every((child) => visit(child, depth + 1))) ||\n (!!node && typeof node === \"object\" && !Array.isArray(node) && Object.getPrototypeOf(node) === Object.prototype && Object.entries(node).every(([key, child]) => ![\"__proto__\", \"prototype\", \"constructor\"].includes(key) && visit(child, depth + 1))));\n try { return !!value && typeof value === \"object\" && !Array.isArray(value) && visit(value, 1) && jsonBytes(value) <= 49152; } catch { return false; }\n});\nexport const ExternalHttpResultDataSchema = z.strictObject({ source: z.literal(\"EXTERNAL_HTTP\"), connectionRevisionId: IdSchema, observedAt: DateSchema, values: boundedValues });\nexport const ConnectionRevisionViewSchema = z.strictObject({ id: IdSchema, connectionId: IdSchema, revisionNumber: z.int().positive(), origin: z.string().min(1).max(2048), scope: z.enum([\"PLATFORM\", \"PER_SHOP\"]), authMode: z.enum([\"NONE\", \"BEARER\", \"API_KEY\"]), authHeader: z.string().min(1).max(128).nullable(), documentation: z.string().max(16000), createdAt: z.iso.datetime({ offset: false }) });\nexport const ConnectionViewSchema = z.strictObject({ id: IdSchema, key: z.string().regex(/^[a-z][a-z0-9_]{0,127}$/), displayName: z.string().min(1).max(255), description: z.string().max(4096), enabled: z.boolean(), editVersion: z.int().positive(), revisions: z.array(ConnectionRevisionViewSchema) });\nexport const CredentialStatusSchema = z.strictObject({ connectionRevisionId: IdSchema, shopId: IdSchema.nullable(), configured: z.boolean(), editVersion: z.int().positive().nullable(), updatedAt: z.iso.datetime({ offset: false }).nullable() });\nexport const ConnectionCommandSchema = z.strictObject({ operationId: IdSchema, reason: z.string().trim().min(1).max(1000) });\nexport const RevisionInputSchema = z.strictObject({ origin: z.string().min(1).max(2048), scope: z.enum([\"PLATFORM\", \"PER_SHOP\"]), authMode: z.enum([\"NONE\", \"BEARER\", \"API_KEY\"]), authHeader: z.string().min(1).max(128).nullable(), documentation: z.string().max(16000) });\nexport const ConnectionIssueSchema = z.strictObject({ path: z.string().max(256), message: z.string().min(1).max(512) });\nexport const ConnectionResultSchema = <T extends z.ZodType>(value: T) => z.discriminatedUnion(\"kind\", [\n z.strictObject({ kind: z.literal(\"ok\"), value }),\n z.strictObject({ kind: z.literal(\"not-found\") }),\n z.strictObject({ kind: z.literal(\"forbidden\") }),\n z.strictObject({ kind: z.literal(\"unavailable\") }),\n z.strictObject({ kind: z.literal(\"invalid\"), issues: z.array(ConnectionIssueSchema).max(32) }),\n z.strictObject({ kind: z.literal(\"conflict\"), code: z.enum([\"STALE_CAS\", \"CONFLICTING_REPLAY\"]) }),\n]);\nexport type ExternalResponseFormat = z.infer<typeof ExternalResponseFormatSchema>;\nexport type FieldProjection = z.infer<typeof FieldProjectionSchema>;\nexport type ResponseFilter = z.infer<typeof ResponseFilterSchema>;\nexport type VisualResponseProcessing = z.infer<typeof VisualResponseProcessingSchema>;\nexport type ResponseProcessing = z.infer<typeof ResponseProcessingSchema>;\nexport type TransformResponse = z.infer<typeof TransformResponseSchema>;\nexport type TransformSample = z.infer<typeof TransformSampleSchema>;\nexport type ExternalHttpResultData = z.infer<typeof ExternalHttpResultDataSchema>;\nexport type ConnectionRevisionView = z.infer<typeof ConnectionRevisionViewSchema>;\nexport type ConnectionView = z.infer<typeof ConnectionViewSchema>;\nexport type CredentialStatus = z.infer<typeof CredentialStatusSchema>;\nexport type ConnectionCommand = z.infer<typeof ConnectionCommandSchema>;\nexport type RevisionInput = z.infer<typeof RevisionInputSchema>;\nexport type ConnectionResult<T> =\n | { kind: \"ok\"; value: T }\n | { kind: \"not-found\" | \"forbidden\" | \"unavailable\" }\n | { kind: \"invalid\"; issues: Array<z.infer<typeof ConnectionIssueSchema>> }\n | { kind: \"conflict\"; code: \"STALE_CAS\" | \"CONFLICTING_REPLAY\" };\nexport type VisualResponseProcessorInput = { source: unknown; processing: VisualResponseProcessing; limits: { maxResults: number; deadlineAt: number }; signal: AbortSignal };\nexport type VisualResponseProcessorResult = { ok: true; values: Record<string, unknown> } | { ok: false; code: \"INVALID_RESPONSE\" | \"DEADLINE\" | \"CANCELLED\" };\nexport type CodeResponseProcessorInput = { response: TransformResponse; processing: Extract<ResponseProcessing, { kind: \"JAVASCRIPT\" }>; limits: { maxResults: number; deadlineAt: number }; signal: AbortSignal };\nexport type CodeResponseProcessorResult = { ok: true; values: Record<string, unknown> } | { ok: false; code: \"INVALID_RESPONSE\" | \"DEADLINE\" | \"CANCELLED\" | \"THROTTLED\"; diagnostic?: { code: \"SYNTAX_ERROR\" | \"EXECUTION_ERROR\" | \"INVALID_OUTPUT\" | \"RESOURCE_LIMIT\" | \"RUNTIME_UNAVAILABLE\"; line: number | null; column: number | null } };\n","import { z } from \"zod\";\nimport { gt } from \"semver\";\nimport {\n boundedJson,\n ContractVersionSchema,\n IdSchema,\n SemverSchema,\n HashSchema,\n distinct,\n} from \"./primitives\";\nimport {\n InputSchemaSchema,\n DetailsSchemaSchema,\n safeName,\n safePath,\n type SubsetSchema,\n compileSubset,\n} from \"./subset\";\nimport { canonicalJson } from \"./canonical-json\";\nimport {\n definitionFitsStorage,\n DEFINITION_SIZE_MESSAGE,\n} from \"./definition-size\";\nimport {\n ExternalPathSchema,\n ExternalQueryMappingsSchema,\n ExternalQueryValueSchema,\n ExternalResponseFormatSchema,\n ResponseProcessingSchema,\n} from \"./external\";\nexport const ToolNameSchema = z\n .string()\n .regex(/^[a-z][a-z0-9_]{0,127}$/)\n .refine((n) => n !== \"finalResponse\");\nexport const PublishedGrantedToolSchema = z.strictObject({\n toolId: IdSchema,\n toolRevisionId: IdSchema,\n toolName: ToolNameSchema,\n definitionVersion: SemverSchema,\n capabilityKeys: z\n .array(IdSchema)\n .min(1)\n .max(32)\n .refine((v) => distinct(v) && v.join(\"\\0\") === [...v].sort().join(\"\\0\")),\n});\nexport const PublishedToolDescriptorSchema = z.strictObject({\n toolId: IdSchema,\n toolRevisionId: IdSchema,\n name: ToolNameSchema,\n definitionVersion: SemverSchema,\n description: z.string().min(1).max(4096),\n inputSchema: InputSchemaSchema,\n});\nexport const CommerceBuiltInToolNameSchema = z.enum([\n \"commerce_get_discount_options\", \"commerce_get_discount_details\",\n]).meta({maxLength: 29});\nexport const CommerceBuiltInToolGrantSchema = z.strictObject({\n kind: z.enum([\"BUILT_IN\"]).meta({maxLength: 8}),\n toolName: CommerceBuiltInToolNameSchema,\n definitionVersion: z.enum([\"2.0.0\"]).meta({maxLength: 5}),\n});\nexport const CommerceBuiltInToolDescriptorSchema = z.strictObject({\n kind: z.enum([\"BUILT_IN\"]).meta({maxLength: 8}),\n name: CommerceBuiltInToolNameSchema,\n definitionVersion: z.enum([\"2.0.0\"]).meta({maxLength: 5}),\n description: z.string().min(1).max(4096),\n inputSchema: InputSchemaSchema,\n});\nexport type PublishedGrantedTool = z.infer<typeof PublishedGrantedToolSchema>;\nexport type PublishedToolDescriptor = z.infer<typeof PublishedToolDescriptorSchema>;\nexport type CommerceBuiltInToolGrant = z.infer<typeof CommerceBuiltInToolGrantSchema>;\nexport type CommerceBuiltInToolDescriptor = z.infer<typeof CommerceBuiltInToolDescriptorSchema>;\nexport const GrantedToolSchema = z.union([PublishedGrantedToolSchema, CommerceBuiltInToolGrantSchema]);\nexport const ToolDescriptorSchema = z.union([PublishedToolDescriptorSchema, CommerceBuiltInToolDescriptorSchema]);\nexport const GrantedToolsSchema = z.array(GrantedToolSchema).max(32).refine(values => {\n const published = values.filter((value): value is PublishedGrantedTool => !(\"kind\" in value));\n return distinct(values.map(value => value.toolName)) && distinct(published.map(value => value.toolId));\n});\nexport const isBuiltInTool = <T extends GrantedTool | ToolDescriptor>(\n value: T,\n): value is Extract<T, {kind: \"BUILT_IN\"}> => \"kind\" in value && value.kind === \"BUILT_IN\";\n\nconst MappingSchema = z.union([\n z.strictObject({\n input: z.string().refine(safeName),\n omitIfMissing: z.literal(true).optional(),\n }),\n z.strictObject({ literal: boundedJson(8192) }),\n]);\nconst MappingsSchema = z\n .record(z.string().refine(safeName), MappingSchema)\n .refine((v) => Object.keys(v).length <= 32);\nexport const POLICY_OPERATIONS = [\n \"taxonomy.resolveCategories\",\n \"products.search\",\n \"products.get\",\n \"shipping.getInformation\",\n \"recovery.getBasket\",\n \"shopify.searchProducts\",\n \"discounts.getOptions\",\n \"discounts.getDetails\",\n \"discounts.evaluate\",\n \"products.findQualifying\",\n \"products.findSimilar\",\n] as const;\nexport const ExternalHttpExecutionSchema = z\n .strictObject({\n kind: z.literal(\"EXTERNAL_HTTP\"),\n executorVersion: z.literal(\"1.0.0\"),\n connectionRevisionId: IdSchema,\n method: z.literal(\"GET\"),\n path: ExternalPathSchema,\n query: ExternalQueryMappingsSchema,\n responseFormat: ExternalResponseFormatSchema,\n resultPath: z.string().refine((value) => value === \"\" || safePath(value)),\n responseProcessing: ResponseProcessingSchema,\n resultSchema: DetailsSchemaSchema,\n })\n .superRefine((value, ctx) => {\n if (value.responseProcessing.kind === \"JAVASCRIPT\" && value.resultPath !== \"\")\n ctx.addIssue({ code: \"custom\", path: [\"resultPath\"], message: \"JAVASCRIPT processing requires an empty resultPath\" });\n if (value.responseProcessing.kind !== \"JAVASCRIPT\" && value.responseFormat.mode !== \"JSON\")\n ctx.addIssue({ code: \"custom\", path: [\"responseFormat\", \"mode\"], message: \"Visual processing requires JSON\" });\n });\nexport const CommerceExecutionSchema = z.discriminatedUnion(\"kind\", [\n z.strictObject({\n kind: z.literal(\"SHOPIFY_STOREFRONT_QUERY\"),\n executorVersion: z.literal(\"1.0.0\"),\n apiVersion: z.literal(\"2026-07\"),\n schemaHash: HashSchema,\n document: z\n .string()\n .min(1)\n .refine((v) => new TextEncoder().encode(v).length <= 16384),\n operationName: z.string().refine(safeName),\n variables: MappingsSchema,\n resultPath: z.string().refine(safePath),\n }),\n z.strictObject({\n kind: z.literal(\"POLICY_OPERATION\"),\n operation: z.enum(POLICY_OPERATIONS),\n operationVersion: z.literal(\"1.0.0\"),\n arguments: MappingsSchema,\n }),\n ExternalHttpExecutionSchema,\n]);\nexport type ExternalHttpExecution = Extract<\n z.infer<typeof CommerceExecutionSchema>,\n { kind: \"EXTERNAL_HTTP\" }\n>;\nfunction tokensValid(text: string, root: \"result\" | \"item\") {\n if (/[<>]/.test(text)) return false;\n const residue = text.replace(/\\{\\{([^{}]+)\\}\\}/g, (_all, path: string) =>\n path.startsWith(root + \".\") && safePath(path.slice(root.length + 1))\n ? \"\"\n : \"{{invalid}}\",\n );\n return !residue.includes(\"{{\") && !residue.includes(\"}}\");\n}\nconst fixed = z\n .string()\n .max(4096)\n .refine((v) => !/[<>]|\\{\\{|\\}\\}/.test(v));\nexport const ResponseTemplateSchema = z.discriminatedUnion(\"kind\", [\n z.strictObject({\n kind: z.literal(\"text\"),\n text: z\n .string()\n .max(4096)\n .refine((v) => tokensValid(v, \"result\")),\n unavailable: fixed,\n }),\n z.strictObject({\n kind: z.literal(\"items\"),\n itemsPath: z.string().refine(safePath),\n item: z\n .string()\n .max(4096)\n .refine((v) => tokensValid(v, \"item\")),\n empty: fixed,\n unavailable: fixed,\n }),\n]);\nconst identity = {\n name: ToolNameSchema,\n definitionVersion: SemverSchema,\n description: z.string().min(1).max(4096),\n};\nconst forbiddenInput =\n /^(shopid|customerid|checkoutrecoveryid|conversationid|grantid|releaseid|token|accesstoken|domain|headers|url|graphql|document|authorization)$/i;\nconst forbiddenExternalInput = /^(authorization|cookie|set-cookie|host|x-api-key|api_key|apikey|access_token|token|secret|password)$/i;\nexport const CommerceToolDefinitionSchema = z\n .strictObject({\n ...identity,\n inputSchema: InputSchemaSchema,\n execution: CommerceExecutionSchema,\n responseTemplate: ResponseTemplateSchema,\n })\n .refine(definitionFitsStorage, { message: DEFINITION_SIZE_MESSAGE })\n .superRefine((d, ctx) => {\n const properties = d.inputSchema.properties!;\n const containsAuthority = (schema: SubsetSchema): boolean =>\n Object.entries(schema.properties ?? {}).some(\n ([name, child]) =>\n forbiddenInput.test(name) || containsAuthority(child),\n ) || !!(schema.items && containsAuthority(schema.items));\n if (containsAuthority(d.inputSchema))\n ctx.addIssue({\n code: \"custom\",\n message: \"Authority/credential inputs are forbidden\",\n });\n const mapping =\n d.execution.kind === \"POLICY_OPERATION\"\n ? d.execution.arguments\n : d.execution.kind === \"SHOPIFY_STOREFRONT_QUERY\"\n ? d.execution.variables\n : d.execution.query;\n for (const [name, m] of Object.entries(mapping))\n if (\"input\" in m && !Object.hasOwn(properties, m.input))\n ctx.addIssue({\n code: \"custom\",\n path: [\"execution\", name],\n message: \"Unknown mapped input\",\n });\n if (d.execution.kind === \"EXTERNAL_HTTP\")\n for (const [name, mapping] of Object.entries(d.execution.query))\n if (\"input\" in mapping) {\n const target = properties[mapping.input];\n const type = target && (Array.isArray(target.type) ? target.type[0] : target.type);\n if (forbiddenExternalInput.test(mapping.input) || ![\"string\", \"integer\", \"boolean\"].includes(type ?? \"\"))\n ctx.addIssue({ code: \"custom\", path: [\"execution\", \"query\", name], message: \"External mappings require a top-level scalar input\" });\n }\n });\nconst draftObject = boundedJson(65536).refine(\n (v) => !!v && typeof v === \"object\" && !Array.isArray(v),\n);\nexport const CommerceToolDraftDefinitionSchema = z\n .strictObject({\n ...identity,\n inputSchema: draftObject,\n execution: draftObject,\n responseTemplate: draftObject,\n })\n .refine(definitionFitsStorage, { message: DEFINITION_SIZE_MESSAGE });\nexport type CommerceToolDefinition = z.infer<\n typeof CommerceToolDefinitionSchema\n>;\nexport type CommerceToolDraftDefinition = z.infer<\n typeof CommerceToolDraftDefinitionSchema\n>;\nexport type GrantedTool = z.infer<typeof GrantedToolSchema>;\nexport type ToolDescriptor = z.infer<typeof ToolDescriptorSchema>;\n/** Commerce owns schema-backed GraphQL parsing, restrictions and output derivation. */\nexport interface CommerceDefinitionCompiler {\n compile(\n execution: CommerceToolDefinition[\"execution\"],\n input: SubsetSchema,\n ): {\n outputSchema: SubsetSchema;\n validateMappedArguments: (\n mapping: CommerceToolDefinition[\"execution\"],\n ) => boolean;\n };\n}\nfunction externalOutputSchema(execution: ExternalHttpExecution): SubsetSchema {\n return {\n type: \"object\",\n properties: { values: execution.resultSchema },\n required: [\"values\"],\n additionalProperties: false,\n };\n}\nfunction scalarSchema(schema: SubsetSchema | undefined) {\n const type = schema && (Array.isArray(schema.type) ? schema.type[0] : schema.type);\n return !!schema && [\"string\", \"integer\", \"number\", \"boolean\"].includes(type ?? \"\");\n}\nfunction visualPublicationCompatible(execution: ExternalHttpExecution) {\n if (execution.responseProcessing.kind === \"JAVASCRIPT\") return true;\n const processing = execution.responseProcessing;\n const schema = execution.resultSchema;\n if (processing.kind === \"LIST\") {\n const items = schema.properties?.items;\n if (!items || items.type !== \"array\" || !(schema.required ?? []).includes(\"items\")) return false;\n if (Object.keys(schema.properties ?? {}).some((name) => name !== \"items\")) return false;\n if (items.minItems !== undefined && items.minItems > 0) return false;\n if (items.maxItems !== undefined && items.maxItems < processing.limit) return false;\n }\n const output = processing.kind === \"OBJECT\"\n ? schema\n : schema.properties?.items?.items;\n if (!output || output.type !== \"object\" || !output.properties || output.additionalProperties !== false) return false;\n const fields = processing.fields;\n if (Object.keys(output.properties).some((name) => !Object.hasOwn(fields, name) || !scalarSchema(output.properties![name]))) return false;\n if (Object.keys(fields).some((name) => !Object.hasOwn(output.properties!, name))) return false;\n return (output.required ?? []).every((name) => !fields[name]?.omitIfMissing);\n}\nfunction at(schema: SubsetSchema, path: string) {\n let current: SubsetSchema | undefined = schema;\n for (const part of path.split(\".\")) current = current?.properties?.[part];\n return current;\n}\nexport function validateDefinitionForPublication(\n raw: unknown,\n compiler: CommerceDefinitionCompiler,\n) {\n const definition = CommerceToolDefinitionSchema.parse(raw);\n if (definition.execution.kind === \"EXTERNAL_HTTP\" && !visualPublicationCompatible(definition.execution))\n throw new TypeError(\"External visual projection is incompatible with resultSchema\");\n const compiled =\n definition.execution.kind === \"EXTERNAL_HTTP\"\n ? { outputSchema: externalOutputSchema(definition.execution), validateMappedArguments: () => true }\n : compiler.compile(definition.execution, definition.inputSchema);\n if (!compiled.validateMappedArguments(definition.execution))\n throw new TypeError(\"Invalid variable/operation mapping\");\n const template = definition.responseTemplate;\n const schema =\n template.kind === \"text\"\n ? compiled.outputSchema\n : at(compiled.outputSchema, template.itemsPath)?.items;\n if (!schema) throw new TypeError(\"Unknown template items path\");\n const text = template.kind === \"text\" ? template.text : template.item;\n for (const match of text.matchAll(/\\{\\{(?:result|item)\\.([^{}]+)\\}\\}/g)) {\n const target = at(schema, match[1]);\n const type =\n target && (Array.isArray(target.type) ? target.type[0] : target.type);\n if (!type || [\"object\", \"array\"].includes(type))\n throw new TypeError(\"Unknown or nonscalar template path\");\n }\n return definition;\n}\nexport function definitionToMcpDescriptor(definition: CommerceToolDefinition) {\n const d = CommerceToolDefinitionSchema.parse(definition);\n return {\n name: d.name,\n description: d.description,\n inputSchema: d.inputSchema,\n };\n}\nexport function mapToolArguments(\n definition: CommerceToolDefinition,\n raw: unknown,\n) {\n const input = compileSubset(definition.inputSchema, \"input\").parse(raw);\n const mapping =\n definition.execution.kind === \"POLICY_OPERATION\"\n ? definition.execution.arguments\n : definition.execution.kind === \"SHOPIFY_STOREFRONT_QUERY\"\n ? definition.execution.variables\n : definition.execution.query;\n const result: Record<string, unknown> = Object.create(null);\n for (const [key, m] of Object.entries(mapping)) {\n if (\"literal\" in m) result[key] = m.literal;\n else if (Object.hasOwn(input, m.input)) {\n const value = input[m.input];\n if (definition.execution.kind === \"EXTERNAL_HTTP\" && !ExternalQueryValueSchema.safeParse(value).success)\n throw new TypeError(\"Invalid external mapped scalar\");\n result[key] = value;\n }\n else if (!m.omitIfMissing) throw new TypeError(\"Missing mapped input\");\n }\n return result;\n}\nexport const toolHashInput = (definition: CommerceToolDefinition) => ({\n contractVersion: ContractVersionSchema.value,\n definition: CommerceToolDefinitionSchema.parse(definition),\n});\n/** Publication adapters supply the actual highest published version from persistence. */\nexport function validateDefinitionVersion(\n proposed: string,\n highestPublished: string | null,\n) {\n SemverSchema.parse(proposed);\n if (highestPublished === null) return proposed === \"1.0.0\";\n SemverSchema.parse(highestPublished);\n return gt(proposed, highestPublished);\n}\nexport const CommerceToolIdentitySchema = z.strictObject({\n id: IdSchema,\n name: ToolNameSchema,\n enabled: z.boolean(),\n});\nexport const CommerceToolRevisionIdentitySchema = z.strictObject({\n toolId: IdSchema,\n toolRevisionId: IdSchema,\n definitionVersion: SemverSchema,\n contentHash: HashSchema,\n});\nexport const POLICY_OPERATION_DESCRIPTORS = POLICY_OPERATIONS.map(\n (operation) => ({ operation, operationVersion: \"1.0.0\" as const }),\n);\n","import { canonicalJson } from \"./canonical-json\";\n\n/** Bytes of PostgreSQL jsonb::text for JSON.stringify-serialized values.\n * jsonb adds spaces after separators and expands exponent-form JSON numbers.\n * Key ordering changes no byte counts. This is not the canonical hash encoder.\n */\nexport function definitionStorageBytes(value: unknown): number {\n const normalized: unknown = JSON.parse(canonicalJson(value));\n const bytes = (s: string) => new TextEncoder().encode(s).length;\n function size(v: unknown): number {\n if (typeof v === \"number\") {\n const text = JSON.stringify(v);\n if (!text.includes(\"e\")) return text.length;\n const [coefficient, exponent] = text.split(\"e\");\n const sign = coefficient.startsWith(\"-\") ? 1 : 0;\n const unsigned = coefficient.slice(sign);\n const digits = unsigned.replace(\".\", \"\").length;\n const point =\n (unsigned.indexOf(\".\") < 0 ? unsigned.length : unsigned.indexOf(\".\")) +\n Number(exponent);\n return (\n sign +\n (point <= 0 ? 2 - point + digits : point >= digits ? point : digits + 1)\n );\n }\n if (Array.isArray(v))\n return (\n 2 +\n Math.max(0, v.length - 1) * 2 +\n v.reduce((sum, item) => sum + size(item), 0)\n );\n if (v && typeof v === \"object\") {\n const entries = Object.entries(v);\n return (\n 2 +\n Math.max(0, entries.length - 1) * 2 +\n entries.reduce(\n (sum, [key, item]) =>\n sum + bytes(JSON.stringify(key)) + 2 + size(item),\n 0,\n )\n );\n }\n return bytes(JSON.stringify(v));\n }\n return size(normalized);\n}\nexport const definitionFitsStorage = (value: unknown): boolean => {\n try {\n return definitionStorageBytes(value) <= 65536;\n } catch {\n return false;\n }\n};\nexport const DEFINITION_SIZE_MESSAGE =\n \"Definition exceeds the 65536-byte jsonb text limit\";\n","import { canonicalJson } from \"./canonical-json\";\nimport type { CommerceBuiltInToolDescriptor, CommerceBuiltInToolGrant } from \"./definitions\";\n\nfunction immutable<T extends object>(value: T): T {\n for (const child of Object.values(value))\n if (child && typeof child === \"object\") immutable(child);\n return Object.freeze(value);\n}\n\n/** Code-owned descriptors with stable name/version identities. */\nexport const commerceDiscountBuiltInDescriptors: readonly CommerceBuiltInToolDescriptor[] = immutable<CommerceBuiltInToolDescriptor[]>([\n {\n kind: \"BUILT_IN\", name: \"commerce_get_discount_options\", definitionVersion: \"2.0.0\",\n description: \"Read the current shop's permitted discount options.\",\n inputSchema: {\n type: \"object\", properties: {\n limit: {type: \"integer\", minimum: 1, maximum: 50},\n cursor: {type: [\"string\", \"null\"], maxLength: 2048},\n }, additionalProperties: false,\n },\n },\n {\n kind: \"BUILT_IN\", name: \"commerce_get_discount_details\", definitionVersion: \"2.0.0\",\n description: \"Read details for a permitted discount in the current shop.\",\n inputSchema: {\n type: \"object\", properties: {offerId: {type: \"string\", minLength: 1, maxLength: 128}},\n required: [\"offerId\"], additionalProperties: false,\n },\n },\n]);\n\nexport function isTrustedCommerceBuiltInDescriptor(value: CommerceBuiltInToolDescriptor): boolean {\n return commerceDiscountBuiltInDescriptors.some(expected => canonicalJson(expected) === canonicalJson(value));\n}\nexport function isTrustedCommerceBuiltInGrant(value: CommerceBuiltInToolGrant): boolean {\n return commerceDiscountBuiltInDescriptors.some(expected =>\n value.toolName === expected.name && value.definitionVersion === expected.definitionVersion);\n}\n","import { z } from \"zod\";\nimport { IdSchema, LanguageSchema } from \"./primitives\";\nimport { DetailsSchemaSchema, compileSubset, type Json } from \"./subset\";\nimport {\n jsonBytes,\n responseContractCanonicalJson,\n type Digest,\n} from \"./canonical-json\";\nimport { canonicaliseLanguageTag } from \"../internationalization\";\nexport const CommerceResponseContractSchema = z\n .strictObject({\n version: z.literal(\"response.v1\"),\n instructions: z.string().min(1).max(8000),\n detailsSchema: DetailsSchemaSchema,\n })\n .refine((v) => jsonBytes(v) <= 32768);\nexport type CommerceResponseContract = z.infer<\n typeof CommerceResponseContractSchema\n>;\nexport const EMPTY_RESPONSE_CONTRACT: CommerceResponseContract = {\n version: \"response.v1\",\n instructions:\n \"Write a concise, natural WhatsApp reply supported by the available facts. Return an empty details object.\",\n detailsSchema: {\n type: \"object\",\n properties: {},\n required: [],\n additionalProperties: false,\n },\n};\nexport const ReferralReasonSchema = z.enum([\n \"INSUFFICIENT_TOOLS\",\n \"UNVERIFIABLE_FACTS\",\n \"TOOL_UNAVAILABLE\",\n \"TOOL_REVOKED\",\n]);\n\nconst DetectedLanguageTagSchema = z\n .string()\n .min(1)\n .max(128)\n .transform((value, ctx) => {\n const canonical = canonicaliseLanguageTag(value);\n\n if (!canonical) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Invalid detected language tag\",\n });\n return z.NEVER;\n }\n\n return canonical;\n });\n\nexport const CommerceFinalResponseSchema = z\n .strictObject({\n answerKind: z.enum([\"ANSWER\", \"REFER_TO_STORE\"]),\n replyText: z.string().min(1).max(4096),\n referralReason: ReferralReasonSchema.nullable(),\n detectedLanguageTag: DetectedLanguageTagSchema.nullable(),\n detectedLanguageConfidence: z.number().min(0).max(1).nullable(),\n evidenceIds: z\n .array(IdSchema)\n .max(3)\n .refine((v) => new Set(v).size === v.length),\n details: z.record(z.string(), z.unknown()).refine((v) => {\n try {\n return jsonBytes(v) <= 16384;\n } catch {\n return false;\n }\n }),\n })\n .superRefine((value, ctx) => {\n\n if (value.answerKind === \"ANSWER\") {\n if (value.referralReason !== null) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"referralReason\"],\n message: \"ANSWER must not include a referral reason\",\n });\n }\n }\n\n if (value.answerKind === \"REFER_TO_STORE\") {\n if (value.referralReason === null) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"referralReason\"],\n message: \"REFER_TO_STORE requires a referral reason\",\n });\n }\n\n if (value.evidenceIds.length !== 0) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"evidenceIds\"],\n message: \"REFER_TO_STORE must not include evidence\",\n });\n }\n\n if (Object.keys(value.details).length !== 0) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"details\"],\n message: \"REFER_TO_STORE must not include details\",\n });\n }\n }\n });\nexport type CommerceFinalResponse = z.infer<typeof CommerceFinalResponseSchema>;\nexport function finalResponseSchema(definition: CommerceResponseContract) {\n const contract = CommerceResponseContractSchema.parse(definition);\n const details = compileSubset(contract.detailsSchema, \"details\");\n return CommerceFinalResponseSchema.refine(\n (v) =>\n v.answerKind === \"REFER_TO_STORE\" || details.safeParse(v.details).success,\n {\n path: [\"details\"],\n message: \"Details do not match pinned contract\",\n },\n );\n}\nexport function verifyResponseContract(\n definition: unknown,\n hash: string,\n digest: Digest,\n) {\n const parsed = CommerceResponseContractSchema.parse(definition);\n if (\n !/^[a-f0-9]{64}$/.test(hash) ||\n digest(responseContractCanonicalJson(parsed)) !== hash\n )\n throw new TypeError(\"Incompatible response contract\");\n return parsed;\n}\n/** JSON Schema branches retain the immutable envelope; only ANSWER details vary. */\nexport function finalResponseToolSchema(definition: CommerceResponseContract) {\n const contract = CommerceResponseContractSchema.parse(definition);\n const properties = {\n answerKind: { enum: [\"ANSWER\", \"REFER_TO_STORE\"] },\n replyText: { type: \"string\", minLength: 1, maxLength: 4096 },\n referralReason: {\n enum: [\n null,\n \"INSUFFICIENT_TOOLS\",\n \"UNVERIFIABLE_FACTS\",\n \"TOOL_UNAVAILABLE\",\n \"TOOL_REVOKED\",\n ],\n },\n detectedLanguageTag: { type: [\"string\", \"null\"], maxLength: 128 },\n detectedLanguageConfidence: {\n type: [\"number\", \"null\"],\n minimum: 0,\n maximum: 1,\n },\n evidenceIds: {\n type: \"array\",\n maxItems: 3,\n uniqueItems: true,\n items: { type: \"string\", maxLength: 128 },\n },\n details: { type: \"object\" },\n };\n return {\n type: \"object\",\n additionalProperties: false,\n properties,\n required: Object.keys(properties),\n allOf: [\n {\n oneOf: [\n {\n properties: {\n answerKind: { const: \"ANSWER\" },\n referralReason: { type: \"null\" },\n details: contract.detailsSchema,\n },\n },\n {\n properties: {\n answerKind: { const: \"REFER_TO_STORE\" },\n referralReason: { enum: ReferralReasonSchema.options },\n evidenceIds: { maxItems: 0 },\n details: {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n },\n },\n },\n ],\n },\n {\n oneOf: [\n {\n properties: {\n detectedLanguageTag: { type: \"null\" },\n detectedLanguageConfidence: { type: \"null\" },\n },\n },\n {\n properties: {\n detectedLanguageTag: { type: \"string\" },\n detectedLanguageConfidence: { type: \"number\" },\n },\n },\n ],\n },\n ],\n } as unknown as Json;\n}\n","import { z } from \"zod\";\nimport { validRange } from \"semver\";\nimport {\n ContractVersionSchema as V,\n IdSchema as ID,\n SemverSchema,\n HashSchema,\n DateSchema,\n MoneySchema,\n CurrencySchema,\n distinct,\n boundedJson,\n} from \"./primitives\";\nimport { GrantedToolsSchema, PublishedToolDescriptorSchema, CommerceBuiltInToolDescriptorSchema, isBuiltInTool, type PublishedGrantedTool } from \"./definitions\";\nimport { isTrustedCommerceBuiltInDescriptor, isTrustedCommerceBuiltInGrant } from \"./built-in-tools\";\nimport { CommerceResponseContractSchema } from \"./response\";\nimport { canonicalJson, jsonBytes } from \"./canonical-json\";\nexport const CommerceTurnIdentitySchema = z.strictObject({\n contractVersion: V,\n shopId: ID,\n checkoutRecoveryId: ID,\n conversationId: ID,\n inboundVersion: z.number().int().positive(),\n});\nexport type CommerceTurnIdentity = z.infer<typeof CommerceTurnIdentitySchema>;\nexport const CommerceConversationGrantSchema = z\n .strictObject({\n id: ID,\n shopId: ID,\n conversationId: ID,\n initialInboundVersion: z.number().int().positive(),\n releaseId: ID,\n selectedCapabilityKeys: z\n .array(ID)\n .max(32)\n .refine(distinct),\n grantedTools: GrantedToolsSchema,\n runnerVersion: SemverSchema,\n createdAt: DateSchema,\n expiresAt: DateSchema.nullable(),\n })\n .superRefine((v, c) => {\n if (v.expiresAt && Date.parse(v.expiresAt) <= Date.parse(v.createdAt))\n c.addIssue({ code: \"custom\", message: \"Invalid grant retention date\" });\n if (\n jsonBytes(v.grantedTools) > 65536 ||\n jsonBytes(v.selectedCapabilityKeys) > 8192 ||\n v.grantedTools.some((t) =>\n isBuiltInTool(t) ? !isTrustedCommerceBuiltInGrant(t) : t.capabilityKeys.some((k) => !v.selectedCapabilityKeys.includes(k)),\n )\n )\n c.addIssue({ code: \"custom\", message: \"Unselected grant provenance\" });\n });\nexport type CommerceConversationGrant = z.infer<\n typeof CommerceConversationGrantSchema\n>;\nexport const CommerceManifestSchema = z\n .strictObject({\n contractVersion: V,\n releaseId: ID,\n runnerCompatibility: z\n .string()\n .min(1)\n .max(128)\n .refine((v) => !!validRange(v)),\n capabilities: z\n .array(\n z.strictObject({\n capabilityId: ID,\n key: ID,\n featureId: ID,\n position: z.number().int().nonnegative(),\n toolDescriptor: PublishedToolDescriptorSchema,\n }),\n )\n .max(32),\n featureBehaviours: z\n .array(\n z.strictObject({\n featureId: ID,\n behaviourPrompt: z.string().max(32000),\n }),\n )\n .max(32),\n selectedCapabilityKeys: z.array(ID).max(32).refine(distinct),\n builtInTools: z.array(CommerceBuiltInToolDescriptorSchema).max(2).default([]),\n grantedTools: GrantedToolsSchema,\n responseContract: CommerceResponseContractSchema,\n responseContractHash: HashSchema,\n })\n .superRefine((v, c) => {\n if (jsonBytes(v) > 262144)\n c.addIssue({ code: \"custom\", message: \"Manifest exceeds output limit\" });\n const keys = v.capabilities.map((x) => x.key);\n const capabilityIds = v.capabilities.map((x) => x.capabilityId);\n const representedFeatures = [...new Set(v.capabilities.map((x) => x.featureId))];\n const behaviourFeatureIds = v.featureBehaviours.map((x) => x.featureId);\n if (\n !distinct(keys) ||\n !distinct(capabilityIds) ||\n JSON.stringify(keys) !== JSON.stringify(v.selectedCapabilityKeys) ||\n v.capabilities.some(\n (x, i) => i > 0 && x.position <= v.capabilities[i - 1].position,\n ) ||\n !distinct(behaviourFeatureIds) ||\n JSON.stringify(representedFeatures) !== JSON.stringify(behaviourFeatureIds)\n )\n c.addIssue({\n code: \"custom\",\n message: \"Invalid capability ordering/selection\",\n });\n const union = new Map<\n string,\n { tool: PublishedGrantedTool; descriptor: string }\n >();\n for (const cap of v.capabilities) {\n const d = cap.toolDescriptor;\n const old = union.get(d.toolId);\n const descriptor = canonicalJson(d);\n if (old) {\n if (old.descriptor !== descriptor)\n c.addIssue({\n code: \"custom\",\n message: \"Conflicting tool revisions/descriptors\",\n });\n old.tool.capabilityKeys.push(cap.key);\n } else\n union.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 if (\n union.size + v.builtInTools.length !== v.grantedTools.length ||\n !distinct(v.builtInTools.map(tool => tool.name)) ||\n v.builtInTools.some(tool => !isTrustedCommerceBuiltInDescriptor(tool)) ||\n v.grantedTools.some((t) => {\n if (isBuiltInTool(t)) return !v.builtInTools.some(descriptor =>\n descriptor.name === t.toolName && descriptor.definitionVersion === t.definitionVersion &&\n isTrustedCommerceBuiltInGrant(t));\n const expected = union.get(t.toolId)?.tool;\n return (\n !expected ||\n expected.toolRevisionId !== t.toolRevisionId ||\n expected.toolName !== t.toolName ||\n expected.definitionVersion !== t.definitionVersion ||\n JSON.stringify([...new Set(expected.capabilityKeys)].sort()) !==\n JSON.stringify(t.capabilityKeys)\n );\n })\n )\n c.addIssue({\n code: \"custom\",\n message: \"Grant must equal selected capability set\",\n });\n });\nexport type CommerceManifest = z.infer<typeof CommerceManifestSchema>;\nexport const CommerceReleaseIdentitySchema = z.strictObject({\n contractVersion: V,\n releaseId: ID,\n runnerCompatibility: z\n .string()\n .min(1)\n .max(128)\n .refine((v) => !!validRange(v)),\n});\nexport const CommerceResolveAssertionSchema = CommerceTurnIdentitySchema.extend(\n { purpose: z.literal(\"resolve\") },\n);\nexport const CommerceExecuteAssertionSchema = CommerceTurnIdentitySchema.extend(\n { purpose: z.literal(\"execute\"), grantId: ID, releaseId: ID },\n);\nexport const CommerceAssertionSchema = z.discriminatedUnion(\"purpose\", [\n CommerceResolveAssertionSchema,\n CommerceExecuteAssertionSchema,\n]);\nconst qty = z.number().int().min(1).max(999);\nexport const CommerceProposalSchema = z\n .strictObject({\n operations: z\n .array(\n z.discriminatedUnion(\"kind\", [\n z.strictObject({\n kind: z.literal(\"ADD\"),\n variantId: ID,\n quantity: qty,\n }),\n z.strictObject({\n kind: z.literal(\"REPLACE\"),\n lineId: ID,\n variantId: ID,\n quantity: qty,\n }),\n ]),\n )\n .min(1)\n .max(3),\n })\n .refine((v) =>\n distinct(\n v.operations.flatMap((o) => (o.kind === \"REPLACE\" ? [o.lineId] : [])),\n ),\n );\nexport const CommerceBasketSchema = z\n .strictObject({\n basketId: ID,\n source: z.enum([\"RECOVERY_SNAPSHOT\", \"PROPOSED\"]),\n observedAt: DateSchema,\n currency: CurrencySchema.nullable(),\n lines: z\n .array(\n z.strictObject({\n lineId: ID,\n productId: ID.nullable(),\n variantId: ID.nullable(),\n quantity: qty.nullable(),\n unitPrice: MoneySchema.nullable(),\n }),\n )\n .max(100),\n fingerprint: HashSchema,\n unknownFields: z.array(z.string().min(1).max(256)).max(128),\n })\n .refine((v) => distinct(v.lines.map((line) => line.lineId)));\nexport const CommerceProductSaleEvidenceSchema = z.strictObject({\n regularPrice: MoneySchema.nullable(),\n salePrice: MoneySchema.nullable(),\n observedAt: DateSchema,\n});\nexport type CommerceProductSaleEvidence =\n z.infer<typeof CommerceProductSaleEvidenceSchema>;\n\nexport const CommerceProductSchema = z.strictObject({\n productId: ID,\n variantId: ID.nullable(),\n title: z.string().min(1).max(512),\n url: z\n .url({ protocol: /^https$/ })\n .refine((v) => {\n const u = new URL(v);\n return !u.username && !u.password && !u.port;\n })\n .nullable(),\n available: z.boolean().nullable(),\n unitPrice: MoneySchema.nullable(),\n currency: CurrencySchema.nullable(),\n productType: z.string().max(512).nullable(),\n vendor: z.string().max(512).nullable(),\n categories: z.array(z.string()).optional(),\n categoryIds: z.array(ID).max(128).optional(),\n collectionIds: z.array(ID).max(128).optional(),\n imageUrl: z.string().nullable().optional(),\n saleEvidence: CommerceProductSaleEvidenceSchema.nullable().optional(),\n observedAt: DateSchema,\n});\n// Discount outputs own their UTC wire syntax; general DateSchema remains unchanged.\n// The final lookahead requires absolute end-of-input (unlike JavaScript's $).\nconst discountUtcPattern = /^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(?:\\.[0-9]+)?Z(?![\\s\\S])/;\nconst CommerceDiscountDateTimeSchema = z.string().regex(discountUtcPattern).refine(value => {\n const match = discountUtcPattern.exec(value);\n if (!match) return false;\n const [year, month, day, hour, minute, second] = match.slice(1).map(Number);\n if (month < 1 || month > 12 || hour > 23 || minute > 59 || second > 59) return false;\n const leapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n const daysInMonth = [31, leapYear ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n return day >= 1 && day <= daysInMonth[month - 1];\n}, \"Expected a valid UTC discount timestamp with seconds\");\n\nexport const CommerceOfferSchema = z\n .strictObject({\n offerId: ID,\n title: z.string().min(1).max(512),\n method: z.enum([\"AUTOMATIC\", \"CODE\"]),\n code: z.string().min(1).max(128).nullable(),\n startsAt: CommerceDiscountDateTimeSchema.nullable(),\n endsAt: CommerceDiscountDateTimeSchema.nullable(),\n support: z.enum([\"SUPPORTED\", \"UNSUPPORTED\", \"UNKNOWN\"]),\n reasonCodes: z.array(z.string().min(1).max(64)).max(16),\n })\n .refine(\n (v) =>\n (v.startsAt === null ||\n v.endsAt === null ||\n Date.parse(v.startsAt) < Date.parse(v.endsAt)) &&\n (v.method !== \"AUTOMATIC\" || v.code === null),\n );\nexport const CommerceDiscountCombinationFactsSchema = z.strictObject({\n discountClasses: z.array(z.enum([\"ORDER\", \"PRODUCT\", \"SHIPPING\"])).max(3).nullable(),\n shopifyPlus: z.boolean().nullable(),\n combinesWith: z.strictObject({\n orderDiscounts: z.boolean().nullable(),\n productDiscounts: z.boolean().nullable(),\n shippingDiscounts: z.boolean().nullable(),\n }).nullable(),\n discountTags: z.array(z.string().min(1).max(128)).max(64).nullable(),\n allowedSameLineProductTags: z.array(z.string().min(1).max(128)).max(64).nullable(),\n});\nexport type CommerceDiscountCombinationFacts = z.infer<\n typeof CommerceDiscountCombinationFactsSchema\n>;\nexport const CommerceDiscountConditionFactsSchema = z.strictObject({\n provider: z.enum([\"SHOPIFY\", \"WOOCOMMERCE\"]),\n completeness: z.enum([\"COMPLETE\", \"PARTIAL\", \"UNKNOWN\"]),\n observedAt: CommerceDiscountDateTimeSchema,\n providerStatus: z.string().max(64),\n unavailableAt: CommerceDiscountDateTimeSchema.nullable(),\n discountKind: z.enum([\n \"PERCENTAGE\",\n \"FIXED_AMOUNT\",\n \"FREE_SHIPPING\",\n \"BUY_X_GET_Y\",\n \"OTHER\",\n \"UNKNOWN\",\n ]),\n discountValue: MoneySchema.nullable(),\n discountCurrency: CurrencySchema.nullable(),\n targeting: z.strictObject({\n kind: z.enum([\n \"ALL\",\n \"PRODUCTS\",\n \"VARIANTS\",\n \"CATEGORIES\",\n \"COLLECTIONS\",\n \"MIXED\",\n \"UNKNOWN\",\n ]),\n includedProductIds: z.array(ID).max(128),\n includedVariantIds: z.array(ID).max(128),\n includedCategoryIds: z.array(ID).max(128),\n includedCollectionIds: z.array(ID).max(128),\n excludedProductIds: z.array(ID).max(128),\n excludedVariantIds: z.array(ID).max(128),\n excludedCategoryIds: z.array(ID).max(128),\n excludedCollectionIds: z.array(ID).max(128),\n }),\n minimumSubtotal: MoneySchema.nullable(),\n maximumSubtotal: MoneySchema.nullable(),\n subtotalRequirementCurrency: CurrencySchema.nullable(),\n minimumQuantity: z.number().int().nonnegative().nullable(),\n usageLimit: z.number().int().nonnegative().nullable(),\n usageCount: z.number().int().nonnegative().nullable(),\n perCustomerLimit: z.number().int().nonnegative().nullable(),\n customerScope: z.enum([\"ALL\", \"RESTRICTED\", \"UNKNOWN\"]),\n excludesSaleItems: z.boolean().nullable(),\n individualUse: z.boolean().nullable(),\n combination: CommerceDiscountCombinationFactsSchema,\n unrepresentedConditions: z.array(z.string().min(1).max(128)).max(24),\n});\nexport type CommerceDiscountConditionFacts = z.infer<\n typeof CommerceDiscountConditionFactsSchema\n>;\nexport const CommerceDiscountDetailsSchema = z.strictObject({\n offer: CommerceOfferSchema,\n facts: CommerceDiscountConditionFactsSchema,\n providerDiscountId: z.string().min(1).max(191).nullable(),\n});\nexport type CommerceDiscountDetails = z.infer<\n typeof CommerceDiscountDetailsSchema\n>;\nconst condition = z.strictObject({\n code: z.string().min(1).max(64),\n description: z.string().max(256),\n});\nexport const CommerceEvidenceSchema = z\n .strictObject({\n evidenceId: HashSchema,\n turn: CommerceTurnIdentitySchema,\n grantId: ID,\n releaseId: ID,\n offerId: ID,\n proposal: CommerceProposalSchema.nullable(),\n basketFingerprint: HashSchema,\n ruleFingerprint: HashSchema,\n evaluatedAt: DateSchema,\n expiresAt: DateSchema,\n outcome: z.enum([\n \"QUALIFIES_FOR_KNOWN_RULES\",\n \"DOES_NOT_QUALIFY\",\n \"UNKNOWN\",\n \"UNSUPPORTED\",\n ]),\n currency: CurrencySchema.nullable(),\n savings: MoneySchema.nullable(),\n resultingTotal: MoneySchema.nullable(),\n evaluatedConditions: z.array(condition).max(32),\n unresolvedConditions: z.array(condition).max(32),\n })\n .superRefine((v, c) => {\n if (Date.parse(v.expiresAt) - Date.parse(v.evaluatedAt) > 60000)\n c.addIssue({\n code: \"custom\",\n message: \"Evidence lifetime exceeds ceiling\",\n });\n if (\n v.outcome === \"QUALIFIES_FOR_KNOWN_RULES\" &&\n (v.unresolvedConditions.length ||\n Date.parse(v.expiresAt) <= Date.parse(v.evaluatedAt) ||\n v.currency === null ||\n v.savings === null ||\n v.resultingTotal === null)\n )\n c.addIssue({ code: \"custom\", message: \"Unsupported qualifying claim\" });\n });\nexport type CommerceEvidence = z.infer<typeof CommerceEvidenceSchema>;\nexport const CommerceAlternativeSchema = z\n .strictObject({\n product: CommerceProductSchema,\n proposal: CommerceProposalSchema,\n extraSpend: MoneySchema.nullable(),\n resultingTotal: MoneySchema.nullable(),\n currency: CurrencySchema.nullable(),\n evidence: CommerceEvidenceSchema.nullable(),\n similarityReasons: z.array(z.string().max(256)).max(3),\n })\n .refine((v) => v.product.available === true);\nexport const CommerceErrorCodeSchema = z.enum([\n \"INVALID_INPUT\",\n \"DENIED\",\n \"STALE_TURN\",\n \"NOT_FOUND\",\n \"UNAVAILABLE\",\n \"THROTTLED\",\n \"DEADLINE\",\n \"INCOMPATIBLE_VERSION\",\n]);\nexport function commerceToolResultSchema<T extends z.ZodType>(data: T) {\n return z.union([\n z.strictObject({\n contractVersion: V,\n status: z.literal(\"OK\"),\n data,\n renderedText: z.string().max(4096),\n }),\n z.strictObject({\n contractVersion: V,\n status: z.literal(\"ERROR\"),\n code: CommerceErrorCodeSchema,\n retryable: z.boolean(),\n renderedText: z.string().max(4096).optional(),\n }),\n ]);\n}\nexport const CommerceToolResultSchema = commerceToolResultSchema(\n boundedJson(262144),\n);\nexport type CommerceToolResult = z.infer<typeof CommerceToolResultSchema>;\nconst wireId = z.string().min(1).max(128);\nconst taxonomySource = z.enum([\"SHOPIFY_STANDARD_PRODUCT_TAXONOMY\"]).meta({maxLength: 33});\nexport const CommerceCategoryCandidateSchema = z.strictObject({\n categoryId: wireId,\n name: z.string().min(1).max(512),\n fullName: z.string().min(1).max(4096),\n parentId: wireId.nullable(),\n level: z.number().int().min(0).max(32),\n ancestorIds: z.array(wireId).max(32),\n distance: z.number().min(0).max(2),\n});\nexport type CommerceCategoryCandidate = z.infer<typeof CommerceCategoryCandidateSchema>;\nexport const CommerceCategoryResolutionSchema = z.union([\n z.strictObject({\n outcome: z.enum([\"CANDIDATES\", \"NO_CANDIDATES\"]).meta({maxLength: 13}),\n generationId: wireId,\n source: taxonomySource,\n taxonomyVersion: z.string().min(1).max(64),\n languageTag: z.string().min(1).max(35),\n candidates: z.array(CommerceCategoryCandidateSchema).max(10),\n }),\n z.strictObject({\n outcome: z.enum([\"UNAVAILABLE\"]).meta({maxLength: 11}),\n reasonCode: z.enum([\"NOT_READY\", \"TEMPORARY_UNAVAILABLE\"]).meta({maxLength: 21}),\n }),\n]);\nexport type CommerceCategoryResolution = z.infer<typeof CommerceCategoryResolutionSchema>;\nexport const CommerceOptionalLookupUnavailableSchema = z.strictObject({\n outcome: z.enum([\"UNAVAILABLE\"]).meta({maxLength: 11}),\n reasonCode: z.enum([\"TEMPORARY_UNAVAILABLE\"]).meta({maxLength: 21}),\n});\nexport type CommerceOptionalLookupUnavailable = z.infer<typeof CommerceOptionalLookupUnavailableSchema>;\nexport const CommerceProductRecommendationSelectionSchema = z.strictObject({\n productRecommendationVersion: z.enum([\"1\"]).meta({maxLength: 1}).optional(),\n productRecommendations: z.array(z.strictObject({\n scope: z.enum([\"PRODUCT_ONLY\", \"ADD_TO_BASKET\", \"REPLACE_BASKET_LINE\"]).meta({maxLength: 19}),\n basketLineId: wireId.nullable(),\n productId: wireId,\n variantId: wireId.nullable(),\n quantity: z.number().int().min(1).max(99),\n promotionKind: z.enum([\"NONE\", \"NATIVE_SALE\", \"DISCOUNT\"]).meta({maxLength: 11}),\n offerIds: z.array(wireId).max(3),\n })).min(1).max(3).optional(),\n});\nexport type CommerceProductRecommendationSelection = z.infer<typeof CommerceProductRecommendationSelectionSchema>;\nexport const CommerceResponseDispositionSchema = z.enum([\n \"STANDARD\", \"OUT_OF_SCOPE_REDIRECT\", \"SHIPPING_INFORMATION_UNVERIFIED\",\n]).meta({maxLength: 31});\nexport type CommerceResponseDisposition = z.infer<typeof CommerceResponseDispositionSchema>;\nexport const CommerceAnswerPresentationSelectionSchema = z.strictObject({\n responseDisposition: CommerceResponseDispositionSchema.optional(),\n shippingInformationSelection: z.strictObject({\n productId: wireId.nullable(),\n variantId: wireId.nullable(),\n }).optional(),\n});\nexport type CommerceAnswerPresentationSelection = z.infer<typeof CommerceAnswerPresentationSelectionSchema>;\nexport const CommerceShippingInformationInputSchema = z.strictObject({\n productId: wireId.nullable().default(null),\n variantId: wireId.nullable().default(null),\n});\nexport type CommerceShippingInformationInput = z.infer<typeof CommerceShippingInformationInputSchema>;\n// Relationships, current-shop ownership and policy UTF-8 budgets belong to the adapter.\nexport const CommerceShippingInformationSchema = z.strictObject({\n provider: z.enum([\"SHOPIFY\", \"WOOCOMMERCE\"]).meta({maxLength: 11}),\n observedAt: DateSchema,\n product: z.strictObject({\n status: z.enum([\"NOT_REQUESTED\", \"VARIANT_REQUIRED\", \"AVAILABLE\"]).meta({maxLength: 16}),\n productId: wireId.nullable(),\n variantId: wireId.nullable(),\n requiresShipping: z.boolean().nullable(),\n virtual: z.boolean().nullable(),\n weight: z.strictObject({\n value: z.number().min(0),\n unit: z.enum([\"GRAMS\", \"KILOGRAMS\", \"OUNCES\", \"POUNDS\"]).meta({maxLength: 9}).nullable(),\n }).nullable(),\n dimensions: z.strictObject({\n length: z.number().min(0).nullable(),\n width: z.number().min(0).nullable(),\n height: z.number().min(0).nullable(),\n unit: z.string().min(1).max(16).nullable(),\n }).nullable(),\n shippingClassId: wireId.nullable(),\n shippingClassSlug: z.string().min(1).max(512).nullable(),\n }),\n policy: z.strictObject({\n status: z.enum([\"AVAILABLE\", \"NOT_CONFIGURED\", \"SCOPE_NOT_GRANTED\", \"UNSUPPORTED\"]).meta({maxLength: 17}),\n trust: z.enum([\"UNTRUSTED_REFERENCE\"]).meta({maxLength: 19}),\n title: z.string().min(1).max(512).nullable(),\n bodyStatus: z.enum([\"AVAILABLE\", \"EMPTY\", \"TOO_LARGE\", \"NOT_AVAILABLE\"]).meta({maxLength: 13}),\n bodyHtml: z.string().min(1).max(8000).nullable(),\n url: z.url({protocol: /^https$/}).min(1).max(2048).nullable(),\n updatedAt: DateSchema.nullable(),\n }),\n});\nexport type CommerceShippingInformation = z.infer<typeof CommerceShippingInformationSchema>;\nconst limit = z.number().int().min(1).max(3).default(3);\nexport const CommerceToolInputs = {\n commerce_resolve_product_categories: z.strictObject({\n query: z.string().min(1).max(200),\n limit: z.number().int().min(1).max(10).default(5),\n }),\n commerce_get_shipping_information: CommerceShippingInformationInputSchema,\n commerce_get_basket: z.strictObject({}),\n commerce_search_products: z.strictObject({\n query: z.string().min(1).max(200).nullable().default(null),\n category: z.strictObject({\n system: z.enum([\"SHOPIFY_STANDARD_PRODUCT_TAXONOMY\", \"WOOCOMMERCE_PRODUCT_CATEGORY\"]).meta({maxLength: 33}),\n id: wireId,\n taxonomyVersion: z.string().min(1).max(64).nullable(),\n }).optional(),\n browse: z.boolean().default(false),\n maximumPrice: MoneySchema.optional(),\n availableOnly: z.boolean().default(true),\n limit: z.number().int().min(1).max(20).default(10),\n cursor: z.string().max(2048).nullable().default(null),\n }),\n commerce_get_product: z.strictObject({\n productId: ID,\n variantId: ID.nullable(),\n }),\n commerce_get_discount_options: z.strictObject({\n limit: z.number().int().min(1).max(50).default(20),\n cursor: z.string().max(2048).nullable().default(null),\n }),\n commerce_get_discount_details: z.strictObject({ offerId: ID }),\n commerce_evaluate_discount: z.strictObject({\n offerId: ID,\n proposal: CommerceProposalSchema.nullable(),\n }),\n commerce_find_qualifying_products: z.strictObject({\n offerId: ID,\n query: z.string().min(1).max(200).nullable(),\n limit,\n }),\n commerce_find_similar_products: z.strictObject({\n variantId: ID,\n offerId: ID.nullable(),\n limit,\n }),\n};\nconst alternatives = z.strictObject({\n alternatives: z.array(CommerceAlternativeSchema).max(3),\n truncated: z.boolean(),\n});\nexport const CommerceToolOutputs = {\n commerce_resolve_product_categories: CommerceCategoryResolutionSchema,\n commerce_get_shipping_information: CommerceShippingInformationSchema,\n commerce_get_basket: CommerceBasketSchema,\n commerce_search_products: z.strictObject({\n products: z.array(CommerceProductSchema).max(20),\n cursor: z.string().max(2048).nullable(),\n truncated: z.boolean(),\n }),\n commerce_get_product: z.strictObject({\n product: CommerceProductSchema.nullable(),\n }),\n commerce_get_discount_options: z.union([CommerceOptionalLookupUnavailableSchema, z.strictObject({\n mode: z.enum([\"NONE\", \"FIXED\", \"AI_BEST_APPLICABLE\"]),\n offers: z.array(CommerceOfferSchema).max(50),\n truncated: z.boolean(),\n cursor: z.string().max(2048).nullable().optional(),\n })]),\n commerce_get_discount_details: z.union([CommerceOptionalLookupUnavailableSchema, z.strictObject({\n details: CommerceDiscountDetailsSchema.nullable(),\n })]),\n commerce_evaluate_discount: CommerceEvidenceSchema,\n commerce_find_qualifying_products: alternatives,\n commerce_find_similar_products: alternatives,\n};\nexport function productBelongsToDomain(\n product: z.infer<typeof CommerceProductSchema>,\n verifiedDomain: string,\n) {\n try {\n return (\n product.url === null || new URL(product.url).hostname === verifiedDomain\n );\n } catch {\n return false;\n }\n}\n"],"mappings":"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","names":["z","z","z","z","mapping","z","z","z","z"]}
|